Website Screenshot API – Bulk Full-Page, Mobile & PDF avatar

Website Screenshot API – Bulk Full-Page, Mobile & PDF

Pricing

from $2.10 / 1,000 screenshot takens

Go to Apify Store
Website Screenshot API – Bulk Full-Page, Mobile & PDF

Website Screenshot API – Bulk Full-Page, Mobile & PDF

Website screenshot API. Input: URLs, domains or a sitemap. Returns one row per URL with a full-page screenshot (desktop, mobile, tablet; PNG/JPEG/WebP) and optional URL to PDF. Accepts cookie banners, removes popups, ads and chat. $0.003 per screenshot; failed or bot-blocked URLs free. MCP-ready.

Pricing

from $2.10 / 1,000 screenshot takens

Rating

0.0

(0)

Developer

AusBizStack Intelligence

AusBizStack Intelligence

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Paste a list of URLs or domains → get clean, full-page screenshots (desktop, mobile, tablet) and optional PDFs, with cookie banners, popups, chat bubbles and ads removed. You pay only for screenshots that actually rendered.

▶️ Try it now

The input is prefilled with stripe.com, apple.com and bbc.com. Click Start – you get 3 full-page desktop screenshots in under a minute for less than $0.01.

Real rows from our test run (desktop, full page, JPEG q80):

urlstatushttpStatustitlewidth × heightfile sizecharged
stripe.comok200Stripe | Financial Infrastructure to Grow Your Revenue1440 × 14,8441.7 MB$0.003
apple.comok200Apple1440 × 5,8850.7 MB$0.003
bbc.comok200BBC Home | Breaking News, World News…1440 × 14,0812.5 MB$0.003
etsy.comerror403– (“Blocked by bot protection / CAPTCHA”)––$0

Every input URL gets exactly one row – successes and failures – so you can join results back to your list.

💰 What it costs

Pay-per-event. Errors, timeouts, bot-protection pages and HTTP 4xx/5xx are never charged.

VolumeScreenshots only ($0.003 each)Screenshot + PDF ($0.005 per URL)Screenshots on GOLD plan ($0.0021)
100 URLs$0.30$0.50$0.21
1,000 URLs$3.00$5.00$2.10
10,000 URLs$30.00$50.00$21.00

Paid Apify plans get automatic discounts: BRONZE $0.0027 · SILVER $0.0024 · GOLD/PLATINUM/DIAMOND $0.0021 per screenshot (PDF $0.0018 / $0.0016 / $0.0014). viewport: both = 2 screenshots per URL. A tiny start fee ($0.00005 per GB of memory) applies per run. Set Max cost per run in the run options and the Actor stops cleanly at your budget.


💳 What counts as a billed result

Two events, both charged only on success:

EventPriceCharged when
screenshot-taken$0.003Once per screenshot actually saved, per device. viewport: "both" = 2 charges per URL; each extra device preset = 1 more
pdf-generated$0.002Once per PDF actually saved (only when pdf: true)

Apify also adds its standard tiny start fee per run (apify-actor-start).

Row in your datasetCharged?
status: "ok"Yes, only for the screenshots / PDF in that row (chargedScreenshots, chargedPdf)
Bot-protection / CAPTCHA page, HTTP 4xx/5xx, error, timeout (status: "error")No, $0
invalid_input (not a URL, domain or email)No, $0
duplicate_input (same page as an earlier line)No, $0

🧾 Accepted input formats

Each line in urls can be a bare domain (stripe.com), a full URL (https://www.stripe.com/pricing), a domain with mixed case, spaces or a trailing slash, or an email address (sales@stripe.com or mailto: link, which captures that domain's homepage). Objects like {"url": "...", "userData": {...}} keep working.

Inputs are cleaned and de-duplicated before any page is opened or charged. Two lines count as the same page when the host (ignoring www. and case), path (ignoring a trailing slash) and query string match. The extra line comes back as a free duplicate_input row with duplicateOf. A www. you type is kept when the page is loaded.

📊 Measured quality (not marketing numbers)

We ran 132 URL tests on real public websites in 6 batches (SaaS, news, retail, government, education, EU sites) on Apify's default 4 GB setup, with no proxy:

MetricResult
Success rate, desktop full-page (112 URLs)93 / 112 = 83%
Success rate excluding sites with hard bot protection93 / 97 = 96%
Hard bot-blocked (HTTP 401/403)15 – e.g. Etsy, eBay, Reuters, Forbes, ASOS, Sephora, Reddit, NYTimes – returned as error, not charged
Timeouts4 (very slow or endless-loading pages) – not charged
Typical time per page4–10 s when rendered alone; ~45 s median per page when 8 render in parallel (25 URLs finish in about 3 minutes)
Our platform cost per screenshot$0.001–$0.003 (so the price is sustainable, not a loss-leader that will disappear)
Desktop + mobile + PDF (20 URLs, heaviest mode)11 fully rendered, 5 marked “partial” after 105 s and not charged, 4 blocked/timeout. For this mode use fewer parallel pages (concurrency: 4) or 8 GB memory.

Some heavily bot-protected sites (Etsy, eBay, Reuters and similar) block data-center browsers. They come back as a clear error row with HTTP 403 and you pay nothing for them. If you need those sites, add your own residential proxy.

✨ Features

This ActorTypical screenshot Actor
InputURLs, bare domains, startUrls, sitemap.xml / sitemap index / .gzURLs only
Devicesdesktop, laptop, desktop-HD, iPhone 13, iPhone 15 Pro Max, Pixel 7, Galaxy S9, iPad, iPad Pro – or both/all in one runone viewport
Cookie bannersClicks “Accept” on 40+ CMPs (OneTrust, Cookiebot, Didomi, Quantcast, Usercentrics, TrustArc, Sourcepoint, Funding Choices, CookieYes, iubenda…) in 20+ languages, incl. iframes & shadow DOM, then hides leftoversCSS hide list, or nothing
PopupsRemoves newsletter / sign-in / ad-block-wall modals and dark backdrops, unlocks scrolling–
Ads & chatBlocks ad/tracker requests (faster + cleaner), hides Intercom, Drift, HubSpot, Zendesk, Tawk…–
Lazy-loadingScrolls the page, forces loading=lazy images, waits for fonts & imagesfixed delay
AnimationsFrozen, caret hidden → no half-faded heroes–
Element shotselector – capture just one element–
Dark mode, locale, timezone✅rarely
Custom headers, cookies, user agent✅ (screenshot pages behind a login cookie)rarely
FormatsJPEG, PNG, WebP (+ quality), PDF (A4/Letter, landscape)PNG/JPEG
Very tall pagesCapped at maxFullPageHeight (default 15,000 px) so you never get a 200 MB imagecrash / timeout
ReliabilityRetries, www-fallback for bare domains, crash recovery, per-URL hard timeout; one bad URL never fails the runrun fails
Honest billingCloudflare / DataDome / PerimeterX challenge pages detected and not chargedcharged

📥 Input

Only urls is required. Everything else has sensible defaults.

{
"urls": ["https://stripe.com", "apple.com", "https://www.bbc.com/news"],
"viewport": "both",
"fullPage": true,
"format": "jpeg",
"quality": 80,
"pdf": false,
"darkMode": false,
"concurrency": 8
}

Useful options: sitemapUrl + maxSitemapUrls (screenshot a whole site), devicePresets (e.g. ["iphone-15-pro-max","pixel-7"]), selector, waitForSelector, delayMs, hideSelectors, customCss, headers, cookies, locale, timezoneId, userAgent, maxFullPageHeight, pdfOnly, timeoutSecs, retries, proxyConfiguration.

📤 Output

One dataset row per input URL:

{
"url": "https://stripe.com",
"finalUrl": "https://stripe.com/",
"status": "ok",
"httpStatus": 200,
"title": "Stripe | Financial Infrastructure to Grow Your Revenue",
"screenshotUrl": "https://api.apify.com/v2/key-value-stores/…/records/0001-stripe-com-desktop.jpg",
"mobileScreenshotUrl": "https://api.apify.com/v2/key-value-stores/…/records/0001-stripe-com-mobile.jpg",
"screenshots": [{ "device": "desktop", "url": "…", "width": 1440, "height": 9870, "bytes": 1650000, "format": "jpeg" }],
"pdfUrl": null,
"width": 1440, "height": 9870, "bytes": 1650000,
"format": "jpeg", "device": "desktop",
"takenAt": "2026-11-02T03:12:45.120Z",
"durationMs": 11240, "attempts": 1,
"chargedScreenshots": 1, "chargedPdf": false,
"error": null
}

status is ok, error or timeout. Images and PDFs are stored in the run's key-value store; the URLs are directly downloadable. A run summary (totals, success rate) is saved as OUTPUT in the key-value store. Rows are webhook-friendly: flat fields, stable keys, userData from your input echoed back.

🤖 Use from an AI agent (Apify MCP)

Add the Apify MCP server to Claude, Cursor, VS Code or any MCP client:

https://mcp.apify.com/?actors=ausbizstack/website-screenshot-api

Then ask: “Take full-page desktop and mobile screenshots of stripe.com and linear.app and give me the image links.” The agent calls this Actor and gets back the structured rows above.

API (any language):

curl -X POST "https://api.apify.com/v2/acts/ausbizstack~website-screenshot-api/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"urls":["https://stripe.com"],"viewport":"mobile"}'

❓ FAQ

Am I charged for failed URLs? No. Only successfully saved screenshots/PDFs are charged. Errors, timeouts, HTTP 4xx/5xx and bot-challenge pages cost nothing (you still get a row explaining why).

Some sites return 403 / "blocked". Large news, retail and travel sites block data-center IPs. Add your own residential proxy URLs in proxyConfiguration for those (Apify Proxy is not supported). Without a proxy those URLs simply come back as error, not charged.

How do I screenshot a whole website? Put the sitemap in sitemapUrl (sitemap indexes and .xml.gz work) and set maxSitemapUrls.

Can I screenshot pages behind a login? Yes – pass session cookies or an Authorization header in headers. Only use accounts you own.

Why is my screenshot cut at 15,000 px? Endless feeds would otherwise create huge files. Raise maxFullPageHeight (up to 30,000) if you need more.

Mobile looks like desktop? Some sites decide by user agent – the mobile presets send real iPhone/Android user agents, touch and device-scale-factor.

PNG, JPEG or WebP? JPEG (q80) is the best size/quality default; PNG for pixel-perfect UI; WebP for the smallest files.

Is it fast enough for bulk? Yes. At the default 4 GB the Actor renders 8 pages at once (set concurrency up to 10, or raise memory to go wider). See the measured numbers above.

Is this legal? Screenshotting public pages is generally fine; respect each site's terms and copyright when you reuse images.

Questions or a site that renders badly? Open an issue on the Actor's Issues tab – include the URL and we'll tune it.