Screenshot any website. Instantly.

Paste a URL, get a clean thumbnail back. Cached forever, generated on demand, built for link previews and directories.

Equivalent API call
Try any URL above — up to 3 captures per visitor, then a 30 minute wait

You're using the public test endpoint — limited to 3 captures per visitor (one per minute), then a 30 minute wait before the next one. Pick any size you like (default 300×200); the presets are just shortcuts. Real API keys get the same size freedom up to their plan's limit, plus much higher rate limits and all the options above.

FormatJPEG
Cache1 year
Max size3840×2160
Typical latency2–6 sec
Uptime target99.5%

Simple, resolution-based pricing

Free to start. Upgrade for higher resolution and volume.

🎟 Prepay & double up — prepay for any term and we double your monthly quota for double that term. Sign up for 1 month, get 2× quota for 2 months. Sign up for 2 years, get 2× quota for 4 years. Choose your term below — it's included automatically when you request a key.
Plan Price Max size Requests/mo Prepay promo Support
Free $0/mo$0/yr 300×200 100 — Community Get free key
Starter $5/mo$50/yr 300×200 500 1,000 for 2× term Email, 24h Sign up
Basic $9/mo$90/yr 300×200 1,000 2,000 for 2× term Email, 24h Sign up
Standard $14/mo$140/yr 300×200 2,000 4,000 for 2× term Email, 24h Sign up
Pro HD $19/mo$190/yr 800×600 100 200 for 2× term Email, 24h Sign up
Full HD $79/mo$790/yr 1920×1080 2,000 4,000 for 2× term Priority Sign up
4K $79/mo$790/yr 3840×2160 1,000 2,000 for 2× term Priority Sign up
Enterprise CustomCustom Custom Custom Negotiable Dedicated Contact us

How it works

01 / REQUEST

Send a URL

Call the API with any website URL and your API key.

02 / QUEUE

Instant response

You immediately get a placeholder while we render in the background — no waiting.

03 / RENDER

Full page capture

A real browser loads the page, waits for it to settle, then captures it. Add &full=true to make it wait an extra 10 seconds after load — helpful for slow pages or ones that redirect client-side.

04 / CACHE

Served forever

The result is cached — every future request for that URL is instant. Got a bad one? Add &refresh=true once to force a fresh capture.

API Reference

Every option the API accepts — the same ones the demo above uses under the hood.

Authentication

MethodHow
Header (preferred)x-api-key: <your-key>
Query param?api_key=<your-key>

Endpoints

EndpointAuthReturns
GET/screenshotAPI keyJSON — { success, status, screenshot_url } (or a job_id + status_url if still processing)
GET/screenshot/status/:jobIdAPI keyJSON job status — queued / processing / done / failed
GET/imageAPI keyRaw image bytes. Serves a placeholder while generating or on failure, so it's always safe to drop straight into an <img src>.
POST/demo/sessionnoneJSON — { session_id }. Call once, then pass it as ?session= on /demo.
GET/demosession idJSON, same shape as /screenshot. This is what the demo above calls.
GET/demo/status/:jobIdnoneJSON job status, same shape as /screenshot/status.

Query parameters

ParamTypeDefaultDescription
urlstringrequiredTarget page to capture. The https:// prefix is optional — it's inferred automatically. Private/internal hosts (localhost, 10.x, 172.16–31.x, 192.168.x) are rejected.
widthnumber / auto300Output width in px, clamped to 50–your plan's max (300 default, up to 3840 on 4K; this demo allows any size). auto renders the page at its natural width.
heightnumber / auto200Output height in px, same clamp rules as width. auto renders the page at its natural height.
viewporttrue / falsefalseCapture at the actual requested size (real responsive layout) instead of a fixed desktop capture scaled down. Turned on automatically when width or height is auto.
fulltrue / falsefalseWait for the page to fully settle (network-idle, falling back to DOM-loaded) plus ~15s extra, before capturing. Slower, more reliable for JS-heavy or redirecting sites. This is the demo's "Wait for full page load" checkbox.
refreshtrue / falsefalseForce a fresh capture instead of serving the cache. Ignored if the same URL/size/mode was captured successfully in the last 10 minutes.
waittrue / falsefalseHold the request open until the capture finishes (up to 45s) instead of returning a job id to poll immediately.
qualitynumber (1–100)65Output quality as a percentage — 100 is largest/best, 1 is smallest/worst. Only affects JPEG; no-op when format=png. This is the demo's Quality slider.
formatjpeg / pngjpegpng is lossless — sharper text/UI, bigger file — and ignores quality. This is the demo's PNG checkbox.
radiusnumber (0–500)0Rounds the output image's own outer corners, making the cut-away area transparent. Only has an effect with format=png — JPEG has no alpha channel, so it's ignored there. This rounds the image itself, not whatever's rendered on the page — it doesn't detect or preserve a page's own CSS corner rounding. This is the demo's Corner radius slider.
nostoretrue / falsefalse/image only, requires wait=true. One-time delivery: once the image bytes have been sent in this response, the copy is deleted from our server — nothing left to cache or re-serve. Use this if you're pulling the image into your own storage and don't want us keeping a copy.
api_keystring—Alternative to the x-api-key header. /screenshot and /image only.
sessionuuidrequired/demo only — obtained from POST /demo/session.

Rate limits & quotas

ScopeLimit
Per IP address30 requests / 5 minutes
Per API key60 requests/minute (5/minute for test keys)
Demo session1 capture / minute, up to 3, then 30 min wait
Monthly quotaPer-key, default 1,000/mo (plan-dependent)

Example

# JSON response, waits for the capture to finish curl "https://your-domain/screenshot?url=example.com&width=1280&height=800&full=true&wait=true" \ -H "x-api-key: YOUR_API_KEY" # Raw image bytes, deleted from our server right after this response curl "https://your-domain/image?url=example.com&width=1280&height=800&wait=true&nostore=true" \ -H "x-api-key: YOUR_API_KEY" -o screenshot.jpg