Bulk Image & File Downloader from CSV, Google Sheet or Dataset
Pricing
from $2.80 / 1,000 files
Bulk Image & File Downloader from CSV, Google Sheet or Dataset
Downloads every image or file linked in a dataset, CSV, Excel or Google Sheet and stores each with a public link, keeping your columns. Inputs: datasetId or fileUrl, urlField, fileNameField, createZip. Charged per file stored plus per 10 MB; broken links and repeats free. Agent-ready: x402, MCP.
Pricing
from $2.80 / 1,000 files
Rating
0.0
(0)
Developer
Adam Pearce
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Bulk Image & File Downloader: every file linked in your spreadsheet, stored and zipped
Got a scraper's output, a CSV or a Google Sheet full of image, PDF or video links, and you need the actual files, not the links?
Point this Actor at an Apify dataset, a CSV or Excel file, or a Google Sheet. For every link it downloads the file, stores it with a public link, names it the way you want (by SKU, by listing ID, or in sheet order), and hands you back every original column with the file's link, type, size and dimensions added. Turn on one switch and you also get the whole lot as a single ZIP.
Every other downloader on the Store takes a typed-in list of URLs. If your links live in a spreadsheet, you have to pull the column out, paste it in, and then work out which downloaded file belonged to which product. This one takes the whole sheet, reads links in any shape (one per cell, several per cell, or an images array of objects straight out of a scraper) and keeps photo 37 next to product 37.
What you get per file
| Field | What it is |
|---|---|
fileUrl | A public link to the stored file, ready to paste anywhere |
fileName | The stored name, for example NL-1001-2.jpg or 0007-1-IMG_2041.jpg |
fileCategory, extension, contentType | What the file really is (image, video, audio, pdf, document, archive, text), read from its own bytes |
sizeBytes, sizeMb | How big it is |
width, height | Pixel dimensions, for images |
sha256 | A fingerprint of the file, for spotting identical files under different links |
downloadStatus, statusDetail | What happened, in plain English, when it did not work |
rowNumber, fileIndex, sourceField, sourceUrl, resolvedUrl | Which row, which link and which column the file came from, and where any redirect led |
zipFile, duplicateOf, httpStatus, downloadMs, downloadedAt | The facts behind the row |
Plus every column that was already in your row. One output row per link, so a product with five photos gives five rows.
Naming
- By column: set
fileNameFieldtoskuand the files come out asNL-1001.jpg, thenNL-1001-2.jpgfor a row's second photo. - In sheet order (the default):
0007-1-IMG_2041.jpg, the row number first so files sort the way your sheet does, then the file number and the original name. - The extension always matches what the file really is. A
.jpglink that serves a PNG is saved as.png.
What it costs
- $0.004 per file stored (Bronze, Silver and Gold Store discounts apply from day one).
- $0.003 per full 10 MB of a file. Files under 10 MB, which is nearly every image and most PDFs, pay only the per-file price.
- ZIP: $0.003 per 10 MB of archive, rounded up, only when you switch it on.
- $0.01 per export file, $0.02 per webhook delivery.
Never charged: broken links and 404s, links that return a web page instead of a file, bot-protection pages, files filtered out by type, files over your size limit, private network addresses, empty cells, and repeats of a link already downloaded in the same run.
- 5,000 product photos of about 300 KB each: $20.00
- The same 5,000 photos as one ZIP as well (about 1.5 GB): +$0.46
- 200 PDF brochures of 2 MB: $0.80
- 50 product videos of 45 MB: $0.80
maxFiles caps the number of files in a run, and maxFileMb (default 200 MB) caps any one file, so a run cannot surprise you.
Inputs
Give it any one of these:
- Dataset picked from your account, for example a product, property, Google Maps or social media scraper's output
- File or Google Sheet URL: CSV, TSV, Excel, JSON or JSON Lines. A normal Google Sheets link works, shared as "Anyone with the link can view"
- File URLs: a plain list, for a quick one-off
- Rows: inline JSON
The link column is detected automatically, preferring a column whose links end in .jpg, .png, .pdf or .mp4 over one merely named url. Set urlField to be explicit, or give several columns separated by commas (mainImage, gallery). Google Drive and Dropbox share links are converted to direct downloads.
Useful options:
fileTypesto keep only images, only PDFs, only video and so on. Anything else is skipped free.storeNameto keep the files in a named store, which Apify keeps indefinitely. Without it they live in the run's own storage, which your plan keeps for its retention period (7 days on Free).headersfor hosts that only serve files with aRefererheader.keep: "problems"to list just the broken links, web pages and blocked hosts in a large sheet.dedupeUrls(on by default) downloads a repeated link once and points every later row at the same file.
The honest limits
- Files are fetched straight from their own servers, with no proxy. Most image CDNs, file hosts and public buckets serve them happily. A host with strong bot protection may refuse; that link is reported as
blockedand not charged. - A link to a web page (a product page, a Google Drive preview, an Instagram post) is not a file. It is reported as
not_a_fileand not charged. PointurlFieldat the column that holds the direct file links. - Signed links that expire (common on social media CDNs) must be downloaded before they expire, so run this straight after the scraper, for example chained with the Actor Pipeline Runner or an Apify integration.
Speed
Files stream straight to disk rather than into memory, so the default 1 GB of memory handles large videos as easily as thumbnails. Eight files download at once by default, and up to 32 with concurrency.
Measured on Apify: 120 product photos from a dataset, named by listing ID and zipped, in about 5 seconds; a 100 MB file plus four smaller ones, stored and split into two ZIP parts, in about 5 seconds with memory peaking at 340 MB. The default example (six photos from a Google-Sheet-style CSV) finishes in about 7 seconds including start-up. Speed on your own links depends mostly on how fast their servers are.
Exports and pipelines
exportFormatswrites the results table as a real downloadable CSV or Excel file.outputDatasetNameappends every run into one named dataset. Not charged again.webhookUrlPOSTs the run summary (counts, sizes, ZIP links) to Slack, Zapier, Make, n8n or your own API the moment the run finishes. Charged only on a confirmed 2xx.- Agent-ready: pay per event via x402, and callable from MCP clients through Apify's MCP server.
FAQ
Can it download a scraper's image arrays? Yes. A cell holding ["https://...1.jpg", "https://...2.jpg"] or [{ "url": "..." }, { "url": "..." }] gives one file per link, all tied to that row. maxFilesPerRow (default 100) caps it.
Can I get everything in one download? Switch on createZip. Large sets are split into parts (1 GB each by default, set with zipPartMb), and each row's zipFile says which part holds its file.
Will re-running download everything again? Yes, each run downloads the links it is given. To refresh a set in place, use the same storeName and fileNameField: files with the same name are replaced.
Does it convert or resize images? No. Files are stored exactly as the server sent them, byte for byte, with their real type and dimensions reported.
Can I read the text in the images or PDFs I downloaded? Pair it with Bulk OCR for scans and photos, or Dataset PDF Extract for born-digital PDFs. Both read the same kind of sheet.
Is it legal to download these files? The Actor downloads the links you give it; you need the right to use the files. Product photos from your own or a supplier's catalogue, documents you are entitled to, and openly licensed media are the typical uses.
Is my data safe? The Actor reads your sheet, fetches the files you point it at, and stores them in your own Apify account. Stored files are reachable only through their signed fileUrl links. If you set a webhook, the run summary goes to the URL you chose and nowhere else.
The rest of the toolkit
Sibling Actors that fit together as a pipeline:
- Bulk OCR text out of images and scanned PDFs
- Dataset PDF Extract text and tables out of born-digital PDFs
- Dataset Cleaner & Exporter dedupe, flatten, clean, export
- Dataset Filter & Transform filter by rule, rename, compute, cast
- Dataset Join & Merge VLOOKUP for datasets
- Dataset Diff & Change Detector what changed since last time
- Dataset AI Enrich one instruction, typed output columns
- Actor Pipeline Runner chain any of these in one call
Notes
ZIP files are written with archiver (MIT) and image dimensions read by image-size (MIT). The sample product sheet and photos in the default input are synthetic, made for this Actor; no real products or businesses.
If this saved you a pile of right-click-save-as, a review on the Apify Store helps a lot. Found a link it would not download? Open an issue with the link and I will look at it.