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.

FieldTypeDefaultDescription
urlstring—Required. http(s) only.
widthint1280200–3840, capped by plan.
heightint800200–5000.
full_pageboolfalseCapture full scroll height. Starter and above.
formatstringpngpng or jpeg
delay_msint0Extra wait after load, 0–10000 ms.
authobject—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.
cleanbooltrueAuto-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
FieldTypeDefaultDescription
auth.usernamestring—Login / email.
auth.passwordstring—Password. Send over HTTPS only.
auth.typestringbasicbasic = HTTP Basic auth popup · form = fills the page's login form.
auth.selectorsobjectautoOptional 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 60 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-cleanobsidian-commandcream-serifemerald-sidebarcobalt-cascadetangerine-labelgraphite-gridlinefuchsia-collagealpine-cardnoir-cinemalemon-popteal-ticketbrick-reportpearl-productultraviolet-scanmoss-notebookcobalt-phonecrimson-covercyan-isometricclay-windowacid-zinenavy-statblush-lettertungsten-panelamber-quotejade-maplilac-appscarlet-ribbonarctic-doccoffee-stampspectrum-prism
OG Creator →

POST/api/v1/pdf

Render a URL to PDF. Pro plan and above. Fields: url, format (A4|A3|Letter|Legal), landscape, print_background.

Errors

CodeDescription
401Missing or invalid API key / token.
400 quota_exceededMonthly quota reached. Resets on the 1st.
403 pdf_not_in_planPDF requires Pro or Business (free during your 14-day trial).
403 auth_render_not_in_planAuthenticated renders require Starter or above (included in your trial).
422 render_failedThe URL could not be rendered (unreachable, private IP, timeout).
423Account locked after repeated failed logins.
Screenshot preview