{"service":"render-bundle","version":"1.0.0","description":"Per-call render + read/extract bundle of a caller-supplied public web page, rendered by our own headless Chromium (CDP, persistent browser) on our own infrastructure: submit a bare URL plus options, receive the screenshot and the extracted text/markdown together, extracted from the SAME render session — no second fetch. Bundle leg (viewport PNG + extraction) $0.02, full-page leg (full-page PNG + extraction) $0.05, read leg (extraction only, no PNG) $0.01. We self-render — no third-party screenshot or extraction API, no reselling an incumbent. Free pre-check on the paid operation (request shape + the full URL fence, without rendering); automatic refund intent when our side fails to deliver. Submitted URLs and extracted content are never retained: settlement records carry fingerprint + counts only, never the raw URL, never content, never PNG bytes.","endpoints":{"POST /toll/render":"bundle $0.02 / full-page $0.05 / read $0.01 via x402 — JSON {url, op?: bundle|full-page|read, width?: 1..1920, height?: 1..1080 (not with full-page), format?: markdown|text, max_chars?: 1000..262144} -> bundle/full-page: {op, image_png_base64, content_type, requested_url, final_url, target_status, width, height, byte_size, wall_ms, timed_out, complete, truncated_to_cap, extraction{format, content, title, char_count, total_char_count, word_count, total_word_count, truncated, non_html}}; read: same minus the image fields (absent, not null) + envelope. Free pre-check: POST /toll/render/preflight with the same body.","GET /schema":"free — request/response schemas, error codes, caps, the fence summary and disclosures","GET /catalog":"free — this catalog","GET /health":"free — service status + endpoint catalog"},"pricing":{"bundle_usd":0.02,"bundle_usdc_units":20000,"bundle_sol_lamports":136000,"fullpage_usd":0.05,"fullpage_usdc_units":50000,"fullpage_sol_lamports":340000,"read_usd":0.01,"read_usdc_units":10000,"read_sol_lamports":68000},"caps":{"concurrency":2,"queue_max_waiting":8,"queue_wait_seconds":30,"per_payer_concurrent":1,"per_payer_per_hour":30,"wall_cap_seconds":18,"network_idle_quiet_ms":500,"max_width":1920,"max_height":1080,"fullpage_max_height":8000,"png_max_bytes":5242880,"target_transfer_max_bytes":26214400,"extraction_max_bytes":262144,"walker_node_cap":50000,"max_chars_min":1000,"max_chars_max":262144,"max_redirects":5,"default_width":1280,"default_height":800},"fence":"http/https only; ports 80/443 only; no credentials in URL; bare URL only (no caller cookies/headers — such fields are rejected free as unknown fields); DNS resolve-then-pin: any resolved answer in 127/8, 10/8, 172.16/12, 192.168/16, 169.254/16 (cloud metadata included), 0.0.0.0/8, ::1, fc00::/8, fe80::/10 refuses the request, including decimal/hex/octal IP literals and IPv4-mapped IPv6 forms; the renderer connects to the pinned IP and re-validates every redirect hop (max 5); fresh incognito context per call; fence refusals are free, before any payment, and reveal only the rule class.","payment":"x402 on Solana mainnet: SOL or USDC, direct / PayAI / Dexter rails","disclosures":["Self-rendered: every page is rendered by our own headless Chromium on our own infrastructure, and the screenshot and the extraction come from the SAME render session. No third-party screenshot or extraction API is used and no incumbent is resold.","Delivery form: the bundle is returned inline in the JSON response of the paid call itself — the PNG base64-encoded (bundle and full-page legs) plus the extracted content as a JSON string. There is no hosted copy, no download URL, and no expiry for either artifact. Rendered images and extracted content are deliverables, never retained: never written to disk, KV, any object store, or any log; there is no extraction corpus and no resale of extracted content.","Timeout honesty: capture and extraction happen at network-idle or the 18-second wall-clock cap, whichever comes first. A timeout capture is a disclosed partial delivery for BOTH artifacts (HTTP 200, timed_out: true, complete: false) — it is not a failure and not a refund event, and this possibility is disclosed here and in the preflight before you pay.","A rendered target error page is delivery: if the target answers 404 or 500, you receive its rendered page and extraction with target_status disclosed. You asked for the page as it is.","SSRF fence (mandatory, in full — build #14 DESIGN section 5, unchanged): http/https only; ports 80/443 only; no credentials in the URL; bare URL only — caller cookies, headers, referrer, user-agent overrides and POST data are never accepted (any such field is rejected free as an unknown field). DNS is resolved first and any answer in a private/loopback/link-local/reserved range refuses the request; the renderer connects to the validated pinned IP and re-validates every redirect hop (at most 5). Every fence refusal is free, before any payment. Fence answers reveal only the rule class, never resolved addresses.","Privacy: submitted URLs and extracted content are never retained, corpus-built, or resold — per-call delivery only. Settlement/refund records carry no raw URL and no content — only a sha256 request fingerprint, leg, dimensions, counts and outcome. The render context (cookies, storage, cache) is created fresh per call and destroyed with it. Nothing submitted is used to train, tune, evaluate, or build any dataset. Public reporting is counts only.","Trust standard: every paid call has a free pre-check (preflight) that validates the request shape and the full URL fence — without rendering and without payment — and states servability and the exact leg price first. If our side fails to deliver after settlement, exactly one refund intent is recorded automatically for return to the payer of record. You only pay for delivered answers.","Non-HTML targets: on the image legs a non-HTML target that Chromium displays (e.g. its PDF viewer) is delivered as its PNG with an honest empty extraction (non_html: true, no fabricated text). On the read leg a non-HTML target has no deliverable: after settlement that is no-delivery with a refund intent (extraction_non_html), disclosed in the preflight upfront. Downloads are never a delivery.","Demand honesty: the read leg is proven — the read/extract class shows 12,171 calls in 30 days from 12 distinct payers at an incumbent price of $0.002. The bundle premium is inferred, not proven: no store evidence shows a payer paying extra for screenshot + extraction in one call. We price at our ladder regardless (read $0.01, bundle $0.02, full-page $0.05) and near-term revenue expectation is tens of dollars per month, not hundreds — a cheap slot under the fleet small-player doctrine (measured marginal cost under $0.001 per render, zero incremental hosting).","Caps: viewport width <= 1920, viewport height <= 1080, full-page captured height <= 8,000 px, 18 s wall-clock cap per call (capture + extraction share it), PNG response-size cap 5 MiB, extraction content cap 256 KiB (262,144 UTF-8 bytes) with disclosed truncation and untruncated totals, per-payer 1 concurrent render and 30 renders per rolling hour, global concurrency cap 2 with a bounded queue. Over-limit or malformed input is refused free before any charge."],"envelope":{"v":1,"service":"render-bundle","as_of":"2026-11-03T21:38:03.775Z","source":"render-bundle service configuration","grade":"derived","max_age_seconds":300,"changes":{"supported":false}}}