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.
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.
Adds holder concentration, clusters, snipers, deployer history, website and "promises vs chain" checks, and the AI verdict.
0–29 low · 30–59 medium · 60–79 caution · 80–100 high. Critical findings force 80+.
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
| Tool | What it does |
|---|---|
check_token | Risk check of one token. token: address or DexScreener link; mode: quick | full. |
compare_tokens | Two tokens side by side; returns which one carries less risk. |
recent_launches | Pons launches of the last 24 hours with scores. limit, max_risk. |
verdict_proof | Recorded verdicts for a token with Merkle proofs against the on-chain roots. |
pricing | What is free and what costs USDG. |
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.
| Endpoint | Description |
|---|---|
GET /check?token=0x…&mode=quick|full | Risk 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=100 | Last 24h of Pons launches, newest first. |
GET /pricing | Current prices and payment details. |
GET /proof · GET /proof/0x… | Verdict ledger, anchoring txs, x402 revenue · verdicts for one token. |
POST /keys | Create an API key (signed-in wallet only). |
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.
Pay per check, in USDG.
| What | Price | Notes |
|---|---|---|
| Quick check | Free | Rate limited. |
| Full check | $0.03 USDG | 5 free a day per caller, then x402. |
| Full check with a $TELL holder key | Free | API key from a wallet holding $TELL. |
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.
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.
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.