{"openapi":"3.1.0","info":{"title":"NanoParse","version":"1.0.0","description":"Web page → clean Markdown, page metadata and a 20-signal source-intelligence layer (Litmus). Paid per parse with x402 v2 (USDC on Base).","contact":{"email":"hello@nanoparse.app"},"x-guidance":"POST /fetch with {\"url\": \"https://example.com\"} to parse a page. Without a Payment-Signature header the call answers HTTP 402: decode the base64 PAYMENT-REQUIRED header for the price, asset, network and payTo, pay with an x402 v2 client on Base, then resubmit the same request with a signed Payment-Signature header. A 202 returns a jobId — poll GET /status?jobId=… (free, no payment) until status is completed. $0.005 USDC per delivered parse; invalid, blocked or paywalled URLs are never charged, and 10 parses per network are free. Full guide: https://nanoparse.app/quickstart"},"security":[],"servers":[{"url":"https://nanoparse.app"}],"x-agentcash-provenance":{"ownershipProofs":["0x57a1d06873db575baeae1f6af30862a75c7bd570"]},"x-discovery":{"ownershipProofs":["0x57a1d06873db575baeae1f6af30862a75c7bd570"]},"x-agentcash-guidance":{"llmsTxtUrl":"https://nanoparse.app/llms.txt"},"paths":{"/fetch":{"post":{"operationId":"fetch","summary":"Fetch a web page and return clean Markdown with Litmus intelligence","description":"Turn any URL into clean Markdown with page metadata plus a 20-signal source-intelligence layer (trust, spam and AI-generation screening). Full Chromium rendering for JS-heavy pages. Asynchronous: the call returns a jobId to poll at GET /status?jobId=… (free). Payment: x402 v2, USDC on Base, $0.005 per parse. An unpaid call — GET, a body-less POST, or a POST without a Payment-Signature header — answers HTTP 402 with a base64 PAYMENT-REQUIRED header naming the price, asset, network and payTo address. Resubmit the same request with a signed Payment-Signature header to parse. Up to 10 parses per network are free before payment is required. Invalid, blocked or paywalled URLs are rejected before settlement, so a failed call is never charged.","security":[],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.005"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri","description":"Absolute http(s) URL of the page to parse"},"sync":{"type":"boolean","description":"Wait briefly for the parsed result inline instead of returning immediately"}}}}}},"responses":{"202":{"description":"Job accepted. Poll `statusUrl` (GET /status?jobId=…, free, no payment) until status is `completed` or `failed`. Charged once, on delivery.","content":{"application/json":{"schema":{"type":"object","required":["jobId","status","statusUrl"],"properties":{"jobId":{"type":"string"},"status":{"type":"string","enum":["queued","processing","completed","failed"]},"statusUrl":{"type":"string","format":"uri"},"sync_timeout":{"type":"boolean"}}}}}},"400":{"description":"Malformed request — invalid json, missing url, or a non-http(s) url"},"402":{"description":"Payment required. Body carries `payment_required` (x402 v2: resource, accepts[]) and the base64 PAYMENT-REQUIRED header; Pay-To names the treasury. Resubmit with a signed Payment-Signature header.","headers":{"Payment-Required":{"schema":{"type":"string"},"description":"Base64 (padded) x402 v2 PaymentRequired object"},"Pay-To":{"schema":{"type":"string"},"description":"e.g. ethereum:base:0x…"}}},"403":{"description":"Target refused before payment — SSRF-restricted host, blocked domain, or a paywalled site. Never charged."},"422":{"description":"content_insufficient — a recent parse of this URL returned too little text (bot wall or JS shell). Cached 15 min. Never charged."},"429":{"description":"Free-tier quota exhausted or automated abuse detected. Never charged."}}}}}}