Realtime
WebSocket 推送
单连接接收全部数据源增量。握手后由服务端按 scope 分发 event 帧,无需任何鉴权;单 IP 默认 3 个并发连接。
wss://api.capquake.top/v1/all
wss
zlib 压缩
?raw=1 明文
| 帧 | 编码 | 说明 |
|---|---|---|
auth_challenge | JSON 文本 | 连接后立即下发,仅作旧客户端兼容;无需回应,数据照常推送 |
heartbeat | zlib 二进制 | 每 20 秒一次;连续 3 次未回则断开(4401) |
event | zlib 二进制 | 增量事件,data.scope 区分来源,data.payload 与对应 HTTP 端点同构 |
update_notice | zlib 二进制 | 大块数据(如图片瓦片)变动通知,收到后自行拉 HTTP |
帧结构
application/json(解压后)
{
"type": "event",
"data": {
"scope": "cea_pr",
"payload": {
"event_id": "cenc_202611140017",
"magnitude": "5.2",
"max_intensity": 6.7,
"serial": 3
}
}
}
心跳要求原样回显:收到 {"type":"heartbeat","data":"…"} 后,发回 {"type":"heartbeat","data":"…"}(同值)。
客户端示例
javascript
// raw=1:所有帧都是明文 JSON,省掉 zlib const ws = new WebSocket("wss://api.capquake.top/v1/all?raw=1"); ws.onmessage = (e) => { const msg = JSON.parse(e.data); switch (msg.type) { case "heartbeat": ws.send(JSON.stringify({ type: "heartbeat", data: msg.data })); break; case "event": console.log(msg.data.scope, msg.data.payload); break; case "update_notice": console.log("需拉取", msg.data.scope, msg.data.version); } };
python
import asyncio, json, zlib import websockets async def main(): async with websockets.connect("wss://api.capquake.top/v1/all") as ws: async for raw in ws: # 首帧 auth_challenge 是文本;推送帧是 zlib 二进制 data = json.loads(raw if isinstance(raw, str) else zlib.decompress(raw)) if data["type"] == "heartbeat": await ws.send(json.dumps(data)) elif data["type"] == "event": print(data["data"]["scope"], data["data"]["payload"]["event_id"]) asyncio.run(main())
scope 一览
| scope | 来源 |
|---|---|
cea | 中国地震预警网(国家级) |
cea_pr | 中国地震预警网省级网(30 省融合) |
cwa_eew | 台湾中央气象署强震即时警报 |
cwa_report | 台湾中央气象署地震报告 |
cenc | 中国地震台网地震情报(fjdzj) |
jma_eew | 日本气象厅紧急地震速报 |
radar | 全国雷达组合反射率 |
noaa_tsunami | NOAA PTWC / NTWC 海啸公报 |
bmkg | 印尼 BMKG 地震 |
agg_* | 聚合源(USGS、GeoNet、INGV、P2P、JMA 火山、CSN、CENAIS …) |
完整 scope 列表(含 agg_* 逐项)可读 /v1/status 的 sources[].scope。
地震报告推送格式
usgs / emsc / gfz / usp 等地震报告类 scope,只推最新一条,与对应 HTTP 端点返回完全一致,
统一使用下面这个信封(data.payload 的内容)。有特殊数据的源(烈度、有感报告、海啸)另用各自的载荷。
application/json(解压后)
{
"type": "usgs",
"Data": {
"id": "ci41530808",
"originTime": 1787191666940,
"latitude": 33.417,
"longitude": -116.639,
"depth": 6.45,
"magnitude": 0.31,
"placeName": "15 km N of Warner Springs, CA",
"infoTypeName": "Automatic",
"recvTime": 1787191668000
},
"md5": "fce5e0cbeaa072e5ca038668d8497da9"
}
| 字段 | 类型 | 说明 |
|---|---|---|
type | string | 来源标识:usgs / emsc / gfz / usp,与 WS scope 同名 |
Data.id | string | 事件号(上游唯一 ID) |
Data.originTime | number | 发震时间,Unix 毫秒 |
Data.latitude | number | 震中纬度(WGS-84) |
Data.longitude | number | 震中经度(WGS-84) |
Data.depth | number | 震源深度(km) |
Data.magnitude | number | 震级 |
Data.placeName | string | 震中位置描述(上游原文) |
Data.infoTypeName | string | 报告状态:Automatic(自动)/ Reviewed(复核)/ Deleted(撤销) |
Data.recvTime | number | 服务端接收时间,绝对毫秒时间戳 |
md5 | string | Data 规范化 JSON 的 MD5,用于客户端去重:同 md5 即同一份数据 |
Schema
数据结构
CEA / CEA-PR 系列共用同一套字段;JMA 保留上游原始报文字段(含历史拼写),两者不要混用解析器。
| 字段 | 类型 | 说明 |
|---|---|---|
event_id | string | 事件唯一标识;同一事件的所有报次共享,跨源稳定 |
location | string | 震中地名(已清洗测试标记) |
latitude / longitude | number | 震中经纬度(WGS-84) |
magnitude | string | 震级,字符串;上游缺失时为 null |
depth | number | null | 震源深度(km);该报未携带时为 null |
created_at | number | 发震时间,Unix 秒 |
max_intensity | number | 震中最大烈度(CEA 口径) |
serial | number | 报次,同一 event_id 递增;以最大报次覆盖 |
is_cancel | boolean | 该报是否取消事件 |
province | string | 所属省份;国家级源为「全国」 |
sub_source | string | cea / cea-pr,用于区分来源 |
recv_time | number | 服务端收到该数据的时刻,Unix 毫秒 |
| 字段 | 类型 | 说明 |
|---|---|---|
Title | string | 报种标题(緊急地震速報 …) |
EventID | string | JMA 事件号,同一事件不变 |
Serial | string | 报次 |
AnnouncedTime | string | 発表時刻(JST) |
OriginTime | string | 発震時刻(JST) |
Hypocenter | string | 震源地名(日文原文) |
Magunitude | string | 震級(上游历史拼写,勿改) |
MaxIntensity | string | 最大震度(JMA 震度階) |
isWarn / isFinal / isCancel / isTraining | string | 警報 / 最終報 / 取消 / 訓練 |
recv_time | number | 服务端接收时刻,Unix 毫秒 |
◆
覆盖规则:同一
event_id 的后续报次直接以较大 serial 覆盖;is_cancel 为 true 时标记为已取消,不要删除历史记录。 Errors & Limits
错误与限制
数据端点公开只读,因此错误多为「上游暂无数据」而非权限问题。
| 状态码 | body | 含义 / 处理 |
|---|---|---|
| 200 | 数据对象 | 正常 |
| 503 | {"error":"no data yet"} | 该源当前无数据(如近期无 CWA 预警)。视为「暂无」,稍后重试,勿当故障 |
| 404 | {"result":{"message":"no data"}} | 仅 /jq/* 兼容层:该条记录不存在或无震源信息 |
| 502 / 504 | nginx 错误页 | 网关或上游超时,按指数退避重试 |
| 限制 | 值 |
|---|---|
| 单 IP 并发 WebSocket | 3 路(白名单 IP / CIDR 不限) |
| 全局 WS 连接池 | 200 路,满了返回 4503 |
| 心跳 | 20 秒一次,连续 3 次未回 → 断开 4401 |
| 注册端点(兼容) | 每 IP 每日 3 次,超出 429 |
| 跨域 | Access-Control-Allow-Origin: *,可用浏览器直连 |
▲
WS 关闭码:
4401 心跳超时 · 4403 已被封禁 · 4429 该 IP 连接数超限 · 4503 服务端连接池已满。收到 4429 请降低并发或复用单连接。 Uptime
数据源状态
实时读取 /v1/status:24 个源的就绪状态与 90 次采样窗口可用率,每 30 秒刷新一次。
正在读取…
正常
异常