Screenshots & PDFs
from any URL or HTML

One API call converts any webpage or HTML snippet to a pixel-perfect screenshot or PDF. Any language. Sub-second renders. Free tier included.

Start for free → Read the docs
Enter a URL above and click Screenshot to see a live render.

No account needed for the demo  ·  100 free renders/month after signup

One API call. Any language.

Add screenshots and PDFs to any app in minutes.

# Screenshot a URL → PNG
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

# Render HTML → PDF
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
import requests

# Screenshot
resp = requests.post(
    "https://screenshotapis.org/v1/screenshot",
    headers={"X-Api-Key": "sk_live_your_key"},
    json={"url": "https://example.com", "format": "png"},
)
with open("screenshot.png", "wb") as f:
    f.write(resp.content)

# PDF
resp = requests.post(
    "https://screenshotapis.org/v1/pdf",
    headers={"X-Api-Key": "sk_live_your_key"},
    json={"html": "<h1>Invoice #42</h1>"},
)
with open("invoice.pdf", "wb") as f:
    f.write(resp.content)
import fs from "fs";

// Screenshot
const resp = await fetch("https://screenshotapis.org/v1/screenshot", {
  method: "POST",
  headers: {
    "X-Api-Key": "sk_live_your_key",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ url: "https://example.com", format: "png" }),
});
const buf = Buffer.from(await resp.arrayBuffer());
fs.writeFileSync("screenshot.png", buf);

// PDF
const pdf = await fetch("https://screenshotapis.org/v1/pdf", {
  method: "POST",
  headers: { "X-Api-Key": "sk_live_your_key", "Content-Type": "application/json" },
  body: JSON.stringify({ html: "<h1>Invoice</h1>" }),
});
fs.writeFileSync("invoice.pdf", Buffer.from(await pdf.arrayBuffer()));
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 with device_scale_factor=2.

📄

PDF rendering

A4, Letter, Legal, A3, Tabloid. Custom margins, headers, footers, landscape mode.

🎯

Element capture

Pass a CSS selector to capture just one element — perfect for OG image generation.

🌐

URL or raw HTML

Render any public URL or inject your own HTML directly — no hosting required.

🌙

Dark mode

Set dark_mode=true to render with the dark color scheme enabled in the browser.

Fast & reliable

Powered by Playwright + Chromium. Semaphore-limited concurrency. 30 s timeout.

Built for these use cases

What developers are building with Screenshot API.

OG image generation

Render dynamic Open Graph / social card HTML on every publish.

PDF invoices

Inject invoice HTML, get a branded PDF — no headless Chrome setup needed.

Web archival

Snapshot any URL at a point in time. Full-page captures preserved as PNG.

Link thumbnails

Auto-generate preview images for any link pasted into your app.

Visual regression

Screenshot your staging app on every deploy and diff against baseline.

Report generation

Render chart dashboards to PDF for weekly digests or scheduled emails.

Simple, credit-based pricing

1 credit = 1 render. Credits reset monthly. No overage surprises.

Free
$0
100 renders/mo
10 req/min
Get started
Starter
$19/mo
2,000 renders/mo
30 req/min
Get started
Business
$149/mo
25,000 renders/mo
120 req/min
Get started
Scale
$299/mo
75,000 renders/mo
300 req/min
Get started

Need more? Contact us for volume pricing. Credit packs available for occasional bursts.

Start rendering in 2 minutes

Free tier. No credit card required. 100 renders every month forever.

Create your free account →