sifting/io
GET/v1/snapshot/:venuegzip required

Market 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.

Format
JSON, gzip-encoded

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 only

Parameters

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

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 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 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 & 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

  • 400invalid_parameter

    A 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." }
  • 403not_entitled

    Your 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." }
  • 404not_found

    Venue path segment isn't one of crypto | forex | stocks | dex.

    { "error": "not_found", "message": "Unknown venue." }
  • 406gzip_required

    Snapshot called without Accept-Encoding: gzip.

    { "error": "gzip_required" }

More in Live market data

See all