{"service":"screenshot","version":"1.0.0","description":"Per-call screenshot 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 rendering options, receive the PNG inline (base64 in JSON) with render metadata (final URL, target status, dimensions, byte size, wall time, timed_out/complete disclosure). We self-render — no third-party screenshot API, no reselling the incumbent. $0.03 per viewport screenshot, $0.02 per full-page screenshot. 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 are never logged beyond settlement records, which carry no raw URL; rendered images are never retained.","endpoints":{"POST /toll/screenshot":"$0.03 viewport tier / $0.02 full-page tier via x402 — JSON {url, tier?: viewport|full-page, width?: 1..1920, height?: 1..1080 (viewport tier only)} -> {image_png_base64, content_type, tier, requested_url, final_url, target_status, width, height, byte_size, wall_ms, timed_out, complete, truncated_to_cap} + envelope. Free pre-check: POST /toll/screenshot/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":{"viewport_usd":0.03,"viewport_usdc_units":30000,"viewport_sol_lamports":204000,"fullpage_usd":0.02,"fullpage_usdc_units":20000,"fullpage_sol_lamports":136000},"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,"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 screenshot is rendered by our own headless Chromium on our own infrastructure. No third-party screenshot API is used and no incumbent is resold.","Delivery form: the PNG is returned inline, base64-encoded, in the JSON response of the paid call itself. There is no hosted copy, no download URL, and no expiry. Rendered images are deliverables, never retained: never written to disk, KV, any object store, or any log.","Timeout honesty: capture happens at network-idle or the 18-second wall-clock cap, whichever comes first. A timeout capture is a disclosed partial delivery (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 with target_status disclosed. You asked for the page as it is.","SSRF fence (mandatory, in full): 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 are never logged beyond settlement/refund records, and those records carry no raw URL — only a sha256 request fingerprint, tier, dimensions, counts and outcome. The render context (cookies, storage, cache) is created fresh per call and destroyed with it. Submitted URLs and rendered images are never 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 price first. If our side fails to deliver after settlement, a refund intent is recorded automatically for return to the payer of record. You only pay for delivered answers.","Demand honesty: the x402 screenshot category is real but thin today — 52 endpoints, 102 payers, 342 calls in 30 days across the whole category, median price $0.01. Near-term revenue expectation for this service is tens of dollars per month, not hundreds. This is a cheap, uncontested slot at $0.03 (measured marginal cost under $0.001 per render, zero incremental hosting), built under the fleet's small-player doctrine with expectations set accordingly.","Caps: viewport width <= 1920, viewport height <= 1080, full-page captured height <= 8,000 px, 18 s wall-clock cap per render, PNG response-size cap 5 MiB, 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":"screenshot","as_of":"2026-11-03T21:39:13.499Z","source":"screenshot service configuration","grade":"derived","max_age_seconds":300,"changes":{"supported":false}}}