API reference

One endpoint captures a screenshot and returns the image. Two more let you fetch it again for seven days. The machine-readable description is at /openapi.json.

Authentication

Create a key in the dashboard under API keys. Send it as a bearer token. Keys start with sk_, are shown once and can be revoked at any time. Keep them on your server; never ship one in browser or mobile code.

Authorization: Bearer sk_…

Capture a screenshot

POST /v1/screenshots with a JSON body. The response body is the image. The X-Screenshot-Id and X-Expires-At headers identify the stored copy. Requests take a few seconds and time out after about 45 seconds.

curl --fail-with-body "https://your-domain.com/v1/screenshots" \
-H "Authorization: Bearer $SCREENSHOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com","device":"desktop","format":"png"}' \
-o screenshot.png
const response = await fetch(`https://your-domain.com/v1/screenshots`, {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SCREENSHOT_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
url: "https://example.com",
device: "mobile",
format: "webp",
fullPage: true,
}),
});
​
if (!response.ok) throw new Error((await response.json()).error.message);
​
const id = response.headers.get("X-Screenshot-Id");
const image = Buffer.from(await response.arrayBuffer());

Options

FieldValuesDefaultDescription
urlstringrequiredPublic http or https URL, up to 2,048 characters. Credentials in the URL and private or local hosts are rejected.
devicedevice iddesktopViewport and frame preset, for example macbook-pro-14, iphone-17-pro or ipad-air-11. See the device list in the docs.
formatpng | jpeg | webppngImage format of the response.
fullPagebooleanfalseCapture the whole scrollable page. Very large pages are rejected.
cleanupbooleantrueBest-effort removal of cookie banners and common ad requests before capture.
framebooleanfalseDraw the capture inside the matching device: MacBook, iMac, iPhone, iPad and more.

Unknown fields are rejected so typos do not silently change the result.

Devices

Pass any id as device. Sizes are CSS pixels, the same viewport the hardware reports. Phones, tablets and MacBooks are captured at 2x (sharp on Retina) unless fullPage is set. With frame the capture is placed inside sourced device artwork where available. Full-page captures always disable frames.

Standard

IdDeviceViewportFrame
desktopDesktop1440 × 1000laptop
hdHD1280 × 720desktop monitor
laptopLaptop1366 × 768laptop
laptop-wideLaptop wide1536 × 864laptop
full-hdFull HD1920 × 1080desktop monitor
qhdQHD2560 × 1440desktop monitor
tabletTablet768 × 1024tablet
mobileMobile390 × 844phone

Mac

IdDeviceViewportFrame
macbook-air-13MacBook Air 13″1470 × 956MacBook
macbook-air-15MacBook Air 15″1710 × 1107MacBook
macbook-pro-14MacBook Pro 14″1512 × 982MacBook
macbook-pro-16MacBook Pro 16″1728 × 1117MacBook
imac-24iMac 24″2240 × 1260iMac
studio-displayStudio Display2560 × 1440Studio Display

iPhone

IdDeviceViewportFrame
iphone-17-pro-maxiPhone 17 Pro Max / 16 Pro Max440 × 956iPhone
iphone-17-proiPhone 17 Pro / 17 / 16 Pro402 × 874iPhone
iphone-airiPhone Air420 × 912iPhone
iphone-16-plusiPhone 16 Plus / 15 Plus430 × 932iPhone
iphone-16iPhone 16 / 15 / 15 Pro393 × 852iPhone
iphone-16eiPhone 16e / 14 / 13390 × 844iPhone
iphone-13-miniiPhone 13 mini375 × 812iPhone
iphone-seiPhone SE375 × 667iPhone

iPad

IdDeviceViewportFrame
ipad-pro-13iPad Pro 13″1032 × 1376iPad
ipad-pro-11iPad Pro 11″834 × 1210iPad
ipad-air-13iPad Air 13″1024 × 1366iPad
ipad-air-11iPad Air 11″ / iPad820 × 1180iPad
ipad-miniiPad mini744 × 1133iPad
ipad-classiciPad 9th gen810 × 1080iPad

Android

IdDeviceViewportFrame
androidAndroid phone412 × 915Android phone
android-compactAndroid compact360 × 800Android phone

Retrieve a screenshot

Use the ID from the capture response. Metadata and image are only available to the key owner and until the expiry time.

curl "https://your-domain.com/v1/screenshots/$ID" \
-H "Authorization: Bearer $SCREENSHOT_API_KEY"
​
curl "https://your-domain.com/v1/screenshots/$ID/image" \
-H "Authorization: Bearer $SCREENSHOT_API_KEY" \
-o screenshot.png
{
"id": "3f0c0f1e-…",
"status": "succeeded",
"options": { "url": "https://example.com/", "device": "desktop", "format": "png", "fullPage": false, "frame": false, "cleanup": true },
"createdAt": "2026-11-10T09:00:00.000Z",
"expiresAt": "2026-11-17T09:00:00.000Z"
}

status is succeeded, failed or, briefly while a capture is being finalized, pending or finalizing.

Errors

Errors are JSON with a stable code. Quote the requestId when reporting a problem.

{
"error": {
"code": "invalid_request",
"message": "Invalid capture options.",
"requestId": "b9e1…"
}
}
StatusCodeMeaning
400invalid_requestThe body or an option is invalid.
401unauthorizedThe API key is missing, invalid or revoked.
404not_foundThe screenshot does not exist, has expired or is not yours.
409key_limit_reachedDashboard only: too many active API keys.
502capture_failedThe website could not be captured, for example it blocked the browser or returned an error.
503capture_unavailableCapture is temporarily unavailable. Retry shortly.
503capture_finalization_pendingThe result is being finalized. Fetch it later with the X-Screenshot-Id header.
504capture_timeoutThe page did not finish loading in time.

Limits and behavior

  • Screenshots are private and expire seven days after creation.
  • Images larger than 10 MB, and pages larger than 4096 px wide or 10,000 px tall in full-page mode, are rejected.
  • Only public http and https addresses are captured. Private, loopback and internal hosts are refused.
  • Cleanup is best effort. Some sites block automated browsers.
  • There are no account quotas during launch, but the service can slow or refuse requests under load. Retry 503 and 504 with backoff.