Website Screenshot API: Full Page, No Cookie Banners avatar

Website Screenshot API: Full Page, No Cookie Banners

Pricing

from $2.50 / 1,000 screenshot captureds

Go to Apify Store
Website Screenshot API: Full Page, No Cookie Banners

Website Screenshot API: Full Page, No Cookie Banners

Full-page screenshots for a list of URLs, without cookie banners. Lazy images load, sticky headers show once, a height cap stops runaway pages, and a hard time limit per URL keeps runs from sticking. PNG, JPEG or WebP; desktop, tablet or mobile. Pay per screenshot, failed pages are free.

Pricing

from $2.50 / 1,000 screenshot captureds

Rating

0.0

(0)

Developer

Adrian Voss

Adrian Voss

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Paste a list of URLs and get one clean full page screenshot per URL: the whole page from top to bottom, without cookie banners, with lazy-loaded images actually loaded and sticky headers shown once instead of stamped across the page. PNG, JPEG or WebP; desktop, tablet or mobile. Every image lands in the run's key-value store with a public link in the results table.

You pay per screenshot. A page that fails to load, runs out of time or answers with an HTTP error is free.

Who it's for

  • Agencies and QA teams capturing a client's pages for reports, audits, visual regression or before/after comparisons, for a list of URLs at once rather than one tab at a time.
  • SEO and marketing teams archiving competitors' landing pages, pricing pages and homepages on a schedule, for a monthly "what changed" deck.
  • Developers and no-code builders who need a screenshot step in an n8n, Make, Zapier or Clay flow, or an AI agent that has to "look" at a page.
  • Anyone who needs a screenshot url alternative after getting a cut-off page, a cookie wall over the content, or a run that never finished: this actor is built around those three problems.

Why this one

  • Real full-page captures. Before the capture the page is scrolled to the bottom so lazy images and "load on scroll" sections render, pages whose content scrolls inside an inner box are expanded, and a 100vh hero doesn't balloon. The capture is exactly as tall as the page.
  • No cookie banners. A curated list covers the consent tools most sites use (OneTrust, Cookiebot, Didomi, Usercentrics, TrustArc, Quantcast, Sourcepoint, CookieYes, Osano, iubenda, Complianz, Klaro, Google Funding Choices and 15+ more), plus a check for home-made cookie bars: a fixed bar or dialog that talks about cookies and has an Accept / Reject button. The banner, its grey backdrop and the scroll lock it sets are hidden, never clicked: no consent is given for you. Each row says whether a banner was hidden and which one.
  • Sticky headers and chat bubbles appear once. Fixed and sticky elements are pinned to where they sit at the top of the page before the capture.
  • Height control. A height limit (default 15,000 px) stops an endless feed from producing a giant image, and the row tells you when a page was cut (truncated).
  • Runs don't get stuck. Every page has a hard time limit (default 45 s). A slow page comes back with whatever had rendered, free, and the run moves on.
  • Pay only for real screenshots. Errors, time-outs and HTTP 4xx/5xx pages are free rows (the image is still attached so you can see what happened).

What you get

One row per URL:

FieldTypeDescription
urltextThe URL you passed in (https:// added when missing).
foundbooleantrue when the page was captured and charged, false for a free failed row.
finalUrltextWhere the page ended up after redirects.
statusCodenumberHTTP status of the page.
titletextThe page's title.
screenshotUrllinkPublic link to the image in the run's key-value store.
screenshotKeytextThe image's key in the key-value store.
formattextpng, jpeg or webp.
viewporttextScreen size used, e.g. desktop 1440x900.
width, heightnumberImage size in px, read from the saved file.
pageHeightnumberFull page height before the height limit.
truncatedbooleantrue when the page was taller than the limit and was cut there.
bytesnumberImage file size.
bannerHiddenbooleantrue when a visible cookie/consent banner was hidden.
bannersHiddenarrayWhich: cmp:<selector> for a known consent tool, heuristic:<element> for a home-made bar.
notetextAnything worth knowing (cut at the limit, followed a bot check to the real page, inner scroll area expanded, bad selector ignored).
errortextWhy the page failed. A row with an error is never charged.
capturedAtdateWhen the capture was taken.

The Screenshots view in the dataset shows the images as thumbnails next to each URL.

Price

$5 per 1,000 screenshots ($0.005 each) on the free Apify plan, down to $2.50 per 1,000 on paid plans, plus a tiny per-run start fee. Only captured pages are charged. A page that fails to load, hits the time limit, answers with an HTTP error or never gets past a bot check costs nothing. Set Maximum cost per run in the run options and the actor stops cleanly when it's reached.

How to use

  1. In the Apify Console. Open the actor, paste your URLs (one per line) and click Start. The results table fills as each page is captured; click a screenshotUrl to open the image.
  2. Via the API. One POST, results back in the same call:
    curl "https://api.apify.com/v2/acts/accountable_eel~website-screenshot/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
    -X POST \
    -H "Content-Type: application/json" \
    -d '{"urls":["https://www.booking.com/","https://apify.com/"],"format":"jpeg"}'
  3. On a schedule. Save your input as a Task and add a Schedule (daily, weekly) to archive the same pages over time.

Input

{
"urls": ["https://www.booking.com/", "apify.com"],
"viewport": "desktop",
"fullPage": true,
"maxHeight": 15000,
"format": "png",
"hideCookieBanners": true,
"scrollToLoadLazy": true,
"perUrlTimeoutSecs": 45
}
InputDefaultWhat it does
urlsOne URL per line. example.com works too. Duplicates are captured once.
viewportdesktopdesktop 1440x900, tablet 768x1024, mobile 390x844 (phone browser, so sites serve their mobile layout), or custom.
viewportWidth, viewportHeight1440, 900Window size when viewport is custom.
fullPagetrueWhole page, or just the window.
maxHeight15000Height limit in px for full-page captures. Maximum 16,384 (a browser can't paint a taller single image).
formatpngpng, jpeg or webp.
quality80JPEG / WebP quality, 1–100.
delaySeconds0Extra wait after load, for animations or slow widgets.
hideCookieBannerstrueHide consent banners (never clicks them).
hideSelectorsYour own CSS selectors to hide, e.g. .newsletter-popup.
scrollToLoadLazytrueScroll down first so lazy images and sections load.
perUrlTimeoutSecs45Hard time limit per page, 10–300 s.
maxConcurrency2Pages captured in parallel.

Sample output

{
"url": "https://www.booking.com/",
"found": true,
"finalUrl": "https://www.booking.com/",
"statusCode": 200,
"title": "Booking.com | Official site | The best hotels, flights, car rentals & accommodations",
"screenshotUrl": "https://api.apify.com/v2/key-value-stores/<store id>/records/001-www-booking-com.png",
"screenshotKey": "001-www-booking-com.png",
"format": "png",
"viewport": "desktop 1440x900",
"width": 1440,
"height": 3013,
"pageHeight": 3013,
"truncated": false,
"bytes": 1301117,
"bannerHidden": true,
"bannersHidden": ["cmp:#onetrust-banner-sdk"],
"note": null,
"error": null,
"capturedAt": "2026-09-25T19:35:41.241Z"
}

A failed page, which is free:

{
"url": "https://example.com/blocked",
"found": false,
"statusCode": 403,
"screenshotUrl": "https://api.apify.com/v2/key-value-stores/<store id>/records/002-example-com-blocked.png",
"bannerHidden": false,
"error": "Page answered HTTP 403; screenshot attached, not charged."
}

Use it from n8n, Make, Zapier, Clay or an AI agent

  • n8n / Make / Zapier: use the Apify integration's "Run actor and get dataset items" with accountable_eel/website-screenshot and {"urls": [...]}. Each item carries screenshotUrl, ready to drop into Slack, Google Drive or a Google Sheet IMAGE() cell.
  • AI agents (Apify MCP server): the agent passes a list of URLs and gets back image links plus titles and status codes, one small row per page.
  • A single URL sent as a plain string instead of a list is accepted.

Tips

  • Smaller files: format: "jpeg" with quality: 70 is usually 5–10 times smaller than PNG for photo-heavy pages.
  • A popup that isn't a cookie banner (newsletter, app promo, sign-in nudge): add its selector to hideSelectors.
  • Mobile layouts: viewport: "mobile" sends a phone browser identity and touch support, so sites serve their real mobile page, not the desktop page squeezed narrow.
  • Very long pages (feeds, long articles): lower maxHeight to what you actually need; the capture is faster and the file smaller.

vs. alternatives

The most common complaints about basic screenshot actors, and what this one does instead:

ComplaintThis actor
"Full page" comes out cut offScrolls to load lazy content, expands inner scroll areas, captures the page's real height
Cookie banner covers the contentHidden (30+ consent tools and home-made bars), never clicked
Sticky header repeated down the imageFixed and sticky elements pinned so they appear once
No control over heightmaxHeight, plus a truncated flag and the real pageHeight
Runs stuck on one slow pageHard time limit per page; the slow page is free and the run moves on
Paying for failuresErrors, time-outs, HTTP 4xx/5xx pages and uncleared bot checks are free

FAQ

Does hiding the cookie banner accept cookies? No. Nothing on the page is clicked. The banner is hidden with CSS, so the site sees an ordinary first visit that never answered its consent question.

Which cookie banners are covered? OneTrust, Cookiebot, Didomi, Usercentrics, TrustArc, Quantcast Choice, Sourcepoint, CookieYes, Osano, Termly, Complianz, Borlabs, iubenda, Klaro, CookieScript, Axeptio, tarteaucitron, Google Funding Choices, Commanders Act, Ketch, consentmanager, Civic Cookie Control, HubSpot, Shopify, Cookie Consent, Cookie Notice, GDPR Cookie Compliance, Evidon, CookieHub and Amazon's own banner, plus home-made cookie bars in English and major European languages. Sites that redirect to a separate consent page before showing any content (some Google and Yahoo properties) can't be handled by hiding.

Where are the images stored, and for how long? In the run's default key-value store. screenshotUrl is a direct public link. Apify keeps a run's storage for your plan's data-retention period (7 days on the free plan). Copy the images elsewhere (Google Drive, S3) if you need them longer.

Why is my screenshot cut at 15,000 px? That's the default maxHeight, so an endless feed can't produce a gigantic file. Raise it up to 16,384 px. The row's pageHeight tells you how tall the page really was.

Will it get past bot protection? Pages are opened in a real Chrome browser, which passes most sites. When a site shows a "checking your browser" page first, the actor waits for it to hand over to the real page and captures that (the row's note says so). A site that blocks cloud servers outright, or a check that never clears, gives a row with the HTTP status and an error, and that row is free.

Can I log in first or screenshot a page behind a password? Not in this version.

What happens when a page is slow? Each page has a hard limit (perUrlTimeoutSecs, default 45 s). If the page hasn't finished loading by then, you get what had rendered, marked with an error, free of charge, and the run carries on with the next URL.

  • accountable_eel/jsonld-structured-data-lookup: structured data (JSON-LD) from a list of URLs.
  • accountable_eel/dns-record-lookup: DNS records for a list of domains.