The playground

Try any of 919 endpoints — live.

Pick an endpoint, load a working example, tweak the params, and send — no signup to try. Results render the way the data deserves; raw JSON, headers & code are one tab away.

Playground demo key · api.reefapi.com
post/web-capture/v1/batch5 credits

Screenshot up to 5 URLs in one call (queued through the render slots); per-URL ok/error so one bad URL never sinks the batch.

Working example
Parameters

Up to 5 URLs (JSON array or comma-separated). Rendered through the queue; per-URL ok/error in results[].

Capture the entire scrollable page (auto-scrolls first so lazy-loaded content renders). Height is capped by max_height_px.

Output image format (jpg/jfif are accepted aliases for jpeg).

JPEG/WebP quality 1-100 (ignored for png). (1–100)

Full-page height cap in pixels (1000-16384). Infinite-scroll pages are clipped here; meta.stop_reason reports 'cap_reached'. (1000–16384)

Viewport width in CSS pixels (200-3840). (200–3840)

Viewport height in CSS pixels (200-2160). (200–2160)

Device pixel ratio 1-3 (2 = retina-quality raster). (1–3)

Device emulation preset — sets viewport, scale, touch and a matching mobile User-Agent in one go. Explicit viewport/device_scale_factor/user_agent still override it.

Geolocation latitude to emulate (with longitude; grants geolocation permission to the page). (-90–90)

Geolocation longitude to emulate (with latitude). (-180–180)

Disable JavaScript entirely (capture the no-JS / SSR view).

Bypass the page's Content-Security-Policy so injected css/js always apply (some strict-CSP sites block injection otherwise).

Navigation wait condition before capture.

Additionally wait until this CSS selector is visible (15s budget) — the reliable signal for heavy SPAs.

Extra settle delay after load, 0-5000ms. (0–5000)

Emulate prefers-color-scheme: dark.

Best-effort blocking of common ad/analytics/tracker hosts (curated list, not a full adblocker).

Skip downloading images (faster, lighter captures).

Skip downloading web fonts.

Skip downloading audio/video media.

Block analytics/tracker hosts (same curated list as block_ads).

Comma-separated URL glob patterns to block (wildcards: * and ?).

Hide common cookie-consent banners via injected CSS (OneTrust, Cookiebot, Didomi, Usercentrics, …). Default off = capture the page as a first-time visitor really sees it.

Comma-separated CSS selectors to hide before capture.

Click this selector after load (e.g. dismiss a dialog), best-effort.

Hover this selector after load (reveal hover menus), best-effort.

Scroll this selector into view before capture, best-effort.

Wait until this selector disappears (e.g. a loading spinner) before capture (15s budget).

Click a common cookie-consent 'Accept' button instead of hiding the banner (so the page reflows as a consenting visitor sees it).

Freeze CSS animations/transitions + emulate reduced-motion for deterministic captures (default true).

Override the browser User-Agent.

Extra request headers (JSON object, POST body). Cookie/Authorization are stripped (no-login content policy).

Browser locale (Accept-Language + Intl), e.g. en-US, de-DE, ja-JP.

IANA timezone for the page (e.g. America/New_York).

Extra CSS injected into the document <head>.

JavaScript to run in the page after load, before capture (best-effort; script errors are reported, not fatal).

Fail with TARGET_BLOCKED if the rendered page text contains this string (catch soft block / error pages a 200 status hides).

Fail with TARGET_BLOCKED if this CSS selector is present on the page (e.g. an error banner or captcha container a 200 status hides).

Fail if the rendered output is smaller than this (sanity check against blank/near-empty captures). (0–52428800)

If true, a 4xx/5xx page fails with UPSTREAM_HTTP instead of capturing the error page. Default false: capture honestly + report http_status.

Bypass the capture cache and force a new render.

Capture-cache TTL in seconds (600-3600). (600–3600)

request preview
curl -X POST https://api.reefapi.com/web-capture/v1/batch \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"urls":"[\"https://example.com\",\"https://example.org\"]"}'

Hit Send to run this endpoint live.