Bulk Image Downloader
Pricing
from $0.60 / 1,000 images
Bulk Image Downloader
Download images from URLs and store them in the key-value store with metadata including dimensions, file size, and SHA256 hash. Supports bulk input from URLs or from another Actor's dataset.
Pricing
from $0.60 / 1,000 images
Rating
0.0
(0)
Developer
Murat Uzun
Maintained by CommunityActor stats
0
Bookmarked
11
Total users
10
Monthly active users
19 hours ago
Last modified
Categories
Features
Share
Bulk Image Downloader
Download images in bulk and store them in Apify's key-value store with metadata including dimensions, file size, and SHA256 hash. Paste direct image URLs, web page URLs (the Actor finds the images on the page), or read URLs from another Actor's dataset.
What is the Bulk Image Downloader?
The Bulk Image Downloader fetches images from a list of URLs (or from another Actor's dataset) and stores them in Apify's key-value store for persistent access. Each URL can be:
- a direct image URL (
.jpg,.png,.webp, …) — the image is downloaded as is; - a web page URL — the Actor reads the page and downloads the images on it:
<img src>, the largestsrcsetcandidate, lazy-loaded images (data-src,data-lazy-src,data-lazy,data-original),<picture><source srcset>andog:image. Relative URLs are resolved against the page, and each image URL is downloaded once.
For each downloaded image, the Actor stores:
- Final URL after redirects
- MIME type (content type)
- File size in bytes
- Image dimensions (width/height, parsed from PNG/JPEG/GIF/WebP headers)
- SHA256 hash for deduplication or integrity checking
- Public access URL
- The page the image was found on
The Actor also optionally creates a ZIP file containing all downloaded images.
What data does the Bulk Image Downloader extract?
The Actor returns one dataset row per successfully downloaded image, with the following fields:
| Field | Type | Description |
|---|---|---|
| sourceUrl | string | The image URL: as given, or as found on the page |
| finalUrl | string | The final URL after following redirects |
| key | string | The key under which the image is stored in the key-value store |
| storedUrl | string | Public URL to access the stored image |
| contentType | string | MIME type of the image (e.g., image/jpeg, image/png) |
| bytes | integer | File size in bytes |
| width | integer | Image width in pixels (parsed from file header) |
| height | integer | Image height in pixels (parsed from file header) |
| sha256 | string | SHA256 hash of the image file |
| scrapedAt | string | Timestamp of the download (ISO 8601 UTC) |
| sourcePage | string or null | The web page the image was found on; null when you gave the image URL directly |
Every run also writes an OUTPUT record to the key-value store: the number of images downloaded, pages scanned, and every skipped URL with its error code and reason. Skipped URLs are also in the ERRORS record. When no image could be downloaded, the run still succeeds, is not charged per image, and its status message says why (for example 2 URL(s) skipped: 1 HTTP 400, 1 not an image).
How to use the Bulk Image Downloader
Option 1: Download from image or page URLs
-
Provide URLs: Enter one or more image or web page URLs, one per line (or separated by semicolons), e.g.:
https://upload.wikimedia.org/wikipedia/commons/a/a9/Example.jpghttps://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.pnghttps://en.wikipedia.org/wiki/Cat -
Set the maximum number of images: Specify how many images to download (default: 50). The same limit applies to the images taken from any one page.
-
Optionally create a ZIP: Enable
createZipto also store all images as a single ZIP file.
Option 2: Download from another Actor's dataset
-
Provide the dataset ID: Enter the ID of the dataset from a previous Actor run.
-
Specify the URL field name: Enter the name of the field containing the image (or page) URLs (default:
url). -
Configure download settings: Set max images, file size limit, and ZIP option as desired.
Example input
{"imageUrls": ["https://upload.wikimedia.org/wikipedia/commons/a/a9/Example.jpg","https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png","https://upload.wikimedia.org/wikipedia/commons/3/3a/Cat03.jpg"],"maxImages": 50,"maxFileSizeMb": 20,"timeoutSecs": 30,"createZip": true}
An empty input runs the same three Wikimedia images as a demo.
Example output
[{"sourceUrl": "https://upload.wikimedia.org/wikipedia/commons/a/a9/Example.jpg","finalUrl": "https://upload.wikimedia.org/wikipedia/commons/a/a9/Example.jpg","key": "a3f2b8c1d4e5f6a7.jpg","storedUrl": "https://api.apify.com/v2/key-value-stores/<store-id>/records/a3f2b8c1d4e5f6a7.jpg","contentType": "image/jpeg","bytes": 9022,"width": 275,"height": 297,"sha256": "a3f2b8c1d4e5f6a7…","scrapedAt": "2026-11-12T14:30:00.000Z","sourcePage": null}]
For an image found on a web page, sourceUrl is the absolute image URL and sourcePage is the page URL you gave.
Example OUTPUT record when nothing could be downloaded:
{"images": 0,"pagesScanned": 1,"rejectedCount": 2,"reasons": { "HTTP 400": 1, "page without images": 1 },"rejected": [{ "sourceUrl": "https://site.example/photo.jpg", "sourcePage": null, "errorCode": "HTTP_ERROR", "httpStatus": 400, "error": "HTTP 400" },{ "sourceUrl": "https://site.example/about", "sourcePage": null, "errorCode": "NO_IMAGES_ON_PAGE", "error": "The page has no <img>, srcset, lazy-load or og:image images" }],"stoppedEarly": false}
Input parameters
- imageUrls (array of strings, optional): Image or web page URLs, one per line (semicolons also work). Aliases:
urls,url,startUrls. If you set it but no entry is anhttp(s)://URL (and there is nodatasetId), the run fails with a clear message. - datasetId (string, optional): ID of another Actor's dataset to read URLs from. Use this instead of
imageUrls. - urlField (string, default:
url): When usingdatasetId, the name of the field containing the URL or URL list. - maxImages (integer, default: 50, max: 100000): Maximum number of images to download, in total and from any one page.
- maxFileSizeMb (integer, default: 20, max: 1000): Skip images (and pages) larger than this size in megabytes.
- timeoutSecs (integer, default: 30, range: 5–300): Timeout for each download in seconds.
- createZip (boolean, default: false): Also create a ZIP file containing all downloaded images.
Error codes
Each skipped URL in the OUTPUT and ERRORS records has an errorCode and a readable error. Skipped URLs are never charged.
| errorCode | Meaning |
|---|---|
HTTP_ERROR | The server answered with a status other than 200 (httpStatus holds it, e.g. 400, 403, 404). |
NOT_AN_IMAGE | The response was neither an image nor an HTML page (e.g. PDF, JSON), or an image URL found on a page returned something else. |
NO_IMAGES_ON_PAGE | The URL is a web page, but it has no img, srcset, lazy-load or og:image image. |
FILE_TOO_LARGE | The image or page is larger than maxFileSizeMb. |
TIMEOUT | The download took longer than timeoutSecs. |
NETWORK_ERROR | DNS, TLS or connection failure. |
STORE_FAILED | The image could not be written to the key-value store. |
PUSH_FAILED | The dataset row could not be written (no charge). |
DATASET_READ_FAILED | The datasetId dataset could not be read. |
Pricing
The Bulk Image Downloader costs $0.001 per image downloaded. A run with 50 images costs approximately $0.05.
Limitations
- Charging: You pay only for images that are downloaded and saved as a dataset row. Pages, skipped URLs and failed saves are not charged.
- File size filtering: Images larger than the
maxFileSizeMblimit are skipped and not charged. - Timeout enforcement: Downloads exceeding the
timeoutSecslimit are aborted. Near the run's own timeout the Actor stops downloading and still writes the ZIP, OUTPUT and ERRORS records. - Dimension parsing: Image width/height are parsed from the file header. For some rare image formats, dimensions may be unavailable (width/height will be null).
- ZIP file size: The created ZIP file is stored in the key-value store under a single record. There is no practical size limit, but very large ZIPs may take time to generate.
- Redirect handling: The Actor follows HTTP redirects (up to 20). Final URL reflects the ultimate source after all redirects.
- Content-type validation: Only responses with MIME types starting with
image/are saved. An HTML response is scanned as a page; other content is skipped withNOT_AN_IMAGE. - Page mode: Pages are read without a browser, one level deep. Images added only by JavaScript after load and CSS background images are not found; links to other pages are not followed.
Using with AI agents and MCP
This Actor works with AI agents through the Apify MCP server. Agents can call it like:
{"imageUrls": ["https://upload.wikimedia.org/wikipedia/commons/3/3a/Cat03.jpg", "https://en.wikipedia.org/wiki/Cat"],"maxImages": 50,"createZip": true}
The Actor returns a dataset of stored images with public URLs ready for processing, analysis, or further download by other tools.
FAQ
Q: Can I download images from password-protected URLs? A: No, the Actor makes unauthenticated requests. It cannot access URLs behind login walls or authentication pages.
Q: What happens if an image URL returns a redirect?
A: The Actor automatically follows redirects (up to 20 hops). The finalUrl field shows the ultimate source URL after all redirects.
Q: Can I download images from a different Actor's dataset? A: Yes. Provide the dataset ID and specify the field name containing image URLs. The Actor will read URLs from all items in that dataset.
Q: How are images deduplicated? A: Each image URL is downloaded once per run, even if it appears on several pages or twice in your list. The same file under different URLs is not merged, but the SHA256 hash in the output lets you identify such duplicates downstream.
Q: I pasted a web page URL. What happens?
A: The Actor reads the page and downloads the images on it (img src, largest srcset, lazy-load attributes, og:image), up to maxImages. Each row's sourcePage shows the page. A page with no images is listed in the OUTPUT record with NO_IMAGES_ON_PAGE and is not charged.
Q: Why can't I download from Instagram or Facebook? A: These sites use bot-detection and require authenticated sessions. The Actor makes simple, unauthenticated requests and will not bypass bot checks.
Q: Is the ZIP file immediately available? A: Yes, the ZIP is created in the key-value store while the run finishes. You can access it via the key shown in the log output.
Q: What image formats are supported? A: The Actor downloads any image MIME type (JPEG, PNG, GIF, WebP, BMP, TIFF, SVG, etc.). Dimension parsing works for PNG, JPEG, GIF, and WebP.
Related Actors
Part of the webdatatools web-intelligence suite — every Actor is pay-per-event, reads public data without a login, and returns one clean row per entity:
Browse the whole suite at webdatatools, or call ten of these Actors straight from Claude, Cursor or Cline with the webdatatools MCP server.
Website & domain intelligence
- Email Extractor — Website Contact & Social Finder — e-mails, phones and social profiles per domain
- Tech Stack Detector — Wappalyzer & BuiltWith Alternative — CMS, e-commerce, analytics, pixels and payments per domain
- Domain DNS & Email Security Checker — SPF, DKIM, DMARC, MX provider, registrar and domain age
- Domain Security Audit (TLS, HTTP headers, redirects, robots) — TLS expiry, security headers, redirect chain, robots and llms.txt
- Subdomain Finder (Certificate Transparency) — every subdomain seen in CT logs, with a live DNS check
- Bulk Core Web Vitals & PageSpeed Audit — Lighthouse scores, LCP, CLS, INP and top fixes per URL
- On-Page SEO Audit — title, meta, headings, links, images and schema issues per page
- Sitemap URL Extractor & Change Monitor — every sitemap URL, or new and removed pages between runs
- Wayback Machine Snapshot & Page Change Tracker — how a page changed over time, or every archived snapshot
- Bulk Domain WHOIS & RDAP Lookup — registrar, dates, status and nameservers per domain
- Web Scraper — CSS Selector & Data Extractor — pull any CSS selector off any page, one row per URL
- Website Screenshot Generator — full-page or viewport PNG/JPEG screenshots of any URL
Content for AI, LLMs and RAG
- AI Web Search & Read: Google results as clean Markdown — a query turned into clean Markdown from the top search results
- Website to Markdown — Content Crawler for LLM & RAG — any site as clean Markdown per page, no browser
- llms.txt Generator (Website to llms.txt & llms-full.txt) — llms.txt and llms-full.txt for any website or docs site
- PDF to Markdown Converter (Text, Headings, Metadata) — PDF files to clean Markdown with headings, metadata and token counts
- RAG Text Chunker (Markdown to Chunks, Token Counts) — heading-aware RAG chunks with exact GPT token counts from any dataset
- Article & News Extractor (clean text, author, date, markdown) — clean article text, author, date and Markdown per URL
- Structured Data & JSON-LD Extractor (Schema.org, Open Graph) — Schema.org and Open Graph data from any page
- Google News Scraper (RSS search by keyword, topic, site) — news results by keyword, topic or site
- Press Release Monitor: PR Newswire, BusinessWire, GlobeNewswire — PR Newswire, Business Wire and GlobeNewswire releases
Search, video and social
- YouTube Shorts Scraper — Shorts from channels, hashtags and searches with view counts
- Pinterest Pins Scraper — latest pins of public Pinterest profiles and boards
- YouTube Transcript Scraper — captions and subtitles as text + timed segments, per video or channel
- Google Search Results Scraper — SERP API — organic SERP results per keyword and country
- YouTube Comments Scraper — Comments & Replies — comments and replies with likes, no API key
- YouTube Channel Latest Videos (RSS, no API key) — the latest 15 videos of any channel from RSS
- YouTube Channel Scraper (videos, shorts, live) — a channel's full video, shorts and stream list
- YouTube Search Results Scraper (videos, channels, no API key) — videos, channels and playlists per query
- YouTube Video Details Scraper (views, likes, description, tags) — views, likes, description, tags and chapters per video
- Apple Podcasts Lookup & Episodes Scraper — podcast metadata and episodes from iTunes and RSS
- Bluesky Post, Search & Profile Scraper — posts, profiles, followers and threads from the AT Protocol API
- X Tweet Scraper (Twitter Posts by URL, No Login) — X (Twitter) posts by URL with likes, replies, author, media and MP4 links
- TikTok Profile Scraper (Followers, Likes, Bio, Video Stats) — TikTok profiles with exact follower and like counts, plus video stats
- Telegram Channel Posts Scraper — posts, views and media flags from any public channel
- Substack Publication & Posts Scraper — archive, authors and paywall status per publication
- Google Play Reviews Scraper — reviews, ratings, replies and app versions per app
- App Store Reviews Scraper — iOS reviews and ratings per app and country
- Trustpilot Reviews Scraper (Ratings, Replies, No Login) — Trustpilot reviews with stars, full text, verification and company replies
- Google Trends Scraper — interest over time, by region, and related queries per keyword
- Google Ads Transparency Scraper — ads any advertiser runs on Google, with format and dates
- Keyword Suggestions Scraper (Google, YouTube, Amazon, Bing) — autocomplete keyword ideas from four search engines
- Bilibili Scraper (Videos, Search, Popular) — Chinese video platform: views, likes, coins, danmaku, uploader
- Mastodon Scraper (Hashtags, Accounts, Trending) — public fediverse posts by hashtag, account or trending
- Meetup Events Scraper (Search by Keyword & City) — upcoming events with RSVPs, fees, venues and groups
- Eventbrite Scraper (Events by Keyword & City) — events by keyword and city with venue, dates and organizer
Leads, jobs and company data
- Career Site Jobs API (Greenhouse, Lever, Ashby, Workday +1) — company domains in, their open jobs out, ATS detected automatically
- Workday Jobs Scraper — jobs with full descriptions from any Workday career site
- Google Maps Scraper — businesses with phone, website, address, rating and coordinates per search
- 2GIS Places Scraper (Phones, Websites, Ratings, Hours) — 2GIS businesses in Russia, Kazakhstan, UAE and more with phones, website, rating and hours
- LinkedIn Jobs Scraper — job titles, companies, locations and full descriptions from LinkedIn job search
- Company 360: full company profile from a domain — one row per domain: contacts, tech, security, hiring and company facts
- Hiring Signals Scraper (Greenhouse, Lever, Ashby, Workable) — open jobs and hiring velocity from 10 public ATS boards
- Y Combinator Companies & Founders Scraper — YC startups by batch, industry and hiring status
- Wikidata Entity & Company Enrichment (facts, IDs, links) — HQ, founders, employees, revenue and social IDs per company
- Email Validator & Verifier — Bulk Email Check — syntax, MX, disposable, role and free-provider checks
- OpenStreetMap POI Extractor (Overpass API: shops, amenities) — shops and amenities by radius, bbox or area
- Stock, Crypto & FX Quotes — one row per symbol from Yahoo, Binance and ECB rates
- Yahoo Finance Scraper (Quotes, Fundamentals, Financials, News) — Yahoo Finance fundamentals, analyst targets, financial statements, ownership, news and history per ticker
- DexScreener Scraper (DEX Pairs, Prices, Liquidity, Boosts) — DEX pairs with price, volume, liquidity, FDV and boosted tokens across chains
- Polymarket Scraper (Prediction Markets, Odds, Volume) — Polymarket markets and events with outcome prices, volume and liquidity
- StockTwits Scraper (Messages, Sentiment, Trending) — StockTwits messages with Bullish/Bearish sentiment and trending symbols
- Economic Calendar Scraper (Forex Events, Impact, Forecasts) — This week's macro events with impact, forecast and previous values
- Crypto Fear & Greed Index — Daily Crypto Fear & Greed Index values with full history
- Remote Jobs Aggregator (RemoteOK, WWR, Hacker News) — one clean row per remote job, de-duplicated across feeds
- Greenhouse Jobs Scraper — jobs with descriptions from any Greenhouse job board
- Lever Jobs Scraper — jobs with descriptions from any Lever careers page
- Ashby Jobs Scraper — jobs, salaries and descriptions from any Ashby job board
- SmartRecruiters Jobs Scraper — jobs with descriptions from any SmartRecruiters company
- Seek Jobs Scraper (Australia & New Zealand) — Seek job ads with salary, work type and location
- Dice Jobs Scraper — US tech jobs from Dice with salary and remote flag
- AutoScout24 Scraper — European car listings with price, mileage and seller
- Rightmove Scraper — UK property for sale or rent with price and agent
- Wellfound Jobs Scraper (AngelList Startup Jobs) — startup jobs with salary and equity ranges, company size and stage
- Yandex Maps Scraper (Places, Ratings, Phones) — businesses in Russia, Türkiye and the CIS with phones, ratings, hours
- Craigslist Scraper (Listings, Prices, Locations) — listings in any area and category with price, date and coordinates
- JobStreet Scraper (Malaysia, Singapore, PH, ID + JobsDB) — JobStreet and JobsDB jobs in 6 Asian countries with parsed salaries
- InfoJobs Scraper (Spain Jobs, Salaries, Companies) — Spanish jobs with salary range, contract type and full description
- StepStone Scraper (Germany, Austria, Belgium Jobs) — StepStone jobs in Germany, Austria and Belgium by keyword and city
- Naukri Jobs Scraper (Salary, Skills, Company Rating) — Naukri.com jobs in India with salary range, experience, skills and company rating
- Zillow Scraper (Homes for Sale, Rent & Sold, Zestimates) — Zillow homes for sale, rent or sold with Zestimates, beds, baths and photos
- Zillow Home Details Scraper (Description, Photos, History) — full Zillow property pages: description, photos, HOA, tax rate, agent
- Redfin Scraper (Homes for Sale, Prices, Details) — US homes for sale or sold from any Redfin search, with price and details
- Kleinanzeigen Scraper (Ads, Prices, Locations) — German classifieds with price, VB flag, ZIP, city and seller type
Developer, app and research data
- npm, PyPI & Crates.io Package Health Checker — releases, downloads, deprecation and a health score
- GitHub Repository Health & Activity Report — stars, commits, contributors and risk flags per repo
- VS Code Marketplace Extension Scraper (installs, ratings) — installs, ratings and versions per extension
- Chrome Web Store Extension Scraper (installs, ratings) — users, rating, version and developer per extension
- Google Play Scraper — apps, ratings, installs, developer contact and reviews
- App Store (iOS) App Metadata, Ratings & Top Charts Lookup — ratings, price, version and charts per app
- CrossRef DOI & Citation Metadata Lookup — papers, authors, journals and citation counts
- FDA Recalls & Adverse Events Monitor (openFDA) — food, drug and device recalls from openFDA
- iCal / ICS Calendar Feed to Events Extractor — any public calendar feed as event rows
- Shopify Store Products Scraper — catalog, prices, variants and stock per store
- Hacker News Search & Front Page Scraper — stories, comments and points by query or front page
- GitHub Trending Repositories Scraper — trending repos and developers by language and period
- Stack Overflow & Stack Exchange Q&A Scraper — questions, answers and scores by query, tag or site
- Google Flights Scraper (Prices, Airlines, Stops) — flight prices, airlines, times, stops and CO2 by route and date
- Google Hotels Scraper (Prices, Ratings, Reviews) — hotel prices per night, stars, rating and reviews by city and dates
- Booking.com Scraper (Hotel Prices, Ratings, Availability) — Booking.com hotels for any city and dates with prices, scores and deals
- Airbnb Scraper (Listings, Prices, Ratings, Coordinates) — Airbnb stays for any city and dates with prices, ratings and coordinates
- AliExpress Scraper (Search Products & Prices) — AliExpress search results with USD price, discount and rank
- Lazada Scraper (Products, Prices, Sold, Ratings) — Lazada products in 6 countries with price, rating, units sold and seller
- Trendyol Scraper (Turkey Products, Prices, Ratings) — Trendyol products with price, basket discount, rating and promotions
Support
For issues, feature requests, or questions, visit the Actor's GitHub issues or community forums.
