{"service":"serviceworker-transform","description":"POST raw HTML, receive clean markdown. Stateless accelerator.","endpoints":{"POST /transform":{"json":"Content-Type: application/json, body { \"html\": \"...\", \"url\"?: \"...\" }","raw":"Content-Type: text/html, body = raw HTML. Optional Content-Encoding: gzip."},"POST /pdf":{"raw":"Content-Type: application/pdf, body = raw PDF bytes.","json":"Content-Type: application/json, body { \"pdfBase64\": \"...\" }","note":"Text-layer PDFs only; scanned/image PDFs return 422 (no OCR)."},"POST /ocr":{"raw":"Content-Type: application/pdf, body = raw PDF bytes.","json":"Content-Type: application/json, body { \"pdfBase64\": \"...\", \"maxPages\"?: 10 }","note":"OCR for scanned/image PDFs (Tesseract, English). Up to 25 pages per call (default 10); PDFs with a text layer use the fast /pdf path automatically."},"POST /ocr-deep":{"raw":"Content-Type: application/pdf, body = raw PDF bytes.","json":"Content-Type: application/json, body { \"pdfBase64\": \"...\", \"maxPages\"?: 100 }","note":"High-page-count OCR tier: up to 100 pages per call (default: all, capped). Runs under a 240s wall-clock budget; if the document is slower than that, the response returns the pages completed with meta.truncatedReason = \"time-budget\"."},"POST /extract":{"json":"Content-Type: application/json, body { \"html\": \"...\", \"url\"?: \"...\" }","raw":"Content-Type: text/html, body = raw HTML. Optional Content-Encoding: gzip.","note":"Returns structured JSON: title, byline, dates, OG/meta, JSON-LD, links, images."},"POST /chunk":{"json":"Content-Type: application/json, body { \"text\": \"...\", \"maxTokens\"?: 512, \"overlapTokens\"?: 0 }","raw":"Content-Type: text/plain, body = text. Params via ?maxTokens=&overlapTokens=.","note":"Splits a document into token-bounded chunks at natural boundaries, for RAG."},"POST /convert":{"json":"Content-Type: application/json, body { \"data\": \"...\", \"from\": \"json|yaml|csv|xml\", \"to\": \"...\" }","raw":"Content-Type: text/plain, body = data. Formats via ?from=&to=.","note":"Convert between JSON, YAML, CSV, and XML."},"POST /qr":{"json":"Content-Type: application/json, body { \"text\": \"...\", \"scale\"?: 4, \"margin\"?: 2, \"dark\"?: \"#000000\", \"light\"?: \"#ffffff\", \"format\"?: \"png|svg\" }","raw":"Content-Type: text/plain, body = text. Params via ?scale=&margin=&dark=&light=&format=.","query":"POST /qr?text=... with an empty body also works.","note":"Generate a QR code (PNG base64 or SVG). Input capped at 2953 bytes (QR capacity). Add \"delivery\": \"url\" (optional \"downloads\": 1-3) to get a short-lived download link instead of inline data."},"POST /image":{"json":"Content-Type: application/json, body { \"imageBase64\": \"...\", \"crop\"?: {left,top,width,height}, \"resize\"?: {width,height,fit}, \"greyscale\"?: true, \"format\"?: \"png|jpeg|webp\", \"quality\"?: 80 }","raw":"Content-Type: image/*, body = image bytes. Ops via ?cropLeft=&cropTop=&cropWidth=&cropHeight=&resizeWidth=&resizeHeight=&fit=&greyscale=1&format=&quality=.","note":"Crop, resize, greyscale, re-encode in one call (applied in that order). At least one op required. Add \"delivery\": \"url\" (optional \"downloads\": 1-3) to get a short-lived download link instead of inline base64."},"POST /detect":{"json":"Content-Type: application/json, body { \"imageBase64\": \"...\", \"classes\"?: [\"person\",\"dog\"], \"minConfidence\"?: 0.4 }","raw":"Content-Type: image/*, body = image bytes. Params via ?classes=person,dog&minConfidence=.","note":"Object detection (yolox-nano, COCO classes): counts + pixel bounding boxes. Detection only — no identification."},"POST /embed":{"json":"Content-Type: application/json, body { \"texts\": [\"...\", \"...\"] }  (or { \"text\": \"...\" })","note":"all-minilm-l6-v2 sentence embeddings, 384-dim, mean-pooled + L2-normalized. Up to 96 texts per call."},"POST /rerank":{"json":"Content-Type: application/json, body { \"query\": \"...\", \"texts\": [\"...\", \"...\"], \"topK\"?: 5, \"returnTexts\"?: true }","note":"Cross-encoder reranking (ms-marco-minilm-l6-v2): scores each text against the query, returns ranked indices. Up to 64 texts per call."},"POST /fetch":{"json":"Content-Type: application/json, body { \"url\": \"https://...\", \"format\"?: \"markdown|extract\" }","raw":"Content-Type: text/plain, body = the URL. Format via ?format=.","query":"POST /fetch?url=https://...&format=markdown with an empty body also works.","note":"Fetch a public URL and return clean markdown (or structured JSON). http/https, public addresses only."},"POST /fx":{"json":"Content-Type: application/json, body { \"base\"?: \"USD\", \"symbols\"?: [\"EUR\",\"GBP\"], \"amount\"?: 100 } — all fields optional; empty body = all rates vs EUR","query":"?base=USD&symbols=EUR,GBP&amount=100 with an empty body also works.","note":"ECB daily reference exchange rates (~30 currencies), any cross-rate, optional amount conversion."},"POST /phone":{"json":"Content-Type: application/json, body { \"number\": \"+14155552671\" } or { \"numbers\": [...] } (≤100), optional \"region\": \"US\"","query":"?number=%2B14155552671&region=US with an empty body also works (single number only).","note":"Phone validation/normalization (libphonenumber): validity, E.164, formats, region, line type."},"POST /decode-tx":{"json":"Content-Type: application/json, body { \"data\": \"0x...\" } (calldata) or { \"txHash\": \"0x...\" } (Base mainnet)","query":"?data=0x... or ?txHash=0x... with an empty body also works.","note":"Decode EVM calldata or a Base transaction: selector, signature, args, and ERC-20/USDC transfer events — verifies x402 settlement receipts."},"POST /screen":{"json":"Content-Type: application/json, body { \"name\": \"...\" } or { \"names\": [...] } (≤50), optional \"threshold\" (0.5-1, default 0.85), \"limit\"","query":"?name=...&threshold=0.85 with an empty body also works (single name only).","note":"Fuzzy sanctions screening against the US OFAC SDN list (public domain, refreshed daily). Coverage: OFAC SDN only."},"POST /suggest":{"json":"Content-Type: application/json, body { \"want\": \"...\", \"detail\"?: \"...\", \"priceWilling\"?: \"$0.005\", \"contact\"?: \"...\" }","note":"FREE feature-request inbox. Looked for a capability we don't offer? Tell us — suggestions steer which paid routes get built next."},"GET /health":"liveness probe","GET /files/{token}":"free download of a file minted by a paid call with \"delivery\": \"url\" — expires after 900s or 2 downloads (default; request up to 3)"},"limits":{"maxWireBytes":5242880,"maxDecompressedBytes":10485760},"clients":{"mcp":"npx -y busker-mcp (https://www.npmjs.com/package/busker-mcp) — every route as an MCP tool, payment handled for you","vercel-ai-sdk":"busker-ai-tools (integrations/vercel-ai)","langchain":"busker_langchain.py (integrations/langchain-py)"}}