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
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"}
| 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)
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:
-
jp-earthquake-feed – input
minMagnitude,limit - jp-tsunami-feed
-
jp-weather-forecast – by JMA area code (Tokyo
130000)
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}'
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"])
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}
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)