# PageCapture > A web page capture API. Send a URL, HTML or Markdown and get back an image, PDF, rendered HTML, Markdown or video. - 144 documented parameters, 26 stable error codes. - Image formats: png, jpeg, jpg, webp, gif, jp2, tiff, avif, heif, pdf, html, markdown, text. Video: mp4, mov, avi, webm, gif. - A successful, non-cached capture costs one credit. Failures and cache hits are never charged. ## API - [OpenAPI 3.1](https://www.pagecapture.dev/openapi.json): the complete machine-readable contract. - [Full reference for LLMs](https://www.pagecapture.dev/llms-full.txt): every parameter, default and error code inline. - [Device catalog](https://www.pagecapture.dev/v1/devices): 93 viewport presets. - [Region catalog](https://www.pagecapture.dev/v1/regions): 18 proxy countries. - [Egress IP ranges](https://www.pagecapture.dev/egress-ips.json): versioned, for firewall automation. ## Integrations - [Agent skill](https://www.pagecapture.dev/skill.md): a single SKILL.md for AI agents — copy-paste calls, the error envelope and the exact list of retryable codes. - MCP server: `npx -y @pagecapture/mcp`, with `PAGECAPTURE_API_KEY` in the client configuration. Three tools: screenshot, PDF, content extraction. - CLI: `npx -y @pagecapture/cli take `. - [Seven official SDKs](https://www.pagecapture.dev/docs/sdks): TypeScript, Python, Go, Java, PHP, Ruby and .NET. Every one of them speaks the same public HTTP API. There is no agent-only endpoint, no separate pricing and no parallel billing path. ## Documentation - [Quickstart](https://www.pagecapture.dev/docs/quickstart): From signup to your first capture in a few lines. - [Official SDKs](https://www.pagecapture.dev/docs/sdks): Seven first-party clients, their shared contract and publication status. - [Agents and MCP](https://www.pagecapture.dev/docs/agents): The skill, the MCP server, and what the API records about agent traffic. - [Authentication](https://www.pagecapture.dev/docs/authentication): API keys, signed URLs, and when to use each. - [All options](https://www.pagecapture.dev/docs/options): Every public parameter, its type, default and limits. - [Full-page screenshots](https://www.pagecapture.dev/docs/full-page): Long pages, lazy images and sticky headers. - [Selectors and clip](https://www.pagecapture.dev/docs/selectors-and-clip): Capture one element, or an exact rectangle. - [Navigation and waiting](https://www.pagecapture.dev/docs/waiting): When the capture happens, and how to move it later. - [Devices and emulation](https://www.pagecapture.dev/docs/device-emulation): Viewport presets, dark mode, timezone and media type. - [Authenticated pages](https://www.pagecapture.dev/docs/authenticated-pages): Cookies, headers and what happens to them afterwards. - [Blocking](https://www.pagecapture.dev/docs/blocking): Ads, trackers, chat widgets and cookie banners. - [Async and webhooks](https://www.pagecapture.dev/docs/async-and-webhooks): 202, signed callbacks, retries and deduplication. - [Caching](https://www.pagecapture.dev/docs/caching): Free repeat captures, and what makes two requests identical. - [S3 and compatible storage](https://www.pagecapture.dev/docs/storage): Deliver straight into your own bucket. - [Bulk captures](https://www.pagecapture.dev/docs/bulk): Up to 1,000 items in one call. - [Video and animated GIF](https://www.pagecapture.dev/docs/animated-screenshots): Scroll-through recordings from 1 to 30 seconds. - [Errors](https://www.pagecapture.dev/docs/errors): Every error code, what causes it, and whether it is billed. - [Limits](https://www.pagecapture.dev/docs/limits): Body size, rate limits, pixels and retention. - [Egress IP ranges](https://www.pagecapture.dev/docs/egress-ip-ranges): Allow-list our capture traffic in your WAF or firewall. - [Security](https://www.pagecapture.dev/docs/security): SSRF defence, isolation and what we never store. ## Guides Deep tutorials. Each reproduces a real failure, shows the minimal do-it-yourself version, states where it breaks and when it stays enough, then ends in a request executed against a fixture in CI. - [Full-page screenshots with Puppeteer — and where they break](https://www.pagecapture.dev/guides/full-page-screenshot-puppeteer): how to take a full-page screenshot with Puppeteer. Last verified 2026-08-12. - [Running Playwright screenshots in serverless functions](https://www.pagecapture.dev/guides/playwright-screenshot-serverless): Playwright screenshot in serverless. Last verified 2026-08-12. - [Why lazy-loaded content is missing from screenshots](https://www.pagecapture.dev/guides/lazy-load-incomplete-screenshots): avoid incomplete lazy-load screenshots. Last verified 2026-08-12. - [Loading web fonts reliably in HTML-to-image jobs](https://www.pagecapture.dev/guides/web-fonts-html-to-image): load fonts in HTML to image. Last verified 2026-08-12. - [PNG or JPEG when your application generates the image](https://www.pagecapture.dev/guides/png-or-jpeg-for-generated-images): choose PNG or JPEG for a generated image. Last verified 2026-08-26. - [Why a transparent background arrives white, and how to keep the alpha](https://www.pagecapture.dev/guides/transparent-background-renders-white): why a transparent background renders white. Last verified 2026-08-26. - [Generate PDFs with headers, footers and print CSS](https://www.pagecapture.dev/guides/pdf-header-footer-print-css): generate PDF with header footer and print CSS. Last verified 2026-08-12. - [SSRF defense for screenshot APIs](https://www.pagecapture.dev/guides/ssrf-screenshot-apis): SSRF security in screenshot APIs. Last verified 2026-08-12. - [Queue, retry and idempotency for browser jobs](https://www.pagecapture.dev/guides/browser-jobs-queue-retry-idempotency): queue retry idempotency for browser jobs. Last verified 2026-08-12. - [Build vs buy a screenshot API: an editable calculator](https://www.pagecapture.dev/guides/screenshot-api-build-vs-buy): screenshot API build vs buy calculator. Last verified 2026-08-12. - [Turn an authenticated dashboard into a PDF report](https://www.pagecapture.dev/guides/authenticated-dashboard-to-pdf): generate a PDF of a dashboard behind login. Last verified 2026-08-12. - [Invoice PDFs your application can reproduce](https://www.pagecapture.dev/guides/invoice-pdf-from-application-data): generate an invoice PDF from application data. Last verified 2026-08-12. - [Turning Markdown into a file that renders the same everywhere](https://www.pagecapture.dev/guides/markdown-to-standalone-html): turn Markdown into a self-contained HTML file. Last verified 2026-08-26. - [Delivering report PDFs without holding a request open](https://www.pagecapture.dev/guides/scheduled-report-pdf-delivery): deliver a generated PDF report without holding the request open. Last verified 2026-08-12. ## Capabilities One page per option that people search for, with the request executed against a fixture in CI and the limits read from the same table the API validates against. - [Remove the cookie banner before the shutter, not after](https://www.pagecapture.dev/capabilities/block-cookie-banners-screenshot): block cookie banners screenshot. Documents `block_cookie_banners`, `block_banners_by_heuristics`, `hide_selectors`. - [Drop ad, tracker and chat requests before the page renders](https://www.pagecapture.dev/capabilities/block-ads-and-trackers-screenshot): block ads screenshot api. Documents `block_ads`, `block_trackers`, `block_chats`, `block_requests`, `block_resources`. - [Inject your own CSS into a page you do not control](https://www.pagecapture.dev/capabilities/screenshot-with-custom-css): screenshot with custom css. Documents `styles`, `hide_selectors`, `reduced_motion`, `media_type`. - [Hide an element without the page collapsing around it](https://www.pagecapture.dev/capabilities/hide-elements-before-screenshot): hide element before screenshot. Documents `hide_selectors`, `error_on_selector_not_found`, `styles`. - [Run your JavaScript in the page, then capture the result](https://www.pagecapture.dev/capabilities/run-javascript-before-screenshot): run javascript before screenshot. Documents `scripts`, `scripts_wait_until`, `bypass_csp`, `click`, `hover`. - [Wait for the element that means the page is ready](https://www.pagecapture.dev/capabilities/wait-for-selector-screenshot): wait for selector screenshot. Documents `wait_for_selector`, `wait_for_selector_algorithm`, `wait_until`, `delay`, `timeout`. - [Capture one element instead of the whole page](https://www.pagecapture.dev/capabilities/screenshot-element-by-css-selector): screenshot of an element css selector. Documents `selector`, `selector_algorithm`, `selector_scroll_into_view`, `error_on_selector_not_found`, `capture_beyond_viewport`. - [Capture a very long page without one unusable image](https://www.pagecapture.dev/capabilities/screenshot-long-page-in-slices): long page screenshot slices. Documents `full_page`, `full_page_slices`, `full_page_slice_height`, `full_page_slice_overlap_height`, `full_page_max_height`, `full_page_algorithm`. - [Put your own header and footer on every PDF page](https://www.pagecapture.dev/capabilities/pdf-header-and-footer-template): pdf header footer api. Documents `pdf_header_template`, `pdf_footer_template`, `pdf_margin_top`, `pdf_margin_bottom`, `pdf_print_background`, `media_type`. - [Capture the dark version of a page you do not control](https://www.pagecapture.dev/capabilities/dark-mode-screenshot-api): dark mode screenshot api. Documents `dark_mode`, `media_type`, `reduced_motion`, `omit_background`. - [Capture with a transparent background instead of white](https://www.pagecapture.dev/capabilities/transparent-background-screenshot): transparent background screenshot. Documents `omit_background`, `format`, `selector`, `image_quality`. - [Two ways to change the size, and they are not the same one](https://www.pagecapture.dev/capabilities/retina-screenshot-and-resize): retina screenshot api resize. Documents `device_scale_factor`, `image_width`, `image_height`, `image_quality`, `viewport_width`. - [Tell the page where and when it is being viewed](https://www.pagecapture.dev/capabilities/geolocation-screenshot-api): geolocation screenshot api. Documents `geolocation_latitude`, `geolocation_longitude`, `geolocation_accuracy`, `time_zone`, `ip_country_code`. - [The only capture that costs nothing is the one you do not repeat](https://www.pagecapture.dev/capabilities/screenshot-api-caching): screenshot api cache. Documents `cache`, `cache_ttl`, `cache_key`. ## Pricing - Free: $0/mo, 100 credits, 5 starts/minute. - Basic: $10/mo, 2,000 credits, 40 starts/minute. - Growth: $47/mo, 10,000 credits, 80 starts/minute. - Scale: $155/mo, 50,000 credits, 150 starts/minute. - Enterprise: custom, custom credits, 400 starts/minute. ## Endpoints - `GET|POST /v1/take` — a screenshot, PDF, HTML, Markdown or text extraction. - `GET|POST /v1/animate` — an MP4, MOV, AVI, WebM or animated GIF recording. - `POST /v1/bulk` — many captures in one call. - `GET /v1/usage` — credits and rate limit for the current period. - `GET /v1/requests/{id}` — status of an async capture. Authentication is an API key in the `X-Access-Key` header. GET requests can be HMAC-signed instead, so a capture URL can be embedded in an `` without exposing the key. ## Parameters for /v1/take - `url` — Public HTTP or HTTPS URL to capture. (type: string) - `html` — Inline HTML to render instead of a URL. POST only. (type: string) - `markdown` — Inline Markdown rendered through a deterministic template. POST only. (type: string) - `format` — Output format. Defaults to `jpg` on /take and `mp4` on /animate. (type: enum; default: "jpg"; values: png | jpeg | jpg | webp | gif | jp2 | tiff | avif | heif | pdf | html | markdown | text | mp4 | mov | avi | webm | gif) - `response_type` — How the result is returned: raw bytes, a JSON envelope, or an empty acknowledgement. (type: enum; default: "by_format"; values: by_format | json | empty; not part of the cache key) - `selector` — Capture only the element matching this CSS selector. (type: string) - `selector_algorithm` — How the element is captured: `default` uses the browser element API, `clip` converts the bounding box into a clip rectangle. The selector is always CSS. (type: enum; default: "default"; values: default | clip) - `selector_scroll_into_view` — Scroll the selected element into view before capturing. (type: boolean; default: true) - `capture_beyond_viewport` — Allow the capture to extend past the viewport bounds. (type: boolean; default: true) - `scroll_into_view` — Scroll this selector into view before capturing the viewport. (type: string) - `scroll_into_view_adjust_top` — Pixel offset applied after `scroll_into_view`, to clear sticky headers. (type: integer; default: 0; min: -10000; max: 10000) - `request_gpu_rendering` — Route the job to the GPU-backed pool. (type: boolean; default: false; requires the gpu entitlement) - `include_shadow_dom` — Traverse open shadow roots when resolving selectors and serializing HTML. (type: boolean; default: false) - `attachment_name` — Sets Content-Disposition so browsers download the result under this name. (type: string; not part of the cache key) - `external_identifier` — Your own correlation id, echoed in logs, JSON responses and webhooks. (type: string; not part of the cache key) - `pdf_print_background` — Print CSS backgrounds. (type: boolean; default: false) - `pdf_fit_one_page` — Fit the whole document onto a single custom-sized page. (type: boolean; default: false) - `pdf_landscape` — Landscape orientation. (type: boolean; default: false) - `pdf_paper_format` — Paper size. Ignored when `pdf_fit_one_page` is set. (type: enum; values: a0 | a1 | a2 | a3 | a4 | a5 | a6 | letter | legal | tabloid | ledger) - `pdf_margin` — Margin on all sides, in inches. (type: number; min: 0; max: 10) - `pdf_margin_top` — Top margin in inches. Overrides `pdf_margin`. (type: number; min: 0; max: 10) - `pdf_margin_right` — Right margin in inches. (type: number; min: 0; max: 10) - `pdf_margin_bottom` — Bottom margin in inches. (type: number; min: 0; max: 10) - `pdf_margin_left` — Left margin in inches. (type: number; min: 0; max: 10) - `pdf_header_template` — HTML rendered in the PDF header. Supports Chromium's date, title, url, pageNumber and totalPages classes. (type: string) - `pdf_footer_template` — HTML rendered in the PDF footer. Supports Chromium's date, title, url, pageNumber and totalPages classes. (type: string) - `openai_api_key` — Your own OpenAI key. Used once, never stored, redacted from every log. (type: string; write-only, never stored in plain text) - `vision_prompt` — Prompt sent along with the rendered image. (type: string) - `vision_max_tokens` — Token ceiling for the vision response. (type: integer; default: 512; min: 1; max: 4096) - `clip_x` — Clip origin X, in CSS pixels. On /animate this applies to GIF only. (type: integer; min: 0; max: 100000) - `clip_y` — Clip origin Y, in CSS pixels. On /animate this applies to GIF only. (type: integer; min: 0; max: 100000) - `clip_width` — Clip width, in CSS pixels. On /animate this applies to GIF only. (type: integer; min: 1; max: 100000) - `clip_height` — Clip height, in CSS pixels. On /animate this applies to GIF only. (type: integer; min: 1; max: 100000) - `full_page` — Capture the entire scrollable document. (type: boolean; default: false) - `full_page_scroll` — Scroll through the page first so lazy content loads. (type: boolean; default: false; requires the scrolling_screenshots entitlement) - `full_page_scroll_delay` — Milliseconds to wait after each scroll step. (type: integer; default: 400; min: 0; max: 10000) - `full_page_scroll_by` — Pixels per scroll step. 0 uses the viewport height. (type: integer; default: 0; min: 0; max: 20000) - `full_page_max_height` — Stop the capture at this document height. (type: integer; min: 1; max: 60000) - `full_page_slices` — Return the page as several stitched slices instead of one image. (type: boolean; default: false) - `full_page_slice_height` — Height of each slice. (type: integer; default: 4000; min: 1; max: 16000) - `full_page_slice_overlap_height` — Overlap between consecutive slices. (type: integer; default: 0; min: 0; max: 2000) - `full_page_algorithm` — Full-page strategy: one capture of the whole document, or section-by-section for very tall pages. (type: enum; default: "default"; values: default | by_sections) - `viewport_device` — Device preset id. Sets width, height, scale, touch, mobile and user agent together. (type: string) - `viewport_width` — Viewport width in CSS pixels. (type: integer; default: 1280; min: 50; max: 7680) - `viewport_height` — Viewport height in CSS pixels. (type: integer; default: 1024; min: 50; max: 7680) - `device_scale_factor` — Pixel density multiplier (2 = retina). (type: number; default: 1; min: 1; max: 5) - `viewport_mobile` — Emulate a mobile browser. (type: boolean; default: false) - `viewport_has_touch` — Advertise touch support. (type: boolean; default: false) - `viewport_landscape` — Swap width and height of the selected device preset. (type: boolean; default: false) - `image_quality` — Encoder quality for lossy formats. (type: integer; default: 80; min: 1; max: 100) - `image_width` — Resize output width. Aspect ratio is preserved when height is omitted. (type: integer; min: 1; max: 20000) - `image_height` — Resize output height. (type: integer; min: 1; max: 20000) - `omit_background` — Render with a transparent background where the format supports alpha. (type: boolean; default: false) - `dark_mode` — Emulate `prefers-color-scheme: dark`. (type: boolean; default: false) - `reduced_motion` — Emulate `prefers-reduced-motion: reduce`. (type: boolean; default: false) - `media_type` — CSS media type to emulate. (type: enum; default: "screen"; values: screen | print) - `hide_selectors` — Selectors to hide before capturing. (type: string[]) - `scripts` — JavaScript executed in the page context, in order. (type: string[]) - `scripts_wait_until` — Navigation state to reach before running scripts. (type: enum; default: "load"; values: load | domcontentloaded | networkidle) - `styles` — CSS injected into the page. (type: string[]) - `click` — Selector clicked before capturing. (type: string) - `hover` — Selector hovered before capturing. (type: string) - `error_on_selector_not_found` — Fail when the capture, hide or wait selector does not match, instead of skipping it. (type: boolean; default: false) - `error_on_click_selector_not_found` — Fail when the `click` selector does not match. (type: boolean; default: true) - `error_on_hover_selector_not_found` — Fail when the `hover` selector does not match. (type: boolean; default: true) - `bypass_csp` — Bypass the page Content Security Policy. Opt-in and recorded. (type: boolean; default: false) - `block_cookie_banners` — Remove consent banners using known rules. (type: boolean; default: false) - `block_banners_by_heuristics` — Also try a heuristic pass for banners with no known rule. (type: boolean; default: false) - `block_chats` — Remove live chat widgets. (type: boolean; default: false) - `block_ads` — Block ad networks. (type: boolean; default: false) - `block_trackers` — Block analytics and tracking requests. (type: boolean; default: false) - `block_requests` — Glob patterns or domains to block. (type: string[]) - `block_resources` — Resource types to block. (type: string[]; values: document | stylesheet | image | media | font | script | texttrack | xhr | fetch | eventsource | websocket | manifest | other) - `geolocation_latitude` — Latitude reported to the Geolocation API. (type: number; min: -90; max: 90) - `geolocation_longitude` — Longitude reported to the Geolocation API. (type: number; min: -180; max: 180) - `geolocation_accuracy` — Accuracy in metres. (type: number; min: 0; max: 100000) - `ip_country_code` — Country the managed proxy pool exits from. The catalog is served at /v1/regions. (type: enum; values: us | ca | mx | br | pe | gb | ie | is | de | fr | it | es | cn | jp | kr | in | au | nz; requires the ip_location entitlement) - `proxy` — Your own proxy, as `http://user:pass@host:port`. (type: string; write-only, never stored in plain text) - `proxy_bypass_hosts` — Hosts that skip the proxy. (type: string[]) - `user_agent` — Custom User-Agent header. (type: string) - `authorization` — Authorization header sent to the target. (type: string; write-only, never stored in plain text) - `cookies` — Cookies as `name=value; Domain=…; Path=…` strings. (type: string[]; write-only, never stored in plain text) - `headers` — Extra request headers as `Name: value` strings. (type: string[]; write-only, never stored in plain text) - `time_zone` — IANA time zone for the browser context. (type: string; default: "UTC") - `wait_until` — Navigation state to wait for. `networkidle0` waits for zero in-flight requests, `networkidle2` for at most two. (type: enum; default: "load"; values: load | domcontentloaded | networkidle0 | networkidle2) - `delay` — Extra seconds to wait after the navigation state. (type: integer; default: 0; min: 0; max: 30) - `timeout` — Total budget for the capture, in seconds. (type: integer; default: 60; min: 1; max: 90) - `navigation_timeout` — Budget for navigation alone, in seconds. (type: integer; default: 30; min: 1; max: 30) - `wait_for_selector` — Wait until this CSS selector appears. (type: string) - `wait_for_selector_algorithm` — How many nodes satisfy the wait: the first visible match, or every match currently rendering. The selector is always CSS. (type: enum; default: "at_least_one"; values: at_least_one | at_least_by_count) - `cache` — Serve and store this capture from the cache. Cache hits are never charged. (type: boolean; default: false; not part of the cache key) - `cache_ttl` — Cache lifetime in seconds. Minimum and default 4 hours, maximum 30 days. (type: integer; default: 14400; min: 14400; max: 2592000; not part of the cache key) - `cache_key` — Custom cache key, scoped to your organization. (type: string; not part of the cache key) - `store` — Upload the result to your own bucket. (type: boolean; default: false; not part of the cache key) - `storage_config_id` — Use a storage configuration saved in the dashboard instead of inline credentials. (type: string; not part of the cache key) - `storage_path` — Object key template. Supports {request_id}, {timestamp}, {external_identifier}, {format}, {organization_id}. (type: string; not part of the cache key) - `storage_endpoint` — S3-compatible endpoint. (type: string; not part of the cache key) - `storage_access_key_id` — Access key id for the destination bucket. (type: string; write-only, never stored in plain text; not part of the cache key) - `storage_secret_access_key` — Secret access key for the destination bucket. (type: string; write-only, never stored in plain text; not part of the cache key) - `storage_bucket` — Destination bucket. (type: string; not part of the cache key) - `storage_class` — Storage class applied to the uploaded object. (type: string; not part of the cache key) - `storage_acl` — ACL applied to the uploaded object. (type: string; not part of the cache key) - `storage_return_location` — Include the stored object location in the JSON response. (type: boolean; default: false; not part of the cache key) - `metadata_image_size` — Include the rendered image dimensions. (type: boolean; default: false) - `metadata_fonts` — Include the fonts the page actually used. (type: boolean; default: false) - `metadata_icon` — Include the favicon URL. (type: boolean; default: false) - `metadata_open_graph` — Include Open Graph tags. (type: boolean; default: false) - `metadata_page_title` — Include the page title. (type: boolean; default: false) - `metadata_content` — Include the rendered page content. (type: boolean; default: false) - `metadata_content_format` — Format of the returned content. (type: enum; default: "text"; values: text | html | markdown) - `metadata_http_response_status_code` — Include the main response status code. (type: boolean; default: false) - `metadata_http_response_headers` — Include allow-listed response headers. Set-Cookie and auth headers are always removed. (type: boolean; default: false) - `async` — Return 202 immediately and process in the background. (type: boolean; default: false; not part of the cache key) - `webhook_url` — HTTPS endpoint notified when the capture finishes. (type: string; not part of the cache key) - `webhook_sign` — Sign the webhook body with HMAC-SHA256. (type: boolean; default: false; not part of the cache key) - `webhook_errors` — Also send the webhook when the capture fails. (type: boolean; default: true; not part of the cache key) - `ignore_host_errors` — Capture the page even when it responds with 4xx or 5xx. (type: boolean; default: false) - `fail_if_request_failed` — Fail if a request matching any of these patterns fails. (type: string[]) - `fail_if_content_missing` — Fail if the rendered page is missing any of these strings. (type: string[]) - `fail_if_content_contains` — Fail if the rendered page contains any of these strings. (type: string[]) - `fail_if_gpu_rendering_fails` — Fail instead of falling back to CPU when GPU rendering is unavailable. (type: boolean; default: false) ## Parameters for /v1/animate - `url` — Public HTTP or HTTPS URL to capture. (type: string) - `html` — Inline HTML to render instead of a URL. POST only. (type: string) - `markdown` — Inline Markdown rendered through a deterministic template. POST only. (type: string) - `format` — Output format. Defaults to `jpg` on /take and `mp4` on /animate. (type: enum; default: "jpg"; values: png | jpeg | jpg | webp | gif | jp2 | tiff | avif | heif | pdf | html | markdown | text | mp4 | mov | avi | webm | gif) - `response_type` — How the result is returned: raw bytes, a JSON envelope, or an empty acknowledgement. (type: enum; default: "by_format"; values: by_format | json | empty; not part of the cache key) - `scroll_into_view` — Scroll this selector into view before capturing the viewport. (type: string) - `scroll_into_view_adjust_top` — Pixel offset applied after `scroll_into_view`, to clear sticky headers. (type: integer; default: 0; min: -10000; max: 10000) - `request_gpu_rendering` — Route the job to the GPU-backed pool. (type: boolean; default: false; requires the gpu entitlement) - `attachment_name` — Sets Content-Disposition so browsers download the result under this name. (type: string; not part of the cache key) - `external_identifier` — Your own correlation id, echoed in logs, JSON responses and webhooks. (type: string; not part of the cache key) - `clip_x` — Clip origin X, in CSS pixels. On /animate this applies to GIF only. (type: integer; min: 0; max: 100000) - `clip_y` — Clip origin Y, in CSS pixels. On /animate this applies to GIF only. (type: integer; min: 0; max: 100000) - `clip_width` — Clip width, in CSS pixels. On /animate this applies to GIF only. (type: integer; min: 1; max: 100000) - `clip_height` — Clip height, in CSS pixels. On /animate this applies to GIF only. (type: integer; min: 1; max: 100000) - `viewport_device` — Device preset id. Sets width, height, scale, touch, mobile and user agent together. (type: string) - `viewport_width` — Viewport width in CSS pixels. (type: integer; default: 1280; min: 50; max: 7680) - `viewport_height` — Viewport height in CSS pixels. (type: integer; default: 1024; min: 50; max: 7680) - `device_scale_factor` — Pixel density multiplier (2 = retina). (type: number; default: 1; min: 1; max: 5) - `viewport_mobile` — Emulate a mobile browser. (type: boolean; default: false) - `viewport_has_touch` — Advertise touch support. (type: boolean; default: false) - `viewport_landscape` — Swap width and height of the selected device preset. (type: boolean; default: false) - `image_quality` — Encoder quality for lossy formats. (type: integer; default: 80; min: 1; max: 100) - `dark_mode` — Emulate `prefers-color-scheme: dark`. (type: boolean; default: false) - `reduced_motion` — Emulate `prefers-reduced-motion: reduce`. (type: boolean; default: false) - `media_type` — CSS media type to emulate. (type: enum; default: "screen"; values: screen | print) - `hide_selectors` — Selectors to hide before capturing. (type: string[]) - `scripts` — JavaScript executed in the page context, in order. (type: string[]) - `scripts_wait_until` — Navigation state to reach before running scripts. (type: enum; default: "load"; values: load | domcontentloaded | networkidle) - `styles` — CSS injected into the page. (type: string[]) - `click` — Selector clicked before capturing. (type: string) - `hover` — Selector hovered before capturing. (type: string) - `error_on_selector_not_found` — Fail when the capture, hide or wait selector does not match, instead of skipping it. (type: boolean; default: false) - `error_on_click_selector_not_found` — Fail when the `click` selector does not match. (type: boolean; default: true) - `error_on_hover_selector_not_found` — Fail when the `hover` selector does not match. (type: boolean; default: true) - `bypass_csp` — Bypass the page Content Security Policy. Opt-in and recorded. (type: boolean; default: false) - `block_cookie_banners` — Remove consent banners using known rules. (type: boolean; default: false) - `block_banners_by_heuristics` — Also try a heuristic pass for banners with no known rule. (type: boolean; default: false) - `block_chats` — Remove live chat widgets. (type: boolean; default: false) - `block_ads` — Block ad networks. (type: boolean; default: false) - `block_trackers` — Block analytics and tracking requests. (type: boolean; default: false) - `block_requests` — Glob patterns or domains to block. (type: string[]) - `block_resources` — Resource types to block. (type: string[]; values: document | stylesheet | image | media | font | script | texttrack | xhr | fetch | eventsource | websocket | manifest | other) - `geolocation_latitude` — Latitude reported to the Geolocation API. (type: number; min: -90; max: 90) - `geolocation_longitude` — Longitude reported to the Geolocation API. (type: number; min: -180; max: 180) - `geolocation_accuracy` — Accuracy in metres. (type: number; min: 0; max: 100000) - `ip_country_code` — Country the managed proxy pool exits from. The catalog is served at /v1/regions. (type: enum; values: us | ca | mx | br | pe | gb | ie | is | de | fr | it | es | cn | jp | kr | in | au | nz; requires the ip_location entitlement) - `proxy` — Your own proxy, as `http://user:pass@host:port`. (type: string; write-only, never stored in plain text) - `proxy_bypass_hosts` — Hosts that skip the proxy. (type: string[]) - `user_agent` — Custom User-Agent header. (type: string) - `authorization` — Authorization header sent to the target. (type: string; write-only, never stored in plain text) - `cookies` — Cookies as `name=value; Domain=…; Path=…` strings. (type: string[]; write-only, never stored in plain text) - `headers` — Extra request headers as `Name: value` strings. (type: string[]; write-only, never stored in plain text) - `time_zone` — IANA time zone for the browser context. (type: string; default: "UTC") - `wait_until` — Navigation state to wait for. `networkidle0` waits for zero in-flight requests, `networkidle2` for at most two. (type: enum; default: "load"; values: load | domcontentloaded | networkidle0 | networkidle2) - `delay` — Extra seconds to wait after the navigation state. (type: integer; default: 0; min: 0; max: 30) - `timeout` — Total budget for the capture, in seconds. (type: integer; default: 60; min: 1; max: 90) - `navigation_timeout` — Budget for navigation alone, in seconds. (type: integer; default: 30; min: 1; max: 30) - `wait_for_selector` — Wait until this CSS selector appears. (type: string) - `wait_for_selector_algorithm` — How many nodes satisfy the wait: the first visible match, or every match currently rendering. The selector is always CSS. (type: enum; default: "at_least_one"; values: at_least_one | at_least_by_count) - `cache` — Serve and store this capture from the cache. Cache hits are never charged. (type: boolean; default: false; not part of the cache key) - `cache_ttl` — Cache lifetime in seconds. Minimum and default 4 hours, maximum 30 days. (type: integer; default: 14400; min: 14400; max: 2592000; not part of the cache key) - `cache_key` — Custom cache key, scoped to your organization. (type: string; not part of the cache key) - `store` — Upload the result to your own bucket. (type: boolean; default: false; not part of the cache key) - `storage_config_id` — Use a storage configuration saved in the dashboard instead of inline credentials. (type: string; not part of the cache key) - `storage_path` — Object key template. Supports {request_id}, {timestamp}, {external_identifier}, {format}, {organization_id}. (type: string; not part of the cache key) - `storage_endpoint` — S3-compatible endpoint. (type: string; not part of the cache key) - `storage_access_key_id` — Access key id for the destination bucket. (type: string; write-only, never stored in plain text; not part of the cache key) - `storage_secret_access_key` — Secret access key for the destination bucket. (type: string; write-only, never stored in plain text; not part of the cache key) - `storage_bucket` — Destination bucket. (type: string; not part of the cache key) - `storage_class` — Storage class applied to the uploaded object. (type: string; not part of the cache key) - `storage_acl` — ACL applied to the uploaded object. (type: string; not part of the cache key) - `storage_return_location` — Include the stored object location in the JSON response. (type: boolean; default: false; not part of the cache key) - `async` — Return 202 immediately and process in the background. (type: boolean; default: false; not part of the cache key) - `webhook_url` — HTTPS endpoint notified when the capture finishes. (type: string; not part of the cache key) - `webhook_sign` — Sign the webhook body with HMAC-SHA256. (type: boolean; default: false; not part of the cache key) - `webhook_errors` — Also send the webhook when the capture fails. (type: boolean; default: true; not part of the cache key) - `ignore_host_errors` — Capture the page even when it responds with 4xx or 5xx. (type: boolean; default: false) - `fail_if_request_failed` — Fail if a request matching any of these patterns fails. (type: string[]) - `fail_if_content_missing` — Fail if the rendered page is missing any of these strings. (type: string[]) - `fail_if_content_contains` — Fail if the rendered page contains any of these strings. (type: string[]) - `fail_if_gpu_rendering_fails` — Fail instead of falling back to CPU when GPU rendering is unavailable. (type: boolean; default: false) - `scenario` — What the recording does: hold the page, or scroll through it. (type: enum; default: "default"; values: default | scroll) - `duration` — Recording length in seconds. (type: integer; default: 5; min: 1; max: 30) - `width` — Output width in pixels. Defaults to the viewport width. (type: integer; min: 100; max: 3840) - `height` — Output height in pixels. Defaults to the viewport height. (type: integer; min: 100; max: 2160) - `aspect_ratio` — Derive the missing dimension from this ratio. (type: enum; values: 16:9 | 4:3 | 1:1 | 9:16 | 3:4) - `scroll_delay` — Milliseconds between scroll steps. (type: integer; default: 500; min: 0; max: 10000) - `scroll_duration` — Duration of each scroll step, in milliseconds. (type: integer; default: 1500; min: 100; max: 30000) - `scroll_by` — Pixels per scroll step. 0 uses the viewport height. (type: integer; default: 1000; min: 0; max: 20000) - `scroll_start_immediately` — Start scrolling as soon as recording begins. (type: boolean; default: true) - `scroll_start_delay` — Milliseconds to hold at the top before scrolling. (type: integer; default: 0; min: 0; max: 20000) - `scroll_back` — Return to the top when the scroll finishes. (type: boolean; default: true) - `scroll_back_algorithm` — `once` returns to the top a single time, `repeat` loops down and back for the whole recording. (type: enum; default: "once"; values: once | repeat) - `scroll_back_after_duration` — Milliseconds into the recording at which the return to the top starts. Defaults to when the scroll ends. (type: integer; min: 0; max: 30000) - `scroll_complete` — Hold the recording for the full `duration` even when the scroll finishes earlier. (type: boolean; default: true) - `scroll_stop_after_duration` — Milliseconds of scrolling before it stops, regardless of how much page is left. (type: integer; min: 0; max: 30000) - `scroll_easing` — Easing applied to scroll motion. (type: enum; default: "ease_in_out_quint"; values: linear | ease_in_sine | ease_out_sine | ease_in_out_sine | ease_in_quad | ease_out_quad | ease_in_out_quad | ease_in_cubic | ease_out_cubic | ease_in_out_cubic | ease_in_quart | ease_out_quart | ease_in_out_quart | ease_in_quint | ease_out_quint | ease_in_out_quint) - `scroll_try_navigate` — Look for a link matching `scroll_navigate_link_hints` and follow it mid-recording, producing a site tour. (type: boolean; default: false) - `scroll_navigate_after` — Milliseconds into the recording at which navigation happens. Defaults to half the duration. (type: integer; min: 0; max: 30000) - `scroll_navigate_to_url` — Navigate to this URL instead of following a hinted link. Subject to the same egress policy as `url`. (type: string) - `scroll_navigate_link_hints` — Link text fragments the tour looks for when `scroll_try_navigate` is set. (type: string[]; default: ["pricing","about","customers"]) - `scroll_till_selector` — Stop the scroll when this CSS selector is reached. (type: string) - `scroll_till_selector_adjust_top` — Pixel offset applied to the `scroll_till_selector` stop position. (type: integer; default: 0; min: -10000; max: 10000) - `scroll_to_end_after` — Milliseconds after which the scroll jumps straight to the bottom of the page. (type: integer; min: 0; max: 30000) ## Error codes The `error_code` is the stable contract — branch on it, not on the HTTP status. No error is ever billable. - `access_key_required` — HTTP 400. An access key is required to authenticate this request. - `access_key_invalid` — HTTP 400. The provided access key is not valid. - `signature_is_required` — HTTP 400. This organization requires every GET request to be signed. - `signature_is_not_valid` — HTTP 400. The request signature does not match. - `screenshots_limit_reached` — HTTP 400. The credit limit for the current billing period has been reached. - `concurrency_limit_reached` — HTTP 400, retryable. The request start limit for the current minute has been reached. - `request_not_valid` — HTTP 400. The request is not valid. - `request_body_too_large` — HTTP 413. The request body exceeds the maximum accepted size. - `invalid_cookie_parameter` — HTTP 400. One of the provided cookies is not valid. - `invalid_header_parameter` — HTTP 400. One of the provided headers is not valid. - `invalid_storage_configuration` — HTTP 400. The storage configuration is not valid. - `name_not_resolved` — HTTP 400. The host name of the requested URL could not be resolved. - `network_error` — HTTP 500, retryable. The target page could not be reached. - `host_returned_error` — HTTP 500. The target host returned an error response. - `matched_failed_request` — HTTP 500. A request made by the page failed and the failure policy rejected the capture. - `selector_not_found` — HTTP 400. The requested selector was not found. - `content_missing_specified_string` — HTTP 500. The rendered page did not contain the required content. - `content_contains_specified_string` — HTTP 500. The rendered page contained content that the failure policy rejects. - `timeout_error` — HTTP 500, retryable. The capture did not complete within the allowed time. - `script_triggers_redirect` — HTTP 400. A custom script navigated the page away from the requested URL. - `resulting_image_too_large` — HTTP 400. The resulting image exceeds the maximum allowed size. - `storage_access_denied` — HTTP 400. The storage destination rejected the credentials. - `storage_returned_transient_error` — HTTP 500, retryable. The storage destination is temporarily unavailable. - `request_aborted` — HTTP 500. The request was aborted before it completed. - `temporary_unavailable` — HTTP 503, retryable. The service is temporarily unavailable. Retry shortly. - `internal_application_error` — HTTP 500, retryable. An internal error prevented the request from completing.