Bulk Image Downloader - URLs, Pages & Datasets to ZIP
Pricing
from $1.05 / 1,000 results
Bulk Image Downloader - URLs, Pages & Datasets to ZIP
Download images in bulk from image URLs, web pages (img, srcset, og:image) or any Apify dataset (images found automatically, file names from SKU). Public link per file + images.zip. Duplicates by SHA-256 are skipped and not charged, icons filtered, optional resize and WebP/JPG/PNG conversion. 300 im
Pricing
from $1.05 / 1,000 results
Rating
0.0
(0)
Developer
Martin Petrov
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 hours ago
Last modified
Categories
Security
Limited permissionsShare
Problem: your scraper gave you thousands of image links (products, listings, posts), but you need the actual files: stored, named by SKU, without duplicates, maybe resized to WebP, and as one ZIP. Doing it by hand or with a script means retries, rate limits, broken links and disk space.
This actor downloads every image for you from three kinds of input, in any mix:
- Image URLs: direct links, one per line.
- Web pages: every image on the page (
<img>, lazydata-src, the largestsrcsetsize,og:image, links to image files). - Any Apify dataset (
datasetIdor the Integrations tab): image fields are found automatically, also nested lists likeimages[].urlormedia.photos[]. File names can come from a field such assku,asinortitle.
Each file is stored in the run's key-value store with a public link (one result row per file), and all files are packed into images.zip.
Measured: 300 images from 15 pages in 8.7 s (about 2,000 images per minute, 100 MB RAM) with 12 parallel downloads.
What you get that other downloaders don't
- Duplicates are free: the same picture under different URLs (CDN sizes, mirrors) is stored once (SHA-256 of the content) and is not charged.
- No per-MB fee: one flat price per stored file. Failed links, skipped icons and duplicates cost nothing.
- Icons and tracking pixels skipped (min width / height, default 50 px).
- Resize + convert: keep the original, or convert to JPG / WebP / PNG with a max width (for example 2400 px JPG -> 800 px WebP: 505 KB -> 79 KB).
- Only-new mode (
monitorId): scheduled runs skip every URL stored before, so you pay only for new images. - Polite and honest: max 6 parallel downloads per host, retries with back-off on 429/5xx, honest User-Agent, no proxies, no logins.
Input example
{"pageUrls": ["https://books.toscrape.com/"],"urls": ["https://picsum.photos/id/237/800/600"],"outputFormat": "webp","maxWidth": 1200,"createZip": true,"monitorId": "my-shop-images"}
Download the images of another actor's run (for example a product scraper), named by SKU:
{"datasetId": "YOUR_DATASET_ID","imageFields": ["images"],"nameField": "sku","fileNaming": "name"}
Output example (one row per stored file)
{"sourceUrl": "https://books.toscrape.com/media/cache/2c/da/2cdad67c44b002e7ead0cc35693c0e8b.jpg","fileUrl": "https://api.apify.com/v2/key-value-stores/STORE_ID/records/2cdad67c44b002e7ead0cc35693c0e8b.jpg","key": "2cdad67c44b002e7ead0cc35693c0e8b.jpg","fileName": "2cdad67c44b002e7ead0cc35693c0e8b.jpg","contentType": "image/jpeg","bytes": 9876,"originalBytes": 9876,"width": 125,"height": 155,"format": "jpg","sha256": "4752d0ef411fb1c4aad31d69425d075c219345c386fd94f43ddfbf4495ea0437","name": null,"position": null,"foundOn": "https://books.toscrape.com/","downloadedAt": "2026-11-06T00:58:14Z"}
The ZIP link is in the run's OUTPUT record and in the status message: https://api.apify.com/v2/key-value-stores/STORE_ID/records/images.zip (big runs: images-2.zip, images-3.zip ..., part size set by zipPartMb). RUN_SUMMARY lists counts (stored, duplicates, small, failed), failed links with the reason, and lastError.
Use it from the API
curl -X POST "https://api.apify.com/v2/acts/martin10291~bulk-image-downloader/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"urls": ["https://picsum.photos/id/237/800/600"], "pageUrls": ["https://books.toscrape.com/"]}'
from apify_client import ApifyClientclient = ApifyClient("YOUR_TOKEN")run = client.actor("martin10291/bulk-image-downloader").call(run_input={"pageUrls": ["https://books.toscrape.com/"], "outputFormat": "webp", "maxWidth": 1200})for f in client.dataset(run["defaultDatasetId"]).iterate_items():print(f["fileUrl"], f["width"], f["height"])print(client.key_value_store(run["defaultKeyValueStoreId"]).get_record("OUTPUT")["value"]["zip"])
Use it as an integration (chain it after another actor)
- Open your scraper (products, real estate, Google Maps, social posts) in Apify Console -> Integrations tab.
- Add integration -> Actor -> pick this actor, set Dataset to
{{resource.defaultDatasetId}}, optionallynameField(e.g.sku) andmonitorId. - Every time the scraper finishes, its images are downloaded, deduplicated and zipped automatically.
Schedule it (only new images, daily)
Create a Schedule (daily or hourly) with the same input and a fixed monitorId. Each run downloads only images that were not stored before: a daily snapshot of new product photos, listing photos or page images, without paying twice.
Use it from AI agents (MCP)
The actor works through the Apify MCP server (https://mcp.apify.com), so Claude, ChatGPT, Cursor or any MCP client can call it as a tool: "download all images from this page as WebP and give me the ZIP link".
Pricing
$1.50 per 1,000 stored files (pay per result). Duplicates, skipped icons, non-images and failed links are not charged. No per-MB fee (files up to maxFileMb, default 25 MB).
FAQ
- Which sites work? Any public image link or page reachable without a login. Pages that build images only with JavaScript after load may give fewer images; then use their dataset (from a browser scraper) as input.
- Social media, YouTube, Instagram? Not supported as pages (they need logins/proxies). Give direct image links from your own data instead.
- How long are files kept? As long as the run's storage is kept by your Apify plan. Download the ZIP or move files to your storage.
- Why was a link skipped? See
RUN_SUMMARY:failedExamples(HTTP errors, too big),skippedSmall,skippedDuplicate,skippedType. - Is it legal to download? You are responsible for having the right to use the images. The actor only downloads public files you point it to, with an honest User-Agent.