Every message the server sends is a JSON object with a type field. Confirmed-event payloads are shown here. Pending-transaction payloads are on the Mempool page. Every event frame carries a confirmed boolean on the envelope — true for on-chain confirmed events, false for pending (mempool) transactions — and both use the bare channel name.
Event frame
{
"type": "event",
"id": "s1",
"channel": "trading",
"confirmed": true,
"data": {
"type": "order_filled_v2",
"orderHash": "0x…",
"maker": "0x…",
"taker": "0x…",
"side": 0,
"tokenId": "0x…",
"makerAmountFilled": "0x…",
"takerAmountFilled": "0x…",
"fee": "0x…",
"builder": "0x…",
"metadata": "0x…"
}
}
id — the subscription id you gave.
channel — the channel that matched (the bare name, the same for confirmed and pending).
confirmed — true for on-chain confirmed events, false for pending transactions. Route pending vs confirmed by this flag and your subscription id.
data.type — tells you which event it is (snake_case). The other keys are the event’s fields, decoded straight from the on-chain event.
The example above is one trading event. data.type and the field set change per event. Each channel page lists every event it carries with its own payload example and full field table — see the Payloads section on trading, fees, oracle, resolution, lifecycle, positions, combos, transfers, and accounts.
The clob.* channels are the exception: their data has no type field, because each clob channel has one fixed payload shape.
Control frames
These confirm the messages you send:
{ "type": "subscribed", "id": "s1", "channel": "trading" }
{ "type": "unsubscribed", "id": "s1" }
{ "type": "pong" }
Error frames
Errors carry a fixed code and a message you can read.
code | When | Connection |
|---|
invalid_message | The message was not valid JSON. | Stays open |
unknown_channel | Unknown channel name, or a required filter is missing or wrong. | Stays open |
subscription_limit | The subscribe would go over your plan’s subscriptions per connection. | Stays open |
lagged | The client fell behind the live stream, so some events were dropped. | Stays open |
key_revoked | The API key was revoked or is no longer valid. | Closes |
revalidation_failed | Radion could not re-check the API key after several tries. | Closes |
A lagged error also tells you how many events were skipped:
{
"type": "error",
"code": "lagged",
"skipped": 42,
"message": "Receiver fell behind; 42 events dropped. Reconnect to resume."
}
See Limitations → Backpressure for why lag happens and how to handle it. Last modified on July 5, 2026