{"openapi":"3.1.0","info":{"title":"QuickBuild agent APIs","version":"1.4.0","description":"Pay-per-call web tools for AI agents over x402 (USDC on Base). No accounts or API keys.","x-guidance":"Every parameter is optional (sensible defaults). Web tools are GET with ?url= (public http(s) URL); AI/browser tools (/api/summarize, /api/translate, /api/image, /api/screenshot, /api/tts) accept GET query params or a POST JSON body. Call once without payment to receive the 402 challenge (PAYMENT-REQUIRED header, same JSON also in the response body), then retry with the x402 payment. /api/markdown ($0.005) returns clean Markdown of a page for LLM context; /api/meta ($0.005) returns title/OG/Twitter/canonical/links; /api/audit ($0.05) returns a pre-launch audit (SEO, security headers, broken links, leaked-key patterns); /api/summarize ($0.02) turns a URL or text into a structured JSON brief (summary, key points, entities, facts); /api/translate ($0.005) translates text or a web page between 36 languages; /api/image ($0.01) generates a 1024x1024 image from a prompt (FLUX.1 schnell); /api/screenshot ($0.008) renders a URL in headless Chrome and returns a PNG/JPEG screenshot; /api/tts ($0.005) turns text into WAV speech (en/es/fr/zh/ja/ko). Errors (4xx/5xx) are never charged.","contact":{"name":"QuickBuild","email":"quickbuild@mail.grokbot.com","url":"https://quickbuild.quynguyenbac.workers.dev"}},"servers":[{"url":"https://quickbuild.quynguyenbac.workers.dev"}],"x-discovery":{"ownershipProofs":[]},"components":{"securitySchemes":{"x402":{"type":"apiKey","in":"header","name":"PAYMENT-SIGNATURE","description":"x402 v2 payment payload"}}},"paths":{"/api/audit":{"get":{"operationId":"launchCheckAudit","summary":"Pre-launch website audit (SEO, OG, security headers, broken links, leaked-key patterns)","description":"Pre-launch website audit: up to 3 pages crawled, 30 links checked, meta/OG/canonical, security headers, HTTPS, 404 handling, sitemap, and leaked-secret patterns in client JS (masked). Read-only.","tags":["seo","security","website-audit","broken-links","launch-check"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.05"},"protocols":[{"x402":{}}]},"parameters":[{"name":"url","in":"query","required":false,"schema":{"type":"string"},"description":"Public http(s) URL (hostname, not IP). Private/reserved addresses are refused. Optional: defaults to https://example.com."},{"name":"format","in":"query","required":false,"schema":{"type":"string","enum":["json","html","csv"]},"description":"Output format (default json)"}],"responses":{"200":{"description":"Success","content":{"application/json":{"example":{"summary":{"critical":0,"high":1,"medium":3,"low":4,"info":1},"issues":[{"severity":"high","area":"security-headers","message":"HSTS missing"}]}}}},"400":{"description":"Invalid input or non-public URL (not charged)"},"402":{"description":"Payment Required (x402 v2: USDC on Base). PaymentRequired JSON in the PAYMENT-REQUIRED header (base64) and in the body (accepts[] with v1-compatible fields)."}}}},"/api/meta":{"get":{"operationId":"pageMeta","summary":"URL -> title, description, Open Graph, Twitter card, canonical, favicon, feeds, JSON-LD types, links","description":"Fetch one public web page and return structured metadata: title, meta description, canonical, lang, robots, Open Graph and Twitter card tags, favicon, RSS/Atom feeds, JSON-LD @types, and internal/external links (up to 100 each). Good for link previews, unfurling and quick site triage.","tags":["metadata","open-graph","link-preview","unfurl","seo","web"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.005"},"protocols":[{"x402":{}}]},"parameters":[{"name":"url","in":"query","required":false,"schema":{"type":"string"},"description":"Public http(s) URL (hostname, not IP). Private/reserved addresses are refused. Optional: defaults to https://example.com."}],"responses":{"200":{"description":"Success","content":{"application/json":{"example":{"url":"https://example.com/","status":200,"title":"Example Domain","description":null,"og":{},"twitter":{},"links":{"internalCount":0,"externalCount":1}}}}},"400":{"description":"Invalid input or non-public URL (not charged)"},"402":{"description":"Payment Required (x402 v2: USDC on Base). PaymentRequired JSON in the PAYMENT-REQUIRED header (base64) and in the body (accepts[] with v1-compatible fields)."}}}},"/api/markdown":{"get":{"operationId":"urlToMarkdown","summary":"URL -> clean Markdown of the main content (for LLM context)","description":"Fetch one public web page and return its main content (article/main/body, scripts/nav/footer stripped) as clean Markdown with absolute links, plus title and length. Up to 2 MB HTML, 10 s timeout; optional maxChars (default 50000, max 200000).","tags":["markdown","scrape","extract","llm","rag","web"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.005"},"protocols":[{"x402":{}}]},"parameters":[{"name":"url","in":"query","required":false,"schema":{"type":"string"},"description":"Public http(s) URL (hostname, not IP). Private/reserved addresses are refused. Optional: defaults to https://example.com."},{"name":"maxChars","in":"query","required":false,"schema":{"type":"integer","minimum":500,"maximum":200000},"description":"Truncate markdown to this many characters (default 50000)"}],"responses":{"200":{"description":"Success","content":{"application/json":{"example":{"url":"https://example.com/","title":"Example Domain","chars":180,"truncated":false,"markdown":"# Example Domain\n\nThis domain is for use in illustrative examples..."}}}},"400":{"description":"Invalid input or non-public URL (not charged)"},"402":{"description":"Payment Required (x402 v2: USDC on Base). PaymentRequired JSON in the PAYMENT-REQUIRED header (base64) and in the body (accepts[] with v1-compatible fields)."}}}},"/api/summarize":{"get":{"operationId":"summarizeToJson","summary":"URL or text -> structured JSON brief (summary, key points, entities, topics, facts, sentiment) for agents","description":"Fetch a public web page (or take raw text) and return a structured JSON brief made by Llama 3.3 70B: title, language, contentType, summary, keyPoints, named entities with types, topic tags, concrete facts (prices, dates, versions, limits) as label/value pairs, sentiment and audience. Grounded in the page only, no invented facts. Reads up to 24,000 chars of main content (2 MB HTML, 10 s fetch timeout). All params optional: with none it summarizes https://example.com. GET with query params, or POST a JSON body for long text (up to 200,000 chars accepted, first 24,000 analyzed).","tags":["ai","summarize","summary","extract","structured-data","json","llm","research","web"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.02"},"protocols":[{"x402":{}}]},"parameters":[{"name":"url","in":"query","required":false,"schema":{"type":"string"},"description":"Public http(s) URL to read (hostname, not IP; private addresses refused). Optional: defaults to https://example.com. Ignored when `text` is given."},{"name":"text","in":"query","required":false,"schema":{"type":"string"},"description":"Raw text or Markdown to summarize instead of a URL (optional, max 200000 chars, first 24000 analyzed). Prefer POST for long text."},{"name":"length","in":"query","required":false,"schema":{"type":"string","enum":["short","medium","long"]},"description":"Summary length: short = 1-2 sentences, medium = 3-4 (default), long = 5-8."},{"name":"maxPoints","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":10},"description":"Max number of keyPoints (default 5)."},{"name":"focus","in":"query","required":false,"schema":{"type":"string"},"description":"Optional aspect to emphasize, e.g. \"pricing\", \"API limits\", \"risks\" (max 200 chars)."},{"name":"lang","in":"query","required":false,"schema":{"type":"string"},"description":"Optional output language for summary/keyPoints (ISO 639-1, e.g. \"en\"). Default: same as the content."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"source":{"type":"string","enum":["url","text"]},"url":{"type":["string","null"]},"title":{"type":["string","null"]},"language":{"type":["string","null"],"description":"ISO 639-1"},"contentType":{"type":"string","description":"article|news|blog|docs|product|pricing|homepage|landing|forum|paper|legal|other"},"summary":{"type":"string"},"keyPoints":{"type":"array","items":{"type":"string"}},"entities":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"type":{"type":"string"}}}},"topics":{"type":"array","items":{"type":"string"}},"sentiment":{"type":"string","enum":["positive","neutral","negative","mixed"]},"audience":{"type":["string","null"]},"facts":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"value":{"type":"string"}}}},"charsAnalyzed":{"type":"integer"},"truncated":{"type":"boolean"},"model":{"type":"string"}}},"example":{"source":"url","url":"https://example.com/","title":"Example Domain","language":"en","contentType":"other","summary":"Example Domain is a reserved domain for use in documentation examples without prior coordination.","keyPoints":["Reserved for illustrative examples","Usable in documents without permission"],"entities":[{"name":"IANA","type":"organization"}],"topics":["domains","documentation"],"sentiment":"neutral","audience":"developers and writers","facts":[],"charsAnalyzed":180,"truncated":false,"model":"@cf/meta/llama-3.3-70b-instruct-fp8-fast"}}}},"400":{"description":"Invalid input or non-public URL (not charged)"},"402":{"description":"Payment Required (x402 v2: USDC on Base). PaymentRequired JSON in the PAYMENT-REQUIRED header (base64) and in the body (accepts[] with v1-compatible fields)."}}},"post":{"operationId":"summarizeToJsonPost","summary":"URL or text -> structured JSON brief (summary, key points, entities, topics, facts, sentiment) for agents","description":"Fetch a public web page (or take raw text) and return a structured JSON brief made by Llama 3.3 70B: title, language, contentType, summary, keyPoints, named entities with types, topic tags, concrete facts (prices, dates, versions, limits) as label/value pairs, sentiment and audience. Grounded in the page only, no invented facts. Reads up to 24,000 chars of main content (2 MB HTML, 10 s fetch timeout). All params optional: with none it summarizes https://example.com. GET with query params, or POST a JSON body for long text (up to 200,000 chars accepted, first 24,000 analyzed).","tags":["ai","summarize","summary","extract","structured-data","json","llm","research","web"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.02"},"protocols":[{"x402":{}}]},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"Public http(s) URL to read (hostname, not IP; private addresses refused). Optional: defaults to https://example.com. Ignored when `text` is given."},"text":{"type":"string","description":"Raw text or Markdown to summarize instead of a URL (optional, max 200000 chars, first 24000 analyzed). Prefer POST for long text."},"length":{"type":"string","enum":["short","medium","long"],"description":"Summary length: short = 1-2 sentences, medium = 3-4 (default), long = 5-8."},"maxPoints":{"type":"integer","minimum":1,"maximum":10,"description":"Max number of keyPoints (default 5)."},"focus":{"type":"string","description":"Optional aspect to emphasize, e.g. \"pricing\", \"API limits\", \"risks\" (max 200 chars)."},"lang":{"type":"string","description":"Optional output language for summary/keyPoints (ISO 639-1, e.g. \"en\"). Default: same as the content."}}},"example":{"url":"https://example.com","length":"medium"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"source":{"type":"string","enum":["url","text"]},"url":{"type":["string","null"]},"title":{"type":["string","null"]},"language":{"type":["string","null"],"description":"ISO 639-1"},"contentType":{"type":"string","description":"article|news|blog|docs|product|pricing|homepage|landing|forum|paper|legal|other"},"summary":{"type":"string"},"keyPoints":{"type":"array","items":{"type":"string"}},"entities":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"type":{"type":"string"}}}},"topics":{"type":"array","items":{"type":"string"}},"sentiment":{"type":"string","enum":["positive","neutral","negative","mixed"]},"audience":{"type":["string","null"]},"facts":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"value":{"type":"string"}}}},"charsAnalyzed":{"type":"integer"},"truncated":{"type":"boolean"},"model":{"type":"string"}}},"example":{"source":"url","url":"https://example.com/","title":"Example Domain","language":"en","contentType":"other","summary":"Example Domain is a reserved domain for use in documentation examples without prior coordination.","keyPoints":["Reserved for illustrative examples","Usable in documents without permission"],"entities":[{"name":"IANA","type":"organization"}],"topics":["domains","documentation"],"sentiment":"neutral","audience":"developers and writers","facts":[],"charsAnalyzed":180,"truncated":false,"model":"@cf/meta/llama-3.3-70b-instruct-fp8-fast"}}}},"400":{"description":"Invalid input or non-public URL (not charged)"},"402":{"description":"Payment Required (x402 v2: USDC on Base). PaymentRequired JSON in the PAYMENT-REQUIRED header (base64) and in the body (accepts[] with v1-compatible fields)."}}}},"/api/translate":{"get":{"operationId":"translateTextOrUrl","summary":"Translate text or a whole web page (as Markdown) between 36 languages; auto-detects the source language","description":"LLM translation (Meta Llama 4 Scout on Workers AI, M2M100 fallback). Give `text`, or a `url` whose main content is extracted as Markdown and translated in blocks, preserving Markdown formatting, URLs and code blocks. Source language auto-detected (or set `from`). Up to 20,000 chars per call (default 8,000). All params optional: with none it translates a short Spanish sample to English. Languages: en,es,fr,de,it,pt,nl,ru,uk,pl,cs,ro,hu,el,bg,sv,da,no,fi,tr,ar,he,fa,hi,bn,ur,ta,zh,ja,ko,vi,th,id,ms,tl,sw.","tags":["ai","translate","translation","i18n","localization","multilingual","language","web"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.005"},"protocols":[{"x402":{}}]},"parameters":[{"name":"text","in":"query","required":false,"schema":{"type":"string"},"description":"Text or Markdown to translate (optional). If omitted and no url, a short Spanish sample is used."},{"name":"url","in":"query","required":false,"schema":{"type":"string"},"description":"Public http(s) URL whose main content is translated (optional; used when `text` is absent)."},{"name":"to","in":"query","required":false,"schema":{"type":"string"},"description":"Target language, ISO 639-1 code or English name (default \"en\")."},{"name":"from","in":"query","required":false,"schema":{"type":"string"},"description":"Source language code, or \"auto\" (default: auto-detect)."},{"name":"maxChars","in":"query","required":false,"schema":{"type":"integer","minimum":100,"maximum":20000},"description":"Max source chars to translate (default 8000)."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"source":{"type":"string","enum":["url","text"]},"url":{"type":["string","null"]},"title":{"type":["string","null"]},"from":{"type":"string"},"to":{"type":"string"},"text":{"type":"string","description":"Translated text/Markdown"},"chars":{"type":"integer"},"sourceChars":{"type":"integer"},"truncated":{"type":"boolean"},"segments":{"type":"integer"},"model":{"type":"string"}}},"example":{"source":"text","url":null,"title":null,"from":"es","to":"en","chars":18,"sourceChars":18,"truncated":false,"segments":1,"text":"Hello, how are you?","model":"@cf/meta/llama-4-scout-17b-16e-instruct"}}}},"400":{"description":"Invalid input or non-public URL (not charged)"},"402":{"description":"Payment Required (x402 v2: USDC on Base). PaymentRequired JSON in the PAYMENT-REQUIRED header (base64) and in the body (accepts[] with v1-compatible fields)."}}},"post":{"operationId":"translateTextOrUrlPost","summary":"Translate text or a whole web page (as Markdown) between 36 languages; auto-detects the source language","description":"LLM translation (Meta Llama 4 Scout on Workers AI, M2M100 fallback). Give `text`, or a `url` whose main content is extracted as Markdown and translated in blocks, preserving Markdown formatting, URLs and code blocks. Source language auto-detected (or set `from`). Up to 20,000 chars per call (default 8,000). All params optional: with none it translates a short Spanish sample to English. Languages: en,es,fr,de,it,pt,nl,ru,uk,pl,cs,ro,hu,el,bg,sv,da,no,fi,tr,ar,he,fa,hi,bn,ur,ta,zh,ja,ko,vi,th,id,ms,tl,sw.","tags":["ai","translate","translation","i18n","localization","multilingual","language","web"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.005"},"protocols":[{"x402":{}}]},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","description":"Text or Markdown to translate (optional). If omitted and no url, a short Spanish sample is used."},"url":{"type":"string","description":"Public http(s) URL whose main content is translated (optional; used when `text` is absent)."},"to":{"type":"string","description":"Target language, ISO 639-1 code or English name (default \"en\")."},"from":{"type":"string","description":"Source language code, or \"auto\" (default: auto-detect)."},"maxChars":{"type":"integer","minimum":100,"maximum":20000,"description":"Max source chars to translate (default 8000)."}}},"example":{"text":"Hola, ¿cómo estás?","to":"en"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"source":{"type":"string","enum":["url","text"]},"url":{"type":["string","null"]},"title":{"type":["string","null"]},"from":{"type":"string"},"to":{"type":"string"},"text":{"type":"string","description":"Translated text/Markdown"},"chars":{"type":"integer"},"sourceChars":{"type":"integer"},"truncated":{"type":"boolean"},"segments":{"type":"integer"},"model":{"type":"string"}}},"example":{"source":"text","url":null,"title":null,"from":"es","to":"en","chars":18,"sourceChars":18,"truncated":false,"segments":1,"text":"Hello, how are you?","model":"@cf/meta/llama-4-scout-17b-16e-instruct"}}}},"400":{"description":"Invalid input or non-public URL (not charged)"},"402":{"description":"Payment Required (x402 v2: USDC on Base). PaymentRequired JSON in the PAYMENT-REQUIRED header (base64) and in the body (accepts[] with v1-compatible fields)."}}}},"/api/image":{"get":{"operationId":"textToImage","summary":"Text-to-image: prompt -> 1024x1024 image (FLUX.1 schnell), returned as base64 in JSON or as raw JPEG","description":"Generate an original 1024x1024 image from a text prompt with FLUX.1 [schnell] on Workers AI (about 2-5 s). Returns JSON with image_base64 + mimeType, or the raw image bytes with format=jpeg. Content policy: no sexual/nude, gore, hate, real or famous people, or ID documents/currency; such prompts get HTTP 400 and are not charged. All params optional: with no prompt a sample watercolor lighthouse is drawn.","tags":["ai","image","image-generation","text-to-image","flux","art","illustration"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.01"},"protocols":[{"x402":{}}]},"parameters":[{"name":"prompt","in":"query","required":false,"schema":{"type":"string"},"description":"What to draw (max 1000 chars). Optional: defaults to a watercolor lighthouse."},{"name":"steps","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":8},"description":"Diffusion steps, more = more detail (default 4)."},{"name":"format","in":"query","required":false,"schema":{"type":"string","enum":["json","jpeg"]},"description":"json (default): {image_base64, mimeType,...}; jpeg: raw image bytes."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string"},"steps":{"type":"integer"},"mimeType":{"type":"string"},"width":{"type":"integer"},"height":{"type":"integer"},"bytes":{"type":"integer"},"image_base64":{"type":"string","description":"Base64-encoded image"},"model":{"type":"string"}}},"example":{"prompt":"a cozy watercolor illustration of a lighthouse on a cliff at sunrise","steps":4,"mimeType":"image/jpeg","width":1024,"height":1024,"bytes":588000,"image_base64":"/9j/4AAQSkZJRg...","model":"@cf/black-forest-labs/flux-1-schnell"}}}},"400":{"description":"Invalid input or non-public URL (not charged)"},"402":{"description":"Payment Required (x402 v2: USDC on Base). PaymentRequired JSON in the PAYMENT-REQUIRED header (base64) and in the body (accepts[] with v1-compatible fields)."}}},"post":{"operationId":"textToImagePost","summary":"Text-to-image: prompt -> 1024x1024 image (FLUX.1 schnell), returned as base64 in JSON or as raw JPEG","description":"Generate an original 1024x1024 image from a text prompt with FLUX.1 [schnell] on Workers AI (about 2-5 s). Returns JSON with image_base64 + mimeType, or the raw image bytes with format=jpeg. Content policy: no sexual/nude, gore, hate, real or famous people, or ID documents/currency; such prompts get HTTP 400 and are not charged. All params optional: with no prompt a sample watercolor lighthouse is drawn.","tags":["ai","image","image-generation","text-to-image","flux","art","illustration"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.01"},"protocols":[{"x402":{}}]},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What to draw (max 1000 chars). Optional: defaults to a watercolor lighthouse."},"steps":{"type":"integer","minimum":1,"maximum":8,"description":"Diffusion steps, more = more detail (default 4)."},"format":{"type":"string","enum":["json","jpeg"],"description":"json (default): {image_base64, mimeType,...}; jpeg: raw image bytes."}}},"example":{"prompt":"a cozy watercolor illustration of a lighthouse on a cliff at sunrise"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string"},"steps":{"type":"integer"},"mimeType":{"type":"string"},"width":{"type":"integer"},"height":{"type":"integer"},"bytes":{"type":"integer"},"image_base64":{"type":"string","description":"Base64-encoded image"},"model":{"type":"string"}}},"example":{"prompt":"a cozy watercolor illustration of a lighthouse on a cliff at sunrise","steps":4,"mimeType":"image/jpeg","width":1024,"height":1024,"bytes":588000,"image_base64":"/9j/4AAQSkZJRg...","model":"@cf/black-forest-labs/flux-1-schnell"}}}},"400":{"description":"Invalid input or non-public URL (not charged)"},"402":{"description":"Payment Required (x402 v2: USDC on Base). PaymentRequired JSON in the PAYMENT-REQUIRED header (base64) and in the body (accepts[] with v1-compatible fields)."}}}},"/api/screenshot":{"get":{"operationId":"urlScreenshot","summary":"URL -> screenshot (PNG/JPEG) rendered in real headless Chrome, as base64 JSON or raw image","description":"Render a public web page in a real headless Chrome (JavaScript executed, waits for network idle) and return a screenshot: viewport (default 1280x800) or full page (up to 8000 px tall), PNG or JPEG, optional dark mode and extra wait. JSON with image_base64 + finalUrl/status/title, or raw image bytes with format=png|jpeg. Typically 2-6 s (up to ~25 s when busy). Use it for visual QA, link previews, archiving, checking what a page really shows, or feeding a vision model. Adult/malware domains (Cloudflare family DNS) and private addresses are refused. All params optional: with none it captures https://example.com. Errors are never charged.","tags":["screenshot","browser","headless-chrome","render","capture","web","visual","vision","qa"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.008"},"protocols":[{"x402":{}}]},"parameters":[{"name":"url","in":"query","required":false,"schema":{"type":"string"},"description":"Public http(s) URL to capture (hostname, not IP). Optional: defaults to https://example.com."},{"name":"width","in":"query","required":false,"schema":{"type":"integer","minimum":320,"maximum":1920},"description":"Viewport width in px (default 1280)."},{"name":"height","in":"query","required":false,"schema":{"type":"integer","minimum":240,"maximum":2000},"description":"Viewport height in px (default 800)."},{"name":"fullPage","in":"query","required":false,"schema":{"type":"boolean"},"description":"Capture the whole scrollable page, capped at 8000 px tall (default false)."},{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["png","jpeg"]},"description":"Image type (default png)."},{"name":"quality","in":"query","required":false,"schema":{"type":"integer","minimum":30,"maximum":100},"description":"JPEG quality (default 80; jpeg only)."},{"name":"waitMs","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":5000},"description":"Extra wait after load before capturing, ms (default 0)."},{"name":"darkMode","in":"query","required":false,"schema":{"type":"boolean"},"description":"Emulate prefers-color-scheme: dark (default false)."},{"name":"format","in":"query","required":false,"schema":{"type":"string","enum":["json","png","jpeg"]},"description":"json (default): {image_base64, mimeType, ...}; png/jpeg: raw image bytes."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"},"finalUrl":{"type":"string"},"status":{"type":["integer","null"],"description":"HTTP status of the main document"},"title":{"type":["string","null"]},"width":{"type":"integer"},"height":{"type":"integer"},"fullPage":{"type":"boolean"},"mimeType":{"type":"string"},"bytes":{"type":"integer"},"renderMs":{"type":"integer"},"image_base64":{"type":"string","description":"Base64-encoded PNG/JPEG"}}},"example":{"url":"https://example.com/","finalUrl":"https://example.com/","status":200,"title":"Example Domain","width":1280,"height":800,"fullPage":false,"mimeType":"image/png","bytes":21000,"renderMs":2400,"image_base64":"iVBORw0KGgoAAAANSUhEUgAA..."}}}},"400":{"description":"Invalid input or non-public URL (not charged)"},"402":{"description":"Payment Required (x402 v2: USDC on Base). PaymentRequired JSON in the PAYMENT-REQUIRED header (base64) and in the body (accepts[] with v1-compatible fields)."}}},"post":{"operationId":"urlScreenshotPost","summary":"URL -> screenshot (PNG/JPEG) rendered in real headless Chrome, as base64 JSON or raw image","description":"Render a public web page in a real headless Chrome (JavaScript executed, waits for network idle) and return a screenshot: viewport (default 1280x800) or full page (up to 8000 px tall), PNG or JPEG, optional dark mode and extra wait. JSON with image_base64 + finalUrl/status/title, or raw image bytes with format=png|jpeg. Typically 2-6 s (up to ~25 s when busy). Use it for visual QA, link previews, archiving, checking what a page really shows, or feeding a vision model. Adult/malware domains (Cloudflare family DNS) and private addresses are refused. All params optional: with none it captures https://example.com. Errors are never charged.","tags":["screenshot","browser","headless-chrome","render","capture","web","visual","vision","qa"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.008"},"protocols":[{"x402":{}}]},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"Public http(s) URL to capture (hostname, not IP). Optional: defaults to https://example.com."},"width":{"type":"integer","minimum":320,"maximum":1920,"description":"Viewport width in px (default 1280)."},"height":{"type":"integer","minimum":240,"maximum":2000,"description":"Viewport height in px (default 800)."},"fullPage":{"type":"boolean","description":"Capture the whole scrollable page, capped at 8000 px tall (default false)."},"type":{"type":"string","enum":["png","jpeg"],"description":"Image type (default png)."},"quality":{"type":"integer","minimum":30,"maximum":100,"description":"JPEG quality (default 80; jpeg only)."},"waitMs":{"type":"integer","minimum":0,"maximum":5000,"description":"Extra wait after load before capturing, ms (default 0)."},"darkMode":{"type":"boolean","description":"Emulate prefers-color-scheme: dark (default false)."},"format":{"type":"string","enum":["json","png","jpeg"],"description":"json (default): {image_base64, mimeType, ...}; png/jpeg: raw image bytes."}}},"example":{"url":"https://example.com","width":1280,"height":800}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"},"finalUrl":{"type":"string"},"status":{"type":["integer","null"],"description":"HTTP status of the main document"},"title":{"type":["string","null"]},"width":{"type":"integer"},"height":{"type":"integer"},"fullPage":{"type":"boolean"},"mimeType":{"type":"string"},"bytes":{"type":"integer"},"renderMs":{"type":"integer"},"image_base64":{"type":"string","description":"Base64-encoded PNG/JPEG"}}},"example":{"url":"https://example.com/","finalUrl":"https://example.com/","status":200,"title":"Example Domain","width":1280,"height":800,"fullPage":false,"mimeType":"image/png","bytes":21000,"renderMs":2400,"image_base64":"iVBORw0KGgoAAAANSUhEUgAA..."}}}},"400":{"description":"Invalid input or non-public URL (not charged)"},"402":{"description":"Payment Required (x402 v2: USDC on Base). PaymentRequired JSON in the PAYMENT-REQUIRED header (base64) and in the body (accepts[] with v1-compatible fields)."}}}},"/api/tts":{"get":{"operationId":"textToSpeech","summary":"Text-to-speech: text -> natural voice audio (WAV) in en/es/fr/zh/ja/ko, base64 JSON or raw audio","description":"Turn text (up to 2000 chars) into spoken audio with MeloTTS on Cloudflare Workers AI, in English, Spanish, French, Chinese, Japanese or Korean. Returns JSON with audio_base64 + mimeType (audio/wav, 44.1 kHz mono), or the raw audio bytes with format=wav. Good for voice replies, narration, accessibility and language practice. Text with sexual, hateful or violent content is refused (HTTP 400, not charged). All params optional: with none it speaks a short English sample. GET with query params or POST a JSON body.","tags":["ai","tts","text-to-speech","speech","voice","audio","narration","accessibility"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.005"},"protocols":[{"x402":{}}]},"parameters":[{"name":"text","in":"query","required":false,"schema":{"type":"string"},"description":"Text to speak (max 2000 chars). Optional: defaults to a short English sample."},{"name":"lang","in":"query","required":false,"schema":{"type":"string","enum":["en","es","fr","zh","ja","ko"]},"description":"Language of the text / voice (default en)."},{"name":"format","in":"query","required":false,"schema":{"type":"string","enum":["json","wav"]},"description":"json (default): {audio_base64, mimeType, ...}; wav: raw audio bytes."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string"},"lang":{"type":"string"},"chars":{"type":"integer"},"mimeType":{"type":"string"},"bytes":{"type":"integer"},"audio_base64":{"type":"string","description":"Base64-encoded audio (WAV)"},"model":{"type":"string"}}},"example":{"text":"Hello! This short clip was generated by a text to speech API.","lang":"en","chars":61,"mimeType":"audio/wav","bytes":330000,"audio_base64":"UklGRl4dCABXQVZF...","model":"@cf/myshell-ai/melotts"}}}},"400":{"description":"Invalid input or non-public URL (not charged)"},"402":{"description":"Payment Required (x402 v2: USDC on Base). PaymentRequired JSON in the PAYMENT-REQUIRED header (base64) and in the body (accepts[] with v1-compatible fields)."}}},"post":{"operationId":"textToSpeechPost","summary":"Text-to-speech: text -> natural voice audio (WAV) in en/es/fr/zh/ja/ko, base64 JSON or raw audio","description":"Turn text (up to 2000 chars) into spoken audio with MeloTTS on Cloudflare Workers AI, in English, Spanish, French, Chinese, Japanese or Korean. Returns JSON with audio_base64 + mimeType (audio/wav, 44.1 kHz mono), or the raw audio bytes with format=wav. Good for voice replies, narration, accessibility and language practice. Text with sexual, hateful or violent content is refused (HTTP 400, not charged). All params optional: with none it speaks a short English sample. GET with query params or POST a JSON body.","tags":["ai","tts","text-to-speech","speech","voice","audio","narration","accessibility"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.005"},"protocols":[{"x402":{}}]},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","description":"Text to speak (max 2000 chars). Optional: defaults to a short English sample."},"lang":{"type":"string","enum":["en","es","fr","zh","ja","ko"],"description":"Language of the text / voice (default en)."},"format":{"type":"string","enum":["json","wav"],"description":"json (default): {audio_base64, mimeType, ...}; wav: raw audio bytes."}}},"example":{"text":"Hello! This short clip was generated by a text to speech API.","lang":"en"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string"},"lang":{"type":"string"},"chars":{"type":"integer"},"mimeType":{"type":"string"},"bytes":{"type":"integer"},"audio_base64":{"type":"string","description":"Base64-encoded audio (WAV)"},"model":{"type":"string"}}},"example":{"text":"Hello! This short clip was generated by a text to speech API.","lang":"en","chars":61,"mimeType":"audio/wav","bytes":330000,"audio_base64":"UklGRl4dCABXQVZF...","model":"@cf/myshell-ai/melotts"}}}},"400":{"description":"Invalid input or non-public URL (not charged)"},"402":{"description":"Payment Required (x402 v2: USDC on Base). PaymentRequired JSON in the PAYMENT-REQUIRED header (base64) and in the body (accepts[] with v1-compatible fields)."}}}},"/api/check":{"get":{"operationId":"freeLaunchCheck","summary":"Free limited website check (homepage + 20 links), 10/hour per IP","tags":["seo","free"],"security":[],"parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success"},"429":{"description":"Rate limited"}}}}}}