Bulk Website Screenshot: Full-Page & Mobile
Pricing
from $1.75 / 1,000 screenshots
Bulk Website Screenshot: Full-Page & Mobile
Take reliable screenshots of any list of public URLs: full-page, viewport, mobile/tablet or a single element. Lazy-load scrolling, cookie-banner hiding, auto-retries. Pay only for successful screenshots; failed URLs are never charged.
Pricing
from $1.75 / 1,000 screenshots
Rating
0.0
(0)
Developer
Mogul Tools
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
Bulk Website Screenshot API: Full-Page, Mobile & Element Screenshots (Pay Only for Success)
Turn any list of public URLs into clean, full-page screenshots, with retries, lazy-load scrolling and cookie-banner hiding built in. You're only charged for screenshots that actually worked. Timeouts, DNS errors, HTTP 4xx/5xx and anti-bot challenge pages are logged in the dataset with the reason, and they're free.
Use it as a website screenshot API, a bulk URL to PNG/JPEG converter, a full-page screenshot tool for SEO and QA, or a visual tool for AI agents (via the Apify MCP server). Paste URLs, click Start, download the images.
Quick start (about 1 minute)
- Paste your URLs into URLs (one per line;
example.comworks too). - Pick a Device / viewport (desktop, laptop, tablet, mobile or custom) and keep Full-page screenshot on.
- Click Start. Open the Screenshots view in the Output tab to preview, or export the list as CSV/Excel/JSON with direct image links.
What can it do?
- 📸 Full-page or viewport screenshots of up to thousands of URLs per run
- 📱 Device emulation: desktop 1920×1080, laptop 1366×768, tablet, iPhone-size mobile (retina), or any custom size
- 🎯 Element screenshots: capture just
#pricing,header,main, or any CSS selector - 🍪 Hides cookie/consent pop-ups (OneTrust, Cookiebot, Didomi, Usercentrics, Quantcast and more) with CSS. Nothing gets clicked or accepted for you
- 🖼️ Lazy-loaded images get triggered by auto-scrolling before the capture
- 🌙 Dark mode (
prefers-color-scheme: dark), PNG or JPEG with a quality setting, and your own selectors to hide (chat widgets, sticky bars) - 🔁 Automatic retries in a fresh browser context, with no retries wasted on permanent errors
- 🧾 Honest output: every input URL gets a row with the HTTP status, final URL after redirects, page title, size, attempts and the error reason if it failed
Who uses it?
- SEO & marketing teams: archive landing pages and competitor homepages, and build visual reports
- QA & developers: visual checks across desktop and mobile, and before/after deploy snapshots
- Agencies: monthly client-site snapshots and proof of ad or page placement
- AI agents & automations: give an LLM a picture of a page. It works with the Apify API, MCP server, Make, Zapier and n8n
Popular use cases
| Goal | Suggested settings |
|---|---|
| Competitor homepage archive (weekly) | viewport: desktop, fullPage: true, schedule the run in Apify |
| Mobile-friendliness check for a client list | viewport: mobile, fullPage: false |
| Pricing-page monitoring | elementSelector: "#pricing" (or your selector), format: jpeg |
| Lead-gen / cold-outreach visuals ("here's your site on mobile") | viewport: mobile, format: jpeg, jpegQuality: 70 |
| Dark-mode QA | darkMode: true |
| Thumbnails for a link directory | fullPage: false, format: jpeg, jpegQuality: 60 |
How much does it cost?
Pay per successful screenshot: $3.00 per 1,000 on the Free plan, $2.50 on Starter (Bronze), $1.75 on Scale (Silver), and $1.75 on Business (Gold). No platform-usage fees on top. Failed, blocked and error pages cost $0.
| Screenshots | Approx. price |
|---|---|
| 100 | $0.30 |
| 1,000 | $3.00 |
| 10,000 | $30.00 |
Tip: set Max total charge on the run to cap your spend. The Actor stops cleanly when it hits the cap.
Input
| Field | Default | Notes |
|---|---|---|
urls | – | List of URLs (example.com works too) |
viewport | desktop | desktop, laptop, tablet, mobile, custom |
fullPage | true | Whole page vs. visible area |
format | png | png or jpeg (jpegQuality 1–100) |
elementSelector | – | Capture a single element |
waitUntil / delayMs | load / 1000 | Wait for slow pages and animations |
scrollToBottom | true | Triggers lazy-loaded images |
hideCookieBanners / hideSelectors | true / [] | Cleaner shots |
maxFullPageHeight | 15000 | Very long pages are cut there (truncated: true) |
maxRetries / maxConcurrency | 2 / 3 | Reliability vs. speed |
proxyConfiguration | off | Optional Apify Proxy for geo views (billed by Apify separately) |
Example:
{"urls": ["https://apify.com", "https://en.wikipedia.org/wiki/Web_scraping"],"viewport": "mobile","fullPage": true,"format": "jpeg"}
Output
Images are saved to the run's key-value store. Each dataset row links to its image:
{"url": "https://www.python.org","finalUrl": "https://www.python.org/","httpStatus": 200,"title": "Welcome to Python.org","screenshotUrl": "https://api.apify.com/v2/key-value-stores/<id>/records/00002-www-python-org.jpg","format": "jpg", "viewport": "desktop", "width": 1920, "height": 2632,"truncated": false, "fileSizeBytes": 325632, "attempts": 1,"blocked": false, "charged": true, "error": null}
Download everything as JSON, CSV or Excel, or open the Screenshots table view with image previews.
Use it from code (API)
Run it synchronously and get the dataset back in one call:
curl -X POST "https://api.apify.com/v2/acts/blond_terrarium~bulk-website-screenshot/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"urls":["https://example.com"],"viewport":"mobile","fullPage":true}'
Node.js (apify-client):
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('blond_terrarium/bulk-website-screenshot').call({ urls: ['https://example.com'] });const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.map(i => i.screenshotUrl));
Python (apify-client):
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("blond_terrarium/bulk-website-screenshot").call(run_input={"urls": ["https://example.com"]})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["url"], item["screenshotUrl"])
Use it from AI agents (MCP)
Add the Apify MCP server (https://mcp.apify.com) to Claude, Cursor, ChatGPT or any MCP client and ask: "Take a mobile screenshot of example.com with blond_terrarium/bulk-website-screenshot." The agent gets back a screenshotUrl it can open or pass to a vision model. Set a Max total charge so an agent can never overspend.
Integrations
Zapier, Make, n8n, Google Sheets, Slack, webhooks, and scheduled runs all work out of the box through Apify integrations. A common recipe: Google Sheet of URLs → this Actor (weekly schedule) → Google Drive/Slack with the image links.
How it compares
| This Actor | Typical free/DIY screenshot scripts | |
|---|---|---|
| Pay only for successful screenshots | ✅ errors and blocked pages are $0 | ❌ you pay compute for failures too |
| Cookie banners hidden | ✅ major consent platforms | usually ❌ |
| Lazy-load scrolling before capture | ✅ | often ❌ (blank images) |
| One output row per input URL, with error reason | ✅ | partial |
| Device presets + element capture + dark mode | ✅ | varies |
| Predictable price per 1,000 | ✅ fixed per screenshot | depends on memory/runtime |
FAQ
Why did a URL fail? Look at the error column. Common reasons are a non-existent domain, an HTTP error page, a site that blocks automated browsers, or a page that never finished loading. You weren't charged for any of these.
How fast is it? Typically a few seconds per page; raise Parallel pages (maxConcurrency) for big lists.
How many URLs per run? Thousands. For very large lists, split into batches or set Max total charge to cap spend.
Can I get PDF or WebP? PNG and JPEG today. Open an issue if you need another format.
Can it screenshot pages behind a login? No. This Actor is for public pages only. Please respect each website's terms of use.
Does it accept cookies or click buttons? No. Consent banners are only hidden visually.
Internal or private addresses? Blocked for safety (localhost, 10.x, 192.168.x and so on).
Can I schedule it? Yes. Save your input as a Task and add a Schedule (daily, weekly, monthly) in Apify.
Something broken? Open an issue on the Issues tab with the URL and settings. Fixes usually ship within a few days.
Related tools by the same developer: Sitemap URL Extractor (get every URL of a site, then screenshot them here) and Broken Link Checker.