weechat-radio:$
UTC --:--:--
LCL --:--

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.

  • Basehttps://hub.weechatradio.com
  • OpenAPIopenapi.yaml (machine-readable hub contract).
  • CORS is openReads need no key. Writes are signed.
How station reports reach the map Your station signs a report and posts it to the hub API, which serves it to the public map and the live WebSocket feed. Message text is never part of a report. your station signs with its own key message text never goes in a report HTTPS hub API checks the signature live map public, no key /ws/live event firehose first sight of a public key binds it to that callsign; later posts must match
Stations report metadata only. Message text never goes in a report.

Write — POST /api/v1/report

Sign the raw body with the station’s Ed25519 key, then send it with three headers.

Headers:

  • X-Radio-Callsign
  • X-Radio-Pubkey — hex Ed25519 public key
  • X-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.

PathWhat you get
GET /api/v1/nodeslive stations and settings (band, freq_khz, frequency)
GET /api/v1/events?since=&limit=TX/RX/relay events
GET /api/v1/hubshub/relay status, including bands
GET /api/v1/bandsstations grouped by band
GET /api/v1/statstotals
GET /ws/liveWebSocket firehose of the same events
GET /healthzok
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.