Bulk File Downloader: Download Files & Images from URLs
Pricing
from $2.00 / 1,000 file downloadeds
Bulk File Downloader: Download Files & Images from URLs
Download files (images, PDFs, CSVs, archives) from a list of direct URLs into Apify storage. Use for stored copies or stable links. Input: urls, optional maxFileSizeMb, allowedContentTypes. Output per file: download URL, content type, size, HTTP status, SHA-256. No crawling; video sites refused.
Pricing
from $2.00 / 1,000 file downloadeds
Rating
0.0
(0)
Developer
Phaux
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
a day ago
Last modified
Categories
Share
Bulk File & Image Downloader: URLs to Storage
Paste a list of file URLs and get every file saved to Apify storage with a direct download link, content type, size, HTTP status and SHA-256 hash. Images, PDFs, CSV and Excel files, ZIP archives, audio: any direct file link works. It downloads only the URLs you give and never crawls.
Quick start for AI agents and API users
- What it does: Download files (images, PDFs, CSVs, archives) from a list of direct URLs into Apify storage.
- When to use it: For stored copies or stable links.
- Example input (the form's prefill; it finishes in under a minute):
{"urls": ["https://www.python.org/static/img/python-logo.png","https://raw.githubusercontent.com/datasets/country-list/main/data.csv"]}
- Example output: one real dataset row from run
L1PzvgZwrka7QhpOU(2026-10-23), with long fields shortened and empty fields left out. Fields not shown are listed in the output table below.
{"url": "https://www.python.org/static/img/python-logo.png","finalUrl": "https://www.python.org/static/img/python-logo.png","status": 200,"key": "00000-python-logo-9c121e61.png","fileUrl": "https://api.apify.com/v2/key-value-stores/fanC1OY4771KdYuO3/records/00000-python-logo-9c121e61.png?signature=1y9yZo07DY4SXI0yaDz8K","fileName": "python-logo.png","contentType": "image/png","sizeBytes": 15770,"sha256": "9c121e619bfe02eaba582d7080eea46fd53ec0b50717e6794a948fada4ae8f3c","redirectCount": 0,"downloadMs": 10,"downloadedAt": "2026-10-23T19:10:24Z"}
- Cost (pay per event, Free-plan prices): File downloaded $0.002; 10 MB transferred $0.001. Failed items are not charged.
- From an AI agent: with the Apify MCP server, call
call-actorwith actorphaux/bulk-file-downloader, or load it as its own tool withhttps://mcp.apify.com?tools=phaux/bulk-file-downloader. Read results withget-dataset-items.
What does Bulk File & Image Downloader do?
- Downloads each URL once (duplicates removed), following up to 5 redirects, and stores the file in the run's key-value store under a readable key (
00007-product-photo-3f9a1c2b.jpg). - Returns one dataset item per stored file:
fileUrl(direct link),fileName,contentType,sizeBytes,status,sha256,finalUrlandredirectCount. - Size caps: files over
maxFileSizeMb(default 25 MB, up to 200 MB) are refused before or during download and not charged. - Type filter:
allowedContentTypessuch asimage/*orapplication/pdf. Web pages (often login, consent or error pages) are refused unless you allow HTML. - Clear failure report: every URL that wasn't stored is listed in
FAILED_URLSwith a reason code.
Why use it?
- Archive product images, documents or data files from a URL list exported by a scraper, a spreadsheet or a CMS.
- Verify files with
sha256andsizeBytes, and spot broken links viaFAILED_URLS. - Pay only for stored files; failed, refused and filtered URLs are free.
- Polite and safe: one request at a time per host, robots.txt honoured, private addresses blocked.
Use cases: image datasets for e-commerce or ML, backing up attachments and PDFs, collecting public reports, and turning URL columns from other Actors' results into stored files.
How to use it
- Paste direct file URLs into File URLs, one per line (up to 100,000). Empty input downloads two small example files.
- Optionally set Max file size, Allowed content types and Max files.
- Run it. Open the Downloaded files view for direct links, or the Image preview view for thumbnails.
- Download individual files from
fileUrl, or the whole key-value store from the run's Storage tab.
Input
{"urls": ["https://www.python.org/static/img/python-logo.png", "https://raw.githubusercontent.com/datasets/country-list/main/data.csv"],"maxFileSizeMb": 25,"allowedContentTypes": ["image/*", "text/csv", "text/plain"],"maxItems": 0,"requestIntervalSecs": 0.5}
| Field | Type | Default | Description |
|---|---|---|---|
urls | array | — | Direct links to files (images, PDFs, CSV, ZIP...), one per line, up to 100,000. Duplicates are removed. Empty = a small example run. |
maxFileSizeMb | integer | 25 | Larger files are refused before or during download (code too_large) and not charged. 1–200 MB. Files are held in memory while stored, so big limits download fewer files in parallel. |
allowedContentTypes | array | — | Only store files of these types, e.g. image/*, application/pdf, text/csv. Empty = any type except web pages. |
allowHtml | boolean | false | Off (default): a URL that returns a web page instead of a file (often a login, consent or error page) is refused and not charged. |
keyPrefix | string | — | Optional prefix for the key-value store keys (letters, digits and !-_.'() only). |
maxItems | integer | 0 | Stop after this many files are stored (0 = all). Also caps the cost of a run. |
requestIntervalSecs | number | 0.5 | Politeness delay per host (0.2–30 s). A robots.txt Crawl-delay overrides it when longer. |
maxConcurrency | integer | 8 | Downloads in flight across different hosts (1–32). One host is always served one request at a time. |
timeBudgetSecs | integer | 0 | Stop starting new downloads after this many seconds and keep what is stored (0 = only the run timeout guard). |
Output example
{"url": "https://www.python.org/static/img/python-logo.png","finalUrl": "https://www.python.org/static/img/python-logo.png","status": 200,"key": "00000-python-logo-9c121e61.png","fileUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/00000-python-logo-9c121e61.png?signature=…","fileName": "python-logo.png","contentType": "image/png","sizeBytes": 15770,"sha256": "9c121e61…","redirectCount": 0,"downloadMs": 85,"downloadedAt": "2026-10-20T21:31:45Z"}
Output fields
| Field | Type | Description |
|---|---|---|
url | string | URL from your input. |
finalUrl | string | URL after redirects. |
status | integer | HTTP status of the download (200). |
key | string | Key of the stored file in the run's default key-value store. |
fileUrl | string | Direct link to the stored file in Apify storage. |
fileName | string | File name from Content-Disposition or the URL path. |
contentType | string | Content-Type returned by the server. |
sizeBytes | integer | Size of the stored file in bytes. |
sha256 | string | SHA-256 hash of the file (hex), for integrity checks and de-duplication. |
redirectCount | integer | Number of redirects followed (max 5). |
downloadMs | integer | Download time in milliseconds. |
downloadedAt | string | UTC time of the download. |
FAILED_URLS reason codes: invalid_url, platform_host, blocked_host, robots_disallowed, http_error, too_large, html_response, content_type_not_allowed, empty_file, rate_limited, host_stopped, dns_error, network_error, timeout, too_many_redirects, time_budget, not_attempted. RUN_STATS has the totals.
How much does it cost?
Pay per event, the same on every Apify plan. Apify platform usage is included.
| Event | Price |
|---|---|
| File downloaded (per stored file) | $0.002 |
| 10 MB transferred (per started 10 MiB of a stored file, minimum one per file) | $0.001 |
Examples: a 300 KB image costs $0.003; a 25 MB file costs $0.005 ($0.002 + 3 × $0.001); 1,000 small images cost $3.00. Failed, refused and filtered URLs are never charged. Use Max files to cap a run.
Use with AI agents, MCP and the API
- MCP: add
https://mcp.apify.com?tools=phaux/bulk-file-downloaderto an MCP client and ask, for example, "download these 20 image URLs and give me links". - API:
POST https://api.apify.com/v2/acts/phaux~bulk-file-downloader/run-sync-get-dataset-itemswith{"urls": ["https://www.python.org/static/img/python-logo.png"]}returns the file list directly. - Every input and output field is described in the input and dataset schemas.
Data source and compliance
- Downloads only the URLs you provide. It never crawls, never follows links inside files or pages, and never logs in.
- You are responsible for having the right to download and store the files (copyright and licence terms of the source).
- Video and social platforms are refused (YouTube, TikTok, Instagram, Facebook, X/Twitter, Vimeo and similar), because their terms don't allow downloading their media with third-party tools.
- robots.txt is honoured (RFC 9309) for the user agent
PhauxFileDownloader; disallowed files are listed asrobots_disallowed. - Polite pacing: one request at a time per host, at least
requestIntervalSecsapart (default 0.5 s). After an HTTP 429 a host is not contacted again in that run. No proxies, no IP rotation, and no attempts to get around bot protection. - Only public
http(s)hosts are fetched; private and internal addresses are refused on every redirect hop.
Limits
- Up to 100,000 URLs and 200 MB per file per run. Whole files are held in memory while being stored, so large size limits download fewer files in parallel; raise the run memory (up to 4 GB) for big files.
- Files are kept for the data retention period of your Apify plan; download what you need to keep.
- Pages that need JavaScript or a login to reveal the file can't be downloaded; use direct file links.
FAQ
- "html_response"? The URL returned a web page instead of a file, often a login, cookie-consent or error page. Use the direct file link, or switch on Store HTML pages too if you really want the page.
- How do I download everything at once? Open the run's key-value store in Console and export it, or loop over
fileUrlin the dataset. - Can I keep the original file names?
fileNameholds the original name; the key adds a sequence number and a short hash so names never collide. - Something isn't working? Open an issue on the Issues tab with the run ID.