Bulk Image Downloader – Download Images, Resize & WebP
Pricing
from $1.00 / 1,000 images
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
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
3
Monthly active users
2 hours ago
Last modified
Categories
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
- 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.
- Optional: choose Convert to WebP, set Max width / Max height, tick ZIP all images.
- 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 problem | What happens here |
|---|---|
| Images are inside another scraper's results | Pick the dataset and the field (dot paths like images.url work); every row keeps the dataset record index. |
| "Out of memory" on big batches | Images 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 times | URLs are downloaded once, and identical files (same SHA-256) are saved once. Duplicates are free. |
| Logos, icons and tracking pixels mixed in | Min width / Min height skips them, free of charge. |
| Files too big for your site or app | Max width / Max height shrinks them (aspect ratio kept, never enlarged); WebP is usually 25–35% smaller than JPEG. |
| Getting files out of Apify | Signed fileUrl links that open anywhere, plus an optional single images.zip. |
| Paying for broken links | 404s, web pages instead of images, blocked or oversized files are never charged. |
Pricing
| Event | Price |
|---|---|
| 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 (
OUTPUTin 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.