Market data API
Read-only HTTP API for market data: options flow, large spot and perp trades, macro and market indices, funding and open interest, social intelligence and a catalogue of tools.
- Options flow Deribit, Derive and Paradex block trades · 14,973 blocks · history from 21 Apr 2026
- Large spot & perp trades 4 venues (Binance, Hyperliquid, Lighter and Lighter Robinhood) · 1,954 markets live · $50k or more on Hyperliquid, Lighter and Lighter Robinhood; $250k or more on Binance
- Macro & market indices 7 tools
Coverage read through the partner API in production, 21 Oct 2026 00:01 UTC; answer time over 120 calls, 19 Oct 2026 06:47 UTC.
Get started in 60 seconds
1 Your key
Send it as a bearer token on every request: Authorization: Bearer $TN_API_KEY. Paste it once below and every code sample on these pages shows and copies with it. No key yet: request an evaluation key.
Stored in this tab only; cleared on reload.
2 First call
The three newest large Bitcoin trades on Hyperliquid.
curl -s "https://tn-api.truenorth.xyz/api/prints/large?venue=hyperliquid&pair=BTC&limit=3" \
-H "Authorization: Bearer $TN_API_KEY"import json, os, urllib.error, urllib.request
KEY = os.environ.get("TN_API_KEY", "$TN_API_KEY")
req = urllib.request.Request("https://tn-api.truenorth.xyz/api/prints/large?venue=hyperliquid&pair=BTC&limit=3",
headers={"Authorization": "Bearer " + KEY})
try:
with urllib.request.urlopen(req, timeout=30) as res:
print(res.status, json.load(res))
except urllib.error.HTTPError as err: # a refusal is coded: X-TN-Error-Code and detail.code
print(err.code, err.headers.get("X-TN-Error-Code"), err.read().decode())const KEY = process.env.TN_API_KEY ?? "$TN_API_KEY";
const res = await fetch("https://tn-api.truenorth.xyz/api/prints/large?venue=hyperliquid&pair=BTC&limit=3", {
headers: { Authorization: `Bearer ${KEY}` },
});
console.log(res.status, await res.json());3 What comes back
The real answer of that call, two of its three rows.
GET /api/prints/large?venue=hyperliquid&pair=BTC&limit=3{
"status": "ok",
"prints": [
{
"id": "2fe27ab10efbb2a67317477aea477a73",
"venue": "hyperliquid",
"market": "perp",
"pair": "BTC",
"tokenAddress": "bitcoin",
"side": "sell",
"vwapPrice": 82885.0,
"size": 4.82,
"notionalUsd": 399809.89,
"fillCount": 14,
"txHash": "0xda317ff83099eedadbab044701e33500006c97ddcb9d0dac7dfa2b4aef9dc8c5",
"takerAddress": "0x581c013a18f17f5ab09ad89debd16b84f72e46dd",
"buyerAddress": null,
"sellerAddress": "0x581c013a18f17f5ab09ad89debd16b84f72e46dd",
"isLiquidation": null,
"sourceTimestamp": "2026-10-21T00:01:32.535000Z"
},
{
"id": "77f678e160ed33847228d555238563d7",
"venue": "hyperliquid",
"market": "perp",
"pair": "BTC",
"tokenAddress": "bitcoin",
"side": "buy",
"vwapPrice": 82922.0,
"size": 9.04,
"notionalUsd": 749448.21,
"fillCount": 48,
"txHash": "0xc00a38599b403b8ac183044701e1bc000045503f36435a5c63d2e3ac5a441575",
"takerAddress": "0xce508465b243216fcf372d3146fd62e8f7a7b8e2",
"buyerAddress": "0xce508465b243216fcf372d3146fd62e8f7a7b8e2",
"sellerAddress": null,
"isLiquidation": null,
"sourceTimestamp": "2026-10-21T00:01:04.475000Z"
}
],
"meta": {
"nextCursor": "MjAyNi0xMC0yMVQwMDowMDo1MC42ODIwMDArMDA6MDB8MTUxMjY5MXxjY2Y4YWRkYjEyYjg",
"latestCursor": "MjAyNi0xMC0yMVQwMDowMToyMi4zMTY1MzUrMDA6MDB8MTUxMjcxMw",
"hasMore": true,
"count": 3,
"generatedAt": "2026-10-21T00:01:37.547519Z",
"population": [
{
"tier": "trade_history",
"rows": "per-trade rows, no counterparties",
"floorUsd": 250000.0,
"from": "2026-07-23T00:01:37.547519Z",
"to": "2026-10-17T23:08:05.627000Z"
},
{
"tier": "live",
"rows": "one row per taker order per block, with counterparties",
"floorUsd": 50000.0,
"from": "2026-10-17T23:10:54.903000Z",
"to": "2026-10-21T00:01:33.966000Z"
}
],
"sort": "time",
"window": null
}
}Every field is defined on the large trades page. Real production answer; values rounded for display, the API returns full precision.
tokenAddress is the canonical id, the same as the CoinGecko id, on every row; pair is the venue’s own symbol as the venue spells it. One real mapping from GET /api/tokens/all, 21 Oct 2026 00:01 UTC:
bitcoin ↔ Binance BTCUSDT ↔ Hyperliquid BTC ↔ Ondo BTC-USD.P ↔ OKX BTC-USDT-SWAP ↔ Lighter Robinhood 1 ↔ Lighter 14 Run the review kit
One file, standard library only. It lists the universe, calls every route once, re-reads random prints and blocks on the venues’ own public APIs and prints pass or fail.
https://storage.googleapis.com/truenorth-partner-api-docs/partner-review-kit/explore.py
sha256: 7811570e71ae0c89949d6613ae32d3cee11d1aba7dd1df2db7032c5d75cec5ee
TN_API_KEY=<your key> python3 explore.pyDatasets
Options flow
Deribit, Derive and Paradex block trades · 14,973 blocks · history from 21 Apr 2026
6 operationsAPI key requiredoptions_intelligenceGET /api/options/marketsLarge spot & perp trades
4 venues (Binance, Hyperliquid, Lighter and Lighter Robinhood) · 1,954 markets live · $50k or more on Hyperliquid, Lighter and Lighter Robinhood; $250k or more on Binance
5 operationsRequest partner accessmarket_feedsGET /api/prints/large| Dataset | Coverage | Operations | Access |
|---|---|---|---|
| Funding & open interest | Funding on 6 venues · open interest on 6 · hourly record | 4 | Request partner accessmarket_feeds |
| Social intelligence | 11 read routes | 11 | Request partner accesssocial_intelligence |
| Assets & market sessions | 3 tools | 3 | API key required |
| Technical analysis | 2 tools | 2 | API key required |
| Derivatives & positioning | 3 tools | 3 | API key required |
| Discovery & screeners | 2 tools | 2 | API key required |
| Company fundamentals | 11 tools | 11 | API key required |
| Prediction markets | 1 tool | 1 | API key required |
| Market indicators & flows | 4 tools | 4 | API key required |
| Risk & trading costs | 2 tools | 2 | API key required |
| Tool catalogue | 3 tools | 3 | No key required API key required |
Access comes from the licence each route sits behind: an ordinary key reads what says API key required; what says Request partner access needs the partner licence on your account (request access). Measured 21 Oct 2026 00:01 UTC.
What you can build
| Build | What it does | Routes |
|---|---|---|
| Large-trade alerts | Alert on every taker order above a size you set, per venue, pair or token. | GET /api/prints/largeGET /api/prints/stream |
| Funding and spread dashboard | Show funding and open interest by venue on one scale, and what it costs to open and close a cross-venue pair. | GET /api/funding/historyGET /api/open-interest/historyGET /api/quotes/spread |
| Options block-trade feed | List each block with its structure, legs, premium and notional. | GET /api/options/flowGET /api/options/flow/stream |
| Macro panel | Show the index and rates backdrop beside a market: VIX, equity indices, the dollar, Treasury yields, FX, commodities. | POST /api/agent-tools/callPOST /api/agent-tools/call |
| Trader-call feed | Render calls from X and Telegram with the trader and the source post. | GET /api/social/feedGET /api/social/positions |
Streams push the same rows as they are stored; polling stays the primary path (see Integration).
How to integrate
REST poll
Poll forward with since set to meta.latestCursor. Page back with cursor set to meta.nextCursor. Name a window with from and to, at most 31 days. The whole loop, with its checkpoint and idempotent upsert: Polling & continuation.
# 1. the first answer carries meta.latestCursor
# 2. send it back as since: only newer rows come back
curl -s "https://tn-api.truenorth.xyz/api/prints/large?venue=hyperliquid&pair=BTC&since=MjAyNi0xMC0yMVQwMDowMToyMi4zMTY1MzUrMDA6MDB8MTUxMjcxMw" \
-H "Authorization: Bearer $TN_API_KEY"Stream (server-sent events)
Each new large print or block arrives as it is stored; reconnect with the Last-Event-ID header, then fill any gap with one since read. A stream states no delivery latency, and polling stays the primary path. The stream contract.
curl -N "https://tn-api.truenorth.xyz/api/prints/stream?venue=hyperliquid&minNotionalUsd=50000" \
-H "Authorization: Bearer $TN_API_KEY" \
-H "Accept: text/event-stream" \
-H "Last-Event-ID: <last id you stored>"Generated client or agent
openapi.json describes 24 of the 26 routes on these pages: generate a client with any OpenAPI generator. llms.md is the whole reference as one Markdown file for an AI agent. MCP serves the Agent API tools; these routes are plain HTTP.
openapi-generator-cli generate -i https://storage.googleapis.com/truenorth-partner-api-docs/openapi.json -g python -o tn-clientcurl -s https://storage.googleapis.com/truenorth-partner-api-docs/llms.mdCoverage & history
| Venue | Market | Since | Markets | Rows / 24 h | Note |
|---|---|---|---|---|---|
| Deribit | options | 21 Apr 2026 | 7 | 13 | Block tape · Options markets |
| Derive | options | Live | 12 | 24 | Block tape · Options markets |
| Paradex | options | Live | — | 3 | Block tape |
| Venue | Market | Since | Markets | Rows / 24 h | Note |
|---|---|---|---|---|---|
| Hyperliquid | perps | 29 Oct 2024 | 338 | 24,127 | Size percentiles · Activity by address |
| Hyperliquid | spot | 29 Nov 2024 | 313 | 394 | Size percentiles · Activity by address |
| Lighter | perps | Live | 196 | 5,066 | Size percentiles · Activity by address · pair is the symbol here, the market id on funding and open interest |
| Lighter | spot | Live | 8 | 3 | Size percentiles · Activity by address · pair is the symbol here, the market id on funding and open interest |
| Lighter Robinhood | perps | Live | 58 | 541 | Size percentiles · Activity by address · pair is the symbol here, the market id on funding and open interest |
| Binance | USDT-M | Live | 535 | 14,937 | |
| Binance | COIN-M | Live | 20 | 518 | |
| Binance | spot | Live | 506 | 291 |
| Venue | Market | Since | Markets | Rows / 24 h | Note |
|---|---|---|---|---|---|
| Hyperliquid | perps | Live | — | — | Hourly funding · Settles every 1 h · Open interest |
| Binance | USDT-M | Live | — | — | Hourly funding · Settles every 8 h · Open interest |
| OKX | perps | Live | — | — | Hourly funding · Settles every 8 h · Open interest |
| Lighter | perps | Live | — | — | Hourly funding · Settles every 1 h · Open interest · Spread vs Ondo perps · 30-day record · pair is the market id here, the symbol on prints |
| Lighter Robinhood | perps | Live | — | — | Hourly funding · Settles every 1 h · Open interest · pair is the market id here, the symbol on prints |
| Ondo | perps | Live | — | — | Hourly funding · Settles every 1 h · Open interest · Spread vs Lighter perps · 30-day record |
Measured through the partner API in production, 21 Oct 2026 00:01 UTC. A record that began recently reads Live; a date appears only for a deep record.
For agents & reviewers
Limits & refusals
| Limit | Value |
|---|---|
| Entry tier | 100 requests a minute per key |
| Higher tiers | 500 and 1,200 requests a minute per key |
| Past the rate | 429 api_key_rate_limited with Retry-After |
| Window | at most 31 days between from and to |
Every refusal carries detail.code and the same value in the X-TN-Error-Code header. Two of the refusals the review kit checks, as production answered them 19 Oct 2026 06:47 UTC:
| Request | Status | Code | Message |
|---|---|---|---|
| No key | 401 | api_key_required | This endpoint requires an API key or a signed-in user. Get an API key at https://app.truenorth.xyz/credits |
| A venue the route does not serve | 422 | market_feeds_invalid_query | Invalid query: venue: expected names from: binance, hyperliquid, lighter, lighter_robinhood. |
Evaluation & next steps
| Key | One Enterprise key, sent as a bearer token. |
| Access | Every product on these pages and the full history each page states, with no windows. |
| Rate | 100 requests a minute per key on the entry tier; higher tiers on agreement. |
| Volume | A credit balance set with the team is the cap. When it is spent the key answers 402 credits_exhausted until it is topped up. |
| End | The team closes the licences on the agreed date; nothing expires silently. |
| Acceptance | The review kit (): pass or fail against the venues’ own public APIs. |
| To tell the team | Which markets, which history windows, how often you poll. |
| Contact | Partnerships |