QUAKEAPI · v2
API ドキュメント
気象庁の地震・津波情報と緊急地震速報を、WebSocket・SSE・REST で配信する API です。だれでも使え、API キーは要りません。
使い方の流れ
- 起動したら、REST で今の状態を取ります(
GET /v2/earthquakes/latest、GET /v2/tsunami)。 - WebSocket か SSE につなぎ、届いた
earthquake/tsunamiメッセージで手元の状態を置き換えます。 - 切れたら、最後に受け取った
seqを付けて再接続します。取りこぼした分が先に届きます。 resyncが届いたら、取りこぼしを埋められなかったということなので、手順1からやり直します。
データは毎回「その地震・その津波の今の状態の全体」で届きます。差分ではないので、届いたものをそのまま表示すれば済みます。同じ地震の更新は version が大きいほうが新しいので、手元より小さい version は捨ててください。
共通の約束ごと
| 項目 | 決めごと |
|---|---|
| キー名 | camelCase |
| 時刻 | ISO 8601。地震・津波の時刻は日本時間(2008-06-14T08:43:00+09:00)。サーバーの時刻(sentAt など)は UTC |
| 値がない | null。配列が空のときは [] |
| 決まった値 | 英小文字の camelCase(majorWarning、canceled)。表示用の日本語は label などに別に入っています |
| 震度 | "1" "2" "3" "4" "5-" "5+" "6-" "6+" "7" の文字列 |
| コード | 気象庁のコードを文字列で返します(例 "03") |
| eventId | 気象庁の地震識別番号(14桁の文字列) |
| 訓練・試験 | 配信しません |
| 過去のデータ | 2022年11月からの地震・津波を取り出せます |
この先、キーが増えることがあります。知らないキーは無視するように作ってください。キーをなくしたり意味を変えたりするのは、/v3 にするときだけです。
リアルタイム配信
WebSocket と SSE は同じメッセージを送ります。WebSocket はつないだあとに条件を変えられるのでサーバーのプログラムに、SSE はブラウザの EventSource で数行で使えます。
メッセージ
// 地震の状態が変わった(data は Earthquake 全体)
{ "type": "earthquake", "seq": 1042, "sentAt": "…", "reportId": "…", "data": { … } }
// 津波の状態が変わった(data は Tsunami 全体)
{ "type": "tsunami", "seq": 1043, "sentAt": "…", "reportId": "…", "data": { … } }
// 接続した直後に1回。seq はサーバーが持っている最後の番号
{ "type": "hello", "seq": 1043, "serverTime": "…" }
// since から続きを送れなかった(REST で取り直す)
{ "type": "resync", "reason": "gap" }
接続すると hello → (since を付けたときだけ)取りこぼした分 → 以降はリアルタイム、の順に届きます。
条件の指定
| パラメータ | 意味 | 既定値 |
|---|---|---|
topics | 受け取る種類。earthquake・tsunami・eew をコンマで区切る | earthquake,tsunami |
minIntensity | 最大震度がこれ以上の地震だけ受け取る(震度がまだない地震は届きます) | すべて |
since | この番号より後のメッセージを、接続した直後に送り直す | なし |
WebSocket
wss://quake-api.nakn.jp/v2/ws?topics=earthquake,tsunami&minIntensity=3&since=1040
// つないだあとに条件を変える(topics と minIntensity の両方が置き換わる)
{ "type": "subscribe", "topics": ["earthquake"], "minIntensity": "4" }
- サーバーは30秒ごとに ping を送ります。pong は多くのライブラリが自動で返します。
- 切断のコード
1001(サーバーの再起動)・1013(受け取りが遅く、送信待ちが 1MB を超えた)。どちらもsinceを付けて再接続してください。
SSE
GET https://quake-api.nakn.jp/v2/events?topics=earthquake&minIntensity=3
id: 1044
event: earthquake
data: {"type":"earthquake","seq":1044,"sentAt":"…","reportId":"…","data":{…}}
EventSourceは切れると自動で再接続し、最後のidをLast-Event-IDで送ります。サーバーはこれをsinceとして扱うので、取りこぼしは自動で埋まります。event:付きなので、addEventListener("earthquake", …)で受け取ります。
続きから受け取る(since)
サーバーは直近 24時間、または 5,000件までのメッセージを持っています。since がその範囲の外なら resync が届き、そのあとのリアルタイムの配信はそのまま続きます。
REST
| メソッドとパス | 返すもの |
|---|---|
GET /v2/earthquakes/latest | 最新の地震1件 |
GET /v2/earthquakes | 地震の一覧(発生時刻の新しい順) |
GET /v2/earthquakes/{eventId} | 指定した地震1件 |
GET /v2/tsunami | 最新の津波 |
GET /v2/tsunami/history | 津波の一覧(limit 1〜100、既定 10) |
GET /v2/eew/latest | 最新の緊急地震速報 |
GET /v2/eew | 直近の緊急地震速報の一覧 |
GET /v2/reports/{reportId} | 電文1通(まとめる前の形) |
GET /v2/health | 配信の状態 |
本文はデータそのものです(包みはありません)。CORS はどこからでも許可しているので、ブラウザから直接呼べます。
地震の一覧の絞り込み
| パラメータ | 意味 | 例 |
|---|---|---|
from / to | 発生時刻の範囲 | from=2024-01-01T00:00:00+09:00 |
minIntensity | 最大震度がこれ以上 | 5- |
minMagnitude | マグニチュードがこれ以上 | 6 |
prefecture | 震度を観測した都道府県のコード | 17 |
hypocenter | 震央地名のコード | 390 |
limit | 件数(1〜100、既定 20) | 50 |
before | この eventId より前(次のページ。Link ヘッダーにも入ります) | 20240101161010 |
一覧では、データ量を減らすため intensity.cities と intensity.stations を省いています。必要なら1件ずつ取ってください。
地震(Earthquake)
1つの地震(eventId)について、受け取った報をすべてまとめた今の状態です。震度速報 → 震源情報 → 震源・震度情報 … と報が届くたびに、まとめ直したものが配信されます。
{
"eventId": "20080614084350",
"status": "active",
"version": 2,
"updatedAt": "2008-06-14T09:01:00+09:00",
"originTime": "2008-06-14T08:43:00+09:00",
"hypocenter": { "code": "213", "name": "岩手県内陸南部", "latitude": 39, "longitude": 140.9, "depthKm": 10 },
"magnitude": { "value": 7, "type": "Mj", "label": "M7.0" },
"maxIntensity": "6+",
"intensity": {
"source": "VXSE53",
"prefectures": [ { "code": "03", "name": "岩手県", "maxIntensity": "6+", "unreceived": false } ],
"areas": [ … ], "cities": [ … ], "stations": [ … ]
},
"tsunami": { "risk": "none", "comment": "この地震による津波の心配はありません。" },
"eewIssued": true,
"reports": [ { "type": "VXSE53", "serial": 3, "infoType": "issued", … } ]
}
| キー | 意味 |
|---|---|
status | active、または canceled(すべての報が取り消された) |
version | 更新のたびに1ずつ増えます。大きいほうが新しい |
originTime | 発生時刻。震源の情報がまだなければ null |
hypocenter | 震源。震度速報しか届いていなければ null |
magnitude | 規模。表示には label(M7.0、M8を超える巨大地震) |
maxIntensity | 最大震度。震度の情報がまだなければ null |
intensity | 都道府県・地域・市町村・観測点の震度を、4つの配列に平らに並べたもの(震度の大きい順)。unreceived: true は「震度5弱以上と考えられるが未入電」 |
tsunami.risk | 地震情報の中の津波の付加文(none・slight・warning・checking・unknown) |
eewIssued | 緊急地震速報(警報)を発表した地震か |
reports | この地震について受け取った報の一覧(新しい順) |
津波(Tsunami)
同じ地震の津波の報(津波警報・注意報・予報、津波情報、沖合の津波観測)をまとめた、1つの津波の今の状態です。
| status | 意味 | 表示の目安 |
|---|---|---|
warning | 大津波警報・津波警報・津波注意報が1つ以上出ている | 必ず表示する |
forecast | 津波予報(若干の海面変動)だけ | 必要なら控えめに |
none | 何も出ていない | 表示しない |
canceled | すべての報が取り消された | 表示しない |
気象庁は、警報・注意報をすべて解除するとき「津波予報(若干の海面変動)」を出して終わります。解除後は forecast のまま次の津波まで残るので、updatedAt も見て判断してください(例:forecast で24時間たっていれば表示しない)。
| キー | 意味 |
|---|---|
maxCategory | 最も重い区分(majorWarning・warning・advisory・forecast・none) |
forecasts | 津波予報区ごとの区分・第1波の到達予想(firstArrival)・予想される高さ(maxHeight)。重い順 |
observations | 沿岸の観測点での観測値 |
offshore | 沖合の観測値と、そこから推定した沿岸での到達時刻・高さ |
earthquakes | 津波の元になった地震 |
高さを表示するときは maxHeight.label(10m、10m超、巨大)を使うのが確実です。
緊急地震速報
topics=eew を指定すると届きます。受信を冗長化し、最初に届いた報をすぐ配ります。
wss://quake-api.nakn.jp/v2/ws?topics=earthquake,tsunami,eew
{ "type": "eew", "seq": 2051, "sentAt": "…", "reportId": "eew-20261102020128-6-3",
"data": {
"eventId": "20261102020128", "serial": 6, "version": 3, "status": "active",
"isWarning": false, "isFinal": true, "isAssumption": false,
"reportedAt": "2026-11-02T02:02:27+09:00", "originTime": "2026-11-02T02:01:18+09:00",
"hypocenter": { "name": "与那国島近海", "latitude": 23.8, "longitude": 123.3, "depthKm": 10 },
"magnitude": 4.5, "maxIntensity": "2", "areas": []
} }
| キー | 意味 |
|---|---|
serial | 第何報 |
version | 更新のたびに増える。eventId ごとに大きいほうで置き換える |
status | active / canceled(取消) |
isWarning | 警報か(予報か警報かが確定した報だけが届きます) |
isFinal / isAssumption | 最終報か / 仮定震源要素か |
maxIntensity | 最大予測震度 |
areas | 警報の対象地域(name・intensityFrom・intensityTo・arrived・arrivalTime)。報によっては空 |
- 同じ第何報でも、あとから警報の対象地域などがそろうと
versionが上がって届き直します。 minIntensityを指定しても、警報・取消は必ず届きます。
エラーと上限
{ "error": { "code": "notFound", "message": "指定した地震が見つかりません。" } }
| HTTP | code | いつ |
|---|---|---|
| 400 | badRequest | パラメータがおかしい |
| 404 | notFound | 見つからない、またはパスが違う |
| 429 | tooManyRequests | REST の回数の上限を超えた(Retry-After の秒数だけ待つ) |
| 429 | tooManyConnections | 同じ IP からの同時接続が上限を超えた |
| 503 | unavailable | 一時的に使えない |
| 対象 | 上限 |
|---|---|
| WebSocket と SSE の同時接続 | 1つの IP アドレスにつき 10 |
| REST | 1つの IP アドレスにつき 1分あたり 120回 |
REST を数秒ごとに呼んで新しい地震を探す(ポーリング)のはやめてください。リアルタイム配信を使えば、速く、上限にもかかりません。
正しく扱うために
- version で新旧を判断する。地震は
eventId、津波はidごとに、手元より大きいversionだけで置き換えます。 - 最後の seq を覚え、再接続のときに since に付ける。(SSE の
EventSourceでは自動) - resync が届いたら、REST で取り直す。
- 再接続は少し待ってから。1秒、2秒、5秒、10秒…と間をあけ、毎回少しずらしてください。
- 取消を反映する。
status: "canceled"の地震は表示から外します。 - null を前提に作る。震度速報だけの段階では震源がなく、震源情報だけの段階では震度がありません。
コード例
ブラウザ(SSE)
const earthquakes = new Map(); // eventId → Earthquake
function apply(item) {
const current = earthquakes.get(item.eventId);
if (current && current.version >= item.version) return; // 古いものは捨てる
earthquakes.set(item.eventId, item);
console.log(item.hypocenter?.name, item.maxIntensity, item.magnitude?.label);
}
// 1. 今の状態を取る
fetch("https://quake-api.nakn.jp/v2/earthquakes/latest")
.then((r) => (r.ok ? r.json() : null))
.then((item) => item && apply(item));
// 2. リアルタイムで受け取る(再接続と取りこぼしの補完はブラウザが自動でする)
const events = new EventSource("https://quake-api.nakn.jp/v2/events?topics=earthquake&minIntensity=3");
events.addEventListener("earthquake", (e) => apply(JSON.parse(e.data).data));
events.addEventListener("resync", () => location.reload());
付録:値の一覧
震度の順序
津波の category
| 値 | 表示 |
|---|---|
majorWarning | 大津波警報 |
warning | 津波警報 |
advisory | 津波注意報 |
forecast | 津波予報(若干の海面変動) |
none | 解除・なし |
電文の種類
| type | 名前 | まとめる先 |
|---|---|---|
VXSE51 | 震度速報 | 地震 |
VXSE52 | 震源に関する情報 | 地震 |
VXSE53 | 震源・震度に関する情報 | 地震 |
VXSE61 | 顕著な地震の震源要素更新のお知らせ | 地震 |
VTSE41 | 津波警報・注意報・予報 | 津波 |
VTSE51 | 津波情報 | 津波 |
VTSE52 | 沖合の津波観測に関する情報 | 津波 |