How to take bulk website screenshots from a URL list and save them to CSV or Google Drive
Updated 2026-10-28 ยท Tool used: Bulk Website Screenshot - Full Page PNG/JPEG from URL List on Apify ยท Price: $0.002 per saved screenshot ($2 per 1,000), no compute fees on top; unreachable pages, timeouts and HTTP errors are free
Agencies archiving client pages before a redesign, SEO teams documenting a migration, and sales teams adding a homepage thumbnail to every lead all need the same thing: a screenshot of each page in a list. Browser extensions do one tab at a time, and many screenshot APIs bill every request, including the ones that time out or return a 404.
This guide shows how to paste a list of URLs (or a whole sitemap), get one PNG or JPEG per page in a single run, and end up with a CSV where every row has the status code, page title, final URL after redirects and a direct screenshotUrl. It also shows how to move the images into Google Drive automatically, so they outlive the run storage.
Steps
- Paste your pages into
urls, one per line. Bare domains likeexample.comwork, and duplicates are removed. To capture a whole site, run the Sitemap Scraper first and feed itsurlcolumn in. - Choose
fullPage(scrolls once so lazy images load, capped atmaxFullPageHeight), adevice(desktop, laptop, tablet, mobile or custom) andpngor the 3-10x smallerjpeg. - Run it and export the dataset as CSV or Excel: one row per URL with
statusCode,title,screenshotUrlanderror. Failed rows are listed but not charged. - To keep the files in Google Drive, add a Make, Zapier or n8n scenario on the actor's Integrations tab that runs on success, downloads each
screenshotUrland uploads it to a Drive folder (the same works for Dropbox or S3). Images in run storage expire with your plan's retention (7 days on the free plan). - For dated archives or before/after comparisons, save the input as a task and add a daily or weekly Schedule.
Example input
{
"urls": [
"https://example.com",
"https://apify.com"
],
"fullPage": true,
"device": "desktop",
"format": "jpeg",
"jpegQuality": 80,
"hideCookieBanners": true
}
Example output (one item, shortened)
{
"input": "https://example.com",
"url": "https://example.com/",
"finalUrl": "https://example.com/",
"statusCode": 200,
"title": "Example Domain",
"screenshotUrl": "https://api.apify.com/v2/key-value-stores/MdP7oCEqlqnxkARdq/records/example-com-b559c7edd3.png?signature=...",
"screenshotKey": "example-com-b559c7edd3.png",
"format": "png",
"device": "desktop",
"width": 1920,
"height": 1080,
"fullPage": false,
"bytes": 64221,
"loadTimeMs": 1626,
"charged": true,
"error": null,
"takenAt": "2026-10-17T07:30:00.000Z"
}
Every run's dataset can be downloaded as JSON, CSV, Excel, XML or HTML from the Apify Console, or via https://api.apify.com/v2/datasets/<datasetId>/items?format=csv.
Run it from code
Python
from apify_client import ApifyClient # pip install apify-client
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run_input = {
"urls": [
"https://example.com",
"https://apify.com"
],
"fullPage": true,
"device": "desktop",
"format": "jpeg",
"jpegQuality": 80,
"hideCookieBanners": true
}
run = client.actor("tinyrex/bulk-website-screenshot").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)JavaScript / Node.js
import { ApifyClient } from 'apify-client'; // npm i apify-client
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('tinyrex/bulk-website-screenshot').call({
"urls": [
"https://example.com",
"https://apify.com"
],
"fullPage": true,
"device": "desktop",
"format": "jpeg",
"jpegQuality": 80,
"hideCookieBanners": true
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);curl (no SDK)
# Runs the actor and returns the results directly (CSV here; use format=json for JSON)
curl -X POST "https://api.apify.com/v2/acts/tinyrex~bulk-website-screenshot/run-sync-get-dataset-items?format=csv" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"urls": ["https://example.com", "https://apify.com"], "fullPage": true, "device": "desktop", "format": "jpeg", "jpegQuality": 80, "hideCookieBanners": true}' > results.csv
Get your API token in Apify Console โ Settings โ API & Integrations. The free Apify plan includes monthly credit that is enough to try this.
Use it from an AI agent (MCP)
The Apify MCP server exposes this actor as a tool for Claude, Cursor, VS Code, n8n and other MCP clients. Add this to your client's MCP config (or use the OAuth flow at mcp.apify.com instead of a token):
{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=tinyrex/bulk-website-screenshot",
"headers": {
"Authorization": "Bearer <YOUR_APIFY_TOKEN>"
}
}
}
}
Then ask in plain language, e.g. "Bulk website screenshots for this list and give me a table".
Pricing
Pay per result: $0.002 per saved screenshot ($2 per 1,000), no compute fees on top; unreachable pages, timeouts and HTTP errors are free. You can cap the cost of every run in the run options.
FAQ
How do I take screenshots of a list of URLs at once?
Paste the list into urls and run. Pages are captured three at a time by default in headless Chromium, and every URL gets a dataset row with its image link or the reason it failed. A few hundred pages usually finish in minutes.
How do I save website screenshots to Google Drive?
Each dataset row has a public screenshotUrl. Connect the actor's run-succeeded event to Make, Zapier or n8n, download every image from that column and upload it to a Drive folder. If you only need the links, export the dataset as CSV and import it into Google Sheets; the screenshotUrl column opens each image.
Can I get full-page and mobile screenshots?
Yes. Turn on fullPage for the whole scrollable page (default cap 10,000 px, up to 30,000) and set device to mobile (390x844 at 2x with a mobile user agent) or tablet. Run twice with different devices to get both versions of each page.
What does it cost, and are failed pages charged?
$0.002 per saved screenshot, which is $2 per 1,000, with platform usage already included. DNS errors, refused connections, timeouts, file downloads and pages that answer with HTTP 4xx or 5xx are free because no image is saved.
Does it remove cookie banners?
Common consent popups (OneTrust, Cookiebot, Didomi, Quantcast, Usercentrics, TrustArc and generic cookie bars) are hidden with CSS; nothing is clicked or accepted. Add extra selectors in hideSelectors for chat widgets or promo bars. Pages behind a login, paywall or CAPTCHA can't be captured.
More guides
- Bulk tech stack lookup: a Wappalyzer / BuiltWith alternative for thousands of domains
- How to scrape Greenhouse, Lever and Ashby jobs (plus Personio, Teamtailor, Recruitee)
- How to export all products from any Shopify store to CSV or JSON
- How to scrape jobs from Workday career sites (myworkdayjobs.com)
- How to export products from any WooCommerce store to CSV or JSON
- How to export EU public tenders from TED (Tenders Electronic Daily) to CSV or JSON
- How to scrape remote jobs from Himalayas, Remote OK, We Work Remotely and more in one run
- How to export open EU funding calls (Horizon Europe, Digital Europe, cascade funding) to CSV or JSON
- How to turn any RSS or Atom feed into JSON or CSV (bulk, with monitoring)
- How to extract emails, phone numbers and social links from a list of company domains
- How to export US federal (SAM.gov) and UK (Contracts Finder) tenders to CSV or JSON
- How to look up French companies by SIREN or SIRET and build a B2B list from Sirene
- How to look up Norwegian companies by organisation number and build lead lists from Brreg
- How to download SEC filings (10-K, 10-Q, 8-K, Form 4) by ticker and search EDGAR full text
- How to validate NPI numbers in bulk and build US healthcare provider lists from NPPES
- How to look up hundreds of UK companies on Companies House at once (profile, officers, PSC)
- How to look up Finnish companies by Y-tunnus and build B2B lead lists from the YTJ register
- How to extract all URLs from a website's sitemap (and find broken links)
- How to transcribe hundreds of audio and video files to text and subtitles with Whisper
- How to extract text from hundreds of PDFs, including scanned ones, in one run
- How to clean an email list before a campaign: bulk MX, disposable and typo check
- How to get Dutch public tenders from TenderNed into a spreadsheet, with daily alerts
- How to audit titles, meta descriptions, H1s and canonicals for hundreds of pages at once
- How to find every broken link and redirect on a website, with the pages to fix
- How to validate LEI codes and find the LEI for a list of companies in bulk
- How to run Lighthouse on hundreds of URLs and get Core Web Vitals in one table