Check every quote in a draft before you publish
Last updated: 2026-10-17
A quote that does not appear on its source page is the most common error in an AI-written draft. Before you publish, check each quote against the page it cites. AttestPage fetches the live page and answers exact, fuzzy or none for each quote, with the offsets and a signed receipt.
This guide gives the recipe, then one call with curl and jq against https://vehcdj664efetfrsolne5umanq.srv.us. A bare curl cannot sign a payment, so the paid call needs an x402 v2 client: the MCP server or an x402 client in code.
Recipe
- List the claims. Take every sentence in the draft that puts words in quotation marks and names a source. Keep the quote word for word, as written in the draft.
- Group by URL. Put all quotes that cite the same page together.
- Check each group once.
- One quote on a page:
POST /v1/verify/quote, US$0.01 per call. - Two to twenty quotes on the same page:
POST /v1/verify/quotes, US$0.02 for the whole group, so from three quotes up it costs less per quote.
- Read the page verdict first. If
page.content_kindis notreal(for examplebot_wall,js_shellorpaywall), anonemeans we could not read the page. It does not mean the quote is wrong. Find another copy of the page or cite it differently. - Decide each quote.
exact, orfuzzywith a score of 0.9 or more: keep the quote, and keep the URL in the draft.noneon a real page: the quote is not on the page. Fix the wording to match the page, or drop the quote.- Anything else: check it by hand before publishing.
- Keep the receipt. Save the
receiptnext to the draft, so anyone can check later that the page said this on that day.
Do not publish a quote that you have not checked.
Price
US$0.01 per call for one quote, US$0.02 per call for up to 20 quotes on one page, paid in USDC with x402 v2 on Base mainnet (real USDC). No account, key or sign-up. A request that fails validation gets 400 before payment and is never charged. All prices: pricing.json.
1. Read the price from the payment offer
An empty body is refused before payment and is never charged. Read the offer it returns:
curl -si -X POST https://vehcdj664efetfrsolne5umanq.srv.us/v1/verify/quote \
-H 'content-type: application/json' -d '{}' \
| grep -i '^payment-required:' | cut -d' ' -f2 | tr -d '\r' | base64 -d \
| jq '.accepts[0] | {scheme, network, amount, payTo}'
amount is in USDC base units (six decimal places), so it is the price above in base units.
2. Make the paid call
Send the quote with its URL. curl alone cannot sign the payment, so send the request through an x402 v2 client. The client reads the offer from step 1, signs it, and sends the same request again with a PAYMENT-SIGNATURE header:
cat > body.json <<'EOF'
{ "url": "https://www.iana.org/help/example-domains",
"quote": "These domains may be used as illustrative examples in documents",
"match": "fuzzy" }
EOF
curl -s -X POST https://vehcdj664efetfrsolne5umanq.srv.us/v1/verify/quote \
-H 'content-type: application/json' \
-H "PAYMENT-SIGNATURE: $PAYMENT_SIGNATURE" \
-d @body.json | jq '{match: .result.match, score: .result.score, kind: .page.content_kind, advice}'
$PAYMENT_SIGNATURE is the signed payment that your x402 client produces. The answer is exact, fuzzy or none, with page.content_kind and a receipt. A request that fails validation gets 400 before payment and is never charged.
Notes
- Quotes are matched after normalising both texts: curly quotes and dashes become plain, invisible characters are dropped and all whitespace becomes one space. Your quote must still be the same words.
- The check reads the page as our fetcher receives it at that moment. A page that changes later may not match the quote you checked.
- Routes and prices: POST /v1/verify/quote, POST /v1/verify/quotes and pricing.json.