GET
/v1/snapshot/:venuegzip requiredMarket snapshot
Get a full market snapshot across stocks, FX, crypto, commodities, and DEX, every symbol a venue publishes in a single round-trip, or scope it down to your own watchlist. Each tick carries price, sizes, best bid, best ask, symbol, and timestamp.
- Auth
X-API-Keyheader- Format
- JSON, gzip-encoded
- Rate limits
- Per-key, see limits
Example
request · shell
curl -H "X-API-Key: $KEY" -H "Accept-Encoding: gzip" --compressed \
"https://api.sifting.io/v1/snapshot/crypto?symbols=BTCUSD,ETHUSD"200OKapplication/json (gzip)
{ "data": [ { "s": "BTCUSD", "p": "68250.5", "P": "0.0143", "b": "68249.9", "B": "0.21", "a": "68251.2", "A": "0.18", "t": 1716800000000 }, { "s": "ETHUSD", "p": "3820.4", "P": "0.43", "b": "3820.1", "B": "1.2", "a": "3820.7", "A": "0.9", "t": 1716800000000 } ], "meta": { "as_of": "2026-05-27T12:00:00Z", "venue": "crypto", "count": 2 }}Loading runner…
First load onlyParameters
ParameterDescription
Parameter
venuerequiredenum · path- crypto | forex | stocks | dex.
symbolsstring · query- Comma-separated symbols (up to 250). Case-insensitive. Omit entirely to receive the full market. Any malformed symbol rejects the whole request with 400 rather than returning a partial result.
Accept-Encodingrequiredstring · header- Must include gzip; a full-market snapshot is large. A request without it returns 406 gzip_required. Most HTTP clients negotiate this automatically.
Response fields
FieldDescription
Field
data[]array- One entry per symbol, sorted by symbol.
data[].sstring- Symbol.
data[].pstring- Last trade price.
data[].Pstring- Last trade size. 0 for forex and stocks.
data[].bstring- Best bid price.
data[].Bstring- Best bid size. 0 for forex and stocks.
data[].astring- Best ask price.
data[].Astring- Best ask size. 0 for forex and stocks.
data[].tint64 (epoch ms)- Timestamp, Unix epoch milliseconds.
meta.as_ofstring- When the response was produced. RFC 3339, UTC.
meta.venuestring- The venue you queried.
meta.countinteger- Number of entries in data.
Reference
Prices and sizes are strings, cast before mathDescription
Prices and sizes are strings, cast before math
- Why
- Inside each data[] entry, p, P, b, B, a, and A come back as JSON strings to preserve exact precision. Only t is a number (epoch ms).
- The trap
- Math on the raw fields breaks: Python raises TypeError, JavaScript + silently joins the strings instead of adding.
- Python (trade, bid, ask)
- row = data["data"][0]; trade = float(row["p"]); bid = float(row["b"]); ask = float(row["a"])
- JavaScript (trade, bid, ask)
- const row = data.data[0]; const trade = Number(row.p); const bid = Number(row.b); const ask = Number(row.a);
- cURL / jq
- Cast in jq too: jq '.data[0] | { trade: (.p|tonumber), bid: (.b|tonumber), ask: (.a|tonumber) }'
- Historical bars differ
- Bars from /v1/hist/* already return t, o, h, l, c, v as plain numbers, do not cast those.
Two ways to call itDescription
Two ways to call it
- Full market
- No query string returns one entry per symbol the venue currently publishes, sorted by symbol. There is no pagination, a snapshot is the complete picture at once.
- Specific symbols
- ?symbols=BTCUSD,ETHUSD,SOLUSD returns only those. Up to 250 per call, case-insensitive.
Freshness & behaviorDescription
Freshness & behavior
- Sizes
- For forex and stocks (no top-of-book size data), P / B / A come through as 0. That is expected, not an error.
- Best-effort
- A symbol with a temporarily incomplete record is skipped rather than failing the request.
- Empty venue
- A venue with nothing to report returns 200 with an empty data array, not an error.
- Caching
- Live, never cached at the edge. Each call reflects current state at meta.as_of.
Error responses
StatusCodeMeaning
- 400
invalid_parameterA symbol in the list is malformed for the venue. The whole request is rejected so a typo surfaces immediately instead of looking like missing data.
{ "error": "invalid_parameter", "message": "Symbol BTC-USD is not valid for venue crypto." } - 403
not_entitledYour subscription doesn't include this venue. The same entitlement gates the venue's live ticks.
{ "error": "not_entitled", "message": "Your subscription doesn't include the crypto venue." } - 404
not_foundVenue path segment isn't one of crypto | forex | stocks | dex.
{ "error": "not_found", "message": "Unknown venue." } - 406
gzip_requiredSnapshot called without Accept-Encoding: gzip.
{ "error": "gzip_required" }