Full page screenshot API: the whole scroll in one image.
Add full_page=true to capture everything below the fold. Framejet removes overlays and scrolls lazy-loaded content into view before measuring the page.
The problem
A plain full-page capture often returns a cookie banner over the top, sticky headers over the content and empty placeholders where images had not loaded yet. Very long pages can also exceed what Chromium can render as one image.
How Framejet handles it
Framejet removes overlays first, scrolls through the page to trigger lazy loading, then measures the document and captures it. If the result would exceed the size limits, it returns an explicit error instead of a cropped image.
Take a full-page screenshot with one request
Add full_page=true to a normal capture. The browser lays the page out at the viewport width (1280 CSS pixels unless you set width) and the image grows to the page’s full scroll height instead of stopping at the first 800 pixels.
curl -fS -G "https://framejet.dev/v1/take" \ -H "X-Api-Key: YOUR_KEY" \ --data-urlencode "url=https://example.com" \ --data-urlencode "full_page=true" \ -o full.png
What happens before the capture
Full-page captures fail in quiet ways: an overlay pinned over the middle of the page, or empty boxes where images were waiting to be scrolled into view. Framejet runs these steps for every capture, in this order:
- Load the page and wait until the network is mostly idle, for up to 25 seconds.
- Run clean mode twice, 400 ms apart, removing cookie banners, consent walls, sticky headers and chat widgets. The second pass catches consent frames injected after the page load.
- Scroll through the first 16,000 pixels one viewport at a time, then return to the top, so lazy-loaded images and sections start loading.
- Wait up to 1.5 seconds for the network to settle, then run clean mode once more. Some sites load their cookie banner only after the first scroll.
- Run your
actionsorgoal, if any, then wait fordelay. - Measure the document and capture it.
Clean mode runs before the scroll on purpose. A consent wall often locks page scrolling, and scrolling underneath it would load nothing. Set clean=false if you need the page exactly as a first-time visitor sees it, banner included.
Size limits for full-page images
| Limit | Value | Error |
|---|---|---|
Height or width in device pixels (CSS pixels × dpr) | 16,384 | 422 pixel_limit |
Total pixels (width × height × dpr²) | 32 million | 422 pixel_limit |
| Encoded image size | 4 MB | 422 image_too_large |
The height limit comes from Chromium: it cannot capture one image taller than 16,384 device pixels. Framejet checks this before capturing and returns an error rather than a cropped image. At dpr=2, the limit is a page 8,192 CSS pixels tall. Errors do not spend a screenshot credit.
When a long page does not fit
pixel_limit: usedpr=1. If the page is still taller than 16,384 pixels, capture the viewport withoutfull_page, or useactions=scroll:<px>to capture a section further down.image_too_large: setformat=jpeg. JPEG is encoded at quality 80, much smaller than PNG for photos and long pages.- Sections still empty: add
delay(up to 10,000 ms) so late images and animations can finish. Content past the first 16,000 pixels is not reached by the automatic scroll. - Infinite scroll: the capture includes the content that exists when the page is measured. There is no single “full” height for a feed that keeps loading.
curl -fS -G "https://framejet.dev/v1/take" \ -H "X-Api-Key: YOUR_KEY" \ --data-urlencode "url=https://example.com" \ --data-urlencode "full_page=true" \ --data-urlencode "format=jpeg" \ --data-urlencode "delay=1000" \ -o full.jpg
For sharper text on high-density screens, see retina screenshots. The full parameter list is in the API reference.
Clean before capture
Cookie banners, consent walls, sticky headers and chat widgets are removed before the page is measured.
Lazy content loaded
The first 16,000 pixels are scrolled one viewport at a time so images below the fold can load.
No silent crop
Pages over the size limit return 422 pixel_limit and spend no credit.