Website Screenshot & URL to PDF API (Bulk, Full Page)
Pricing
from $4.00 / 1,000 screenshot captureds
Website Screenshot & URL to PDF API (Bulk, Full Page)
Bulk website screenshots and URL to PDF in real Chromium: full-page or viewport PNG, desktop or mobile, cookie banners hidden, lazy images loaded, optional ad blocking, wait-for-selector. Direct file links for AI agents, reports and monitoring. $4 per 1,000 captures; failed URLs are free.
Pricing
from $4.00 / 1,000 screenshot captureds
Rating
0.0
(0)
Developer
Catalin Friptu
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 hours ago
Last modified
Categories
Share
Turn any list of URLs into full-page PNG screenshots and PDFs, rendered in a real Chromium browser. Paste hundreds of URLs, pick desktop or mobile, and get one row per page with a direct link to its PNG and PDF, the final URL after redirects, the HTTP status and the page title. Cookie banners are hidden, lazy-loaded images are scrolled in, and ads can be blocked.
$4 per 1,000 captures. Failed URLs are free. A URL that fails (unknown domain, 404, timeout, missing selector) still gets a row that tells you why, and it isn't charged.
What does Website Screenshot & PDF do?
- Takes a full-page screenshot (or just the visible viewport) of every URL you give it, as PNG.
- Saves the same page as a PDF (URL to PDF) that looks like the screen, not like the print version.
- Works in bulk: paste a list of URLs or upload a text file. Duplicates are captured once.
- Captures as desktop (1280x720) or mobile (Pixel 7), or any viewport size you set, e.g. 1920x1080.
- Hides cookie and consent banners (OneTrust, Cookiebot, Usercentrics, Didomi and more) and can block ads.
- Waits for the page properly: load event, DOM ready, network idle, an extra delay, or wait for a CSS selector.
- Gives every PNG and PDF a direct download link, ready for Google Sheets, Slack, a report or an AI agent.
Example output
A real run on 12 URLs (desktop, full page). Two failed and were not charged.
| url | status_code | title | PNG size (px) | error |
|---|---|---|---|---|
| https://www.python.org | 200 | Welcome to Python.org | 1280 x 2747 | |
| https://en.wikipedia.org/wiki/Web_scraping | 200 | Web scraping - Wikipedia | 1280 x 10474 | |
| https://github.com | 200 | GitHub · Change is constant... | 1280 x 11646 | |
| https://www.bbc.com | 200 | BBC Home - Breaking News, World News... | 1280 x 13383 | |
| https://www.theverge.com | 200 | The Verge | 1280 x 20000 (cut at the 20,000 px limit) | |
| https://stackoverflow.com | 403 | Just a moment... | HTTP 403 (bot wall, not charged) | |
| https://this-domain-does-not-exist-xyz.com | net::ERR_NAME_NOT_RESOLVED (not charged) |
Each successful row also has screenshot_url (and pdf_url if you asked for a PDF) linking straight to the file. The Captures table in the Console shows a thumbnail of every screenshot.
Who it's for
- AI agents and MCP clients that need to "see" a web page as an image or attach it as a PDF.
- SEO, QA and marketing teams checking how landing pages look on desktop and mobile.
- Archiving and compliance: keep a dated visual record of a page (
captured_atis in every row). - Agencies making before/after screenshots or client reports in bulk.
- Website monitoring: run it on a schedule and keep a screenshot history of competitor or client pages.
How to take website screenshots in bulk
- Click Try for free and create a free Apify account (no credit card needed).
- Paste your URLs into URLs (one per line), or upload a text file.
- Choose PNG screenshot, PDF or both, and Desktop or Mobile.
- Click Start. Open the Output tab to see thumbnails and download links, or export the list as CSV, Excel or JSON.
Features
- Batch input. Paste hundreds of URLs, or upload a text file. Duplicates are captured once. Bare domains (
example.com) gethttps://added. - PNG and/or PDF. Full scrollable page or just the viewport. PDFs use screen styles and background colours, so they look like the page and not like its print version.
- Lazy-loaded images appear. Before a full-page shot, the page is scrolled to the bottom so images that load on scroll are in the picture.
- Device presets. Desktop (1280x720) or mobile (Pixel 7, 412x839, mobile user agent, touch, 2.6x pixel density). Override width and height if you need, e.g., 1920x1080.
- Wait options. Load event, DOM ready or network idle, an extra delay in milliseconds, and wait for a CSS selector. A page that never goes fully idle is still captured instead of failing.
- Cookie banners hidden (best effort). Common consent tools such as OneTrust, Cookiebot, Usercentrics, Didomi, Quantcast, TrustArc and Osano are hidden, and the page's scroll lock is removed. Nothing is clicked or accepted for you.
- Optional ad blocking for common ad and tracking networks.
- Reliable. Retries for timeouts, crashes and temporary server errors (429/5xx), a fresh isolated browser context per URL, browser auto-restart, and concurrency that adapts to the run's memory.
Input
| Field | Type | Default | Description |
|---|---|---|---|
urls | array | Pages to capture. Each item is {"url": "https://..."} or a plain string. | |
screenshot | boolean | true | Save a PNG screenshot. |
fullPage | boolean | true | Whole scrollable page (cut at 20,000 px) instead of just the viewport. |
pdf | boolean | false | Also save a PDF. |
device | string | desktop | desktop or mobile. |
viewportWidth / viewportHeight | integer | device default | Override the viewport size in CSS pixels. |
waitUntil | string | load | load, domcontentloaded or networkidle. |
delayMs | integer | 0 | Extra wait after the page loads. |
waitForSelector | string | Wait until this CSS selector is visible. If it never appears, the URL fails (not charged). | |
hideCookieBanners | boolean | true | Hide cookie and consent banners. |
blockAds | boolean | false | Block ad and tracking requests. |
pdfFormat | string | A4 | A4, Letter, Legal, A3 or Tabloid. |
pdfLandscape | boolean | false | Landscape PDF. |
maxConcurrency | integer | 3 | Pages captured in parallel (about 600 MB of memory each). |
navigationTimeoutSecs | integer | 60 | Time limit to open a page and to wait for the selector. |
maxRetries | integer | 1 | Retries for temporary errors. |
Example:
{"urls": [{ "url": "https://apify.com" },{ "url": "https://en.wikipedia.org/wiki/Web_scraping" }],"screenshot": true,"fullPage": true,"pdf": true,"device": "desktop","waitUntil": "load","hideCookieBanners": true}
Output
One row per URL in the dataset. The files themselves are in the run's key-value store, and screenshot_url / pdf_url link straight to them. Fields that don't apply are null, never an empty string.
[{"url": "https://en.wikipedia.org/wiki/Web_scraping","final_url": "https://en.wikipedia.org/wiki/Web_scraping","status_code": 200,"title": "Web scraping - Wikipedia","screenshot_url": "https://api.apify.com/v2/key-value-stores/<store-id>/records/screenshot-en.wikipedia.org-0dbff88b78.png","pdf_url": "https://api.apify.com/v2/key-value-stores/<store-id>/records/pdf-en.wikipedia.org-0dbff88b78.pdf","width": 1280,"height": 10474,"device": "desktop","captured_at": "2026-10-23T02:34:32+00:00","error": null},{"url": "https://httpbin.org/status/404","final_url": "https://httpbin.org/status/404","status_code": 404,"title": null,"screenshot_url": null,"pdf_url": null,"width": null,"height": null,"device": "desktop","captured_at": null,"error": "HTTP 404"}]
| Field | Description |
|---|---|
url | The URL you gave. |
final_url | Where the browser ended up after redirects. |
status_code | HTTP status of the page. |
title | Page <title>. |
screenshot_url | Link to the PNG, or null. |
pdf_url | Link to the PDF, or null. |
width, height | Size of the PNG in pixels. On mobile this is the CSS size times the 2.6x pixel density. null when there is no PNG. |
device | desktop or mobile. |
captured_at | UTC time of the capture. |
error | Why the URL failed, e.g. HTTP 404, net::ERR_NAME_NOT_RESOLVED ..., Navigation timed out after 60s. null on success. |
Files are named screenshot-<host>-<hash>.png and pdf-<host>-<hash>.pdf, the same for the same URL.
How much does it cost to screenshot a website?
Pay per event: $4 per 1,000 captures (capture event, $0.004 each), plus a start fee of $0.00005 per GB of run memory ($0.0001 at the default 2 GB). One capture is one URL with all the outputs you asked for (PNG, PDF or both). Failed URLs are free. Apify platform usage is included in that price.
| Captures | Price |
|---|---|
| 100 | $0.40 |
| 1,000 | $4.00 |
| 10,000 | $40.00 |
If you set a maximum cost per run, the Actor stops starting new pages when the limit is reached, finishes cleanly, and tells you how many URLs were not processed.
Use with AI agents and MCP
Give Claude, Cursor, ChatGPT or your own agent a "screenshot this page" or "save this page as PDF" tool through the Apify MCP server. Add this server URL to your MCP client:
https://mcp.apify.com?tools=malmurk/website-screenshot-pdf
Then ask, for example: "Take mobile screenshots of these 5 landing pages and give me the links." The agent gets back a row per URL with screenshot_url and pdf_url, which it can open, show or pass to a vision model.
Integrations and API
- Make, Zapier and n8n: screenshot new URLs from a sheet, form or RSS feed and send the PNG or PDF to Google Drive, Slack, Notion or email. See the Make, Zapier and n8n guides.
- Schedules: capture the same pages every day or week with Apify Schedules for a visual history.
- Webhooks: get notified when a run finishes (webhooks).
- API: one HTTP call runs the Actor and returns the rows with file links.
curl -X POST "https://api.apify.com/v2/acts/malmurk~website-screenshot-pdf/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \-H "Content-Type: application/json" \-d '{"urls": [{"url": "https://example.com"}], "fullPage": true, "pdf": true}'
from apify_client import ApifyClientclient = ApifyClient("<YOUR_API_TOKEN>")run = client.actor("malmurk/website-screenshot-pdf").call(run_input={"urls": [{"url": "https://example.com"}, {"url": "https://www.python.org"}],"device": "mobile", "pdf": True,})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row["url"], row["screenshot_url"], row["pdf_url"], row["error"])
Memory and speed
The default 2 GB of memory runs 3 pages in parallel. Each page needs about 600 MB, and the Actor lowers the parallelism automatically if the run has less memory. Long, heavy pages (big news homepages with full-page PNG plus PDF) can need more than 1 GB on their own, so stay at 2 GB or above for those. More memory also gives the run more CPU, so pages render faster.
Limits
- Pages behind a login, paywall or CAPTCHA are captured as they appear to a logged-out visitor. The Actor does not log in, solve CAPTCHAs or bypass bot protection.
- It only visits the URLs you give it. It doesn't follow links or crawl.
- Full-page screenshots stop at 20,000 px of page height, so endless feeds don't produce huge files.
- Cookie banner hiding is best effort. An unusual banner can still show. Use
delayMsorwaitForSelectorfor pages that draw content late. - Output formats are PNG and PDF (no JPEG or WebP).
FAQ
Can I use it from an AI agent or via API?
Yes. Call the Actor with the urls input and read the dataset; each row has direct file links. See Use with AI agents and MCP.
How do I convert a URL to PDF without a screenshot?
Set "screenshot": false and "pdf": true. Pick the paper size with pdfFormat and turn on pdfLandscape for wide pages.
Can I take a 1920x1080 screenshot?
Yes: set viewportWidth to 1920 and viewportHeight to 1080. Turn fullPage off to get exactly that size.
A page came out blank or half-loaded.
Try "waitUntil": "networkidle", add "delayMs": 3000, or wait for a selector that appears when the content is ready.
Am I charged for pages that failed?
No. Only successful captures are charged. Failed URLs get a row with the reason in error.
Is it legal? Taking a screenshot of a public page is generally fine, but you are responsible for the URLs you submit and for how you use the images (copyright, terms of service, personal data).
Related Actors
- Businesses Without Websites Finder: find local businesses with no website, a dead link or only a Facebook page, then screenshot their current presence for your pitch.
- PDF Text Extractor with OCR: turn the PDFs you capture, or any other PDF, Word file or scan, into text and Markdown for AI.