# Agent Screenshot Hub > URL in, image out — or URL in, whole page out. Pay per call in USDC over x402. > No signup, no API key, no dashboard. ## What this is A machine facing API on one headless Chrome, with two ways to buy a page. /screenshot is for agents that need to see a page. /snapshot is for agents that need to understand one: it loads the page a single time and hands back the rendered DOM, the accessibility tree, links, forms, console output, a screenshot, timings and a request summary in the same answer. Payment happens inside the request: call the endpoint, receive HTTP 402 with the accepted terms, retry with a signed payment header. ## Endpoints - POST https://shot.netzhandwerker.de/screenshot — 0.004 USDC, 0.006 USDC with full_page — Render one URL in headless Chrome and return the screenshot as PNG, WebP or JPEG. - POST https://shot.netzhandwerker.de/snapshot — 0.006 USDC flat — Render one URL once in headless Chrome and return DOM, accessibility tree, links, forms, console, screenshot, timings and a request summary together. ## Parameters of /screenshot - url — absolute http or https URL, required - width, height — viewport in CSS pixels, 320-2560 by 320-2000, default 1280x800 - full_page — whole document instead of the viewport, higher price - format — png, webp, jpeg, default png - quality — 1-100 for webp and jpeg, ignored for png - delay_ms — wait after the document is ready, up to 10000, counts against the time budget - selector — CSS selector for a single element, cannot be combined with full_page - dark_mode — render with prefers-color-scheme: dark - block_cookiebanner — remove common consent layers before capturing ## Answer of /screenshot image_base64, image_url with a 15 minute lifetime, bytes, load_time_ms, http_status of the page, final_url, title and the cache state of the call. ## Parameters of /snapshot - url — absolute http or https URL, required - viewport — {width, height}, 360-2560 by 360-2000, default 1280x800 - wait_until — load, domcontentloaded, networkidle, default networkidle - wait_ms — 0 to 8000, waited after the page is ready, taken out of the time budget rather than added to it - include — any of dom, a11y, links, forms, console, screenshot, default all of them - screenshot_format — webp, png, jpeg, default webp - screenshot_quality — 1-100 for webp and jpeg, ignored for png - full_page — whole document instead of the viewport, same price - check_links — HEAD lookup for up to 50 links, no extra charge, redirects are not followed ## Answer of /snapshot - dom — the HTML after JavaScript ran, capped at 2 MB. bytes, bytes_on_page and truncated say whether anything was cut and where. - a11y — the CDP accessibility tree as a flat list: id, parent_id, role, name, level, focusable. parent_id points at the nearest retained ancestor, null at the root. - links — href, text, rel, target and internal true or false. status only when check_links was set. - forms — action, method and per field name, type, required, label, autocomplete and option values. The forms listing omits field values. Note that dom is the page HTML verbatim and does carry hidden input values such as CSRF tokens; leave dom out of include if you do not want them. - console — errors and warnings with type, text, source and line. - screenshot — base64 plus a URL with a 15 minute lifetime, format, pixel width and height read from the image itself, and byte size. - timings — ttfb_ms, dom_content_loaded_ms, load_ms, total_ms. - requests_summary — count, bytes, third party hosts and every request the page fired that was blocked. An answer above 8 MB drops the base64 image and hands over screenshot.url instead, valid for 15 minutes. screenshot.delivery says which of the two you got. ## Discovery without payment - https://shot.netzhandwerker.de/openapi.json - https://shot.netzhandwerker.de/.well-known/x402 - https://shot.netzhandwerker.de/mcp (Model Context Protocol, tools/list needs no payment) - https://shot.netzhandwerker.de/pricing - https://shot.netzhandwerker.de/health - https://shot.netzhandwerker.de/readiness ## Rules we follow - 20 second budget per render, 8 MB cap per answer. Past the budget you get 504 and charged=false. - Private, loopback and link local address ranges are refused, so this API cannot reach internal hosts. - The same block list applies to every request the page itself fires. What gets refused is counted and named in requests_summary.blocked rather than swallowed. - Chrome runs with no credentials, no cookie import and no login. A sign in page is captured as it appears. Nothing is unlocked, and nothing is bypassed. - Cookie banners are hidden, never clicked. Nobody consents on the caller behalf. - Paywalls and bot walls are not bypassed. - Identical /screenshot calls are answered from a 15 minute cache. /snapshot is never cached: its answers run into megabytes and the disk budget on this machine does not allow a blob cache. - Images expire after 15 minutes. - A failed render is rejected before settlement, so a failure is never charged. ## Operator Die Netzhandwerker, IT-Manufaktur für Digitales und Sensorik. https://netzhandwerker.de