Website Screenshot API – Bulk Full-Page, Mobile & PDF
Pricing
from $2.10 / 1,000 screenshot takens
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
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):
| url | status | httpStatus | title | width × height | file size | charged |
|---|---|---|---|---|---|---|
| stripe.com | ok | 200 | Stripe | Financial Infrastructure to Grow Your Revenue | 1440 × 14,844 | 1.7 MB | $0.003 |
| apple.com | ok | 200 | Apple | 1440 × 5,885 | 0.7 MB | $0.003 |
| bbc.com | ok | 200 | BBC Home | Breaking News, World News… | 1440 × 14,081 | 2.5 MB | $0.003 |
| etsy.com | error | 403 | – (“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.
| Volume | Screenshots 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:
| Event | Price | Charged when |
|---|---|---|
screenshot-taken | $0.003 | Once per screenshot actually saved, per device. viewport: "both" = 2 charges per URL; each extra device preset = 1 more |
pdf-generated | $0.002 | Once per PDF actually saved (only when pdf: true) |
Apify also adds its standard tiny start fee per run (apify-actor-start).
| Row in your dataset | Charged? |
|---|---|
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:
| Metric | Result |
|---|---|
| Success rate, desktop full-page (112 URLs) | 93 / 112 = 83% |
| Success rate excluding sites with hard bot protection | 93 / 97 = 96% |
| Hard bot-blocked (HTTP 401/403) | 15 – e.g. Etsy, eBay, Reuters, Forbes, ASOS, Sephora, Reddit, NYTimes – returned as error, not charged |
| Timeouts | 4 (very slow or endless-loading pages) – not charged |
| Typical time per page | 4–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 Actor | Typical screenshot Actor | |
|---|---|---|
| Input | URLs, bare domains, startUrls, sitemap.xml / sitemap index / .gz | URLs only |
| Devices | desktop, laptop, desktop-HD, iPhone 13, iPhone 15 Pro Max, Pixel 7, Galaxy S9, iPad, iPad Pro – or both/all in one run | one viewport |
| Cookie banners | Clicks “Accept” on 40+ CMPs (OneTrust, Cookiebot, Didomi, Quantcast, Usercentrics, TrustArc, Sourcepoint, Funding Choices, CookieYes, iubenda…) in 20+ languages, incl. iframes & shadow DOM, then hides leftovers | CSS hide list, or nothing |
| Popups | Removes newsletter / sign-in / ad-block-wall modals and dark backdrops, unlocks scrolling | – |
| Ads & chat | Blocks ad/tracker requests (faster + cleaner), hides Intercom, Drift, HubSpot, Zendesk, Tawk… | – |
| Lazy-loading | Scrolls the page, forces loading=lazy images, waits for fonts & images | fixed delay |
| Animations | Frozen, caret hidden → no half-faded heroes | – |
| Element shot | selector – capture just one element | – |
| Dark mode, locale, timezone | ✅ | rarely |
| Custom headers, cookies, user agent | ✅ (screenshot pages behind a login cookie) | rarely |
| Formats | JPEG, PNG, WebP (+ quality), PDF (A4/Letter, landscape) | PNG/JPEG |
| Very tall pages | Capped at maxFullPageHeight (default 15,000 px) so you never get a 200 MB image | crash / timeout |
| Reliability | Retries, www-fallback for bare domains, crash recovery, per-URL hard timeout; one bad URL never fails the run | run fails |
| Honest billing | Cloudflare / DataDome / PerimeterX challenge pages detected and not charged | charged |
📥 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.