Instant Snap API
Instant Snap API
One request in, one capture out. You describe the page and the rendering you want; the API answers with the file itself, a link to it, or a receipt for a delivery to your own bucket. Nothing has to be set up in the application first.
What it does
The Instant Snap API renders a URL on demand and gives you the result. It is stateless from your side: every request carries its own settings, so two calls can capture the same page at different sizes, in different formats, from different countries, without anything being configured in advance.
- Images, videos and PDFs, or the page's readable text as Markdown or plain text
- Desktop viewports or emulated mobile devices
- Viewport-only or full-page scrolling captures
- Custom headers, cookies, locale, time zone and geolocation
- Element hiding, clicking and hovering before the shot is taken
- Delivery to a link we host, or straight into an S3-compatible bucket you own
This is not the schedule API
Base URL and auth
https://api.websitescreenshotworld.com/instant-snap/v1Every path on this page hangs off that prefix. Authenticate with your key in an X-Api-Key header on every request — see API keys. The only exceptions are GET /defaults and GET /openapi.json, which are public.
The whole API is described in an OpenAPI 3.1 document at https://api.websitescreenshotworld.com/instant-snap/v1/openapi.json. Import it into Postman or a code generator — OpenAPI documents has the details.
Your first call
A URL is the only field the API insists on. Everything else has a default, so this is a complete, valid request:
curl -X POST https://api.websitescreenshotworld.com/instant-snap/v1/captures \
-H "X-Api-Key: $WSW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com"}'That captures example.com at 1920×1080 on a desktop viewport, as a PNG, with advertising and pop-ups blocked, and answers with a JSON envelope:
{
"success": true,
"id": "0f9d1a6c-3b2e-4f18-8c6a-1d4b7e9a2c05",
"status": "succeeded",
"response_type": "json",
"media_category": "image",
"format": "png",
"content_type": "image/png",
"size_bytes": 184203,
"width": 1920,
"height": 1080,
"duration_ms": 3184,
"page_http_status": 200,
"captured_at": "2026-09-01T09:14:22.000Z",
"final_url": null,
"media_sha256": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
"download_url": "https://cdn.websitescreenshotworld.com/...",
"expires_at": "2026-09-02T09:14:22.000Z",
"page_source": null,
"s3_delivery": null,
"callback_url": null,
"error_code": null,
"spec_version": "v1"
}The capture is stored for 24 hours — expires_at says until when. download_url is a signed link valid for 60 minutes; reading the capture again re-issues a fresh one.
Two rules worth learning first
Almost every surprising result in an integration comes down to one of these two, so they are worth reading before the parameter list.
Presence, not truthiness
false. Ad blocking and pop-up blocking default to on: omit block_ads and ads are blocked; send "block_ads": false and they are not. Sending null is treated as omitting the field.Clamp versus reject
validation_failed, with the offending field named. The API does not silently round your value down to the ceiling, because a request that quietly did something other than what it said would be worse than one that failed.The endpoints
| Value | Meaning |
|---|---|
POST /captures | Render a URL and return the result. The endpoint you will use most. |
GET /captures/{captureId} | Read a stored capture back, with a fresh download link. |
GET /defaults | Ask the API what it will do when you leave a field out. No API key required. |
GET /catalog | The device names emulated_device accepts and the countries proxy.country accepts right now. Needs your API key. |
GET /openapi.json | This API's OpenAPI 3.1 document, for Postman or a code generator. No API key required. |
Request bodies and response fields are snake_case throughout.
How answers are shaped
response_type decides what comes back, and it changes the shape of the response rather than a detail within it:
| Value | Meaning |
|---|---|
json | The default. A JSON envelope describing the capture, with a signed download link. |
by_format | The file bytes themselves, with the metadata moved into X-InstantSnap-* headers. Nothing is stored. |
cloud_storage | The capture is written into your own S3-compatible bucket and the envelope describes the delivery. |
Errors are always JSON, whatever response_type asked for, because there is no file to return when a request fails.
Did this page answer your question?
Tell us what is missing