QUAKEAPI · v2

API ドキュメント

気象庁の地震・津波情報と緊急地震速報を、WebSocket・SSE・REST で配信する API です。だれでも使え、API キーは要りません。

RESThttps://quake-api.nakn.jp/v2/… WSwss://quake-api.nakn.jp/v2/ws SSEhttps://quake-api.nakn.jp/v2/events

使い方の流れ

  1. 起動したら、REST で今の状態を取ります(GET /v2/earthquakes/latest、GET /v2/tsunami)。
  2. WebSocket か SSE につなぎ、届いた earthquake / tsunami メッセージで手元の状態を置き換えます。
  3. 切れたら、最後に受け取った seq を付けて再接続します。取りこぼした分が先に届きます。
  4. 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", … } ]
}
キー意味
statusactive、または 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 ごとに大きいほうで置き換える
statusactive / canceled(取消)
isWarning警報か(予報か警報かが確定した報だけが届きます)
isFinal / isAssumption最終報か / 仮定震源要素か
maxIntensity最大予測震度
areas警報の対象地域(name・intensityFrom・intensityTo・arrived・arrivalTime)。報によっては空
  • 同じ第何報でも、あとから警報の対象地域などがそろうと version が上がって届き直します。
  • minIntensity を指定しても、警報・取消は必ず届きます。

エラーと上限

{ "error": { "code": "notFound", "message": "指定した地震が見つかりません。" } }
HTTPcodeいつ
400badRequestパラメータがおかしい
404notFound見つからない、またはパスが違う
429tooManyRequestsREST の回数の上限を超えた(Retry-After の秒数だけ待つ)
429tooManyConnections同じ IP からの同時接続が上限を超えた
503unavailable一時的に使えない
対象上限
WebSocket と SSE の同時接続1つの IP アドレスにつき 10
REST1つの IP アドレスにつき 1分あたり 120回

REST を数秒ごとに呼んで新しい地震を探す(ポーリング)のはやめてください。リアルタイム配信を使えば、速く、上限にもかかりません。

正しく扱うために

  1. version で新旧を判断する。地震は eventId、津波は id ごとに、手元より大きい version だけで置き換えます。
  2. 最後の seq を覚え、再接続のときに since に付ける。(SSE の EventSource では自動)
  3. resync が届いたら、REST で取り直す。
  4. 再接続は少し待ってから。1秒、2秒、5秒、10秒…と間をあけ、毎回少しずらしてください。
  5. 取消を反映する。status: "canceled" の地震は表示から外します。
  6. 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());

付録:値の一覧

震度の順序

"1"震度1
"2"震度2
"3"震度3
"4"震度4
"5-"震度5弱
"5+"震度5強
"6-"震度6弱
"6+"震度6強
"7"震度7

津波の category

値表示
majorWarning大津波警報
warning津波警報
advisory津波注意報
forecast津波予報(若干の海面変動)
none解除・なし

電文の種類

type名前まとめる先
VXSE51震度速報地震
VXSE52震源に関する情報地震
VXSE53震源・震度に関する情報地震
VXSE61顕著な地震の震源要素更新のお知らせ地震
VTSE41津波警報・注意報・予報津波
VTSE51津波情報津波
VTSE52沖合の津波観測に関する情報津波