A URL goes in.
An image comes out.
Shotbolt is one HTTP endpoint for the thing every product needs and nobody wants to host: a headless browser. Screenshots, PDFs and 1200×630 Open Graph images, metered by the render, cached so the same request never costs twice.
100 renders a month, free, no card.
Press Render. No key, no signup.
curl -G https://shotbolt.app/v1/screenshot \ -H "Authorization: Bearer $SHOTBOLT_KEY" \ --data-urlencode "url=https://news.ycombinator.com" \ -d "width=1280" -d "format=png" -d "block_ads=true" \ -o shot.png
Three endpoints, one engine
Everything a browser can print
Every endpoint takes url or raw html, speaks GET and POST, and returns the file itself — not a job id you have to poll.
Screenshots
Viewport or full page, PNG, JPEG or WebP, clipped to a CSS selector, dark mode, ads blocked, wait for the element you actually care about.
- url
- html
- viewport
- full_page
- format
- quality
- selector
- block_ads
- dark
- delay
- wait_for
HTML to PDF
Invoices, reports and contracts. Page size, margins, landscape, print backgrounds, and running header and footer templates with page numbers.
- url
- html
- page_size
- margin
- landscape
- print_background
- header_html
- footer_html
- page_ranges
Open Graph images
1200×630 social cards from three built-in templates — title, subtitle, logo, theme, accent — or from your own HTML when the templates are not enough.
- title
- subtitle
- template
- theme
- accent
- logo
- html
- format
Quickstart
Thirty seconds to the first render
No SDK required — it is a GET with a bearer token. There is a dependency-free TypeScript client if you prefer types.
- Response headers carry the meter — cache state, credits charged, render duration, free balance.
- Identical requests are free — the second call is served from the content cache and charges nothing.
- Failures are refunded — a 5xx or a timeout never spends a credit.
- 429 instead of a hung socket — over capacity you get a Retry-After, immediately.
# One call. The bytes come back on stdout. curl -G https://shotbolt.app/v1/screenshot \ -H "Authorization: Bearer $SHOTBOLT_KEY" \ --data-urlencode "url=https://stripe.com" \ -d "width=1280" -d "full_page=true" -d "format=webp" \ -o stripe.webp
OG templates
Three that already look finished
Pass a title and pick a template. Pass your own HTML when you have a designer. Both come back as a 1200×630 PNG, JPEG or WebP.
Gradient
Accent glow, faint grid, big headline.
Gradient
Accent glow, faint grid, big headline. The default.
template=gradient
$ render
Terminal
Terminal
A window chrome and a mono headline. Reads as a dev tool.
template=terminal
Split
Text left, accent panel right.
Split
Text left, accent panel right with the initial or your logo.
template=split
Render any of them for real in the playground above.
How it stays cheap
One browser, launched when you ask, closed when you stop
Lazy Chromium
Launched on the first request and closed after 60s idle. An idle API costs nothing to run, so the free tier is real.
Bounded queue
1 renders at a time and a waiting room. Past that, 429 with Retry-After — never a request left hanging.
Content cache
sha256 of the normalised request, 0h TTL, LRU byte cap. ETag and If-None-Match, so repeats are a 304.
SSRF guard
Every hostname is resolved and checked: loopback, link-local and RFC1918 are rejected, redirects re-checked hop by hop.
Pricing
One credit per render
Free
$0
100 renders a month, per key, reset on the 1st. No card.
starter-5k
$9
One-off pack of 5,000 renders. Credits never expire.
pro-monthly
$19/mo
25,000 renders a month, higher rate limit, priority queue slot.
Cache hits are free. Failed renders are refunded. Credits from one-off packs never expire.