Website screenshot API
A website screenshot API turns a URL into an image. Send Shotkiln one GET request and get a PNG, JPEG or WebP back, rendered in real Chromium on Cloudflare.
- Endpoint
GETorPOST /v1/screenshot- Formats
- PNG, JPEG, WebP (quality 1–100 for JPEG and WebP)
- Viewport
- 320–3,840 px wide, 200–3,840 px tall, default 1280 × 800
- Full page
- up to 16,384 px tall
- Scale
- device_scale_factor 1–3 (2 for retina)
- Speed
- about 2.5 s typical; cache hits often under half a second
- Price
- 100 free a month; $9 for 2,000 ($4.50 per 1,000)
URL to PNG in one request
Put the target URL in the url parameter and write the response to a file. The same request works from curl, a browser fetch, a cron job or a CI step.
curl "https://shotkiln.com/v1/screenshot?url=https://example.com&width=1440&height=900&format=png" \
-H "x-api-key: $SHOTKILN_KEY" -o example.pngimport os, requests
r = requests.get("https://shotkiln.com/v1/screenshot",
params={"url": "https://example.com", "full_page": "true", "format": "webp"},
headers={"x-api-key": os.environ["SHOTKILN_KEY"]}, timeout=60)
r.raise_for_status()
open("example.webp", "wb").write(r.content)Full-page and mobile screenshots
full_page=true captures the full scroll height instead of the viewport. For a phone-sized capture, set width=390&height=844&device_scale_factor=3: the page gets a 390 px viewport and the image comes back at 1,170 px wide.
dark_mode=true sets prefers-color-scheme: dark, so sites with a dark theme render in it. delay waits up to 10,000 ms after the load event for animations, web fonts or lazy content.
What happens on each request
- Validate. Parameters are checked against your plan's limits. Errors come back as JSON with the parameter name.
- Check the address. The hostname is resolved and refused if it points at a private, loopback, link-local or metadata address, or a known malicious host.
- Look up the cache. If the same parameters were rendered within
cache_ttl, the stored file is returned and no quota is used. - Render. Chromium opens the page, re-checks every redirect and subrequest, and captures the image within the plan's time budget (15–30 s).
- Respond. The image is the response body. Headers report quota, rate limit, render time and the target page's HTTP status.
How fast it is
A typical screenshot comes back in about 2.5 seconds. Repeat requests come straight from cache, often in under half a second. Script-heavy news sites take longer, static pages less.
Set cache_ttl as high as your freshness needs allow: cached responses use no quota.
Running on Cloudflare Browser Rendering
Cloudflare Browser Rendering (also called Browser Run) gives Workers a headless Chromium. Cloudflare also offers a REST screenshot endpoint, billed at $0.09 per browser-hour after 10 included hours on the $5 Workers Paid plan.
Shotkiln adds the parts you would otherwise write yourself: API keys and quotas, a shared render cache, SSRF checks on every redirect and subrequest, a malicious-host denylist, PDF and OG endpoints, and an MCP server. If you already run Workers and want full control, calling Browser Rendering directly is cheaper at high volume.
Screenshot API cost at common volumes
| Renders a month | 1,000 | 2,000 | 10,000 | 50,000 |
|---|---|---|---|---|
| Shotkiln | $9 Starter | $9 Starter | $19 Pro | $49 Scale |
| ScreenshotOne | $17 Basic | $17 Basic | $79 Growth | $259 Scale |
| Urlbox | $19 Lo-Fi | $19 Lo-Fi | $99 Ultra | above listed tiers |
| ApiFlash | $7 Lite | $35 Medium | $35 Medium | $180 Large |
| CaptureAPI | $9 Starter | $9 Starter | $29 Pro | $79 Business |
Urlbox Lo-Fi ($19) renders third-party sites as thumbnails only; full captures of other sites start on Hi-Fi ($49 for 5,000).
Cheapest published plan covering each volume. Details on the alternatives page.
Frequently asked questions
- Is there a free screenshot API?
- Yes. A free Shotkiln key gives 100 screenshots a month with a small watermark and no card. ScreenshotOne and ApiFlash also give 100 free a month; Urlbox has no free plan.
- Can it capture a full-page screenshot?
- Yes. Set
full_page=trueto capture the whole scroll height, up to 16,384 pixels. Add adelayfor lazy-loaded images, and use WebP to keep long pages small. - Does it remove cookie banners and ads?
- No. Pages are captured as a first-time visitor sees them, banners included. If you need banner and ad blocking, ScreenshotOne, Urlbox and ApiFlash offer it.
- Can I screenshot a page behind a login?
- No. Shotkiln renders public pages only and doesn't accept cookies or custom headers, which keeps your sessions out of a third-party browser. For internal dashboards, run Playwright inside your own network.
- How long are screenshots stored?
- Only for the cache_ttl you set: one hour by default, up to 30 days, or not at all with cache_ttl=0. Nothing is kept for analysis or training.