DEV Community

JP Open Data
JP Open Data

Posted on

Japan earthquake and tsunami data as JSON: decoding the JMA feeds

The Japan Meteorological Agency (JMA) website is driven by JSON files under https://www.jma.go.jp/bosai/. They're not documented as a stable public API, but they're what the official site itself uses, and they're very handy for dashboards and bots. This post explains the fields and shows a free API that returns them already cleaned up.

⚠️ Don't use any of this for life-safety alerts. Use official warnings and broadcasts for that.

Earthquakes: quake/data/list.json

curl -s https://www.jma.go.jp/bosai/quake/data/list.json | head -c 400
Enter fullscreen mode Exit fullscreen mode

Each item looks roughly like:

{"eid":"20261109031529","rdt":"2026-11-09T03:18:00+09:00","ttl":"震源・震度情報","at":"2026-11-09T03:15:00+09:00","anm":"茨城県北部","cod":"+36.7+140.7-10000/","mag":"3.5","maxi":"2"}
Enter fullscreen mode Exit fullscreen mode
field meaning
at origin time (JST)
rdt report time
anm epicenter name (Japanese)
cod ISO 6709-style +lat+lon-depth_in_meters/
mag magnitude (string)
maxi maximum seismic intensity on the JMA scale (5-, 5+, ...)
en_anm, en_ttl English epicenter name and report title (JMA provides these)

Parsing cod in Python:

import re

def parse_cod(cod):
    m = re.match(r"([+-][\d.]+)([+-][\d.]+)([+-]\d+)?", cod or "")
    if not m:
        return None, None, None
    lat, lon = float(m.group(1)), float(m.group(2))
    depth_km = abs(int(m.group(3))) / 1000 if m.group(3) else None
    return lat, lon, depth_km

print(parse_cod("+36.7+140.7-10000/"))  # (36.7, 140.7, 10.0)
Enter fullscreen mode Exit fullscreen mode

The list contains several reports per event (preliminary intensity, hypocenter, updates), so de-duplicate by eid if you want one row per earthquake.

Tsunami: tsunami/data/list.json

Same idea, with tsunami forecasts and warnings, each with an event ID, report time, status (発表 = issued) and area.

Clean version via API

I published small free Apify Actors that return flat rows with English epicenter names, numeric magnitude/depth and ISO timestamps:

curl -s -X POST \
  "https://api.apify.com/v2/acts/grinning_naiad_h0w~jp-earthquake-feed/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"minMagnitude":4,"limit":20}'
Enter fullscreen mode Exit fullscreen mode
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("grinning_naiad_h0w/jp-earthquake-feed").call(run_input={"minMagnitude": 3, "limit": 10})
for q in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(q["time"], q["epicenter_en"], q["magnitude"], q["max_intensity"])
Enter fullscreen mode Exit fullscreen mode

A real row:

{"time":"2026-11-09T03:15:00+09:00","reported_at":"2026-11-09T03:18:00+09:00","epicenter_ja":"茨城県北部","epicenter_en":"Northern Ibaraki Prefecture","magnitude":3.5,"max_intensity":"2","latitude":36.7,"longitude":140.7,"depth_km":10.0}
Enter fullscreen mode Exit fullscreen mode

There's no per-result price; you need a free Apify account for a token.

A note on stability

Because these are website feeds, paths can change. For example, JMA moved its weather-warning data to a new path after its 2026 warning-system change and the old file stopped updating. If you call the JSON directly, monitor the Last-Modified header.

Data: Japan Meteorological Agency, reused under its website terms of use (Government Standard Terms of Use, compatible with CC BY 4.0).

Top comments (0)