API · MCP · x402

Let your agent read the tell.

One call before every buy. Tell checks a Robinhood Chain token's contract, holders, deployer, website claims and market, and answers with a 0–100 risk score your agent can act on.

01 / Quick start

Thirty seconds to first check.

curl "https://tell.markets/api/v1/check?token=0x45C83b37C5BAF4dad26f3845C28295e2DE010962"

No key, no sign-up. mode=quick is the default and is free. Ask for mode=full when your agent is about to commit money.

QuickFree · ~3s

Contract powers (mint, blacklist, pause, proxy, owner) and market (liquidity, pool age, sell pressure). From the last full report if it is under an hour old.

Full~30s · $0.03

Adds holder concentration, clusters, snipers, deployer history, website and "promises vs chain" checks, and the AI verdict.

Scores0–100

0–29 low · 30–59 medium · 60–79 caution · 80–100 high. Critical findings force 80+.

02 / MCP

Plug Tell into any agent.

Remote MCP server over Streamable HTTP at https://tell.markets/mcp. Stateless, no session needed.

Claude Code

claude mcp add --transport http tell https://tell.markets/mcp

Claude Desktop, Cursor and other clients

{
  "mcpServers": {
    "tell": { "type": "http", "url": "https://tell.markets/mcp" }
  }
}

With an API key (free full checks for $TELL holders), add a header:

"tell": { "type": "http", "url": "https://tell.markets/mcp",
          "headers": { "Authorization": "Bearer tell_…" } }

Tools

ToolWhat it does
check_tokenRisk check of one token. token: address or DexScreener link; mode: quick | full.
compare_tokensTwo tokens side by side; returns which one carries less risk.
recent_launchesPons launches of the last 24 hours with scores. limit, max_risk.
verdict_proofRecorded verdicts for a token with Merkle proofs against the on-chain roots.
pricingWhat is free and what costs USDG.
03 / REST

Plain HTTP.

Base URL https://tell.markets/api/v1. JSON out, CORS open, 60 requests a minute per caller. Machine-readable spec: /api/v1/openapi.json.

EndpointDescription
GET /check?token=0x…&mode=quick|fullRisk check. Full mode may answer 402 (see x402).
GET /compare?a=0x…&b=0x…Two quick checks and which is lower risk.
GET /launches?limit=50&maxRisk=100Last 24h of Pons launches, newest first.
GET /pricingCurrent prices and payment details.
GET /proof · GET /proof/0x…Verdict ledger, anchoring txs, x402 revenue · verdicts for one token.
POST /keysCreate an API key (signed-in wallet only).
04 / Response

What your agent gets back.

{
  "token":   { "address": "0x45C8…0962", "name": "RobinHood", "symbol": "HOOD", "chainId": 4663 },
  "risk":    { "score": 40, "label": "Medium risk", "level": "medium" },
  "verdict": "No site to inspect, so the token rests on on-chain data alone. The deployer sold their entire 11.82% bag…",
  "critical": [],
  "flags":   [ { "group": "deployer", "severity": "warn", "title": "Deployer sold their whole bag", "risk": 10 } ],
  "passed":  [ { "group": "contract", "title": "No owner" } ],
  "market":  { "liquidityUsd": null, "marketCapUsd": null, … },
  "mode": "full", "complete": true,
  "checkedAt": "2026-11-10T12:00:00.000Z", "ageSeconds": 42,
  "links": { "report": "https://tell.markets/t/0x…", "map": "https://tell.markets/app/0x…" }
}

A sane default rule

if (r.critical.length || r.risk.score >= 80) skip();      // never buy
else if (r.risk.score >= 60 || !r.complete) askHuman();  // look closer
else proceed();

Tell states facts and a score. It can be wrong and it is not financial advice; your agent decides.

05 / Pricing

Pay per check, in USDG.

WhatPriceNotes
Quick checkFreeRate limited.
Full check$0.03 USDG5 free a day per caller, then x402.
Full check with a $TELL holder keyFreeAPI key from a wallet holding $TELL.
06 / x402

No account. Just pay.

Full checks past the free allowance answer 402 Payment Required with x402 requirements: scheme exact, network eip155:4663, asset USDG 0x5fc5…d168 (6 decimals). Your agent signs an EIP-3009 TransferWithAuthorization and retries with the X-PAYMENT header. Tell verifies it, runs the check, submits the transfer on-chain (Tell pays the gas) and returns the result with X-PAYMENT-RESPONSE holding the tx hash. If the check fails, nothing is charged.

import { privateKeyToAccount } from 'viem/accounts';
const account = privateKeyToAccount(process.env.AGENT_KEY);  // holds USDG, needs no ETH
const url = 'https://tell.markets/api/v1/check?token=0x…&mode=full';

let res = await fetch(url);
if (res.status === 402) {
  const { accepts: [req] } = await res.json();
  const auth = {
    from: account.address, to: req.payTo, value: req.maxAmountRequired,
    validAfter: '0', validBefore: String(Math.floor(Date.now() / 1000) + 120),
    nonce: '0x' + [...crypto.getRandomValues(new Uint8Array(32))].map(b => b.toString(16).padStart(2, '0')).join(''),
  };
  const signature = await account.signTypedData({
    domain: { name: req.extra.name, version: req.extra.version, chainId: 4663, verifyingContract: req.asset },
    types: { TransferWithAuthorization: [
      { name: 'from', type: 'address' }, { name: 'to', type: 'address' }, { name: 'value', type: 'uint256' },
      { name: 'validAfter', type: 'uint256' }, { name: 'validBefore', type: 'uint256' }, { name: 'nonce', type: 'bytes32' } ] },
    primaryType: 'TransferWithAuthorization',
    message: { ...auth, value: BigInt(auth.value), validAfter: 0n, validBefore: BigInt(auth.validBefore) },
  });
  const payment = btoa(JSON.stringify({ x402Version: 1, scheme: 'exact', network: req.network, payload: { signature, authorization: auth } }));
  res = await fetch(url, { headers: { 'X-PAYMENT': payment } });
}
const report = await res.json();

Any x402 client library that supports EVM exact works the same way.

07 / API keys

Hold $TELL, check for free.

Sign in with your wallet (top right), create a key and send it as Authorization: Bearer tell_… to the API or MCP. While the wallet holds enough $TELL, full checks through the key are free. Keys are optional: without one, the free allowance and x402 apply.


      
08 / Proof

Scores you can verify.

Every finished check becomes a leaf keccak256(abi.encode(token, score, keccak(verdict), keccak(checks), checkedAtMs)). Each hour the leaves are folded into a Merkle root (pairs hashed sorted) and the root is written to Robinhood Chain as the data of a transaction: 0x54454c4c ("TELL") followed by the root. /api/v1/proof/0x… returns each verdict with its proof. Ledger, roots, payments and burns: tell.markets/proof.