> ## Documentation Index
> Fetch the complete documentation index at: https://docs.radion.app/llms.txt
> Use this file to discover all available pages before exploring further.

# SDKs Changelog

> Releases, additions, and breaking changes for the official Radion TypeScript, Python, and Rust SDKs.

Changes to the official Radion SDKs. See the [SDKs overview](/sdks/overview) for the current API.

<Warning>
  Entries tagged **Breaking** require changes to existing integrations.
</Warning>

<Update label="v0.6.0" description="July 6, 2026 · TypeScript, Python & Rust">
  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, set `confirmed: false` on the subscription (default `true`) with the bare channel name — e.g. `{ id, channel: "trading", confirmed: false }`. In Rust, `SubscribableChannel::Mempool(Channel::Trading)` is gone; use `Subscription::new(id, Channel::Trading).pending()`.
  * Event frames are unified: `confirmed` is now a boolean on the frame envelope, and `channel` is always the bare name for both feeds. Route pending vs confirmed on `event.confirmed`, not on a `mempool.`-prefixed channel string. `ChannelPayloadMap` (TS) and the `on_channel` `mempool.` overloads (Python) drop their `mempool.`-prefixed keys.
  * The pending-transaction payload dropped its inner `confirmed` field (now on the envelope).
  * The decoded `call` object renames `usd` to `notional_usd`.

  ### Added

  * The decoded `call` object gains an `orders` array for exchange trades: each entry has `maker`, `taker` (nullable), `token_id`, `side` (`buy`/`sell`), `maker_amount`, and `taker_amount`. Empty for non-trade calls. No derived price yet — compute it from the amounts.
  * A `mempool_unavailable` warning frame is sent right after a `confirmed: false` subscribe when the upstream node exposes no pending stream, so the subscription no longer goes silently empty.

  <Note>
    `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`).
  </Note>
</Update>

<Update label="v0.4.2" description="July 5, 2026 · TypeScript, Rust & Python">
  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: `fees` uses `receiver` / `tokenId` / `amount`; `resolution` uses `payoutNumerators` / `result`; the transfers batch uses `ids` / `amounts`.
  * Added previously-missing fields (asset ids, UMA question parameters, neg-risk / combinatorial / bridge fields, `accounts` `id` / `implementation`, and more), and dropped stray fields no event carries.

  <Note>
    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.
  </Note>
</Update>

<Update label="v0.4.1" description="July 5, 2026 · TypeScript, Rust & Python">
  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 a `token_ids` filter, has no `data.type` discriminator, and has no `mempool.` companion.

  <Note>
    `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.
  </Note>
</Update>

<Update label="v0.4.0" description="July 4, 2026 · TypeScript & Python v0.4.0, Rust v0.3.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)

  * `trades` is renamed to `trading`. Exchange fees it carried moved to the new `fees` channel. `TradesPayload` is now `TradingPayload`; in Rust, `Payload::Trades` is now `Payload::Trading`.
  * Removed the `global`, `activity`, `large_trades`, `prices`, and `collateral` channels, along with the `ActivityPayload`, `CollateralPayload`, and `PricesPayload` types (and their Rust variants). Migrate:
    * `global` → subscribe to the specific channels you need
    * `activity` → `positions` and `combos`
    * `large_trades` → `trading` with a `min_usd` filter
    * `prices` → `trading` (fills carry the price)
    * `collateral` → `positions`

  ### Added

  * New confirmed channels `fees`, `resolution`, `positions`, `transfers`, and `accounts`, each with a typed payload (`FeesPayload`, `ResolutionPayload`, `PositionsPayload`, `TransfersPayload`, `AccountsPayload`) and its own `data.type` discriminator set. Each gains a `mempool.` companion.
</Update>

<Update label="v0.3.0" description="June 25, 2026 · TypeScript, Python, Rust">
  Mempool channels now carry the same typed payload as their confirmed channel across all three SDKs. All changes are backward compatible.

  ### Changed

  * **TypeScript** — `onChannel` / `offChannel` narrow `event.data` for `mempool.` channels. `mempool.trading` now yields `TradingPayload` instead of `AnyChannelPayload`. `ChannelPayloadMap` is derived from the new `ConfirmedChannelPayloadMap` and includes the `mempool.` keys.
  * **Python** — `on_channel` gains `@overload` signatures for every `mempool.` 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 typed `Payload` enum. Version bumped to stay in lockstep.
</Update>

<Update label="v0.2.1" description="June 25, 2026 · Rust SDK">
  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 on `tokio`. Requires Rust 1.85+.
  * Unified `Radion` client with a builder; the realtime surface is reached as `radion.realtime`.
  * Stream-based, fully-typed events: `subscribe(...)` returns a `Stream` of that subscription's events, with `events()` and `lifecycle()` for the firehose and connection events. Each event's `data` is the typed `Payload` enum; unknown channels and event types are preserved as `Payload::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`, and `tracing`.
</Update>

<Update label="v0.2.0" description="June 25, 2026 · End-to-end type safety">
  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.data` is the channel's payload type, with every `data.type` discriminator enumerated. Handlers registered with `client.onChannel("<channel>", …)` receive `event.data` narrowed to that channel's payload.
  * Typed channels and `mempool.` companions, plus per-channel filter validation — `subscribe` now rejects a subscription that omits a required filter (e.g. `wallets` or `markets`).
  * Runtime frame validation at the parse boundary — `zod` (TypeScript) and `msgspec` (Python). Malformed frames are dropped; event types added server-side are forwarded untouched.
  * Typed error frames, including `skipped` on a `lagged` error.

  ### Changed (Breaking)

  * `ChannelEvent.data` is now the channel's typed payload instead of `unknown` (TypeScript) / `Any` (Python). Code that treated it as untyped may need to narrow on `data.type`.
  * `Subscription.channel` is typed to the known channel set (confirmed or `mempool.`-prefixed).
  * The overloaded realtime `on` / `off` are replaced by intent-specific methods. TypeScript: `onChannel` / `offChannel`, `onAnyChannel` / `offAnyChannel` (formerly `on("event")`), and `onLifecycle` / `offLifecycle` (`open`, `close`, `reconnect`, `error`). Python uses the same names in snake\_case. Migrate `on("<channel>", h)` → `onChannel("<channel>", h)`, `on("event", h)` → `onAnyChannel(h)`, and `on("open"|"close"|"reconnect"|"error", h)` → `onLifecycle(…, h)`.
  * TypeScript adds `zod` and Python adds `msgspec` — both SDKs keep a minimal dependency footprint.
</Update>

<Update label="v0.1.0" description="June 25, 2026 · Official TypeScript and Python SDKs">
  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 as `radion`). Requires Python 3.10+.
  * Unified `Radion` client: one entry point per language, holding a single API key. The realtime (WebSocket) API is available under `radion.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 a `mempool.` prefix.
  * Typed channels, frames, and a structured error hierarchy (`RadionError`, `RadionConnectionError`, `RadionServerError`).
</Update>
