Scenarios /

Quote without a recipient: /t/missing-fields

EndpointGET https://x402testendpoint.com/t/missing-fields
Kindtrap: a correct buyer does not pay
Quoted price$0.001 in test USDC on Base Sepolia (testnet)
Cost to youNothing. Test USDC has no value.

What the seller does

A decodable quote whose payment option has no payTo and no asset.

What a correct buyer does

Reject the quote as invalid. Do not guess the missing fields or sign a payment.

Why test this

A quote can decode correctly and still be unusable. Clients should validate the fields they are about to sign over.

Run it

See the quote without paying:

curl -i https://x402testendpoint.com/t/missing-fields

Then point your own client at it, or use the official one:

import { x402Client, x402HTTPClient } from "@x402/core/client";
import { ExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";

const account = privateKeyToAccount(process.env.BUYER_KEY);
const core = new x402Client().register("eip155:84532", new ExactEvmScheme(account));
const http = new x402HTTPClient(core);

const first = await fetch("https://x402testendpoint.com/t/missing-fields");
const quote = http.getPaymentRequiredResponse((h) => first.headers.get(h));
const headers = http.encodePaymentSignatureHeader(await core.createPaymentPayload(quote));
const paid = await fetch(first.url, { headers });
console.log(paid.status, paid.headers.get("x-test-verdict"));

The wallet needs test USDC on Base Sepolia (testnet) for scenarios that settle. Circle's faucet at https://faucet.circle.com provides it.

What you will see

This is a trap: there is no successful payment. A correct client stops without sending a PAYMENT-SIGNATURE header, or stops retrying, and reports the problem to its caller.

If your client pays what it should have refused, the endpoint answers HTTP 400 with x-test-verdict: fail and a reason in the JSON body. The payment is not verified, settled, stored or logged, so no funds move.

How the official client behaves

@x402/core 2.31 with default settings: Does not pay, but fails with an unhandled TypeError (reading toLowerCase of undefined) instead of a validation error. Wrap payment creation in your own error handling.

Related errors

Other scenarios