{"openapi":"3.1.0","info":{"title":"Agent Screenshot Hub","version":"1.0.0","description":"Pay-per-call screenshots for autonomous agents. URL in, image out. No signup, no API key, no dashboard. Every call is settled in USDC over the x402 protocol.","contact":{"name":"Die Netzhandwerker","url":"https://netzhandwerker.de"}},"servers":[{"url":"https://shot.netzhandwerker.de"}],"paths":{"/screenshot":{"post":{"summary":"Render one URL in headless Chrome and return the screenshot as PNG, WebP or JPEG.","description":"Viewport or full page, optional element selector, dark mode and cookie banner removal. Returns base64 image plus a short lived fetch URL, byte size, load time and the final HTTP status of the page. Price: 0.004 USDC per call, 0.006 USDC with full_page, settled over x402 on Base Mainnet.","operationId":"screenshot","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri","description":"Absolute http or https URL to render."},"width":{"type":"integer","minimum":320,"maximum":2560,"default":1280,"description":"Viewport width in CSS pixels."},"height":{"type":"integer","minimum":320,"maximum":2000,"default":800,"description":"Viewport height in CSS pixels."},"full_page":{"type":"boolean","default":false,"description":"Capture the whole document instead of the viewport. Costs 0.006 USDC instead of 0.004 USDC."},"format":{"type":"string","enum":["png","webp","jpeg"],"default":"png","description":"Image format of the returned screenshot."},"quality":{"type":"integer","minimum":1,"maximum":100,"default":80,"description":"Compression quality for webp and jpeg. Ignored for png."},"delay_ms":{"type":"integer","minimum":0,"maximum":10000,"default":0,"description":"Wait this long after the document is ready before capturing. Counts against the 20 second budget."},"selector":{"type":"string","maxLength":300,"description":"CSS selector. When set, only that element is captured and full_page must stay off."},"dark_mode":{"type":"boolean","default":false,"description":"Render with prefers-color-scheme: dark."},"block_cookiebanner":{"type":"boolean","default":false,"description":"Remove common consent layers before capturing. The banner is hidden, never accepted."}}}}}},"responses":{"200":{"description":"Screenshot result","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid URL or request body. Not charged."},"402":{"description":"Payment required. Retry with a PAYMENT-SIGNATURE header."},"413":{"description":"Rendered image exceeds the 8 MB cap. Not charged."},"422":{"description":"Selector did not match a visible element. Not charged."},"429":{"description":"Too many unsettled renders from this address."},"502":{"description":"Page could not be rendered. Not charged."},"503":{"description":"Too many renders in flight. Not charged."},"504":{"description":"Rendering exceeded the 20 second budget. Not charged."}},"x-x402":{"price":{"amount":"4000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","display":"$0.004"},"price_full_page":{"amount":"6000","display":"$0.006"}}}},"/snapshot":{"post":{"summary":"Render one URL once in headless Chrome and return DOM, accessibility tree, links, forms, console, screenshot, timings and a request summary together.","description":"One page load answers everything an agent needs to reason about a page: the DOM after JavaScript capped at 2 MB, the CDP accessibility tree flattened with parent references, every link with rel and target and an internal or external verdict, every form field with its label and autocomplete hint, console errors and warnings with source and line, a screenshot, navigation timings and a summary of the requests the page fired. Chrome runs without credentials, without cookies and without login, so a sign in page is captured, never passed. Price: 0.006 USDC per call, flat, settled over x402 on Base Mainnet.","operationId":"browser_snapshot","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri","description":"Absolute http or https URL to render."},"viewport":{"type":"object","description":"Viewport in CSS pixels. Default 1280x800.","properties":{"width":{"type":"integer","minimum":360,"maximum":2560,"default":1280},"height":{"type":"integer","minimum":360,"maximum":2000,"default":800}}},"wait_until":{"type":"string","enum":["load","domcontentloaded","networkidle"],"default":"networkidle","description":"When the page counts as ready. networkidle waits until at most two connections stay open for half a second, which is what most JavaScript pages need."},"wait_ms":{"type":"integer","minimum":0,"maximum":8000,"default":0,"description":"Wait this long after the page is ready before reading it. Counts against the 20 second budget, it is not added on top."},"include":{"type":"array","default":["dom","a11y","links","forms","console","screenshot"],"items":{"type":"string","enum":["dom","a11y","links","forms","console","screenshot"]},"description":"Which parts to return. Omit for all of them. Leaving parts out makes the answer smaller, not cheaper: the page is loaded once either way."},"screenshot_format":{"type":"string","enum":["png","webp","jpeg"],"default":"webp","description":"Image format. webp is the smallest and keeps the answer under the size cap most often."},"screenshot_quality":{"type":"integer","minimum":1,"maximum":100,"default":80,"description":"Compression quality for webp and jpeg. Ignored for png."},"full_page":{"type":"boolean","default":false,"description":"Capture the whole document instead of the viewport. Same price on this endpoint."},"check_links":{"type":"boolean","default":false,"description":"Look up the HTTP status of up to 50 links with HEAD, without following redirects. No extra charge. Without this, links carry no status field."}}}}}},"responses":{"200":{"description":"Snapshot result","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid URL or request body. Not charged."},"402":{"description":"Payment required. Retry with a PAYMENT-SIGNATURE header."},"429":{"description":"Too many unsettled renders from this address."},"502":{"description":"Page could not be rendered. Not charged."},"503":{"description":"Too many renders in flight. Not charged."},"504":{"description":"Rendering exceeded the 20 second budget. Not charged."}},"x-x402":{"price":{"amount":"6000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","display":"$0.006"}}}},"/health":{"get":{"summary":"Service health, no payment required","responses":{"200":{"description":"ok"}}}},"/readiness":{"get":{"summary":"Readiness including settlement layer and render backend, no payment required","responses":{"200":{"description":"ok"},"503":{"description":"not ready"}}}},"/pricing":{"get":{"summary":"Machine readable price list, no payment required","responses":{"200":{"description":"ok"}}}},"/shots/{file}":{"get":{"summary":"Fetch a rendered image for up to 15 minutes after the paid call. Also the delivery route when a snapshot answer would exceed the 8 MB cap and the image is handed over as a URL instead of base64.","parameters":[{"name":"file","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"image"},"404":{"description":"expired or unknown"}}}}},"x-service":{"slug":"shot","tags":["screenshot","url-to-image","headless-chrome","page-render","visual-check","agent-tools","web-capture","dom-snapshot","accessibility-tree","rendered-html","page-inspection","form-extraction","console-errors"],"payment_protocol":"x402","endpoint_count":5,"paid_endpoint_count":2}}