The screenshot API that develops in the dark.

One GET request in, a pixel-perfect PNG out. backshot keeps a warm Chromium running so your renders start in milliseconds, and the same render is never billed twice.

curl "https://backshot.dev/v1/screenshot?url=https://stripe.com&key=YOUR_KEY" -o shot.png
->PNG, JPEG, WebP screenshots and print-grade PDF: full page, element, or viewport.
->Cache hits cost zero credits. Render once, embed the URL forever.
->SSRF-guarded by default: private ranges, metadata IPs and sneaky redirects are refused.
->Try it right here: no signup, the demo key is already loaded.
the frame is empty. render something
f/8 and be there. enter a URL and press render

demo key · 50 credits, refills hourly · 10 renders/min

An API you can read in one sitting.

Auth is a Bearer header or a ?key= query param, which means a screenshot URL can go straight into an <img> tag. Responses are the image bytes themselves; add response=json if you want metadata instead.

response headers, second call onward
HTTP/1.1 200 OK
Content-Type: image/png
X-Backshot-Cache: HIT
X-Backshot-Credits-Remaining: 1993
X-Backshot-Render-Ms: 1
X-RateLimit-Remaining: 58

// cache hits are free.
// the meter only runs when
// Chromium actually works.

The spec sheet.

Everything below is implemented and testable right now; no roadmap items dressed up as features.

Warm Chromium

One long-lived browser, a fresh isolated context per render. No cold starts, no browser-per-request memory bombs. A concurrency-limited queue keeps a traffic spike from taking the box down, and a 30-second hard timeout keeps one pathological page from wedging a worker.

GET/POST /v1/screenshot
POST /v1/pdf

Free cache hits

Every render is content-addressed by its full parameter set and kept for 24 hours. Ask for the same frame twice and the second one returns in a millisecond, costs nothing, and says so in the X-Backshot-Cache header. Embed a screenshot URL in your README and stop thinking about it.

X-Backshot-Cache: HIT|MISS
ttl 24h

Frame control

Viewport size, device scale up to 3x, full-page capture, or a single element by CSS selector. Emulate dark mode, hide cookie-consent banners, wait for network idle or a fixed delay before the shutter fires.

width height scale
full_page selector
dark_mode delay_ms
block_cookie_banners

PDF, from URL or raw HTML

Print-grade PDF with page format, landscape, margins and background control. Send a URL, or POST your own HTML (invoices, reports, certificates) and get the document back in one round trip.

format A4|Letter|Legal
landscape margin scale
print_background

SSRF armor

A URL-rendering service is a proxy into your network unless it refuses to be. backshot rejects non-HTTP schemes, resolves every hostname and blocks private and reserved ranges (cloud metadata IPs included), re-checks every redirect hop, and screens every subresource the page loads.

blocked 127/8 10/8
172.16/12 192.168/16
169.254/16 fc00::/7
file: data: chrome:

Credits, not subscriptions.

One credit is one fresh render. Cache hits, errors and blocked requests cost nothing. Credits never expire.

Demono signup
$0
50refills hourly
live on this page. The playground above uses it. 10 renders/min.
Darkroomside projects
$9
2,000never expire
60 renders/min. Your own key, your own meter.
Studioproduction
$29
10,000never expire
120 renders/min. Priority queue slot.

Honesty clause: online checkout isn't wired up yet; paid keys are issued by hand while backshot is in its first public build. The demo tier, the API, the cache and the security model are all fully live. If you want a paid key today, the docs describe exactly what you'd be buying.