Bulk Image Downloader – Download Images, Resize & WebP avatar

Bulk Image Downloader – Download Images, Resize & WebP

Pricing

from $1.00 / 1,000 images

Go to Apify Store
Bulk Image Downloader – Download Images, Resize & WebP

Bulk Image Downloader – Download Images, Resize & WebP

Download thousands of images from a URL list or any scraper dataset. Resize, convert to WebP/JPEG/PNG, skip duplicates and icons, get one ZIP. $1 per 1,000 images; failed downloads free.

Pricing

from $1.00 / 1,000 images

Rating

0.0

(0)

Developer

Tidyrun

Tidyrun

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

3

Monthly active users

2 hours ago

Last modified

Share

Bulk Image Downloader – Resize & WebP

Download thousands of images in one run from a list of URLs or straight from any scraper's dataset. Each image is saved as a file with a clickable link, and you can optionally resize, convert to WebP/JPEG/PNG, skip duplicates and tiny icons, and get everything in one ZIP.

$1 per 1,000 images saved. Failed downloads, duplicates and skipped icons are free.

Quick start

  1. Paste image links into Image URLs (or upload a text file with one URL per line), or pick a scraper's dataset in Take image URLs from a dataset.
  2. Optional: choose Convert to WebP, set Max width / Max height, tick ZIP all images.
  3. Click Start. The Output tab shows every image as a preview with its size, and a link to the file.

Input example (URL list):

{
"imageUrls": [
{ "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/97/The_Earth_seen_from_Apollo_17.jpg/960px-The_Earth_seen_from_Apollo_17.jpg" },
{ "url": "https://upload.wikimedia.org/wikipedia/commons/b/bd/Lorine_Niedecker_reading_by_river.webp" }
],
"convertTo": "webp",
"maxWidth": 1200,
"zip": true
}

Input example (images from a scraper run, e.g. a product scraper whose items have images: [{ "url": ... }]):

{
"datasetId": "YOUR_SCRAPER_RUN_DATASET_ID",
"urlField": "images.url",
"minWidth": 100
}

urlField accepts a field holding one URL, a list of URLs, or objects with url/src. Dot paths work: imageUrl, images.0.url (first image only), images.url (every image). Leave it empty and the Actor finds image links on its own.

One output row per image:

{
"sourceUrl": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/97/The_Earth_seen_from_Apollo_17.jpg/960px-The_Earth_seen_from_Apollo_17.jpg",
"status": "saved",
"fileUrl": "https://api.apify.com/v2/key-value-stores/.../records/960px-The_Earth_seen_from_Apollo_17-129fefd01b.webp?signature=...",
"key": "960px-The_Earth_seen_from_Apollo_17-129fefd01b.webp",
"contentType": "image/webp",
"width": 960,
"height": 961,
"bytes": 192974,
"originalBytes": 267290,
"originalFormat": "jpeg",
"sha256": "5d0c…",
"recordIndex": null,
"error": null
}

status is saved, duplicate (same file as an earlier row; fileUrl points to that copy), skipped (below the minimum size) or failed (with an error that says what to fix). recordIndex is the position of the source item in your dataset, so you can join images back to the scraped records. fileUrl opens in any browser without an API token.

Why this one

Common problemWhat happens here
Images are inside another scraper's resultsPick the dataset and the field (dot paths like images.url work); every row keeps the dataset record index.
"Out of memory" on big batchesImages are handled a few at a time with limits that follow the run's memory; a very large image gets a clear error instead of crashing the run.
Same picture downloaded many timesURLs are downloaded once, and identical files (same SHA-256) are saved once. Duplicates are free.
Logos, icons and tracking pixels mixed inMin width / Min height skips them, free of charge.
Files too big for your site or appMax width / Max height shrinks them (aspect ratio kept, never enlarged); WebP is usually 25–35% smaller than JPEG.
Getting files out of ApifySigned fileUrl links that open anywhere, plus an optional single images.zip.
Paying for broken links404s, web pages instead of images, blocked or oversized files are never charged.

Pricing

EventPrice
Image saved (files over 5 MB count one more per started 5 MB)$0.001
ZIP, per started 100 MB of ZIP file (runs over 1 GB get several ZIP parts)$0.02

So 1,000 normal images cost $1; a 12 MB photo counts as 3 images. Use Max width/height or WebP to keep files small and cheap. Failed downloads, duplicates and skipped images are free, and the run stops cleanly at your maximum charge limit.

Call it from your code

curl -X POST "https://api.apify.com/v2/acts/tidyrun~image-download/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"imageUrls":[{"url":"https://upload.wikimedia.org/wikipedia/commons/thumb/9/97/The_Earth_seen_from_Apollo_17.jpg/960px-The_Earth_seen_from_Apollo_17.jpg"}],"convertTo":"webp"}'

To run it automatically after a scraper, add it as an integration on the scraper's page and set Take image URLs from a dataset to {{resource.defaultDatasetId}}.

Tips

  • Keep original format with no resize saves each file byte for byte, which is the fastest and cheapest mode.
  • Converting many full-size photos is CPU work: run with 2 GB memory for those; it finishes faster for about the same cost.
  • SVG files stay SVG with "keep"; they are rendered to pixels when you convert or resize. Animated GIFs stay animated when converted to WebP.
  • The run summary (OUTPUT in the key-value store) has the counts and the ZIP link.

Responsible use

This Actor downloads public image files with a plain HTTP request that identifies itself as TidyrunImageDownloader/1.0, at most 4 at a time per site, and slows down when a site asks it to (HTTP 429). It does not log in, solve CAPTCHAs, or get around hotlink protection or bot walls; such images are reported as errors and not charged. Make sure you have the right to download and store the images you list, and respect each site's terms and copyright.