Pay only for what you render.
Screenshots & PDFs from any URL.
One API for screenshots and PDFs. Buy credits once, use them whenever — credits never expire. Or pick a monthly plan. No subscription required.
100 free renders / month · no credit card · cancel anytime
One API call. Any language.
Add screenshots and PDFs to any app in minutes.
curl -X POST https://screenshotapis.org/v1/screenshot \ -H "X-Api-Key: sk_live_your_key" \ -H "Content-Type: application/json" \ -d '{"url": "https://example.com", "format": "png"}' \ --output screenshot.png curl -X POST https://screenshotapis.org/v1/pdf \ -H "X-Api-Key: sk_live_your_key" \ -H "Content-Type: application/json" \ -d '{"html": "<h1>Hello</h1>", "format": "A4"}' \ --output document.pdf
from screenshotapis import Client client = Client("sk_live_your_key") png = client.screenshot("https://example.com") with open("screenshot.png", "wb") as f: f.write(png) pdf = client.pdf(html="<h1>Invoice #42</h1>") with open("invoice.pdf", "wb") as f: f.write(pdf)
import Client from "screenshotapis"; import fs from "fs"; const client = new Client("sk_live_your_key"); const png = await client.screenshot({ url: "https://example.com" }); fs.writeFileSync("screenshot.png", Buffer.from(png)); const pdf = await client.pdf({ html: "<h1>Invoice #42</h1>" }); fs.writeFileSync("invoice.pdf", Buffer.from(pdf));
package main import ( "bytes"; "io"; "net/http"; "os" ) func main() { body := []byte(`{"url":"https://example.com","format":"png"}`) req, _ := http.NewRequest("POST", "https://screenshotapis.org/v1/screenshot", bytes.NewReader(body)) req.Header.Set("X-Api-Key", "sk_live_your_key") req.Header.Set("Content-Type", "application/json") resp, _ := http.DefaultClient.Do(req) data, _ := io.ReadAll(resp.Body) os.WriteFile("screenshot.png", data, 0644) }
Everything you need to render the web
Production-ready from day one.
🖼
Screenshots
PNG, JPEG, or WebP. Full-page or viewport. Retina-quality. Perfect for link thumbnails and visual regression.
📄
PDF rendering
A4, Letter, Legal, Tabloid. Custom margins and headers. Great for invoices and report generation.
🎯
OG image generation
Pass a CSS selector to capture just one element. Render dynamic social cards from your own HTML.
🌐
URL or raw HTML
Render any public URL or inject your own HTML directly — no hosting required.
🛡
Ad & cookie blocking
Block ads, trackers, and cookie banners for clean captures. One flag, 40+ ad networks blocked.
💉
CSS & JS injection
Inject custom CSS or JavaScript before capture. Hide elements, change styles, run setup code.
⚡
Fast & reliable
Powered by Playwright + Chromium. Sub-second renders. Custom wait strategies and user agents.
🔔
Webhook callbacks
Get results async. Add a webhook_url and we POST the render result when it's ready. HMAC-signed.
Try the API on these URLs
Click any card to render it in the demo above — live, with our API.
posthog.comRun this →
vercel.comRun this →
linear.appRun this →
tailwindcss.comRun this →
github.comRun this →
raycast.comRun this →
Pay only for what you render
1 credit = 1 render. Pick a monthly plan, or buy credits one-time and use them whenever.
Or skip the subscription.
Buy credits one-time and use them whenever — credits never expire. Great for agencies, side projects, and one-off batches.
Need more? Contact us for volume pricing.