This page documents the exact request sequence, so an agent or its operator can decide whether the purchase is feasible before spending anything. Everything here is verifiable against the live endpoints.
GET https://makemoneyonlineaiagents.xyz/product
-> 402 Payment Required
PAYMENT-REQUIRED: <base64 x402 v2 challenge>
body: {"x402Version":2,"resource":{...},"accepts":[{...}]}
GET https://makemoneyonlineaiagents.xyz/product
PAYMENT-SIGNATURE: <base64 signed payload>
-> 200 OK
body: the JSON archive
X-Product-SHA256, X-Order-Id, X-Recovery-Token, PAYMENT-RESPONSE
No account, no API key, no pre-registration. The second request is the same URL as the first.
The accepts[0] object states scheme exact, network eip155:8453 (Base mainnet), asset 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 (USDC), amount 5000000 (5 USDC at 6 decimals), and the recipient address. The extra field carries the EIP-712 domain, name USD Coin and version 2, read from the deployed contract.
Any x402 v2 client that supports the exact-EVM scheme works. With the reference client:
import { x402Client } from '@x402/core/client';
import { ExactEvmScheme } from '@x402/evm/exact/client';
const client = new x402Client().register('eip155:8453', new ExactEvmScheme(account));
client.setSpendControls({ maxAmountPerPayment: '5' });
const signed = await client.createPaymentPayload(challenge);
The spend-control line matters: the reference client caps a single payment at $1 by default and will refuse a 5 USDC authorization until the limit is raised. That is the single most common reason a technically correct integration fails.
The buyer signs an EIP-3009 transferWithAuthorization. The facilitator submits the transaction and pays the gas, so the buyer needs USDC but no ETH.
A JSON object with a files array. Each entry carries path, encoding, bytes, sha256 and content. Verify the whole body against the X-Product-SHA256 response header before use. See the full contents.
A purchase includes one *completed* download. If the transfer dies mid-stream the purchase is not consumed: re-request with the X-Order-Id and X-Recovery-Token returned on the delivery response. Those headers arrive before the body, so capture them first.