Bulk Image Downloader - URLs, Pages & Datasets to ZIP avatar

Bulk Image Downloader - URLs, Pages & Datasets to ZIP

Pricing

from $1.05 / 1,000 results

Go to Apify Store
Bulk Image Downloader - URLs, Pages & Datasets to ZIP

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

Martin Petrov

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 hours ago

Last modified

Security

Limited permissions

Share

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>, lazy data-src, the largest srcset size, og:image, links to image files).
  • Any Apify dataset (datasetId or the Integrations tab): image fields are found automatically, also nested lists like images[].url or media.photos[]. File names can come from a field such as sku, asin or title.

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 ApifyClient
client = 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)

  1. Open your scraper (products, real estate, Google Maps, social posts) in Apify Console -> Integrations tab.
  2. Add integration -> Actor -> pick this actor, set Dataset to {{resource.defaultDatasetId}}, optionally nameField (e.g. sku) and monitorId.
  3. 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.