Skip to main content

Why River IDs?

Each exchange uses its own identifier system:
  • Kalshi uses tickers (e.g., KXBTC-24DEC31)
  • Polymarket uses condition IDs and slugs
River IDs abstract this away, allowing you to:
  • 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:
Use the 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: a generic_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.