Skip to content
POST/v1/tools/{tool}· One tool, its input as JSON

Endpoints and answers

One API: the catalog says what can be asked, a tool answers one question, and a query asks several at once. Every answer says what it charged

Endpoints

GET/v1/catalogEvery daily metric, the sections the token page shows, and every tool with its input and price. No key needed.
Free
POST/v1/tools/{tool}One tool with its JSON input as the body: exactly the data you ask for.
2 credits (token_series: per token; compare_tokens and screen_tokens: by size; the readout 10)
POST/v1/queryMetrics, today, the overview, sections and the readout for up to 5 tokens in one request.
The sum of its parts
GET/v1/accountYour credits balance and the prices.
Free
POST/v1/auth/nonceThe message an agent's wallet signs to get a key, with no person or browser. No key needed.
Free
POST/v1/auth/keyThat signature in, a key out (shown once); a wallet with no account gets one, with no credits. No key needed.
Free
POST/v1/topup/walletOnce per wallet: the agent's wallet signs for the key before any top-up quote may name it.
Free
POST/v1/topup/quoteA top-up your agent pays from its own wallet in USDC, within the key's limits.
The credits it buys
GET/v1/topup/{quote_id}That top-up: pending or credited (also ?tx= by the payment's hash).
Free
GET/v1/tokens/{chain}/{token}/ingestThe ingest quote for a token Blocktronics hasn't indexed.
Free
POST/v1/tokens/{chain}/{token}/ingestBuilds that token from its first transfer.
The quote, once, as the build starts
GET/v1The index: endpoints, chains and prices. No key needed.
Free

The catalog

GET/v1/catalog· Free, no key

Every daily metric with its label, unit and group; the metric groups; the sections the token page shows right now (often none); and every tool with its price and its input as JSON Schema. The list changes as the site does, so read it rather than hard-coding it

200 OK
{
  "what": "Everything the Blocktronics API serves: the same data the site shows, nothing more. …",
  "endpoints": {
    "GET /v1/catalog": "this list (free)",
    "POST /v1/tools/{tool}": "one tool below, its JSON input as the body",
    "…": ""
  },
  "prices": {
    "pull": 2,
    "signals": 1,
    "readout": 10,
    "unit": "credits"
  },
  "metrics": [
    {
      "name": "holders",
      "label": "Wallets holding $5+",
      "unit": "count",
      "group": "holders_all"
    },
    {
      "name": "netflow_usd",
      "label": "DEX netflow (buys − sells)",
      "unit": "usd",
      "group": "netflow"
    },
    "…"
  ],
  "metric_groups": [
    "cohorts",
    "cost_basis",
    "concentration",
    "netflow",
    "volume",
    "profitability",
    "realized_pnl",
    "smart_money",
    "holders_all"
  ],
  "sections": [
    "… only the sections the token page shows now"
  ],
  "tools": [
    {
      "name": "token_series",
      "title": "Token daily series",
      "price": "2 credits per token",
      "description": "…",
      "input": {
        "…": "its JSON Schema"
      }
    },
    "…"
  ]
}
Cut short

The tools

POST /v1/tools/{tool} with the tool's input as the JSON body. Its path takes the tool's name; anything else is 404 unknown_tool.

token_seriesDaily metrics for up to 5 tokens: any of the catalog's metrics or groups, the latest days or a span from one day to another.2 credits per token
token_overviewOne token's grade with its pillar scores, its main figures with their change over the window, today so far and a short reading.2 credits
todayOne token's open UTC day by hour: DEX flow and volume for everyone, beside the smart-money cohort.2 credits
get_sectionsThe engine sections the token page shows for one token. A section the page doesn't show isn't served. The bundles cost what the site's bundle scan costs; an answer without them is a pull.5 credits with a token's launch bundles (section launch_bundles, or all); 2 credits otherwise
compare_tokens2 to 12 tokens side by side, each figure with its percentile among every token Blocktronics covers.2 credits for the first token, 1 for each added one
screen_tokensEvery covered token filtered and ranked by grade, metrics and signals.2 credits per 20 rows returned
search_tokensFind a token by symbol, name or contract address.2 credits
list_ecosystemsThe ecosystems of covered tokens, with their totals and largest tokens.2 credits
pay_attentionTokens where several signals come together now, with what put each one there.2 credits
render_chartOne Blocktronics card as a PNG and an SVG.2 credits; the bundles card 5
render_card_htmlOne Blocktronics card as a self-contained HTML snippet.2 credits; the bundles card 5
token_signalsThe signals: the Blocktronics read, whether it leans bullish, bearish or balanced, and every fired signal with its finding. With readout: true, the full readout too (each signal's proof and weighing), at the site's price; it then stays open 24 hours, here and on the site, and its signals come with it.1 credit; with readout: true, 10 credits, then open 24 hours
explain_metricWhat a metric means and how it is measured.Free
credit_costsEvery price, in credits.Free
get_accountYour account and its balance.Free

A tool's answer

Every tool answers { tool, ok, charged, data, text, images }. This is token_series for one token

200 OK
{
  "tool": "token_series",
  "ok": true,
  "charged": 2,
  "data": {
    "token": {
      "symbol": "DEGEN",
      "name": "Degen",
      "chain": "base",
      "chain_label": "Base",
      "address": "0x4ed4e862860bed51a9570b96d89af5e1b0efefed",
      "terminal_url": "https://blocktronics.xyz/t/base/0x4ed4…"
    },
    "metrics": [
      "holders",
      "netflow_usd"
    ],
    "days": 30,
    "from": "2026-09-26",
    "to": "2026-10-25",
    "format": "columns",
    "summary": {
      "holders": {
        "label": "Wallets holding $5+",
        "unit": "count",
        "first": 4102,
        "last": 4041,
        "change": -61,
        "change_pct": -1.5,
        "min": 4012,
        "max": 4130,
        "null_days": 0
      },
      "netflow_usd": {
        "label": "DEX netflow (buys − sells)",
        "unit": "usd",
        "first": -1820,
        "last": 2251,
        "change": 4071,
        "change_pct": null,
        "min": -9120,
        "max": 15400,
        "total": 18250,
        "null_days": 1
      }
    },
    "unavailable": {},
    "data": {
      "day": [
        "2026-09-26",
        "…",
        "2026-10-25"
      ],
      "holders": [
        4102,
        "…",
        4041
      ],
      "netflow_usd": [
        -1820,
        "…",
        2251
      ]
    },
    "truncated": null,
    "data_freshness": "cached, settled through 2026-10-25",
    "reads": {
      "charged": 2,
      "refreshing": true,
      "…": ""
    }
  },
  "text": "DEGEN · Base · 30 days 2026-09-26 → 2026-10-25 (UTC) · columns\n- holders: 4,102 → 4,041 (-1.5%), range 4,012–4,130\n- netflow_usd: -$1.8k → +$2.3k, range -$9.1k–+$15.4k, total +$18.3k, 1 null days\nThis pull used 2 credits. Blocktronics is bringing this token up to the hour now; a pull in a few minutes has the newest hours.",
  "images": []
}
Example values, cut short
tool · ok
The tool that answered, and true when it did.
charged
Credits this answer took: 2 a pull (token_series: per token), the readout's 10 when it opened it, 0 for the free tools and on every refusal.
data
The tool's answer as JSON: the same structured answer the MCP gives an AI app.
text
The same answer in plain words, for people and models. A pull's text ends with what it used and, when the token is being brought up to the hour, says so.
images
render_chart's picture, base64, with its mime_type. Empty for every other tool.
data.token
The token that answered: symbol, name, chain, address and its page on the site. A token on several chains is one token, read as one.
data.data_freshness
The last settled UTC day the answer covers.
data.reads.refreshing
true when the token's stored data was over 15 minutes old and its refresh started behind this answer: a pull in a few minutes has the newest hours.

token_series' data

Pick metrics by name or by group from the catalog. token takes one token or a list of up to 5, each a symbol, chain:SYMBOL, an address or chain:0x….

metrics
The metrics answered, with any group you asked for expanded into its metrics.
days · from · to
How many days came back and the first and last of them (UTC). A young token has fewer: count them.
summary.<metric>
first, last, change, change_pct, min, max, total (dollar flows) and null_days over the days returned.
data
format "columns" (the default): { day: [...], <metric>: [...] }, one value per day. format "rows": [{ day, <metric>... }]. A missing day is null, never 0.
unavailable
Panels that couldn't be read for this token, each with the reason. Their metrics are null.
outliers
Days the outlier guard left out, with why. They are never counted and never returned as values.
truncated
Set when a rows answer was too large and kept only the latest days, with how many and a note. null otherwise.
tokens
Instead of the above, when token is a list: one answer like it per token, 2 credits each.

The answer, drawn

Holders, netflow and the grade, for a real token

Active holders

Merged across Base and Robinhood: one wallet on several chains is one holder.
3,904+4.8% in 59d
Live: DEGEN on Base, from Blocktronics' stored rows
token_series · holders_all (holders, holders_ge_100 … holders_ge_100k)
{
  "metrics": [
    "holders",
    "holders_ge_100",
    "holders_ge_1k",
    "holders_ge_10k",
    "holders_ge_100k"
  ],
  "days": 2,
  "from": "2026-10-24",
  "to": "2026-10-25",
  "format": "columns",
  "summary": {
    "…": "first, last, change, min, max, total and null days for each metric"
  },
  "unavailable": {},
  "data": {
    "day": [
      "2026-10-24",
      "2026-10-25"
    ],
    "holders": [
      4052,
      4041
    ],
    "holders_ge_100": [
      1318,
      1320
    ],
    "holders_ge_1k": [
      409,
      410
    ],
    "holders_ge_10k": [
      95,
      95
    ],
    "holders_ge_100k": [
      26,
      26
    ]
  }
}
Example shape of this part of the tool's answer

The query

POST/v1/query· The sum of what it runs

Up to 5 tokens in one request, run as the tools above and priced as their sum. The balance must cover every pull before anything runs; if it can't, the answer is 402 insufficient and nothing is charged

tokensstring[]required
1 to 5 tokens, each a symbol, "chain:SYMBOL", an address or "chain:0x…".e.g. ["base:DEGEN", "base:AERO"]
chainstringoptional
The chain, for tokens given without one.baseethereumrobinhood
metricsstring[]optional
Daily metrics or groups from GET /v1/catalog. 2 credits per token.e.g. ["holders", "netflow_usd"]
daysintegeroptional
The most recent days, 1 to 60. Ignored when from or to is given.e.g. 30
from · tostringoptional
A span of days (YYYY-MM-DD, UTC) inside the stored days. Days outside them are left out, with a note; nothing is filled in.
todaybooleanoptional
Each token's hours so far today. 2 credits per token.
overviewbooleanoptional
Each token's grade, main figures and reading. 2 credits per token.
sectionsbooleanoptional
The sections each token's page shows. 5 credits per token with its launch bundles, 2 without them.
signalsbooleanoptional
Each token's read, lean and fired signals. 1 credit per token.
readoutbooleanoptional
Each token's full readout, signals included, at the site's price: 10 credits, then open 24 hours.
200 OK
{
  "tokens": [
    {
      "query": "base:DEGEN",
      "token": {
        "symbol": "DEGEN",
        "chain": "base",
        "address": "0x4ed4e862860bed51a9570b96d89af5e1b0efefed",
        "…": ""
      },
      "series": {
        "metrics": [
          "holders",
          "netflow_usd"
        ],
        "days": 14,
        "summary": {
          "…": ""
        },
        "data": {
          "…": ""
        }
      },
      "today": {
        "day": "2026-10-26",
        "partial": true,
        "everyone": {
          "net_flow_usd": 412,
          "volume_usd": 5828,
          "…": ""
        },
        "hours": [
          "…"
        ]
      }
    },
    {
      "query": "base:AERO",
      "token": {
        "symbol": "AERO",
        "chain": "base",
        "address": "0x9401…",
        "…": ""
      },
      "series": {
        "…": ""
      },
      "today": {
        "…": ""
      }
    }
  ],
  "charged": 8
}
Example values, cut short
tokens[]
One entry per token asked, in the order asked.
tokens[].query · token
What you asked for, and the token it resolved to.
tokens[].series
token_series' answer for that token, when you asked for metrics.
tokens[].today · overview · sections · readout
The today, token_overview, get_sections and token_signals answers, when you asked for them.
tokens[].errors
A part that failed, by name, with why. A part that failed isn't charged.
charged
What the whole request took.

Every part

What each figure means, and the tool that serves it

Structure gradetoken_overview · gradeLiquidity depthtoken_overview · grade.depthToday so far, hourlytoday · hours, everyone, smart_moneyCost basis seriestoken_series · holder_value_usd, cost_basis_usd, mvrvConcentrationtoken_series · top10_pct, top50_pct, top100_pctSupply profitability ratiotoken_series · supply_in_profit_pct, wallets_in_profit_pct, wallets_in_profit, wallets_in_lossDaily realized PnLtoken_series · realized_profit_usd, realized_loss_usd, realized_net_usd, sellersSmart money detailtoken_series · smart_money (smart_netflow_usd, smart_netflow_cum_usd, smart_dex_buy_usd, smart_dex_sell_usd, smart_wallets, smart_holdings_usd, smart_dex_net_usd, smart_buyers, smart_sellers, smart_requalification_usd)Tier distributionget_sections · sections.holder_tiersServed only while the token page shows itRetention and churnget_sections · sections.retentionServed only while the token page shows itProfit and lossget_sections · sections.pnl_snapshotServed only while the token page shows itTop walletsget_sections · sections.top_walletsServed only while the token page shows itLaunch forensicsget_sections · sections.launch_bundlesServed only while the token page shows itCEX flow by exchangeget_sections · sections.cex_flowServed only while the token page shows itDEX venue splitget_sections · sections.dex_venuesServed only while the token page shows itMarket cap historyget_sections · sections.market_capServed only while the token page shows itSignal readoutget_sections · sections.signal_readoutServed only while the token page shows itPredictive scoringget_sections · sections.predictive_scoringServed only while the token page shows itPeriod progressionget_sections · sections.period_progressionServed only while the token page shows itWhale flowget_sections · sections.whale_flowServed only while the token page shows itLarge movesget_sections · sections.large_movesServed only while the token page shows itOutlookNot served

Other answers

400 tool_error when a tool can't answer the input (a token Blocktronics hasn't indexed, for one), 402 insufficient or refused when the balance can't cover it, and 422 unsupported_token for a token Blocktronics doesn't support. None is charged. Every code is in errors; ingesting a new token is in freshness and new tokens.

Next