tickstream (Python)
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.
Install
pip install "tickstream[stream]" # omit [stream] for REST only — zero dependencies
Quickstart
from tickstream import Tickstream
ts = Tickstream() # reads TICKSTREAM_API_KEY
print(ts.quote("NQ"))
for tick in ts.stream("NQ", "ES"):
print(tick["symbol"], tick["price"])
Everything you can call
| what | call |
|---|---|
| quote | ts.quote("NQ") |
| symbols | ts.symbols() |
| recent ticks | ts.ticks("NQ", start=…) |
| deep ticks | ts.history.ticks("NQ", start=…, end=…) |
| deep L2 book | ts.history.book("NQ", start=…, end=…) |
| legacy chain archive | ts.history.options("QQQ", source="archive") |
| live chain | ts.options.chain("QQQ") |
| option history (12 types) | ts.options.eod(underlying="QQQ", date="20260715") |
| dealer gamma, live | ts.gex("NQ") |
| dealer gamma, past | ts.gex("NQ", date="2026-07-15") |
| participant flow | ts.participants("NQ") |
| CFTC positioning | ts.cot("NQ", weeks=8) |
| algo catalogue / record | ts.algos.list() · ts.algos.track(id) |
| orders, positions, fills | ts.exec.positions() |
| place / close / protect | ts.exec.order({...}) |
| stream | for t in ts.stream("NQ","ES"): … |
Three things that will bite you otherwise
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.
Errors
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.
Entitlements per endpoint
| 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.
Streaming, and why silence is not a bug
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.
Docs
https://tick-stream.xyz/docs/sdks · machine-readable: https://tick-stream.xyz/llms-full.txt
Metadata
Release files for tickstream 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| tickstream-1.0.0.tar.gz | 10.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| tickstream-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 19.5 kB
Release files / tickstream-1.0.0.tar.gz
| Download URL | tickstream-1.0.0.tar.gz |
|---|---|
| Size | 10.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
dd1989c115e4f4ea4bf5ade553da04e0d78c3a0c2d8aa8f6a25e1c90304afa8e
|
|
BLAKE2b-256 checksum How to use checksums |
beb00130b20521046c50f17e18861a0bf41e6df8a6bf7800961ead0606fded44
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.3
|
Release files / tickstream-1.0.0-py3-none-any.whl
| Download URL | tickstream-1.0.0-py3-none-any.whl |
|---|---|
| Size | 9.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
64551a1aa1d827f2cb576bdb62fac6fbdd80f44db9b88bcdc7e26118ba95abcb
|
|
BLAKE2b-256 checksum How to use checksums |
f65fbd1b6b31f00bad78c126038ee3e6cd9bfa535b42a529230f7260560890b8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.3
|