x402 seller dossier
POST /api/seller-dossierEverything Agent402 knows about one x402 seller origin, in one read: identity and crawl history, the catalog with the provenance of every price (live-402 or manifest, when it was read, whether it is stale or disagrees with the seller's own declaration), advertised wallets against the wallets that were actually paid (own chain evidence, inherited wallets, shared claims), settlement evidence per source (our Base leaderboard, Coinbase Bazaar, Solana SPL credits, MPP transfers), the router's own dispatch verdict per chain with its reason and any recent refusal, and what happened the times our router paid it. Send POST /api/seller-dossier with the required field origin and pay $0.05 per call over x402 or MPP (there is no free tier). It returns a JSON object with origin, listed, identity, health, catalog and 8 more.
Ends in plain-English flags, never a score. Deterministic and offline: assembled from our crawl, probes, ledger and chain reads, never a live fetch of the seller. Priced above the list endpoints because it is the assembled record, not a listing.
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 -X POST https://agent402.tools/api/seller-dossier \
-H "Content-Type: application/json" \
-d '{"origin":"agent402.tools"}'
Without payment this returns HTTP 402 Payment Required with the exact price for seller-dossier; any x402 v2 or MPP client pays it and retries.
Example response
{
"origin": "https://seller.example",
"listed": true,
"identity": {
"displayName": "Example Seller",
"homepage": "https://seller.example",
"discoveryPath": "/.well-known/x402",
"mppDualStack": false,
"originResponded": true,
"crawlError": null,
"robotsBlocked": false,
"lastCrawledAt": "2026-09-08T01:00:00.000Z",
"firstRegisteredAt": "2026-08-01T00:00:00.000Z",
"lastRoutableSeenAt": "2026-09-08T01:00:00.000Z",
"lastSettledSeenAt": null,
"listingTextLooksInjected": false
},
"health": {
"crawlHealthScore": 1,
"routable": true,
"paywallProbe": {
"ok": true,
"status": 402,
"url": "https://seller.example/api/x",
"at": "2026-09-08T01:00:00.000Z",
"mpp": false,
"error": null
},
"note": "crawlHealthScore says the manifest parsed on recent crawls; paywallProbe says a paid route answered a real 402. Read both."
},
"catalog": {
"toolCount": 2,
"paidToolCount": 2,
"priceRangeUsd": {
"min": 0.01,
"max": 0.04
},
"networksAdvertised": [
"eip155:8453"
],
"tools": [
{
"method": "POST",
"route": "/api/x",
"name": "X",
"priceUsd": 0.01,
"networks": [
"eip155:8453"
],
"price": {
"source": "live-402",
"observedAt": "2026-09-08T01:00:00.000Z",
"carriedForward": false,
"stale": false,
"originDeclaredUsd": 0.01,
"disagreesWithOrigin": false,
"conflict": null
},
"method_provenance": {
"inferred": false,
"correctedFrom": null
},
"networksVerifiedAt": null,
"networksVerificationDue": false,
"urlTemplate": null,
"dispatch": "settlement_required",
"ourPaidCalls": null
}
],
"toolsTruncated": false,
"priceProvenance": {
"stale": 0,
"carriedForward": 0,
"disagreeWithOrigin": 0,
"unpriced": 0,
"urlTemplates": 0,
"methodInferred": 0,
"methodCorrected": 0,
"networksVerificationDue": 0
}
},
"wallets": {
"advertisedByNetwork": {
"eip155:8453": [
"0x1111111111111111111111111111111111111111"
]
},
"base": {
"advertised": "0x1111111111111111111111111111111111111111",
"ownEvidence": {
"settled": 12,
"payers": 4,
"note": "chain join on this origin's OWN advertised address, plus any committed seed"
},
"inheritedFrom": [],
"inheritedNote": null,
"sharedWithOrigins": []
},
"routerDispatchDetail": null
},
"settlementEvidence": {
"base": {
"source": "on-chain leaderboard (Base USDC, ours)",
"callsSettled": 12,
"uniqueBuyers": 4,
"totalUsd": 0.18,
"wallets": [
"0x1111111111111111111111111111111111111111"
],
"window": null
},
"bazaar": {
"source": "Coinbase Bazaar, last 30 days (their measurement, not ours)",
"calls30d": 30,
"payers30d": 5,
"lastCalledAt": "2026-09-07T20:00:00.000Z",
"payTos": [
"0x1111111111111111111111111111111111111111"
]
},
"solana": {
"source": "Solana SPL leaderboard",
"observed": false
},
"mpp": {
"source": "MPP index",
"observed": false
}
},
"router": {
"eligible": false,
"reason": "settlement_required",
"byChain": {
"base": {
"eligible": false,
"reason": "settlement_required"
}
},
"executeVia": null,
"executeViaCallableNow": false,
"gate": {
"settlementThreshold": 50,
"distinctPayersThreshold": 3,
"underlyingCapUsd": 0.005,
"cheapestPaidToolUsd": 0.01
},
"refusals": [],
"deliveryFailures": []
},
"delivery": {
"source": "route-and-execute paid calls (ours)",
"routesObserved": 0,
"calls": 0,
"kept": 0,
"rows": []
},
"flags": [
"router verdict: settlement_required",
"the cheapest priced route ($0.01) is above the router's $0.005 underlying cap for the cheapest tier"
],
"caveats": [
"every count here is a floor: it is what our crawl, probes and chain reads have observed, never the seller's total"
],
"evidenceSource": "x402 seller crawl + on-chain settlement + Bazaar + MPP index + our own paid calls",
"generatedAt": "2026-09-08T02:00:00.000Z"
}
| Field | Type | Always present | In the example |
|---|---|---|---|
origin | string | no | https://seller.example |
listed | boolean | no | true |
identity | object | no | 12 fields: displayName, homepage, discoveryPath, mppDualStack, originResponde... |
health | object | no | 4 fields: crawlHealthScore, routable, paywallProbe, note |
catalog | object | no | 7 fields: toolCount, paidToolCount, priceRangeUsd, networksAdvertised, tools,... |
wallets | object | no | 3 fields: advertisedByNetwork, base, routerDispatchDetail |
settlementEvidence | object | no | 4 fields: base, bazaar, solana, mpp |
router | object | no | 8 fields: eligible, reason, byChain, executeVia, executeViaCallableNow, gate |
delivery | object | no | 5 fields: source, routesObserved, calls, kept, rows |
flags | array of string | no | 2 items in the example |
caveats | array of string | no | 1 item in the example |
evidenceSource | string | no | x402 seller crawl + on-chain settlement + Bazaar + MPP index + our own paid c... |
generatedAt | string | no | 2026-09-08T02:00:00.000Z |
From an MCP client
catalog.call {
"slug": "seller-dossier",
"params": {
"origin": "agent402.tools"
}
}
The hosted connector at https://agent402.tools/mcp needs a payment for seller-dossier; the stdio package pays it from a wallet or from AGENT402_CREDITS_KEY. 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 cancelled 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.
- Wallet-only: this tool reaches the network or stored state, so it has no proof-of-work tier. A prepaid card-credits key issued earlier (
Authorization: Bearer a402_...) also pays it. - A
GETorHEADto /api/seller-dossier returns the same 402 quote, so the price can be read without a body. - 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?.(false); // keep your own spending ceiling in code
registerExactEvmScheme(client, { signer: privateKeyToAccount(KEY) });
const payFetch = wrapFetchWithPayment(fetch, client);
const res = await payFetch("https://agent402.tools/api/seller-dossier", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
"origin": "agent402.tools"
}),
});
Related tools
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…
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 …
Route and execute
POST /api/route/executeDescribe a task (or name a slug) and the Smart Order Router resolves the best-matching tool and RUNS it in the same call…
Route and execute (max tier)
POST /api/route/execute-maxDescribe a task (or name a slug) and the Smart Order Router resolves the best-matching tool and RUNS it in the same call…
Route and execute (plus tier)
POST /api/route/execute-plusDescribe a task (or name a slug) and the Smart Order Router resolves the best-matching tool and RUNS it in the same call…
Route and execute (pro tier)
POST /api/route/execute-proDescribe a task (or name a slug) and the Smart Order Router resolves the best-matching tool and RUNS it in the same call…