地震情報
地震情報は、中央気象署(CWA)が発表した地震情報です。震央の位置、マグニチュード、深さ、および各県・市と各観測点の観測震度を含みます。サーバーは数秒ごとに気象署へ新しい情報がないか確認します。地震の一覧、過去の検索、震度分布図に向いています。
- 新しい情報をリアルタイムで受け取るときは、SSE 配信
eq.report.v1を使ってください。 - 一覧(
/api/v2/eq/report)には各地の震度は含まれません。震度分布が必要なときは、一覧でidを取得してから1 件の情報を検索してください。
データライセンス
Section titled “データライセンス”推奨表記データ出典:中央気象署、ExpTech Studio(exptech.dev)
- 中央気象署:中央気象署のデータ利用規約(政府データオープンライセンスなど)も適用されます。気象・地震情報は中央気象署の発表を正とします。
表記の場所、例、商用利用の申請はデータの利用条件と出典表記をご覧ください。
現在、API Token は不要です。
地震情報一覧の検索
Section titled “地震情報一覧の検索”条件で地震情報を検索し、配列を返します。既定では地震発生時刻の新しい順、1 ページ 1 件で、台湾全域の最大震度が 1 以上の情報だけを含みます(注意事項を参照)。
limit1 ページの件数。1–150。範囲外は最も近い上下限を適用します。
pageページ番号。1–10000。
sort並べ替えのフィールド:time(地震発生時刻)、intensity(台湾全域の最大震度)、magnitude(マグニチュード)、depth(深さ)。値が同じときは情報番号の新しい順です。
order並べ替えの方向:asc または desc。
minIntensity台湾全域の最大震度の下限。0–9(対応は「震度の表し方」)。震度 0 の情報を含めるときは minIntensity=0 を付けます。
maxIntensity台湾全域の最大震度の上限。0–9。
minMagnitudeマグニチュードの下限。0–10。
maxMagnitudeマグニチュードの上限。0–10。
minDepth深さの下限(キロメートル)。0–700。
maxDepth深さの上限(キロメートル)。0–700。
startTime開始日 YYYY-MM-DD(台湾時間)。当日の 00:00:00 を含みます。形式が不正なときは無視します。
endTime終了日 YYYY-MM-DD(台湾時間)。当日の 23:59:59 を含みます。形式が不正なときは無視します。
city県・市の名前。完全一致。例:花蓮縣、臺北市(「臺」であり「台」ではありません)。その県・市で震度が観測された情報だけを返します。
cityMinInt県・市の震度の下限。city と一緒のときはその県・市に適用します。単独のときは、いずれかの県・市が条件を満たせば含めます。
cityMaxInt県・市の震度の上限。規則は cityMinInt と同じです。
curl -L "https://api.core.exptech.dev/api/v2/eq/report"curl -L "https://api.core-tnn1.exptech.dev/api/v2/eq/report"curl -L "https://api.core-tyo1.exptech.dev/api/v2/eq/report"const res = await fetch("https://api.core.exptech.dev/api/v2/eq/report");if (!res.ok) throw new Error(`HTTP ${res.status}`);const data = await res.json();console.log(data);const res = await fetch("https://api.core-tnn1.exptech.dev/api/v2/eq/report");if (!res.ok) throw new Error(`HTTP ${res.status}`);const data = await res.json();console.log(data);const res = await fetch("https://api.core-tyo1.exptech.dev/api/v2/eq/report");if (!res.ok) throw new Error(`HTTP ${res.status}`);const data = await res.json();console.log(data);import requests
res = requests.get("https://api.core.exptech.dev/api/v2/eq/report", timeout=10)res.raise_for_status()print(res.json())import requests
res = requests.get("https://api.core-tnn1.exptech.dev/api/v2/eq/report", timeout=10)res.raise_for_status()print(res.json())import requests
res = requests.get("https://api.core-tyo1.exptech.dev/api/v2/eq/report", timeout=10)res.raise_for_status()print(res.json())成功(一致する情報がないときは空配列 [])
[ { "id": "115079-2026-1109-122157", "lat": 23.62, "lon": 120.66, "depth": 10.5, "loc": "雲林縣政府東南東方 23.2 公里 (位於雲林縣古坑鄉)", "mag": 4.2, "time": 1794198117000, "int": 3, "trem": 0, "md5": "3F2A9C1E7B5D4A608E1F2C3D4B5A6978" }]パラメータが正規形ではないため、正規の URL へ誘導します
HTTP/1.1 302 FoundLocation: /api/v2/eq/report?limit=20&minIntensity=4If-None-Match が ETag と同じ。本文はありませんレスポンスボディなし
サーバーエラー
{ "error": "<錯誤訊息>"}試してみる
レスポンスのフィールド
Section titled “レスポンスのフィールド”レスポンスは配列で、各要素が 1 件の情報です。
| フィールド | 型 | 説明 |
|---|---|---|
[].id | string | 情報 ID。形式は XXXXXX-YYYY-MMDD-HHMMSS。先頭 3 桁は民国年、続く 3 桁は気象署の情報番号(番号のない局地的な地震は 000)、その後ろは地震の日付と時刻(台湾時間)です。例:115079-2026-1109-122157。 |
[].lat | number | 震央の緯度(度)。 |
[].lon | number | 震央の経度(度)。 |
[].depth | number | 震源の深さ(キロメートル)。 |
[].loc | string | 震央の位置の説明。気象署の原文のままです(連続した空白を含むことがあります)。 |
[].mag | number | リヒターマグニチュード。 |
[].time | int | 地震発生時刻。Unix ミリ秒。 |
[].int | int | 台湾全域の最大震度。0–9(対応は「震度の表し方」)。 |
[].trem | int | 予約フィールド。現在は常に 0。 |
[].md5 | string | 情報の内容(各地の震度を含む)のハッシュ。32 桁の大文字 16 進数。内容が更新されると変わります。1 件の情報を取り直す必要があるかの判断に使えます。 |
地震情報を 1 件取得する
Section titled “地震情報を 1 件取得する”情報 ID で 1 件を取得します。各県・市と各観測点の震度を含みます。
id情報 ID(パスパラメータ)。形式は XXXXXX-YYYY-MMDD-HHMMSS。例:114000-2025-0829-100546。query パラメータは無視されます。
curl "https://api.core.exptech.dev/api/v2/eq/report/<id>"curl "https://api.core-tnn1.exptech.dev/api/v2/eq/report/<id>"curl "https://api.core-tyo1.exptech.dev/api/v2/eq/report/<id>"const res = await fetch("https://api.core.exptech.dev/api/v2/eq/report/<id>");if (!res.ok) throw new Error(`HTTP ${res.status}`);const data = await res.json();console.log(data);const res = await fetch("https://api.core-tnn1.exptech.dev/api/v2/eq/report/<id>");if (!res.ok) throw new Error(`HTTP ${res.status}`);const data = await res.json();console.log(data);const res = await fetch("https://api.core-tyo1.exptech.dev/api/v2/eq/report/<id>");if (!res.ok) throw new Error(`HTTP ${res.status}`);const data = await res.json();console.log(data);import requests
res = requests.get("https://api.core.exptech.dev/api/v2/eq/report/<id>", timeout=10)res.raise_for_status()print(res.json())import requests
res = requests.get( "https://api.core-tnn1.exptech.dev/api/v2/eq/report/<id>", timeout=10,)res.raise_for_status()print(res.json())import requests
res = requests.get( "https://api.core-tyo1.exptech.dev/api/v2/eq/report/<id>", timeout=10,)res.raise_for_status()print(res.json())成功
{ "id": "114000-2025-0829-100546", "lat": 22.86, "lon": 121.28, "depth": 16.9, "loc": "臺東縣政府東北方 17.5 公里 (位於臺東縣近海)", "mag": 4, "time": 1756433146000, "list": { "臺東縣": { "int": 2, "town": { "東河": { "lat": 22.97, "lon": 121.3, "int": 2 }, "鹿野": { "lat": 22.91, "lon": 121.13, "int": 2 }, "成功": { "lat": 23.1, "lon": 121.37, "int": 1 } } }, "花蓮縣": { "int": 1, "town": { "富里": { "lat": 23.2, "lon": 121.29, "int": 1 } } } }, "trem": 0}If-None-Match が ETag と同じ。本文はありませんレスポンスボディなし
ID の形式が不正、またはこの情報がない(レスポンス本文はありません)レスポンスボディなし
試してみる
レスポンスのフィールド
Section titled “レスポンスのフィールド”| フィールド | 型 | 説明 |
|---|---|---|
id | string | 情報 ID。形式は一覧と同じです。 |
lat | number | 震央の緯度(度)。 |
lon | number | 震央の経度(度)。 |
depth | number | 震源の深さ(キロメートル)。 |
loc | string | 震央の位置の説明。 |
mag | number | リヒターマグニチュード。 |
time | int | 地震発生時刻。Unix ミリ秒。 |
list | object | 各県・市の震度。key は県・市の名前(例:臺東縣)。観測データがないときは空オブジェクト {} です。 |
<縣市>.int | int | その県・市の最大震度。0–9。 |
<縣市>.town | object | その県・市の各観測点の震度。key は観測点の名前です。 |
<測站>.lat | number | 観測点の緯度(度)。 |
<測站>.lon | number | 観測点の経度(度)。 |
<測站>.int | int | 観測点の震度。0–9。 |
trem | int | 予約フィールド。現在は常に 0。 |
1 件のレスポンスには int(台湾全域の最大震度)と md5 はありません。台湾全域の最大震度が必要なときは、list の各県・市の int の最大値を取ってください。
震度の表し方
Section titled “震度の表し方”int、minIntensity、cityMinInt などの震度フィールドは、0–9 の整数で中央気象署の震度階級を表します。
| 値 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|---|---|---|---|---|---|---|---|---|---|---|
| 震度 | 0 | 1 | 2 | 3 | 4 | 5弱 | 5強 | 6弱 | 6強 | 7 |
条件で一覧を検索し、一覧の id で各地の震度を 1 件ずつ取得します(一覧には各地の震度がありません)。query を正規形で組むと(パラメータはアルファベット順、既定値は付けない)、余分な 302 が 1 回減ります。
# 最大震度 4 以上の直近 20 件curl -L "https://api.core.exptech.dev/api/v2/eq/report?limit=20&minIntensity=4"
# 2024-04-03 当日(台湾時間)のすべての情報。震度 0 を含むcurl -L "https://api.core.exptech.dev/api/v2/eq/report?endTime=2024-04-03&limit=150&minIntensity=0&startTime=2024-04-03"const BASE = "https://api.core.exptech.dev";
// 1. 一覧:最大震度 4 以上の直近 20 件const params = new URLSearchParams({ limit: "20", minIntensity: "4" });const listRes = await fetch(`${BASE}/api/v2/eq/report?${params}`);if (!listRes.ok) throw new Error(`HTTP ${listRes.status}`);const reports = await listRes.json();
// 2. 1 件ずつ:県・市と観測点の震度を取得するfor (const r of reports) { console.log(r.id, new Date(r.time).toISOString(), `M${r.mag}`, `最大震度 ${r.int}`);
const res = await fetch(`${BASE}/api/v2/eq/report/${r.id}`); if (res.status === 404) continue; // この情報はない if (!res.ok) throw new Error(`HTTP ${res.status}`); const report = await res.json();
for (const [city, area] of Object.entries(report.list)) { for (const [station, s] of Object.entries(area.town)) { console.log(" ", city, area.int, station, s.int); } }}-
既定では震度 0 の情報を除きます。 一覧の
minIntensityの既定は1です。このパラメータを付けないと、台湾全域の最大震度が 0 の情報は出ません。すべての情報を出すときはminIntensity=0を付けてください。 -
パラメータが正規形でないときは、先に 302 を返します。 一覧(v2 と v1)は query を正規化し、正規形と違うときは
302で正規の URL へ誘導してからデータを返します。正規形の規則:- パラメータは名前のアルファベット順。
- 既定値と等しいパラメータを除く(例:
page=1、sort=time、limit=1)。 - 未知のパラメータを除く。
- 数値は上下限を適用し、余分な 0 を除く(例:
limit=500はlimit=150、minMagnitude=4.50はminMagnitude=4.5)。形式が不正な日付は除く。
ブラウザの
fetchは 302 に自動で従います。curlには-Lが必要です。上の規則で URL を組むと、往復を 1 回省けます。1 件の情報(/api/v2/eq/report/{id})は正規化せず、302 にもなりません。 -
パラメータの値が不正でも 400 は返りません。 解析できない整数や小数は
0としてから上下限を適用します(例:minIntensity=abcはminIntensity=0と同じ)。sortとorderの未知の値は既定値に戻ります。 -
キャッシュと ETag。 レスポンスには
ETagが付きます。同じIf-None-Matchを付けると304になります(本文なし)。サーバー側のキャッシュは 1 秒です。HEADにも対応しています。 -
エラーレスポンス。 サーバーエラーのときは
500を返し、本文は{"error": "..."}です。メッセージはデバッグの参考だけで、内容で判断しないでください。1 件の情報が見つからないとき、または ID の形式が不正なときは404を返し、レスポンス本文はありません。 -
時刻と座標。
timeは Unix のミリ秒です。日付パラメータstartTimeとendTimeは台湾時間(UTC+8)として解釈します。震央の座標は小数第 2 位に丸めます。 -
一覧と 1 件でフィールドが違います。 一覧には
intとmd5があり、listはありません。1 件にはlistがあり、intとmd5はありません。
最新の N 件(地震発生時刻の新しい順)を返します。各件に県・市と観測点の震度が含まれます。震度やマグニチュードなどの絞り込みはなく、震度 0 の情報も除きません。
limit返す件数。1–50。無効な値は 1、50 を超える値は 50 とします。
curl -L "https://api.core.exptech.dev/api/v1/eq/report"curl -L "https://api.core-tnn1.exptech.dev/api/v1/eq/report"curl -L "https://api.core-tyo1.exptech.dev/api/v1/eq/report"const res = await fetch("https://api.core.exptech.dev/api/v1/eq/report");if (!res.ok) throw new Error(`HTTP ${res.status}`);const data = await res.json();console.log(data);const res = await fetch("https://api.core-tnn1.exptech.dev/api/v1/eq/report");if (!res.ok) throw new Error(`HTTP ${res.status}`);const data = await res.json();console.log(data);const res = await fetch("https://api.core-tyo1.exptech.dev/api/v1/eq/report");if (!res.ok) throw new Error(`HTTP ${res.status}`);const data = await res.json();console.log(data);import requests
res = requests.get("https://api.core.exptech.dev/api/v1/eq/report", timeout=10)res.raise_for_status()print(res.json())import requests
res = requests.get("https://api.core-tnn1.exptech.dev/api/v1/eq/report", timeout=10)res.raise_for_status()print(res.json())import requests
res = requests.get("https://api.core-tyo1.exptech.dev/api/v1/eq/report", timeout=10)res.raise_for_status()print(res.json())成功(データがないときは空配列 [])
[ { "id": "CWA-EQ114000-2025-0829-100546", "no": "2025082910054600000", "lat": 22.86, "lon": 121.28, "depth": 16.9, "loc": "臺東縣政府東北方 17.5 公里 (位於臺東縣近海)", "mag": 4, "time": 1756433146000, "list": { "臺東縣": { "int": 2, "town": { "東河": { "lat": 22.97, "lon": 121.3, "int": 2 } } } } }]パラメータが正規形ではないため、正規の URL へ誘導します
HTTP/1.1 302 FoundLocation: /api/v1/eq/reportIf-None-Match が ETag と同じ。本文はありませんレスポンスボディなし
サーバーエラー
{ "error": "<錯誤訊息>"}試してみる
v2 との違い:
| フィールド | 型 | 説明 |
|---|---|---|
[].id | string | 情報 ID。v2 より CWA-EQ のプレフィックスが付きます。例:CWA-EQ114000-2025-0829-100546。プレフィックスを除くと v2 の ID です。 |
[].no | string | 気象署の地震番号の文字列。先頭 14 桁は地震発生時刻 YYYYMMDDHHMMSS(台湾時間)。v2 にはこのフィールドがありません。 |
[].list | object | 各県・市と観測点の震度。形式は v2 の 1 件の list と同じです。 |
残りのフィールド(lat、lon、depth、loc、mag、time)は v2 と同じです。v1 には int、trem、md5 がありません。?limit=1 は既定値と同じなので、query のない URL へ 302 します。
