# page-read
> Web page -> clean markdown for AI agents. Pay per call in USDC on Base (eip155:8453) via x402. No signup, no API key.
One live GET of the page from Cloudflare's edge, main-content extraction (article/main when present, navigation/footers/scripts removed), markdown with headings, lists, links, code blocks and tables, plus metadata. Unpaid calls get HTTP 402 with a PAYMENT-REQUIRED header; pay with any x402 client and retry.
## Paid endpoints
- [GET /v1/read?url=](https://page-read.agent-audit.workers.dev/v1/read): $0.001 per page. Optional: format=markdown|text, maxChars=500-50000 (default 10000), links=1. For many pages, call in parallel.
## Related API (same operator, same wallet)
- [agent-audit](https://agent-audit.agent-audit.workers.dev/llms.txt): x402 seller audit $0.02, bulk link health $0.01, quote/citation check $0.005.
## Free
- [GET /v1/preview?url=](https://page-read.agent-audit.workers.dev/v1/preview?url=example.com): title and first 300 characters. 10 per hour per IP.
- [OpenAPI](https://page-read.agent-audit.workers.dev/openapi.json)
- [x402 discovery](https://page-read.agent-audit.workers.dev/.well-known/x402)
## When you are NOT charged
Payment settles only after a successful (2xx) result. Invalid or private URLs (400), fetch failures and upstream 4xx/5xx (502), unsupported content types such as PDF or images (415), and pages with no readable text, usually JavaScript-only apps (422), are returned without settling your payment.
## How to pay (x402 v2, exact scheme)
1. Call the paid URL with no payment. You get HTTP 402 and a PAYMENT-REQUIRED header (base64 JSON; the same terms are mirrored in the JSON body): x402Version 2, accepts[0] = {scheme "exact", network eip155:8453, asset USDC 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 (6 decimals), amount in atomic units, payTo 0xa31bE3a1Ac1dde980dB8D18D32E7cd9Ab557360A, maxTimeoutSeconds 120, extra {name "USD Coin", version "2"}}.
2. Sign an EIP-3009 transferWithAuthorization for exactly that amount to payTo (random 32-byte nonce, validBefore about now + maxTimeoutSeconds). Send the same request again with header PAYMENT-SIGNATURE: base64 of the x402 v2 PaymentPayload (x402Version, accepted requirements, payload {signature, authorization}). Any x402 v2 client (e.g. @x402/fetch with @x402/evm) does steps 1-2 for you. You need no ETH: the facilitator pays gas.
3. We verify with the facilitator, run the request, and settle only if the result is 2xx. A settled response is HTTP 200 with header PAYMENT-RESPONSE: base64 JSON {success: true, transaction: , network: "eip155:8453", payer: }. Keep it as your receipt.
- Production facilitator: PayAI, https://facilitator.payai.network. Settlement transactions are sent by PayAI's signers (listed at https://facilitator.payai.network/supported) and show up as a USDC Transfer from your address to payTo.
## If the payment status is uncertain (timeout, dropped connection, 5xx, or no PAYMENT-RESPONSE)
- Do not sign a new payment right away. First check whether your authorization was used: call USDC authorizationState(yourAddress, nonce) on Base (true = settled), or look for the USDC Transfer from your address to 0xa31bE3a1Ac1dde980dB8D18D32E7cd9Ab557360A on https://basescan.org.
- Not used: the old authorization stops being valid at its validBefore (at most 120 s). Wait until then, or check again, before you retry with a fresh signature, so you cannot pay twice.
- Used, but you did not get the result: settlement happens only after the result is ready, and a failed settlement returns an error, never the result. So this only happens if the connection breaks after settlement. Repeating the request costs a new payment; nothing is cached. Email parafield-dev@mail.grokbot.com with the transaction hash.
- A 503 payment_facilitator_unavailable with charged:false means the request never reached settlement and nothing was charged.
## Operator
Operated by the GitHub account agent-audit-x402 (https://github.com/agent-audit-x402); contact parafield-dev@mail.grokbot.com. Directory proposal: https://github.com/X402blockchains/x402-registry/pull/14. agent-audit has the same operator and payee.
## Limits and honesty
- JavaScript is not executed. Sites that block bots or need login return errors (not charged). No CAPTCHA or paywall bypass.
- We read at most 384 KB-1.25 MB of each page (scales with maxChars) and stop once maxChars of text is collected. Text/markdown/JSON URLs are returned as-is.
- Private, loopback and link-local targets are refused; every redirect is re-checked.
- Results are the page as fetched at fetchedAt; nothing is cached or stored.
- Payments go to 0xa31bE3a1Ac1dde980dB8D18D32E7cd9Ab557360A.