Capture screenshots and generate PDFs of any website with a simple GET request. Works from any language — no SDK needed.
No signup required for the free tier. Just make a GET request:
curl "https://api.pandan.is/v1/screenshot?url=https://example.com" -o screenshot.png
That's it! You'll get a PNG screenshot of the page.
The free tier (100 req/month) works without any authentication. For higher limits, register for an API key:
curl -X POST https://api.pandan.is/v1/register \
-H "Content-Type: application/json" \
-d '{"email": "you@example.com"}'
Then include your key in requests via header or query parameter:
# Header (recommended)
curl -H "X-API-Key: pk_your_key_here" "https://api.pandan.is/v1/screenshot?url=https://example.com"
# Query parameter
curl "https://api.pandan.is/v1/screenshot?url=https://example.com&api_key=pk_your_key_here"
GET /v1/screenshot?url={url}
Captures a screenshot of the given URL and returns it as an image.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | required | URL to capture (must include http/https) |
| width | integer | optional | Viewport width in pixels (default: 1280, max: 3840) |
| height | integer | optional | Viewport height in pixels (default: 800, max: 3840) |
| format | string | optional | png or jpeg (default: png) |
| quality | integer | optional | JPEG quality 1-100 (default: 80) |
| full_page | boolean | optional | Capture full scrollable page (default: false) |
| delay | integer | optional | Wait ms before capture, max 10000 (default: 0) |
curl "https://api.pandan.is/v1/screenshot?url=https://github.com&width=1920&height=1080&format=jpeg&quality=90" -o github.jpg
const response = await fetch(
'https://api.pandan.is/v1/screenshot?url=https://github.com&format=png'
);
const buffer = await response.arrayBuffer();
fs.writeFileSync('screenshot.png', Buffer.from(buffer));
import requests
r = requests.get('https://api.pandan.is/v1/screenshot', params={
'url': 'https://github.com',
'width': 1920,
'format': 'jpeg'
})
with open('screenshot.jpg', 'wb') as f:
f.write(r.content)
$img = file_get_contents('https://api.pandan.is/v1/screenshot?url=https://github.com');
file_put_contents('screenshot.png', $img);
GET /v1/pdf?url={url}
Generates a PDF document of the given URL.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | required | URL to render as PDF |
| page_format | string | optional | Page format: A4, Letter, Legal, etc. (default: A4) |
| landscape | boolean | optional | Landscape orientation (default: false) |
curl "https://api.pandan.is/v1/pdf?url=https://example.com&page_format=A4" -o page.pdf
Register for an API key to get higher rate limits.
curl -X POST https://api.pandan.is/v1/register \
-H "Content-Type: application/json" \
-d '{"email": "dev@example.com"}'
# Response:
# {"message":"API key created!","api_key":"pk_abc123...","plan":"free","limits":{...}}
| Plan | Requests/month | Max Viewport | Price |
|---|---|---|---|
| Free | 100 | 1280px | $0 |
| Pro | 5,000 | 3840px (4K) | $9/mo |
| Business | 50,000 | 3840px (4K) | $49/mo |
Rate limit headers are included in every response: X-RateLimit-Limit, X-RateLimit-Remaining, X-Plan
// 400 — Bad request (missing/invalid URL)
{"error": "Missing required parameter: url"}
// 401 — Invalid API key
{"error": "Invalid API key"}
// 429 — Rate limit exceeded
{"error": "Monthly rate limit exceeded", "usage": {...}}
// 500 — Capture failed
{"error": "Failed to capture screenshot", "detail": "..."}