Bulk File & Image Downloader — URLs, Drive, Dropbox to ZIP
Pricing
from $1.00 / 1,000 file downloadeds
Bulk File & Image Downloader — URLs, Drive, Dropbox to ZIP
Download files and images from a list of URLs, a CSV / Google Sheet, a dataset or web pages into storage, with a public link, size and sha256 for each, and optional ZIP archives. Google Drive, Dropbox and OneDrive share links work. $1 per 1,000 files + $0.25 per GB.
Pricing
from $1.00 / 1,000 file downloadeds
Rating
0.0
(0)
Developer
Salih Küçükkayış
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
5 hours ago
Last modified
Categories
Share
Download files and images in bulk. Give a list of URLs, a CSV or Google Sheet, the dataset of another Actor, or web pages, and every file is saved to the run's storage with a public download link, its content type, size and sha256. Google Drive, Dropbox, OneDrive and SharePoint share links work as they are, and you can also get everything as ZIP archives. One output row per URL, so it plugs straight into n8n, Make, Zapier or your own code.
$1 per 1,000 files, with the first 10 MB of every file included; bigger files add $0.25 per GB (in started 10 MB steps). Failed downloads, skipped files, refused links and duplicates of a file already stored in the run are free. No subscription, no platform usage fees. (Plus a tiny start fee of $0.00005 per GB of run memory: $0.00005 per run at the default 1 GB.)
Quick start
Press Start with the example input. It downloads a sample PDF and two public-domain images:
{"urls": ["https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf","https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png","https://upload.wikimedia.org/wikipedia/commons/a/a9/Example.jpg"]}
Share links and a ZIP of everything:
{"urls": ["https://drive.google.com/file/d/1AbC.../view?usp=sharing","https://www.dropbox.com/scl/fi/abc123/report.pdf?rlkey=xyz&dl=0","https://1drv.ms/b/s!Ab..."],"zip": true}
All images and PDFs on some web pages:
{"pageUrls": ["https://www.example.com/press-kit"],"fileTypes": ["jpg", "png", "webp", "pdf"],"maxFilesPerPage": 200}
A Google Sheet with a column of links (share it as "Anyone with the link"):
{"csvUrl": "https://docs.google.com/spreadsheets/d/1XyZ.../edit#gid=0","urlColumn": "image_url","maxFileSizeMb": 50}
One row per URL (example, values are illustrative):
{"url": "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf","finalUrl": "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf","status": "ok","error": null,"httpStatus": 200,"fileName": "dummy.pdf","key": "dummy-1a2b3c4d5e.pdf","fileUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/dummy-1a2b3c4d5e.pdf","contentType": "application/pdf","bytes": 13264,"sha256": "<64 hex characters>","sourcePage": null,"duplicateOf": null}
What it does
- Many sources: a list of URLs, a public CSV or Google Sheet (
csvUrl+urlColumn), an Apify dataset (datasetId+urlField, nested fields likeimage.urland lists of links work), and web pages (pageUrls). Duplicate URLs are downloaded once. - Share links become downloads: Google Drive file links, Google Docs / Sheets / Slides (saved as .docx / .xlsx / .pptx), Dropbox (
/s/and/scl/fi/links), OneDrive (1drv.ms,onedrive.live.com) and SharePoint "Anyone with the link" links. Google Drive folder links are not supported yet: you get a clear error row, free. - Files on web pages: the page is read and its file links of the selected types are collected:
<img src>,srcset, lazy-loaddata-src,<picture><source>,<a href>,<video>,<audio>,<embed>,<object>. Max files per page caps each page. - Streaming downloads: files go straight to disk and on to storage in chunks, so large files never sit in memory. Max file size skips bigger files (before the download when the server sends the size). Time limit per file stops slow downloads, including servers that send a few bytes at a time.
- Storage with a public link: each file is saved in the run's key-value store under a safe, unique key (cleaned-up file name + short hash + extension) with the right content type.
fileUrlis a direct link you can open, share or pass to the next step of a workflow. - ZIP archives (
zip: true): all downloaded files in one archive (files.zip), or in parts of ZIP part size each (files-part1.zip,files-part2.zip...). A part is uploaded as soon as it is full, and its files are deleted from the run's disk. Links in theOUTPUTrecord and the log. No extra charge. - sha256 of every file, to check integrity. Duplicates are free: when a file with the same content was already stored in this run (the same sha256), the row is
okand points to the stored copy (key,fileUrl) withduplicateOfset to the URL it was first downloaded from. It is not stored or charged again, and not added to the ZIP twice. - Web pages are not files: when a link found on a page, or a link that ends in a file type like
.pdfor.jpg, answers with a web page (usually a login page, an error page or a soft "not found" page), it is refused before the body is downloaded, free. AddhtmltofileTypesto keep web pages; an.htmllink you list yourself is always kept. - Filters:
fileTypeslimits downloads to the extensions you list (for listed URLs the check happens on the response headers, before the body is downloaded).
Chain it with other Actors
The fileUrl column is a public link, so it is the input of the next step:
- Document to Markdown: turn the downloaded PDFs, Word, PowerPoint and Excel files into Markdown for LLMs and RAG.
- Image to Text OCR: read the text in the downloaded images and scans.
- Audio to Text: transcribe the downloaded audio and video files.
All three read links from a dataset: give them this run's dataset ID and fileUrl as the link field.
Polite and safe
- robots.txt is honoured: always for web pages and the files found on them, and by default for listed URLs too (Honour robots.txt for listed URLs). A URL that robots.txt closes is not requested; its row says so and it is free. Turn the option off only for files you own or have permission to download, for example your own share links.
- At most two downloads at a time per host, with a short gap between requests; different hosts download in parallel (Downloads at a time, default 5).
- Retries on 429 and server errors with backoff (Retry-After honoured), and on dropped connections.
- Private and internal addresses (localhost, 10.x, 192.168.x, cloud metadata) are blocked, including every redirect.
- Not supported: YouTube, TikTok, Instagram, Facebook, X/Twitter, LinkedIn, Reddit and Amazon, and their CDNs. Their terms do not allow downloading their media with tools like this, so these links are refused with a clear error, free. (For Amazon this means the store and its image hosts; AWS pages and public S3 files on
amazonaws.comwork.) - Only download files you have the right to download. You are responsible for how you use the files.
Input
| Field | Default | What it does |
|---|---|---|
urls | File links and share links | |
csvUrl, urlColumn | , url | Public CSV or Google Sheet with a column of links |
datasetId, urlField, maxDatasetItems | , url, 10,000 | Links from an Apify dataset |
pageUrls | Web pages to collect file links from | |
fileTypes | Extensions to keep (pages: common types when empty; listed URLs: any type when empty) | |
maxFilesPerPage | 100 | File links taken from each page |
maxFiles | 10,000 | Cap on files per run (and on the price) |
maxFileSizeMb | 100 | Bigger files are skipped |
maxConcurrency | 5 | Downloads at a time (never more than 2 per host) |
fileTimeoutSecs | 300 | Time limit per file |
respectRobotsTxt | true | Honour robots.txt for listed URLs |
zip, zipPartMb, zipName | false, 500, files | ZIP archives of all downloaded files |
Output
One dataset row per URL (per file found, in page mode): url, finalUrl (after redirects), status (ok, error or skipped), error (the reason, for errors and skipped files), httpStatus, fileName, key (key-value store key), fileUrl (public link to the stored file), contentType, bytes, sha256, sourcePage (the page a file was found on), duplicateOf (for a free duplicate: the URL of the file it repeats). Every row has every column, so CSV and spreadsheet exports line up.
The OUTPUT record has the totals (files and bytes stored, duplicates, errors, skipped), the ZIP archives (key, url, files, bytes) and whether the run stopped at the spending limit or before its timeout.
What it costs
| Run | Price |
|---|---|
| 1,000 product images under 10 MB each | $1.00 |
| 100 PDFs of 2 MB | $0.10 |
| 10 videos of 100 MB (1 GB) | $0.24 |
| 50 audio files of 25 MB | $0.30 |
| Event | Price | When |
|---|---|---|
file | $1 per 1,000 | A file stored in the key-value store (first 10 MB included) |
data-10mb | $2.50 per 1,000 ($0.25 per GB) | Each started 10 MB of a file beyond its first 10 MB |
Failed downloads, skipped files (robots.txt, type filter, size limit, not enough disk), refused links (including web pages returned instead of a file) and duplicates are free; ZIP archives are free. Set Maximum cost per run and the run never goes over it: when the next file would not fit, the run stops cleanly and lists the rest as skipped. The run also stops about 3 minutes before its timeout and keeps everything it stored: downloads in progress are stopped (free), files already being saved are finished and charged.
Good to know
- Stored files stay as long as the run's storage is kept (see your Apify data retention). Copy them elsewhere if you need them longer.
- If your account restricts storage access,
fileUrlcomes with a signature so the link still opens without a token. - Files behind a login are not supported: the link must download the file directly (or be a public share link or a pre-signed URL).
- Very large Google Drive files sometimes need "Anyone with the link" sharing to download without the virus-scan page.
- Only the HTML of web pages is read (no browser), so file links that JavaScript adds later are not found.
- Disk space: the run keeps track of its disk and never fills it. A file that would not fit is skipped, free, with the reason "not enough disk space in this run", and Max file size is lowered to what fits (half of it with ZIP on, since the archive needs a copy). With ZIP on, files wait on disk until their part is full, so use a smaller ZIP part size, more memory (disk grows with it), or turn ZIP off for very large jobs.
FAQ
Can I use it from n8n or Make? Yes: run the Actor with the Apify node, then read the dataset; each row has fileUrl, a direct link to the file. Code examples are linked below.
How do I get one ZIP of everything? Set zip to true. The link is in the OUTPUT record (zip[0].url) and in the log.
Can an AI agent use it? Yes, through the Apify MCP server: "download these files and give me the links".
More from this developer
- Document to Markdown: PDF, Word, PowerPoint, Excel and scans to clean Markdown for LLMs and RAG, $2 per 1,000 pages.
- Image to Text OCR: text from images and scanned PDFs, 40+ languages, $1.50 per 1,000 images.
- Audio to Text: audio, video and podcast feeds to timestamped text, SRT/VTT subtitles and RAG chunks with Whisper.
- Bulk HTTP Requests: call any API once for every row of a CSV, JSON list or Apify dataset.
- Sitemap Extractor: every URL a website lists in its sitemaps, with lastmod, images and hreflang.
- Broken Link Checker: crawl a site and find broken links and images, with the pages they are on.
- Website Screenshot + Change Detection: screenshots of many URLs with visual change detection between runs.
Code examples (curl, Python, Node.js, n8n) for this and the other Actors: github.com/msalihk/apify-actor-examples.
Questions or a missing feature: open an issue on the Actor page.