Website Image Downloader: Bulk Images from Pages or URL Lists
Pricing
from $2.00 / 1,000 image saveds
Website Image Downloader: Bulk Images from Pages or URL Lists
Download every image from web pages or direct image URLs as files or ZIP archives, with source page, alt text, size, format and hash per image. robots.txt honored, no proxy. Or list image URLs only, for audits. USD 2.50 per 1,000 images saved.
Pricing
from $2.00 / 1,000 image saveds
Rating
0.0
(0)
Developer
JT Palms
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
a day ago
Last modified
Categories
Share
Give it web pages or direct image URLs. Get every image back as a file or in a ZIP archive, with one row per image: the page it was found on, the image URL, alt text, width, height, size, format, SHA-256 and a link to the saved file. Or switch to list mode and get only the image URLs and alt text for an audit, without downloading anything.
It uses plain HTTP only: no browser, no proxy, no login. It reads robots.txt (pages and image hosts, Crawl-delay included), keeps to at most 2 requests at a time per host and 500 ms between requests, and names itself honestly in the User-Agent.
USD 2.50 per 1,000 images saved. USD 0.80 per 1,000 images listed in list mode. Plus a start fee of USD 0.001 per run. Images that are skipped, duplicated, too large, blocked by robots.txt or that fail are free.
What people use it for
- Site migrations and backups. Moving a shop, a blog or a media library to a new platform or CDN, and want every image of your own site in one place, named safely, with a record of which page used it.
- Image SEO and accessibility audits. List mode returns one row per image on each page with its alt text (missing, empty or filled), title attribute, size and where it was found (img, srcset, picture, lazy-loaded, CSS background, og:image, twitter:image). Filter the
hasAltcolumn and you have your fix list. Schedule it monthly. - Datasets you have the right to use. Collect images from open-licensed or public-domain pages, or from a site you have permission to copy, with the hash and size of every file, for research and machine learning.
- Asset collection from your own sites. Agencies and designers pulling logos, product shots and banners from sites they own or work on.
Sample output
A real run on https://commons.wikimedia.org/wiki/Commons:Featured_pictures (the default input: 30 pictures, JPEG only, files, 16 seconds, 3.9 MB). Long URLs shortened:
{"imageUrl": "https://thumb.wikimedia.org/wikipedia/commons/thumb/0/08/Bessen_van_een_Mahonia_aquifolium...01.jpg/960px-Bessen_van_een_Mahonia_aquifolium...01.jpg?utm_source=commons.wikimedia.org&utm_campaign=parser&utm_content=thumbnail","sourcePageUrl": "https://commons.wikimedia.org/wiki/Commons:Featured_pictures","pageTitle": "Commons:Featured pictures - Wikimedia Commons","alt": null,"titleAttr": null,"hasAlt": false,"discoveredVia": "srcset","format": "jpg","mimeType": "image/jpeg","width": 960,"height": 960,"fileSizeBytes": 126691,"sha256": "ac3dccaeeb1ecbddc44143aae31e5946dc637e51486b700cd372924f47f5ee25","filename": "960px-Bessen_van_een_Mahonia_aquifolium._17-08-2025._(actm.)_01.jpg","fileKey": "960px-Bessen_van_een_Mahonia_aquifolium._17-08-2025._(actm.)_01.jpg","fileUrl": "https://api.apify.com/v2/key-value-stores/<store id>/records/960px-Bessen_van_een_Mahonia_aquifolium._17-08-2025._(actm.)_01.jpg","archiveEntry": null,"duplicateOf": null,"status": "saved","skipReason": null,"note": null,"error": null,"httpStatus": 200,"finalImageUrl": null,"fetchedAt": "2026-10-06T21:55:37.596Z"}
alt is null when the page has no alt attribute at all and an empty string when the page marks the image as decorative with alt="". hasAlt is true only when there is real alt text. Skipped, duplicate and failed images also get a row (free), with status, skipReason, note or error saying why. A page that cannot be read gets one row with imageUrl: null.
The run summary (key-value store record SUMMARY) has the counts: images saved or listed, duplicates, skipped by reason, errors, pages blocked by robots.txt, pages that need JavaScript, bytes downloaded, the ZIP archives written, requests and seconds:
{"mode": "download","outputFormat": "files","imagesSaved": 30,"billedImages": 30,"skipped": {},"errors": 0,"pagesFetched": 1,"imagesFound": 30,"imageBytesDownloaded": 3883345,"bytesReceivedTotal": 4461630,"archives": [],"requests": 35,"secs": 16.3}
Modes and options
| Setting | What it does |
|---|---|
startUrls | Web pages (every image on the page is found) or direct image URLs. One per line. An address without an image extension that answers with an image is downloaded as an image. |
mode | download saves every image. list returns image URLs and details only, nothing is downloaded (cheaper). |
outputFormat | files: each image is its own file in the key-value store, with a link in its row (default). zip: archives for the whole run. zipPerUrl: one archive per input page. |
filenameMode | original (the name in the URL, made safe), hash (first 16 characters of the SHA-256) or numbered. The extension always matches the real format. |
maxImagesPerPage, maxImages | Images taken per page (default 100) and in the whole run (default 1,000, up to 100,000). |
maxFileMb, maxTotalMb | One image at most 20 MB by default (up to 50). The run stops starting downloads after 500 MB by default (up to 5,000). Oversized images are skipped, not charged. |
maxZipMb | ZIP archives are split at this size: default 50 MB, never above 100 MB. |
formats | Formats to keep: JPG, PNG, WebP, GIF, SVG, AVIF, BMP by default; ICO, TIFF and HEIC on request. The format is read from the file's bytes, not its name. |
minWidth, minHeight, minFileKb | Skip small images and tracking pixels. Download mode reads the real size from the file. In list mode the size filters need fetchDimensions. |
sameDomainOnly | Only images hosted on the page's own domain or its subdomains. Off by default because many sites use a CDN. |
includeImageUrlPatterns, excludeImageUrlPatterns | Keep or drop image URLs by glob (**/uploads/**), plain text (/thumbnails/) or regular expression (re:\.png$). |
srcsetPolicy | largest: one image per srcset or picture, the widest (default). all: every size. |
includeBackgroundImages, includeMetaImages, includeIcons | CSS background images in style attributes and the page's own style blocks (on), og:image and twitter:image (on), favicons and touch icons (off). |
crawlDepth, maxPages | 0 reads only the pages you gave. 1 to 3 also reads same-site pages linked from them, up to maxPages per start URL. Pages must pass robots.txt. |
includeUrlPatterns, excludeUrlPatterns, stayInStartFolder | Which linked pages to visit. |
fetchDimensions | List mode only: read the first 64 KB of each image for width, height, real format and size. Adds one request per image. |
uniqueImageUrls | List mode: list each image URL once for the whole run instead of once per page. |
preferModernFormats | Ask image CDNs for WebP and AVIF. Off by default so you get the original format. |
requestsPerSecondPerHost | 0.1 to 2 (2 means one request every 500 ms, the fastest this actor goes). |
Duplicates are recognised twice: the same image URL seen again is a free duplicate row without a second download, and a different URL that turns out to hold the same bytes is a free duplicate row pointing to the first (duplicateOf). In list mode the same image on two pages gives two rows, because an alt text audit needs every page.
ZIP archives and size limits
- Files mode keeps each image as its own record, so the only limit is
maxFileMb(20 MB by default, 50 MB at most). - ZIP archives are built in memory and written when they reach
maxZipMbor at the end of the run. They never exceed 100 MB, far below what the key-value store accepts (a 150 MB record was tested). A single image can be at most 90% of the archive limit. - A row is written and charged only after the archive that holds its image has been stored, so you never pay for an image you cannot get.
- Memory: the run lowers its number of parallel downloads when
maxFileMbtimes the parallel downloads would not fit in the run's memory (1 GB by default). - Originals are saved byte for byte. If a photo has EXIF data such as a GPS position, it stays inside the saved file. This actor never reads or outputs EXIF, there are no face or person fields, and nothing is re-encoded.
What it does not do
- JavaScript-only galleries. There is no browser. A page that builds its images with JavaScript has no images in its HTML, and you get a free row saying
needs JavaScriptwith the number of noscript blocks and image-looking data attributes it saw. - Login walls and social networks. No login, no cookies, no CAPTCHA handling. Social network pages are not supported and mostly return a login page.
- Hotlink protection. A server that answers 403 is reported and skipped. There are no tricks to get around it.
- Video, audio and PDFs. Images only. Stylesheet files linked from a page (
.css) are not read, only the page's own style blocks. - A browser's view of the page. Images are found in the HTML as the server sends it, with img, srcset, picture, lazy-load attributes, CSS backgrounds and meta tags.
Rights and robots.txt
Images belong to their publishers. You are responsible for having the right to download and use every image you collect. This actor is for sites you own or have permission to archive, and for content with an open licence or in the public domain. It is not meant for property listing photos. Downloading an image does not give you the right to reuse it.
robots.txt is always respected, for the pages and for every image host, and there is no switch to turn that off. A page or image path that robots.txt disallows is skipped and reported (blocked by robots.txt), and a host whose robots.txt cannot be read is not fetched. A Crawl-delay in robots.txt replaces the 500 ms spacing.
The default input reads the Featured pictures page of Wikimedia Commons, whose pictures are freely licensed. Each picture has its own licence and author on its Commons file page, and some licences require attribution.
Pricing
| Price | |
|---|---|
| Image saved (download mode) | USD 0.0025 each, USD 2.50 per 1,000 (Gold plan USD 2.00) |
| Image listed (list mode) | USD 0.0008 each, USD 0.80 per 1,000 |
| Run start | USD 0.001 per run |
Examples:
- The default run, 30 pictures: USD 0.076.
- 1,000 images: USD 2.50.
- Backing up 200 pages with 30 images each (6,000 images): USD 15.00.
- A list-only alt text audit of 500 pages with 40 images each (20,000 rows): USD 16.00.
Skipped, duplicate, oversized, blocked and failed images cost nothing. Set a maximum cost on the run and it stops cleanly when it is reached, keeping everything saved so far. Apify also bills platform usage (compute and data transfer) to the person running the actor, so the size limits above double as cost guards.
Tips
- For a quick look at a site, start with list mode and
fetchDimensionsoff, then download only what you need withincludeImageUrlPatterns. - Set
minFileKbto 2 to drop tracking pixels and spacers. - To move a site, use
crawlDepth1 or 2 withmaxPages,outputFormatzipPerUrl, and keep the dataset: it is the map from each page to its images.
Related actors
- Website Screenshot API: Full Page, Mobile & URL to PDF: Screenshot a list of URLs as PNG, JPEG, WebP or PDF: full page, first screen, one element, or an exact clip rectangle, on desktop,...
- Sitemap URL Extractor: All Pages of Any Website: Get every URL of a website from its XML sitemaps.
- Link Preview & URL Metadata: Open Graph, Meta Tags, Favicon: Get the URL metadata a link preview shows: title, description, image, site name, Open Graph and Twitter card meta tags, best favicon,...
- Website to Markdown Crawler for RAG: Fast, No Browser: Crawl a site into clean Markdown for RAG and LLMs without a browser.