Full Page Screenshot & URL to PDF · No Cookie Banners avatar

Full Page Screenshot & URL to PDF · No Cookie Banners

Pricing

from $20.00 / 1,000 screenshots

Go to Apify Store
Full Page Screenshot & URL to PDF · No Cookie Banners

Full Page Screenshot & URL to PDF · No Cookie Banners

Full-page website screenshots and PDFs that really capture the whole page: lazy-loaded images scrolled in, cookie banners hidden (never accepted), desktop/laptop/tablet/mobile. Optional visual diff vs. the last run. Pay per delivered file - blocked, 404 and dead URLs are free.

Pricing

from $20.00 / 1,000 screenshots

Rating

0.0

(0)

Developer

TheQuietStack

TheQuietStack

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Full page screenshot and URL to PDF: website capture that scrolls lazy-loaded images in and hides cookie banners, desktop to mobile.

Website Screenshot & PDF turns a list of URLs into full-page screenshots (PNG/JPEG) and PDFs that show the whole page - including the images that only load while you scroll, and without the cookie banner covering the content. Every URL gets a row: a link to the file, or the exact reason it could not be captured. You pay only for files that were delivered. Blocked pages, 404s, dead domains and timeouts are free.

What you get

  • A full-page screenshot (PNG or JPEG) and/or a PDF per URL and device (desktop, laptop, tablet, mobile).
  • One dataset row per capture: status, HTTP status, page title, file links, file sizes, real page height, whether the image was cut, how many consent elements were hidden, load time.
  • Optional visual diff against the last run: changed-pixel percentage plus a diff image with the changes in red.
  • A SUMMARY record with counts per status and what was charged.

Use cases

  • Archiving and evidence: keep a dated full-page copy of a landing page, a price page or terms of service.
  • Website change monitoring: schedule the Actor with compareWithPrevious and get changed: true when a page moves.
  • QA and visual regression: capture the same URLs on desktop and mobile after every deploy.
  • SEO and competitor reports: full-page screenshots of SERP landing pages or competitor homepages for a client deck.
  • URL to PDF: print web pages to A4/Letter PDFs with backgrounds, in the screen or print stylesheet.

Why this Actor

Common problemWhat this Actor does
"Only screenshots above the fold"Captures the real document height; scrolls the page step by step first so lazy-loaded images and sections render; removes the scroll lock that consent banners put on the page. The row reports the page height and whether it was cut at your maxHeightPx.
Cookie / consent banner over the contentHides the banners of OneTrust, Cookiebot, Usercentrics, Didomi, Quantcast, TrustArc, Sourcepoint, Borlabs, Complianz, CookieYes, Iubenda, Osano, Klaro, consentmanager and common generic patterns. Hidden, never clicked - no consent is given on your behalf. Add your own selectors for chat widgets or promo bars.
"It didn't work and still used my credits"Pay per delivered file. Failed, blocked, invalid and duplicate URLs are never charged and are listed with the reason.
Unpredictable compute costA fixed price per screenshot and per PDF, plus an optional hard cap maxCostUsd.
Did the page change?Optional pixel diff against the previous run of the same URL and device: diffPercent, changed, and a highlighted diff image. Included in the screenshot price.

Input

{
"urls": ["https://example.com", "https://en.wikipedia.org/wiki/Screenshot"],
"outputs": ["screenshot", "pdf"],
"devices": ["desktop", "mobile"],
"fullPage": true,
"maxHeightPx": 15000,
"screenshotFormat": "png",
"hideCookieBanners": true,
"hideSelectors": ["#intercom-container"],
"compareWithPrevious": false,
"maxCostUsd": "1.00"
}
FieldDefaultNotes
urls-Required. example.com is read as https://example.com. Duplicates are removed before charging.
outputs["screenshot"]screenshot, pdf or both.
devices["desktop"]desktop 1920x1080, laptop 1366x768, tablet iPad (gen 7), mobile iPhone 13. One capture per URL and device.
fullPage / maxHeightPxtrue / 15000Longer pages are cut at maxHeightPx and marked truncated: true.
screenshotFormat / jpegQualitypng / 80PNG is lossless, JPEG is smaller.
hideCookieBanners / hideSelectorstrue / []See above.
scrollForLazyLoadtrueScroll through the page before capturing.
waitUntil, waitForSelector, delayMs, navigationTimeoutSecsload, -, 0 (max 10,000 ms), 30 (max 60 s)Timing controls. A waitForSelector that never appears gives selector-not-found (free).
pdfFormat, pdfLandscape, pdfMedia, pdfPrintBackgroundA4, false, screen, truescreen makes the PDF look like the website; print uses the site's print stylesheet.
compareWithPrevious, minChangePercent, baselineStoreNamefalse, 0.5, screenshot-baselinesVisual diff (PNG only). The last screenshot per URL and device is kept in a named key-value store in your account. The baseline only moves forward for captures you were charged for.
maxCostUsdemptyHard cap. The run stops before starting a capture it could not pay for.
maxConcurrency3Parallel pages. Raise the run memory before raising this.

Output

Files go to the run's key-value store; one dataset row per URL and device. A real row from a run on the Apify platform (01.10.2026, heise.de, screenshot + PDF; store ID and URL signature shortened). The page was 33,182 px long, so the screenshot was cut at the default maxHeightPx of 15,000 and marked truncated; the PDF is never cut (54 pages):

{
"url": "https://www.heise.de/",
"device": "desktop",
"status": "ok",
"httpStatus": 200,
"finalUrl": "https://www.heise.de/",
"title": "heise online - IT-News, Nachrichten und Hintergründe | heise online",
"screenshotUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/screenshot-www.heise.de-b8529010-desktop.png?signature=...",
"screenshotKey": "screenshot-www.heise.de-b8529010-desktop.png",
"screenshotBytes": 6112966,
"pdfUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/pdf-www.heise.de-b8529010-desktop.pdf?signature=...",
"pdfKey": "pdf-www.heise.de-b8529010-desktop.pdf",
"pdfBytes": 14578578,
"pdfPages": 54,
"pageHeightPx": 33182,
"capturedHeightPx": 15000,
"truncated": true,
"viewportWidthPx": 1920,
"consentElementsHidden": 1,
"lazyLoadScrollSteps": 18,
"diffStatus": null,
"blockedBy": null,
"error": null,
"loadMs": 28591,
"charged": true,
"chargedEvents": ["screenshot", "pdf"],
"capturedAt": "2026-10-01T11:00:56.001Z"
}

A URL that could not be captured (same day, control probe; not charged):

{ "url": "https://qs-control-probe-does-not-exist-20261001.com/", "status": "dns-error", "error": "Domain does not resolve (page.goto: net::ERR_NAME_NOT_RESOLVED at https://qs-control-probe-does-not-exist-20261001.com/)", "loadMs": 69, "charged": false, "chargedEvents": [] }

Statuses: ok, blocked (bot-protection challenge, with blockedBy), http-error (4xx/5xx, with httpStatus), dns-error, network-error, tls-error, timeout (retried once), selector-not-found, invalid-url, capture-error, storage-error. Only ok is charged.

With compareWithPrevious: diffStatus (baseline-created on the first run, then compared), diffPercent (share of pixels that differ, 4 decimals), changedPixels (exact count), changed, heightChangePx, baselineCapturedAt, diffImageUrl (changed pixels in red).

The SUMMARY record has counts per status, charged events, the stop reason and the URLs not reached because of a cost limit.

How much does it cost?

Pay per event. Platform usage (compute, storage) is included in the price; you pay only for delivered files.

EventCharged whenPrice
screenshota screenshot file was stored for one URL and device (visual diff included)$0.02
pdfa PDF file was stored for one URL and device$0.02
Actor startonce per run$0.00005

Examples:

  • 1,000 full-page screenshots = 1,000 x $0.02 = $20.
  • 100 URLs as screenshot + PDF = 200 files = $4.
  • Weekly change check of 50 URLs (screenshot + diff) = $1 per week.
  • 100 URLs of which 7 are blocked, 404 or dead = 93 screenshots = $1.86; the 7 failed rows are free.

No charge for failed, blocked, invalid, duplicate or not-reached URLs. No per-row dataset charge. maxCostUsd and the platform's "Max cost per run" are both respected: a capture only starts if it can be paid within the limit.

Limits

  • Time budget per page: loading, scrolling and waiting end at most 60 s after the start, the capture itself gets 20 s. Slower pages end as timeout (free) instead of running for minutes.
  • Pages behind a bot challenge (Cloudflare "Just a moment...", DataDome, PerimeterX, captcha walls) are reported as blocked. This Actor does not try to get past them and uses no proxies.
  • Pages that need a login are captured as the logged-out visitor sees them.
  • Elements with position: fixed (sticky headers, promo bars) appear once, where they sit on the first screen; hide them with hideSelectors if needed.
  • Chromium only. Very long pages are cut at maxHeightPx (max 30,000 px); PDFs are not cut.
  • Cookie banner hiding is pattern based; an unknown banner can stay visible - add its selector to hideSelectors.

Use it via API, integrations and AI agents

Run it and get the rows back in one call (waits up to 300 s; use the normal run endpoint for long lists):

curl -X POST "https://api.apify.com/v2/acts/thequietstack~website-screenshot-pdf/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"urls":["https://example.com"],"outputs":["screenshot","pdf"]}'

Python (pip install apify-client):

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("thequietstack/website-screenshot-pdf").call(
run_input={"urls": ["https://example.com"], "devices": ["desktop", "mobile"]}
)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
print(row["url"], row["device"], row["status"], row["screenshotUrl"])
  • Schedules: run it daily or weekly from Apify Schedules with compareWithPrevious: true for change monitoring.
  • Integrations: Make, Zapier, n8n, Google Drive, Slack and webhooks via the Apify integrations tab.
  • AI agents (MCP): add thequietstack/website-screenshot-pdf as a tool in the Apify MCP server (https://mcp.apify.com?tools=thequietstack/website-screenshot-pdf).

FAQ

Does it capture the whole page, not just the first screen? Yes. It scrolls through the page first so lazy-loaded content renders, then captures the full document height up to maxHeightPx (default 15,000 px, max 30,000). The row says truncated: true when a page was longer. PDFs are not cut.

Does it accept cookie banners for me? No. Known consent banners are hidden with CSS, never clicked, so no consent is given on your behalf. Unknown banners can be added with hideSelectors.

What happens with Cloudflare or captcha pages? They are reported as blocked (with blockedBy) and are not charged. The Actor does not try to get past bot protection and uses no proxies.

Can I take mobile screenshots? Yes, devices: ["mobile"] emulates an iPhone 13; tablet an iPad (gen 7).

How do I detect that a page changed? Turn on compareWithPrevious. The first run stores a baseline, the next runs return diffPercent, changed and a red-marked diff image.

Where are the files and how long are they kept? In the run's key-value store, linked from every row. Default run storage follows your Apify plan's data retention; copy the files elsewhere (e.g. Google Drive integration) to keep them.

Can I take screenshots of pages behind a login? No. Pages are captured as a logged-out visitor sees them.

  • You are responsible for having the rights to capture, store and use the pages you submit. The screenshots and PDFs reproduce third-party websites, which may be protected by copyright, trademark and database rights and by the sites' terms of use. Keep attribution (the source URL is in every row) and use the files only where the law or the site owner allows it (e.g. your own sites, QA, archiving for evidence, internal monitoring).
  • Do not use this Actor to capture personal data without a legal basis (GDPR/CCPA), or to circumvent access controls. It never clicks consent buttons and never bypasses bot protection.
  • The Actor code is licensed under the Apache License 2.0. The output files are not covered by that license - their rights stay with the owners of the captured websites.