Tuft — API docs
API v1
SCHEMA 2026-09-01
BASE {{ baseHost }}
CHAIN ID 4663
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 }}
ParameterTypeNotes
{{ 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.

StatusMeaning
200ok — check per-field stale
401missing or revoked key
429tier ceiling — Retry-After header in seconds
503flow 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
  }
}