Docs · open, no login, no form
First response in thirty seconds
Every response is JSON. Every record carries observed_block. Fields that failed reconciliation carry "stale": true and the time it separated.
01 · Get a key
Sign up with a company email on Get API key. The free tier is enough for staging and a few backfills.
02 · Call
curl -s "{{ baseUrl }}/v1/tokens?chain=robinhood&limit=5" \
-H "Authorization: Bearer $TUFT_KEY"
03 · Or install the SDK
npm i @tuft/sdk # TypeScript pip install tuft-sdk # Python
200 · application/json · 41 ms
{
"schema_version": "2026-09-01",
"observed_block": 54940649,
"data": [
{
"address": "0x0e0d2c89a5a019fe1cf762e5e33187631dacc21b",
"symbol": "CHUMP",
"price_usd": "0.0417053935",
"liquidity_usd": "570906.39",
"volume_24h_usd": "2580144.39",
"holders": 4796,
"stale": false
}
],
"next_cursor": "2"
}
Reference
{{ cur.method }}
{{ cur.path }}
{{ cur.tier }}{{ cur.desc }}
{{ cur.curl }}
| Parameter | Type | Notes |
|---|---|---|
| {{ p.name }} | {{ p.type }} | {{ p.note }} |
Response fields for this endpoint: {{ cur.fields }}. All numeric money fields are decimal strings; all counts are integers; all times are UTC ISO-8601 and say whether they refer to block time or receipt time.
Stale fields
When the reconciliation job finds indexer output drifting from node state past threshold, the field is marked — not the whole response. Show separated_at and sample to your user; do not hide the value.
| Status | Meaning |
|---|---|
| 200 | ok — check per-field stale |
| 401 | missing or revoked key |
| 429 | tier ceiling — Retry-After header in seconds |
| 503 | flow separated — index lag past threshold; see status page |
200 · one field separated
{
"address": "0x5f77…2b90",
"symbol": "SMOKE",
"volume_24h_usd": {
"value": "388000.00",
"stale": true,
"separated_at": "2026-09-05T08:41:12Z",
"sample": "TFT-RC-0412",
"observed_block": 2941871
}
}