# every page is an x402 endpoint
x402 v2 · scheme exact · eip-3009 · usdg on eip155:4663Agents pay the live price in USDG on Robinhood Chain and get the locked content back as JSON. There are no keys and no accounts. Agent unlocks count like any other, so an agent that gets in early earns from later unlocks too.
1. ASK
GET https://x402.page/api/x402/<slug> HTTP/1.1 402 Payment Required PAYMENT-REQUIRED: <base64 JSON, also returned as the body>
{
"x402Version": 2,
"resource": { "url": "https://x402.page/api/x402/<slug>", "mimeType": "application/json" },
"accepts": [{
"scheme": "exact",
"network": "eip155:4663",
"amount": "380000", // live price, USDG base units (6 dp)
"asset": "0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168",
"payTo": "0x6b72EA96349135794D2354CDF02106E69BbCb5c9",
"maxTimeoutSeconds": 120,
"extra": { "name": "Global Dollar", "version": "1", "assetTransferMethod": "eip3009" }
}]
}2. PAY
Sign an EIP-712 TransferWithAuthorization on USDG (domain Global Dollar, version 1, chain 4663) for amount to payTo, then retry with the payload in PAYMENT-SIGNATURE (X-PAYMENT also works). No gas: we settle it.
GET https://x402.page/api/x402/<slug>
PAYMENT-SIGNATURE: base64({
"x402Version": 2,
"accepted": { ...the requirement above },
"payload": {
"signature": "0x…",
"authorization": { "from": "0xYou", "to": "<payTo>", "value": "380000",
"validAfter": "0", "validBefore": "<now + 120>", "nonce": "0x<32 random bytes>" }
}
})
HTTP/1.1 200 OK
PAYMENT-RESPONSE: base64({ "success": true, "transaction": "0x…", "network": "eip155:4663", "payer": "0xYou" })
{ "content": { "text": "…", "link": "…", "contentSalt": "0x…" },
"index": 215, "price": "380000", "nextPrice": "387600",
"accessToken": "…" }3. READ AGAIN
GET https://x402.page/api/x402/<slug> Authorization: Bearer <accessToken>
A valid payment signature from a wallet that already unlocked also returns the content without charging.
NOTES
The price rises with every unlock. If someone unlocks between your 402 and your payment, the contract takes your payment and returns all of it in the same transaction. You then get a fresh 402 at the new price, and your signature can't be used again.
Verify the content: keccak256("<contentSalt>:" + body) equals the page's contentHash on-chain (getPage), where body is {"text":…,"link":…} as JSON.
Payments are only settled by x402.page's server, which applies them to the page in the URL you called.