# Bulk Image Downloader — All Images from URLs + ZIP (`technicaldost/bulk-image-downloader-website-images`) Actor

Download all images from web pages or a list of image URLs: largest srcset size, lazy-loaded and linked full-size images, filters by width, height and format, duplicates removed by content. Files, metadata and one ZIP. $0.50 per 1,000 images.

- **URL**: https://apify.com/technicaldost/bulk-image-downloader-website-images.md
- **Developed by:** [Technical Dost Solutions](https://apify.com/technicaldost) (community)
- **Categories:** Automation, E-commerce
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.50 / 1,000 images

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

Bulk Image Downloader saves **every image from a list of web pages**, or downloads **a list of image URLs**, in one run. For each page it finds `<img>` images (taking the **largest size from srcset**), **lazy-loaded** images (data-src), `<picture>` sources, **og:image / twitter:image**, and **links to full-size images** in galleries. Filter by **minimum width and height** and **format** (JPG, PNG, WebP, GIF, AVIF, SVG...), and duplicates are removed by **file content**, not just by URL. You get every file in the run's key-value store, **one ZIP with all images**, and a dataset row per image with **dimensions, format, size, alt text, source page and a direct download link**.

### What you get

- Page mode: finds img, srcset (largest), lazy-load attributes, picture sources, og:image and linked full-size images.
- URL mode: paste direct image URLs to download them in bulk.
- Filters: minimum width and height (skips icons and thumbnails) and file formats; format detected from file bytes.
- Duplicates removed by SHA-1 of the content, even when the same image has different URLs.
- Output: each image as a file, one images.zip, and metadata rows (width, height, format, bytes, alt, page, download URL).
- Fair billing: you pay only for saved images; skipped and failed ones are free.

### How to use Bulk Image Downloader

1. Paste **Page or image URLs** (product pages, galleries, articles, or direct .jpg/.png links).
2. Set **Minimum width / height** to skip icons, choose **Formats**, and limits.
3. Run. Download **images.zip** from the Storage tab (key-value store), or use each row's downloadUrl.

### Input example

```json
{
  "startUrls": [
    "https://en.wikipedia.org/wiki/Golden_Gate_Bridge",
    "https://upload.wikimedia.org/wikipedia/commons/0/0c/GoldenGateBridge-001.jpg"
  ],
  "minWidth": 300,
  "minHeight": 200,
  "maxImagesPerPage": 50
}
```

All fields are described in the **Input** tab.

### Output example

```json
{
  "imageUrl": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0c/GoldenGateBridge-001.jpg/1280px-GoldenGateBridge-001.jpg",
  "pageUrl": "https://en.wikipedia.org/wiki/Golden_Gate_Bridge",
  "alt": "Golden Gate Bridge",
  "foundIn": "img",
  "format": "jpg",
  "width": 1280,
  "height": 960,
  "sizeBytes": 252236,
  "sha1": "6a7921a510c4e1b0d5f3a8e2c9b7d6f4a3e2c1b0",
  "fileName": "1280px-GoldenGateBridge-001-6a7921a510.jpg",
  "downloadUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/1280px-GoldenGateBridge-001-6a7921a510.jpg",
  "scrapedAt": "2026-11-01T21:05:00.000Z"
}
```

#### Output fields

| Field | Description |
|---|---|
| `imageUrl` | Image URL. |
| `pageUrl` | Page the image was found on (empty for direct URLs). |
| `alt` | Alt text. |
| `foundIn` | img, picture, meta, link or direct. |
| `format` | File format. |
| `width` | Width in px. |
| `height` | Height in px. |
| `sizeBytes` | File size. |
| `sha1` | SHA-1 of the file (deduplication). |
| `fileName` | Key in the key-value store. |
| `downloadUrl` | Direct download link. |
| `scrapedAt` | When the image was saved. |

Export results as JSON, CSV, Excel, XML or HTML, or read them with the API.

### Use cases

- E-commerce: pull product photos from supplier or competitor pages.
- Datasets for AI and computer vision: collect images with alt text and source page.
- Content and design teams: save all images from articles, galleries or moodboards at full size.
- Website migrations and audits: export a site's images with dimensions and file sizes.
- Archiving: keep copies of images referenced in your own pages.

### How much does Bulk Image Downloader cost?

This Actor uses **pay-per-event** pricing: **$0.0005 per image** ($0.5 per 1,000). Platform usage is included. There is no start fee. Images that are too small, in an unwanted format, duplicates or failed downloads are skipped and not charged.

Set **Maximum cost per run** in the run options to cap your spend; the Actor stops when the limit is reached.

### Use Bulk Image Downloader with AI agents (MCP)

Give Claude, ChatGPT, Cursor or any MCP client this Actor as a tool through the hosted [Apify MCP server](https://mcp.apify.com):

```bash
claude mcp add --transport http apify "https://mcp.apify.com/?tools=technicaldost/bulk-image-downloader-website-images" --header "Authorization: Bearer YOUR_APIFY_TOKEN"
```

Or in a JSON MCP config:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com/?tools=technicaldost/bulk-image-downloader-website-images",
      "headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }
    }
  }
}
```

The tool is named `technicaldost--bulk-image-downloader-website-images`. Ask your agent, for example, to *"run Bulk Image Downloader with {"startUrls": \["https://en.wikipedia.org/wiki/Golden_Gate_Bridge", "https://upload.wikimedia.org/wikipedia/commons/0/0c/GoldenGateBridge-001.jpg"], "minWidth": 300, "minHeight": 200, "maxImagesPerPage": 50}"*.

### Run Bulk Image Downloader via API

```bash
curl -X POST "https://api.apify.com/v2/acts/technicaldost~bulk-image-downloader-website-images/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"startUrls": ["https://en.wikipedia.org/wiki/Golden_Gate_Bridge", "https://upload.wikimedia.org/wikipedia/commons/0/0c/GoldenGateBridge-001.jpg"], "minWidth": 300, "minHeight": 200, "maxImagesPerPage": 50}'
```

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("technicaldost/bulk-image-downloader-website-images").call(run_input={"startUrls": ["https://en.wikipedia.org/wiki/Golden_Gate_Bridge", "https://upload.wikimedia.org/wikipedia/commons/0/0c/GoldenGateBridge-001.jpg"], "minWidth": 300, "minHeight": 200, "maxImagesPerPage": 50})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('technicaldost/bulk-image-downloader-website-images').call({"startUrls": ["https://en.wikipedia.org/wiki/Golden_Gate_Bridge", "https://upload.wikimedia.org/wikipedia/commons/0/0c/GoldenGateBridge-001.jpg"], "minWidth": 300, "minHeight": 200, "maxImagesPerPage": 50});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Integrations

Schedule runs (daily, hourly) in Apify Console and send results to Google Sheets, Slack, Make, Zapier, n8n, Airbyte or your own webhook.

### FAQ

#### Where are the images?

In the run's key-value store (Storage tab): one file per image plus images.zip with all of them. Each dataset row also has a direct downloadUrl.

#### Does it work on JavaScript-heavy sites?

It reads the page HTML, which covers most sites, including lazy-loading via data-src/srcset. Images that only appear after JavaScript runs (infinite scroll, client-rendered galleries) may be missed; paste their direct image URLs instead.

#### How large can images and the ZIP be?

Single files up to 25 MB. The ZIP holds up to 400 MB; beyond that every image is still saved as its own file.

#### Can I download any image?

Only download images you have the right to use. Respect copyright and the websites' terms.

#### How is it priced?

$0.50 per 1,000 saved images. No start fee; skipped images are free.

#### Is it legal to scrape this data?

The Actor collects publicly available information only and does not log in or bypass access controls. Use the data in line with the website's terms and the laws that apply to you, especially when processing personal data.

### Related Actors

More tools from the same developer that work well together with this one:

- [Website Brand & Favicon Extractor](https://apify.com/technicaldost/website-brand-favicon-extractor): Pull the brand assets a website declares about itself: favicons and apple-touch icons at every size, logo, Open Graph and Twitter card images, theme colour,…
- [Webpage to Markdown](https://apify.com/technicaldost/webpage-to-clean-markdown): Convert any web page into clean, LLM-ready Markdown.
- [Robots.txt & Sitemap Extractor by Domain](https://apify.com/technicaldost/robots-sitemap-extractor): Fetch and parse robots.txt and XML sitemaps for any domain.
- [Zalando Scraper | $1/1K · Prices, Sizes & Stock](https://apify.com/technicaldost/zalando-product-scraper-plus): Scrape Zalando products from category, search and product URLs.

# Actor input Schema

## `startUrls` (type: `array`):

Web pages to collect images from, and/or direct image URLs.

## `minWidth` (type: `integer`):

Skip smaller images (icons, thumbnails). 0 = no limit.

## `minHeight` (type: `integer`):

0 = no limit.

## `formats` (type: `array`):

File formats to keep (detected from file content).

## `followImageLinks` (type: `boolean`):

Also download images that links on the page point to (e.g. full-size gallery images).

## `maxImagesPerPage` (type: `integer`):

Up to 2,000.

## `maxImages` (type: `integer`):

Up to 20,000.

## `createZip` (type: `boolean`):

Also save all images in one ZIP file (up to 400 MB).

## Actor input object example

```json
{
  "startUrls": [
    "https://en.wikipedia.org/wiki/Golden_Gate_Bridge"
  ],
  "minWidth": 200,
  "minHeight": 200,
  "formats": [
    "jpg",
    "png",
    "webp",
    "gif",
    "avif"
  ],
  "followImageLinks": true,
  "maxImagesPerPage": 10,
  "maxImages": 1000,
  "createZip": true
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        "https://en.wikipedia.org/wiki/Golden_Gate_Bridge"
    ],
    "minWidth": 200,
    "minHeight": 200,
    "maxImagesPerPage": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("technicaldost/bulk-image-downloader-website-images").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": ["https://en.wikipedia.org/wiki/Golden_Gate_Bridge"],
    "minWidth": 200,
    "minHeight": 200,
    "maxImagesPerPage": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("technicaldost/bulk-image-downloader-website-images").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    "https://en.wikipedia.org/wiki/Golden_Gate_Bridge"
  ],
  "minWidth": 200,
  "minHeight": 200,
  "maxImagesPerPage": 10
}' |
apify call technicaldost/bulk-image-downloader-website-images --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,technicaldost/bulk-image-downloader-website-images"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/FbzWgbAKnXSPJFKKH/builds/WH9mtV78h8zouPt2N/openapi.json
