One page load answers everything an agent needs to reason about a page
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 s
Paid test badge: not yet. The checks above are free: we call the tool without paying and read the payment request it sends back. The Verified badge needs paid calls whose answers match the promised output, and nobody can buy a badge.
Endpoint
POST https://shot.netzhandwerker.de/snapshot
| Category | Code and developer |
|---|---|
| Provider host | shot.netzhandwerker.de |
| Networks | eip155:8453 |
| Payment schemes | exact |
| Self-reported calls, 30 days | 3 from 3 payers (the provider's figure, not ours) |
Our checks, last 30 days
| Day | Result | HTTP | Asked | Time |
|---|---|---|---|---|
| 2026-10-10 | valid payment request | 402 | $0.006 | 1573 ms |
Example input (from the provider)
{
"body": {
"url": "https://example.com"
},
"bodyType": "json",
"method": "POST",
"type": "http"
}
Promised output schema (from the provider)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"input": {
"additionalProperties": false,
"properties": {
"body": {
"additionalProperties": false,
"properties": {
"check_links": {
"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.",
"type": "boolean"
},
"full_page": {
"default": false,
"description": "Capture the whole document instead of the viewport. Same price on this endpoint.",
"type": "boolean"
},
"include": {
"default": [
"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.",
"items": {
"enum": [
"dom",
"a11y",
"links",
"forms",
"console",
"screenshot"
],
"type": "string"
},
"type": "array"
},
"screenshot_format": {
"default": "webp",
"description": "Image format. webp is the smallest and keeps the answer under the size cap most often.",
"enum": [
"png",
"webp",
"jpeg"
],
"type": "string"
},
"screenshot_quality": {
"default": 80,
"description": "Compression quality for webp and jpeg. Ignored for png.",
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"url": {
"description": "Absolute http or https URL to render.",
"format": "uri",
"type": "string"
},
"viewport": {
"additionalProperties": false,
"description": "Viewport in CSS pixels. Default 1280x800.",
"properties": {
"height": {
"default": 800,
"maximum": 2000,
"minimum": 360,
"type": "integer"
},
"width": {
"default": 1280,
"maximum": 2560,
"minimum": 360,
"type": "integer"
}
},
"type": "object"
},
"wait_ms": {
"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.",
"maximum": 8000,
"minimum": 0,
"type": "integer"
},
"wait_until": {
"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.",
"enum": [
"load",
"domcontentloaded",
"networkidle"
],
"type": "string"
}
},
"required": [
"url"
],
"type": "object"
},
"bodyType": {
"enum": [
"json",
"form-data",
"text"
],
"type": "string"
},
"method": {
"enum": [
"POST"
],
"type": "string"
},
"type": {
"const": "http",
"type": "string"
}
},
"required": [
"type",
"method",
"bodyType",
"body"
],
"type": "object"
}
},
"required": [
"input"
],
"type": "object"
}