Turn any URL into a PDF or screenshot.
One API call.
snapdok renders pages with real Chromium through Playwright, so your React, Vue and Tailwind templates come out looking exactly like they do in a browser. No headless cluster to babysit. Free for 250 renders a month, then $12.
# Any URL in. A PDF out.
curl -X POST https://snapdok.io/v1/render \
-H "Authorization: Bearer ps_live_your_key" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com","format":"pdf"}' \
--output invoice.pdf
Binary comes straight back in the response body — PDF, PNG or JPEG. No polling, no callbacks, no job queue.
Why snapdok
A rendering service that behaves like a browser
If your invoice or report template is built with a modern framework, it only looks right once JavaScript has run and the fonts have loaded. That is the job snapdok is built for.
Real Chromium, real JavaScript
Playwright drives an actual Chromium build. SPA hydration, web fonts, flexbox, grid,
CSS variables and @media print all behave the way they do on your machine.
PDF, PNG and JPEG
One endpoint, one format field. A4 PDFs with backgrounds printed,
full-page screenshots, or retina captures at up to 3× device scale.
Control over the capture
Viewport size, full_page, device_scale, a wait_until
strategy including networkidle, an extra delay, and your own timeout.
Repeat renders are free
Identical requests are served from a 24-hour cache with an X-Cache: HIT header
and are not counted against your quota.
Usage you can actually see
Every response carries X-Quota-Used / X-Quota-Remaining, and
GET /v1/usage reports your plan, period and balance any time.
Boring, predictable billing
Stripe handles the card. Hit your allowance and you get a clean 402 with a
next step — never a surprise invoice for going over.
The whole API
Three endpoints. That is the entire surface.
You can read the docs in five minutes and be done. There is no SDK to install and nothing to configure.
| Endpoint | What it does |
|---|---|
POST /v1/render | Render a URL to PDF, PNG or JPEG. Binary in the response body. |
GET /v1/usage | Plan, renders used, remaining allowance, period dates. |
GET /health | Service and browser health. No key required. |
Pricing
Start free. Pay when it earns its keep.
No seats, no sales calls, no annual lock-in. Every plan is a hard cap — you are never billed for going over. Prices in USD, tax added at checkout where required.
Free
Enough to build the whole integration and ship it.
- 250 renders every 30 days
- Resets 30 days after you sign up, then every 30 days
- PDF, PNG and JPEG output
- No credit card
- Same rendering engine as paid plans
- Upgrade later — your key keeps working
Starter
For a live product with real invoice and report traffic.
- 3,000 renders per billing period
- PDF, PNG and JPEG output
- 5 requests / second
- Allowance resets on your renewal date
- Cancel any time, from Stripe
Growth
When document rendering sits in your core product loop.
- 12,000 renders per billing period
- Everything in Starter
- 5 requests / second
- Allowance resets on your renewal date
- Cancel any time, from Stripe
Scale
Batch runs, nightly statement jobs, whole-catalogue exports.
- 60,000 renders per billing period
- Everything in Growth
- 5 requests / second
- Allowance resets on your renewal date
- Cancel any time, from Stripe
How billing works
- Monthly quota resets each billing cycle. Unused requests don't roll over. Free keys reset every 30 days from signup; paid plans reset on your renewal date.
- Cache hits are free. An identical request inside 24 hours comes back
X-Cache: HITwithX-Quota-Charged: 0— it never touches your quota. - Failed renders are free. If we don't hand you a file, we don't count it. Timeouts, unreachable URLs and bad requests all cost nothing.
- Every plan is a hard cap. Run out and the API returns
402with an upgrade link. Nothing is ever charged automatically on top of your plan.
Payment is handled by Stripe Checkout — card details never touch our servers. Your API key is shown on the confirmation page the moment payment clears.
Get a free API key
250 renders a month, no card, no call. The key appears on this page — it is shown once.
FAQ
Questions people actually ask
What rendering engine is behind it?
Playwright driving Chromium — the same engine family your users browse with. JavaScript executes, modern CSS works, web fonts load.
My app is React / Vue / Next.js. Will it render?
Yes. Navigation waits for the wait_until strategy you choose. For heavy
client-side apps use "wait_until":"networkidle", and add
"delay":500 if you animate content in after load.
How do I get my API key?
Two ways, both instant. On the Free plan, put your email in the free key form above — no card, and the key appears on the page as soon as you submit. On a paid plan, the key is displayed on the Stripe confirmation page the moment payment clears.
Either way, copy it there and then: for security it is stored only as a hash afterwards, and the readable copy stays on screen for about ten minutes before it is wiped.
What happens when I run out of renders?
You get HTTP 402 with a JSON body explaining which allowance ran out, when it
resets and what to do next. Every plan is a hard cap, so nothing is charged automatically and
you can never receive a bill bigger than the plan you picked — you decide whether to wait for
the reset or move up a plan.
Do unused renders roll over?
No. Your monthly quota resets each billing cycle and unused requests do not carry over — free keys reset every 30 days from signup, paid plans on your renewal date.
Are repeat renders billed twice?
No. An identical request within 24 hours is served from cache, marked
X-Cache: HIT, and is not metered.
Can it render pages behind a login?
Not yet — the URL has to be publicly reachable. Cookie and header injection is on the roadmap; tell us if you need it and it moves up.
Where does it run, and what do you keep?
On Hetzner hardware in Falkenstein, Germany. Rendered files are held in a cache for up to 24 hours so repeat requests are free, then deleted. We store your key as a SHA-256 hash, the URLs you render are not retained beyond that cache window, and payment data lives with Stripe.
Who is behind snapdok?
One independent developer. It launched in 2026 with no customers yet, so you would be an early one — which also means your feature requests land directly with the person writing the code, and get answered.
Ready to render something?
Claim a free key, paste it into a
curl, and you have a PDF about ten seconds later. Upgrade whenever the free
250 a month stops being enough — the same key carries on working.