Bulk File Downloader - URL List or Dataset to Files & ZIP
Pricing
from $1.20 / 1,000 file downloadeds
Bulk File Downloader - URL List or Dataset to Files & ZIP
Download files in bulk from a URL list, CSV/JSON file, Google Sheet or Apify dataset field. Saves PDFs, images, audio and video with public links, SHA-256 and MIME type, or packs them into ZIP files. Filters, dedupe, retries. Pay only per file.
Pricing
from $1.20 / 1,000 file downloadeds
Rating
0.0
(0)
Developer
Cemal Atakli
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
10 hours ago
Last modified
Categories
Share
Bulk File Downloader – URL List or Dataset to Files & ZIP (PDF, Images, Video, Audio)
Download files in bulk from a list of URLs, a CSV/TXT/JSON file, a Google Sheet or another Actor's dataset. Each file is saved with a public download link and comes with its size, MIME type, SHA-256 hash and final URL. You can also get one ZIP of everything, split into parts if it's large. It handles any file type: PDF, JPG/PNG/WebP, MP4, MP3, ZIP, DOCX/XLSX, CSV, JSON and more.
- 4 ways to give URLs: paste a list, upload a CSV / TSV / TXT / JSON / JSONL file, link a Google Sheet, or chain another Actor by dataset ID with field paths like
images[*],pdfUrlorfiles[*].url - Public link for every file (
storedUrl), plus an optional ZIP64 archive (no 4 GB limit) that you can split into parts of N MB - Smart file names:
{index}_{name},{field:title},{field:sku}/{name}(folders inside the ZIP),{sha256_8},{host},{date} - Filters: allowed extensions, content types (
image/,application/pdf…), min/max file size. Oversized downloads are aborted early - SHA-256 deduplication: the same file under different URLs is saved once, and duplicates are free
- Robust: retries with exponential backoff (honours
Retry-After), timeouts, a per-host concurrency limit, and redirect tracking. It detects "HTML page instead of a file" (login walls, expired links) - You only pay for files that were saved. Errors, blocked URLs, skipped files and duplicates are free rows
- Cheap: $1.20 per 1,000 files + $0.0015 per 10 MB, HTTP-only, with no browser and no proxy
What can I use it for?
- Scraper output to files: download every product image, PDF datasheet or attachment that another Actor found (e-commerce, real estate, tenders, job ads, court records)
- Document collection: pull hundreds of PDFs, reports, invoices or filings from a spreadsheet of links
- Media archiving and backups: move your own assets from a CDN, bucket or old CMS (with custom headers for private endpoints)
- ML / AI datasets: collect images, audio or documents with clean names, hashes and no duplicates, ready for training or RAG ingestion
- Data migration: turn a Google Sheet of URLs into one ZIP organised in folders by SKU, category or customer
- Link checking with proof: keep the actual file, its SHA-256 and the final URL after redirects
How to use it
- Paste file URLs into File URLs (the prefill downloads 4 public-domain images from Wikimedia Commons and a small W3C sample PDF), or use URL list file, Google Sheet link or Apify dataset ID.
- Optional: set Field paths / column names, filters, the File name template and Create ZIP archive.
- Click Start. Each file appears in the Output tab with a download link. ZIPs and the run summary are in the key-value store (
files.zip,OUTPUT).
Input
| Field | Description |
|---|---|
urls | Direct file URLs (one per line) |
bulkText | Any pasted text; every http(s) URL in it is used |
urlListFile | Uploaded file or link to one: CSV/TSV (columns from fieldPaths, or all cells), JSON array (strings or objects), JSONL, TXT |
googleSheetUrl | Google Sheets share link (anyone with the link can view) or a "Publish to web" CSV link; #gid= selects the tab |
datasetId + fieldPaths | Chain with another Actor. Paths: pdfUrl, images[*], files[*].url, media.0.src, a.b[2]. Objects with url/src/href are understood. Empty = every URL in the row |
maxFiles | Stop after N saved files (0 = no limit) |
allowedExtensions, allowedContentTypes, minFileSizeKb, maxFileSizeMb | Filters (detected from file content, headers and URL) |
skipHtmlPages, dedupe | Skip "web page instead of file" responses; SHA-256 dedupe (both on by default) |
fileNameTemplate | {index}, {n}, {name}, {host}, {sha256}, {sha256_8}, {date}, {field:<column or path>}; / makes folders in the ZIP |
saveToKeyValueStore | One public link per file (default on). Turn off for ZIP only |
createZip, zipPartSizeMb, zipName, zipCompress | ZIP64 archive, optional split into files-001.zip, files-002.zip…, optional deflate |
keyValueStoreName | Save into a named store that is kept permanently |
includeSkipped | List filtered files and duplicates in the dataset (free) |
maxConcurrency, maxConcurrencyPerHost, requestTimeoutSecs, maxRetries, userAgent, headers | Advanced |
Example: download every product image and manual from a scraper run into one ZIP with a folder per SKU:
{"datasetId": "aBcD1234EfGh5678","fieldPaths": "images[*], manual.pdfUrl","fileNameTemplate": "{field:sku}/{field:title}_{n}","createZip": true,"saveToKeyValueStore": false}
Example: a CSV upload where the URLs are in the column file and the names come from title:
{"urlListFile": "https://example.com/my-links.csv","fieldPaths": "file","fileNameTemplate": "{field:title}","allowedExtensions": ["pdf", "jpg"]}
Output
One dataset row per URL. Export it as JSON, CSV, Excel or HTML, or read it through the API. The files are in the run's key-value store.
{"url": "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf","status": "downloaded","error": null,"fileName": "00005_dummy.pdf","storedUrl": "https://api.apify.com/v2/key-value-stores/aBcD1234EfGh5678/records/00005_dummy.pdf","key": "00005_dummy.pdf","zipFile": "files.zip","zipUrl": "https://api.apify.com/v2/key-value-stores/aBcD1234EfGh5678/records/files.zip","zipPath": "00005_dummy.pdf","index": 5,"source": "urls","sourceRow": null,"finalUrl": null,"httpStatus": 200,"contentType": "application/pdf","extension": "pdf","bytes": 13264,"sha256": "3df79d34abbca99308e79cb94461c1893582604d68329a41fd4bec1885e6adb4","durationMs": 65,"downloadedAt": "2026-10-16T19:46:03+00:00"}
status is one of:
downloaded: the file was saved (charged)failed: HTTP 404/403/5xx, timeout, DNS error or empty responseblocked: a social or video platform, or a private network addressskipped-size,skipped-type,skipped-extensionorskipped-html: removed by a filterduplicate: the same SHA-256 as an earlier file, withduplicateOfpointing to it
Only downloaded rows are charged. The OUTPUT record has the run summary: counts, bytes and the ZIP links.
Pricing
| Event | Price |
|---|---|
| File downloaded (primary) | $0.0012 ($1.20 per 1,000 files) |
| Every 10 MB of downloaded data | $0.0015 |
| ZIP archive created (per ZIP file) | $0.003 |
| Actor start | $0.00005 |
| Actor | 1,000 small files |
|---|---|
| This Actor | $1.20 |
| rationalistic_candle_ucn bulk file downloader | $2.00 (+ $0.001 / 10 MB) |
| automa-flow file downloader | $4.00 |
| nerolabs file downloader | $4.00 (+ $0.003 / 10 MB, $0.01 ZIP) |
Competitor prices are from the Apify Store on 16 October 2026 and may change. Failed, blocked, skipped and duplicate URLs are free. Set Maximum cost per run in the run options, and the Actor stops gracefully when it is reached (finished files and the ZIP are kept).
FAQ
Who is responsible for the files I download? You are. Only download files you have the right to download and use: your own files, public-domain or openly licensed content, data you are licensed to access, or other lawful uses. The Actor does not grant any rights to the files, and you must respect the source websites' terms of service and copyright.
Why are YouTube, TikTok, Instagram, Facebook, X/Twitter, Vimeo and similar URLs blocked? These platforms forbid downloading their content in their terms of service, so their pages and media CDNs (including redirects to them) are refused with a free blocked row. Use direct file links from sources you are allowed to download from.
Does it work with links that need a login? Only through the headers option for endpoints you control (e.g. Authorization: Bearer … for your own server or storage bucket). Login walls usually return an HTML page, which is reported as skipped-html.
What about Google Drive / Dropbox links? Use direct download links (Dropbox ?dl=1, Google Drive uc?export=download&id=… for small public files). Preview pages are HTML and are skipped.
How big can files be? The default limit is 500 MB per file and can be raised. Files are streamed to disk, and ZIPs use ZIP64, so archives larger than 4 GB work. For very large jobs, split the ZIP (zipPartSizeMb) and give the run more memory and time.
How long are files kept? Default run storage follows your plan's data retention. Set keyValueStoreName to keep files in a named store permanently.
Can I feed it URLs from another Actor? Yes. Set datasetId to that run's dataset ID and fieldPaths to the field(s) with URLs, e.g. images[*] or documents[*].url. Use {field:title} in the file name to keep names meaningful.
Use with AI agents / Apify MCP
- Apify MCP server: add
https://mcp.apify.com/?actors=gazidev/bulk-file-downloaderto Claude Desktop, Cursor, VS Code or any MCP client. An agent can then ask: "Download these 40 PDF links, zip them and give me the link." - API:
POST https://api.apify.com/v2/acts/gazidev~bulk-file-downloader/run-sync-get-dataset-items?token=...with{"urls": ["https://example.com/a.pdf"]}returns rows withstoredUrldownload links synchronously for small jobs. - Tip for agents: filter rows on
status == "downloaded"and usestoredUrlorzipUrl.sha256,bytesandcontentTypelet you verify or route files without downloading them again.