Screenshot
POST /screenshot
Some pages don’t survive being turned into text. A dashboard, a chart, a map, a
pricing table whose meaning is in its layout — an agent needs to look at those.
/screenshot renders the page in a real Chromium, waits for it to settle, and
returns an image.
The response carries a short-lived image_url rather than the bytes, because
that URL is what you hand to a vision model or drop into a report. Ask for
include_image_data if you’d rather have base64 in the same response.
Request
Section titled “Request”curl -X POST https://api.crisps.ai/screenshot \ -H "Authorization: Bearer $CRISPS_API_KEY" \ -H "content-type: application/json" \ -d '{"url": "https://example.com", "full_page": true}'Body parameters
Section titled “Body parameters”| Field | Type | Notes |
|---|---|---|
url | string | Required. Must be a public http(s) address. |
full_page | boolean | Capture the whole document instead of the viewport. Costs one extra credit. |
width · height | integer | Viewport, default 1280×800. Clamped to 2560×2000. |
device_scale | number | Pixel ratio, 1–2. Use 2 for retina-sharp output. |
format | string | png (default) or jpeg. |
quality | integer | 1–100, jpeg only. |
selector | string | Capture just this element instead of the page. |
wait_for_selector | string | Wait for this to appear before capturing. |
delay_ms | integer | Extra settle time after load, up to 5000. |
dark_mode | boolean | Render with prefers-color-scheme: dark. |
block_banners | boolean | Hide common cookie/consent overlays. Default true. |
language | string | Browser locale, e.g. de-DE. |
include_image_data | boolean | Also return the image base64-encoded in the body. |
Response
Section titled “Response”{ "url": "https://example.com", "final_url": "https://example.com/", "title": "Example Domain", "image_url": "https://api.crisps.ai/shots/N1c3-unguessable-name.png", "file": "N1c3-unguessable-name.png", "format": "png", "bytes": 48213, "width": 1280, "height": 800, "device_scale": 1.0, "full_page": true, "truncated": false, "expires_in": 86400}truncated is true when a full-page capture hit the height cap — very long
pages are cut rather than refused. expires_in is how long image_url stays
alive; captures are a cache, not storage, so fetch what you need and keep your
own copy if it has to outlive the day.
2 credits per capture, 3 with full_page. A capture drives a real
browser, so it prices above extraction.
What it will not fetch
Section titled “What it will not fetch”Only public http(s) addresses. Anything resolving to a private, loopback or
link-local address — or to a cloud metadata endpoint — is refused with
url_not_allowed, including via a redirect. The same guard covers /extract,
/map and /crawl.