Lint any x402 endpoint or payment header against the v2 spec and real CDP facilitator beha
Lint any x402 endpoint or payment header against the v2 spec and real CDP facilitator behavior: CAIP-2 network ids, atomic amounts, the EIP-712 domain-name trap ('USD Coin' on Base mainnet vs 'USDC' on Sepolia — wrong name = every settlement fails), the extensions echo Coinbase Bazaar requires for indexing, expired authorizations. Findings as error/warning/info with what will actually break. Built by a seller that debugged all of these in production.
1000 (raw units)
price
1
calls / 30d
1
unique payers
2026-09-06
updated
Provider
agentbit.app · discovered, not yet claimed by its owner
Payment (x402 accepts[])
[
{
"scheme": "exact",
"network": "eip155:8453",
"payTo": "0x4395C7e383b7e05665aad7f36ed77c01923Dd965",
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"amount": "1000",
"maxTimeoutSeconds": 300
}
]Output schema
{
"bazaar": {
"info": {
"description": "The x402 debugger we wished existed when we launched. Give it a paid endpoint URL and it probes it with GET, decodes the PAYMENT-REQUIRED envelope and lints every accepts[] entry against the x402 v2 spec AND against how the CDP facilitator and Coinbase Bazaar behave in production: CAIP-2 network ids (plain 'base' breaks v2 clients), maxAmountRequired as an atomic-unit string (a float there breaks signing), payTo/asset address formats, scheme support (the public CDP facilitator settles only 'exact'), description quality (Bazaar ranking depends on it), timeout sanity, and the killer nobody documents loudly enough — extra.name must equal the token contract's EIP-712 domain name, which for USDC is 'USD Coin' on Base mainnet but 'USDC' on Base Sepolia; get it wrong and every single settlement fails with an invalid signature. Alternatively paste a base64 PAYMENT-REQUIRED header to lint offline, or a PAYMENT-SIGNATURE payload to check the client side: EIP-3009 authorization completeness, expired validBefore, payTo/value mismatches, and whether the server's advertised extensions were echoed back — the silent omission that makes the facilitator settle happily while Bazaar never indexes the resource. Findings return as error/warning/info, each explaining what will break in practice. At $0.001, run it in CI on every deploy of a paid endpoint.",
"errors": [
{
"code": "PAYMENT_REQUIRED",
"description": "Missing or invalid payment — retry with a valid PAYMENT-SIGNATURE header",
"retryable": true,
"status": 402
},
{
"code": "VALIDATION_ERROR",
"description": "Request body does not match the input schema",
"retryable": false,
"status": 422
},
{
"code": "RATE_LIMITED",
"description": "Too many requests from this client",
"retryable": true,
"status": 429
},
{
"code": "UPSTREAM_TIMEOUT",
"description": "Upstream data source unavailable — safe to retry",
"retryable": true,
"status": 502
}
],
"input": {
"body": {
"url": "https://agentbit.app/v1/web/search"
},
"bodyType": "json",
"method": "POST",
"type": "http"
},
"networks": [
"eip155:8453"
],
"output": {
"example": {
"accepts_count": 1,
"counts": {
"errors": 0,
"infos": 1,
"warnings": 0
},
"findings": [
{
"code": "EIP712_DOMAIN_OK",
"level": "info",
"message": "accepts[0]: extra.name matches USDC on Base mainnet."
}
],
"http_status": 402,
"mode": "live-probe",
"url": "https://agentbit.app/v1/web/search",
"verdict": "pass"
},
"type": "json"
},
"pricing": {
"amount": 0.001,
"currency": "USDC",
"firstCallFree": true,
"model": "per-call",
"quoteHint": "Send your wallet address in an X-BUYER-WALLET header on the unpaid request to receive your personalized (volume-discounted) quote.",
"volumeDiscounts": [
{
"minCalls30d": 100,
"percent": 10
},
{
"minCalls30d": 1000,
"percent": 20
}
]
},
"reliability": {
"measuredAt": "2026-09-06T13:17:07+00:00",
"p50LatencyMs": 34,
"p95LatencyMs": 34,
"sampleSize": 1,
"successRatePercent": 100,
"windowDays": 30
}
},
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"description": {
"type": "string"
},
"errors": {
"items": {
"properties": {
"code": {
"type": "string"
},
"description": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"status": {
"type": "integer"
}
},
"required": [
"status",
"code"
],
"type": "object"
},
"type": "array"
},
"input": {
"additionalProperties": false,
"properties": {
"body": {
"description": "x402 Envelope Inspector input. Lint any x402 endpoint or payment header against the v2 spec and real CDP facilitator behavior: CAIP-2 network ids, atomic amounts, the EIP-712 domain-name trap ('USD Coin' on Base mainnet vs 'USDC' on Sepolia — wrong name = every settlement fails), the extensions echo Coinbase Bazaar requires for indexing, expired authorizations. Findings as error/warning/info with what will actually break. Built by a seller that debugged all of these in production.",
"properties": {
"payment_payload": {
"description": "Base64 PAYMENT-SIGNATURE header value to lint the client payload (optionally alongside payment_required)",
"type": "string"
},
"payment_required": {
"description": "Base64 PAYMENT-REQUIRED header value to lint offline",
"type": "string"
},
"url": {
"description": "A paid x402 endpoint to probe live (GET, expects the 402 envelope)",
"type": "string"
}
},
"type": "object"
},
"bodyType": {
"enum": [
"json",
"form-data",
"text"
],
"type": "string"
},
"headers": {
"additionalProperties": {
"type": "string"
},
"type": "object"
},
"method": {
"enum": [
"POST",
"PUT",
"PATCH"
],
"type": "string"
},
"queryParams": {
"additionalProperties": {
"type": "string"
},
"type": "object"
},
"type": {
"const": "http",
"type": "string"
}
},
"required": [
"type",
"method",
"bodyType",
"body"
],
"type": "object"
},
"networks": {
"items": {
"type": "string"
},
"type": "array"
},
"output": {
"properties": {
"example": {
"type": "object"
},
"type": {
"type": "string"
}
},
"required": [
"type"
],
"type": "object"
},
"pricing": {
"properties": {
"amount": {
"type": [
"number",
"null"
]
},
"currency": {
"type": "string"
},
"firstCallFree": {
"type": "boolean"
},
"maxAmount": {
"type": "number"
},
"model": {
"type": "string"
},
"quoteHint": {
"type": "string"
},
"volumeDiscounts": {
"items": {
"properties": {
"minCalls30d": {
"type": "integer"
},
"percent": {
"type": "number"
}
},
"required": [
"minCalls30d",
"percent"
],
"type": "object"
},
"type": "array"
}
},
"type": "object"
},
"reliability": {
"properties": {
"measuredAt": {
"type": "string"
},
"p50LatencyMs": {
"type": [
"integer",
"null"
]
},
"p95LatencyMs": {
"type": [
"integer",
"null"
]
},
"sampleSize": {
"type": "integer"
},
"successRatePercent": {
"type": "number"
},
"windowDays": {
"type": "integer"
}
},
"required": [
"successRatePercent",
"sampleSize",
"windowDays"
],
"type": "object"
}
},
"required": [
"input"
],
"type": "object"
}
}
}Use it
curl
curl "https://agentbit.app/v1/x402/inspect" # -> 402 Payment Required, accepts[] lists how to pay # retry with a PAYMENT-SIGNATURE (or PAYMENT header) once paid
JavaScript
const res = await fetch("https://agentbit.app/v1/x402/inspect");
if (res.status === 402) {
const { accepts } = await res.json();
// pay one of accepts[] via an x402 client, then retry with the payment header
}Python
import httpx
res = httpx.get("https://agentbit.app/v1/x402/inspect")
if res.status_code == 402:
accepts = res.json()["accepts"]
# pay one of accepts[] via an x402 client, then retry with the payment headerMachine-readable
Everything on this page is also available as clean JSON at /resources/10987.json, and this resource appears in /discovery/resources and /discovery/search.