Parameters
This page indexes every option the screenshot endpoint accepts. Each row gives the POST JSON path, the GET query name if there is one, the default and the limits, and links to the page that explains the option. Use the filter to find an option by name, by GET name or by a word such as pdf or timeout. It is part of the API documentation.
How the options fit together
Options are grouped by the job they do. A POST request nests them ("wait": {"timeout": 45}). A GET request uses one flat name per option (timeout=45), and only for the most common ones. The groups run in roughly this order when the browser renders your page:
request ──▶ preset ──▶ device ──▶ your values (later wins) │ 1. load url · html · markdown · network (headers, cookies, auth) 2. emulate viewport · browser (dark mode, locale, timezone, media) 3. filter block (ads, trackers, cookie banners, URL patterns) 4. wait wait (until, for_selector, delay, timeout) 5. modify page (scripts, styles, click, hide, remove) 6. capture capture (viewport, full_page, element, clip) 7. encode output (format, quality) · pdf 8. deliver cache · storage · account webhooks
Two rules follow from this order:
- Presets are defaults.
preset: "og_card"sets a 1200×630 viewport and PNG output. Send"output": {"format": "webp"}with it and you get WebP. Adeviceoverrides the preset's viewport. Your ownviewportvalues override both. - Changes to the page happen after the wait. A
clickor an injected style runs once the page is ready, so the capture shows the result. If a cookie banner appears late, block it inblockrather than hiding it inpage.
Parameter groups
Send a public url, raw html or markdown. Exactly one is required. HTML input renders templates you build yourself, such as social cards or invoices, without hosting them.
The target URL and how it loads. Only http and https targets are accepted, and the URL value must be encoded when it sits inside a GET query.
One name for a tested combination: og_card, twitter_card, full_page, pdf_document, mobile and more. Start here, then override single values.
Browser window size, pixel density and mobile emulation. scale: 2 gives retina output at twice the pixel size. A device name sets all of these at once.
What ends up in the image: the visible viewport, the full scrollable page or one element. Includes scroll simulation for lazy images and a crop rectangle.
OutputPNG, JPEG, WebP or PDF, plus compression quality, resizing and a transparent background. Format is the biggest lever on file size.
PDFPaper size, orientation, margins, scale, page ranges and HTML headers and footers with page numbers. Applies when the output format is pdf.
When to take the picture: a load event, a selector, a fixed delay, and the total timeout. The most common fix for blank or half-loaded screenshots.
Page modificationsChange the page before capture: inject JavaScript or CSS, click an element, hide elements and keep their space, or remove them so the layout closes up.
BlockingStop ads, trackers, cookie banners and chat widgets before they load, or block your own URL patterns and resource types. Blocked requests also make renders faster.
BrowserDark mode, reduced motion, print media, user agent, locale, timezone and geolocation. Use these to capture the version of the page a given visitor sees.
NetworkExtra HTTP headers, cookies and basic or bearer authentication for pages behind a login. POST only, so credentials never sit in a URL.
CacheHow long the CDN copy is kept, how to reuse an earlier render for zero credits, and how to force a fresh one.
StorageCopy every result into your own S3-compatible bucket with a path template. The bucket is set up once in the dashboard on paid plans.
WebhooksSigned notifications when a screenshot or batch completes or fails. The endpoint is an account setting, not a request parameter.
Metadata (planned)Page title, description, Open Graph tags and fonts returned with the image. Planned and not available yet. The page documents the intended API.
Every parameter
GET names are listed only where the GET endpoint accepts the option. A dash means POST only. Times are milliseconds unless the row says seconds.
| Group | POST path | GET name | Type | Default | Limits and values |
|---|---|---|---|---|---|
| Input | url | url | string | none | http or https. One of url, html, markdown is required. |
| Input | html | html | string | none | Full HTML document. Use POST for anything long. |
| Input | markdown | - | string | none | Markdown source |
| Preset | preset | preset | string | none | Unknown names return invalid_preset |
| Viewport | viewport.width | width | integer | 1280 | 1 to 7680 px |
| Viewport | viewport.height | height | integer | 800 | 1 to 4320 px |
| Viewport | viewport.scale | scale | number | 1 | 1 to 3. Device pixel ratio. |
| Viewport | viewport.device or device | device | string | none | A device ID from GET /v1/devices. Unknown IDs return invalid_device. |
| Viewport | viewport.mobile | - | boolean | false | Mobile emulation |
| Viewport | viewport.touch | - | boolean | false | Touch events |
| Viewport | viewport.landscape | - | boolean | false | Swaps width and height |
| Capture | capture.mode | full_page=true | string | viewport | viewport, full_page, element |
| Capture | capture.selector | - | string | none | CSS selector for element mode |
| Capture | capture.selector_required | - | boolean | false | Fail if the selector is missing |
| Capture | capture.scroll.simulate | - | boolean | false | Scroll first to trigger lazy loading |
| Capture | capture.scroll.delay | - | integer | 400 | ms between scroll steps |
| Capture | capture.scroll.step | - | integer | viewport height | px per scroll step |
| Capture | capture.scroll.max_height | - | integer | 16000 | Maximum capture height in px |
| Capture | capture.clip | - | object | none | x, y, width, height crop |
| Capture | capture.beyond_viewport | - | boolean | true | Capture content outside the viewport |
| Output | output.format | format | string | png | png, jpeg, webp, pdf |
| Output | output.quality | quality | integer | 80 | 1 to 100. JPEG and WebP only. |
| Output | output.resize.width, .height, .fit | - | integer, string | fit: contain | fit: contain, cover, fill, inside, outside |
| Output | output.transparent | - | boolean | false | PNG and WebP only |
| Output | output.filename | - | string | none | Name for Content-Disposition |
pdf.paper | pdf_paper | string | letter | a0 to a6, letter, legal, tabloid | |
pdf.width, pdf.height | pdf_width, pdf_height | string | none | CSS units, for example 210mm. Overrides paper. | |
pdf.landscape | pdf_landscape | boolean | false | ||
pdf.scale | pdf_scale | number | 1.0 | 0.1 to 2.0 | |
pdf.margin and pdf.margin_top, _right, _bottom, _left | pdf_margin, pdf_margin_top and so on | string | 0 | CSS units: cm, mm, in, px, pt | |
pdf.print_background | pdf_print_background | boolean | true | Background colors and images | |
pdf.fit_one_page | pdf_fit_one_page | boolean | false | Scale content onto one page | |
pdf.prefer_css_page_size | pdf_prefer_css_page_size | boolean | false | Use the page's CSS @page size | |
pdf.page_ranges | pdf_page_ranges | string | all | Format 1-5, 8, 10-12 | |
pdf.header, pdf.footer | pdf_header, pdf_footer | string | none | HTML templates with pageNumber, totalPages classes | |
| Wait | wait.until | - | string | load | load, domcontentloaded, networkidle (500 ms of no requests) |
| Wait | wait.delay | delay | integer | 0 | Capped at 10,000 ms |
| Wait | wait.for_selector | - | string | none | CSS selector to wait for |
| Wait | wait.for_selector_mode | - | string | visible | visible, hidden, attached, detached |
| Wait | wait.timeout | timeout | integer (seconds) | 30 | Maximum 60 seconds |
| Page | page.scripts, page.styles | - | array | none | Inline strings or {"url": ...} objects |
| Page | page.click | click | string | none | Selector clicked before capture |
| Page | page.click_required | - | boolean | false | Fail if the click target is missing |
| Page | page.hide | hide | array | none | GET: comma-separated. Keeps layout space. |
| Page | page.remove | remove | array | none | GET: comma-separated. Layout closes up. |
| Page | page.shadow_dom | - | boolean | false | Selectors pierce shadow roots |
| Block | block.ads | block_ads | boolean | false | |
| Block | block.cookie_banners | block_cookies | boolean | false | Note the shorter GET name |
| Block | block.trackers, block.chat_widgets | - | boolean | false | |
| Block | block.requests | - | array | none | Glob URL patterns |
| Block | block.resources | - | array | none | image, font, media, script, stylesheet |
| Browser | browser.dark_mode | dark_mode | boolean | page default | true forces dark, false forces light |
| Browser | browser.reduced_motion | - | boolean | false | |
| Browser | browser.media | - | string | screen | screen or print |
| Browser | browser.user_agent | user_agent | string | browser default | |
| Browser | browser.locale | locale | string | en-US | BCP 47, for example fr-FR |
| Browser | browser.timezone | timezone | string | none | IANA name, for example Europe/Paris |
| Browser | browser.geolocation | - | object | none | latitude -90 to 90, longitude -180 to 180, accuracy in m |
| Network | network.headers | - | object | none | Extra request headers |
| Network | network.cookies | - | array | none | name, value, domain required. same_site: Strict, Lax, None. |
| Network | network.auth | - | object | none | type: basic (username, password) or bearer (token) |
| Network | network.bypass_csp | - | boolean | false | For injected scripts the page's CSP would block |
| Cache | cache.ttl | cache_ttl | integer (seconds) | 86400 | 3600 to 2592000 (1 hour to 30 days) |
| Cache | cache.available | cache_available | boolean | false | Reuse an identical render inside the TTL for 0 credits |
| Cache | cache.refresh | cache_refresh | boolean | false | Skip the lookup and render fresh |
| Storage | storage.enabled | - | boolean | true when a bucket is set up | Paid plans. false skips the upload for one request. |
| Storage | storage.path | - | string | account default | Template with {hash}, {ext}, {date}, {domain} and more |
| Storage | storage.acl | - | string | account default | private or public-read |
Authentication parameters are not in this table: api_key on GET, and key_id, expires and signature for signed URLs. Network proxy and country routing are planned and documented on the network page.
GET or POST?
Both endpoints accept the same groups. The difference is how much you can say.
| Use | When |
|---|---|
| GET /v1/screenshot | The request must be a URL: an <img src>, an og:image tag, a signed link, a spreadsheet cell. You need only options that have a GET name. |
| POST /v1/screenshot | Anything else, and always for cookies, headers, auth, injected scripts, long HTML or selectors that contain commas. |
On GET, booleans count only as the literal word true (or false): block_ads=1 is ignored. hide and remove split on commas, so a selector that itself contains a comma needs POST.
Where to go next
- Task guides that combine these options: all guides, for example wait strategies and blocking ads and cookie banners.
- Validation errors name the parameter in
error.param. See error codes. - Defaults per preset: presets reference. Device sizes: devices reference.
Last verified 2026-10-15 against the API specification and the request parser.