# AttestPage

Last updated: 2026-10-17

Signed evidence about web pages, for AI agents. Ask whether a quote appears on a page or check every citation in an answer at once, fetch a page and learn what actually came back, check a list of links, check that package names exist on npm, PyPI or crates.io, or timestamp a hash. Every answer carries an Ed25519-signed receipt that anyone can check offline against our published keys.

A receipt records what our fetcher saw at a given time; it does not show that a statement on the page is correct.

## Endpoints

| Route | Price per call | What you get |
|---|---|---|
| `POST /v1/verify/quote` | US$0.01 | your exact words checked against the page: exact, fuzzy or none match, offsets, page hashes, context, page verdict, receipt; or the passages best matching a paraphrased claim |
| `POST /v1/verify/quotes` | US$0.02 per batch | up to 20 quotes on one page: the verify/quote verdict for each, one receipt |
| `POST /v1/verify/text-quote` | US$0.005 | a quote checked against source text you already hold, such as a file or a tool result, with no fetch |
| `POST /v1/verify/citations` | US$0.10 | up to 10 quote and URL pairs: the quote verdict per citation and the page verdict per URL, one receipt |
| `POST /v1/verify/document` | US$0.10 per part | a whole answer or report: its quotes and links found and checked, 10 pairs a part, free preview first |
| `POST /v1/fetch` | US$0.002 | content_kind verdict, status, final URL, title, hashes, injection flags, optional text, receipt |
| `POST /v1/recheck` | US$0.003 | change detection for a page you read earlier: unchanged, changed, gone or unreadable, with the fields that differ |
| `POST /v1/check/links` | US$0.005 | up to 10 URLs: status, redirects, content_kind, hash per URL, one receipt |
| `POST /v1/check/packages` | US$0.005 | up to 10 npm, PyPI or crates.io names: exists in registry, latest version, metadata, one receipt (not a security verdict) |
| `POST /v1/attest` | US$0.002 | signed timestamp over a SHA-256 you supply |
| `POST /v1/receipt/verify` | free | checks a receipt against our keys |
| `GET /v1/sample/{name}` | free | each paid route run on fixed demo data |

Payment is x402 v2 in USDC on Base. A request that fails validation gets 400 before any payment is asked for. See [Payments](/docs/payments) for when a call is charged.

## Start here

1. Call a free sample: `curl https://s2h6qt73jtzlgbgnnfacln2poq.srv.us/v1/sample/quote`
2. Check its receipt. The `receipt` field of the sample is the signed receipt, a compact string. Save it and check it: `RECEIPT=$(curl -s https://s2h6qt73jtzlgbgnnfacln2poq.srv.us/v1/sample/quote | jq -r .receipt)` then `curl -s -X POST https://s2h6qt73jtzlgbgnnfacln2poq.srv.us/v1/receipt/verify -H 'content-type: application/json' -d "{\"receipt\":\"$RECEIPT\"}"`
3. Call a paid route without payment to see the 402 offer, then pay with any x402 v2 client.
4. There is no free trial at the moment; use the free samples instead.

To see a whole paid call first, the 402 offer, the payment and the signed receipt, read the [demo](/demo). For a free walkthrough of a signed receipt, read the [receipt demo](/docs/receipt-demo).

## For agents

- [llms.txt](https://s2h6qt73jtzlgbgnnfacln2poq.srv.us/llms.txt) and [llms-full.txt](https://s2h6qt73jtzlgbgnnfacln2poq.srv.us/llms-full.txt)
- [OpenAPI 3.1](https://s2h6qt73jtzlgbgnnfacln2poq.srv.us/openapi.json), [pricing.json](https://s2h6qt73jtzlgbgnnfacln2poq.srv.us/pricing.json), [x402 discovery](https://s2h6qt73jtzlgbgnnfacln2poq.srv.us/.well-known/x402)
- Every page here is also markdown: add `.md` to the URL or send `Accept: text/markdown`.

## Read more

- [Docs](/docs)
- [How it works](/docs/how-it-works)
- [Limits](/docs/limits)
- [Our fetcher and how to opt out](/bot)
- [Status](/status): current state and uptime ([JSON](/status.json))
