GET
/v1/last/trade/:venue/:symbolLast trade
Get the latest trade data for supported stocks, FX, crypto, commodities, and DEX markets, including price, size, symbol, and timestamp.
- Auth
X-API-Keyheader- Format
- JSON
- Rate limits
- Per-key, see limits
Example
request · shell
curl -H "X-API-Key: $KEY" \
"https://api.sifting.io/v1/last/trade/crypto/BTCUSD"200OKapplication/json
{ "s": "BTCUSD", "p": "67234.5", "P": "0.00432", "t": 1746189123456}Loading runner…
First load onlyParameters
ParameterDescription
Parameter
venuerequiredenum · path- stocks | crypto | forex | commodities | dex.
symbolrequiredstring · path- 6–12 alphanumeric characters, no separators (e.g. BTCUSD). Case-insensitive.
Response fields
FieldDescription
Field
sstring- Symbol.
pstring- Last trade price.
Pstring- Last trade size.
tint64 (epoch ms)- Exchange timestamp, Unix epoch milliseconds.
Reference
Price and size are strings, cast before mathDescription
Price and size are strings, cast before math
- Why
- p (price) and P (size) 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
- price = float(data["p"])
- JavaScript
- const price = Number(data.p);
- cURL / jq
- Cast in jq too: jq '.p | tonumber'
- Historical bars differ
- Bars from /v1/hist/* already return t, o, h, l, c, v as plain numbers, do not cast those.
Error responses
StatusCodeMeaning
- 503
stale_snapshotLast tick is older than the staleness threshold (default 5s). Body carries last_t and server_now so clients can decide to retry or switch to WebSocket.
{ "error": "stale_snapshot", "last_t": 1746189100000, "server_now": 1746189130000}