http://data.graylayer.tech
All data endpoints require an x-api-key header. Timestamps are UTC RFC 3339 (e.g. 2026-03-26T12:00:00Z). Results are always sorted ts ascending; limit truncates after sort.
GET /health
GET /api/:exchange/tickers
List all tickers collected for an exchange. Use prefix to narrow results — useful when you know the series you want (e.g. KXBTC15M) but not every individual contract.
| Param | In | Type | Description |
|---|---|---|---|
exchange | path | string | kalshi, gemini, or polymarket_us |
prefix | query | string | Case-insensitive prefix filter (optional) |
ticker_prefixes, only matching tickers are returned regardless of what prefix you pass.
GET /api/:exchange/snapshots/:ticker
Get snapshot rows — full orderbook state at discrete points in time. Each row represents the complete book at that moment (not a delta). Multiple rows at the same ts represent different price levels.
| Param | In | Type | Description |
|---|---|---|---|
exchange | path | string | Exchange name |
ticker | path | string | Ticker symbol |
start_ts | query | RFC 3339 | Rows at or after this time (optional) |
end_ts | query | RFC 3339 | Rows at or before this time (optional) |
limit | query | integer | Max rows returned, applied after sort (optional) |
start_ts is clamped to your key’s max_data_age_days window. Anonymous access is always clamped to the last 1 day.
GET /api/:exchange/deltas/:ticker
Get delta rows — incremental changes to the orderbook. A positive quantity_delta means a level was added or increased; negative means it was reduced or removed. Reconstruct the full book by applying deltas to a snapshot.
| Param | In | Type | Description |
|---|---|---|---|
exchange | path | string | Exchange name |
ticker | path | string | Ticker symbol |
start_ts | query | RFC 3339 | Rows at or after this time (optional) |
end_ts | query | RFC 3339 | Rows at or before this time (optional) |
limit | query | integer | Max rows returned, applied after sort (optional) |
sequence is the exchange-assigned sequence number for ordering events within the same timestamp. quantity_delta is a signed decimal string — negative values mean that quantity was removed from that level.
Examples by exchange
Kalshi
Kalshi tickers follow patterns likeKXBTC-25 (event series) or KXBTC15M-26MAR281530-50 (15-minute micro contracts).
Polymarket US
Polymarket tickers are market slugs — lowercase hyphenated strings matching the market URL on polymarket.com.Gemini
Gemini has two classes of tickers:- Crypto spot pairs — e.g.
BTCUSD,ETHUSD,SOLUSD - Prediction market contracts —
instrumentSymbolvalues likeGMKETSBTCUSD-20261231-T100000
Typical usage pattern
To reconstruct the book at a point in time and track it forward:- Fetch a snapshot just before your target time to get the full book state
- Fetch deltas starting at that snapshot’s
tsto replay changes forward - Apply each delta: add
quantity_deltato the existing quantity at(side, price); remove the level if quantity reaches zero
Cross-market queries
Compare the same question across exchanges:Notes
- Timestamps are UTC RFC 3339 (e.g.
2026-03-26T12:00:00Z) sideis"bid"or"ask"quantity_deltacan be negative (level removed or reduced)- Prices and quantities are decimal strings
- Rows are always sorted
tsascending;limittruncates after sort - Send
Accept-Encoding: gzipfor smaller payloads — responses are gzip compressed - History begins from March 7, 2026