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

If the settings you want already live in a Web Profile attached to an Auto Schedule, the Auto Schedule API fires that schedule instead — different host, different path, no request body.

Base URL and auth

Base URL
https://api.websitescreenshotworld.com/instant-snap/v1

Every 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:

Capture a page
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:

Response
{
  "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

A field you leave out is not the same as a field set to 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

Leaving a numeric field out gives you the default. Sending it with a value outside the allowed range is an error — 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

ValueMeaning
POST /capturesRender 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 /defaultsAsk the API what it will do when you leave a field out. No API key required.
GET /catalogThe device names emulated_device accepts and the countries proxy.country accepts right now. Needs your API key.
GET /openapi.jsonThis 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:

ValueMeaning
jsonThe default. A JSON envelope describing the capture, with a signed download link.
by_formatThe file bytes themselves, with the metadata moved into X-InstantSnap-* headers. Nothing is stored.
cloud_storageThe 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