# Image Downloader: Bulk Image Downloader Alternative, ZIP (`nebulacolors/image-downloader`) Actor

Downloads every image on the web pages you give, or a list of image URLs, into one ZIP or separate files with links. Takes the largest size a page offers, skips logos, icons and duplicates. Obeys robots.txt. $0.001 per image, plus $0.0004 per MB over 1 MB.

- **URL**: https://apify.com/nebulacolors/image-downloader.md
- **Developed by:** [Nebula Colors LLC](https://apify.com/nebulacolors) (community)
- **Categories:** Automation, Developer tools, For creators
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 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

## Image Downloader: Bulk Image Downloader Alternative, ZIP

Save every image on a page, or a list of image URLs, at full size in one ZIP, like the Bulk Image Downloader app but in the cloud: $1 per 1,000 images, plus $0.40 per 1,000 MB past each image's first MB.

### Bulk image download use cases

- Save every photo from a gallery, article or product page in one go.
- Download a list of image URLs from a spreadsheet into one ZIP.
- Back up a site's images before a redesign or migration.
- Give an AI agent the images on a page as files it can open.

### What you get for each image

Give it web pages, image addresses or both, and get every image back in one ZIP file, or as separate files with a link each. On a page it finds images in img tags, lazy-loaded images, picture and srcset sizes, CSS backgrounds and the page's share image, and takes the largest size the page offers. Logos, icons, tracking pixels and duplicates are left out. It obeys robots.txt. $0.001 per image, plus $0.0004 for each megabyte past an image's first, and everything left out or failed is free. It works for people and for AI agents through Apify's MCP server.

### Input

| Field | What to put |
|---|---|
| Pages or image URLs | One per line. A page gives every image on it; an image address gives that image. Required. |
| Output | One ZIP file (default), or separate files with a link in each row. |
| Max images | Stop after this many images are saved. Default 100. |
| Skip small images | On by default: images under 100 px wide or tall (logos, icons, tracking pixels) and SVG icons from CSS are left out. |
| Include CSS background images | On by default: hero banners and other images a page sets in CSS. |
| Image types | JPEG, PNG, GIF, WebP, AVIF, SVG, BMP, ICO, TIFF. All by default. |
| Proxy | Off by default. Turn on Apify Proxy for a site that blocks cloud servers. |

Example:

```json
{
  "urls": ["https://www.nasa.gov/image-of-the-day/"],
  "maxImages": 20
}
```

### Output

One row per image. This one came from a test run on October 15, 2026:

```json
{
  "type": "image",
  "imageUrl": "https://images-assets.nasa.gov/image/iss074e0788315/iss074e0788315~large.jpg",
  "pageUrl": "https://www.nasa.gov/image-of-the-day/",
  "source": "img",
  "alt": null,
  "format": "jpg",
  "width": 1920,
  "height": 1280,
  "bytes": 339588,
  "sha256": "…",
  "fileName": "0002-images-assets-nasa-gov-image-iss074e0788315-iss074e0788315-large.jpg",
  "zipPart": 1,
  "statusCode": 200,
  "downloadedAt": "2026-10-15T04:57:01.000Z"
}
```

- With ZIP output, all images are in `images.zip` in the run's key-value store, and the run's `SUMMARY` record has a link to it that opens without signing in. Over 400 MB, it splits into `images-1.zip`, `images-2.zip` and so on.
- With Files output, each row has `fileUrl`, a link that opens the image.
- The type and size are read from the file itself, not from the address or the server.
- An image or address that failed (a 404, not an image, larger than 25 MB, or disallowed by robots.txt) has `error` instead, and isn't charged.

### Price

- $0.001 per image saved, so $1 per 1,000.
- Big files: $0.0004 for each started megabyte past an image's first. A 300 KB photo costs $0.001; a 4.2 MB photo costs $0.001 plus 4 x $0.0004, so $0.0026. Each row's `bytes` shows the file size.
- Free: failed downloads, small images, duplicates, types you didn't pick, and addresses robots.txt disallows.
- You can set a maximum charge for a run. It stops when it's reached and keeps the images it already saved.

### Good to know

- **Time:** a NASA page with 70 images gave 20 full-size photos (8 MB) in 39 seconds on a laptop.
- **Polite:** it reads each site's robots.txt and skips what it disallows, asks a site for one page a second and up to five images a second, and runs different sites side by side.
- **It reads the HTML the site sends.** Images that a page only loads with JavaScript after it opens, or behind a login, aren't found. Give their addresses directly instead.
- **Your use of the images.** Images belong to whoever made them. Make sure you have the right to download and use them, and check a site's terms before you reuse anything.

### Use it from an AI agent

The Actor works through Apify's MCP server like any Store Actor. An agent can find it, read its input and call it. Only `urls` is required. A page with a few dozen images usually finishes within the MCP call's wait (up to 45 seconds); with Files output, the agent gets a link per image in the rows. A bigger run takes longer, so the call returns the run's status and dataset ID, and the agent reads the rows with `get-dataset-items`.

### FAQ

**How do I download all images from a web page?** Paste the page's address. You get every image at the largest size the page offers, in one ZIP.

**Can I download a list of image URLs?** Yes. Paste the image addresses, from a spreadsheet for example, and get them in one ZIP or as separate files.

**Why are some images left out?** Images under 100 px (logos, icons, tracking pixels) and duplicates are skipped by default. Turn off "Skip small images" to keep them. Skipped images are free.

**How many images per run?** 100 by default. Raise Max images for more.

### More tools from us

- [AI Brand Mention Checker](https://apify.com/nebulacolors/ai-visibility): is your brand named by ChatGPT and Gemini, and who comes first.
- [Google Ads Transparency Scraper](https://apify.com/nebulacolors/google-ads-transparency): every Google, YouTube and Display ad a competitor runs.
- [Website to Markdown Crawler](https://apify.com/nebulacolors/website-content-markdown): a whole site as clean Markdown for LLMs and RAG.
- [Website Screenshot](https://apify.com/nebulacolors/website-screenshot): full page or mobile screenshots of any URL, PNG or JPEG.
- [News & Blog Article Extractor](https://apify.com/nebulacolors/article-extractor): the newest articles from a site or RSS feed, as Markdown.

### Questions or problems

Open an issue on this Actor's Issues tab. I read them.

# Actor input Schema

## `urls` (type: `array`):

One per line. A web page, like https://en.wikipedia.org/wiki/Sun_conure, gives every image on it; an image address gives that image.

## `output` (type: `string`):

ZIP: one ZIP file with every image (a new part every 400 MB). Files: each image saved on its own, with a link in its row.

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

Stop after this many images are saved. Each saved image is one charged event.

## `skipSmall` (type: `boolean`):

On: images under 100 px wide or tall (logos, icons, tracking pixels) and SVG icons from CSS are left out for free. Turn off to keep every image.

## `includeCssImages` (type: `boolean`):

Also take images a page sets as CSS backgrounds (inline styles and <style> blocks), like hero banners.

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

Which types to keep. Others are left out for free. All by default.

## `proxyConfiguration` (type: `object`):

Off by default. Turn on Apify Proxy for a site that blocks cloud servers.

## Actor input object example

```json
{
  "urls": [
    "https://en.wikipedia.org/wiki/Sun_conure"
  ],
  "output": "zip",
  "maxImages": 100,
  "skipSmall": true,
  "includeCssImages": true,
  "formats": [
    "jpg",
    "png",
    "gif",
    "webp",
    "avif",
    "svg",
    "bmp",
    "ico",
    "tiff"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `images` (type: `string`):

All image rows as JSON: imageUrl, pageUrl, format, width, height, bytes, sha256 and fileName (or fileUrl in Files mode). A failed address has an error instead.

## `zip` (type: `string`):

All images in one ZIP (ZIP output, up to 400 MB; a bigger run has images-1.zip, images-2.zip and so on, listed in the summary).

## `summary` (type: `string`):

Images found and saved, what was left out and why, the ZIP files with public links, and why the run stopped.

# 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 = {
    "urls": [
        "https://en.wikipedia.org/wiki/Sun_conure"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("nebulacolors/image-downloader").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 = { "urls": ["https://en.wikipedia.org/wiki/Sun_conure"] }

# Run the Actor and wait for it to finish
run = client.actor("nebulacolors/image-downloader").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 '{
  "urls": [
    "https://en.wikipedia.org/wiki/Sun_conure"
  ]
}' |
apify call nebulacolors/image-downloader --silent --output-dataset

```

## MCP server setup

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

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/IyHPwoPFzCJpdBMAs/builds/gtnbEOlhWlbccbqA9/openapi.json
