Checks an autonomous agent runs before it moves money or trusts a counterparty — token safety, wallet profiling, settlement verification, identifier validation. Every answer arrives with its evidence: what was checked, when, how the answer was produced, and what it does not mean. Billing is per call in USDC — no keys, no accounts, no humans in the loop.
Every endpoint answers unpaid requests with a 402 quote. Agents pay per call and get JSON back. Verdicts come stamped HOLD CAUTION AVOID — each one carrying an _evidence object with the checks performed, data sources, freshness, confidence and limitations. Read the full methodology before you pay for anything.
| ENDPOINT | WHAT YOU GET | PRICE |
|---|---|---|
| GET /v1/token/verdict/{addr} | Token safety verdict on Base — bytecode risk capabilities (mint, pause, blacklist, proxy), ownership status, ERC-20 metadata, 0–100 score. | $0.01 |
| GET /v1/wallet/dossier/{addr} | Wallet profile — EOA/contract, balance, activity band, behavioural flags, as-of block. | $0.01 |
| GET /v1/data/gas | Live Base gas oracle — base fee, priority fees, congestion level, estimated transfer cost. What agents check before transacting. | $0.002 |
| GET /v1/data/activity/{token} | Recent transfer count, volume, and unique wallet activity for a token on Base — a real on-chain liquidity/interest signal. | $0.005 |
| GET /v1/data/supply/{token} | Total, circulating and burned supply with burn percentage — computed live from the chain. | $0.003 |
| GET /v1/data/portfolio/{address} | ETH + canonical token balances (USDC, WETH, cbBTC, EURC) in one call. | $0.004 |
| GET /v1/data/block | Latest Base block: number, timestamp, tx count, gas utilization. | $0.001 |
| GET /v1/security/email/{domain} | Email-spoofing posture: live SPF / DMARC / DKIM record check. Is this counterparty's domain protected against impersonation? | $0.01 |
| GET /v1/security/tls/{domain} | Live TLS certificate check — validity, issuer, expiry countdown. Catch expired or misissued certs before trusting an endpoint. | $0.01 |
| GET /v1/security/typosquat/{domain} | Brand look-alike / homoglyph structural analysis — flags c0inbase, b1nance, metamask-support and similar phishing patterns. | $0.005 |
| GET /v1/verify/payment/{txhash} | On-chain settlement verification on Base — decoded ERC-20 transfers, amounts, counterparties, confirmations. | $0.02 |
| GET /v1/verify/token/{addr|symbol} | Canonical token check on Base (USDC, EURC, WETH, cbBTC, USDT) — anti-phishing for stablecoin payments. | $0.005 |
| GET /v1/validate/lei/{lei} | ISO 17442 LEI checksum validation — entity identifiers used in EMIR/MiFID reporting. | $0.002 |
| GET /v1/validate/isin/{isin} | ISO 6166 ISIN checksum validation for securities identifiers. | $0.001 |
| GET /v1/validate/iban/{iban} | IBAN mod-97 checksum + per-country length rules, normalized BBAN. | $0.001 |
| GET /v1/validate/vat/{vat} | EU VAT format for 27 registries + deterministic checksums (DE, IT, LU, PL, SI). | $0.001 |
| GET /v1/validate/bic/{bic} | BIC/SWIFT structure check, decomposed bank / country / location / branch. | $0.001 |
| POST /v1/doc/html-to-markdown | Clean Markdown from raw HTML. | $0.002 |
| POST /v1/batch/validate | Validate up to 500 IBAN/VAT/BIC/LEI/ISIN identifiers in one call. One payment instead of 500, for reconciliation and onboarding runs. | $0.10 |
| POST /v1/doc/diff | Structured diff — lines, words, or chars — with change hunks. | $0.002 |
A verdict that sounds certain is dangerous without its limits attached, and a stale "clean" result is worse than no result at all. So the evidence is part of the response — inside the signature, so it can't be stripped or edited in transit.
{
"verdict": "caution",
"_evidence": {
"checksPerformed": ["Ownership and mint authority", "Proxy upgradeability",
"Holder concentration", "Transfer-restriction patterns"],
"dataSources": [{ "name": "Base mainnet RPC", "refresh": "per-request" }],
"freshness": { "basis": "live-chain", "maxUsefulAgeSeconds": 60,
"staleDataRisk": "A proxy can change its implementation
after this check was performed." },
"assurance": { "level": "heuristic", "basis": "static analysis of contract
state and holder distribution" },
"semantics": { "assuranceIsNotAProbability": "...NOT a calibrated probability...",
"signatureProvesIntegrityNotTruth": "...integrity is not truth..." },
"humanApprovalRecommended": "unless_verdict_is_hold",
"limitations": [
"'caution' means a configured signal fired. It is NOT a finding of fraud,
and 'hold' is NOT an endorsement or a recommendation to transact.",
"Heuristic static analysis, not a security audit. A proxy contract can
change its implementation after this check.",
"Informational risk signal only; not regulated financial, legal or
compliance advice."
]
}
}
Deliberately not a score. Assurance is an ordinal label — deterministic, observed, exact-list-match, structural, heuristic — describing how the answer was produced. It is not a number, because a number would imply a calibration ChainVerdict has not performed. An IBAN checksum is deterministic because the arithmetic is certain; that still proves nothing about whether the account exists.
And a signature proves integrity, not truth. It shows this response came from ChainVerdict unaltered. A signed wrong answer is still wrong — and still signed. Both statements ship on every response and are documented at /v1/methodology, free to read so a buyer can audit how a verdict is produced before paying for one.
Any x402 client works. With x402-fetch and a funded Base wallet:
import { wrapFetchWithPayment } from "x402-fetch"; const payFetch = wrapFetchWithPayment(fetch, account); const res = await payFetch( "https://chainverdict.xyz/v1/token/verdict/0x4200000000000000000000000000000000000006" ); console.log(await res.json()); // → verdict, score, reasons
ChainVerdict is one of three. All are payable per call over x402 with no account, all sign their responses, and all publish what their answers do not establish. Machine-readable manifest ↗
| Service | What it answers | From |
|---|---|---|
| ChainVerdict chainverdict.xyz |
Checks before money moves: token safety, wallet profiling, settlement verification, identifier and domain posture. | $0.001 |
| TradeRails trade.chainverdict.xyz ↗ |
Trade and logistics identifiers: GTIN/GS1, SSCC-18, ISO 6346 containers, IMO numbers, HS-code triage. The check digits are trivial arithmetic and priced at the floor — they exist as preflight steps in trade flows, not as products. | $0.004 |
| x402pulse pulse.chainverdict.xyz ↗ |
Independent observation of third-party x402 endpoints — quality, uptime, price drift — and the anchored historical archive of all of it. | $0.03 |
| ENDPOINT | WHAT YOU GET | PRICE |
|---|---|---|
| GET /v1/gtin/validate?code= | GTIN-8/12/13/14 structure and check digit, with the normalised GTIN-14. | $0.004 |
| GET /v1/gtin/checkdigit?body= | Computes the missing GS1 mod-10 check digit for a partial code. | $0.004 |
| GET /v1/gtin/prefix?code= | GS1 prefix lookup — issuing member organisation for a barcode. | $0.004 |
| GET /v1/sscc/validate?code= | SSCC-18 logistics unit serial code validation. | $0.004 |
| GET /v1/container/validate?code= | ISO 6346 shipping container number, owner code and check digit. | $0.004 |
| GET /v1/imo/validate?code= | IMO vessel number checksum (ISO/IMO seven-digit scheme). | $0.004 |
| GET /v1/gs1/decode?data= | Parses a GS1 element string into its Application Identifiers. | $0.006 |
| POST /v1/gs1/decode | Same decoder for payloads too long for a query string. | $0.006 |
| GET /v1/hs/classify?q= | HS-code triage from a goods description — candidate headings with the reasoning, as a starting point for a customs broker, not a classification ruling. | $0.05 |
| ENDPOINT | WHAT YOU GET | PRICE |
|---|---|---|
| GET /v1/verdict?url= | Measured quality verdict on a third-party x402 endpoint — uptime, latency, 402 correctness, price stability, from the observation record. | $0.03 |
| GET /v1/rankings | Cross-endpoint ranking of every observed x402 service by measured quality. | $0.07 |
| GET /v1/attest?url= | Ed25519-signed attestation of an endpoint’s observed record, for a third party to cite. | $0.12 |
| GET /v1/feed | The current observation feed — every endpoint, latest probe, in one call. | $0.15 |
| GET /v1/archive/full | The complete anchored archive since 7 August 2026, with the daily Merkle roots and their OpenTimestamps proofs. | $0.50 |
| GET /v1/status /v1/value /v1/feed/sample /v1/methodology /v1/datasets/manifest /v1/archive/anchors | Free. Enough to check what is being observed, how, and whether the archive is what it claims — before paying for anything. | free |
33 paid endpoints across the three services (34 counting /v1/gs1/decode twice, once per method). Every one of them is published in the Coinbase x402 Bazaar discovery catalogue, and every price on this page is the price the live 402 quote returns — a test fails the build if those two ever disagree.
x402pulse has been probing third-party endpoints every ten minutes since 7 August 2026. Each day is reduced to a Merkle root, chained to the previous day, and timestamped into Bitcoin via OpenTimestamps.
Anyone can rebuild this software and start observing tomorrow. Nobody can produce a timestamp dated earlier than they created it. That is the difference between an archive and a claim — and it means the observation record can be checked without trusting the operator.
Paste any signed response into the verifier ↗. It checks the Ed25519 signature in your own browser against the published key and renders the evidence record. Nothing is sent anywhere — a verification tool you have to trust the server for is not a verification tool.
A valid signature proves a response came from the service unaltered. It does not prove the answer is correct. A signed wrong answer is still wrong, and still signed. That sentence ships inside every response and is meant literally.