{"openapi":"3.1.0","info":{"title":"readable","version":"1.0.0","summary":"URL to clean, LLM-ready Markdown.","description":"Turns web pages into clean Markdown, text or sanitised HTML: boilerplate removal, GFM tables, fenced code blocks, absolute links and images, plus title/byline/date metadata. Paid per call over x402 (USDC on Base) — no account or API key. Failed or invalid requests are never charged.","x-price":{"POST /extract":"$0.004","POST /unfurl":"$0.001","POST /links":"$0.002","POST /batch":"$0.003 per URL"},"license":{"name":"Proprietary","identifier":"LicenseRef-Proprietary"}},"servers":[{"url":"https://readable.x.c00l.site"}],"tags":[{"name":"extract","description":"Article extraction"},{"name":"metadata","description":"Link previews and link graphs"},{"name":"free","description":"Unpaid endpoints"}],"paths":{"/extract":{"post":{"tags":["extract"],"operationId":"extractPost","summary":"Extract a page as Markdown — $0.004","description":"Fetch a URL, strip boilerplate, and return the article as Markdown (or text/HTML) with metadata. Price: $0.004 per call.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"Absolute http(s) URL of the page to extract."},"format":{"type":"string","enum":["markdown","text","html"],"default":"markdown","description":"Output form of `content`."},"includeImages":{"type":"boolean","default":true,"description":"Keep images as ![alt](src)."},"includeLinks":{"type":"boolean","default":true,"description":"Keep links as [text](url)."},"maxChars":{"type":"integer","minimum":100,"maximum":2000000,"description":"Truncate content at this many characters, on a word boundary."}},"additionalProperties":false},"example":{"url":"https://en.wikipedia.org/wiki/Markdown","maxChars":20000}}}},"responses":{"200":{"description":"Success. Settled; `PAYMENT-RESPONSE` carries the receipt.","headers":{"PAYMENT-RESPONSE":{"description":"Base64 JSON settlement receipt.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"finalUrl":{"type":"string","format":"uri","description":"URL after redirects."},"title":{"type":["string","null"]},"byline":{"type":["string","null"],"description":"Author, if discoverable."},"publishedAt":{"type":["string","null"],"description":"ISO 8601 when parseable."},"siteName":{"type":["string","null"]},"lang":{"type":["string","null"]},"excerpt":{"type":["string","null"]},"content":{"type":"string","description":"The extracted body in `contentFormat`."},"contentFormat":{"type":"string","enum":["markdown","text","html"]},"wordCount":{"type":"integer"},"readingTimeMinutes":{"type":"integer"},"truncated":{"type":"boolean"},"meta":{"type":"object","properties":{"description":{"type":["string","null"]},"ogImage":{"type":["string","null"],"format":"uri"},"favicon":{"type":["string","null"],"format":"uri"},"canonical":{"type":["string","null"],"format":"uri"},"type":{"type":["string","null"]},"section":{"type":["string","null"]},"keywords":{"type":["array","null"],"items":{"type":"string"}},"modifiedAt":{"type":["string","null"]},"themeColor":{"type":["string","null"]},"contentType":{"type":"string"},"charset":{"type":"string"},"redirected":{"type":"array","items":{"type":"string","format":"uri"}}}},"extraction":{"type":"object","description":"Diagnostics: which strategy chose the content block.","properties":{"strategy":{"type":"string"},"container":{"type":["string","null"]},"linkDensity":{"type":"number"},"candidateTextChars":{"type":"integer"},"documentTextChars":{"type":"integer"},"images":{"type":"integer"},"links":{"type":"integer"},"htmlBytes":{"type":"integer"},"tokens":{"type":"integer"}}},"paidBy":{"type":["string","null"]}}}}}},"400":{"description":"Invalid input. Rejected before payment — free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"402":{"description":"Payment required ($0.004). The `PAYMENT-REQUIRED` header holds a base64 x402 v2 challenge.","headers":{"PAYMENT-REQUIRED":{"description":"Base64 JSON x402 PaymentRequired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object"}}}},"403":{"description":"Host refused by the SSRF guard. Free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"413":{"description":"Document or request too large. Free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"415":{"description":"Upstream served a non-document content type. Free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"502":{"description":"Upstream failed. Not settled — free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"504":{"description":"Upstream timed out. Not settled — free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}}}},"get":{"tags":["extract"],"operationId":"extractGet","summary":"Extract a page as Markdown — $0.004","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","format":"uri"},"example":"https://en.wikipedia.org/wiki/Markdown","description":"Absolute http(s) URL."},{"name":"format","in":"query","schema":{"type":"string","enum":["markdown","text","html"],"default":"markdown"}},{"name":"includeImages","in":"query","schema":{"type":"boolean","default":true}},{"name":"includeLinks","in":"query","schema":{"type":"boolean","default":true}},{"name":"maxChars","in":"query","schema":{"type":"integer","minimum":100,"maximum":2000000}}],"responses":{"200":{"description":"Success. Settled; `PAYMENT-RESPONSE` carries the receipt.","headers":{"PAYMENT-RESPONSE":{"description":"Base64 JSON settlement receipt.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"finalUrl":{"type":"string","format":"uri","description":"URL after redirects."},"title":{"type":["string","null"]},"byline":{"type":["string","null"],"description":"Author, if discoverable."},"publishedAt":{"type":["string","null"],"description":"ISO 8601 when parseable."},"siteName":{"type":["string","null"]},"lang":{"type":["string","null"]},"excerpt":{"type":["string","null"]},"content":{"type":"string","description":"The extracted body in `contentFormat`."},"contentFormat":{"type":"string","enum":["markdown","text","html"]},"wordCount":{"type":"integer"},"readingTimeMinutes":{"type":"integer"},"truncated":{"type":"boolean"},"meta":{"type":"object","properties":{"description":{"type":["string","null"]},"ogImage":{"type":["string","null"],"format":"uri"},"favicon":{"type":["string","null"],"format":"uri"},"canonical":{"type":["string","null"],"format":"uri"},"type":{"type":["string","null"]},"section":{"type":["string","null"]},"keywords":{"type":["array","null"],"items":{"type":"string"}},"modifiedAt":{"type":["string","null"]},"themeColor":{"type":["string","null"]},"contentType":{"type":"string"},"charset":{"type":"string"},"redirected":{"type":"array","items":{"type":"string","format":"uri"}}}},"extraction":{"type":"object","description":"Diagnostics: which strategy chose the content block.","properties":{"strategy":{"type":"string"},"container":{"type":["string","null"]},"linkDensity":{"type":"number"},"candidateTextChars":{"type":"integer"},"documentTextChars":{"type":"integer"},"images":{"type":"integer"},"links":{"type":"integer"},"htmlBytes":{"type":"integer"},"tokens":{"type":"integer"}}},"paidBy":{"type":["string","null"]}}}}}},"400":{"description":"Invalid input. Rejected before payment — free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"402":{"description":"Payment required ($0.004). The `PAYMENT-REQUIRED` header holds a base64 x402 v2 challenge.","headers":{"PAYMENT-REQUIRED":{"description":"Base64 JSON x402 PaymentRequired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object"}}}},"403":{"description":"Host refused by the SSRF guard. Free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"413":{"description":"Document or request too large. Free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"415":{"description":"Upstream served a non-document content type. Free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"502":{"description":"Upstream failed. Not settled — free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"504":{"description":"Upstream timed out. Not settled — free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}}}}},"/unfurl":{"post":{"tags":["metadata"],"operationId":"unfurlPost","summary":"Link-preview metadata — $0.001","description":"Head-only metadata: title, description, OG image, favicon, canonical, site name, type, theme colour, author, date, feeds, oEmbed. Price: $0.001.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri"}},"additionalProperties":false},"example":{"url":"https://github.com/cloudflare/workerd"}}}},"responses":{"200":{"description":"Success. Settled; `PAYMENT-RESPONSE` carries the receipt.","headers":{"PAYMENT-RESPONSE":{"description":"Base64 JSON settlement receipt.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"},"finalUrl":{"type":"string"},"title":{"type":["string","null"]},"description":{"type":["string","null"]},"siteName":{"type":["string","null"]},"canonical":{"type":["string","null"]},"ogImage":{"type":["string","null"]},"favicon":{"type":["string","null"]},"type":{"type":["string","null"]},"lang":{"type":["string","null"]},"themeColor":{"type":["string","null"]},"author":{"type":["string","null"]},"publishedAt":{"type":["string","null"]},"twitterCard":{"type":["string","null"]},"oembed":{"type":["object","null"]},"feeds":{"type":["array","null"],"items":{"type":"object"}},"icons":{"type":["array","null"],"items":{"type":"object"}},"keywords":{"type":["array","null"],"items":{"type":"string"}}}}}}},"400":{"description":"Invalid input. Rejected before payment — free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"402":{"description":"Payment required ($0.001). The `PAYMENT-REQUIRED` header holds a base64 x402 v2 challenge.","headers":{"PAYMENT-REQUIRED":{"description":"Base64 JSON x402 PaymentRequired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object"}}}},"403":{"description":"Host refused by the SSRF guard. Free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"413":{"description":"Document or request too large. Free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"415":{"description":"Upstream served a non-document content type. Free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"502":{"description":"Upstream failed. Not settled — free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"504":{"description":"Upstream timed out. Not settled — free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}}}},"get":{"tags":["metadata"],"operationId":"unfurlGet","summary":"Link-preview metadata — $0.001","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","format":"uri"},"example":"https://en.wikipedia.org/wiki/Markdown","description":"Absolute http(s) URL."}],"responses":{"200":{"description":"Success. Settled; `PAYMENT-RESPONSE` carries the receipt.","headers":{"PAYMENT-RESPONSE":{"description":"Base64 JSON settlement receipt.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid input. Rejected before payment — free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"402":{"description":"Payment required ($0.001). The `PAYMENT-REQUIRED` header holds a base64 x402 v2 challenge.","headers":{"PAYMENT-REQUIRED":{"description":"Base64 JSON x402 PaymentRequired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object"}}}},"403":{"description":"Host refused by the SSRF guard. Free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"413":{"description":"Document or request too large. Free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"415":{"description":"Upstream served a non-document content type. Free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"502":{"description":"Upstream failed. Not settled — free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"504":{"description":"Upstream timed out. Not settled — free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}}}}},"/links":{"post":{"tags":["metadata"],"operationId":"linksPost","summary":"All links on a page — $0.002","description":"Every anchor, absolutised, tracking-params stripped, deduped and classified internal/external/nofollow with anchor text and page region. Price: $0.002.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri"},"limit":{"type":"integer","minimum":1,"maximum":5000,"default":1000}},"additionalProperties":false},"example":{"url":"https://news.ycombinator.com/","limit":500}}}},"responses":{"200":{"description":"Success. Settled; `PAYMENT-RESPONSE` carries the receipt.","headers":{"PAYMENT-RESPONSE":{"description":"Base64 JSON settlement receipt.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"},"finalUrl":{"type":"string"},"base":{"type":"string"},"counts":{"type":"object","properties":{"total":{"type":"integer"},"occurrences":{"type":"integer"},"internal":{"type":"integer"},"external":{"type":"integer"},"nofollow":{"type":"integer"},"skipped":{"type":"integer"}}},"truncated":{"type":"boolean"},"links":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"text":{"type":["string","null"]},"title":{"type":["string","null"]},"type":{"type":"string","enum":["link","anchor","file","email","phone"]},"internal":{"type":"boolean"},"nofollow":{"type":"boolean"},"sponsored":{"type":"boolean"},"ugc":{"type":"boolean"},"rel":{"type":["string","null"]},"region":{"type":"string"},"count":{"type":"integer"}}}}}}}}},"400":{"description":"Invalid input. Rejected before payment — free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"402":{"description":"Payment required ($0.002). The `PAYMENT-REQUIRED` header holds a base64 x402 v2 challenge.","headers":{"PAYMENT-REQUIRED":{"description":"Base64 JSON x402 PaymentRequired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object"}}}},"403":{"description":"Host refused by the SSRF guard. Free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"413":{"description":"Document or request too large. Free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"415":{"description":"Upstream served a non-document content type. Free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"502":{"description":"Upstream failed. Not settled — free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"504":{"description":"Upstream timed out. Not settled — free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}}}},"get":{"tags":["metadata"],"operationId":"linksGet","summary":"All links on a page — $0.002","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","format":"uri"},"example":"https://en.wikipedia.org/wiki/Markdown","description":"Absolute http(s) URL."},{"name":"limit","in":"query","schema":{"type":"integer","default":1000}}],"responses":{"200":{"description":"Success. Settled; `PAYMENT-RESPONSE` carries the receipt.","headers":{"PAYMENT-RESPONSE":{"description":"Base64 JSON settlement receipt.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid input. Rejected before payment — free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"402":{"description":"Payment required ($0.002). The `PAYMENT-REQUIRED` header holds a base64 x402 v2 challenge.","headers":{"PAYMENT-REQUIRED":{"description":"Base64 JSON x402 PaymentRequired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object"}}}},"403":{"description":"Host refused by the SSRF guard. Free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"413":{"description":"Document or request too large. Free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"415":{"description":"Upstream served a non-document content type. Free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"502":{"description":"Upstream failed. Not settled — free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"504":{"description":"Upstream timed out. Not settled — free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}}}}},"/batch":{"post":{"tags":["extract"],"operationId":"batchPost","summary":"Extract up to 20 URLs — $0.003 per URL","description":"Concurrent /extract for 1-20 URLs. Charged 0.003 × urls.length, so the amount is derivable from the request before paying. Each result carries its own ok/error. If every URL fails the response is 502 and free.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["urls"],"properties":{"urls":{"type":"array","minItems":1,"maxItems":20,"items":{"type":"string","format":"uri"}},"url":{"type":"string","description":"Absolute http(s) URL of the page to extract."},"format":{"type":"string","enum":["markdown","text","html"],"default":"markdown","description":"Output form of `content`."},"includeImages":{"type":"boolean","default":true,"description":"Keep images as ![alt](src)."},"includeLinks":{"type":"boolean","default":true,"description":"Keep links as [text](url)."},"maxChars":{"type":"integer","minimum":100,"maximum":2000000,"description":"Truncate content at this many characters, on a word boundary."}},"additionalProperties":false},"example":{"urls":["https://example.com/","https://example.org/"],"maxChars":20000}}}},"responses":{"200":{"description":"Success. Settled; `PAYMENT-RESPONSE` carries the receipt.","headers":{"PAYMENT-RESPONSE":{"description":"Base64 JSON settlement receipt.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"},"succeeded":{"type":"integer"},"failed":{"type":"integer"},"pricePerUrl":{"type":"string"},"totalCharged":{"type":"string"},"results":{"type":"array","items":{"allOf":[{"type":"object","properties":{"ok":{"type":"boolean"}}},{"type":"object","properties":{"url":{"type":"string","format":"uri"},"finalUrl":{"type":"string","format":"uri","description":"URL after redirects."},"title":{"type":["string","null"]},"byline":{"type":["string","null"],"description":"Author, if discoverable."},"publishedAt":{"type":["string","null"],"description":"ISO 8601 when parseable."},"siteName":{"type":["string","null"]},"lang":{"type":["string","null"]},"excerpt":{"type":["string","null"]},"content":{"type":"string","description":"The extracted body in `contentFormat`."},"contentFormat":{"type":"string","enum":["markdown","text","html"]},"wordCount":{"type":"integer"},"readingTimeMinutes":{"type":"integer"},"truncated":{"type":"boolean"},"meta":{"type":"object","properties":{"description":{"type":["string","null"]},"ogImage":{"type":["string","null"],"format":"uri"},"favicon":{"type":["string","null"],"format":"uri"},"canonical":{"type":["string","null"],"format":"uri"},"type":{"type":["string","null"]},"section":{"type":["string","null"]},"keywords":{"type":["array","null"],"items":{"type":"string"}},"modifiedAt":{"type":["string","null"]},"themeColor":{"type":["string","null"]},"contentType":{"type":"string"},"charset":{"type":"string"},"redirected":{"type":"array","items":{"type":"string","format":"uri"}}}},"extraction":{"type":"object","description":"Diagnostics: which strategy chose the content block.","properties":{"strategy":{"type":"string"},"container":{"type":["string","null"]},"linkDensity":{"type":"number"},"candidateTextChars":{"type":"integer"},"documentTextChars":{"type":"integer"},"images":{"type":"integer"},"links":{"type":"integer"},"htmlBytes":{"type":"integer"},"tokens":{"type":"integer"}}},"paidBy":{"type":["string","null"]}}}]}}}}}}},"400":{"description":"Invalid input. Rejected before payment — free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"402":{"description":"Payment required ($0.003 × n). The `PAYMENT-REQUIRED` header holds a base64 x402 v2 challenge.","headers":{"PAYMENT-REQUIRED":{"description":"Base64 JSON x402 PaymentRequired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object"}}}},"403":{"description":"Host refused by the SSRF guard. Free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"413":{"description":"Document or request too large. Free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"415":{"description":"Upstream served a non-document content type. Free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"502":{"description":"Upstream failed. Not settled — free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}},"504":{"description":"Upstream timed out. Not settled — free.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}}}}}}}},"/health":{"get":{"tags":["free"],"operationId":"health","summary":"Health check — free","responses":{"200":{"description":"Alive.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"service":{"type":"string"},"version":{"type":"string"}}},"example":{"ok":true,"service":"readable","version":"1.0.0"}}}}}}},"/openapi.json":{"get":{"tags":["free"],"operationId":"openapi","summary":"This document — free","responses":{"200":{"description":"OpenAPI 3.1 document.","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/":{"get":{"tags":["free"],"operationId":"landing","summary":"Human-readable documentation — free","responses":{"200":{"description":"HTML documentation.","content":{"text/html":{"schema":{"type":"string"}}}}}}}},"components":{"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"upstreamStatus":{"type":"integer"},"contentType":{"type":"string"},"finalUrl":{"type":"string","format":"uri"}}}}},"ExtractResult":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"finalUrl":{"type":"string","format":"uri","description":"URL after redirects."},"title":{"type":["string","null"]},"byline":{"type":["string","null"],"description":"Author, if discoverable."},"publishedAt":{"type":["string","null"],"description":"ISO 8601 when parseable."},"siteName":{"type":["string","null"]},"lang":{"type":["string","null"]},"excerpt":{"type":["string","null"]},"content":{"type":"string","description":"The extracted body in `contentFormat`."},"contentFormat":{"type":"string","enum":["markdown","text","html"]},"wordCount":{"type":"integer"},"readingTimeMinutes":{"type":"integer"},"truncated":{"type":"boolean"},"meta":{"type":"object","properties":{"description":{"type":["string","null"]},"ogImage":{"type":["string","null"],"format":"uri"},"favicon":{"type":["string","null"],"format":"uri"},"canonical":{"type":["string","null"],"format":"uri"},"type":{"type":["string","null"]},"section":{"type":["string","null"]},"keywords":{"type":["array","null"],"items":{"type":"string"}},"modifiedAt":{"type":["string","null"]},"themeColor":{"type":["string","null"]},"contentType":{"type":"string"},"charset":{"type":"string"},"redirected":{"type":"array","items":{"type":"string","format":"uri"}}}},"extraction":{"type":"object","description":"Diagnostics: which strategy chose the content block.","properties":{"strategy":{"type":"string"},"container":{"type":["string","null"]},"linkDensity":{"type":"number"},"candidateTextChars":{"type":"integer"},"documentTextChars":{"type":"integer"},"images":{"type":"integer"},"links":{"type":"integer"},"htmlBytes":{"type":"integer"},"tokens":{"type":"integer"}}},"paidBy":{"type":["string","null"]}}},"ExtractRequest":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"Absolute http(s) URL of the page to extract."},"format":{"type":"string","enum":["markdown","text","html"],"default":"markdown","description":"Output form of `content`."},"includeImages":{"type":"boolean","default":true,"description":"Keep images as ![alt](src)."},"includeLinks":{"type":"boolean","default":true,"description":"Keep links as [text](url)."},"maxChars":{"type":"integer","minimum":100,"maximum":2000000,"description":"Truncate content at this many characters, on a word boundary."}},"additionalProperties":false}},"securitySchemes":{"x402":{"type":"http","scheme":"x402","description":"x402 v2 micropayment. Unpaid requests receive 402 with a base64 PAYMENT-REQUIRED challenge (USDC on Base, CAIP-2 eip155:8453). Sign an EIP-3009 authorisation and resend it in PAYMENT-SIGNATURE."}}}}