docs › For developers and hub operators › Public API
weechat-radio:$ Public API
The live map reads this API. You can skip this page unless you are building something that talks to the hub.
- Base
https://hub.weechatradio.com - OpenAPIopenapi.yaml (machine-readable hub contract).
- CORS is openReads need no key. Writes are signed.
Write — POST /api/v1/report
Sign the raw body with the station’s Ed25519 key, then send it with three headers.
Headers:
X-Radio-CallsignX-Radio-Pubkey— hex Ed25519 public keyX-Radio-Signature— hex signature of the raw body
First time a public key is seen, it is bound to that callsign. Later posts must use the same key.
Body is JSON metadata only. Never send message text.
{
"callsign": "G4ABC",
"ts": 1710000000,
"grid": "IO91wm",
"mode": "internet-radio",
"ptt": "digirig",
"preset": "vhf-fm",
"snr": 12.4,
"ber": 0.0,
"queue": 0,
"hub_ok": true,
"freq_khz": 144950,
"band": "2m",
"settings": { "frequency": "144.950 MHz", "band": "2m" },
"events": [
{ "ts": 1710000000, "kind": "tx", "origin": "G4ABC", "dest": "NET", "hops": 3, "band": "2m" }
]
}
ts must be within 5 minutes of the hub clock.
Read
Plain GET requests. No key needed.
| Path | What you get |
|---|---|
GET /api/v1/nodes | live stations and settings (band, freq_khz, frequency) |
GET /api/v1/events?since=&limit= | TX/RX/relay events |
GET /api/v1/hubs | hub/relay status, including bands |
GET /api/v1/bands | stations grouped by band |
GET /api/v1/stats | totals |
GET /ws/live | WebSocket firehose of the same events |
GET /healthz | ok |
GET /version | {"version", "commit"} of the running hub |
How you know it worked
curl https://hub.weechatradio.com/api/v1/stats
returns JSON with nodes_online.