{"openapi":"3.1.0","info":{"title":"402utils — pay-per-call API utilities","version":"1.0.0","description":"Micro API utilities for AI agents and apps, priced per call and paid in USDC over the x402 protocol. Every endpoint returns HTTP 402 with x402 payment requirements; pay and retry to get the result. No signup, no API keys.","x-guidance":"Every endpoint is paid per call via the x402 protocol — settlement is USDC on Base, no signup or API keys. Call any endpoint to receive an HTTP 402 whose base64 PAYMENT-REQUIRED response header carries the payment requirements (network, asset, amount, payTo); pay with an x402 client and retry the same request to get the result. Prices below are advisory USD; the live 402 challenge is authoritative.","contact":{"url":"https://402utils.com","email":"dev@402utils.com"}},"servers":[{"url":"https://402utils.com"}],"paths":{"/v1/echo":{"post":{"operationId":"echo","summary":"Echoes back the JSON body you send, with a server timestamp. Useful for verifying your x402 client integration end to end.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.001"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"echo":{"type":"object","description":"The JSON object you sent, unchanged.","additionalProperties":true},"ts":{"type":"string","format":"date-time","description":"Server time (ISO 8601)."}},"required":["echo","ts"],"additionalProperties":false},"example":{"echo":{"msg":"hello farm"},"ts":"2026-07-03T12:00:00.000Z"}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Any JSON object; it is returned verbatim in the response.","additionalProperties":true},"example":{"msg":"hello farm"}}}}}},"/v1/pdf":{"post":{"operationId":"pdf","summary":"Render HTML or a public web page into a pixel-perfect PDF using a headless Chrome browser. Send inline `html` (invoices, receipts, reports, tickets) or a `url` to snapshot; control paper size, orientation, margins, background graphics and scale. Returns the raw application/pdf bytes — no signup, no browser to run, pay per document.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.01"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"string","format":"binary","contentMediaType":"application/pdf","description":"The HTTP response body is the raw PDF (Content-Type: application/pdf, Content-Disposition: inline; filename=\"document.pdf\")."},"example":"<binary application/pdf stream>"}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Provide exactly one of `html` or `url`.","properties":{"html":{"type":"string","description":"Inline HTML document to render (max 1 MB). Mutually exclusive with url."},"url":{"type":"string","format":"uri","description":"Public http(s) URL to render. Mutually exclusive with html."},"format":{"type":"string","enum":["A4","Letter","Legal"],"default":"A4","description":"Paper size."},"landscape":{"type":"boolean","default":false,"description":"Landscape orientation."},"margin":{"type":"object","description":"Page margins in millimetres (0–100 each).","properties":{"top":{"type":"number"},"right":{"type":"number"},"bottom":{"type":"number"},"left":{"type":"number"}}},"printBackground":{"type":"boolean","default":true,"description":"Print CSS background colours and images."},"scale":{"type":"number","minimum":0.5,"maximum":2,"description":"Render scale factor."},"waitUntil":{"type":"string","enum":["load","networkidle"],"default":"load","description":"When to consider the page ready. Use 'networkidle' for JS-heavy pages."}}},"example":{"html":"<html><body><h1>Invoice #1042</h1><table><tr><td>Item</td><td>$20.00</td></tr></table></body></html>","format":"A4","printBackground":true}}}}}},"/v1/screenshot":{"post":{"operationId":"screenshot","summary":"Capture a screenshot of any public web page with a headless Chrome browser. Set the viewport, grab the full scrollable page or just the fold, and choose PNG, JPEG or WebP with an optional quality. Returns the raw image bytes — ideal for link previews, thumbnails, visual monitoring and archiving. No browser to run, pay per capture.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.008"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"string","format":"binary","contentMediaType":"image/png","description":"The HTTP response body is the raw image (Content-Type image/png, image/jpeg or image/webp)."},"example":"<binary image/png stream>"}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Screenshot a public http(s) URL.","properties":{"url":{"type":"string","format":"uri","description":"Public http(s) URL to capture (required)."},"viewport":{"type":"object","description":"Browser viewport in pixels (each side 320–2560). Default 1280×800.","properties":{"width":{"type":"integer","minimum":320,"maximum":2560},"height":{"type":"integer","minimum":320,"maximum":2560}}},"fullPage":{"type":"boolean","default":false,"description":"Capture the full scrollable page."},"format":{"type":"string","enum":["png","jpeg","webp"],"default":"png","description":"Image format."},"quality":{"type":"integer","minimum":1,"maximum":100,"description":"Compression quality (jpeg/webp only)."},"waitUntil":{"type":"string","enum":["load","networkidle"],"default":"load","description":"When to consider the page ready. Use 'networkidle' for JS-heavy pages."},"delayMs":{"type":"integer","minimum":0,"maximum":5000,"description":"Extra wait after load before capturing (animations, lazy content)."}},"required":["url"]},"example":{"url":"https://example.com","fullPage":true,"format":"png"}}}}}},"/v1/og-image":{"post":{"operationId":"og-image","summary":"Generate a polished Open Graph / social share image (PNG) from text — no browser, no design tools. Pick a template (article, product, stat), pass a title and optional subtitle, set your brand accent colour and light/dark theme, and get back a crisp 1200×630 PNG ready for og:image, Twitter cards, blog headers and launch posts. Rendered with Satori + resvg; fast and cheap.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.003"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"string","format":"binary","contentMediaType":"image/png","description":"The HTTP response body is the raw PNG (Content-Type: image/png), 1200×630 by default."},"example":"<binary image/png stream, 1200×630>"}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Text + style for the card. Only `template` and `title` are required.","properties":{"template":{"type":"string","enum":["article","product","stat"],"default":"article","description":"Layout style."},"title":{"type":"string","maxLength":120,"description":"Headline (required, ≤120 chars)."},"subtitle":{"type":"string","maxLength":200,"description":"Optional supporting line / label."},"accent":{"type":"string","description":"Accent colour as hex, e.g. #2FBF71."},"theme":{"type":"string","enum":["light","dark"],"default":"light","description":"Colour theme."},"width":{"type":"integer","minimum":320,"maximum":2400,"default":1200},"height":{"type":"integer","minimum":320,"maximum":2400,"default":630}},"required":["title"]},"example":{"template":"article","title":"Announcing the Monetization Gateway","subtitle":"Charge for any resource behind Cloudflare via x402","accent":"#2FBF71","theme":"dark"}}}}}},"/v1/vat-check":{"get":{"operationId":"vat-check","summary":"Validate an EU VAT number against the official VIES registry before invoicing, onboarding or a reverse charge. Per-country syntax is checked locally first, so invalid formats never touch the network. Valid numbers return the registered company name and address when disclosed, plus an optional consultation number (requesterVat). Never a false 'invalid': if VIES is down you get a 503 and are not charged. ?attest=1 → Ed25519-signed.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"valid":{"type":"boolean"},"countryCode":{"type":"string"},"vatNumber":{"type":"string"},"reason":{"type":"string","description":"Present when valid=false due to local syntax: 'invalid_format'."},"name":{"type":"string"},"address":{"type":"string"},"consultationNumber":{"type":"string","description":"Official proof-of-check id (only with requesterVat)."},"cached":{"type":"boolean","description":"True if served from the 24h positive-result cache."},"checkedAt":{"type":"string","format":"date-time"},"source":{"type":"string","const":"VIES"},"attestation":{"type":"object","description":"Present only with ?attest=1. Ed25519 signature over the canonical result; verify against /.well-known/402utils-attestation.json.","properties":{"payload":{"type":"object","properties":{"endpoint":{"type":"string"},"resultSha256":{"type":"string","description":"SHA-256 of the canonical JSON of the result (attestation excluded)."},"ts":{"type":"string","format":"date-time"},"kid":{"type":"string","description":"Key id — matches a key in the .well-known document."}}},"sig":{"type":"string","description":"base64url Ed25519 signature over the canonical JSON of payload."},"alg":{"type":"string","const":"Ed25519"}}}},"required":["valid","countryCode","vatNumber","checkedAt","source"]},"example":{"valid":true,"countryCode":"IE","vatNumber":"6388047V","name":"GOOGLE IRELAND LIMITED","address":"3RD FLOOR, GORDON HOUSE, BARROW STREET, DUBLIN 4","checkedAt":"2026-07-04T00:01:15.462Z","source":"VIES"}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"vat","in":"query","required":false,"description":"Full VAT number incl. country prefix, e.g. FR40303265045.","schema":{"type":"string","description":"Full VAT number incl. country prefix, e.g. FR40303265045."}},{"name":"country","in":"query","required":false,"description":"Member state code (alternative to `vat`).","schema":{"type":"string","description":"Member state code (alternative to `vat`)."}},{"name":"number","in":"query","required":false,"description":"VAT number without prefix (with `country`).","schema":{"type":"string","description":"VAT number without prefix (with `country`)."}},{"name":"requesterVat","in":"query","required":false,"description":"Your own VAT number, to receive an official consultation number.","schema":{"type":"string","description":"Your own VAT number, to receive an official consultation number."}},{"name":"attest","in":"query","required":false,"description":"Set to 1 for an Ed25519-signed attestation of the result (audit trail).","schema":{"type":"string","description":"Set to 1 for an Ed25519-signed attestation of the result (audit trail)."}}]}},"/v1/vat-rates":{"get":{"operationId":"vat-rates","summary":"Look up current VAT rates for any EU member state — standard, reduced, super-reduced and parking rates plus the currency — from the European Commission's official figures. Filter to one rate category if you only need one. Ideal for pricing, invoicing and tax-calculation logic that must apply the right rate per country. Returns the source and date verified. ?attest=1 → Ed25519-signed.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.001"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"country":{"type":"string"},"rates":{"type":"object","properties":{"standard":{"type":"number"},"reduced":{"type":"array","items":{"type":"number"}},"superReduced":{"type":"number"},"parking":{"type":"number"}}},"currency":{"type":"string","description":"ISO 4217 currency code."},"asOf":{"type":"string","format":"date","description":"Situation date of the source figures."},"source":{"type":"string","format":"uri"},"lastVerified":{"type":"string","format":"date"},"attestation":{"type":"object","description":"Present only with ?attest=1. Ed25519 signature over the canonical result; verify against /.well-known/402utils-attestation.json.","properties":{"payload":{"type":"object","properties":{"endpoint":{"type":"string"},"resultSha256":{"type":"string","description":"SHA-256 of the canonical JSON of the result (attestation excluded)."},"ts":{"type":"string","format":"date-time"},"kid":{"type":"string","description":"Key id — matches a key in the .well-known document."}}},"sig":{"type":"string","description":"base64url Ed25519 signature over the canonical JSON of payload."},"alg":{"type":"string","const":"Ed25519"}}}},"required":["country","rates","currency","asOf","source","lastVerified"]},"example":{"country":"FR","rates":{"standard":20,"reduced":[5.5,10],"superReduced":2.1},"currency":"EUR","asOf":"2026-05-19","source":"https://europa.eu/youreurope/business/taxation/vat/vat-rules-rates/index_en.htm","lastVerified":"2026-07-04"}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"country","in":"query","required":true,"description":"EU member state ISO code, e.g. FR, DE, HU.","schema":{"type":"string","description":"EU member state ISO code, e.g. FR, DE, HU."}},{"name":"category","in":"query","required":false,"description":"Optional: return only this rate category.","schema":{"type":"string","enum":["standard","reduced","super_reduced","parking"],"description":"Optional: return only this rate category."}},{"name":"attest","in":"query","required":false,"description":"Set to 1 for an Ed25519-signed attestation of the result (audit trail).","schema":{"type":"string","description":"Set to 1 for an Ed25519-signed attestation of the result (audit trail)."}}]}},"/v1/iban-check":{"get":{"operationId":"iban-check","summary":"Validate an IBAN structurally before you pay or store it: ISO 7064 mod-97 check digits plus the official per-country length and BBAN layout (~90 countries), returning the bank/branch/account breakdown for FR, DE, ES, IT, BE and NL. Structural validation only — no BIC directory lookup (SWIFT's BIC registry is proprietary) and no proof the account exists. Local, instant. ?attest=1 → Ed25519-signed.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.001"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"valid":{"type":"boolean","description":"formatValid AND checkDigitsValid."},"country":{"type":"string","description":"ISO country code from the first two characters."},"checkDigitsValid":{"type":"boolean","description":"ISO 7064 mod-97 result."},"formatValid":{"type":"boolean","description":"Known country code and correct total length."},"bban":{"type":"string","description":"Basic Bank Account Number (the IBAN minus country + check digits)."},"bankCode":{"type":"string","description":"Present for FR/DE/ES/IT/BE/NL."},"branchCode":{"type":"string"},"accountNumber":{"type":"string"},"length":{"type":"integer"},"attestation":{"type":"object","description":"Present only with ?attest=1. Ed25519 signature over the canonical result; verify against /.well-known/402utils-attestation.json.","properties":{"payload":{"type":"object","properties":{"endpoint":{"type":"string"},"resultSha256":{"type":"string","description":"SHA-256 of the canonical JSON of the result (attestation excluded)."},"ts":{"type":"string","format":"date-time"},"kid":{"type":"string","description":"Key id — matches a key in the .well-known document."}}},"sig":{"type":"string","description":"base64url Ed25519 signature over the canonical JSON of payload."},"alg":{"type":"string","const":"Ed25519"}}}},"required":["valid","country","checkDigitsValid","formatValid","bban","length"],"additionalProperties":false},"example":{"valid":true,"country":"FR","checkDigitsValid":true,"formatValid":true,"bban":"30006000011234567890189","bankCode":"30006","branchCode":"00001","accountNumber":"12345678901","length":27}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"iban","in":"query","required":true,"description":"The IBAN to validate, e.g. FR7630006000011234567890189.","schema":{"type":"string","description":"The IBAN to validate, e.g. FR7630006000011234567890189."}},{"name":"attest","in":"query","required":false,"description":"Set to 1 for an Ed25519-signed attestation of the result (audit trail).","schema":{"type":"string","description":"Set to 1 for an Ed25519-signed attestation of the result (audit trail)."}}]}},"/v1/qr":{"post":{"operationId":"qr","summary":"Generate a QR code as PNG or SVG from any text or URL. Pick the size, error-correction level (L/M/Q/H) and foreground/background colours; a 4-module quiet zone is always included so it scans reliably. Returns the raw image bytes. No logo overlay (compositing is out of scope).","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"string","format":"binary","contentMediaType":"image/png","description":"The response body is the raw QR image (Content-Type image/png or image/svg+xml)."},"example":"<binary image/png stream>"}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"QR content and styling.","properties":{"data":{"type":"string","description":"Text or URL to encode (max 2 KB)."},"size":{"type":"integer","minimum":128,"maximum":1024,"default":512,"description":"Output size in px."},"format":{"type":"string","enum":["png","svg"],"default":"png"},"ecLevel":{"type":"string","enum":["L","M","Q","H"],"default":"M","description":"Error-correction level."},"fg":{"type":"string","description":"Foreground hex colour (default #000000)."},"bg":{"type":"string","description":"Background hex colour (default #ffffff)."}},"required":["data"]},"example":{"data":"https://402utils.com","size":512,"ecLevel":"M"}}}}}},"/v1/ics":{"post":{"operationId":"ics","summary":"Build a strictly RFC 5545-conformant .ics calendar file from a list of events: correct TEXT escaping, 75-octet line folding, generated UIDs, and unambiguous UTC timestamps (a per-event IANA timezone interprets naive wall-clock times). Supports all-day events, location, description and a passthrough RRULE. The fiddly conformance an agent shouldn't hand-roll.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"string","format":"binary","contentMediaType":"text/calendar","description":"The response body is the .ics file (Content-Type text/calendar)."},"example":"BEGIN:VCALENDAR\r\nVERSION:2.0\r\n…\r\nEND:VCALENDAR\r\n"}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"One or more calendar events.","properties":{"events":{"type":"array","description":"Events (1–100).","items":{"type":"object","properties":{"title":{"type":"string"},"start":{"type":"string","description":"ISO date or date-time."},"end":{"type":"string"},"allDay":{"type":"boolean"},"location":{"type":"string"},"description":{"type":"string"},"timezone":{"type":"string","description":"IANA tz for naive times, e.g. Europe/Paris."},"rrule":{"type":"string","description":"RFC 5545 RRULE value, passthrough."}},"required":["title","start"]}},"calendarName":{"type":"string"}},"required":["events"]},"example":{"calendarName":"Launch","events":[{"title":"402utils launch","start":"2026-07-10T14:00:00","end":"2026-07-10T15:00:00","timezone":"Europe/Paris","location":"Online"}]}}}}}},"/v1/email-check":{"get":{"operationId":"email-check","summary":"Validate an email address before you accept a signup or send to it: RFC 5322 syntax, whether the domain resolves and its MX records, whether it is a disposable/throwaway domain (community blocklist), and whether it is a role account (info@, support@…). DNS is checked over DoH. No SMTP probing (intrusive and spammy), so a true 'domainExists' does not guarantee the mailbox exists.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.003"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string"},"syntaxValid":{"type":"boolean"},"domainExists":{"type":"boolean","description":"Best-effort: domain has MX or A records (DoH)."},"mxRecords":{"type":"array","items":{"type":"string"}},"disposable":{"type":"boolean","description":"Domain is on the disposable-email blocklist."},"roleAccount":{"type":"boolean","description":"Local part is a role address (info, support…)."},"checkedAt":{"type":"string","format":"date-time"}},"required":["email","syntaxValid","domainExists","mxRecords","disposable","roleAccount","checkedAt"]},"example":{"email":"user@example.com","syntaxValid":true,"domainExists":true,"mxRecords":["mx1.example.com"],"disposable":false,"roleAccount":false,"checkedAt":"2026-07-04T00:00:00.000Z"}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"email","in":"query","required":true,"description":"The email address to validate (required).","schema":{"type":"string","format":"email","description":"The email address to validate (required)."}}]}},"/v1/rss-to-json":{"get":{"operationId":"rss-to-json","summary":"Fetch an RSS 2.0 or Atom feed and return clean JSON: feed title, link and description, plus items with title, link, ISO-8601 publishedAt, summary and author. Handles both formats and normalises the dates. The caller-supplied URL is SSRF-checked; the fetch is capped at 2 MB and 8 s.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"link":{"type":"string"},"description":{"type":"string"},"items":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"link":{"type":"string"},"publishedAt":{"type":"string","format":"date-time"},"summary":{"type":"string"},"author":{"type":"string"}},"required":["title","link"]}}},"required":["title","link","items"]},"example":{"title":"The Cloudflare Blog","link":"https://blog.cloudflare.com/","items":[{"title":"A post","link":"https://blog.cloudflare.com/a-post/","publishedAt":"2026-07-01T10:00:00.000Z"}]}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"url","in":"query","required":true,"description":"Public http(s) feed URL (required).","schema":{"type":"string","format":"uri","description":"Public http(s) feed URL (required)."}},{"name":"limit","in":"query","required":false,"description":"Max items.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50,"description":"Max items."}}]}},"/v1/pdf-extract":{"post":{"operationId":"pdf-extract","summary":"Extract text from a PDF: send the PDF bytes directly, or a JSON body with a public {url}. Returns the full text, per-page text, and metadata (page count, title, author). Text layer only — scanned/image-only PDFs return empty text with a no_text_layer warning (no OCR). Max 10 MB.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.005"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string"},"pages":{"type":"array","items":{"type":"object","properties":{"page":{"type":"integer"},"text":{"type":"string"}},"required":["page","text"]}},"meta":{"type":"object","properties":{"pageCount":{"type":"integer"},"title":{"type":"string"},"author":{"type":"string"}},"required":["pageCount"]},"warning":{"type":"string","description":"'no_text_layer' when the PDF has no extractable text (scanned)."}},"required":["text","pages","meta"]},"example":{"text":"Invoice #1042 …","pages":[{"page":1,"text":"Invoice #1042 …"}],"meta":{"pageCount":1,"title":"Invoice"}}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Either raw PDF bytes (Content-Type application/pdf) OR a JSON body { url }.","properties":{"url":{"type":"string","format":"uri","description":"Public http(s) URL of a PDF (alternative to sending bytes)."}}},"example":{"url":"https://example.com/document.pdf"}}}}}},"/v1/image-optimize":{"post":{"operationId":"image-optimize","summary":"Resize and convert an image (PNG, JPEG or WebP, up to 10 MB). Send the image bytes as the body and set options in the query: width, height, fit (contain or cover), format (webp/jpeg/png) and quality (JPEG). Returns the converted image bytes. WebP has no quality knob and AVIF is not supported (out of scope).","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.004"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"string","format":"binary","contentMediaType":"image/webp","description":"The response body is the converted image (Content-Type image/webp, image/jpeg or image/png)."},"example":"<binary image stream>"}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Image bytes in the body; options in the query string.","properties":{"width":{"type":"integer","minimum":1,"maximum":4096},"height":{"type":"integer","minimum":1,"maximum":4096},"fit":{"type":"string","enum":["contain","cover"],"default":"contain"},"format":{"type":"string","enum":["webp","jpeg","png"],"default":"webp"},"quality":{"type":"integer","minimum":1,"maximum":100,"description":"JPEG quality (ignored for webp/png)."}}},"example":{"width":800,"format":"webp"}}}}}},"/v1/csv-to-json":{"post":{"operationId":"csv-to-json","summary":"Convert CSV to JSON with a strict RFC 4180 parser: quoted fields, doubled quotes, delimiters and line breaks inside quotes, mixed CRLF/LF, BOM. Auto-detects comma, semicolon, tab or pipe (or set delimiter). First row becomes object keys; headers:false yields string arrays. Ragged rows and unterminated quotes are repaired and reported in errors[], never a crash. All values stay strings. Send raw CSV text or JSON {csv}. Max 5 MB.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","description":"Parsed CSV. All values are strings — no type coercion.","properties":{"headers":{"type":["array","null"],"items":{"type":"string"},"description":"Resolved header names (deduplicated), or null when headers:false."},"rows":{"type":"array","description":"Data rows: objects keyed by header name (headers:true) or arrays of raw fields (headers:false). Every value is a string.","items":{"oneOf":[{"type":"object","additionalProperties":{"type":"string"}},{"type":"array","items":{"type":"string"}}]}},"rowCount":{"type":"integer","description":"Number of data rows returned."},"delimiter":{"type":"string","description":"Delimiter actually used (given or auto-detected)."},"errors":{"type":"array","description":"Recoverable parse problems: field-count mismatches (missing fields set to \"\", extra fields dropped) and an unterminated quote at EOF. row is the 1-based data row number (0 = header row). Mismatch reports cap at 100, then one summary entry.","items":{"type":"object","properties":{"row":{"type":"integer","description":"1-based data row number (0 = header row)."},"message":{"type":"string"}},"required":["row","message"]}}},"required":["headers","rows","rowCount","delimiter","errors"]},"example":{"headers":["name","city","signup"],"rows":[{"name":"Dupont, Jean","city":"Paris","signup":"2026-05-01"},{"name":"Müller, Anna","city":"Berlin","signup":"2026-06-12"}],"rowCount":2,"delimiter":";","errors":[]}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"JSON envelope mode (Content-Type: application/json). Alternatively POST the raw CSV text with any other Content-Type (e.g. text/csv): headers then default to true and the delimiter is auto-detected.","properties":{"csv":{"type":"string","description":"CSV text, max 5 MB UTF-8. A leading BOM is stripped; CRLF and LF row endings may be mixed."},"delimiter":{"type":"string","enum":[",",";","\t","|"],"description":"Field delimiter. Omit to auto-detect from the first 20 records (quote-aware field-count consistency; ties prefer comma)."},"headers":{"type":"boolean","default":true,"description":"true (default): the first record is the header row and rows are objects — duplicate header names get _2/_3 suffixes, empty names become col_<n>. false: rows are string arrays and headers is null."}},"required":["csv"]},"example":{"csv":"name;city;signup\n\"Dupont, Jean\";Paris;2026-05-01\n\"Müller, Anna\";Berlin;2026-06-12","headers":true}}}}}},"/v1/json-to-csv":{"post":{"operationId":"json-to-csv","summary":"Convert a JSON array of objects into a clean RFC 4180 CSV: header row, CRLF records, correct quoting and quote-doubling. Nested objects flatten to dot-notation columns (a.b.c), arrays are JSON-encoded into their cell, and you can select and order columns explicitly. Delimiter: comma, semicolon, tab or pipe. Caps: 100,000 rows, 5 MB body, 20 MB CSV out. Returns text/csv ready for Excel, Google Sheets or a data pipeline.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"string","contentMediaType":"text/csv","description":"The response body is the CSV file (Content-Type: text/csv; charset=utf-8, Content-Disposition: attachment; filename=\"data.csv\"). CRLF record separators, trailing CRLF included."},"example":"name,city,stats.score,stats.active,tags\r\nJeanne d'Arc,Orléans,9.5,true,\r\nJosé,,,,\"[\"\"vip\"\",\"\"beta\"\"]\"\r\n"}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Either this object form, or the bare `rows` array itself as the whole JSON body (defaults then apply).","properties":{"rows":{"type":"array","description":"1–100,000 plain JSON objects, one per CSV record. Nested objects flatten to dot-notation column names; arrays are JSON-encoded into their cell; null becomes an empty cell.","items":{"type":"object"},"minItems":1,"maxItems":100000},"delimiter":{"type":"string","enum":[",",";","\t","|"],"default":",","description":"Field separator."},"columns":{"type":"array","items":{"type":"string"},"description":"Optional column selection and order (flattened dot-notation names). Unknown names produce empty cells. Omit to use the union of all flattened row keys in first-seen order."}},"required":["rows"]},"example":{"rows":[{"name":"Jeanne d'Arc","city":"Orléans","stats":{"score":9.5,"active":true}},{"name":"José","tags":["vip","beta"]}],"delimiter":","}}}}}},"/v1/xml-to-json":{"post":{"operationId":"xml-to-json","summary":"Convert XML to clean JSON. POST raw XML (XML or text/plain Content-Type) or a JSON envelope {xml, alwaysArray}. Attributes land under \"@_\" keys, mixed-content text under \"#text\", repeated siblings become arrays, and alwaysArray forces arrays for listed tags even on a single occurrence. Numeric character references decode. DTD entities and DOCTYPE internal subsets rejected (anti-XXE / billion-laughs). Max 5 MB.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","description":"The converted document.","properties":{"json":{"type":"object","description":"Parsed document keyed by the root tag. Attributes are kept under \"@_\"-prefixed keys, text of mixed content under \"#text\", repeated siblings become arrays; numeric- and boolean-looking values are coerced to numbers/booleans."},"root":{"type":"string","description":"Root tag name."}},"required":["json","root"]},"example":{"json":{"order":{"@_id":"A-17","item":[{"#text":"Café grinder","@_sku":"X1"},{"#text":"Filter","@_sku":"X2"}]}},"root":"order"}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"JSON envelope. Alternatively POST the raw XML document directly with an XML or text/plain Content-Type (no envelope needed).","properties":{"xml":{"type":"string","description":"XML document to convert. Max 5 MB UTF-8. DTD entity declarations and DOCTYPE internal subsets are rejected (422)."},"alwaysArray":{"type":"array","items":{"type":"string"},"description":"Tag names that must always parse as arrays, even when only one occurrence exists (max 100)."}},"required":["xml"]},"example":{"xml":"<order id=\"A-17\"><item sku=\"X1\">Café grinder</item><item sku=\"X2\">Filter</item></order>","alwaysArray":["item"]}}}}}},"/v1/yaml":{"post":{"operationId":"yaml","summary":"Convert between YAML and JSON in one call. to:\"json\" parses a YAML document (config files, docker-compose, Kubernetes manifests, CI pipelines) into a plain JSON value; to:\"yaml\" renders any JSON value as clean block-style YAML. Hardened: safe core schema (tags like !!js/function never execute), alias bombs rejected, one document per call, parse errors return line/column. YAML input up to 2 MB UTF-8.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.001"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","description":"Conversion result.","properties":{"result":{"description":"With to:\"json\": the parsed document as a JSON value (object, array, string, number, boolean or null). With to:\"yaml\": the YAML text as a string."}},"required":["result"]},"example":{"result":{"services":{"web":{"image":"nginx:1.29","ports":["80:80"]}}}}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Conversion request.","properties":{"input":{"description":"The value to convert. With to:\"json\": a single YAML document as a string, max 2 MB UTF-8. With to:\"yaml\": any JSON value; a string is first parsed as JSON text."},"to":{"type":"string","enum":["json","yaml"],"description":"Target format: \"json\" parses YAML text, \"yaml\" emits YAML text."}},"required":["input","to"]},"example":{"to":"json","input":"services:\n  web:\n    image: nginx:1.29\n    ports:\n      - \"80:80\"\n"}}}}}},"/v1/md-to-html":{"post":{"operationId":"md-to-html","summary":"Convert Markdown to sanitized HTML that is safe to embed directly in a page, email or app. GFM supported: tables, task lists, strikethrough, fenced code. Output passes a strict tag/attribute allowlist: scripts, styles, iframes, event handlers and javascript: URLs are removed; links keep only http(s)/mailto targets, images only http(s) or base64 image data URIs. Send JSON {markdown} or a raw text/markdown body, max 2 MB. Returns {html}.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"html":{"type":"string","description":"Sanitized HTML fragment (strict allowlist, no scripts/handlers/unsafe URLs), safe to embed."}},"required":["html"]},"example":{"html":"<h1>Release notes</h1>\n<ul>\n<li><input checked=\"\" disabled=\"\" type=\"checkbox\"> Ship the <em>v2</em> API</li>\n<li><input disabled=\"\" type=\"checkbox\"> Update docs</li>\n</ul>\n<table>\n<thead>\n<tr>\n<th align=\"left\">Feature</th>\n<th align=\"right\">Status</th>\n</tr>\n</thead>\n<tbody><tr>\n<td align=\"left\">Auth</td>\n<td align=\"right\">done</td>\n</tr>\n</tbody></table>\n<p><del>Old plan</del> — see <a href=\"https://example.com/docs\">the docs</a>.</p>\n"}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"JSON body. Alternatively send the raw Markdown as the request body with Content-Type text/markdown or text/plain.","properties":{"markdown":{"type":"string","description":"Markdown source (GitHub Flavored Markdown). Max 2 MB UTF-8."}},"required":["markdown"]},"example":{"markdown":"# Release notes\n\n- [x] Ship the *v2* API\n- [ ] Update docs\n\n| Feature | Status |\n|:--------|-------:|\n| Auth | done |\n\n~~Old plan~~ — see [the docs](https://example.com/docs)."}}}}}},"/v1/html-to-md":{"post":{"operationId":"html-to-md","summary":"Convert raw HTML into clean GitHub-Flavored Markdown: ATX headings, fenced code, pipe tables, strikethrough, task lists; script/style/iframe text is always stripped. mode=article isolates the main article with Mozilla Readability (returns title, byline, excerpt; drops nav/footer boilerplate; resolves relative links), else converts the whole document. Converts provided HTML only — never fetches URLs. Max 5 MB.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.003"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"markdown":{"type":"string","description":"GitHub-Flavored Markdown (ATX headings, fenced code blocks, pipe tables, '-' bullets)."},"mode":{"type":"string","enum":["full","article"],"description":"The conversion mode that was requested."},"articleFound":{"type":"boolean","description":"Article mode only: true when Readability isolated a main article; false when the response fell back to full-document conversion."},"title":{"type":"string","description":"Article mode only: extracted article title (may be null)."},"byline":{"type":"string","description":"Article mode only: extracted author metadata (may be null)."},"excerpt":{"type":"string","description":"Article mode only: short excerpt or description (may be null)."}},"required":["markdown","mode"]},"example":{"markdown":"# Q3 results\n\nRevenue grew **18%**.\n\n| Region | Growth |\n| --- | --- |\n| EMEA | +21% |","mode":"full"}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"HTML in, Markdown out. The HTML is provided inline; nothing is fetched.","properties":{"html":{"type":"string","description":"HTML document or fragment to convert (non-empty, max 5 MB UTF-8)."},"mode":{"type":"string","enum":["full","article"],"default":"full","description":"'full' converts the whole document. 'article' first extracts the main content with Mozilla Readability — boilerplate (nav, footer, sidebars) is dropped, title/byline/excerpt are returned, and relative URLs are resolved against https://input.invalid/ so they stay recognisable; when no article is detected the response falls back to full-document conversion with articleFound=false."}},"required":["html"]},"example":{"html":"<h1>Q3 results</h1><p>Revenue grew <strong>18%</strong>.</p><table><thead><tr><th>Region</th><th>Growth</th></tr></thead><tbody><tr><td>EMEA</td><td>+21%</td></tr></tbody></table>","mode":"full"}}}}}},"/v1/html-tables":{"post":{"operationId":"html-tables","summary":"Extract every table from HTML you provide into clean JSON — no fetching, send the markup itself as {html} or a raw text/html body. Returns per table: optional caption, headers[] (from thead or an all-th first row) and rectangular rows[][]. colspan/rowspan cells are grid-expanded with the value duplicated so rows align with the visual layout; nested tables are flattened into the outer cell's text. Caps: 5 MB HTML, 200 tables, 200k cells.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"tables":{"type":"array","description":"One entry per top-level table, in document order.","items":{"type":"object","properties":{"caption":{"type":"string","description":"The table's <caption> text; omitted when absent."},"headers":{"type":"array","items":{"type":"string"},"description":"Header cells (first thead row, or an all-th first row); [] when the table has none."},"rows":{"type":"array","items":{"type":"array","items":{"type":"string"}},"description":"Rectangular body rows; spanned cells repeat their value so columns stay aligned."}},"required":["headers","rows"]}},"tableCount":{"type":"integer","description":"Number of top-level tables found (0 is a valid result)."}},"required":["tables","tableCount"]},"example":{"tables":[{"caption":"Q2 revenue","headers":["Product","Revenue"],"rows":[["Café filtre","€12,400"]]}],"tableCount":1}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"JSON { html } — or send the raw HTML directly with Content-Type text/html.","properties":{"html":{"type":"string","description":"The HTML document or fragment to extract tables from (max 5 MB UTF-8). Nothing is fetched."}},"required":["html"]},"example":{"html":"<table><caption>Q2 revenue</caption><thead><tr><th>Product</th><th>Revenue</th></tr></thead><tbody><tr><td>Café filtre</td><td>€12,400</td></tr></tbody></table>"}}}}}},"/v1/diff":{"post":{"operationId":"diff","summary":"Compute the diff between two texts (a → b) — no git needed. Returns a standard unified patch (line-oriented in both modes, applies with git apply or patch), added/removed counts, and in word mode a token-level change list for inline highlighting (capped at 2000 entries). CRLF line endings and missing trailing newlines are preserved byte-exactly. Caps: 1 MB UTF-8 per input; pathologically divergent inputs return 422 diff_too_complex.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","description":"Unified patch plus change statistics.","properties":{"identical":{"type":"boolean","description":"True when a and b are identical; patch is then empty."},"patch":{"type":"string","description":"Unified diff patch (--- a / +++ b headers). Line-oriented in both modes; empty when identical."},"stats":{"type":"object","description":"Counts in lines (mode line) or words (mode word).","properties":{"added":{"type":"integer","description":"Lines/words added in b."},"removed":{"type":"integer","description":"Lines/words removed from a."}},"required":["added","removed"]},"mode":{"type":"string","enum":["line","word"],"description":"Echo of the requested mode."},"changes":{"type":"array","description":"Word mode only (omitted when identical): token runs in order, capped at 2000 entries. Unchanged runs have added=removed=false.","items":{"type":"object","properties":{"value":{"type":"string","description":"Text of the run."},"added":{"type":"boolean"},"removed":{"type":"boolean"}},"required":["value","added","removed"]}},"truncated":{"type":"boolean","description":"Word mode only: true when `changes` was capped at 2000 entries."}},"required":["identical","patch","stats","mode"]},"example":{"identical":false,"patch":"===================================================================\n--- a\n+++ b\n@@ -1,2 +1,2 @@\n name: farm\n-price: 1 USDC\n+price: 2 USDC\n","stats":{"added":1,"removed":1},"mode":"line"}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Two texts to compare, byte-exactly (no line-ending normalization).","properties":{"a":{"type":"string","description":"Original text. Max 1 MB UTF-8."},"b":{"type":"string","description":"New text. Max 1 MB UTF-8."},"mode":{"type":"string","enum":["line","word"],"description":"Granularity of stats/changes. The patch is always a line-oriented unified diff. Default \"line\"."},"context":{"type":"integer","minimum":0,"maximum":10,"description":"Unchanged context lines around each patch hunk. Default 3."}},"required":["a","b"]},"example":{"a":"name: farm\nprice: 1 USDC\n","b":"name: farm\nprice: 2 USDC\n"}}}}}},"/v1/timezone-convert":{"get":{"operationId":"timezone-convert","summary":"Convert a datetime between any two IANA time zones using the runtime's ICU tzdb — always current, DST-correct, half-hour zones included. A datetime without offset is read as wall time in `from` (ambiguous fall-back times resolve to the earlier instant; times skipped by spring-forward shift ahead, flagged in `note`). Returns both ISO datetimes with offsets and DST status per side. Unknown zone → 400 with a spelling suggestion.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.001"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"type":"string","description":"The instant expressed in `from`, ISO with offset."},"output":{"type":"string","description":"The same instant expressed in `to`."},"fromOffset":{"type":"string","description":"UTC offset of `from` at that instant, ±HH:MM."},"toOffset":{"type":"string","description":"UTC offset of `to` at that instant."},"dstActive":{"type":"object","properties":{"from":{"type":"boolean"},"to":{"type":"boolean"}},"required":["from","to"],"description":"Whether daylight-saving time is in effect on each side."},"note":{"type":"string","description":"Present when the wall time was ambiguous or nonexistent in `from`."}},"required":["input","output","fromOffset","toOffset","dstActive"],"additionalProperties":false},"example":{"input":"2026-07-14T09:30:00+02:00","output":"2026-07-14T14:30:00+07:00","fromOffset":"+02:00","toOffset":"+07:00","dstActive":{"from":true,"to":false}}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"datetime","in":"query","required":false,"description":"ISO 8601. With Z/±HH:MM it is an absolute instant; without, wall time in `from`.","schema":{"type":"string","description":"ISO 8601. With Z/±HH:MM it is an absolute instant; without, wall time in `from`."}},{"name":"from","in":"query","required":true,"description":"Source IANA zone, e.g. Europe/Paris.","schema":{"type":"string","description":"Source IANA zone, e.g. Europe/Paris."}},{"name":"to","in":"query","required":true,"description":"Target IANA zone, e.g. Asia/Ho_Chi_Minh.","schema":{"type":"string","description":"Target IANA zone, e.g. Asia/Ho_Chi_Minh."}}]}},"/v1/cron-next":{"get":{"operationId":"cron-next","summary":"Next occurrences of a cron expression in any IANA time zone, DST-aware via the runtime's ICU tzdb (times skipped by DST shift forward by the gap; ambiguous times fire once). Dialect (croner): 5-7 fields with optional seconds and year, ranges, steps, lists, JAN-DEC/SUN-SAT names, L, W, #, ? and @daily-style aliases. Each occurrence is returned as local ISO with offset plus UTC. Bad expression → 400 naming the offending field.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"expr":{"type":"string"},"timezone":{"type":"string"},"from":{"type":"string","description":"The start instant in `timezone`, ISO with offset."},"count":{"type":"integer","description":"Number of occurrences actually returned."},"occurrences":{"type":"array","items":{"type":"object","properties":{"local":{"type":"string","description":"ISO in `timezone`, with offset."},"utc":{"type":"string"}},"required":["local","utc"]}},"note":{"type":"string","description":"Present when fewer occurrences exist than requested."}},"required":["expr","timezone","from","count","occurrences"],"additionalProperties":false},"example":{"expr":"*/15 9-17 * * 1-5","timezone":"Europe/Paris","from":"2026-07-03T18:50:00+02:00","count":2,"occurrences":[{"local":"2026-07-06T09:00:00+02:00","utc":"2026-07-06T07:00:00.000Z"},{"local":"2026-07-06T09:15:00+02:00","utc":"2026-07-06T07:15:00.000Z"}]}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"expr","in":"query","required":true,"description":"Cron expression, e.g. */15 9-17 * * 1-5.","schema":{"type":"string","description":"Cron expression, e.g. */15 9-17 * * 1-5."}},{"name":"tz","in":"query","required":false,"description":"IANA zone for evaluation (default UTC).","schema":{"type":"string","description":"IANA zone for evaluation (default UTC)."}},{"name":"count","in":"query","required":false,"description":"Occurrences to return, 1-50 (default 5).","schema":{"type":"integer","description":"Occurrences to return, 1-50 (default 5)."}},{"name":"from","in":"query","required":false,"description":"ISO 8601 start instant, exclusive (default now). Without an offset it is wall time in `tz`.","schema":{"type":"string","description":"ISO 8601 start instant, exclusive (default now). Without an offset it is wall time in `tz`."}}]}},"/v1/holidays":{"get":{"operationId":"holidays","summary":"Public and bank holidays for FR, DE, GB, US, ES, IT, NL, BE — years 2025-2027, each dataset verified against the country's official source (Etalab, Land statutes, gov.uk feed, OPM, BOE, normattiva, rijksoverheid, SPF Emploi). Movable feasts are computed (Gregorian computus), substitute days follow each country's official rule. Optional ?region= for sub-national holidays (German Länder, UK divisions, Alsace-Moselle).","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"country":{"type":"string"},"year":{"type":"integer"},"region":{"type":"string"},"holidays":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","description":"YYYY-MM-DD."},"name":{"type":"string","description":"English name."},"localName":{"type":"string"},"type":{"type":"string","description":"public | bank | observance."},"regions":{"type":"array","items":{"type":"string"},"description":"Present when the holiday is regional."},"note":{"type":"string"}},"required":["date","name","localName","type"]}},"note":{"type":"string","description":"Dataset-level caveat when applicable."}},"required":["country","year","holidays"],"additionalProperties":false},"example":{"country":"FR","year":2026,"holidays":[{"date":"2026-01-01","name":"New Year's Day","localName":"Jour de l'an","type":"public"},{"date":"2026-04-06","name":"Easter Monday","localName":"Lundi de Pâques","type":"public"}]}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"country","in":"query","required":true,"description":"ISO 3166-1 alpha-2: FR, DE, GB, US, ES, IT, NL, BE.","schema":{"type":"string","description":"ISO 3166-1 alpha-2: FR, DE, GB, US, ES, IT, NL, BE."}},{"name":"year","in":"query","required":true,"description":"2025-2027 (verified data window).","schema":{"type":"integer","description":"2025-2027 (verified data window)."}},{"name":"region","in":"query","required":false,"description":"Optional ISO 3166-2 region for regional holidays (e.g. DE-BY, GB-SCT, FR-57).","schema":{"type":"string","description":"Optional ISO 3166-2 region for regional holidays (e.g. DE-BY, GB-SCT, FR-57)."}}]}},"/v1/business-days":{"get":{"operationId":"business-days","summary":"Business-day math with real holiday calendars for FR, DE, GB, US, ES, IT, NL, BE (2025-2027, official sources — same datasets as /v1/holidays). Count working/weekend/holiday days in a date range (?from&to&country) or shift a date by N business days (?from&add=10&country). Weekend configurable (?weekend=fri,sat), optional ?region= for Länder/UK divisions. Holidays that suppress a working day are listed by name.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"country":{"type":"string"},"region":{"type":"string"},"weekend":{"type":"array","items":{"type":"string"}},"from":{"type":"string"},"to":{"type":"string","description":"Range mode only."},"calendarDays":{"type":"integer","description":"Range mode: total days, inclusive."},"businessDays":{"type":"integer","description":"Range mode: working days (not weekend, not public/bank holiday)."},"weekendDays":{"type":"integer"},"holidays":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string"},"name":{"type":"string"},"localName":{"type":"string"}},"required":["date","name","localName"]},"description":"Public/bank holidays on weekdays in range (the days actually deducted)."},"add":{"type":"integer","description":"Shift mode only."},"result":{"type":"string","description":"Shift mode: the date N business days after `from`."},"note":{"type":"string","description":"Dataset-level caveat when applicable."}},"required":["country","weekend","from"],"additionalProperties":false},"example":{"country":"FR","weekend":["sat","sun"],"from":"2026-07-01","to":"2026-07-31","calendarDays":31,"businessDays":22,"weekendDays":8,"holidays":[{"date":"2026-07-14","name":"Bastille Day","localName":"Fête nationale (14 juillet)"}]}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"country","in":"query","required":true,"description":"ISO 3166-1 alpha-2: FR, DE, GB, US, ES, IT, NL, BE.","schema":{"type":"string","description":"ISO 3166-1 alpha-2: FR, DE, GB, US, ES, IT, NL, BE."}},{"name":"from","in":"query","required":true,"description":"Start date, YYYY-MM-DD (2025-2027).","schema":{"type":"string","description":"Start date, YYYY-MM-DD (2025-2027)."}},{"name":"to","in":"query","required":false,"description":"Inclusive end date — range mode.","schema":{"type":"string","description":"Inclusive end date — range mode."}},{"name":"add","in":"query","required":false,"description":"Business days to add — shift mode (1-780).","schema":{"type":"integer","description":"Business days to add — shift mode (1-780)."}},{"name":"region","in":"query","required":false,"description":"Optional ISO 3166-2 region (e.g. DE-BY, GB-SCT).","schema":{"type":"string","description":"Optional ISO 3166-2 region (e.g. DE-BY, GB-SCT)."}},{"name":"weekend","in":"query","required":false,"description":"Comma list of weekend days (default sat,sun).","schema":{"type":"string","description":"Comma list of weekend days (default sat,sun)."}}]}},"/v1/country-info":{"get":{"operationId":"country-info","summary":"Country reference card by ISO code (alpha-2/alpha-3/numeric) or English name: ISO 3166 codes, official name, current ISO 4217 currency (Bulgaria = EUR since 2026-01-01), dialling prefix, IANA ccTLDs (incl. IDN), languages, EU/EEA/Schengen/euro-area membership and the EU VAT prefix (Greece = EL). 56 countries: EU-27, EEA/EFTA, GB, US + 24 majors. Compiled from ISO/IANA/ITU/europa.eu sources, dated `asOf`.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.001"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"iso2":{"type":"string"},"iso3":{"type":"string"},"numeric":{"type":"string","description":"3-digit ISO numeric code with leading zeros."},"name":{"type":"string"},"officialName":{"type":"string"},"currency":{"type":"object","properties":{"code":{"type":"string"},"symbol":{"type":"string"}},"required":["code","symbol"]},"phonePrefix":{"type":"string","description":"ITU E.164, e.g. +33."},"tlds":{"type":"array","items":{"type":"string"}},"languages":{"type":"array","items":{"type":"string"},"description":"ISO 639-1 codes."},"eu":{"type":"object","properties":{"member":{"type":"boolean"},"eea":{"type":"boolean"},"schengen":{"type":"boolean"},"euroZone":{"type":"boolean"}},"required":["member","eea","schengen","euroZone"]},"vatPrefix":{"type":"string","description":"EU members only; Greece = EL."},"note":{"type":"string"},"asOf":{"type":"string","description":"Date the dataset was last verified."}},"required":["iso2","iso3","numeric","name","officialName","currency","phonePrefix","tlds","languages","eu","asOf"],"additionalProperties":false},"example":{"iso2":"FR","iso3":"FRA","numeric":"250","name":"France","officialName":"French Republic","currency":{"code":"EUR","symbol":"€"},"phonePrefix":"+33","tlds":[".fr"],"languages":["fr"],"eu":{"member":true,"eea":true,"schengen":true,"euroZone":true},"vatPrefix":"FR","asOf":"2026-07-04"}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"country","in":"query","required":true,"description":"e.g. FR, FRA, 250 or France.","schema":{"type":"string","description":"e.g. FR, FRA, 250 or France."}}]}},"/v1/phone-check":{"get":{"operationId":"phone-check","summary":"Validate and normalize a phone number with full Google libphonenumber metadata: strict validity against each national numbering plan, E.164 / international / national formats, country detection (correct across shared codes like +1 and +44) and line type (mobile, fixed_line, toll_free, voip…) where the plan distinguishes it. Pass ?country=FR to parse national formats. Local. ?attest=1 → Ed25519-signed.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"valid":{"type":"boolean","description":"Strict validity per the national numbering plan."},"possible":{"type":"boolean","description":"Length-plausibility (looser than valid)."},"e164":{"type":"string"},"international":{"type":"string"},"national":{"type":"string"},"country":{"type":"string","description":"Detected ISO alpha-2; absent when undeterminable."},"type":{"type":"string","description":"mobile | fixed_line | fixed_line_or_mobile | toll_free | premium_rate | voip | … — absent when the plan does not distinguish."},"attestation":{"type":"object","description":"Present only with ?attest=1. Ed25519 signature over the canonical result; verify against /.well-known/402utils-attestation.json.","properties":{"payload":{"type":"object","properties":{"endpoint":{"type":"string"},"resultSha256":{"type":"string","description":"SHA-256 of the canonical JSON of the result (attestation excluded)."},"ts":{"type":"string","format":"date-time"},"kid":{"type":"string","description":"Key id — matches a key in the .well-known document."}}},"sig":{"type":"string","description":"base64url Ed25519 signature over the canonical JSON of payload."},"alg":{"type":"string","const":"Ed25519"}}}},"required":["valid"]},"example":{"valid":true,"possible":true,"e164":"+442079460958","international":"+44 20 7946 0958","national":"020 7946 0958","country":"GB","type":"fixed_line"}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"phone","in":"query","required":true,"description":"The number, E.164 (+33612345678) or national.","schema":{"type":"string","description":"The number, E.164 (+33612345678) or national."}},{"name":"country","in":"query","required":false,"description":"ISO alpha-2 default country for national input.","schema":{"type":"string","description":"ISO alpha-2 default country for national input."}},{"name":"attest","in":"query","required":false,"description":"Set to 1 for an Ed25519-signed attestation of the result (audit trail).","schema":{"type":"string","description":"Set to 1 for an Ed25519-signed attestation of the result (audit trail)."}}]}},"/v1/card-check":{"post":{"operationId":"card-check","summary":"Structural card-number check before hitting a PSP: Luhn checksum, network detection from public IIN prefixes (visa, mastercard, amex, discover, jcb, diners, unionpay) and per-network length validation. POST body on purpose: the number never appears in a URL, so it stays out of request logs and x402 payment metadata — never stored, logged or echoed back. No BIN/issuer lookup (BIN databases are licensed): well-formed does not mean the card exists.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.001"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"luhnValid":{"type":"boolean","description":"Luhn (mod-10) checksum result."},"network":{"type":"string","description":"visa | mastercard | amex | discover | jcb | diners | unionpay | unknown (public IIN prefixes; Discover/UnionPay overlap range resolves to discover)."},"lengthValid":{"type":"boolean","description":"Length is valid for the detected network."},"length":{"type":"integer"}},"required":["luhnValid","network","lengthValid","length"],"additionalProperties":false},"example":{"luhnValid":true,"network":"visa","lengthValid":true,"length":16}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"JSON body. `number` may contain spaces and dashes.","properties":{"number":{"type":"string","description":"The card number to check, 8-19 digits."}},"required":["number"]},"example":{"number":"4242 4242 4242 4242"}}}}}},"/v1/rf-reference":{"get":{"operationId":"rf-reference","summary":"ISO 11649 RF creditor reference (SEPA structured reference) — validate or generate. ?ref=RF18539007547034 checks the ISO 7064 mod 97-10 checksum and format (RF + 2 check digits + up to 21 alphanumerics); ?generate=539007547034 computes the check digits and returns the full RF reference with print formatting. Complements iban-check and vat-check for SEPA invoicing agents. Local, instant. ?attest=1 → Ed25519-signed.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.001"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"mode":{"type":"string","description":"'validate' or 'generate'."},"valid":{"type":"boolean"},"formatValid":{"type":"boolean","description":"Validate mode: RF + 2 digits + 1-21 alphanumerics."},"checksumValid":{"type":"boolean","description":"Validate mode: ISO 7064 mod 97-10 result."},"ref":{"type":"string","description":"Normalized full RF reference."},"reference":{"type":"string","description":"The bare creditor reference inside."},"checkDigits":{"type":"string"},"formatted":{"type":"string","description":"Groups of 4 (presentation format)."},"attestation":{"type":"object","description":"Present only with ?attest=1. Ed25519 signature over the canonical result; verify against /.well-known/402utils-attestation.json.","properties":{"payload":{"type":"object","properties":{"endpoint":{"type":"string"},"resultSha256":{"type":"string","description":"SHA-256 of the canonical JSON of the result (attestation excluded)."},"ts":{"type":"string","format":"date-time"},"kid":{"type":"string","description":"Key id — matches a key in the .well-known document."}}},"sig":{"type":"string","description":"base64url Ed25519 signature over the canonical JSON of payload."},"alg":{"type":"string","const":"Ed25519"}}}},"required":["mode","valid","ref","reference","checkDigits","formatted"]},"example":{"mode":"validate","valid":true,"formatValid":true,"checksumValid":true,"ref":"RF18539007547034","reference":"539007547034","checkDigits":"18","formatted":"RF18 5390 0754 7034"}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"ref","in":"query","required":false,"description":"An RF reference to validate, e.g. RF18539007547034 (spaces tolerated).","schema":{"type":"string","description":"An RF reference to validate, e.g. RF18539007547034 (spaces tolerated)."}},{"name":"generate","in":"query","required":false,"description":"A raw reference (1-21 chars, A-Z/0-9) to wrap into an RF reference.","schema":{"type":"string","description":"A raw reference (1-21 chars, A-Z/0-9) to wrap into an RF reference."}},{"name":"attest","in":"query","required":false,"description":"Set to 1 for an Ed25519-signed attestation of the result (audit trail).","schema":{"type":"string","description":"Set to 1 for an Ed25519-signed attestation of the result (audit trail)."}}]}},"/v1/meta-extract":{"get":{"operationId":"meta-extract","summary":"Link preview for any web page: fetches a URL and parses only the <head> (no JS, no rendering). Returns title, meta description, canonical URL, language, an always-absolute favicon, all Open Graph and Twitter Card tags, and RSS/Atom/JSON-feed links. Tolerant of messy real-world HTML and non-UTF-8 charsets. The caller-supplied URL is SSRF-checked; the fetch is capped at 5 MB and 8 s.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.003"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"The URL as requested."},"finalUrl":{"type":"string","description":"URL after redirects; base for absolutization."},"title":{"type":["string","null"],"description":"<title>, entity-decoded, whitespace-collapsed."},"description":{"type":["string","null"],"description":"meta[name=\"description\"] only (og:description stays in og)."},"canonical":{"type":["string","null"],"description":"link[rel=canonical], absolutized."},"lang":{"type":["string","null"],"description":"<html lang>."},"favicon":{"type":"string","description":"Always absolute; falls back to <origin>/favicon.ico."},"og":{"type":"object","additionalProperties":{"type":"string"},"description":"All og:* metas, prefix stripped (og:image → image). First occurrence wins."},"twitter":{"type":"object","additionalProperties":{"type":"string"},"description":"All twitter:* metas (name= or property=), prefix stripped."},"feeds":{"type":"array","description":"link[rel=alternate] RSS/Atom/JSON-feed references.","items":{"type":"object","properties":{"url":{"type":"string"},"type":{"type":"string"},"title":{"type":"string"}},"required":["url","type"]}}},"required":["url","finalUrl","title","description","canonical","lang","favicon","og","twitter","feeds"]},"example":{"url":"https://blog.cloudflare.com/","finalUrl":"https://blog.cloudflare.com/","title":"The Cloudflare Blog","description":"Get the latest news on how products at Cloudflare are built.","canonical":"https://blog.cloudflare.com/","lang":"en","favicon":"https://blog.cloudflare.com/favicon.ico","og":{"title":"The Cloudflare Blog","type":"website","image":"https://blog.cloudflare.com/og.png"},"twitter":{"card":"summary_large_image","site":"@cloudflare"},"feeds":[{"url":"https://blog.cloudflare.com/rss/","type":"application/rss+xml","title":"The Cloudflare Blog"}]}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"url","in":"query","required":true,"description":"Public http(s) page URL (required).","schema":{"type":"string","format":"uri","description":"Public http(s) page URL (required)."}}]}},"/v1/link-check":{"get":{"operationId":"link-check","summary":"Verify a link before you cite or use it: HTTP status, the full redirect chain, the final URL, latency, and the final Content-Type/Content-Length. Redirects are followed manually (max 10) with SSRF validation on every hop; probes with HEAD by default and falls back to GET automatically when a server rejects HEAD. A dead or broken target (404, 410, 500…) is a valid result, not an error. Response bodies are never downloaded.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"The URL that was checked, as given."},"finalUrl":{"type":"string","description":"Last URL actually fetched after redirects."},"status":{"type":"integer","description":"HTTP status of the final response (404/500… is a valid answer)."},"method":{"type":"string","enum":["HEAD","GET"],"description":"Method actually used for the final request (GET after an automatic 405/501 fallback)."},"redirectChain":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"status":{"type":"integer"}},"required":["url","status"]},"description":"Each requested URL with the status it returned, excluding the final response."},"truncatedRedirects":{"type":"boolean","description":"True when the 10-redirect cap was hit: status/finalUrl describe the last 3xx response and its Location target was not fetched."},"latencyMs":{"type":"integer","description":"Wall-clock ms across the whole chain."},"contentType":{"type":"string","description":"Content-Type of the final response, when sent."},"contentLength":{"type":"integer","description":"Content-Length of the final response, when parseable."}},"required":["url","finalUrl","status","method","redirectChain","latencyMs"]},"example":{"url":"https://example.com/pricing","finalUrl":"https://example.com/pricing/","status":200,"method":"HEAD","redirectChain":[{"url":"https://example.com/pricing","status":301}],"latencyMs":142,"contentType":"text/html; charset=utf-8","contentLength":5120}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"url","in":"query","required":true,"description":"Public http(s) URL to check (required).","schema":{"type":"string","format":"uri","description":"Public http(s) URL to check (required)."}},{"name":"method","in":"query","required":false,"description":"Probe method, case-insensitive. HEAD retries as GET on 405/501.","schema":{"type":"string","enum":["HEAD","GET"],"default":"HEAD","description":"Probe method, case-insensitive. HEAD retries as GET on 405/501."}}]}},"/v1/dns-lookup":{"get":{"operationId":"dns-lookup","summary":"Resolve DNS records for a domain over DNS-over-HTTPS: A, AAAA, MX, TXT, NS and CNAME, one or several types per call (type=A,MX). Records come back normalised — MX priority split out, trailing dots stripped, TXT quoting removed — each with its TTL. Cloudflare DoH with automatic Google DoH fallback for resilience; NXDOMAIN is reported explicitly instead of as an error.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.001"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string","description":"Normalised (lowercased) domain that was resolved."},"records":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["A","AAAA","MX","TXT","NS","CNAME"]},"value":{"type":"string"},"ttl":{"type":"integer"},"priority":{"type":"integer","description":"MX records only."}},"required":["type","value","ttl"]}},"nxdomain":{"type":"boolean","description":"Present and true when the domain does not exist."}},"required":["domain","records"]},"example":{"domain":"example.com","records":[{"type":"A","value":"93.184.215.14","ttl":300},{"type":"MX","value":"mail.example.com","ttl":3600,"priority":10}]}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"domain","in":"query","required":true,"description":"Bare domain name to resolve, e.g. example.com (required). No scheme, path, port or IP literal.","schema":{"type":"string","format":"hostname","description":"Bare domain name to resolve, e.g. example.com (required). No scheme, path, port or IP literal."}},{"name":"type","in":"query","required":false,"description":"Record type(s): A, AAAA, MX, TXT, NS, CNAME. Comma-separate for several, e.g. A,MX. Case-insensitive.","schema":{"type":"string","default":"A","description":"Record type(s): A, AAAA, MX, TXT, NS, CNAME. Comma-separate for several, e.g. A,MX. Case-insensitive."}}]}},"/v1/robots-check":{"get":{"operationId":"robots-check","summary":"Robots.txt compliance check for polite crawlers and AI agents (GPTBot, ClaudeBot, ...). Pass a page URL and optionally your crawler's product token; returns whether the URL may be fetched, the winning Allow/Disallow rule, crawl-delay and sitemap URLs. Full RFC 9309 matching: wildcards, $ anchors, longest-match, merged groups. A 4xx robots.txt allows all; 5xx or unreachable hosts report disallowed. Cached per host for 1 hour.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.001"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"},"userAgent":{"type":"string"},"allowed":{"type":"boolean"},"matchedRule":{"type":"string","description":"Winning rule as written, e.g. \"Disallow: /search\". Absent when no rule matched."},"robotsUrl":{"type":"string"},"robotsStatus":{"type":"integer","description":"HTTP status of robots.txt; 0 when it was unreachable (network failure ⇒ full disallow per RFC 9309)."},"crawlDelay":{"type":"number","description":"Crawl-delay of the matched group, in seconds."},"sitemaps":{"type":"array","items":{"type":"string"}}},"required":["url","userAgent","allowed","robotsUrl","robotsStatus","sitemaps"]},"example":{"url":"https://example.com/search?q=demo","userAgent":"GPTBot","allowed":false,"matchedRule":"Disallow: /search","robotsUrl":"https://example.com/robots.txt","robotsStatus":200,"sitemaps":["https://example.com/sitemap.xml"]}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"url","in":"query","required":true,"description":"Public http(s) page URL to test (required).","schema":{"type":"string","format":"uri","description":"Public http(s) page URL to test (required)."}},{"name":"userAgent","in":"query","required":false,"description":"Crawler product token, e.g. \"GPTBot\". Defaults to \"*\".","schema":{"type":"string","default":"*","description":"Crawler product token, e.g. \"GPTBot\". Defaults to \"*\"."}}]}},"/v1/sitemap-to-json":{"get":{"operationId":"sitemap-to-json","summary":"Turn any sitemap.xml into clean JSON: URL entries with loc, lastmod and priority, plus sitemap-index detection with the child sitemap list. Handles gzipped .gz sitemaps (magic-byte detection, zip-bomb guarded) and namespaced XML; pass follow=1 to also expand up to 3 child sitemaps of an index in one call. SSRF-checked fetches, 10 MB per document, up to 50,000 URLs with a truncated flag.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.003"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"The requested sitemap URL."},"urls":{"type":"array","items":{"type":"object","properties":{"loc":{"type":"string"},"lastmod":{"type":"string","description":"Raw <lastmod> value (not normalised)."},"priority":{"type":"number"}},"required":["loc"]}},"truncated":{"type":"boolean","description":"True when the 50,000-URL cap was hit."},"childSitemaps":{"type":"array","items":{"type":"string"},"description":"Present when the target is a sitemap index: ALL child sitemap URLs (fetched or not)."},"childErrors":{"type":"integer","description":"With follow=1: number of child sitemaps that failed to fetch or parse (skipped)."}},"required":["url","urls","truncated"]},"example":{"url":"https://example.com/sitemap.xml","urls":[{"loc":"https://example.com/","lastmod":"2026-07-01","priority":1}],"truncated":false}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"url","in":"query","required":true,"description":"Public http(s) URL of a sitemap.xml, sitemap index, or gzipped .gz sitemap (required).","schema":{"type":"string","format":"uri","description":"Public http(s) URL of a sitemap.xml, sitemap index, or gzipped .gz sitemap (required)."}},{"name":"follow","in":"query","required":false,"description":"\"1\" → when the target is a sitemap index, also fetch its first 3 child sitemaps and aggregate their URLs.","schema":{"type":"string","enum":["0","1"],"default":"0","description":"\"1\" → when the target is a sitemap index, also fetch its first 3 child sitemaps and aggregate their URLs."}}]}},"/v1/domain-check":{"get":{"operationId":"domain-check","summary":"Domain availability and expiry intelligence via RDAP, the WHOIS successor. Queries the authoritative registry for any RDAP-enabled TLD: free domains return registered:false, taken ones return registrar, creation and expiry dates, nameservers and EPP status codes. TLDs without RDAP coverage return supported:false. Built for agents that buy, monitor or vet domains.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string"},"supported":{"type":"boolean","description":"False when the TLD publishes no RDAP service (many ccTLDs)."},"registered":{"type":"boolean","description":"Absent when supported=false."},"registrar":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"expiresAt":{"type":"string","format":"date-time"},"nameservers":{"type":"array","items":{"type":"string"}},"status":{"type":"array","items":{"type":"string"},"description":"EPP status codes as reported by the registry."}},"required":["domain","supported"]},"example":{"domain":"example.com","supported":true,"registered":true,"registrar":"RESERVED-Internet Assigned Numbers Authority","createdAt":"1995-08-14T04:00:00Z","expiresAt":"2026-08-13T04:00:00Z","nameservers":["a.iana-servers.net","b.iana-servers.net"],"status":["client delete prohibited","client transfer prohibited","client update prohibited"]}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"domain","in":"query","required":true,"description":"Domain to look up, e.g. example.com. LDH/punycode form; no scheme, path or IP (required).","schema":{"type":"string","description":"Domain to look up, e.g. example.com. LDH/punycode form; no scheme, path or IP (required)."}}]}},"/v1/x402-probe":{"get":{"operationId":"x402-probe","summary":"Quote an x402-paid API before you buy: probes a third-party endpoint with one unpaid GET (no payment is ever sent) and decodes its payment requirements — x402 v2 base64 PAYMENT-REQUIRED header or v1 JSON body. Returns normalised prices (atomic amount, asset, network, payTo), description, resource URL and Bazaar discovery metadata. Non-402 targets return {isX402:false, status}. SSRF-checked, 1 redirect max, 8 s timeout.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"isX402":{"type":"boolean","description":"True when the target answered 402 with decodable x402 payment requirements."},"status":{"type":"integer","description":"HTTP status the target answered with."},"x402Version":{"type":"integer","description":"x402 protocol version (2 = PAYMENT-REQUIRED header payload, 1 = 402 body payload)."},"prices":{"type":"array","description":"One entry per accepts[] payment option; fields are copied only when advertised.","items":{"type":"object","properties":{"amount":{"type":"string","description":"Price in atomic units of the asset (e.g. 6-decimal USDC)."},"asset":{"type":"string","description":"Asset contract address or identifier."},"network":{"type":"string","description":"Network id, e.g. eip155:8453 (v2) or base-sepolia (v1)."},"payTo":{"type":"string"},"scheme":{"type":"string"},"maxTimeoutSeconds":{"type":"number"}}}},"description":{"type":"string","description":"Human description advertised by the target."},"resource":{"type":"string","description":"Resource URL advertised in the payment payload."},"discovery":{"type":"object","description":"Bazaar/discovery extension object, passed through verbatim when present."},"reason":{"type":"string","enum":["undecodable_402","too_many_redirects"],"description":"Why isX402 is false despite an unusual (but definitive) response."}},"required":["isX402","status"]},"example":{"isX402":true,"x402Version":2,"status":402,"prices":[{"amount":"2000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","payTo":"0x209693Bc6afc0C5328bA36FaF03C514EF312287C","scheme":"exact","maxTimeoutSeconds":60}],"description":"Fetch an RSS 2.0 or Atom feed and return clean JSON.","resource":"https://402utils.com/v1/rss-to-json"}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"url","in":"query","required":true,"description":"Public http(s) URL of the endpoint to probe (required).","schema":{"type":"string","format":"uri","description":"Public http(s) URL of the endpoint to probe (required)."}}]}},"/v1/fx-rates":{"get":{"operationId":"fx-rates","summary":"Daily euro FX reference rates from the European Central Bank. ?base (default EUR), ?quote for a single rate, ?date=YYYY-MM-DD for history (last 90 ECB business days; older dates 404). Non-EUR bases are cross-rates derived via EUR (quote-per-EUR ÷ base-per-EUR). Weekend/holiday dates resolve to the last published ECB day — the date field says which. Published ~16:00 CET on ECB business days; informational rates, not for transaction pricing.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.001"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"base":{"type":"string"},"quote":{"type":"string","description":"Echoed when a single rate was requested."},"date":{"type":"string","format":"date","description":"The effective ECB business day the rates belong to."},"requestedDate":{"type":"string","format":"date","description":"Present when the requested date was a weekend/holiday and an earlier day was served."},"rate":{"type":"number","description":"Present when `quote` was given."},"rates":{"type":"object","description":"Present when `quote` was omitted: currency → rate seen from `base`."},"source":{"type":"string","description":"Always \"ECB\" (European Central Bank reference rates)."},"fetchedAt":{"type":"string","format":"date-time","description":"When the data was fetched from the ECB."}},"required":["base","date","source","fetchedAt"]},"example":{"base":"EUR","quote":"USD","date":"2026-07-03","rate":1.1448,"source":"ECB","fetchedAt":"2026-07-03T15:30:04.000Z"}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"base","in":"query","required":false,"description":"ISO 4217 base currency (default EUR).","schema":{"type":"string","description":"ISO 4217 base currency (default EUR)."}},{"name":"quote","in":"query","required":false,"description":"ISO 4217 quote currency — returns a single `rate` instead of the full `rates` map.","schema":{"type":"string","description":"ISO 4217 quote currency — returns a single `rate` instead of the full `rates` map."}},{"name":"date","in":"query","required":false,"description":"Historical date (YYYY-MM-DD), within the last 90 ECB business days.","schema":{"type":"string","format":"date","description":"Historical date (YYYY-MM-DD), within the last 90 ECB business days."}}]}},"/v1/routing-check":{"get":{"operationId":"routing-check","summary":"Validate a US ABA routing number before initiating a transfer: the 3-7-1 checksum, the public structure rules (9 digits; assigned prefixes 00-12 primary, 21-32 thrift, 61-72 electronic, 80 traveler's cheque) and the implied Federal Reserve district. Checksum and structure only — no bank-name directory (the Fed's is redistribution-restricted) and no proof of assignment. ?attest=1 → Ed25519-signed.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.001"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"valid":{"type":"boolean","description":"structureValid AND checksumValid."},"checksumValid":{"type":"boolean","description":"ABA 3-7-1 weighted checksum result."},"structureValid":{"type":"boolean","description":"9 digits and an assigned prefix range."},"federalReserveDistrict":{"type":"integer","description":"1-12 when the prefix maps to a Federal Reserve district."},"federalReserveBank":{"type":"string","description":"District city, e.g. \"New York\"."},"category":{"type":"string","enum":["government","primary","thrift","electronic","travelers_cheque"]},"message":{"type":"string","description":"Present when something is structurally wrong."},"attestation":{"type":"object","description":"Present only with ?attest=1. Ed25519 signature over the canonical result; verify against /.well-known/402utils-attestation.json.","properties":{"payload":{"type":"object","properties":{"endpoint":{"type":"string"},"resultSha256":{"type":"string","description":"SHA-256 of the canonical JSON of the result (attestation excluded)."},"ts":{"type":"string","format":"date-time"},"kid":{"type":"string","description":"Key id — matches a key in the .well-known document."}}},"sig":{"type":"string","description":"base64url Ed25519 signature over the canonical JSON of payload."},"alg":{"type":"string","const":"Ed25519"}}}},"required":["valid","checksumValid","structureValid"]},"example":{"valid":true,"checksumValid":true,"structureValid":true,"federalReserveDistrict":2,"federalReserveBank":"New York","category":"primary"}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"routing","in":"query","required":true,"description":"The 9-digit ABA routing number, e.g. 021000021.","schema":{"type":"string","description":"The 9-digit ABA routing number, e.g. 021000021."}},{"name":"attest","in":"query","required":false,"description":"Set to 1 for an Ed25519-signed attestation of the result (audit trail).","schema":{"type":"string","description":"Set to 1 for an Ed25519-signed attestation of the result (audit trail)."}}]}},"/v1/us-tax-rates":{"get":{"operationId":"us-tax-rates","summary":"US sales tax STATE-LEVEL base rates for the 50 states + DC, as statutory percent. ?state=CA for one state, omit for all. Returns the state-only rate, any mandatory statewide local add-on (CA/UT/VA) and their sum. STATE BASE RATE ONLY — optional city/county/district rates are EXCLUDED and can add several points; not tax advice. Compiled from state statutes, cross-checked against two dated published trackers (asOf field included).","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"asOf":{"type":"string","format":"date"},"sources":{"type":"array","items":{"type":"string"}},"disclaimer":{"type":"string"},"state":{"type":"string","description":"Present when ?state was given."},"name":{"type":"string"},"stateRate":{"type":"number","description":"State-only statutory rate, percent."},"mandatoryLocalAddon":{"type":"number","description":"Mandatory statewide local add-on, percent (CA 1.25, UT 1.25, VA 1.0, else 0)."},"effectiveMinimumRate":{"type":"number","description":"stateRate + mandatoryLocalAddon."},"note":{"type":"string"},"states":{"type":"object","description":"Present when ?state was omitted: USPS code → per-state object."}},"required":["asOf","sources","disclaimer"]},"example":{"asOf":"2026-07-01","sources":["Compiled from state statutes; cross-checked against Sales Tax Institute (as of 2026-07-01)","Tax Foundation, State and Local Sales Tax Rates 2026 (as of 2026-01-01)"],"disclaimer":"State base rate only. Local (city/county/special-district) rates are excluded and can add several percentage points. Not tax advice.","state":"CA","name":"California","stateRate":6,"mandatoryLocalAddon":1.25,"effectiveMinimumRate":7.25,"note":"1.25% mandatory statewide county rate → 7.25% floor everywhere"}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"state","in":"query","required":false,"description":"USPS two-letter code (e.g. CA, NY, DC). Omit to get all 51 jurisdictions.","schema":{"type":"string","description":"USPS two-letter code (e.g. CA, NY, DC). Omit to get all 51 jurisdictions."}}]}},"/v1/xlsx-extract":{"post":{"operationId":"xlsx-extract","summary":"Extract data from an .xlsx spreadsheet: send the bytes directly or a JSON body with a public {url}. Returns each sheet as rows (array-of-arrays) with its name and used range, plus workbook metadata. Query: sheet (name or 0-based index) for a single sheet, headers=true for array-of-objects. Formula cells return their cached computed value. Capped at 500000 cells. Max 10 MB.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.005"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"sheets":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"range":{"type":["string","null"],"description":"A1-style used range, e.g. 'A1:D57' (null for an empty sheet)."},"rows":{"type":"array","items":{"type":"array"},"description":"Array-of-arrays (default mode)."},"objects":{"type":"array","items":{"type":"object"},"description":"Array-of-objects keyed by the first row (headers=true)."},"truncated":{"type":"boolean"}},"required":["name","range"]}},"meta":{"type":"object","properties":{"sheetCount":{"type":"integer"},"sheetNames":{"type":"array","items":{"type":"string"}},"cellCount":{"type":"integer"},"truncated":{"type":"boolean"}},"required":["sheetCount","sheetNames","cellCount"]}},"required":["sheets","meta"]},"example":{"sheets":[{"name":"Q2","range":"A1:C3","rows":[["item","qty","total"],["widgets",10,42.5],["gadgets",3,12.75]]}],"meta":{"sheetCount":1,"sheetNames":["Q2"],"cellCount":9}}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Raw .xlsx bytes OR a JSON body { url }. Options go in the query string: ?sheet=Invoices&headers=true","properties":{"url":{"type":"string","format":"uri","description":"Public http(s) URL of an .xlsx file (alternative to sending bytes)."}}},"example":{"url":"https://example.com/report.xlsx"}}}}}},"/v1/docx-extract":{"post":{"operationId":"docx-extract","summary":"Extract text from a .docx (Word) document: send the docx bytes directly, or a JSON body with a public {url}. Returns the plain text, a best-effort markdown rendering (headings, bold/italic and lists; tables are flattened to paragraphs), and metadata (title, author). Text layer only — no OCR of embedded images. Max 10 MB.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.005"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string"},"markdown":{"type":"string","description":"Best-effort markdown; tables are flattened to sequential paragraphs."},"meta":{"type":"object","properties":{"title":{"type":"string"},"author":{"type":"string"},"warnings":{"type":"array","items":{"type":"string"},"description":"Non-fatal conversion warnings (unknown styles, dropped elements)."}}}},"required":["text","markdown","meta"]},"example":{"text":"Consulting Agreement\n\nThis agreement is made between …","markdown":"# Consulting Agreement\n\nThis agreement is made between …","meta":{"title":"Consulting Agreement","author":"Jane Doe"}}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Either raw .docx bytes OR a JSON body { url }.","properties":{"url":{"type":"string","format":"uri","description":"Public http(s) URL of a .docx file (alternative to sending bytes)."}}},"example":{"url":"https://example.com/contract.docx"}}}}}},"/v1/zip-inspect":{"post":{"operationId":"zip-inspect","summary":"Inspect a ZIP archive safely: send the bytes directly or a JSON body with a public {url}. Returns the entry list (path, size, compressedSize, isDir); entries with path traversal (../), absolute or malformed paths are flagged suspicious:true and never interpreted. Add ?extract=exact/entry/path to get that one file back (max 5 MB decompressed). Zip bombs are refused. Max 20 MB.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.003"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","description":"Without ?extract: the entry listing. With ?extract: the raw bytes of that entry (application/octet-stream).","properties":{"entries":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"size":{"type":"integer","description":"Uncompressed size in bytes (as declared by the archive)."},"compressedSize":{"type":"integer"},"isDir":{"type":"boolean"},"suspicious":{"type":"boolean","description":"Path contains ../, is absolute, or is malformed. Reported, never interpreted."}},"required":["path","size","compressedSize","isDir"]}},"entryCount":{"type":"integer"},"truncated":{"type":"boolean","description":"true when the archive has more than 10000 entries (listing capped)."},"totalUncompressedSize":{"type":"integer"}},"required":["entries","entryCount","totalUncompressedSize"]},"example":{"entries":[{"path":"report/","size":0,"compressedSize":0,"isDir":true},{"path":"report/q2.pdf","size":182734,"compressedSize":170101,"isDir":false},{"path":"../../etc/passwd","size":812,"compressedSize":400,"isDir":false,"suspicious":true}],"entryCount":3,"totalUncompressedSize":183546}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Raw ZIP bytes (application/zip) OR a JSON body { url }. Optional ?extract=path query to return one file.","properties":{"url":{"type":"string","format":"uri","description":"Public http(s) URL of a zip (alternative to sending bytes)."}}},"example":{"url":"https://example.com/archive.zip"}}}}}},"/v1/csv-profile":{"post":{"operationId":"csv-profile","summary":"Profile a CSV before processing it: send the bytes directly or a JSON body with a public {url}. Returns per-column name, inferred type (string/int/float/bool/date/mixed), null and unique counts, min/max and samples, plus row count, detected delimiter and data-quality issues (malformed rows, inconsistent widths, duplicate headers). Query: delimiter (, ; tab |), header=false if row one is data. Max 10 MB.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.003"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"columns":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"inferredType":{"type":"string","enum":["string","int","float","bool","date","mixed"]},"nullCount":{"type":"integer"},"uniqueCount":{"type":"integer","description":"Distinct non-null values, capped at 10000 (uniqueCapped:true beyond)."},"uniqueCapped":{"type":"boolean"},"min":{"description":"Numeric min for int/float columns, ISO string min for date columns."},"max":{"description":"Numeric max for int/float columns, ISO string max for date columns."},"samples":{"type":"array","items":{"type":"string"}}},"required":["name","inferredType","nullCount","uniqueCount","samples"]}},"rowCount":{"type":"integer"},"delimiter":{"type":"string"},"issues":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"message":{"type":"string"},"rows":{"type":"array","items":{"type":"integer"}},"count":{"type":"integer"}},"required":["type","message"]}}},"required":["columns","rowCount","delimiter","issues"]},"example":{"columns":[{"name":"date","inferredType":"date","nullCount":0,"uniqueCount":31,"min":"2026-06-01","max":"2026-07-01","samples":["2026-06-01"]},{"name":"amount","inferredType":"float","nullCount":2,"uniqueCount":118,"min":-420.5,"max":1999.99,"samples":["19.99"]}],"rowCount":120,"delimiter":",","issues":[{"type":"inconsistent_columns","message":"1 row(s) do not have the header's 2 column(s)","rows":[17],"count":1}]}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Raw CSV bytes (text/csv) OR a JSON body { url }. Options go in the query string: ?delimiter=;&header=false","properties":{"url":{"type":"string","format":"uri","description":"Public http(s) URL of a CSV (alternative to sending bytes)."}}},"example":{"url":"https://example.com/data.csv"}}}}}},"/v1/wallet-name":{"get":{"operationId":"wallet-name","summary":"Resolve a Basename or ENS name to an address, or an address to its primary name. Pass ?name=402utils.base.eth (name→address) or ?address=0x… (address→primary name). Basenames resolve on Base L2, other .eth names on Ethereum mainnet. Reverse results are forward-verified. ASCII names only; offchain (CCIP-read) resolvers like cb.id are not supported.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"resolved":{"type":"boolean"},"direction":{"type":"string","enum":["forward","reverse"]},"name":{"type":"string"},"address":{"type":"string","description":"EIP-55 checksummed."},"chain":{"type":"string","enum":["base","ethereum"]},"reason":{"type":"string","description":"When resolved=false: not_found, no_address_record, no_primary_name, offchain_unsupported, unverified, invalid_input."}},"required":["resolved"]},"example":{"resolved":true,"direction":"forward","name":"vitalik.eth","address":"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045","chain":"ethereum"}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"name","in":"query","required":false,"description":"An ENS or Basename, e.g. 402utils.base.eth or vitalik.eth.","schema":{"type":"string","description":"An ENS or Basename, e.g. 402utils.base.eth or vitalik.eth."}},{"name":"address","in":"query","required":false,"description":"A 0x-prefixed 20-byte address.","schema":{"type":"string","description":"A 0x-prefixed 20-byte address."}}]}},"/v1/donate":{"get":{"operationId":"donate","summary":"Support 402utils — or use it as a parametric x402 payment-test endpoint: you set the price with ?amount= (USD, clamped to $0.001–$0.05) and the 402 demands exactly that, so you can assert a client pays the precise amount and the on-chain USDC tx matches. After payment returns {thanks, amount, message}. The amount is a pure function of ?amount, identical on the unpaid probe and the paid retry.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"dynamic","currency":"USD","min":"0.001","max":"0.05"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"thanks":{"type":"boolean","const":true},"amount":{"type":"number","description":"USD amount actually charged (matches the settled tx)."},"currency":{"type":"string","const":"USD"},"clamped":{"type":"boolean","description":"True when the requested amount fell outside $0.001–$0.05 and was pulled into the band."},"requested":{"type":"string","description":"The raw ?amount you sent (present only when clamped)."},"note":{"type":"string","description":"Your ?note, echoed (present only when provided)."},"message":{"type":"string"}},"required":["thanks","amount","currency","message"]},"example":{"thanks":true,"amount":0.013,"currency":"USD","message":"Thank you for supporting 402utils."}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"amount","in":"query","required":false,"description":"Amount to pay in USD, e.g. 0.013. Clamped to $0.001–$0.05. Omitted/invalid → $0.01.","schema":{"type":"string","description":"Amount to pay in USD, e.g. 0.013. Clamped to $0.001–$0.05. Omitted/invalid → $0.01."}},{"name":"note","in":"query","required":false,"description":"Optional free-text note echoed back (handy to correlate a payment-test run).","schema":{"type":"string","description":"Optional free-text note echoed back (handy to correlate a payment-test run)."}}]}},"/v1/x402-lint":{"get":{"operationId":"x402-lint","summary":"Lint an x402 endpoint before agents find it broken. Probes a third-party 402 (unpaid, SSRF-checked) and audits it: description ≥450 chars (CDP silently rejects at settle → 402 {} with no charge), missing Bazaar discovery or input/output schemas, resource.url host mismatch or *.workers.dev identity, x402Version 1 (frozen), non-CAIP-2 network, unparseable amount, unknown asset, odd maxTimeoutSeconds. Returns pass/warn/fail/info checks + summary.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.003"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"The URL that was linted."},"isX402":{"type":"boolean","description":"False when the target is not a decodable x402 402 (then a single info check)."},"checks":{"type":"array","items":{"type":"object","properties":{"rule":{"type":"string","description":"Rule id, e.g. description_length, resource_identity, accepts[0].network."},"level":{"type":"string","enum":["pass","warn","fail","info"]},"detail":{"type":"string","description":"Human explanation of the finding."}},"required":["rule","level","detail"]}},"summary":{"type":"object","properties":{"fails":{"type":"integer"},"warns":{"type":"integer"}},"required":["fails","warns"]}},"required":["url","isX402","checks","summary"]},"example":{"url":"https://402utils.com/v1/rss-to-json","isX402":true,"checks":[{"rule":"x402_version","level":"pass","detail":"x402Version 2."},{"rule":"description_length","level":"pass","detail":"Description 214 chars (< 450)."},{"rule":"resource_identity","level":"pass","detail":"resource.url matches the host you called."}],"summary":{"fails":0,"warns":0}}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"url","in":"query","required":true,"description":"Public http(s) URL of the x402 endpoint to lint (required).","schema":{"type":"string","format":"uri","description":"Public http(s) URL of the x402 endpoint to lint (required)."}}]}},"/v1/supplier-check":{"post":{"operationId":"supplier-check","summary":"Vet a supplier in one paid call: give any of a VAT number, IBAN, domain and LEI and get VAT validity (VIES) + company name, IBAN structure (mod-97 + BBAN), domain status (RDAP), the GLEIF LEI record (legal name, status, parent) and the country — run in parallel, each with a per-field status. summary.allProvidedValid is true only if every provided check confirmed. All checks failing technically → 503, no charge. ?attest=1 → Ed25519-signed.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.006"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"vat":{"type":"object","description":"vat-check result with a `status` (ok | unavailable | invalid_input)."},"iban":{"type":"object","description":"iban-check result with `status`."},"domain":{"type":"object","description":"domain-check result with `status`."},"lei":{"type":"object","description":"GLEIF lei-lookup result with `status` (present when a LEI was given)."},"country":{"type":"object","description":"country-info derived from the VAT prefix (present when a VAT was given)."},"summary":{"type":"object","properties":{"allProvidedValid":{"type":"boolean","description":"True iff every provided check confirmed (valid/registered)."},"checkedAt":{"type":"string","format":"date-time"}},"required":["allProvidedValid","checkedAt"]},"attestation":{"type":"object","description":"Present only with ?attest=1. Ed25519 signature over the canonical result; verify against /.well-known/402utils-attestation.json.","properties":{"payload":{"type":"object","properties":{"endpoint":{"type":"string"},"resultSha256":{"type":"string","description":"SHA-256 of the canonical JSON of the result (attestation excluded)."},"ts":{"type":"string","format":"date-time"},"kid":{"type":"string","description":"Key id — matches a key in the .well-known document."}}},"sig":{"type":"string","description":"base64url Ed25519 signature over the canonical JSON of payload."},"alg":{"type":"string","const":"Ed25519"}}}},"required":["summary"]},"example":{"vat":{"status":"ok","valid":true,"countryCode":"IE","vatNumber":"6388047V","name":"GOOGLE IRELAND LIMITED"},"iban":{"status":"ok","valid":true,"country":"IE"},"domain":{"status":"ok","supported":true,"registered":true,"registrar":"MarkMonitor Inc."},"country":{"status":"ok","name":"Ireland","alpha2":"IE"},"summary":{"allProvidedValid":true,"checkedAt":"2026-07-05T12:00:00.000Z"}}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"JSON body with at least one of vat, iban, domain, lei.","properties":{"vat":{"type":"string","description":"Full EU VAT number, e.g. IE6388047V."},"iban":{"type":"string","description":"IBAN to validate structurally."},"domain":{"type":"string","description":"Domain to look up via RDAP, e.g. example.com."},"lei":{"type":"string","description":"20-char LEI to resolve via GLEIF, e.g. 529900D6BF99LW9R2E68."},"attest":{"type":"string","description":"Set to 1 for an Ed25519-signed attestation of the result (audit trail)."}}},"example":{"vat":"IE6388047V","iban":"IE29AIBK93115212345678","domain":"google.com"}}}}}},"/v1/invoice-ready":{"post":{"operationId":"invoice-ready","summary":"Pre-flight a SEPA invoice's identifiers in one paid call: validate the customer VAT (VIES, with company name), the IBAN (ISO 7064 mod-97 + BBAN layout) and an ISO 11649 RF creditor reference, run together with a per-field status. summary.allProvidedValid is true only if every provided identifier checked out. If all provided checks fail technically you get a 503 and no charge. ?attest=1 → Ed25519-signed.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.004"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"vat":{"type":"object","description":"vat-check result with a `status` (ok | unavailable | invalid_input)."},"iban":{"type":"object","description":"iban-check result with `status`."},"rfReference":{"type":"object","description":"rf-reference validation with `status`."},"summary":{"type":"object","properties":{"allProvidedValid":{"type":"boolean","description":"True iff every provided identifier validated."},"checkedAt":{"type":"string","format":"date-time"}},"required":["allProvidedValid","checkedAt"]},"attestation":{"type":"object","description":"Present only with ?attest=1. Ed25519 signature over the canonical result; verify against /.well-known/402utils-attestation.json.","properties":{"payload":{"type":"object","properties":{"endpoint":{"type":"string"},"resultSha256":{"type":"string","description":"SHA-256 of the canonical JSON of the result (attestation excluded)."},"ts":{"type":"string","format":"date-time"},"kid":{"type":"string","description":"Key id — matches a key in the .well-known document."}}},"sig":{"type":"string","description":"base64url Ed25519 signature over the canonical JSON of payload."},"alg":{"type":"string","const":"Ed25519"}}}},"required":["summary"]},"example":{"vat":{"status":"ok","valid":true,"countryCode":"IE","vatNumber":"6388047V","name":"GOOGLE IRELAND LIMITED"},"iban":{"status":"ok","valid":true,"country":"IE"},"rfReference":{"status":"ok","valid":true,"ref":"RF18539007547034","formatted":"RF18 5390 0754 7034"},"summary":{"allProvidedValid":true,"checkedAt":"2026-07-05T12:00:00.000Z"}}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"JSON body with at least one of vat, iban, rfReference.","properties":{"vat":{"type":"string","description":"Customer EU VAT number, e.g. IE6388047V."},"iban":{"type":"string","description":"Payee IBAN."},"rfReference":{"type":"string","description":"ISO 11649 RF creditor reference, e.g. RF18539007547034."},"attest":{"type":"string","description":"Set to 1 for an Ed25519-signed attestation of the result (audit trail)."}}},"example":{"vat":"IE6388047V","iban":"IE29AIBK93115212345678","rfReference":"RF18539007547034"}}}}}},"/v1/site-profile":{"get":{"operationId":"site-profile","summary":"Full profile of a web page in one paid call: <head> metadata (title, description, OpenGraph, favicon, feeds), DNS (A/AAAA/MX/NS), robots.txt crawl permission for your user-agent, domain registration/expiry (RDAP), and the site's llms.txt (agent-readiness) — fanned out in parallel, each section with its own status. Pass ?userAgent= to test a specific crawler. Fetches are SSRF-checked. If every section fails you get a 503 and no charge.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.007"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"},"meta":{"type":"object","description":"meta-extract result with a `status` (ok | unavailable)."},"dns":{"type":"object","description":"dns-lookup result with `status` (ok | unavailable | skipped)."},"robots":{"type":"object","description":"robots-check result with `status`."},"domain":{"type":"object","description":"domain-check result with `status` (ok | unavailable | skipped)."},"llmsTxt":{"type":"object","description":"llms-txt result with `status` and `found` (the agent-readiness signal)."},"summary":{"type":"object","properties":{"ok":{"type":"integer","description":"How many of the five sections produced a result."},"checkedAt":{"type":"string","format":"date-time"}},"required":["ok","checkedAt"]}},"required":["url","meta","dns","robots","domain","llmsTxt","summary"]},"example":{"url":"https://blog.cloudflare.com/","meta":{"status":"ok","title":"The Cloudflare Blog","favicon":"https://blog.cloudflare.com/favicon.ico"},"dns":{"status":"ok","domain":"blog.cloudflare.com","records":[{"type":"A","value":"104.16.0.1","ttl":300}]},"robots":{"status":"ok","allowed":true,"robotsUrl":"https://blog.cloudflare.com/robots.txt","robotsStatus":200,"sitemaps":[]},"domain":{"status":"ok","supported":true,"registered":true,"registrar":"Cloudflare, Inc."},"llmsTxt":{"status":"ok","found":false,"llmsTxtUrl":"https://blog.cloudflare.com/llms.txt"},"summary":{"ok":5,"checkedAt":"2026-07-05T12:00:00.000Z"}}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"url","in":"query","required":true,"description":"Public http(s) page URL to profile (required).","schema":{"type":"string","format":"uri","description":"Public http(s) page URL to profile (required)."}},{"name":"userAgent","in":"query","required":false,"description":"Crawler product token for the robots check, e.g. \"GPTBot\".","schema":{"type":"string","default":"*","description":"Crawler product token for the robots check, e.g. \"GPTBot\"."}}]}},"/v1/batch":{"post":{"operationId":"batch","summary":"Run up to 10 internal calls in one payment: POST {calls:[{path,input}]} and pay the SUM of the internal prices (≤ $0.05 total), executed in parallel, results returned in order. Batchable endpoints are the local, deterministic ones (validators, format transforms, time/locale) — no browser, network, composite or dynamic endpoints. Each result carries {path, status, body}; a bad request (unknown path, >10 calls, over cap) is a 400, not charged.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"dynamic","currency":"USD","min":"0.001","max":"0.05"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"status":{"type":"integer","description":"HTTP status the internal call returned."},"body":{"description":"The internal call's JSON body."}},"required":["path","status","body"]}}},"required":["results"]},"example":{"results":[{"path":"/v1/iban-check","status":200,"body":{"valid":true,"country":"FR"}},{"path":"/v1/routing-check","status":200,"body":{"valid":true,"checksumValid":true}}]}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"JSON body with a `calls` array (1–10 entries).","properties":{"calls":{"type":"array","description":"1–10 calls. `path` must be a batchable endpoint; `input` is its query params (GET) or JSON body (POST).","items":{"type":"object","properties":{"path":{"type":"string","description":"Batchable endpoint path, e.g. /v1/iban-check."},"input":{"type":"object","description":"The call's input (query params for GET, JSON body for POST)."}},"required":["path"]}}},"required":["calls"]},"example":{"calls":[{"path":"/v1/iban-check","input":{"iban":"FR7630006000011234567890189"}},{"path":"/v1/routing-check","input":{"routing":"021000021"}}]}}}}}},"/v1/seller-report":{"get":{"operationId":"seller-report","summary":"On-chain + config reliability report for any x402 seller, public data only, computed live. Pass ?payTo=0x… or ?url= (a third-party x402 endpoint) → {onchain:{firstSeenAt,totalIncomingTransfers,uniqueSenders,last30dInflows,note}, config, liveness, discovery} plus factual flags (new_seller, single_sender, config_issues, unreachable). On-chain counts all incoming USDC transfers, not only x402 settlements. No score, no verdict; fails open.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.01"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"payTo":{"type":["string","null"],"description":"The seller address the report is about (EIP-55)."},"network":{"type":"string","description":"CAIP-2 chain the on-chain history was read on."},"report":{"type":"object","properties":{"onchain":{"type":"object","description":"Incoming USDC transfer history (status 'unavailable' if the source was down).","properties":{"status":{"type":"string","enum":["available","unavailable"]},"firstSeenAt":{"type":["string","null"],"format":"date-time"},"totalIncomingTransfers":{"type":"integer","description":"All incoming USDC transfers — an x402-settlement proxy, includes funding/manual transfers."},"uniqueSenders":{"type":"integer","description":"Distinct sender addresses — the key anti-sybil signal."},"last7dIncomingTransfers":{"type":"integer"},"last30dInflowsUsd":{"type":"string","description":"Sum of incoming USDC over 30 days (inflows, not only x402 revenue)."},"windowCapped":{"type":"boolean","description":"True if >1000 transfers: stats cover the recent window."},"note":{"type":"string","description":"States what the counts measure (all inflows, not only settlements)."}}},"config":{"type":"object","description":"Present with ?url: x402-lint summary of the seller's 402.","properties":{"isX402":{"type":"boolean"},"fails":{"type":"integer"},"warns":{"type":"integer"},"issues":{"type":"array","items":{"type":"object"}}}},"liveness":{"type":"object","description":"Present with ?url: did the endpoint answer, and how.","properties":{"reachable":{"type":"boolean"},"isX402":{"type":"boolean"},"x402Version":{"type":"integer"},"priceUsd":{"type":"string"},"resource":{"type":"string"}}},"discovery":{"type":"object","properties":{"status":{"type":"string","enum":["available","unavailable"]},"indexed":{"type":"boolean"},"resourceCount":{"type":"integer"}}}}},"flags":{"type":"array","items":{"type":"string"},"description":"Factual, non-defamatory: new_seller, single_sender, config_issues, unreachable."},"summary":{"type":"string"},"cached":{"type":"boolean","description":"True if the on-chain/discovery signals came from the 1 h cache."}},"required":["payTo","network","report","flags","summary"]},"example":{"payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291","network":"eip155:8453","report":{"onchain":{"status":"available","firstSeenAt":"2026-06-20T10:00:00.000Z","totalIncomingTransfers":54,"uniqueSenders":3,"last7dIncomingTransfers":12,"last30dInflowsUsd":"0.32","windowCapped":false,"note":"counts all incoming USDC transfers to this address, not only x402 settlements"},"discovery":{"status":"available","indexed":true,"resourceCount":98}},"flags":[],"summary":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291 has 54 incoming USDC transfers from 3 unique senders since 2026-06-20; 98 resources indexed in the Bazaar.","cached":false}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"payTo","in":"query","required":false,"description":"Seller's receiving address (0x…). On-chain history is read for it.","schema":{"type":"string","description":"Seller's receiving address (0x…). On-chain history is read for it."}},{"name":"url","in":"query","required":false,"description":"A third-party x402 endpoint. Adds config + liveness signals and discovers the payTo.","schema":{"type":"string","format":"uri","description":"A third-party x402 endpoint. Adds config + liveness signals and discovers the payTo."}}]}},"/v1/receipt-verify":{"get":{"operationId":"receipt-verify","summary":"Verify on-chain that a transaction is the USDC payment you expected. Pass ?tx=0x… plus optional ?expectedPayTo=0x… and ?expectedAmount=0.01 (USD); ?network defaults to the deployment chain (base or base-sepolia). Decodes the tx's USDC Transfer logs and returns {verified, actualPayTo, actualAmount, asset, blockTime, confirmations, mismatch}. Unknown/unmined tx → 503 (unbilled). Add ?attest=1 for a signed receipt.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.003"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"verified":{"type":"boolean","description":"True only if a matching USDC Transfer was found and every expectation held."},"tx":{"type":"string"},"network":{"type":"string","description":"CAIP-2 chain id the receipt was read on."},"txStatus":{"type":"string","enum":["success","reverted"]},"actualPayTo":{"type":["string","null"],"description":"Recipient of the matched (or largest) USDC Transfer, EIP-55 checksummed."},"actualAmount":{"type":["string","null"],"description":"USDC amount of that transfer, in USD."},"asset":{"type":"string","description":"USDC contract on this network."},"assetSymbol":{"type":"string"},"blockNumber":{"type":["integer","null"]},"blockTime":{"type":["string","null"],"format":"date-time"},"confirmations":{"type":["integer","null"]},"explorer":{"type":"string"},"transfers":{"type":"array","description":"Every USDC Transfer in the tx, in log order.","items":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"},"amount":{"type":"string","description":"USD."}}}},"mismatch":{"type":"array","description":"Present when verified=false: which expectations failed (payTo, amount, no_usdc_transfer, reverted).","items":{"type":"string"}},"attestation":{"type":"object","description":"Present only with ?attest=1. Ed25519 signature over the canonical result; verify against /.well-known/402utils-attestation.json.","properties":{"payload":{"type":"object","properties":{"endpoint":{"type":"string"},"resultSha256":{"type":"string","description":"SHA-256 of the canonical JSON of the result (attestation excluded)."},"ts":{"type":"string","format":"date-time"},"kid":{"type":"string","description":"Key id — matches a key in the .well-known document."}}},"sig":{"type":"string","description":"base64url Ed25519 signature over the canonical JSON of payload."},"alg":{"type":"string","const":"Ed25519"}}}},"required":["verified","tx","network","txStatus","asset","transfers"]},"example":{"verified":true,"tx":"0xf1b23e5bf6e35c9601b91198645fe541fde1a6379c8378707abde0f8626a2c05","network":"eip155:8453","txStatus":"success","actualPayTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291","actualAmount":"0.001","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","assetSymbol":"USDC","blockNumber":48160122,"blockTime":"2026-07-04T20:12:00.000Z","confirmations":63000,"explorer":"https://basescan.org/tx/0xf1b23e5bf6e35c9601b91198645fe541fde1a6379c8378707abde0f8626a2c05","transfers":[{"from":"0x072BE711AB8b10213aB33310EEcF7cf8610D36d9","to":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291","amount":"0.001"}]}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"tx","in":"query","required":true,"description":"Transaction hash, 0x + 64 hex (required).","schema":{"type":"string","description":"Transaction hash, 0x + 64 hex (required)."}},{"name":"expectedPayTo","in":"query","required":false,"description":"Address the USDC should have been sent to (optional).","schema":{"type":"string","description":"Address the USDC should have been sent to (optional)."}},{"name":"expectedAmount","in":"query","required":false,"description":"Expected USDC amount in USD, e.g. 0.01 (optional).","schema":{"type":"string","description":"Expected USDC amount in USD, e.g. 0.01 (optional)."}},{"name":"network","in":"query","required":false,"description":"base | base-sepolia | eip155:8453 | eip155:84532. Defaults to the deployment chain.","schema":{"type":"string","description":"base | base-sepolia | eip155:8453 | eip155:84532. Defaults to the deployment chain."}},{"name":"attest","in":"query","required":false,"description":"Set to 1 for an Ed25519-signed attestation of the result (audit trail).","schema":{"type":"string","description":"Set to 1 for an Ed25519-signed attestation of the result (audit trail)."}}]}},"/v1/market-price":{"get":{"operationId":"market-price","summary":"Live market price stats for a kind of x402 service, from the public Bazaar catalog. Pass ?category=vat or ?query=pdf extraction and get {sampleSize, priceUsd:{min,p25,median,max,p75}, networks, examples} in USD — is your price fair, what should you charge? Computed over a live sample of up to 1000 resources; <3 matches returns an honest 'insufficient market data'. Neutral: our own endpoints are never featured.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.005"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"category":{"type":"string"},"query":{"type":"string"},"sampleSize":{"type":"integer","description":"USD-priced resources matched — the basis for priceUsd."},"matched":{"type":"integer","description":"All matched resources, including non-USD-denominated ones."},"priceUsd":{"type":"object","description":"Omitted when sampleSize < 3.","properties":{"min":{"type":"number"},"p25":{"type":"number"},"median":{"type":"number"},"p75":{"type":"number"},"max":{"type":"number"}}},"networks":{"type":"array","items":{"type":"string"},"description":"CAIP-2 chains seen across matched resources."},"examples":{"type":"array","description":"Up to 5 matched resources (402utils' own excluded).","items":{"type":"object","properties":{"resource":{"type":"string"},"serviceName":{"type":["string","null"]},"priceUsd":{"type":"number"},"network":{"type":["string","null"]}}}},"note":{"type":"string","description":"Present when sampleSize < 3: 'insufficient market data'."},"disclaimer":{"type":"string"}},"required":["sampleSize","matched","networks","disclaimer"]},"example":{"category":"vat","sampleSize":5,"matched":7,"priceUsd":{"min":0.002,"p25":0.005,"median":0.01,"p75":0.02,"max":0.1},"networks":["eip155:8453"],"examples":[{"resource":"https://api.example.com/vat/validate","serviceName":"VAT Validator","priceUsd":0.005,"network":"eip155:8453"}],"disclaimer":"priceUsd is a live sample of up to 1000 Bazaar resources, USD-denominated only; 402utils' own resources are excluded from examples."}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"category","in":"query","required":false,"description":"A service category keyword, e.g. vat, pdf, search, image.","schema":{"type":"string","description":"A service category keyword, e.g. vat, pdf, search, image."}},{"name":"query","in":"query","required":false,"description":"Free-text description of the service, e.g. 'currency exchange rates'.","schema":{"type":"string","description":"Free-text description of the service, e.g. 'currency exchange rates'."}}]}},"/v1/facturx-validate":{"post":{"operationId":"facturx-validate","summary":"Validate a Factur-X / ZUGFeRD invoice: send PDF bytes, JSON { url } or { pdfBase64 }, or raw CII { xml }. Returns a rule-based report — PDF/A-3 structure, EN 16931 CII anchors, arithmetic rules (BR-CO) and French PA « Flux 2 » checks (BR-FR) — with the detected profile. Structural + heuristic, not a certified conformance service. ?attest=1 → Ed25519-signed audit trail.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.005"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"type":"string","enum":["pdf","xml"]},"profile":{"type":"string","description":"Detected Factur-X profile id (MINIMUM/BASIC_WL/BASIC/EN16931) or null."},"profileUrn":{"type":"string","description":"Detected GuidelineSpecifiedDocumentContextParameter URN, or null."},"pdfA3":{"type":"object","description":"Structural PDF/A-3 checks (checked=false for XML-only input).","properties":{"checked":{"type":"boolean"},"structureValid":{"type":"boolean"},"issues":{"type":"array","items":{"type":"object"}}}},"cii":{"type":"object","properties":{"present":{"type":"boolean"},"wellFormed":{"type":"boolean"},"valid":{"type":"boolean","description":"No fail across CII anchors and arithmetic rules."},"en16931Checks":{"type":"object","properties":{"passed":{"type":"array","items":{"type":"string"}},"failed":{"type":"array","items":{"type":"object"}}}},"businessRules":{"type":"array","items":{"type":"object"},"description":"BR-CO arithmetic results."}}},"frFlux":{"type":"object","description":"French PA « Flux 2 » (BR-FR) warnings — a Plateforme Agréée may reject on these.","properties":{"warnings":{"type":"array","items":{"type":"object"}}}},"summary":{"type":"object","properties":{"pass":{"type":"integer"},"warn":{"type":"integer"},"fail":{"type":"integer"}}},"meta":{"type":"object","properties":{"disclaimer":{"type":"string"}}},"attestation":{"type":"object","description":"Present only with ?attest=1. Ed25519 signature over the canonical result; verify against /.well-known/402utils-attestation.json.","properties":{"payload":{"type":"object","properties":{"endpoint":{"type":"string"},"resultSha256":{"type":"string","description":"SHA-256 of the canonical JSON of the result (attestation excluded)."},"ts":{"type":"string","format":"date-time"},"kid":{"type":"string","description":"Key id — matches a key in the .well-known document."}}},"sig":{"type":"string","description":"base64url Ed25519 signature over the canonical JSON of payload."},"alg":{"type":"string","const":"Ed25519"}}}},"required":["input","pdfA3","cii","frFlux","summary","meta"]},"example":{"input":"pdf","profile":"EN16931","profileUrn":"urn:cen.eu:en16931:2017","pdfA3":{"checked":true,"structureValid":true,"issues":[]},"cii":{"present":true,"wellFormed":true,"valid":true,"en16931Checks":{"passed":["cii.seller","cii.buyer"],"failed":[]},"businessRules":[]},"frFlux":{"warnings":[]},"summary":{"pass":24,"warn":0,"fail":0},"meta":{"disclaimer":"Generates/validates a technical artifact from your data; does not constitute tax/legal advice; you remain responsible for data accuracy and PA transmission."}}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Send raw PDF/XML bytes OR a JSON body with one of { url }, { pdfBase64 }, { xml }.","properties":{"url":{"type":"string","format":"uri","description":"Public http(s) URL of a Factur-X PDF or CII XML."},"pdfBase64":{"type":"string","description":"Base64 of a Factur-X PDF (alternative to raw bytes)."},"xml":{"type":"string","description":"Raw CII (CrossIndustryInvoice) XML to validate without a PDF wrapper."},"attest":{"type":"string","description":"Set to 1 for an Ed25519-signed attestation of the result (audit trail)."}}},"example":{"url":"https://example.com/invoice-facturx.pdf"}}}}}},"/v1/facturx-generate":{"post":{"operationId":"facturx-generate","summary":"Generate a Factur-X invoice (PDF/A-3 + embedded EN 16931 CII XML) from structured data: send { invoice, profile }, get the PDF bytes (or JSON with base64 + conformity report via Accept: application/json). Targets EN 16931 and the French PA « Flux 2 » rules (payment mentions, business process, electronic addresses) ahead of the 2026-09 mandate. Technical artifact, not tax/legal advice; you remain responsible for data accuracy and PA transmission.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.02"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"string","format":"binary","contentMediaType":"application/pdf","description":"By default the raw PDF/A-3 Factur-X bytes (headers X-Facturx-Profile, X-Facturx-Report, X-Facturx-Disclaimer). With Accept: application/json (or ?format=json), a JSON object { profile, profileUrn, pdfBase64, report, meta:{ disclaimer } }."},"example":"<binary application/pdf stream>"}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Structured invoice data and the target profile.","properties":{"profile":{"type":"string","enum":["MINIMUM","BASIC_WL","BASIC","EN16931"],"default":"EN16931","description":"Target Factur-X profile. EN16931 (default) is the reference B2B profile."},"invoice":{"type":"object","description":"EN 16931 invoice data (BT/BG business terms).","properties":{"number":{"type":"string","description":"Invoice number (BT-1)."},"issueDate":{"type":"string","description":"Issue date YYYY-MM-DD (BT-2)."},"typeCode":{"type":"string","enum":["380","381","384","389"],"default":"380"},"currency":{"type":"string","default":"EUR","description":"ISO 4217 (BT-5)."},"buyerReference":{"type":"string"},"seller":{"type":"object","description":"Seller party (BG-4): name, legalId (SIREN), vatId, address, electronicAddress {value,scheme} (BT-34)."},"buyer":{"type":"object","description":"Buyer party (BG-7): name, legalId (SIREN), address, electronicAddress {value,scheme} (BT-49)."},"delivery":{"type":"object","description":"Delivery info (BG-13): address, date."},"lines":{"type":"array","description":"Invoice lines (BG-25): id, name, quantity, unitCode, unitPrice, vatCategory, vatRate.","items":{"type":"object"}},"payment":{"type":"object","description":"Payment (BG-16): meansCode, iban, bic, terms, dueDate."},"operationCategory":{"type":"string","enum":["goods","services","mixed"],"description":"Nature of operation (FR mandatory mention #3)."},"vatOnDebitsOption":{"type":"boolean","description":"VAT-on-debits option (FR mandatory mention #4)."},"businessProcess":{"type":"string","description":"BT-23 typology (B1/S1/M1/…); derived from operationCategory when omitted."},"frenchMentions":{"type":"object","description":"Override the PMT/PMD/AAB payment mentions (defaults applied otherwise)."}},"required":["number","issueDate","seller","buyer","lines"]}},"required":["invoice"]},"example":{"profile":"EN16931","invoice":{"number":"INV-2026-0042","issueDate":"2026-07-05","currency":"EUR","seller":{"name":"ACME Studio SARL","legalId":"552100554","vatId":"FR55552100554","address":{"line1":"12 rue de la Paix","city":"Paris","postcode":"75002","countryCode":"FR"},"electronicAddress":{"value":"billing@acme.example","scheme":"EM"}},"buyer":{"name":"Globex SAS","legalId":"444555666","address":{"line1":"9 avenue des Champs","city":"Lyon","postcode":"69002","countryCode":"FR"},"electronicAddress":{"value":"ap@globex.example","scheme":"EM"}},"lines":[{"id":"1","name":"Consulting day","quantity":3,"unitCode":"DAY","unitPrice":800,"vatCategory":"S","vatRate":20}],"payment":{"meansCode":"30","iban":"FR7630006000011234567890189","dueDate":"2026-08-04"},"operationCategory":"services"}}}}}}},"/v1/facturx-extract":{"post":{"operationId":"facturx-extract","summary":"Read a Factur-X / ZUGFeRD invoice: send PDF bytes or a JSON { url }. Extracts the embedded EN 16931 CII into normalised data — seller, buyer, lines, VAT, totals, payment, dates, references — with the detected profile. The read side of e-invoicing (the FR mandate starts with reception). No embedded CII → { profile:\"none\", warning:\"no_embedded_cii\" }. ?attest=1 → Ed25519-signed.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.004"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"profile":{"type":"string","description":"Detected profile id (MINIMUM/BASIC_WL/BASIC/EN16931), \"unknown\", or \"none\" when no CII is embedded."},"profileUrn":{"type":"string"},"warning":{"type":"string","description":"Present only when no CII could be read, e.g. \"no_embedded_cii\"."},"invoice":{"type":"object","description":"Normalised EN 16931 data: number, issueDate, currency, seller, buyer, lines[], vat[], totals, payment, delivery, references."},"raw":{"type":"object","properties":{"ciiXmlPresent":{"type":"boolean"},"attachmentName":{"type":"string"}}},"meta":{"type":"object","properties":{"disclaimer":{"type":"string"}}},"attestation":{"type":"object","description":"Present only with ?attest=1. Ed25519 signature over the canonical result; verify against /.well-known/402utils-attestation.json.","properties":{"payload":{"type":"object","properties":{"endpoint":{"type":"string"},"resultSha256":{"type":"string","description":"SHA-256 of the canonical JSON of the result (attestation excluded)."},"ts":{"type":"string","format":"date-time"},"kid":{"type":"string","description":"Key id — matches a key in the .well-known document."}}},"sig":{"type":"string","description":"base64url Ed25519 signature over the canonical JSON of payload."},"alg":{"type":"string","const":"Ed25519"}}}},"required":["profile","raw","meta"]},"example":{"profile":"EN16931","profileUrn":"urn:cen.eu:en16931:2017","invoice":{"number":"INV-2026-0042","issueDate":"2026-07-05","currency":"EUR","seller":{"name":"ACME Studio SARL"},"buyer":{"name":"Globex SAS"},"lines":[],"vat":[],"totals":{"grandTotal":3360}},"raw":{"ciiXmlPresent":true,"attachmentName":"factur-x.xml"},"meta":{"disclaimer":"This service generates and validates a technically compliant Factur-X document (PDF/A-3 with embedded EN 16931 CII XML) from the data you provide. Checks cover the structure and internal arithmetic of that data; they do not verify its accuracy, completeness or legal correctness, do not constitute tax or legal advice, and do not certify compliance with the French e-invoicing mandate (réforme de la facturation électronique). You remain responsible for the truthfulness of the invoice data, the inclusion of all legally required mentions, correct VAT treatment, archiving, and for transmitting invoices through a Plateforme Agréée (PA). Standards, code lists and mandate rules change over time; verify current requirements with your PA and the French tax administration."}}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Send raw PDF bytes OR a JSON body with a public { url }.","properties":{"url":{"type":"string","format":"uri","description":"Public http(s) URL of a Factur-X PDF."},"attest":{"type":"string","description":"Set to 1 for an Ed25519-signed attestation of the result (audit trail)."}}},"example":{"url":"https://example.com/invoice-facturx.pdf"}}}}}},"/v1/epc-qr":{"post":{"operationId":"epc-qr","summary":"Generate an EPC QR code (SEPA Credit Transfer / « Girocode », EPC069-12) — the QR a banking app scans to pre-fill a transfer, the payment companion to an invoice. Body { name, iban, amount?, bic?, purpose?, remittance? | reference? (RF) }. Returns PNG (default), SVG, or the raw EPC text. IBAN + RF are validated; strict EPC encoding (order, lengths, ≤331 bytes, level M). EUR only. Not a payment initiation — just the encoded data.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"string","format":"binary","contentMediaType":"image/png","description":"The QR image (image/png or image/svg+xml), or the raw EPC payload (text/plain) when format=text."},"example":"<binary image/png stream>"}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Beneficiary name (≤ 70 chars)."},"iban":{"type":"string","description":"Beneficiary IBAN (validated mod-97)."},"amount":{"type":"number","description":"Amount in EUR (0.01–999999999.99). Optional (open amount)."},"currency":{"type":"string","default":"EUR","description":"EUR only (EPC constraint)."},"bic":{"type":"string","description":"Beneficiary BIC. Required for version 001, optional for 002."},"purpose":{"type":"string","description":"SEPA purpose code (≤ 4 chars)."},"remittance":{"type":"string","description":"Unstructured remittance (≤ 140). Mutually exclusive with reference."},"reference":{"type":"string","description":"Structured remittance = ISO 11649 RF creditor reference (≤ 35)."},"version":{"type":"string","enum":["001","002"],"default":"002","description":"EPC version. 001 requires a BIC."},"format":{"type":"string","enum":["png","svg","text"],"default":"png","description":"png (default), svg, or text (the raw EPC payload)."},"size":{"type":"integer","description":"Output size in px for png/svg (default 512)."},"fg":{"type":"string","description":"Foreground hex colour (default #000000)."},"bg":{"type":"string","description":"Background hex colour (default #ffffff)."}},"required":["name","iban"]},"example":{"name":"ACME Studio SARL","iban":"FR7630006000011234567890189","amount":3360,"reference":"RF18539007547034"}}}}}},"/v1/late-payment":{"get":{"operationId":"late-payment","summary":"B2B late-payment interest + the €40 fixed indemnity for an overdue invoice. ?regime=fr (L441-10: ECB refinancing rate + 10 pts by default, or a contractual rate with the 3× legal floor) or ?regime=eu (Directive 2011/7: ECB reference + 8 pts). Params ?amount=&dueDate=&paidDate?=&regime=&rate?=. Returns daysLate, applicableRate, interest, fixedIndemnity, totalDue. Calculation aid on published rates — not legal advice; terms may differ.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"regime":{"type":"string"},"daysLate":{"type":"integer"},"amount":{"type":"number"},"applicableRate":{"type":"number","description":"Annual rate applied (%)."},"rateSource":{"type":"string"},"ecbReferenceRate":{"type":"number"},"frLegalRate":{"type":"number"},"frContractualFloor":{"type":"number","description":"3× the FR legal rate — the contractual minimum (fr regime)."},"interest":{"type":"number"},"fixedIndemnity":{"type":"number"},"penaltiesTotal":{"type":"number"},"totalDue":{"type":"number","description":"amount + penaltiesTotal."},"basis":{"type":"string"},"semester":{"type":"string"},"asOf":{"type":"string"},"meta":{"type":"object","properties":{"disclaimer":{"type":"string"},"sources":{"type":"array","items":{"type":"string"}}}}},"required":["regime","daysLate","applicableRate","interest","totalDue","asOf","meta"]},"example":{"regime":"fr","daysLate":30,"amount":10000,"applicableRate":12.15,"rateSource":"FR default: ECB MRO 2.15% + 10 pts (L441-10)","interest":99.86,"fixedIndemnity":40,"penaltiesTotal":139.86,"totalDue":10139.86,"asOf":"2026-07-06"}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"amount","in":"query","required":true,"description":"Invoice amount (TTC for FR).","schema":{"type":"number","description":"Invoice amount (TTC for FR)."}},{"name":"dueDate","in":"query","required":true,"description":"Payment due date, ISO YYYY-MM-DD (BT-9).","schema":{"type":"string","description":"Payment due date, ISO YYYY-MM-DD (BT-9)."}},{"name":"paidDate","in":"query","required":false,"description":"Actual payment date, ISO. Defaults to today.","schema":{"type":"string","description":"Actual payment date, ISO. Defaults to today."}},{"name":"regime","in":"query","required":false,"description":"Legal regime.","schema":{"type":"string","enum":["fr","eu"],"default":"fr","description":"Legal regime."}},{"name":"rate","in":"query","required":false,"description":"Explicit annual contractual rate (%). Overrides the statutory default.","schema":{"type":"number","description":"Explicit annual contractual rate (%). Overrides the statutory default."}}]}},"/v1/peppol-lookup":{"get":{"operationId":"peppol-lookup","summary":"Look up a business in the public Peppol Directory — where to route an e-invoice (the BT-34/49 electronic address). ?id= (a Peppol id like 0225:992412536, or a value to search) or ?country=FR&name=. Returns { found, count, participants:[{peppolId, name, country, documentTypes[], schemes[]}] }. Unknown id → { found:false }. Directory down → 503, unbilled. Public source, 1h cache.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.003"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"found":{"type":"boolean"},"count":{"type":"integer","description":"Total matches in the directory (may exceed the returned page)."},"participants":{"type":"array","items":{"type":"object","properties":{"peppolId":{"type":"string","description":"e.g. 0225:992412536."},"scheme":{"type":"string"},"name":{"type":"string"},"country":{"type":"string"},"documentTypes":{"type":"array","items":{"type":"string"}},"schemes":{"type":"array","items":{"type":"string"}}}}},"source":{"type":"string"}},"required":["found","count","participants"]},"example":{"found":true,"count":1,"participants":[{"peppolId":"0225:992412536","scheme":"iso6523-actorid-upis","name":"Terre Orange","country":"FR","documentTypes":["urn:...Invoice-2::Invoice##..."],"schemes":["iso6523-actorid-upis"]}],"source":"directory.peppol.eu"}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"id","in":"query","required":false,"description":"Peppol participant id (`ICD:value`, full `iso6523-actorid-upis::...`, or a bare value/term to search).","schema":{"type":"string","description":"Peppol participant id (`ICD:value`, full `iso6523-actorid-upis::...`, or a bare value/term to search)."}},{"name":"country","in":"query","required":false,"description":"ISO 3166-1 alpha-2 country code (with `name`).","schema":{"type":"string","description":"ISO 3166-1 alpha-2 country code (with `name`)."}},{"name":"name","in":"query","required":false,"description":"Business name (partial match; with or without `country`).","schema":{"type":"string","description":"Business name (partial match; with or without `country`)."}}]}},"/v1/readability":{"post":{"operationId":"readability","summary":"Extract the main article from a web page with Mozilla Readability — drops nav, ads, sidebars and footer boilerplate. Send inline {html} or a public {url} to fetch (SSRF-checked). Returns the article title, byline, cleaned HTML content, plain textContent, excerpt, character length, language and site name. THE pre-processing step before sending a page to an LLM. Distinct from html-to-md (which renders Markdown). Max 5 MB.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.003"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"Present when a url was fetched: the URL as requested."},"finalUrl":{"type":"string","description":"Present when a url was fetched: URL after redirects."},"title":{"type":["string","null"],"description":"Article title."},"byline":{"type":["string","null"],"description":"Author/byline metadata."},"content":{"type":"string","description":"Cleaned article HTML (boilerplate removed)."},"textContent":{"type":"string","description":"Plain-text rendering of the article."},"excerpt":{"type":["string","null"],"description":"Short excerpt / description."},"length":{"type":"integer","description":"Character length of textContent."},"lang":{"type":["string","null"],"description":"Article language (from <html lang>)."},"siteName":{"type":["string","null"],"description":"Site name (from og:site_name)."},"publishedTime":{"type":["string","null"],"description":"Published time metadata, when present."}},"required":["title","content","textContent","excerpt","length","byline","lang","siteName"]},"example":{"title":"How we built Cloudflare Workers","byline":"The Workers Team","content":"<div id=\"readability-page-1\"><p>Workers run your code…</p></div>","textContent":"Workers run your code…","excerpt":"A look at the architecture behind Cloudflare Workers.","length":4213,"lang":"en","siteName":"The Cloudflare Blog","publishedTime":"2024-05-01T10:00:00.000Z"}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Exactly one of `html` (inline) or `url` (public page, fetched and SSRF-checked).","properties":{"html":{"type":"string","description":"HTML document to extract from (non-empty, max 5 MB UTF-8)."},"url":{"type":"string","format":"uri","description":"Public http(s) page URL to fetch instead of inline html."}}},"example":{"url":"https://blog.cloudflare.com/how-we-built-workers"}}}}}},"/v1/token-count":{"post":{"operationId":"token-count","summary":"Count BPE tokens in a text with tiktoken (o200k_base = GPT-4o default, or cl100k_base). An agent can check content fits an LLM context window before paying for an expensive call. Returns token count, char count and encoding. Honest scope: an OpenAI-style estimate — no open-source Claude tokenizer exists (exact Claude counts need the Anthropic API), Gemini differs too. Provided text only; nothing is fetched. Max 1 MB.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.001"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"tokens":{"type":"integer","description":"Number of BPE tokens."},"encoding":{"type":"string","enum":["o200k_base","cl100k_base"],"description":"The encoding used."},"charCount":{"type":"integer","description":"Number of Unicode code points in the text."},"estimatedFor":{"type":"string","description":"The tokenizer family this estimates ('openai-gpt4o-style')."},"note":{"type":"string","description":"Honest-scope disclaimer (OpenAI-style, not exact for Claude/Gemini)."}},"required":["tokens","encoding","charCount","estimatedFor","note"]},"example":{"tokens":2,"encoding":"cl100k_base","charCount":11,"estimatedFor":"openai-gpt4o-style","note":"OpenAI-style (tiktoken) estimate; not exact for Claude or Gemini, which use different tokenizers. Exact Claude counts require the Anthropic API."}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Provided text in, token count out. Nothing is fetched.","properties":{"text":{"type":"string","description":"The text to tokenize (may be empty → 0 tokens; max 1 MB UTF-8)."},"encoding":{"type":"string","enum":["o200k_base","cl100k_base"],"default":"o200k_base","description":"tiktoken encoding. o200k_base = GPT-4o / GPT-4.1 / o-series (current standard); cl100k_base = GPT-3.5/4, text-embedding-3."}},"required":["text"]},"example":{"text":"hello world","encoding":"cl100k_base"}}}}}},"/v1/chunk":{"post":{"operationId":"chunk","summary":"Split a long text into token-sized chunks for RAG ingestion. Chunks are measured in REAL tokens (tiktoken o200k_base/cl100k_base), honour a token overlap, and cut on sentence, paragraph or word boundaries (strategy). Returns each chunk text, its exact token count and char offsets. The natural composite of token-count; counts are OpenAI-style estimates (no Claude tokenizer exists). Provided text only; nothing is fetched. Over 1 MB is truncated.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"chunks":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string"},"tokenCount":{"type":"integer","description":"Exact token count of this chunk."},"index":{"type":"integer"},"startChar":{"type":"integer","description":"Character offset (JS string index) of the chunk start."},"endChar":{"type":"integer","description":"Character offset (exclusive) of the chunk end."}},"required":["text","tokenCount","index","startChar","endChar"]}},"totalChunks":{"type":"integer"},"totalTokens":{"type":"integer","description":"Exact token count of the whole input (chunks overlap, so this is not their sum)."},"encoding":{"type":"string","enum":["o200k_base","cl100k_base"]},"truncated":{"type":"boolean","description":"True when the input exceeded 1 MB and was truncated."}},"required":["chunks","totalChunks","totalTokens","encoding"]},"example":{"chunks":[{"text":"First sentence here. Second sentence follows. ","tokenCount":8,"index":0,"startChar":0,"endChar":46},{"text":"Third one too.","tokenCount":4,"index":1,"startChar":46,"endChar":60}],"totalChunks":2,"totalTokens":12,"encoding":"o200k_base"}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Provided text in, token-sized chunks out. Nothing is fetched.","properties":{"text":{"type":"string","description":"The text to chunk (max 1 MB UTF-8; larger is truncated)."},"maxTokens":{"type":"integer","minimum":1,"maximum":8192,"default":512,"description":"Maximum tokens per chunk."},"overlap":{"type":"integer","minimum":0,"default":50,"description":"Token overlap between consecutive chunks (must be < maxTokens)."},"encoding":{"type":"string","enum":["o200k_base","cl100k_base"],"default":"o200k_base","description":"tiktoken encoding used to size chunks."},"strategy":{"type":"string","enum":["sentence","paragraph","token"],"default":"sentence","description":"Boundary chunks cut on: sentence (semantic), paragraph (blank-line), or token (word)."}},"required":["text"]},"example":{"text":"First sentence here. Second sentence follows. Third one too.","maxTokens":16,"overlap":4,"strategy":"sentence"}}}}}},"/v1/lang-detect":{"post":{"operationId":"lang-detect","summary":"Detect the language of a text with franc (pure-JS trigram model, 61 languages + CJK/Indic scripts). Returns the ISO 639-1 code (639-3 when no 2-letter code exists), language name, a separation-margin confidence (0=ambiguous, 1=unambiguous), a reliable flag, and ranked alternatives. The pre-sort step of any multilingual pipeline. Short/ambiguous text returns reliable:false honestly. Processes provided text only; nothing is fetched.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.001"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"language":{"type":"string","description":"ISO 639-1 code (or ISO 639-3 when no 2-letter code exists; 'und' if undetermined)."},"languageName":{"type":"string","description":"English language name."},"iso6393":{"type":"string","description":"The ISO 639-3 code franc returned."},"confidence":{"type":"number","description":"Separation margin from the next-best language: 0=ambiguous, 1=unambiguous."},"reliable":{"type":"boolean","description":"False when the text is too short or ambiguous to trust."},"alternatives":{"type":"array","description":"Up to 3 next-best candidates with their relative trigram similarity (best=1).","items":{"type":"object","properties":{"lang":{"type":"string"},"confidence":{"type":"number"}},"required":["lang","confidence"]}}},"required":["language","languageName","iso6393","confidence","reliable"]},"example":{"language":"fr","languageName":"French","iso6393":"fra","confidence":0.329,"reliable":true,"alternatives":[{"lang":"es","confidence":0.671},{"lang":"it","confidence":0.62}]}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Provided text in, detected language out. Nothing is fetched.","properties":{"text":{"type":"string","description":"The text to classify (needs ~10+ characters to be reliable)."}},"required":["text"]},"example":{"text":"Bonjour le monde, ceci est un test de détection de langue en français."}}}}}},"/v1/extract-entities":{"post":{"operationId":"extract-entities","summary":"Extract emails, http(s) URLs, international phone numbers, @mentions and #hashtags from provided text OR html — normalized and de-duplicated. From html, also reads href/src attributes and mailto: links. Emails are syntax-validated; phones use Google libphonenumber (international format). Pattern-based extraction, NOT ML named-entity recognition. What a crawl agent pulls from every page. Processes provided content only; nothing is fetched.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"emails":{"type":"array","items":{"type":"string"},"description":"Lower-cased, syntax-valid emails."},"urls":{"type":"array","items":{"type":"string"},"description":"Absolute http(s) URLs."},"phones":{"type":"array","items":{"type":"string"},"description":"E.164 international phone numbers."},"mentions":{"type":"array","items":{"type":"string"},"description":"@handles."},"hashtags":{"type":"array","items":{"type":"string"},"description":"#hashtags."}},"required":["emails","urls","phones","mentions","hashtags"]},"example":{"emails":["sales@acme.com"],"urls":["https://acme.com/pricing"],"phones":["+14155550132"],"mentions":["@acme"],"hashtags":["#saas"]}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Exactly one of `text` (plain) or `html` (also mines attributes/mailto).","properties":{"text":{"type":"string","description":"Plain text to scan."},"html":{"type":"string","description":"HTML to scan (attributes + visible text)."}}},"example":{"text":"Reach us at sales@acme.com or +1 415 555 0132. See https://acme.com/pricing. Follow @acme #saas"}}}}}},"/v1/summarize-extractive":{"post":{"operationId":"summarize-extractive","summary":"Extractive summary: selects the N most salient sentences via TextRank (TF-IDF cosine + PageRank) — a pure algorithm, no LLM, so deterministic and free of inference cost. Returns the summary and each chosen sentence with a salience score and index. Extractive (selects existing sentences), NOT abstractive/generative — that is the point: reproducible and model-free. Pre-condense a page before an LLM call. Provided text only. Over 1 MB truncated.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.003"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"summary":{"type":"string","description":"The selected sentences joined in original reading order."},"sentences":{"type":"array","description":"The selected sentences, most salient first.","items":{"type":"object","properties":{"text":{"type":"string"},"score":{"type":"number","description":"Relative salience, normalized so the top sentence ≈ 1."},"index":{"type":"integer","description":"0-based sentence index in reading order."}},"required":["text","score","index"]}},"method":{"type":"string","enum":["extractive-textrank"],"description":"Always extractive-textrank (deterministic, no LLM)."},"truncated":{"type":"boolean","description":"True when the input exceeded 1 MB or the ranked-sentence cap."}},"required":["summary","sentences","method"]},"example":{"summary":"Cloudflare Workers run code at the edge. Many companies migrated their APIs to Workers to cut latency.","sentences":[{"text":"Cloudflare Workers run code at the edge.","score":1,"index":0},{"text":"Many companies migrated their APIs to Workers to cut latency.","score":0.82,"index":2}],"method":"extractive-textrank"}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Provided text in, extractive summary out. Nothing is fetched.","properties":{"text":{"type":"string","description":"The text to summarize (max 1 MB UTF-8; larger is truncated)."},"sentences":{"type":"integer","minimum":1,"maximum":50,"default":3,"description":"How many sentences to select."}},"required":["text"]},"example":{"text":"Cloudflare Workers run code at the edge. They use V8 isolates, so cold starts are near zero. Many companies migrated their APIs to Workers to cut latency. Pricing is based on requests and CPU time.","sentences":2}}}}}},"/v1/redact":{"post":{"operationId":"redact","summary":"Mask PII in free text before you send it to an LLM or write it to a log. Pattern-based detection (not ML): emails, phone numbers (Google libphonenumber), IBANs (mod-97), payment cards (Luhn), URLs and IPs. Choose types[] and mode: mask (j***@d***.com, readable), remove, or label ([EMAIL_1], re-identifiable by index). Names and postal addresses are out of scope. The input text is never logged or stored.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.003"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"redacted":{"type":"string","description":"The text with matched PII redacted per `mode`."},"findings":{"type":"array","description":"Count of redactions per type (types with zero matches are omitted).","items":{"type":"object","properties":{"type":{"type":"string","enum":["email","phone","iban","card","url","ip"]},"count":{"type":"integer"}},"required":["type","count"]}},"mode":{"type":"string","enum":["mask","remove","label"]},"note":{"type":"string","description":"Honesty note: what this does and does not detect."}},"required":["redacted","findings","mode","note"],"additionalProperties":false},"example":{"redacted":"Contact j***@e***.com or +33 6 ** ** ** **, IBAN FR76 **** **** **** **** **** 189.","findings":[{"type":"email","count":1},{"type":"phone","count":1},{"type":"iban","count":1}],"mode":"mask","note":"Pattern-based detection (email, phone, IBAN, card via Luhn, URL, IP); names and postal addresses are out of scope (no ML NER). Cards/IBANs are only redacted when their checksum validates."}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"JSON body. Only `text` is required.","properties":{"text":{"type":"string","description":"The text to redact (max 256 KB UTF-8)."},"types":{"type":"array","items":{"type":"string","enum":["email","phone","iban","card","url","ip"]},"description":"PII types to redact. Defaults to all six."},"mode":{"type":"string","enum":["mask","remove","label"],"default":"mask","description":"mask (readable partial mask), remove (delete), or label ([TYPE_n])."}},"required":["text"]},"example":{"text":"Contact jane.doe@example.com or +33 6 12 34 56 78, IBAN FR7630006000011234567890189.","mode":"mask"}}}}}},"/v1/embed":{"post":{"operationId":"embed","summary":"Text → vector embeddings via Cloudflare Workers AI. Send {text} or {texts[]} (≤20, each ≤4000 chars); returns one float vector per input. Default model @cf/baai/bge-m3 (1024-dim, multilingual). The model is named in the response — embeddings only compare within the same model. Completes the RAG chain: readability → chunk → embed, no OpenAI account. Cosine-compare the vectors yourself. Unavailable model/binding → 503, not billed.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.004"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"embeddings":{"type":"array","description":"One vector per input text, in request order.","items":{"type":"array","items":{"type":"number"}}},"model":{"type":"string","description":"The model used (compare embeddings only within one model)."},"dimensions":{"type":"integer","description":"Length of each vector (bge-m3 → 1024)."},"usage":{"type":"object","properties":{"inputs":{"type":"integer","description":"Number of texts embedded in this call."}},"required":["inputs"]}},"required":["embeddings","model","dimensions","usage"],"additionalProperties":false},"example":{"embeddings":[[0.0123,-0.0456,0.0789],[0.0119,-0.0448,0.0801]],"model":"@cf/baai/bge-m3","dimensions":1024,"usage":{"inputs":2}}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Provide exactly one of `text` or `texts`.","properties":{"text":{"type":"string","description":"A single text to embed (≤ 4000 chars)."},"texts":{"type":"array","items":{"type":"string"},"maxItems":20,"description":"Up to 20 texts to embed in one call (each ≤ 4000 chars)."},"model":{"type":"string","enum":["@cf/baai/bge-m3","@cf/baai/bge-base-en-v1.5","@cf/baai/bge-large-en-v1.5","@cf/baai/bge-small-en-v1.5"],"default":"@cf/baai/bge-m3","description":"Embedding model. Default @cf/baai/bge-m3. en-v1.5 models are English-only, 512-token max."}}},"example":{"texts":["A cat sat on the mat.","A feline rested on the rug."]}}}}}},"/v1/structured-data":{"post":{"operationId":"structured-data","summary":"Extract a page's structured data: JSON-LD (schema.org), Open Graph tags, and best-effort microdata. Returns the parsed JSON-LD objects, detected schema.org types (Product, Offer, Review, Event, Recipe, Article…), microdata items and the og:* map. Send inline {html} or a public {url} (SSRF-checked). Malformed JSON-LD yields a {parseError} entry, never a crash. Microdata is best-effort; JSON-LD is the reliable path. Max 5 MB.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.003"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"Present when a url was fetched: the URL as requested."},"finalUrl":{"type":"string","description":"Present when a url was fetched: URL after redirects."},"jsonLd":{"type":"array","description":"Parsed JSON-LD objects (top-level arrays flattened). Broken blocks become {parseError}.","items":{"type":"object"}},"types":{"type":"array","items":{"type":"string"},"description":"Distinct schema.org @type values found."},"microdata":{"type":"array","description":"Best-effort microdata items ({type, properties}); absent when none found.","items":{"type":"object"}},"microdataSkipped":{"type":"boolean","description":"True when the DOM microdata pass was skipped (HTML too deeply nested)."},"openGraph":{"type":"object","additionalProperties":{"type":"string"},"description":"All og:* metas, prefix stripped (og:image → image). Reuses the meta-extract parser."}},"required":["jsonLd","types","openGraph"]},"example":{"jsonLd":[{"@context":"https://schema.org","@type":"Product","name":"The H2 Snowboard","offers":{"@type":"Offer","price":629.95,"priceCurrency":"USD"}}],"types":["Product","Offer"],"openGraph":{"title":"The H2 Snowboard","type":"product","image":"https://cdn.shopify.com/…/Main.jpg"}}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Exactly one of `html` (inline) or `url` (public page, fetched and SSRF-checked).","properties":{"html":{"type":"string","description":"HTML document to extract from (non-empty, max 5 MB UTF-8)."},"url":{"type":"string","format":"uri","description":"Public http(s) page URL to fetch instead of inline html."}}},"example":{"url":"https://hydrogen.shop/products/the-h2-snowboard"}}}}}},"/v1/llms-txt":{"get":{"operationId":"llms-txt","summary":"Fetch and parse a site's llms.txt (llmstxt.org) — the LLM-era robots.txt. Give any page URL; it resolves the origin's /llms.txt, and returns the H1 title, the blockquote summary, and every section's links ([title](url): notes). Also probes /llms-full.txt and reports its size. A site without one returns {found:false} (a 200, still useful). The fetch is SSRF-checked. Bonus signal in /v1/site-profile.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"The requested URL."},"found":{"type":"boolean","description":"Whether a valid /llms.txt was found."},"llmsTxtUrl":{"type":"string","description":"The resolved <origin>/llms.txt URL fetched."},"status":{"type":"integer","description":"HTTP status of the /llms.txt fetch (0 = unreachable)."},"title":{"type":["string","null"],"description":"The H1 project title."},"summary":{"type":["string","null"],"description":"The blockquote summary, when present."},"sections":{"type":"array","description":"Parsed sections; each has a name and a list of links.","items":{"type":"object","properties":{"name":{"type":"string"},"links":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"url":{"type":"string"},"notes":{"type":"string"}},"required":["title","url"]}}},"required":["name","links"]}},"linkCount":{"type":"integer","description":"Total links across all sections."},"fullVersion":{"type":"object","description":"Present when found: whether /llms-full.txt exists and its size in bytes.","properties":{"found":{"type":"boolean"},"url":{"type":"string"},"sizeBytes":{"type":"integer"}},"required":["found","url"]}},"required":["url","found","llmsTxtUrl","status"]},"example":{"url":"https://developers.cloudflare.com/","found":true,"llmsTxtUrl":"https://developers.cloudflare.com/llms.txt","status":200,"title":"Cloudflare Docs","summary":"Cloudflare's developer documentation.","sections":[{"name":"Docs","links":[{"title":"Workers","url":"https://developers.cloudflare.com/workers/","notes":"Serverless platform"}]}],"linkCount":1,"fullVersion":{"found":true,"url":"https://developers.cloudflare.com/llms-full.txt","sizeBytes":4200000}}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"url","in":"query","required":true,"description":"Any public http(s) URL on the target site (required).","schema":{"type":"string","format":"uri","description":"Any public http(s) URL on the target site (required)."}}]}},"/v1/c2pa-verify":{"post":{"operationId":"c2pa-verify","summary":"Verify C2PA / Content Credentials (provenance & tamper detection) in an image: send the image bytes or a JSON {url}. Returns Trusted/Valid/Invalid/None with per-manifest signature, trust-chain (issuer) and asset-hash checks plus C2PA actions. 'Trusted' only if the signer chains to the C2PA trust list, otherwise 'Valid'. Relevant to EU AI Act Art. 50. Verification only (embedded manifests) — not generation.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.005"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"hasC2pa":{"type":"boolean","description":"Whether the image carries an embedded C2PA manifest."},"validationState":{"type":"string","enum":["Trusted","Valid","Invalid","None"],"description":"Trusted = valid AND the signer chains to the C2PA trust list; Valid = cryptographically valid but issuer not in the trust list; Invalid = a signature or asset-hash check failed; None = no embedded manifest."},"manifests":{"type":"array","description":"One entry per manifest (active first).","items":{"type":"object","properties":{"label":{"type":"string"},"active":{"type":"boolean"},"generator":{"type":["string","null"],"description":"claim_generator of the signer."},"title":{"type":"string"},"format":{"type":"string"},"signatureValid":{"type":"boolean","description":"The COSE claim signature verified."},"signingCredential":{"type":"object","properties":{"issuer":{"type":["string","null"]},"commonName":{"type":"string"},"certSerialNumber":{"type":"string"},"timeSigned":{"type":"string","format":"date-time"},"trusted":{"type":"boolean","description":"Chains to the C2PA trust list. Never true unless the reader reported trust."}},"required":["issuer","trusted"]},"assertions":{"type":"object","properties":{"actions":{"type":"array","items":{"type":"object"},"description":"c2pa.actions (created/edited/…) with softwareAgent & digitalSourceType."},"ingredients":{"type":"array","items":{"type":"object"},"description":"Referenced source assets."},"hashMatch":{"type":"boolean","description":"The asset/assertion content hashes matched (no tampering)."}},"required":["hashMatch"]},"timestamp":{"type":"object","properties":{"validated":{"type":"boolean"},"trusted":{"type":"boolean"}},"description":"RFC 3161 signing timestamp, when present."}},"required":["label","active","signatureValid","signingCredential","assertions"]}},"validationErrors":{"type":"array","description":"Genuine integrity failures (signature/asset-hash/ingredient). 'signingCredential.untrusted' is NOT an error — it is reported via trusted:false.","items":{"type":"object","properties":{"code":{"type":"string"},"explanation":{"type":"string"},"url":{"type":"string"}},"required":["code"]}},"remoteManifestUrl":{"type":"string","description":"Set when the manifest is stored remotely; this endpoint verifies embedded manifests only."},"trustListUsed":{"type":"boolean","description":"Whether the embedded C2PA trust list was applied to the trust check."},"attestation":{"type":"object","description":"Present only with ?attest=1. Ed25519 signature over the canonical result; verify against /.well-known/402utils-attestation.json.","properties":{"payload":{"type":"object","properties":{"endpoint":{"type":"string"},"resultSha256":{"type":"string","description":"SHA-256 of the canonical JSON of the result (attestation excluded)."},"ts":{"type":"string","format":"date-time"},"kid":{"type":"string","description":"Key id — matches a key in the .well-known document."}}},"sig":{"type":"string","description":"base64url Ed25519 signature over the canonical JSON of payload."},"alg":{"type":"string","const":"Ed25519"}}}},"required":["hasC2pa","validationState","trustListUsed"]},"example":{"hasC2pa":true,"validationState":"Trusted","manifests":[{"label":"urn:uuid:…","active":true,"generator":"Adobe Firefly","format":"image/jpeg","signatureValid":true,"signingCredential":{"issuer":"Adobe Inc.","trusted":true,"timeSigned":"2025-08-13T16:30:55+00:00"},"assertions":{"actions":[{"action":"c2pa.created","digitalSourceType":"http://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia"}],"hashMatch":true},"timestamp":{"validated":true,"trusted":true}}],"trustListUsed":true}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Either raw image bytes (Content-Type image/*, one of image/jpeg, image/png, image/webp, image/gif, image/tiff, image/avif, image/heic) OR a JSON body { url }. Max 10 MB.","properties":{"url":{"type":"string","format":"uri","description":"Public http(s) URL of an image (alternative to sending bytes)."},"attest":{"type":"string","description":"Set to 1 for an Ed25519-signed attestation of the result (audit trail)."}}},"example":{"url":"https://example.com/photo-with-credentials.jpg"}}}}}},"/v1/rerank":{"post":{"operationId":"rerank","summary":"Rerank passages by relevance to a query via Cloudflare Workers AI (@cf/baai/bge-reranker-base). Send {query, documents[] (≤50, each ≤4000 chars), topK?}; returns [{index, score}] best-first — the missing link after embed/chunk, keeping the top chunks before a costly LLM call. Score is the model's relevance score (higher = better), named as it only compares within this model. Unavailable binding → 503, unbilled.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.004"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"results":{"type":"array","description":"Ranked best-first. `index` refers to the input documents array.","items":{"type":"object","properties":{"index":{"type":"integer","description":"Position of this document in the request `documents` array."},"score":{"type":"number","description":"Relevance score from the model (higher = more relevant)."},"document":{"type":"string","description":"The document text (only when returnDocuments=true)."}},"required":["index","score"]}},"model":{"type":"string","description":"The reranker model used (scores compare only within one model)."}},"required":["results","model"],"additionalProperties":false},"example":{"results":[{"index":0,"score":0.98},{"index":2,"score":0.71}],"model":"@cf/baai/bge-reranker-base"}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","description":"The search query (≤ 4000 chars)."},"documents":{"type":"array","items":{"type":"string"},"maxItems":50,"description":"Candidate passages to rank (≤ 50, each ≤ 4000 chars)."},"topK":{"type":"integer","minimum":1,"description":"Return only the K best (default: all, ranked)."},"returnDocuments":{"type":"boolean","default":false,"description":"Include each ranked document's text in the results."}},"required":["query","documents"]},"example":{"query":"How do I reset my password?","documents":["To reset your password, click 'Forgot password' on the sign-in page.","Our office is open Monday to Friday, 9am to 5pm.","Passwords must be at least 12 characters and are reset from account settings."],"topK":2}}}}}},"/v1/json-validate":{"post":{"operationId":"json-validate","summary":"Validate a JSON value against a JSON Schema (draft 2020-12 default; 2019-09/7/4 via $schema). Send {data, schema}; returns {valid, errors:[{path, message, keyword}]} with a JSON Pointer path per failure. For agents checking structured/tool-call output before use. Runs on an eval-less validator (Ajv can't run on Workers). Remote $ref is refused (self-contained only); unsafe regex patterns are rejected before compilation.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"valid":{"type":"boolean"},"errors":{"type":"array","description":"Empty when valid. One entry per failed assertion.","items":{"type":"object","properties":{"path":{"type":"string","description":"JSON Pointer to the failing location in `data` (e.g. /age)."},"message":{"type":"string","description":"Human explanation of the failure."},"keyword":{"type":"string","description":"The JSON Schema keyword that failed (e.g. minimum, required, type)."}},"required":["path","message","keyword"]}}},"required":["valid","errors"],"additionalProperties":false},"example":{"valid":false,"errors":[{"path":"/age","message":"Instance value must be >= 0.","keyword":"minimum"}]}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"description":"The JSON value to validate (any type: object, array, string, number, boolean, null)."},"schema":{"type":"object","description":"A self-contained JSON Schema. Only local #… $refs; no remote $ref."}},"required":["data","schema"]},"example":{"data":{"name":"Ada","age":36},"schema":{"type":"object","properties":{"name":{"type":"string"},"age":{"type":"integer","minimum":0}},"required":["name","age"]}}}}}}},"/v1/x402-quote":{"get":{"operationId":"x402-quote","summary":"Enriched quote for an x402 endpoint: probes it unpaid (never pays, SSRF-checked), decodes {price, asset, network, payTo}, then compares the USD price against the live Bazaar market for its category → {marketContext:{category, medianForCategory, cheaperThanMarket}}. Not just how much, but whether it's fair. Market context is best-effort; the decoded quote returns even if the Bazaar read fails. Neutral — our own endpoints are never featured.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"isX402":{"type":"boolean"},"status":{"type":"integer"},"price":{"type":"string","description":"Chosen accept's amount in atomic units of the asset."},"priceUsd":{"type":"number","description":"USD price when the asset is a recognised USD stablecoin."},"asset":{"type":"string"},"network":{"type":"string"},"payTo":{"type":"string"},"description":{"type":"string"},"resource":{"type":"string"},"marketContext":{"type":"object","properties":{"category":{"type":"string","description":"Derived category keyword the market is sampled for."},"sampleSize":{"type":"integer","description":"USD-priced Bazaar resources matched for the category."},"medianForCategory":{"type":"number","description":"Median USD price across the matched category (omitted if <3 matches)."},"cheaperThanMarket":{"type":"boolean","description":"True when this endpoint's USD price is below the category median."}},"required":["category","sampleSize"]},"discovery":{"type":"object","description":"Bazaar/discovery extension, passed through verbatim when present."}},"required":["isX402","status"]},"example":{"isX402":true,"status":402,"price":"2000","priceUsd":0.002,"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","payTo":"0x209693Bc6afc0C5328bA36FaF03C514EF312287C","description":"Fetch an RSS 2.0 or Atom feed and return clean JSON.","resource":"https://402utils.com/v1/rss-to-json","marketContext":{"category":"rss","sampleSize":4,"medianForCategory":0.003,"cheaperThanMarket":true}}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"url","in":"query","required":true,"description":"Public http(s) URL of the x402 endpoint to quote (required).","schema":{"type":"string","format":"uri","description":"Public http(s) URL of the x402 endpoint to quote (required)."}}]}},"/v1/x402-batch-probe":{"post":{"operationId":"x402-batch-probe","summary":"Probe up to 10 x402 endpoints in parallel and get each one's reachability and decoded price — for an agent comparing several sellers at once. Send {urls:[…]}; returns [{url, reachable, isX402, price?, priceUsd?, error?}]. Each URL is SSRF-validated independently and NO payment is ever sent; one unreachable URL never fails the batch (it is reported per-URL). Reuses the same decoder as x402-probe.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.003"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"reachable":{"type":"boolean","description":"False when the URL was SSRF-rejected or could not be fetched."},"isX402":{"type":"boolean"},"status":{"type":"integer","description":"HTTP status the target answered with (when reachable)."},"price":{"type":"string","description":"Cheapest advertised amount in atomic units (when x402)."},"priceUsd":{"type":"number","description":"USD price when the asset is a recognised USD stablecoin."},"error":{"type":"string","description":"Why this URL is not reachable/decodable (url_rejected, fetch_failed, response_too_large)."}},"required":["url","reachable","isX402"]}}},"required":["results"],"additionalProperties":false},"example":{"results":[{"url":"https://402utils.com/v1/rss-to-json","reachable":true,"isX402":true,"status":402,"price":"2000","priceUsd":0.002},{"url":"https://402utils.com/v1/qr","reachable":true,"isX402":true,"status":402,"price":"2000","priceUsd":0.002}]}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"urls":{"type":"array","items":{"type":"string","format":"uri"},"maxItems":10,"description":"1–10 public http(s) URLs to probe."}},"required":["urls"]},"example":{"urls":["https://402utils.com/v1/rss-to-json","https://402utils.com/v1/qr"]}}}}}},"/v1/regex-test":{"post":{"operationId":"regex-test","summary":"Test a regex against one or many inputs, safely. Send {pattern, flags?, input|inputs[], mode?}: 'match' returns the first match + capture groups, 'matchAll' every match, 'replace' the rewritten string (needs {replacement}). A mandatory ReDoS guard statically rejects catastrophic patterns (nested quantifiers, `.*.*$`, backrefs) BEFORE running — on Workers no timeout can stop a runaway regex. For agents that generate and dry-run regexes.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.001"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"mode":{"type":"string","enum":["match","matchAll","replace"]},"results":{"type":"array","description":"One entry per input (in order). Shape depends on mode.","items":{"type":"object"}}},"required":["mode","results"],"additionalProperties":false},"example":{"mode":"match","results":[{"matched":true,"match":"2026-07-06","index":6,"groups":["2026","07","06"]}]}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"pattern":{"type":"string","description":"The regular expression source (no delimiters)."},"flags":{"type":"string","description":"Any of gimsuyd (g added automatically for matchAll)."},"input":{"type":"string","description":"A single input string (≤ 10000 chars)."},"inputs":{"type":"array","items":{"type":"string"},"maxItems":50,"description":"Multiple input strings."},"mode":{"type":"string","enum":["match","matchAll","replace"],"default":"match","description":"match | matchAll | replace."},"replacement":{"type":"string","description":"Replacement string (with $1, $<name>) — required for mode 'replace'."}},"required":["pattern"]},"example":{"pattern":"(\\d{4})-(\\d{2})-(\\d{2})","input":"date: 2026-07-06","mode":"match"}}}}}},"/v1/jsonpath":{"post":{"operationId":"jsonpath","summary":"Extract values from a JSON document with a JSONPath expression or an RFC 6901 JSON Pointer, without returning the whole document. Send {data, path}; get {matches, count}. Path starting with $ = JSONPath ($.items[*].price, $..author, [0], [1:5], [*]); starting with / = JSON Pointer (/items/0/price). No-eval tree walk with bounded traversal; filter expressions [?(…)] are not supported by design.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"matches":{"type":"array","description":"The matched values, in document order.","items":{}},"count":{"type":"integer","description":"Number of matches (0 when nothing matched)."}},"required":["matches","count"],"additionalProperties":false},"example":{"matches":[10,22,7],"count":3}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"description":"The JSON document to query (any type)."},"path":{"type":"string","description":"A JSONPath ($.a.b[*]) or RFC 6901 JSON Pointer (/a/b/0)."}},"required":["data","path"]},"example":{"data":{"items":[{"price":10},{"price":22},{"price":7}]},"path":"$.items[*].price"}}}}}},"/v1/json-transform":{"post":{"operationId":"json-transform","summary":"Reshape JSON declaratively — predictable, not a language. `mapping` mirrors the output shape; its leaf strings are dot-paths into `data` (a.b.0.c; negative index ok; 'contacts.*.email' projects over an array; '=text' escapes a literal). Objects/arrays nest; number/boolean/null are literals. Missing paths → null. Field rename/flatten/projection to fit a payload to a target schema. Distinct from /v1/jq (declarative vs query language).","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"result":{"description":"The reshaped JSON, in the shape of `mapping`."}},"required":["result"]},"example":{"result":{"name":"Ada","surname":"Lovelace","firstTag":"math","kind":"person"}}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"A source document and a declarative mapping describing the output.","properties":{"data":{"description":"The source document — any JSON value."},"mapping":{"description":"The output shape: an object/array whose leaf strings are dot-paths ('user.name'), '*' projections, or '=literal' escapes."}},"required":["data","mapping"]},"example":{"data":{"user":{"first":"Ada","last":"Lovelace"},"tags":["math","computing"]},"mapping":{"name":"user.first","surname":"user.last","firstTag":"tags.0","kind":"=person"}}}}}}},"/v1/csv-diff":{"post":{"operationId":"csv-diff","summary":"Row-level diff of two CSVs (a→b) — reconcile two exports. With `key` (a column name, or a column index when header:false), rows pair by key → added / removed / changed (per-field old→new). Without a key, a whole-row multiset diff gives added/removed only. Delimiter auto-detected (, ; tab |); tolerant RFC-4180 parsing. First row is the header unless header:false. Max 5 MB per input; reported buckets cap at 10000.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.003"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"keyed":{"type":"boolean","description":"True when rows were paired by a key."},"key":{"type":["string","null"],"description":"The key column used, or null."},"delimiter":{"type":"object","description":"Detected delimiter for each input ({a, b})."},"headers":{"type":"object","description":"Header names for each input (null in header:false mode)."},"added":{"type":"array","description":"Rows present in b but not a (objects in header mode, arrays otherwise)."},"removed":{"type":"array","description":"Rows present in a but not b."},"changed":{"type":"array","description":"Keyed mode only: rows whose fields differ. Each: {key, fields:{col:{a,b}}}.","items":{"type":"object"}},"summary":{"type":"object","description":"Counts: {added, removed, changed, unchanged?, duplicateKeys?}."},"truncated":{"type":"boolean","description":"True when any bucket was capped at 10000 entries."}},"required":["keyed","key","delimiter","headers","added","removed","changed","summary"]},"example":{"keyed":true,"key":"id","delimiter":{"a":",","b":","},"headers":{"a":["id","qty"],"b":["id","qty"]},"added":[{"id":"3","qty":"7"}],"removed":[{"id":"2","qty":"5"}],"changed":[{"key":"1","fields":{"qty":{"a":"10","b":"12"}}}],"summary":{"added":1,"removed":1,"changed":1,"unchanged":0}}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Two CSV strings and an optional key column.","properties":{"a":{"type":"string","description":"Original CSV (max 5 MB UTF-8)."},"b":{"type":"string","description":"New CSV (max 5 MB UTF-8)."},"key":{"type":"string","description":"Column name (header mode) or column index like \"0\" (header:false) to pair rows by. Omit for a keyless whole-row diff."},"header":{"type":"boolean","default":true,"description":"Treat the first row as a header. When false, rows are arrays and key is an index."}},"required":["a","b"]},"example":{"a":"id,qty\n1,10\n2,5\n","b":"id,qty\n1,12\n3,7\n","key":"id"}}}}}},"/v1/dedupe":{"post":{"operationId":"dedupe","summary":"De-duplicate a list of records or strings. Exact: group by a `key` field (dot-path) or, by default, the whole item (key-order-insensitive). Fuzzy (`fuzzy`: a field name, or true for scalar strings): group by normalized Levenshtein similarity ≥ `threshold` (default 0.85) — e.g. 'Jean Dupont' ≈ 'jean  dupont' but 'Jean Martin' stays separate. Returns unique[] and duplicates[] (kept + dropped indices). Fuzzy ≤ 1000 items.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"unique":{"type":"array","description":"One representative (first occurrence) per group, in order."},"duplicates":{"type":"array","description":"Groups that had duplicates: {kept, keptIndex, dropped:[{index, item}]}.","items":{"type":"object"}},"uniqueCount":{"type":"integer"},"duplicateCount":{"type":"integer","description":"Total dropped items."}},"required":["unique","duplicates","uniqueCount","duplicateCount"]},"example":{"unique":[{"name":"Jean Dupont"},{"name":"Jean Martin"}],"duplicates":[{"kept":{"name":"Jean Dupont"},"keptIndex":0,"dropped":[{"index":1,"item":{"name":"jean  dupont"}}]}],"uniqueCount":2,"duplicateCount":1}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"A list plus an optional exact `key` OR a `fuzzy` field.","properties":{"items":{"type":"array","description":"The values to deduplicate (objects or scalars)."},"key":{"type":"string","description":"Exact mode: dot-path to the field that identifies a duplicate. Omit to dedupe whole items."},"fuzzy":{"description":"Fuzzy mode: a field name (dot-path) to compare, or true to compare scalar strings whole."},"threshold":{"type":"number","minimum":0,"maximum":1,"default":0.85,"description":"Fuzzy similarity threshold in (0,1]. Higher = stricter. Default 0.85."}},"required":["items"]},"example":{"items":[{"name":"Jean Dupont"},{"name":"jean  dupont"},{"name":"Jean Martin"}],"fuzzy":"name"}}}}}},"/v1/sentences":{"post":{"operationId":"sentences","summary":"Segment text into sentences — robust to the classic traps: abbreviations (Dr., e.g.), decimals ($3.14), URLs/emails (www.x.com), initials (J. R. R.) and ellipses. A period is a boundary only when followed by whitespace and a sentence-like start; !, ? and … are stronger; blank lines split paragraphs. Rule-based (EN/FR tuned), deterministic. A fine-grained chunking primitive, complements /v1/chunk. Over 1 MB truncated.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.001"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"sentences":{"type":"array","items":{"type":"string"},"description":"Sentences in reading order, trimmed."},"count":{"type":"integer","description":"Number of sentences."},"truncated":{"type":"boolean","description":"True when the input exceeded 1 MB."}},"required":["sentences","count"]},"example":{"sentences":["Dr. Smith paid $3.14 to www.x.com.","Then he left."],"count":2}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Provided text in, sentences out. Nothing is fetched.","properties":{"text":{"type":"string","description":"The text to segment (max 1 MB UTF-8; larger is truncated)."},"lang":{"type":"string","description":"Optional language hint (e.g. 'en', 'fr'). The abbreviation list already covers EN+FR."}},"required":["text"]},"example":{"text":"Dr. Smith paid $3.14 to www.x.com. Then he left."}}}}}},"/v1/keywords":{"post":{"operationId":"keywords","summary":"Extract salient keywords/key-phrases from text via TextRank (word co-occurrence graph + PageRank), merging adjacent high-ranked words into phrases. Pure, deterministic, model-free — extractive, NOT ML/NER or an LLM (the point: reproducible, no inference cost). English + French stopwords removed. Returns keywords[] with normalized scores (top ≈ 1). For content tagging/indexing and pre-RAG. Over 100k tokens is truncated.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"keywords":{"type":"array","description":"Ranked key-phrases, most salient first.","items":{"type":"object","properties":{"term":{"type":"string","description":"The key-phrase (one or more words)."},"score":{"type":"number","description":"Relative salience, normalized so the top term ≈ 1."}},"required":["term","score"]}},"truncated":{"type":"boolean","description":"True when the input exceeded the token cap."}},"required":["keywords"]},"example":{"keywords":[{"term":"cloudflare workers","score":1},{"term":"edge computing","score":0.71},{"term":"v8 isolates","score":0.58}]}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Provided text in, ranked key-phrases out. Nothing is fetched.","properties":{"text":{"type":"string","description":"The text to analyze (max 1 MB UTF-8; larger is truncated)."},"topK":{"type":"integer","minimum":1,"maximum":50,"default":10,"description":"How many key-phrases to return."}},"required":["text"]},"example":{"text":"Cloudflare Workers run JavaScript at the edge using V8 isolates. Workers have near-zero cold starts and per-request billing, which makes edge computing cheap for high-traffic APIs.","topK":5}}}}}},"/v1/text-similarity":{"post":{"operationId":"text-similarity","summary":"Similarity of two texts in [0,1]. Methods: `jaccard` (word-set overlap, default), `levenshtein` (normalized edit distance) — both pure & deterministic — and `cosine-embed` (cosine of Cloudflare Workers AI embeddings @cf/baai/bge-m3, semantic; model named). Compare two texts (dedup, matching) without handling embeddings yourself. cosine-embed 503s unbilled if the AI binding is unavailable. Caps: jaccard 200k, levenshtein 5k, cosine 4k chars.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"score":{"type":"number","description":"Similarity in [0,1] (cosine may be slightly negative). Higher = more similar."},"method":{"type":"string","enum":["jaccard","levenshtein","cosine-embed"]},"model":{"type":"string","description":"Present for cosine-embed: the embedding model used."}},"required":["score","method"]},"example":{"score":0.62,"method":"cosine-embed","model":"@cf/baai/bge-m3"}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Two texts and an optional method.","properties":{"a":{"type":"string","description":"First text."},"b":{"type":"string","description":"Second text."},"method":{"type":"string","enum":["jaccard","levenshtein","cosine-embed"],"default":"jaccard","description":"jaccard (word-set), levenshtein (edit distance), or cosine-embed (semantic embeddings)."}},"required":["a","b"]},"example":{"a":"A cat sat on the mat.","b":"The feline rested on the rug.","method":"cosine-embed"}}}}}},"/v1/favicon":{"get":{"operationId":"favicon","summary":"Resolve a website's best icon: parses <head> for link rel=icon / apple-touch-icon / mask-icon, reads a linked web app manifest's icons, and adds the /favicon.ico fallback, then ranks them (scalable/large first). Returns the best iconUrl plus all ranked candidates with rel/sizes/type/source. The URL is SSRF-checked; fetches are capped. For agents building directories or UIs.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"The URL as requested."},"finalUrl":{"type":"string","description":"URL after redirects; base for absolutization."},"iconUrl":{"type":"string","description":"The best icon (absolute). Falls back to <origin>/favicon.ico."},"candidates":{"type":"array","description":"All discovered icons, ranked best-first.","items":{"type":"object","properties":{"url":{"type":"string"},"rel":{"type":"string","description":"icon / apple-touch-icon / mask-icon / manifest / fallback."},"sizes":{"type":"string","description":"Declared sizes, when present."},"type":{"type":"string","description":"MIME type, when present."},"source":{"type":"string","enum":["link","manifest","fallback"]}},"required":["url","rel","source"]}}},"required":["url","finalUrl","iconUrl","candidates"]},"example":{"url":"https://github.com","finalUrl":"https://github.com/","iconUrl":"https://github.githubassets.com/favicons/favicon.svg","candidates":[{"url":"https://github.githubassets.com/favicons/favicon.svg","rel":"icon","type":"image/svg+xml","source":"link"},{"url":"https://github.com/favicon.ico","rel":"fallback","source":"fallback"}]}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"url","in":"query","required":true,"description":"Public http(s) page URL (required).","schema":{"type":"string","format":"uri","description":"Public http(s) page URL (required)."}}]}},"/v1/jq":{"post":{"operationId":"jq","summary":"Apply a jq-style filter to JSON — the JSON swiss-army knife. Supports identity, fields, index/slice/iterate, pipe |, comma, //, and/or/not, arithmetic, comparisons, array/object construction and builtins (select, map, keys, length, add, sort_by, group_by, unique, to_entries, has, range…). A SAFE pure-JS subset (no eval, bounded): no variables, def, reduce, regex or assignment. Returns the whole jq output stream as results[].","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.003"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"results":{"type":"array","description":"The jq output stream (jq is a stream; one filter can yield 0, 1 or many values)."},"count":{"type":"integer","description":"Number of values in results."}},"required":["results","count"]},"example":{"results":[["Ada"]],"count":1}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"A JSON document and a jq filter to run over it.","properties":{"json":{"description":"The input document — any JSON value (object, array, string, number, boolean or null)."},"filter":{"type":"string","description":"A jq-style filter, e.g. '.users | map(.name)'. Max 8192 chars."}},"required":["json","filter"]},"example":{"json":{"users":[{"name":"Ada","age":36},{"name":"Bo","age":29}]},"filter":".users | map(select(.age > 30) | .name)"}}}}}},"/v1/tech-detect":{"get":{"operationId":"tech-detect","summary":"Detect a website's tech stack — frameworks, CMS, e-commerce, analytics, tag managers, CDN, web server, language — from response headers, cookies, <meta generator> and HTML/script markers. HEURISTIC, signature-based on PUBLIC fingerprints (NOT the licensed Wappalyzer database): strong on popular tech, conservative elsewhere; not-listed ≠ absent. Each hit carries a confidence and the matched evidence. The URL is SSRF-checked; the fetch is capped.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.004"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"The URL as requested."},"finalUrl":{"type":"string","description":"URL after redirects."},"technologies":{"type":"array","description":"Detected technologies, highest confidence first.","items":{"type":"object","properties":{"name":{"type":"string"},"category":{"type":"string","description":"framework, cms, ecommerce, analytics, cdn, web-server, language…"},"confidence":{"type":"string","enum":["high","medium","low"]},"evidence":{"type":"string","description":"What matched (e.g. 'html:__NEXT_DATA__', 'header:server=cloudflare')."},"version":{"type":"string","description":"Best-effort version (from <meta generator>), when available."}},"required":["name","category","confidence","evidence"]}},"note":{"type":"string","description":"Honest scope disclaimer (heuristic, public signatures)."}},"required":["url","finalUrl","technologies","note"]},"example":{"url":"https://vercel.com","finalUrl":"https://vercel.com/","technologies":[{"name":"Next.js","category":"framework","confidence":"high","evidence":"html:__NEXT_DATA__"},{"name":"Vercel","category":"hosting","confidence":"high","evidence":"header:x-vercel-id=iad1::abc"},{"name":"React","category":"javascript-library","confidence":"medium","evidence":"implied by Next.js"}],"note":"Heuristic, signature-based on public fingerprints (not the licensed Wappalyzer database). Strong on popular tech; a technology that is not listed is not necessarily absent."}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"url","in":"query","required":true,"description":"Public http(s) page URL (required).","schema":{"type":"string","format":"uri","description":"Public http(s) page URL (required)."}}]}},"/v1/lei-lookup":{"get":{"operationId":"lei-lookup","summary":"Global KYB via the official GLEIF registry. ?lei=<20-char LEI> returns legal name, entity + registration status, jurisdiction, address, next renewal and direct parent; ?name=&country= searches by name. The ISO 17442 checksum is verified locally, so a typo is a 400 with no network call. GLEIF down → 503, unbilled. Public CC0 data. Part of the EU compliance toolkit; enriches supplier-check.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.003"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"found":{"type":"boolean"},"lei":{"type":"string"},"legalName":{"type":"string"},"entityStatus":{"type":"string","description":"ACTIVE | INACTIVE."},"registrationStatus":{"type":"string","description":"GLEIF registration status: ISSUED | LAPSED | RETIRED | ..."},"jurisdiction":{"type":"string"},"legalForm":{"type":"string","description":"ELF legal-form code."},"address":{"type":"string","description":"One-line legal address."},"country":{"type":"string"},"nextRenewal":{"type":"string","format":"date-time","description":"registration.nextRenewalDate."},"bic":{"type":"array","items":{"type":"string"}},"parent":{"type":"object","description":"Direct accounting-consolidation parent, when reported.","properties":{"lei":{"type":"string"},"legalName":{"type":"string"}}},"count":{"type":"integer","description":"Name-search: total matches in the registry."},"matches":{"type":"array","description":"Name-search: up to 10 candidate records.","items":{"type":"object"}},"cached":{"type":"boolean"},"source":{"type":"string","const":"GLEIF"},"attestation":{"type":"object","description":"Present only with ?attest=1. Ed25519 signature over the canonical result; verify against /.well-known/402utils-attestation.json.","properties":{"payload":{"type":"object","properties":{"endpoint":{"type":"string"},"resultSha256":{"type":"string","description":"SHA-256 of the canonical JSON of the result (attestation excluded)."},"ts":{"type":"string","format":"date-time"},"kid":{"type":"string","description":"Key id — matches a key in the .well-known document."}}},"sig":{"type":"string","description":"base64url Ed25519 signature over the canonical JSON of payload."},"alg":{"type":"string","const":"Ed25519"}}}},"required":["found","source"]},"example":{"found":true,"lei":"529900D6BF99LW9R2E68","legalName":"Herausgebergemeinschaft Wertpapier-Mitteilungen Keppler, Lehmann GmbH & Co. KG","entityStatus":"ACTIVE","registrationStatus":"ISSUED","jurisdiction":"DE","address":"Sandweg 94, 60316 Frankfurt am Main, DE-HE, DE","nextRenewal":"2027-04-14T08:44:35Z","parent":{"lei":"529900VI6TPALJ7KP272","legalName":"Interessengemeinschaft Frankfurter Kreditinstitute GmbH"},"source":"GLEIF"}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"lei","in":"query","required":false,"description":"A 20-character ISO 17442 LEI, e.g. 529900D6BF99LW9R2E68.","schema":{"type":"string","description":"A 20-character ISO 17442 LEI, e.g. 529900D6BF99LW9R2E68."}},{"name":"name","in":"query","required":false,"description":"Legal name to search for (alternative to `lei`).","schema":{"type":"string","description":"Legal name to search for (alternative to `lei`)."}},{"name":"country","in":"query","required":false,"description":"With `name`: restrict to a legal-address country (ISO 3166 alpha-2).","schema":{"type":"string","description":"With `name`: restrict to a legal-address country (ISO 3166 alpha-2)."}},{"name":"attest","in":"query","required":false,"description":"Set to 1 for an Ed25519-signed attestation of the result (audit trail).","schema":{"type":"string","description":"Set to 1 for an Ed25519-signed attestation of the result (audit trail)."}}]}},"/v1/vat-oss":{"get":{"operationId":"vat-oss","summary":"EU B2C e-commerce VAT: where a distance sale is taxed and how much. Applies the €10,000/year OSS threshold — at/below → seller-country VAT (domestic); above → consumer-country VAT via OSS. IOSS for imports ≤ €150. ?sellerCountry=&buyerCountry=&amount= (+ ytdCrossBorder, category). Returns scheme, taxationPlace, applicableCountry, vatRate, vatAmount. Calculation aid; OSS/IOSS registration and filing are the seller's responsibility.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"sellerCountry":{"type":"string"},"buyerCountry":{"type":"string"},"sellerInEu":{"type":"boolean"},"crossBorder":{"type":"boolean"},"amount":{"type":"number"},"scheme":{"type":"string","enum":["domestic","OSS","IOSS"]},"taxationPlace":{"type":"string","enum":["origin","destination"],"description":"origin = seller's country; destination = consumer's country."},"applicableCountry":{"type":"string","description":"The member state whose VAT rate applies."},"category":{"type":"string"},"vatRate":{"type":"number","description":"Applied VAT rate (%)."},"vatAmount":{"type":"number","description":"VAT due on the sale (EUR, 2dp)."},"grossAmount":{"type":"number","description":"amount + vatAmount."},"ossThresholdEur":{"type":"integer","const":10000},"ytdCrossBorderEur":{"type":"number"},"thresholdExceeded":{"type":"boolean","description":"True when cumulative cross-border B2C sales incl. this one exceed €10,000."},"rateNote":{"type":"string"},"vatRatesSource":{"type":"string","format":"uri"},"vatRatesAsOf":{"type":"string","format":"date"},"source":{"type":"string","format":"uri"},"disclaimer":{"type":"string"}},"required":["scheme","taxationPlace","applicableCountry","vatRate","vatAmount","ossThresholdEur","thresholdExceeded","disclaimer"]},"example":{"sellerCountry":"FR","buyerCountry":"DE","sellerInEu":true,"crossBorder":true,"amount":100,"scheme":"OSS","taxationPlace":"destination","applicableCountry":"DE","category":"standard","vatRate":19,"vatAmount":19,"grossAmount":119,"ossThresholdEur":10000,"ytdCrossBorderEur":15000,"thresholdExceeded":true,"vatRatesSource":"https://europa.eu/youreurope/business/taxation/vat/vat-rules-rates/index_en.htm","vatRatesAsOf":"2026-05-19","source":"https://vat-one-stop-shop.ec.europa.eu/index_en","disclaimer":"Calculation aid; OSS/IOSS registration and filing are the seller's responsibility. Assumes a B2C distance sale (goods or TBE services) and standard treatment; special regimes, exemptions and the seller's own OSS opt-in are not modelled."}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"sellerCountry","in":"query","required":true,"description":"Seller's country ISO alpha-2. Non-EU → an import (IOSS if ≤ €150).","schema":{"type":"string","description":"Seller's country ISO alpha-2. Non-EU → an import (IOSS if ≤ €150)."}},{"name":"buyerCountry","in":"query","required":true,"description":"Consumer's country ISO alpha-2 (must be an EU member state).","schema":{"type":"string","description":"Consumer's country ISO alpha-2 (must be an EU member state)."}},{"name":"amount","in":"query","required":true,"description":"Net sale amount in EUR (VAT-exclusive).","schema":{"type":"number","description":"Net sale amount in EUR (VAT-exclusive)."}},{"name":"ytdCrossBorder","in":"query","required":false,"description":"Optional: your cumulative intra-EU cross-border B2C sales this year (EUR), excluding this one. Default 0. Decides the €10,000 threshold.","schema":{"type":"number","description":"Optional: your cumulative intra-EU cross-border B2C sales this year (EUR), excluding this one. Default 0. Decides the €10,000 threshold."}},{"name":"category","in":"query","required":false,"description":"Optional VAT rate category to apply (default standard).","schema":{"type":"string","enum":["standard","reduced","super_reduced","parking"],"description":"Optional VAT rate category to apply (default standard)."}}]}},"/v1/eori-check":{"get":{"operationId":"eori-check","summary":"Validate an EU EORI number (the customs operator id for any EU import/export) against the Commission's official EOS service. Format is checked locally first, so junk never hits the network. Valid numbers return the registered name/address when the operator consented. Never a false 'invalid': if the service is down you get a 503, not charged. Complements vat-check in the EU compliance toolkit. ?attest=1 → Ed25519-signed.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"eori":{"type":"string"},"valid":{"type":"boolean"},"exists":{"type":"boolean","description":"True iff the EORI is registered and active (equals valid)."},"country":{"type":"string","description":"ISO 3166 alpha-2 from the EORI prefix."},"reason":{"type":"string","description":"Present when valid=false due to local format: 'invalid_format'."},"name":{"type":"string","description":"Registered name (only if the operator consented to publication)."},"address":{"type":"string","description":"Registered address (only if consented)."},"checkedAt":{"type":"string","format":"date-time"},"source":{"type":"string","const":"EU-EOS"},"attestation":{"type":"object","description":"Present only with ?attest=1. Ed25519 signature over the canonical result; verify against /.well-known/402utils-attestation.json.","properties":{"payload":{"type":"object","properties":{"endpoint":{"type":"string"},"resultSha256":{"type":"string","description":"SHA-256 of the canonical JSON of the result (attestation excluded)."},"ts":{"type":"string","format":"date-time"},"kid":{"type":"string","description":"Key id — matches a key in the .well-known document."}}},"sig":{"type":"string","description":"base64url Ed25519 signature over the canonical JSON of payload."},"alg":{"type":"string","const":"Ed25519"}}}},"required":["eori","valid","exists","checkedAt","source"]},"example":{"eori":"NL822502975","valid":true,"exists":true,"country":"NL","name":"STARTECH.COM LTD","address":"UNIT B GOWERTON RD BRACKMILLS, NN4 7BW, NORTHAMPTON, United Kingdom","checkedAt":"2026-07-06T12:00:00.000Z","source":"EU-EOS"}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"eori","in":"query","required":true,"description":"EORI number, e.g. NL822502975 or DE1234567890123.","schema":{"type":"string","description":"EORI number, e.g. NL822502975 or DE1234567890123."}},{"name":"attest","in":"query","required":false,"description":"Set to 1 for an Ed25519-signed attestation of the result (audit trail).","schema":{"type":"string","description":"Set to 1 for an Ed25519-signed attestation of the result (audit trail)."}}]}},"/v1/eu-sanctions":{"post":{"operationId":"eu-sanctions","summary":"Screen a name against the EU consolidated financial sanctions list ONLY (official embedded snapshot, persons + entities — NOT OFAC/SDN, UN or UK/OFSI). Fuzzy matching returns each hit with a score, sanction programme, listing date and matched name. POST body {name, type?, threshold?} (POST so the name never enters logs). A screening aid: a match is not a compliance determination — verify with the official source before acting.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.004"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"searched":{"type":"string"},"listName":{"type":"string","const":"EU consolidated financial sanctions list"},"matchCount":{"type":"integer"},"matches":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"EU reference number of the listed entity."},"type":{"type":"string","enum":["person","entity"]},"matchedName":{"type":"string","description":"The listed name/alias that matched."},"score":{"type":"number","description":"Similarity 0-1 (1 = exact folded match)."},"programmes":{"type":"array","items":{"type":"string"},"description":"Sanction programmes."},"listedDate":{"type":"string","format":"date","description":"Earliest listing (regulation publication) date."}},"required":["id","type","matchedName","score","programmes"]}},"threshold":{"type":"number"},"listSize":{"type":"integer","description":"Total entities in the embedded EU list."},"asOf":{"type":"string","format":"date","description":"generationDate of the embedded snapshot."},"source":{"type":"string"},"sourceUrl":{"type":"string","format":"uri"},"note":{"type":"string","description":"Mandatory disclaimer."},"attestation":{"type":"object","description":"Present only with ?attest=1. Ed25519 signature over the canonical result; verify against /.well-known/402utils-attestation.json.","properties":{"payload":{"type":"object","properties":{"endpoint":{"type":"string"},"resultSha256":{"type":"string","description":"SHA-256 of the canonical JSON of the result (attestation excluded)."},"ts":{"type":"string","format":"date-time"},"kid":{"type":"string","description":"Key id — matches a key in the .well-known document."}}},"sig":{"type":"string","description":"base64url Ed25519 signature over the canonical JSON of payload."},"alg":{"type":"string","const":"Ed25519"}}}},"required":["searched","listName","matchCount","matches","asOf","source","note"]},"example":{"searched":"Saddam Hussein","listName":"EU consolidated financial sanctions list","matchCount":1,"matches":[{"id":"EU.27.28","type":"person","matchedName":"Saddam Hussein Al-Tikriti","score":1,"programmes":["IRQ"],"listedDate":"2003-07-08"}],"threshold":0.85,"listSize":5994,"asOf":"2026-06-05","source":"European Commission — Consolidated list of persons, groups and entities subject to EU financial sanctions","sourceUrl":"https://data.europa.eu/data/datasets/consolidated-list-of-persons-groups-and-entities-subject-to-eu-financial-sanctions","note":"Screening aid against the EU consolidated financial sanctions list only (not OFAC/SDN, UN or UK/OFSI). A name match is NOT a compliance determination — verify against the official source before acting. Snapshot; refreshed on rebuild."}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"JSON body: `name` required; optional `type` (person|entity) and `threshold` (0.5-1).","properties":{"name":{"type":"string","description":"The name to screen (person or organisation)."},"type":{"type":"string","enum":["person","entity"],"description":"Restrict to persons or entities."},"threshold":{"type":"number","minimum":0.5,"maximum":1,"description":"Match cutoff (default 0.85, min 0.5)."},"attest":{"type":"string","description":"Set to 1 for an Ed25519-signed attestation of the result (audit trail)."}},"required":["name"]},"example":{"name":"Saddam Hussein"}}}}}},"/v1/ecb-calendar":{"get":{"operationId":"ecb-calendar","summary":"TARGET2/T2 settlement calendar — the SEPA banking calendar, to predict when a euro transfer settles. TARGET is closed on weekends + six fixed days (New Year, Good Friday, Easter Monday, 1 May, 25 & 26 Dec). ?year= lists the closing days; ?date= says whether it settles (and the next open day); ?date=&addBusinessDays=N returns the value date N settlement days away. The SEPA counterpart of /v1/business-days.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.001"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer"},"holidays":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string"},"name":{"type":"string"},"weekday":{"type":"string"}},"required":["date","name","weekday"]},"description":"Year mode: the six fixed TARGET closing days."},"settlementDays":{"type":"integer","description":"Year mode: number of open (settlement) days in the year."},"date":{"type":"string"},"weekday":{"type":"string"},"isSettlementDay":{"type":"boolean","description":"Date mode: TARGET is open on this day."},"closed":{"type":"boolean"},"reason":{"type":"string","description":"When closed: 'weekend' or 'holiday'."},"holiday":{"type":"string","description":"When closed for a holiday: its name."},"nextSettlementDay":{"type":"string","description":"Date mode: the next open day when the given date is closed."},"addBusinessDays":{"type":"integer"},"result":{"type":"string","description":"Shift mode: the settlement date N days from the input."},"resultWeekday":{"type":"string"},"note":{"type":"string"},"source":{"type":"string","format":"uri"},"asOf":{"type":"string","format":"date"}}},"example":{"date":"2026-04-03","weekday":"Friday","addBusinessDays":1,"result":"2026-04-07","resultWeekday":"Tuesday","note":"2026-04-03 is Good Friday and 2026-04-06 Easter Monday, both TARGET closing days.","source":"https://www.ecb.europa.eu/paym/target/t2/html/index.en.html","asOf":"2026-07-06"}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"year","in":"query","required":false,"description":"Calendar year (1999-2100) — list its closing days.","schema":{"type":"integer","description":"Calendar year (1999-2100) — list its closing days."}},{"name":"date","in":"query","required":false,"description":"A date YYYY-MM-DD — check whether it is a settlement day.","schema":{"type":"string","description":"A date YYYY-MM-DD — check whether it is a settlement day."}},{"name":"addBusinessDays","in":"query","required":false,"description":"With ?date=: shift by N TARGET settlement days (sign = direction, |N| ≤ 3660).","schema":{"type":"integer","description":"With ?date=: shift by N TARGET settlement days (sign = direction, |N| ≤ 3660)."}}]}},"/v1/hash":{"post":{"operationId":"hash","summary":"Compute cryptographic hashes / checksums of a string or of raw bytes (base64). Returns lowercase hex for each requested algorithm: sha256 (default), sha512, sha1, md5. SHA via native Web Crypto; md5 and sha1 are offered for legacy interop only and flagged — not for security. POST so the input never lands in a URL/log. Verification/checksums only, not a hash cracker.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.001"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"bytes":{"type":"integer","description":"Byte length of the hashed input."},"hashes":{"type":"object","description":"Map of algorithm → lowercase hex digest."},"warnings":{"type":"array","items":{"type":"string"},"description":"Present when a broken/legacy algorithm (md5, sha1) was requested."}},"required":["bytes","hashes"]},"example":{"bytes":11,"hashes":{"sha256":"b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9","md5":"5eb63bbbe01eeed093cb22bb8f5acdc3"},"warnings":["md5 is a legacy checksum — not collision-resistant; do not use it for security."]}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Exactly one of `text` or `bytes`, plus an optional algorithm list.","properties":{"text":{"type":"string","description":"UTF-8 text to hash."},"bytes":{"type":"string","description":"Raw bytes as base64 (standard or url-safe) — alternative to `text`."},"algorithms":{"type":"array","items":{"type":"string","enum":["sha256","sha512","sha1","md5"]},"default":["sha256"],"description":"Which digests to compute (default [\"sha256\"])."}}},"example":{"text":"hello world","algorithms":["sha256","md5"]}}}}}},"/v1/color":{"get":{"operationId":"color","summary":"Colour utilities: ?op=convert (default) turns any hex/rgb()/hsl()/CSS-name into hex, rgb, hsl, hsv, alpha, relative luminance and exact CSS name; ?op=contrast with ?fg=&bg= returns the WCAG 2.x contrast ratio and AA/AAA pass/fail for normal & large text plus UI components (accessibility / EAA); ?op=palette derives complementary, analogous, triadic, tints and shades. Send hex without '#'.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.001"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","description":"Shape depends on `op`.","properties":{"op":{"type":"string"},"hex":{"type":"string"},"rgb":{"type":"object"},"hsl":{"type":"object"},"hsv":{"type":"object"},"luminance":{"type":"number","description":"WCAG relative luminance 0-1 (op=convert)."},"name":{"type":["string","null"],"description":"Exact CSS colour name, if any."},"ratio":{"type":"number","description":"WCAG contrast ratio 1-21 (op=contrast)."},"AA":{"type":"object","description":"AA pass/fail for normalText, largeText, uiComponents."},"AAA":{"type":"object","description":"AAA pass/fail for normalText, largeText."},"complementary":{"type":"string","description":"(op=palette)."},"analogous":{"type":"array","items":{"type":"string"}},"triadic":{"type":"array","items":{"type":"string"}},"tints":{"type":"array","items":{"type":"string"}},"shades":{"type":"array","items":{"type":"string"}}},"required":["op"]},"example":{"op":"contrast","fg":{"input":"000000","hex":"#000000"},"bg":{"input":"ffffff","hex":"#ffffff"},"ratio":21,"AA":{"normalText":true,"largeText":true,"uiComponents":true},"AAA":{"normalText":true,"largeText":true}}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"parameters":[{"name":"color","in":"query","required":false,"description":"The colour (convert/palette): hex without '#', rgb(), hsl() or a CSS name.","schema":{"type":"string","description":"The colour (convert/palette): hex without '#', rgb(), hsl() or a CSS name."}},{"name":"op","in":"query","required":false,"schema":{"type":"string","enum":["convert","contrast","palette"],"default":"convert"}},{"name":"fg","in":"query","required":false,"description":"Foreground colour (op=contrast).","schema":{"type":"string","description":"Foreground colour (op=contrast)."}},{"name":"bg","in":"query","required":false,"description":"Background colour (op=contrast). Falls back to `color` for fg.","schema":{"type":"string","description":"Background colour (op=contrast). Falls back to `color` for fg."}}]}},"/v1/unit-convert":{"post":{"operationId":"unit-convert","summary":"Convert a value between units in the same physical dimension: length, mass, volume, temperature, area, speed, data, energy, pressure, time, angle. Factors are exact SI constants (NIST SP 811) — deterministic, unlike an LLM's guess. Pass ?category=currency to convert ISO 4217 amounts at ECB reference rates instead (informational, not for pricing). Unknown units → 400 with a suggestion.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.001"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"value":{"type":"number"},"from":{"type":"string"},"to":{"type":"string"},"category":{"type":"string","description":"The detected dimension (or \"currency\")."},"result":{"type":"number","description":"The converted value."},"rate":{"type":"number","description":"Present for currency: units of `to` per unit of `from`."},"date":{"type":"string","description":"Present for currency: the effective ECB business day."},"source":{"type":"string","description":"Present for currency: \"ECB\"."}},"required":["value","from","to","category","result"]},"example":{"value":100,"from":"celsius","to":"fahrenheit","category":"temperature","result":212}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"The value plus source and target units. Query ?category=currency switches to FX.","properties":{"value":{"type":"number","description":"The amount to convert."},"from":{"type":"string","description":"Source unit (e.g. mile, kg, celsius) or ISO 4217 code for currency."},"to":{"type":"string","description":"Target unit (same dimension as `from`)."}},"required":["value","from","to"]},"example":{"value":100,"from":"celsius","to":"fahrenheit"}}}}}},"/v1/slugify":{"post":{"operationId":"slugify","summary":"Turn free multilingual text into a URL-safe slug. Transliterates Latin (all diacritics: é→e, ü→u), Cyrillic and Greek to ASCII; deterministic. Options: separator (default '-'), lowercase (default true), maxLength (cuts on a word boundary), transliterate (default true; false keeps letters of any script as a Unicode slug). Complex scripts (CJK, Arabic, Hebrew) are NOT romanised and are dropped.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.001"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"slug":{"type":"string"},"truncated":{"type":"boolean","description":"Whether maxLength shortened the slug."},"empty":{"type":"boolean","description":"True when nothing survived (e.g. an unsupported script)."}},"required":["slug","truncated","empty"]},"example":{"slug":"creme-brulee-a-la-vanille","truncated":false,"empty":false}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Text to slugify plus options.","properties":{"text":{"type":"string","description":"The source text."},"separator":{"type":"string","default":"-","description":"Word separator (max 10 chars)."},"lowercase":{"type":"boolean","default":true},"maxLength":{"type":"integer","minimum":1,"maximum":1000,"description":"Truncate the slug (on a separator boundary where possible)."},"transliterate":{"type":"boolean","default":true,"description":"Romanise to ASCII (true) or keep any-script letters (false)."}},"required":["text"]},"example":{"text":"Crème Brûlée à la Vanille"}}}}}},"/v1/mime-detect":{"post":{"operationId":"mime-detect","summary":"Detect a file's true MIME type from its magic-number byte signature — not from a declared extension or Content-Type. Send the raw bytes (≤10 MB) as the body, or JSON { bytes: base64 }. Returns {mime, extension, confidence, description, category, executable}. Covers images, documents (incl. OOXML/OpenDocument), archives, audio/video, fonts and executables (which are flagged). Security check for file pipelines. Not a barcode/QR reader.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"mime":{"type":"string","description":"Detected media type, e.g. application/pdf."},"extension":{"type":"string","description":"Conventional file extension (no dot)."},"confidence":{"type":"string","enum":["high","medium","low"],"description":"How specific the matched signature is."},"description":{"type":"string"},"category":{"type":"string","description":"image | document | archive | audio | video | font | executable | text | data | other."},"executable":{"type":"boolean","description":"True for code/executable formats (handle with care)."},"bytes":{"type":"integer","description":"Number of bytes inspected."}},"required":["mime","extension","confidence","description","category","executable"]},"example":{"mime":"application/pdf","extension":"pdf","confidence":"high","description":"PDF document","category":"document","executable":false,"bytes":5242}}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Either raw file bytes as the request body (any Content-Type), OR a JSON body with `bytes`.","properties":{"bytes":{"type":"string","description":"The file's raw bytes as base64 (alternative to sending them raw)."}}},"example":{"bytes":"JVBERi0xLjQK"}}}}}},"/v1/barcode":{"post":{"operationId":"barcode","summary":"Generate a 1D barcode as PNG or SVG: EAN-13, EAN-8, UPC-A, Code 128, Code 39 or ITF-14. Validates the structure and check digit for each symbology — EAN/UPC/ITF compute a missing check digit or reject a wrong one. Options: format (png/svg), scale (module px 1-10), text (human-readable line, default on). Returns the raw image. Generation only — reading a barcode from an image is out of scope.","x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"network":"eip155:8453","payTo":"0xc55A2D530b53CBaD1001e4AfD4720B7E71f9C291"},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"string","format":"binary","contentMediaType":"image/png","description":"The response body is the raw barcode image (Content-Type image/png or image/svg+xml)."},"example":"<binary image/png stream>"}}},"402":{"description":"Payment Required — pay via the x402 protocol (USDC on Base). Decode the base64 PAYMENT-REQUIRED response header for the on-chain payment requirements (network, asset, amount, payTo), then retry with an x402 client.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","const":"payment_required"},"hint":{"type":"string"}},"required":["error","hint"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Barcode content and rendering options.","properties":{"data":{"type":"string","description":"The value to encode (digits for EAN/UPC/ITF; text for Code 39/128)."},"symbology":{"type":"string","enum":["ean13","ean8","upca","code128","code39","itf14"],"description":"Barcode type."},"format":{"type":"string","enum":["png","svg"],"default":"png"},"scale":{"type":"integer","minimum":1,"maximum":10,"default":3,"description":"Module width in px."},"text":{"type":"boolean","default":true,"description":"Render the human-readable value under the bars."}},"required":["data","symbology"]},"example":{"data":"5901234123457","symbology":"ean13","format":"png"}}}}}}}}