Documentation
ShotForge turns any URL into a PNG, JPEG, PDF or social card with a single HTTP call. Base URL below — all endpoints accept and return JSON except binary renders.
Authentication
Create an API key from your dashboard, then send it in the X-API-Key header:
curl -X POST https://shotforge.dev/api/v1/screenshot \
-H "X-API-Key: sk_your_key" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com"}' --output shot.png
POST/api/v1/screenshot
Render a URL to PNG or JPEG.
| Field | Type | Default | Description |
|---|---|---|---|
| url | string | — | Required. http(s) only. |
| width | int | 1280 | 200–3840, capped by plan. |
| height | int | 800 | 200–5000. |
| full_page | bool | false | Capture full scroll height. Starter and above. |
| format | string | png | png or jpeg |
| delay_ms | int | 0 | Extra wait after load, 0–10000 ms. |
| auth | object | — | Screenshot pages behind a login. Send an optional auth object with your screenshot request — credentials are used once in-memory to render, never stored or logged. |
| clean | bool | true | Auto-dismiss cookie banners, GDPR consents and chat widgets before the shot (default true). |
🔒 Authenticated pages
Screenshot pages behind a login. Send an optional auth object with your screenshot request — credentials are used once in-memory to render, never stored or logged. Starter plan and above.
curl -X POST https://shotforge.dev/api/v1/screenshot \
-H "X-API-Key: sk_your_key" \
-H "Content-Type: application/json" \
-d '{
"url": "https://app.example.com/dashboard",
"auth": {
"username": "you@example.com",
"password": "secret",
"type": "basic"
}
}' --output private-page.png
| Field | Type | Default | Description |
|---|---|---|---|
| auth.username | string | — | Login / email. |
| auth.password | string | — | Password. Send over HTTPS only. |
| auth.type | string | basic | basic = HTTP Basic auth popup · form = fills the page's login form. |
| auth.selectors | object | auto | Optional CSS selectors for form mode: username, password, submit. |
Security: credentials transit over TLS, live only for the duration of the render in an isolated browser context, and are discarded when it closes. They never appear in logs, the database, or usage history (only the target URL is recorded).
POST/api/v1/og-image
Render a 1200×630 social card (PNG).
template — raw (legacy viewport capture) or one of 30 composed template IDs. Composed cards are always 1200×630.
title, subtitle, brand — Optional title (120 chars), subtitle (220) and brand (60) for composed templates.
ember-framemidnight-browserpaper-editorialviolet-orbitlime-terminalocean-splitcoral-stackmono-brutalaurora-glasssunset-cardroyal-deviceblueprintrose-magazinesand-galleryneon-circuitforest-windowruby-postersilver-minimalgold-luxeindigo-focusmint-polaroidcharcoal-newspeach-friendlycyber-gridlavender-floatred-alertsky-dashboardcopper-angleplum-storyice-clean
POST/api/v1/pdf
Render a URL to PDF. Pro plan and above. Fields: url, format (A4|A3|Letter|Legal), landscape, print_background.
Errors
| Code | Description |
|---|---|
| 401 | Missing or invalid API key / token. |
| 400 quota_exceeded | Monthly quota reached. Resets on the 1st. |
| 403 pdf_not_in_plan | PDF requires Pro or Business (free during your 14-day trial). |
| 403 auth_render_not_in_plan | Authenticated renders require Starter or above (included in your trial). |
| 422 render_failed | The URL could not be rendered (unreachable, private IP, timeout). |
| 423 | Account locked after repeated failed logins. |