The pending feed moved from a
mempool. channel prefix to a confirmed boolean, and the pending payload now carries per-order detail.Changed (Breaking)
- The
mempool.channel prefix is removed. To subscribe to the pending feed, setconfirmed: falseon the subscription (defaulttrue) with the bare channel name — e.g.{ id, channel: "trading", confirmed: false }. In Rust,SubscribableChannel::Mempool(Channel::Trading)is gone; useSubscription::new(id, Channel::Trading).pending(). - Event frames are unified:
confirmedis now a boolean on the frame envelope, andchannelis always the bare name for both feeds. Route pending vs confirmed onevent.confirmed, not on amempool.-prefixed channel string.ChannelPayloadMap(TS) and theon_channelmempool.overloads (Python) drop theirmempool.-prefixed keys. - The pending-transaction payload dropped its inner
confirmedfield (now on the envelope). - The decoded
callobject renamesusdtonotional_usd.
Added
- The decoded
callobject gains anordersarray for exchange trades: each entry hasmaker,taker(nullable),token_id,side(buy/sell),maker_amount, andtaker_amount. Empty for non-trade calls. No derived price yet — compute it from the amounts. - A
mempool_unavailablewarning frame is sent right after aconfirmed: falsesubscribe when the upstream node exposes no pending stream, so the subscription no longer goes silently empty.
min_usd keeps its name on both feeds, but the confirmed feed measures the filled amount while the pending feed measures the order’s intended fill (call.notional_usd).Realtime payload types now cover every field each channel’s events carry.
Fixed
- Channel docs now document all 77 confirmed events, and each channel’s typed payload is the union of its events’ fields.
- Corrected wrong field names:
feesusesreceiver/tokenId/amount;resolutionusespayoutNumerators/result; the transfers batch usesids/amounts. - Added previously-missing fields (asset ids, UMA question parameters, neg-risk / combinatorial / bridge fields,
accountsid/implementation, and more), and dropped stray fields no event carries.
Non-breaking. Topic-channel payloads keep their loose, all-optional shape (Rust fields are
Option), so existing code keeps working — there are just more fields available.The CLOB order-book feed is now a first-class, typed channel family.
Added
- CLOB channels are now subscribable directly:
clob.book,clob.prices,clob.last_trade,clob.midpoint,clob.tick_size,clob.best_bid_ask. Each has a typed payload, requires atoken_idsfilter, has nodata.typediscriminator, and has nomempool.companion.
clob.prices is the CLOB price-change feed — a separate family from the topic channels, unrelated to the derived last-trade prices channel removed in v0.4.0.The realtime channel taxonomy was redesigned. Every decoded event now routes to exactly one of nine topic channels, plus the two cross-cutting filter channels (
wallets, markets).Changed (Breaking)
tradesis renamed totrading. Exchange fees it carried moved to the newfeeschannel.TradesPayloadis nowTradingPayload; in Rust,Payload::Tradesis nowPayload::Trading.- Removed the
global,activity,large_trades,prices, andcollateralchannels, along with theActivityPayload,CollateralPayload, andPricesPayloadtypes (and their Rust variants). Migrate:global→ subscribe to the specific channels you needactivity→positionsandcomboslarge_trades→tradingwith amin_usdfilterprices→trading(fills carry the price)collateral→positions
Added
- New confirmed channels
fees,resolution,positions,transfers, andaccounts, each with a typed payload (FeesPayload,ResolutionPayload,PositionsPayload,TransfersPayload,AccountsPayload) and its owndata.typediscriminator set. Each gains amempool.companion.
Mempool channels now carry the same typed payload as their confirmed channel across all three SDKs. All changes are backward compatible.
Changed
- TypeScript —
onChannel/offChannelnarrowevent.dataformempool.channels.mempool.tradingnow yieldsTradingPayloadinstead ofAnyChannelPayload.ChannelPayloadMapis derived from the newConfirmedChannelPayloadMapand includes themempool.keys. - Python —
on_channelgains@overloadsignatures for everymempool.companion, so handlers narrow to the channel’s payload type (e.g.ChannelHandlerFor[TradingPayload]). - Rust — no API change; the SDK already decoded
mempool.events into the typedPayloadenum. Version bumped to stay in lockstep.
The official Rust SDK ships as
radion-sdk on crates.io (imported as radion_sdk), at feature parity with the TypeScript and Python SDKs.Added
radion-sdk— async-first Rust SDK built ontokio. Requires Rust 1.85+.- Unified
Radionclient with a builder; the realtime surface is reached asradion.realtime. - Stream-based, fully-typed events:
subscribe(...)returns aStreamof that subscription’s events, withevents()andlifecycle()for the firehose and connection events. Each event’sdatais the typedPayloadenum; unknown channels and event types are preserved asPayload::Other. - Auto-reconnect with exponential backoff and jitter, subscription replay, and heartbeat / stale-connection detection — matching the other SDKs’ defaults.
- Cargo features:
realtime(default),rustls(default),native-tls, andtracing.
Every frame, channel, and payload is now fully typed in both SDKs, validated at the parse boundary.
Added
- Typed event payloads for every channel —
event.datais the channel’s payload type, with everydata.typediscriminator enumerated. Handlers registered withclient.onChannel("<channel>", …)receiveevent.datanarrowed to that channel’s payload. - Typed channels and
mempool.companions, plus per-channel filter validation —subscribenow rejects a subscription that omits a required filter (e.g.walletsormarkets). - Runtime frame validation at the parse boundary —
zod(TypeScript) andmsgspec(Python). Malformed frames are dropped; event types added server-side are forwarded untouched. - Typed error frames, including
skippedon alaggederror.
Changed (Breaking)
ChannelEvent.datais now the channel’s typed payload instead ofunknown(TypeScript) /Any(Python). Code that treated it as untyped may need to narrow ondata.type.Subscription.channelis typed to the known channel set (confirmed ormempool.-prefixed).- The overloaded realtime
on/offare replaced by intent-specific methods. TypeScript:onChannel/offChannel,onAnyChannel/offAnyChannel(formerlyon("event")), andonLifecycle/offLifecycle(open,close,reconnect,error). Python uses the same names in snake_case. Migrateon("<channel>", h)→onChannel("<channel>", h),on("event", h)→onAnyChannel(h), andon("open"|"close"|"reconnect"|"error", h)→onLifecycle(…, h). - TypeScript adds
zodand Python addsmsgspec— both SDKs keep a minimal dependency footprint.
Official Radion SDKs are now available —
@radion-app/sdk and radion-sdk, one typed client per language, one API key.Added
@radion-app/sdk— TypeScript SDK, ships ESM + CJS and its own type definitions. Requires Node.js 18+.radion-sdk— async-first Python SDK (imported asradion). Requires Python 3.10+.- Unified
Radionclient: one entry point per language, holding a single API key. The realtime (WebSocket) API is available underradion.realtime. - Realtime client with a subscription model —
{ id, channel, filters }— plus automatic reconnect with exponential backoff, heartbeats, and subscription restore after reconnect. - Server-side filters:
wallets,market_ids,token_ids,min_usd. Channels may carry amempool.prefix. - Typed channels, frames, and a structured error hierarchy (
RadionError,RadionConnectionError,RadionServerError).