Instant Snap API
Retrieve a capture
Read a stored capture back by its id. The record is the same envelope the create call returned, with one difference that matters: the download link is minted fresh on every read.
The endpoint
https://api.websitescreenshotworld.com/instant-snap/v1/captures/{captureId}{captureId} is the id from the create response. It is a UUID; anything else is a validation failure rather than a 404. Authenticate with the same X-Api-Key header, and note that a key only sees captures made by its own account.
Reading a capture back
curl https://api.websitescreenshotworld.com/instant-snap/v1/captures/0f9d1a6c-3b2e-4f18-8c6a-1d4b7e9a2c05 \
-H "X-Api-Key: $WSW_API_KEY"The response is the same envelope documented on Create a capture, with the same fields and the same meanings. There is no separate read schema to learn.
Links are re-issued, not stored
download_url is signed and valid for 60 minutes. It is generated when you read the capture, so a link that has gone stale is not a problem — read the capture again and you get a new one. expires_at does not move: it is when the file itself is deleted, 24 hours after the capture.
Do not persist the URL, persist the id
download_url in your own database gives you a field that quietly stops working an hour later. Store id and mint a link when you actually need one.The one capture you cannot read back is a by_format one. Those return the bytes and store nothing, so their id has no record behind it and this endpoint answers capture_not_found.
Waiting for an async capture
An async capture reads queued until a browser takes it, then running, then succeeded or failed like any capture. Read it every few seconds; the client libraries' wait does this for you. A capture that never got a browser within 15 minutes reads failed with error_code: capture_expired and was not charged.
Retention and expiry
| Value | Meaning |
|---|---|
Media retention: 24 hours | How long the file itself is kept. After that it is deleted and cannot be recovered. |
Download link: 60 minutes | How long one issued link works. Re-read the capture for a fresh one. |
Once the media has been deleted the record survives, so a read still answers 200 — withstatus: expired, a null download_url and a null expires_at:
{
"success": true,
"id": "0f9d1a6c-3b2e-4f18-8c6a-1d4b7e9a2c05",
"status": "expired",
"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-08-31T09:14:22.000Z",
"final_url": null,
"media_sha256": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
"download_url": null,
"expires_at": null,
"page_source": null,
"s3_delivery": null,
"callback_url": null,
"error_code": null,
"spec_version": "v1"
}Check status, not just the HTTP code
200 here does not mean there is a file to fetch. Code that assumes download_url is always a string will fail on a capture that is one day old.If you need a capture for longer than a day, copy it into your own storage while the link is live — or have the API write it there for you with S3 delivery, which is not subject to our retention at all.
When it is not there
{
"success": false,
"error_code": "capture_not_found",
"error_message": "\"id\" was not found"
}- The id does not exist.
- The id belongs to another account. The API answers
404rather than403on purpose — the alternative would let anyone confirm which capture ids exist. - The capture was made with
response_type: by_formatand therefore never stored.
Did this page answer your question?
Tell us what is missing