Pixel-perfect website screenshots with one POST
Full-page or viewport PNG and JPEG, retina scaling, any viewport from phone to 4K, and print-ready PDFs. Cookie banners are dismissed for you. Pages that fail to load are never billed.
Get an API keyTry it live, free
- Real Chromium rendering
- Up to 5 URLs per request
- ~3 s for a simple page in our tests
Capture any public URL
Each result includes a fileUrl: a signed download link that works without your key while the file is retained (7 days). Download and store what you need.
format:png,jpegorpdffullPage,viewportWidth320–3840,viewportHeight240–2160,deviceScaleFactor1–3waitForSelectoranddelaySec(up to 10 s) for late-rendering pages
curl https://siftwright.com/v1/screenshot \
-H "Authorization: Bearer $SIFTWRIGHT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com", "format": "png", "fullPage": true, "deviceScaleFactor": 2}'import os, requests
api = requests.post(
"https://siftwright.com/v1/screenshot",
headers={"Authorization": f"Bearer {os.environ['SIFTWRIGHT_API_KEY']}"},
json={"url": "https://example.com", "format": "png", "fullPage": True},
timeout=300,
)
api.raise_for_status()
shot = api.json()["results"][0]
if shot["status"] == "ok":
with open("example.png", "wb") as f:
f.write(requests.get(shot["fileUrl"], timeout=60).content)import { writeFile } from "node:fs/promises";
const res = await fetch("https://siftwright.com/v1/screenshot", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SIFTWRIGHT_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ url: "https://example.com", format: "jpeg", viewportWidth: 390, viewportHeight: 844 }),
});
const [shot] = (await res.json()).results;
const file = await fetch(shot.fileUrl);
await writeFile("mobile.jpg", Buffer.from(await file.arrayBuffer()));{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=siftwright/youtube-transcript-extractor,siftwright/pageframe-screenshots,siftwright/google-news-scraper",
"headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }
}
}
}What you get back
Real output for example.com (signature shortened).
| Field | What it is |
|---|---|
fileUrl | Signed link to the PNG, JPEG or PDF |
sizeBytes | File size |
durationMs | Time spent capturing the page |
status | "ok" or the error (timeout, DNS, HTTP 4xx/5xx); only ok is billed |
[
{
"url": "https://example.com",
"status": "ok",
"format": "png",
"fileUrl": "https://api.apify.com/v2/key-value-stores/0X8wj07Im15iPdSCI/records/capture-1790638755542-iqbgdq.png?signature=…",
"sizeBytes": 19887,
"durationMs": 327
}
]What people build with it
Link previews and thumbnails
Generate preview images for bookmarks, directories and CMS entries.
Visual monitoring
Capture pages on a schedule and diff them to spot layout or content changes.
Archiving and compliance
Keep dated visual records of pages, ads or terms as they appeared.
QA across viewports
Check responsive layouts at phone, tablet and desktop widths in one batch.
Social cards and reports
Drop captures into slide decks, PDFs and client reports.
Agent vision
Let a multimodal model look at a page the way a person does.
Pricing
Each page that captures successfully counts as one result, whether it's a PNG, a JPEG or a PDF. Timeouts, DNS errors and 4xx/5xx pages are free.
| Option | Price |
|---|---|
| Starter plan | $29/mo for 10,000 results ($2.90/1k) |
| Pro plan | $99/mo for 50,000 results ($1.98/1k) |
| Business plan | $299/mo for 250,000 results ($1.20/1k) |
| Enterprise plan | $999/mo for 1,500,000 results ($0.67/1k) |
| Pay-per-event on Apify | $1.50 per 1,000 captures, no subscription |
Frequently asked questions
Can I pass raw HTML instead of a URL?
Not yet. The API renders URLs. If your HTML isn't public, serve it from a short-lived URL (for example a signed object-storage link) and capture that. See the HTML to PDF page for the pattern.
How long are files kept?
Files are stored for 7 days and the fileUrl works without your API key during that time. Download anything you want to keep.
Does it block ads or handle logins?
It dismisses common cookie-consent banners on a best-effort basis. It doesn't do ad blocking, and it doesn't log in to sites: it captures what a logged-out visitor sees.
Can I capture mobile layouts?
Yes. Set viewportWidth (for example 390) and viewportHeight, and deviceScaleFactor 2 or 3 for sharp retina output.
What about very long pages?
fullPage: true captures the whole scrollable page. Pages that lazy-load content may need delaySec or waitForSelector.
Start capturing pages in minutes
Plans from $29/month with 10,000 successful results. Failed requests never count. Cancel anytime from the billing portal.