Token Verdict is built for AI agents, so its “interface” is a conversation between machines. Here is that conversation, translated — the steps an agent runs, with the real data at each step.
The scenario: an autonomous trading agent is about to buy the token at
0x2821d96B5FC81aEC3763340b375a846a89A3Ec1b on Base. Before it
spends anything, it asks Token Verdict first.
The agent finds the service with no human involved: a machine-readable
manifest at /.well-known/x402,
documentation written for agents at /skill.md,
a public price quote at /quote — and a
listing on Coinbase's Agent Bazaar (resource 21729).
curl -X POST https://token-verdict-production.up.railway.app/v1/verdict \
-H 'content-type: application/json' \
-d '{"address":"0x2821d96B5FC81aEC3763340b375a846a89A3Ec1b","chain":"base"}'
No account, no API key, no dashboard. The call is a token address and a chain — nothing else.
Unpaid, the service answers HTTP 402 Payment Required,
with the challenge carried in the payment-required response
header. Decoded, it is the price tag and the payment instructions in one
object — this is the real challenge this service returns:
{
"x402Version": 2,
"error": "Payment required",
"resource": {
"url": "https://token-verdict-production.up.railway.app/v1/verdict",
"description": "Send a token contract address, get a risk verdict. Returns SOLID / CAUTION / DANGER with a 0-100 score, six weighted market-structure signals (liquidity depth, volume churn, sell pressure, price action, trader breadth, pair age) and a written analyst take. Built for AI agents screening tokens before touching them. Use this when an agent is about to buy, swap, or route funds into a token and needs a fast risk screen first.",
"mimeType": "application/json",
"serviceName": "token-verdict",
"tags": [
"tokens",
"defi",
"risk",
"research",
"agents"
]
},
"accepts": [
{
"scheme": "exact",
"network": "eip155:8453",
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"amount": "20000",
"payTo": "0x097f9685D1e0752bF8B02d61E5Ce9be7eA0FBA7F",
"maxTimeoutSeconds": 300,
"extra": {
"name": "USD Coin",
"version": "2"
}
}
],
"extensions": {
"bazaar": {
"info": {
"input": {
"type": "http",
"method": "POST",
"bodyType": "json",
"body": {
"address": "0x2821d96B5FC81aEC3763340b375a846a89A3Ec1b",
"chain": "base"
}
},
"output": {
"type": "json",
"example": "\u2026 (elided \u2014 see step 4: this page publishes only real captured verdicts)",
"schema": {
"type": "object",
"required": [
"token",
"verdict",
"score",
"signals",
"take",
"market"
],
"properties": {
"token": {
"type": "object",
"required": [
"address",
"symbol",
"name",
"chain"
],
"properties": {
"address": {
"type": "string"
},
"symbol": {
"type": "string"
},
"name": {
"type": "string"
},
"chain": {
"type": "string"
}
}
},
"verdict": {
"type": "string",
"enum": [
"SOLID",
"CAUTION",
"DANGER"
]
},
"score": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Risk score: 0 (safest) to 100 (riskiest)"
},
"signals": {
"type": "array",
"minItems": 6,
"maxItems": 6,
"items": {
"type": "object",
"required": [
"name",
"score",
"weight",
"detail"
],
"properties": {
"name": {
"type": "string"
},
"score": {
"type": "integer",
"minimum": 0,
"maximum": 100
},
"weight": {
"type": "number"
},
"detail": {
"type": "string"
}
}
}
},
"take": {
"type": "string",
"description": "Written analyst summary"
},
"market": {
"type": "object",
"required": [
"price_usd",
"liquidity_usd",
"volume_24h_usd",
"price_change_24h_pct",
"txns_24h",
"dex",
"pair_url"
],
"properties": {
"price_usd": {
"type": [
"string",
"null"
]
},
"liquidity_usd": {
"type": [
"number",
"null"
]
},
"volume_24h_usd": {
"type": [
"number",
"null"
]
},
"price_change_24h_pct": {
"type": [
"number",
"null"
]
},
"txns_24h": {
"type": "object",
"properties": {
"buys": {
"type": "integer"
},
"sells": {
"type": "integer"
}
}
},
"dex": {
"type": [
"string",
"null"
]
},
"pair_url": {
"type": [
"string",
"null"
]
}
}
}
}
}
}
},
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"input": {
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "http"
},
"method": {
"type": "string",
"enum": [
"POST",
"PUT",
"PATCH"
]
},
"bodyType": {
"type": "string",
"enum": [
"json",
"form-data",
"text"
]
},
"body": {
"type": "object",
"required": [
"address"
],
"properties": {
"address": {
"type": "string",
"description": "Token contract address (0x...)"
},
"chain": {
"type": "string",
"enum": [
"base",
"ethereum",
"solana"
],
"default": "base",
"description": "Chain label: base | ethereum | solana"
}
}
}
},
"required": [
"type",
"method",
"bodyType",
"body"
],
"additionalProperties": false
},
"output": {
"type": "object",
"properties": {
"type": {
"type": "string"
},
"example": {
"type": "object",
"required": [
"token",
"verdict",
"score",
"signals",
"take",
"market"
],
"properties": {
"token": {
"type": "object",
"required": [
"address",
"symbol",
"name",
"chain"
],
"properties": {
"address": {
"type": "string"
},
"symbol": {
"type": "string"
},
"name": {
"type": "string"
},
"chain": {
"type": "string"
}
}
},
"verdict": {
"type": "string",
"enum": [
"SOLID",
"CAUTION",
"DANGER"
]
},
"score": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Risk score: 0 (safest) to 100 (riskiest)"
},
"signals": {
"type": "array",
"minItems": 6,
"maxItems": 6,
"items": {
"type": "object",
"required": [
"name",
"score",
"weight",
"detail"
],
"properties": {
"name": {
"type": "string"
},
"score": {
"type": "integer",
"minimum": 0,
"maximum": 100
},
"weight": {
"type": "number"
},
"detail": {
"type": "string"
}
}
}
},
"take": {
"type": "string",
"description": "Written analyst summary"
},
"market": {
"type": "object",
"required": [
"price_usd",
"liquidity_usd",
"volume_24h_usd",
"price_change_24h_pct",
"txns_24h",
"dex",
"pair_url"
],
"properties": {
"price_usd": {
"type": [
"string",
"null"
]
},
"liquidity_usd": {
"type": [
"number",
"null"
]
},
"volume_24h_usd": {
"type": [
"number",
"null"
]
},
"price_change_24h_pct": {
"type": [
"number",
"null"
]
},
"txns_24h": {
"type": "object",
"properties": {
"buys": {
"type": "integer"
},
"sells": {
"type": "integer"
}
}
},
"dex": {
"type": [
"string",
"null"
]
},
"pair_url": {
"type": [
"string",
"null"
]
}
}
}
}
},
"schema": {
"type": "object"
}
},
"required": [
"type"
]
}
},
"required": [
"input"
]
}
}
}
}
Read it as: pay $0.02 — 20,000 micro-units of USDC (the
asset contract above) — on Base (eip155:8453),
to the payTo wallet in the object, within 300 seconds. One
disclosed edit: the Bazaar extension's sample output is elided —
see step 4 for why.
Any x402 v2 client reads the challenge, signs an “exact”-scheme payment authorization from the agent's own wallet, and a facilitator settles it on Base. The agent then retries the identical POST with the payment proof attached. There is no login before or after: the payment is the authentication, and the settlement receipt travels back with the response.
When the payment settles, the retried call returns JSON with:
verdict — SOLID, CAUTION, or DANGERscore — risk score, 0 (safest) to 100 (riskiest)signals — the six market-structure signals (liquidity
depth, volume churn, sell pressure, price action, trader breadth,
pair age), each with its own score, weight, and a plain-English
detail linetake — a short written analyst summarymarket — the raw market data the verdict was derived
from, so any caller can re-check the mathEvery step above this one is live and free right now — the manifest, the quote, and the 402 challenge. Only the verdict itself is paywalled, at $0.02.
← Token Verdict home · Source: github.com/QuincyGB/token-verdict