Historical L2 order books
Query paginated source order-book snapshots and deltas directly from the historical REST API.
GET
Historical L2 order books
Use
Use Catalog to find exact source and market IDs.
Example response excerpt, showing level
Every full item also has all intermediate
GET /historical/orderbook-l2 to read stateless L2 source events in global collector-time order. Each flat REST row has fixed price and size fields for up to 25 levels per side. The L2 schema page describes SDK and snapshot event envelopes and how to reconstruct a complete book; this endpoint returns the source observations without doing that reconstruction.
source_event_is_snapshot: true identifies a complete source snapshot. false identifies a sparse update with absolute level quantities. Do not treat every returned row as a complete order book.
Access and time range
Omit bothstart and end to query the latest ten minutes without authentication. Supply either bound to query a chosen interval with a Polaris API key in Authorization: Bearer YOUR_API_KEY. start and end are inclusive collector timestamps in Unix milliseconds. With only start, the query runs through now; with only end, it covers the preceding ten minutes.
Query parameters
string
Exact source ID. Omit to query across sources.
string
Exact normalized routing market. Omit to query across markets.
string
Venue-native instrument filter.
integer
Inclusive collector time in Unix milliseconds. Requires a Polaris API key.
integer
Inclusive collector time in Unix milliseconds. Requires a Polaris API key.
integer
default:200
Page size from
1 to 1000.string
Opaque
next_cursor from the previous page of the same query.Request and response
00 and 24 only:
bid_px_01 through bid_px_23, bid_sz_01 through bid_sz_23, ask_px_01 through ask_px_23, and ask_sz_01 through ask_sz_23 fields. Each level price or size is a nullable number. event_id, source, market, collector_timestamp, source_capture_id, schema_version, and source_event_is_snapshot are required. instrument and exchange_timestamp are present but can be null.
Pagination and errors
Whenhas_more is true, send next_cursor as cursor while keeping the other query parameters unchanged. Stop when has_more is false; next_cursor is then null.
The API documents 400 for an invalid request, 401 when authentication is needed, 422 when query work exceeds its limit, 429 when the request quota is exceeded, and 503 when the service is unavailable. Narrow the requested time range after a 422; respect Retry-After after a 429. Errors have an error object with code, message, and resolution.
Related documentation
- L2 order-book schema for reconstruction and SDK event fields
- Python SDK, TypeScript SDK, and Rust SDK for client methods
- Snapshots for bulk historical files