CME futures, options and dealer-gamma data over REST and WebSocket.
21 endpoints, 12 option-history request types, 4 streaming channels — the complete API. Coverage is asserted by
sdk/check-coverage.mjs against a manifest generated from the gateway's own router, and every
call in the table below is exercised against production before release.
npm i @tickstream/client # Node 22+ needs nothing else; older Node: npm i wsimport { Tickstream } from "@tickstream/client";
const ts = new Tickstream(); // reads TICKSTREAM_API_KEY
console.log(await ts.quote("NQ"));
for await (const tick of ts.stream("NQ", "ES")) {
console.log(tick.symbol, tick.price);
}| what | call |
|---|---|
| quote | await ts.quote("NQ") |
| symbols | await ts.symbols() |
| recent ticks | await ts.ticks("NQ", { start }) |
| deep ticks | await ts.history.ticks("NQ", { start, end }) |
| deep L2 book | await ts.history.book("NQ", { start, end }) |
| legacy chain archive | await ts.history.options("QQQ", { source: "archive" }) |
| live chain | await ts.options.chain("QQQ") |
| option history (12 types) | await ts.options.eod({ underlying: "QQQ", date: "20260715" }) |
| dealer gamma, live | await ts.gex("NQ") |
| dealer gamma, past | await ts.gex("NQ", { date: "2026-07-15" }) |
| participant flow | await ts.participants("NQ") |
| CFTC positioning | await ts.cot("NQ", { weeks: 8 }) |
| algo catalogue / record | await ts.algos.list() · ts.algos.track(id) |
| orders, positions, fills | await ts.exec.positions() |
| place / close / protect | await ts.exec.order({...}) |
| stream | for await (const t of ts.stream("NQ","ES")) … |
1. ticks() without start returns one hour. Not seven days — one hour. The window
reaches back seven days on any plan and years with an archive plan, but you have to ask:
pass start. This is the single most common integration surprise.
2. Timestamps come in two units. Range arguments are unix seconds; tick rows are stamped in microseconds. They differ by a factor of a million, and comparing them returns nothing rather than raising — so this SDK converts for you rather than documenting it and hoping.
3. Two opposite symbol conventions. gex() and participants() take the futures or
stock symbol (NQ, ES, AAPL) and map onto the deep ETF surface internally. options and
history.options take the ETF or index root (QQQ, SPY, SPX). Passing QQQ to gex()
is a 400 unsupported_symbol.
Every failure carries the API's machine-readable code, which is stable and worth branching
on. A 403 whose code ends in _required means the endpoint works and your key does not hold
that package — distinct from an invalid key, without parsing prose.
| endpoint | needs | parameters |
|---|---|---|
GET /v1/algos |
included | — |
GET /v1/algos/:id/events |
included | — |
GET /v1/algos/:id/signal |
included | — |
GET /v1/algos/:id/track |
included | — |
GET /v1/cot |
included | symbol, weeks |
POST /v1/exec/close |
execution | — |
GET /v1/exec/fills |
included | — |
POST /v1/exec/order |
execution | — |
GET /v1/exec/orders |
included | — |
GET /v1/exec/positions |
included | — |
POST /v1/exec/protect |
execution | — |
GET /v1/gex |
gex | underlying, symbol, weight, dte, at, date |
GET /v1/history/book |
data:nq-ticks | end, limit, start, symbol |
GET /v1/history/options |
data:options-data | end, limit, source, start, underlying |
GET /v1/history/ticks |
data:nq-ticks | end, limit, start, symbol |
GET /v1/options |
options_stream | underlying |
GET /v1/options/:req |
options | — |
GET /v1/participants |
gex | underlying |
GET /v1/quote |
included | symbol |
GET /v1/symbols |
included | — |
GET /v1/ticks |
included | end, start, symbol |
included means every plan that can reach the API at all. data:* is an archive window,
gex/options/execution are the product packages — see https://tick-stream.xyz/pricing.
Every frame carries a type, ticks included. A filter that skips anything with a type
therefore drops all the data and leaves a socket that looks connected and delivers nothing —
this SDK handles that. Error frames are never swallowed either: a refused symbol is exactly
the failure that reads as a quiet market.
Index levels (SPX, VIX, NDX, RUT) are quotes, not trade prints: they update on change, roughly every two seconds. A flat VIX genuinely sends nothing. A liquid future going quiet for minutes is worth reporting.
https://tick-stream.xyz/docs/sdks · machine-readable: https://tick-stream.xyz/llms-full.txt
- SDK documentation — https://tick-stream.xyz/docs/sdks
- API reference — https://tick-stream.xyz/docs
- Pricing and plans — https://tick-stream.xyz/pricing
- Free GEX levels — https://tick-stream.xyz/gex
Built by tickstream — CME futures, options chains, Greeks and dealer gamma over one API.