| V2_HEADER_PRESENT |
error |
bazaar |
a PAYMENT-REQUIRED response header is present (CDP will not index a v1-only 402)- specspecs/transports-v2/http.md:7-25 § Payment Required Signaling
- cdp-validatorcdp-validator-toolshed.json preflight[6] payment_required_header (required)
- client-code@x402/[email protected] dist/cjs/http/index.js:1620-1628 — the v2 client DOES fall back to a v1 body
- field-reportx402-foundation/x402#3091 — [email protected] is still a live buyer population
|
| V2_B64_URLSAFE |
errorcore |
payment |
the header is standard base64, not base64url- client-code@x402/[email protected] dist/cjs/utils/index.js:133 — Base64EncodedRegex = /^[A-Za-z0-9+/]*={0,2}$/
- client-code@x402/[email protected] dist/cjs/http/index.js:1778-1781 — the regex is tested on the RAW header, then it throws, before any decode
- specspecs/transports-v2/http.md:7-25 § Payment Required Signaling — "Base64-encoded", SILENT on the alphabet
|
| V2_B64_DECODE |
errorcore |
payment |
the header decodes as base64- client-code@x402/[email protected] dist/cjs/http/index.js:1781 — JSON.parse(safeBase64Decode(header)), uncaught
- specspecs/transports-v2/http.md:7-25 § Payment Required Signaling
|
| V2_JSON |
errorcore |
payment |
the decoded header is JSON- client-code@x402/[email protected] dist/cjs/http/index.js:1781 — a SyntaxError escapes decodePaymentRequiredHeader
- specspecs/x402-specification-v2.md:72-107 § 5.1.1 JSON Payload
|
| V2_VERSION |
errorcore |
payment |
the v2 payload declares x402Version 2- specspecs/x402-specification-v2.md:114 § 5.1.2 — x402Version Required, "must be 2"
- client-code@x402/[email protected] dist/cjs/schemas/index.js:111 — x402Version: z.literal(2), inside a discriminatedUnion
- field-reportx402-foundation/x402#3045 wire-format bug 1 — a v1-shaped challenge on a v2 resource
|
| V2_ACCEPTS_NONEMPTY |
errorcore |
payment |
accepts[] is a non-empty array- specspecs/x402-specification-v2.md:117 § 5.1.2 — accepts Required
- client-code@x402/[email protected] dist/cjs/schemas/index.js:114 — accepts: z.array(PaymentRequirementsV2Schema).min(1)
- cdp-validatorcdp-validator-toolshed.json preflight[7] has_accepts (required)
|
| V2_SCHEME |
errorcore |
payment |
each accept names a scheme- specspecs/x402-specification-v2.md:120-131 § 5.1.2 (PaymentRequirements table)
- client-code@x402/[email protected] dist/cjs/schemas/index.js:102 — scheme: NonEmptyString
|
| V2_SCHEME_KNOWN |
info |
payment |
the scheme has a published specification (v2 leaves the field open, so this is an info)- specspecs/schemes/ — exact, upto, batch-settlement, auth-capture each have a scheme document
- cdp-validatorcdp-validator-toolshed.json preflight[8] accepts[0].scheme, expected "exact or upto"
- client-code@x402/[email protected] dist/cjs/schemas/index.js:102 — the v2 schema accepts any non-empty string, by design
|
| V2_NETWORK_CAIP2 |
errorcore |
payment |
network contains a colon (the client’s rule), and is not a v1 plain name- specspecs/x402-specification-v2.md:125 § 5.1.2 — network Required, CAIP-2 format
- specspecs/x402-specification-v2.md:616-621 § 11.1 Network Identifiers
- client-code@x402/[email protected] dist/cjs/schemas/index.js:63-65 — NetworkSchemaV2 = z.string().min(3).refine(v => v.includes(":"))
|
| V2_NETWORK_CAIP2_STYLE |
info |
hygiene |
the network string is CAIP-2 shaped (3–8 character namespace) — a style note, not a client rule- specspecs/x402-specification-v2.md:616-621 § 11.1 — "Networks in x402 v2 use CAIP-2 format"
- house-opinionno shipping client bounds the namespace; @x402/core requires only min(3) and a colon, so this may only be an info
|
| V2_NAMESPACE_KNOWN |
info |
hygiene |
the report says so when a network namespace was checked structurally rather than deeply- specspecs/x402-specification-v2.md:616-621 § 11.1 — namespaces are open-ended; "ach:us" and "sepa:eu" are given as examples
- specspecs/schemes/batch-settlement/scheme_batch_settlement_cloudflare.md:7 — cloudflare:402 is a real network with its own scheme document
- house-opinionworker/lint.js addressFamily() — eip155 and solana are the namespaces whose address formats this linter knows; everything else is checked structurally, and the report says which
|
| V2_NETWORK_SUPPORTED |
error |
bazaar |
the eip155 chain is one CDP’s facilitator settles on- cdp-validatorcdp-validator-toolshed.json preflight[9] accepts[0].network, expected "a facilitator-supported network (Base, Solana, Polygon, Arbitrum, World)"
- house-opiniona chain outside that set is legal x402 and payable through a self-hosted facilitator — it is CDP indexing that is lost, not payment
|
| V2_AMOUNT |
errorcore |
payment |
the price is in amount, not the v1 maxAmountRequired- specspecs/x402-specification-v2.md:120-131 § 5.1.2 (PaymentRequirements table)
- client-code@x402/[email protected] dist/cjs/schemas/index.js:104 — amount: NonEmptyString; maxAmountRequired is not a v2 key
|
| V2_AMOUNT_ATOMIC |
errorcore |
payment |
the amount is a string of atomic units- specspecs/x402-specification-v2.md:120-131 § 5.1.2 (PaymentRequirements table)
- client-code@x402/[email protected] dist/cjs/index.js:570 — BigInt(authorization.value); BigInt("0.01") throws
- client-code[email protected] dist/esm/chunk-V3RMM5AE.mjs:433,440 — the reference facilitator schema refines on isInteger
|
| V2_AMOUNT_MINIMUM |
error |
bazaar |
the amount clears CDP’s 1000-atomic-unit ($0.001) indexing floor- cdp-validatorcdp-validator-toolshed.json preflight[11] accepts[0].amount (required), expected ">= 1000"
- client-code@x402/[email protected] dist/cjs/schemas/index.js:104 — the client itself applies no numeric bound, so the facilitator is the only enforcer
|
| V2_INDEX_AMOUNT |
error |
bazaar |
the amount is a value CDP’s required amount preflight can read at all- cdp-validatorcdp-validator-toolshed.json preflight[11] accepts[0].amount (required), expected ">= 1000" — the check compares a value, so an absent or non-integer amount cannot satisfy it
|
| V2_INDEX_TIMEOUT |
error |
bazaar |
maxTimeoutSeconds is SET, which is what CDP’s required preflight asks- cdp-validatorcdp-validator-toolshed.json preflight[13] accepts[0].maxTimeoutSeconds (required) — "maxTimeoutSeconds is set". Presence is the whole of the provider’s stated rule; the JSON type is a payment question and V2_MAX_TIMEOUT asks it
|
| V2_INDEX_ASSET |
error |
bazaar |
asset identifies a token on a chain CDP settles, so its required asset preflight can pass- cdp-validatorcdp-validator-toolshed.json preflight[10] accepts[0].asset (required) — "Asset is USDC", captured with a token contract address as the actual value
- specspecs/x402-specification-v2.md:127 § 5.1.2 — on a chain, asset is the token contract address; a ticker cannot be the token CDP looks up
|
| V2_INDEX_PAYTO |
error |
bazaar |
payTo is an address, which is what CDP’s required payee preflight asks for- cdp-validatorcdp-validator-toolshed.json preflight[12] accepts[0].payTo (required) — "payTo address present", captured with a string address as the actual value
|
| V2_PAYTO |
errorcore |
payment |
payTo has the address shape its network’s namespace requires- specspecs/x402-specification-v2.md:128 § 5.1.2 — "Recipient wallet address or role constant (e.g., \"merchant\")"
- specspecs/schemes/exact/scheme_exact_svm.md:53-68 — a base58 payTo on solana:*
- client-code@x402/[email protected] dist/cjs/index.js:537 — `to: getAddress(paymentRequirements.payTo)`; viem throws on a non-address
- client-code@x402/[email protected] dist/cjs/schemas/index.js:106 — payTo: NonEmptyString, i.e. the shape rule is the scheme’s, not the envelope’s
|
| V2_ASSET |
errorcore |
payment |
asset names the token in the form its network’s namespace requires- specspecs/x402-specification-v2.md:127 § 5.1.2 — "Token contract address or ISO 4217 currency code for fiat"
- client-code@x402/[email protected] dist/cjs/index.js:565 — verifyingContract: getAddress(requirements.asset)
- specspecs/schemes/exact/scheme_exact_svm.md:71 — asset is the token mint public key
|
| V2_MAX_TIMEOUT |
errorcore |
payment |
maxTimeoutSeconds is a positive JSON number (a string "60" is not one)- specspecs/x402-specification-v2.md:129 § 5.1.2 — maxTimeoutSeconds, type number, Required
- client-code@x402/[email protected] dist/cjs/schemas/index.js:107 — maxTimeoutSeconds: z.number().positive(), required, no coercion
- client-code@x402/[email protected] dist/cjs/index.js:539 — validBefore is computed from it; undefined yields BigInt("NaN"), which throws
- cdp-validatorcdp-validator-toolshed.json preflight[13] accepts[0].maxTimeoutSeconds (required)
|
| V2_EXTRA_EIP712 |
error |
payment |
extra.{name,version} is present on an eip3009 exact entry, where the client signs from it- specspecs/schemes/exact/scheme_exact_evm.md:72-73 — extra.name and extra.version, both "(required)"
- specspecs/schemes/exact/scheme_exact_evm.md:171-172,285-286 — conditional under permit2, optional under erc7710
- client-code@x402/[email protected] dist/cjs/index.js:555-558 — signEIP3009Authorization throws when either is absent
- client-code@x402/[email protected] dist/cjs/index.js:1261 — assetTransferMethod defaults to "eip3009"
|
| V2_ACCEPTS_V1_FIELDS |
warn |
payment |
the accept carries no v1-only fields- specspecs/x402-specification-v2.md:120-131 § 5.1.2 (PaymentRequirements table)
- client-code@x402/[email protected] dist/cjs/schemas/index.js:101-109 — a plain z.object, so unknown keys are STRIPPED on any re-parse
- client-code@x402/[email protected] dist/esm/client/index.mjs:262 — the raw entry is echoed as `accepted`, unstripped
|
| V2_RESOURCE_OBJECT |
errorcore |
payment |
resource is the v2 object, not a v1 flat string- specspecs/x402-specification-v2.md:116 § 5.1.2 — resource Required, ResourceInfo object
- client-code@x402/[email protected] dist/cjs/schemas/index.js:113 — resource: ResourceInfoSchema
- cdp-validatorcdp-validator-toolshed.json preflight[14] has_resource (required)
|
| V2_RESOURCE_URL_PARSES |
warn |
payment |
resource.url parses as a URL at all — it is echoed into the payment payload- client-code@x402/[email protected] dist/cjs/schemas/index.js:69 — url: NonEmptyString, so the client will happily carry a bare path
- client-code@x402/[email protected] dist/cjs/client/index.js:413 — resource is copied verbatim into the outgoing PaymentPayload, which is what a settlement is attributed to
- field-reportx402-foundation/x402#3045 wire-format bug 3 — "resource.url must be absolute, not a bare path"
|
| V2_RESOURCE_URL |
error |
bazaar |
resource.url is an absolute https URL- cdp-validatorcdp-validator-toolshed.json preflight[0] url_valid and preflight[1] url_https, both required
- specspecs/x402-specification-v2.md:132-141 § 5.1.2 (ResourceInfo table)
- field-reportx402-foundation/x402#3045 wire-format bug 3
|
| V2_RESOURCE_METHOD |
warn |
bazaar |
resource.method, when published, agrees with bazaar.info.input.method- specspecs/x402-specification-v2.md:132-141 § 5.1.2 (ResourceInfo table) — there is no `method` member, so its absence is conformant
- specspecs/extensions/bazaar.md:251-269 — info.input.method is the declared verb
- livecdp-validator-toolshed.json paymentRequirements.resource.method — indexed sellers do publish it
|
| V2_RESOURCE_DESCRIPTION |
error |
bazaar |
resource.description is under 500 characters (absent is an info; over the limit is an error)- specspecs/x402-specification-v2.md:132-141 § 5.1.2 (ResourceInfo table) — description Optional
- cdp-docshttps://docs.cdp.coinbase.com/x402/seller/get-discovered — "the CDP Facilitator rejects verify and settle requests whose description exceeds that limit" (500 characters)
|
| V2_RESOURCE_MIMETYPE |
info |
hygiene |
resource.mimeType, when published, looks like a media type- specspecs/x402-specification-v2.md:132-141 § 5.1.2 (ResourceInfo table) — mimeType Optional
- client-code@x402/[email protected] dist/cjs/schemas/index.js:71 — mimeType: z.string().nullish()
|
| V2_RESOURCE_URL_MATCHES |
info |
hygiene |
resource.url is the URL that was called- client-code@x402/[email protected] dist/cjs/client/index.js:413 — settlement is attributed to the echoed resource
- house-opiniona proxy, a route template or a canonicalised host makes a mismatch legitimate, so this may only ever be an info
|
| V2_SERVICE_NAME |
warn |
bazaar |
resource.serviceName, when published, is ≤32 printable-ASCII characters (absence is silent)- specspecs/extensions/bazaar.md:389 — "length ≤ 32 characters"; on violation, "Drop the field."
- client-code@x402/[email protected] dist/cjs/schemas/index.js:72 — z.string().min(1).max(32).regex(/^[\x20-\x7e]+$/)
|
| V2_TAGS |
warn |
bazaar |
resource.tags, when published, are ≤5 entries of ≤32 printable-ASCII characters (absence is silent)- specspecs/extensions/bazaar.md:390 — "at most 5 entries; each entry non-empty, printable ASCII … length ≤ 32"
- client-code@x402/[email protected] dist/cjs/schemas/index.js:73 — z.array(z.string().min(1).max(32).regex(PRINTABLE_ASCII)).max(5)
|
| V2_BAZAAR_PRESENT |
error |
bazaar |
extensions.bazaar is present — in v2 its presence IS the discovery opt-in- cdp-validatorcdp-validator-toolshed.json preflight[15] has_bazaar_extension (required)
- specspecs/extensions/bazaar.md:512-517 § Client Behavior — omitting the extension means no cataloging
- field-reportx402-foundation/x402#3045 — a CDP engineer: `extensions.bazaar.discoverable` is "not a valid field"
|
| V2_BAZAAR_INFO |
error |
bazaar |
extensions.bazaar.info is present- specspecs/x402-specification-v2.md:143-149 § 5.1.2 (Extensions table) — info Required
- cdp-validatorcdp-validator-toolshed.json preflight[16] bazaar.info (required)
|
| V2_BAZAAR_SCHEMA |
error |
bazaar |
extensions.bazaar.schema is present- specspecs/x402-specification-v2.md:143-149 § 5.1.2 (Extensions table) — schema Required
- specspecs/extensions/bazaar.md:322 — "Facilitators must validate info against schema before cataloging"
- cdp-validatorcdp-validator-toolshed.json preflight[23] bazaar.schema (required)
|
| V2_BAZAAR_SCHEMA_CONTENT |
error |
bazaar |
the bazaar schema meets its own content MUSTs: requires input, and every $ref/$id is same-document- specspecs/extensions/bazaar.md:313-322 § Schema Validation — Draft 2020-12, "Must define an input property (required)", and "$ref and $id values must be same-document JSON Pointer fragments (starting with #); external references … are not allowed"
- field-reportx402-foundation/x402#3045 wire-format bug 5 — an external $ref broke CDP’s validator outright
|
| V2_BAZAAR_INFO_VALIDATES |
error |
bazaar |
info validates against its own schema- specspecs/extensions/bazaar.md:322 — facilitators MUST validate info against schema before cataloging
- cdp-validatorcdp-validator-toolshed.json preflight[24] parse (required)
- field-reportx402-foundation/x402#3045 — an info/schema mismatch is declined silently; nothing reaches the seller’s logs
|
| V2_BAZAAR_INPUT |
error |
bazaar |
bazaar.info.input carries a worked sample call- specspecs/extensions/bazaar.md:245-282 § Discovery Info Structure — input is Required in every discriminant
- cdp-validatorcdp-validator-toolshed.json preflight[17] bazaar.info.input (required)
|
| V2_BAZAAR_INPUT_TYPE |
error |
bazaar |
bazaar.info.input.type is the "http" or "mcp" discriminator, with that branch’s required fields- specspecs/extensions/bazaar.md:251-282 — type Required ("http"/"mcp"); bodyType and body Required for POST/PUT/PATCH; toolName and inputSchema Required for mcp
- cdp-validatorcdp-validator-toolshed.json preflight[18] bazaar.info.input.type (required)
- field-reportx402-foundation/x402#3045 wire-format bug 4 — the missing `type` discriminator
|
| V2_BAZAAR_INPUT_METHOD |
error |
bazaar |
bazaar.info.input.method is an HTTP verb from the spec’s enums, and matches the verb that was probed- specspecs/extensions/bazaar.md:251-269 — method Required, one of GET/HEAD/DELETE or POST/PUT/PATCH
- cdp-validatorcdp-validator-toolshed.json preflight[19] bazaar.info.input.method and preflight[20] bazaar.info.input.method.matches_request, both required
|
| V2_BAZAAR_OUTPUT_TYPE |
warn |
bazaar |
bazaar.info.output, when published, carries its Required type- specspecs/extensions/bazaar.md:284-294 § Output Types — output optional; within it, type Required
- cdp-validatorcdp-validator-toolshed.json preflight[21] bazaar.info.output (advisory)
|
| V2_BAZAAR_OUTPUT_EXAMPLE |
info |
bazaar |
bazaar.info.output.example is a computed response — any JSON value, and CDP grades it advisory- specspecs/extensions/bazaar.md:284-294 — the example row is `example | any | No`
- specspecs/extensions/bazaar.md:46-53 — the spec’s own GET example gives output.example as an OBJECT
- cdp-validatorcdp-validator-toolshed.json preflight[22] bazaar.info.output.example (advisory)
|