Check an x402 seller's trust evidence
GET /api/x402/seller-trustTrust evidence for any x402 seller origin: is it indexed, does its manifest parse, how many tools does it publish, which chains does it actually advertise, how many settled calls has it been observed receiving on-chain, and would our own Smart Order Router spend buyer money on it, in either of its two lanes: as a proven seller, or through the Base unproven lane (a seller below the settlement floor, tried after every proven candidate under a small per-call ceiling, paid only at the wallet its own live 402 names and flagged unproven on the receipt). routableByOurRouter is true when either lane can pay; routableAsProven is true when some route-execute tier pays it as a proven seller. Send GET /api/x402/seller-trust with the required field origin and pay $0.005 per call over x402 or MPP, or call it free by solving a proof-of-work challenge. It returns a JSON object with origin, listed, displayName, manifestParsed, crawlError and 17 more.
Each lane names the route-execute tiers whose underlying cap covers its routes (lanes.proven.tiers, cheapestTier), with its blockers, so a refusal is explainable. Never fetches the seller at call time - this is our accumulated crawl and settlement evidence, not a liveness probe.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
origin | string | yes | Seller origin or bare host, e.g. https://example.com or example.com |
Example request
curl -i "https://agent402.tools/api/x402/seller-trust?origin=agent402.tools"
Without payment this returns HTTP 402 Payment Required with the exact price for seller-trust; any x402 v2 or MPP client pays it and retries.
Example response
{
"origin": "https://seller.example",
"listed": true,
"displayName": "Example Seller",
"manifestParsed": true,
"crawlError": null,
"healthScore": 1,
"paywall": {
"ok": true,
"status": 402,
"url": "https://seller.example/api/x",
"at": 1789000000000
},
"lastCrawledAt": "2026-10-16T00:00:00.000Z",
"toolCount": 2,
"paidToolCount": 2,
"priceRangeUsd": {
"min": 0.005,
"max": 0.02
},
"advertisedNetworks": [
"eip155:8453"
],
"settledCallsObserved": 3,
"routerGate": {
"settledCalls": 3,
"settlementThreshold": 50,
"meetsSettlementThreshold": false,
"advertisesSettlementNetwork": true,
"cheapestPaidToolUsd": 0.005,
"routerUnderlyingCapUsd": 0.005,
"hasToolWithinRouterCap": true
},
"lanes": {
"proven": {
"eligible": false,
"chain": "base",
"toolCount": 0,
"cheapestUsd": null,
"cheapestTier": null,
"tiers": [],
"blockers": [
"fewer than 50 settled calls observed on-chain"
]
},
"unproven": {
"eligible": true,
"chain": "base",
"maxUsd": 0.01,
"toolCount": 1,
"cheapestUsd": 0.005,
"cheapestTier": "route-execute",
"note": "On Base the router may still pay the seller, but only after every proven seller for the task, only at the wallet its own live 402 names, never above that ceiling, and flagged unproven on the buyer's receipt ($0.01 per call)."
}
},
"routableByOurRouter": true,
"routableAsProven": false,
"routableVia": "unproven",
"blockers": [],
"provenBlockers": [
"fewer than 50 settled calls observed on-chain"
],
"caveats": [
"settledCallsObserved counts on-chain payments we have observed to this seller's payTo; it is a floor, not a total"
],
"evidenceSource": "x402 seller crawl + on-chain settlement counts + the router's per-route dispatch verdicts"
}
| Field | Type | Always present | In the example |
|---|---|---|---|
origin | string | no | https://seller.example |
listed | boolean | no | true |
displayName | string | no | Example Seller |
manifestParsed | boolean | no | true |
crawlError | null | no | null |
healthScore | number | no | 1 |
paywall | object | no | 4 fields: ok, status, url, at |
lastCrawledAt | string | no | 2026-10-16T00:00:00.000Z |
toolCount | number | no | 2 |
paidToolCount | number | no | 2 |
priceRangeUsd | object | no | 2 fields: min, max |
advertisedNetworks | array of string | no | 1 item in the example |
settledCallsObserved | number | no | 3 |
routerGate | object | no | 7 fields: settledCalls, settlementThreshold, meetsSettlementThreshold, advert... |
lanes | object | no | 2 fields: proven, unproven |
routableByOurRouter | boolean | no | true |
routableAsProven | boolean | no | false |
routableVia | string | no | unproven |
blockers | array | no | 0 items in the example |
provenBlockers | array of string | no | 1 item in the example |
caveats | array of string | no | 1 item in the example |
evidenceSource | string | no | x402 seller crawl + on-chain settlement counts + the router's per-route dispa... |
From an MCP client
catalog.call {
"slug": "seller-trust",
"params": {
"origin": "agent402.tools"
}
}
On the hosted connector at https://agent402.tools/mcp, catalog.call runs seller-trust free (rate-limited, no wallet). Local install: npx -y agent402-mcp.
Errors and behavior
originis required. An input the tool rejects returns an HTTP 4xx whose body carrieserror,tool,expected,requiredandexample, so the caller can correct it.- A paid call that ends in any status of 400 or above is not charged over x402, MPP or a prepaid credits key: settlement is canceled when the tool fails. The exception is a Tempo push credential, a transfer the buyer sent before the call: it settles before the tool runs, so if the tool then fails the payment is recorded as a refund owed to the paying wallet.
- Free tier: no outbound network call leaves the server for this tool, so proof-of-work (16 leading zero bits of sha256) pays for it.
- A
POSTwith a JSON body to /api/x402/seller-trust is served as this GET, with the body as the input. - An
Idempotency-Keyheader makes a retried paid call replay the first 200 instead of charging again (an answer larger than 1 MB is not replayed).
Paid call (JavaScript agent)
import { wrapFetchWithPayment } from "@x402/fetch";
import { x402Client } from "@x402/core/client";
import { registerExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";
const client = new x402Client();
client.setSpendControls?.({ maxAmountPerPayment: "$0.005" }); // refuse any quote above this tool's price
registerExactEvmScheme(client, { signer: privateKeyToAccount(KEY) });
const payFetch = wrapFetchWithPayment(fetch, client);
const res = await payFetch("https://agent402.tools/api/x402/seller-trust?origin=agent402.tools");
No wallet? Pay with compute
Fetch a challenge, solve the sha256 puzzle (16 leading zero bits, a fraction of a second of CPU), and resend with the X-Pow-Solution header:
import { createHash } from "node:crypto";
const lz = (b) => { let t = 0; for (const x of b) { if (!x) { t += 8; continue; } t += Math.clz32(x) - 24; break; } return t; };
const c = await (await fetch("https://agent402.tools/api/pow/challenge?slug=seller-trust")).json();
let n = 0;
while (lz(createHash("sha256").update(c.challenge + ":" + n).digest()) < c.difficulty) n++;
await fetch("https://agent402.tools/api/x402/seller-trust?origin=agent402.tools", { method: "GET", headers: { "X-Pow-Solution": c.token + ":" + n } });
Related tools
x402 seller dossier
POST /api/seller-dossierEverything Agent402 knows about one x402 seller origin, in one read: identity and crawl history, the catalog.
x402 seller payability check
POST /api/seller-payabilityBuy one call from an x402 seller endpoint right now and report exactly what happened: the unpaid call's status, the 402.
Verify B20 token
GET /api/b20-verifyBoolean verdict with reasons: is this address a real factory-issued B20 on Base?
Agent402 bestsellers
GET /api/bestsellersWhat agents actually pay for on a 500+ tool x402 catalog - the paid intelligence layer over Agent402's own sales ledger.
Decide: tool plan for a task
POST /api/decideDescribe a job and get a call-ready plan: which tools, across this catalog and outside x402 sellers with a recently.
Rate a call you paid for
POST /api/feedbackTell this server whether a call you paid for delivered what it promised.