Bulk File Downloader - Parallel URL Downloads to Storage
Pricing
from $1.00 / 1,000 file downloadeds
Bulk File Downloader - Parallel URL Downloads to Storage
Download thousands of files, images and PDFs from a URL list or another actor's dataset in parallel, with SHA-256 hashes, public links and an optional ZIP.
Pricing
from $1.00 / 1,000 file downloadeds
Rating
0.0
(0)
Developer
Seemu Scraping
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
4
Monthly active users
6 days ago
Last modified
Categories
Share
Download thousands of files from a list of URLs, or straight from another actor's dataset, in parallel. Images, PDFs, documents, audio, video and archives are saved to Apify storage with public download links and SHA-256 hashes. You can also get everything in one ZIP.
What you get
- Every file saved in the run's key-value store with the correct content type, ready to download or hotlink
- One row per URL in the dataset:
url,status(ok / failed),fileName,kvKey,downloadUrl,contentType,sizeBytes,sha256,durationMs,attempts,httpStatus,finalUrl,error - Optional ZIP archive (
files.zip) with every downloaded file, built as the run goes so memory use stays low - Smart file names: taken from the server's
Content-Dispositionheader or the URL, with the right extension worked out from the file type (animage.phpthat returns a JPEG is saved as.jpg). Duplicate names get-2,-3suffixes - Clear failure reasons: 404s, timeouts, oversized files and invalid URLs each get a readable error in the dataset, and the rest of the run carries on
- Export the results table to JSON, CSV, Excel or Google Sheets from the Apify console
Use cases
- Download product images from an e-commerce or marketplace scraper's output
- Archive social media media: profile pictures, post images and thumbnails from a social media scraper's dataset
- Bulk PDF download of reports, invoices, filings or research papers from a URL list
- Build machine-learning image datasets with SHA-256 hashes for deduplication
- Back up website assets or move files between systems through one ZIP
How to use
- Paste your file URLs into File URLs, one per line, and/or
- Enter a Dataset ID from a previous run and the Dataset field that holds the URLs (for example
imageUrl,imagesorimages.url) - Optionally switch on Bundle everything into one ZIP
- Run the actor. Files appear in the Key-value store tab and one result row per URL appears in the Dataset tab
Chaining from another actor
Most scrapers output image or file URLs in a column. Copy the dataset ID from that run's Storage tab, paste it into Dataset ID and enter the column name in Dataset field. Dotted paths and arrays are supported:
| Dataset item | Dataset field |
|---|---|
{"imageUrl": "https://…"} | imageUrl |
{"images": ["https://…", "https://…"]} | images |
{"images": [{"url": "https://…"}, …]} | images.url or images |
{"media": {"photo": {"src": "https://…"}}} | media.photo.src |
You can also run this actor automatically after another one with an Apify integration (webhook) and pass datasetId in the input.
File name template
Use {index} (position in the list, zero-padded), {name} (original name without extension) and {ext} (detected extension):
{name}givesIMG_2045.jpg(default){index}-{name}gives0007-IMG_2045.jpg, which keeps the input order when sortedproduct-{index}.{ext}givesproduct-0007.jpg
Only the characters a-z A-Z 0-9 ! - _ . ' ( ) are allowed in storage keys. Others are replaced with -.
Input options
| Field | Default | Description |
|---|---|---|
| File URLs | none | Direct file links, one per line |
| Dataset ID / field | none / url | Read URLs from another run's dataset |
| Max files | 0 (all) | Cap the number of URLs processed |
| Skip duplicate URLs | on | Download each distinct URL once |
| Bundle into ZIP | off | Also store files.zip with everything |
| File name template | {name} | See above |
| Parallel downloads | 10 | 1-50 files at once |
| Max file size (MB) | 100 | Larger files are skipped with an error; 0 = no limit |
| Timeout per file | 60 s | Per download attempt |
| Retries per file | 2 | For network errors, timeouts, 429 and 5xx |
| Proxy | off | Optional Apify Proxy or your own proxies |
Output format
Each dataset row:
{"index": 1,"url": "https://picsum.photos/id/10/800/600","status": "ok","fileName": "10-800x600.jpg","kvKey": "10-800x600.jpg","downloadUrl": "https://api.apify.com/v2/key-value-stores/abc123/records/10-800x600.jpg","contentType": "image/jpeg","sizeBytes": 69637,"sha256": "4265dda7ddcd61eb7fefc9f3d399fd383ce7331c4ad0a6b1065821f7e873c0a0","durationMs": 485,"attempts": 1,"httpStatus": 200,"finalUrl": "https://fastly.picsum.photos/id/10/800/600.jpg","error": null,"downloadedAt": "2026-10-12T02:50:12.813Z"}
Failed rows have status: "failed" and an error such as HTTP 404 Not Found, Timed out or File is 20.0 MB, larger than the 15 MB limit (maxFileSizeMb).
The ZIP is stored as files.zip in the key-value store, or under your custom ZIP file name.
Pricing
You pay per file actually saved, plus per megabyte downloaded (rounded up per file, so a 300 KB image counts as 1 MB). Failed downloads, 404s and skipped files are free. If you route downloads through residential proxy, a per-MB proxy surcharge applies. Datacenter proxy and your own proxies add no surcharge.
Limits and tips
- File size: single files of 100 MB and more are supported (raise Max file size above the 100 MB default when you need them). Big files take longer, and the run's disk is limited by its memory setting. For many files over 100 MB, raise the run memory.
- ZIP: built on disk as files finish, so memory stays low. The ZIP needs disk space roughly equal to the total download size. For multi-GB batches, give the run more memory or skip the ZIP and download files individually.
- Speed: 10 parallel downloads is a good default. Raise it to 30-50 for many small images on a fast CDN. Lower it if a site returns 429 (Too Many Requests).
- Blocked downloads (403): the actor automatically retries once with browser-like headers. If a site still blocks you, turn on a proxy.
- Run timeout: if the run gets close to its timeout, the remaining URLs are written to the dataset as
failedwith the message Not attempted. Filter those rows and run them again. - Only direct file URLs are supported. Web pages are saved as
.htmlfiles and are not crawled for images.
FAQ
Can I download images from a Google Sheet or CSV? Yes. Paste the URL column into File URLs, or import the sheet into a dataset first and use Dataset ID.
How do I get all files at once? Turn on Bundle everything into one ZIP and download files.zip from the Key-value store tab.
Are file contents changed? No. Files are stored byte for byte. Use the sha256 field to verify them or to find duplicates.