Skip to content

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.

Terminal window
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}'
FieldTypeNotes
urlstringRequired. Must be a public http(s) address.
full_pagebooleanCapture the whole document instead of the viewport. Costs one extra credit.
width · heightintegerViewport, default 1280×800. Clamped to 2560×2000.
device_scalenumberPixel ratio, 1–2. Use 2 for retina-sharp output.
formatstringpng (default) or jpeg.
qualityinteger1–100, jpeg only.
selectorstringCapture just this element instead of the page.
wait_for_selectorstringWait for this to appear before capturing.
delay_msintegerExtra settle time after load, up to 5000.
dark_modebooleanRender with prefers-color-scheme: dark.
block_bannersbooleanHide common cookie/consent overlays. Default true.
languagestringBrowser locale, e.g. de-DE.
include_image_databooleanAlso return the image base64-encoded in the body.
{
"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.

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.