Full Page Screenshot
The whole scrollable page as one image — everything below the fold included, not just what fits on the screen.
One image of the entire document, after scrolling through it so lazy images load.
No result yet
Complete the settings and run the tool. Images, PDFs, text, and video all preview in this panel.
curl --fail-with-body "https://api.pagecapture.dev/v1/take" \
-H "X-Access-Key: $PAGECAPTURE_KEY" \
-H "Content-Type: application/json" \
--data '{"viewport_width":"1280","format":"jpg","full_page":true,"full_page_scroll":true,"block_cookie_banners":true}' \
-o capture.jpgHow to screenshot an entire webpage
Four steps, in this browser tab. Nothing to install, and no extension asking for permission to read every page you visit.
- 1
Paste the address of the page
Any publicly reachable URL. The page is opened in a real Chromium, so JavaScript runs, web fonts load and consent banners are dismissed before anything is captured.
- 2
Choose the width to render at
1280 is a desktop reader, 393 is an iPhone. Width decides the layout, and the layout decides the screenshot; the height is whatever the document turns out to be.
- 3
Run the capture
The page is scrolled from top to bottom so lazy images load, then returned to the top so a sticky header appears once instead of repeating down the image, and only then photographed in one piece.
- 4
Download the image, or take the API call
The file is the same one the API returns for these parameters — no watermark and no crop. The call that produced it is printed underneath, ready to paste into your own code.
Questions
- How do I screenshot an entire webpage?
- Paste the URL above and run it. The tool scrolls the whole document, loads what was waiting below the fold, and returns one image of the entire page — including everything your browser's own screenshot key leaves out.
- Is this the same as a scrolling or long screenshot?
- Same result, different name: what a phone calls a scrolling or long screenshot is one tall image of the whole page, and that is what you get here. If you want the scroll itself as a video or GIF, use the Scrolling Screenshot tool instead.
- Why do some pages come back shorter than expected?
- Infinite-scroll pages never end, so the capture stops at the engine's height ceiling. The API exposes `full_page_max_height` to choose your own stopping point.
- How does it handle sticky headers?
- The page is scrolled and returned to the top before capture, so a sticky header appears once rather than repeating down the image.
Need this in your own code?
This tool is one call to the PageCapture API. The free plan gives you 100 captures a month with every feature unlocked, and no card.
Guides that cover this in depth
Options behind this tool
Related tools
Full-page screenshots that survive lazy loading
Long pages break naive full-page capture. Scroll-through loads what is missing, and slicing handles what Chromium cannot render in one texture.
Scroll-through first
Walks the page so lazy images load, then returns to the top before capturing.
Automatic slicing
Above roughly 16,000 px Chromium starts returning blank or truncated images. full_page_algorithm=default switches to slice-and-stitch before that, with no parameter to set.
A ceiling you choose
full_page_max_height is the right answer to infinite scroll — stop where the useful content ends.
Individual slices
full_page_slices=true returns the bands as well, for pipelines that paginate long captures.
Move the same workflow into one API call.
The free tool and your integration use the same public endpoint. The API adds the controls, authentication and delivery options needed in production.
Open the API playgroundimport os, requests
response = requests.post(
"https://api.pagecapture.dev/v1/take",
headers={"X-Access-Key": os.environ["PAGECAPTURE_KEY"]},
json={
"url": "https://example.com/blog",
"full_page": True,
"full_page_scroll": True, # trigger lazy images first
"full_page_scroll_delay": 400,
"full_page_max_height": 20000, # stop runaway pages
"format": "png",
},
timeout=120,
)
open("full.png", "wb").write(response.content)