Why River IDs?
Each exchange uses its own identifier system:- Kalshi uses tickers (e.g.,
KXBTC-24DEC31) - Polymarket uses condition IDs and slugs
- Use one numeric identifier format no matter which exchange a market trades on
- Place orders with a single field — the platform routes to the correct exchange automatically
- Track a market’s orders, positions, and fills using the same ID you found it under
How They Work
When you search for markets via the API, the response includes both the exchange-native identifiers and the River ID:river_id when placing orders — the platform handles routing to the correct exchange automatically.
One River ID per exchange listing
A River ID identifies a single listing on a single exchange. If the same real-world outcome trades on both Kalshi and Polymarket, each listing has its own River ID. To trade or track the same outcome across venues, use generic assets: ageneric_asset_id groups equivalent listings (their River IDs) into one cross-venue asset. Cross-venue endpoints accept a generic_asset_id where noted — for example the aggregated orderbook (GET /v1/orderbooks/generic-asset/{generic_asset_id}) and complex orders, which take either a river_id or a generic_asset_id.
