# Bulk Image Downloader — URLs to Stored Files (`hipersoft/bulk-image-downloader`) Actor

Download thousands of images from a list of URLs and store each in the key-value store with a public link. Returns content type, size, dimensions and SHA-256 per image. Bulk-ready, no login. Great for datasets, backups and media pipelines.

- **URL**: https://apify.com/hipersoft/bulk-image-downloader.md
- **Developed by:** [hiper soft](https://apify.com/hipersoft) (community)
- **Categories:** Developer tools, Automation
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.056 / url processed

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Bulk Image Downloader — URLs to Stored Files

Download images at scale. Give the Actor a list of image URLs and it fetches each one,
**stores it in your run's key-value store**, and returns its **content type, size,
pixel dimensions and SHA-256 hash** plus a direct link to the stored file. No login,
no API key to run.

Great for **building image datasets, mirroring/backups, media pipelines, and
deduplicating creative assets**.

### What you get per image

| Field | Notes |
|---|---|
| `ok` | Whether the download succeeded. |
| `contentType` | e.g. `image/jpeg`, `image/png`, `image/webp`. |
| `sizeBytes` | File size. |
| `width`, `height` | Pixel dimensions (read from the file header — JPEG/PNG/GIF/WebP/BMP). |
| `sha256` | Content hash — great for de-duplication. |
| `storedUrl` | Link to the stored file in **your** run's key-value store — open it in the Apify Console, or fetch it with your API token (`?token=…`). Bulk-export the whole store as a zip from the run's Storage tab. |
| `key` | Its key in the store. |
| `finalUrl`, `error` | URL after redirects; failure reason if any. |

### Input

```json
{
  "imageUrls": ["https://example.com/a.jpg", "https://example.com/b.png"],
  "store": true,
  "maxConcurrency": 10
}
````

- **imageUrls** — direct image URLs, one per line.
- **store** — save the bytes and return a link (default on). Off = metadata only.
- **maxBytes** — skip images larger than this.
- **maxConcurrency** / **maxItems** — parallelism and a global cap.
- **proxyConfiguration** — optional; enable if a host blocks datacenter IPs.

### Output (one row per image)

```json
{
  "url": "https://example.com/a.jpg",
  "ok": true,
  "contentType": "image/jpeg",
  "sizeBytes": 84213,
  "width": 1200,
  "height": 800,
  "sha256": "9f86d081...",
  "key": "image-000000-9f86d0817640.jpg",
  "storedUrl": "https://api.apify.com/v2/key-value-stores/<id>/records/image-000000-9f86d0817640.jpg",
  "error": null
}
```

### FAQ

**Do I need an account or API key?**
No API key is needed to run the Actor. Downloaded files are saved to your run's key-value store, which you open in the Apify Console or fetch with your own API token.

**How many images can I download per run?**
As many as you supply. `maxItems` sets a global cap, `maxConcurrency` controls parallel downloads (default 10), and `maxBytes` skips files larger than a chosen size.

**Is bulk image downloading legal?**
Only download images you have the right to use. The Actor refuses requests to private/loopback addresses and time-caps each download, but you are responsible for the copyright and terms of the sources.

**What's the output format?**
A JSON dataset with one metadata row per image (content type, size, dimensions, SHA-256 hash, stored link) plus the stored file itself in the key-value store. Export the dataset as JSON/CSV/Excel and bulk-download the store as a zip.

**Can I filter or limit results?**
Yes. Use `maxItems`, `maxBytes`, and `maxConcurrency`, and set `store` to false to return metadata only without saving the bytes.

### Related Actors

Pair image collection with other bulk web tools:

- [Bulk URL Status Checker](https://apify.com/hipersoft/bulk-url-checker) — check thousands of links for broken status, redirects, and SSL.
- [Domain Inspector](https://apify.com/hipersoft/domain-inspector) — WHOIS/RDAP, DNS, and SSL details for any domain.
- [Website Content Crawler](https://apify.com/hipersoft/website-content-crawler) — crawl a site into clean text, and discover asset URLs.
- [Wayback Machine Scraper](https://apify.com/hipersoft/wayback-machine-scraper) — list archived snapshots of a URL or domain.

### Notes

Files are saved to your run's key-value store (accessible in the Console or via the
API with your token — outputs are private to your account, as with all Apify runs).
Dimensions are read from file headers with no heavy dependencies. Requests to private
/ loopback addresses are refused. Each image is time-capped so one slow host can't
stall a bulk run. Only download images you have the right to use.

# Actor input Schema

## `imageUrls` (type: `array`):

Direct image URLs to download (jpg, png, gif, webp, svg, …). One per line.

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

Alternative field name for the same list of image URLs.

## `store` (type: `boolean`):

Save each downloaded image in the key-value store and return a public link. Turn off to only collect metadata (type/size/dimensions/hash) without storing bytes.

## `maxBytes` (type: `integer`):

Skip images larger than this (bytes).

## `maxConcurrency` (type: `integer`):

How many images to download in parallel.

## `maxItems` (type: `integer`):

Cap total images processed (0 = all).

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

Optional. Enable if a host blocks datacenter IPs.

## Actor input object example

```json
{
  "imageUrls": [
    "https://upload.wikimedia.org/wikipedia/commons/a/a9/Example.jpg"
  ],
  "store": true,
  "maxBytes": 25000000,
  "maxConcurrency": 10,
  "maxItems": 0,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "imageUrls": [
        "https://upload.wikimedia.org/wikipedia/commons/a/a9/Example.jpg"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("hipersoft/bulk-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 = { "imageUrls": ["https://upload.wikimedia.org/wikipedia/commons/a/a9/Example.jpg"] }

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

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

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

```

## CLI example

```bash
echo '{
  "imageUrls": [
    "https://upload.wikimedia.org/wikipedia/commons/a/a9/Example.jpg"
  ]
}' |
apify call hipersoft/bulk-image-downloader --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=hipersoft/bulk-image-downloader",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Bulk Image Downloader — URLs to Stored Files",
        "description": "Download thousands of images from a list of URLs and store each in the key-value store with a public link. Returns content type, size, dimensions and SHA-256 per image. Bulk-ready, no login. Great for datasets, backups and media pipelines.",
        "version": "1.0",
        "x-build-id": "diutKVcGRW9B7WKzZ"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/hipersoft~bulk-image-downloader/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-hipersoft-bulk-image-downloader",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/hipersoft~bulk-image-downloader/runs": {
            "post": {
                "operationId": "runs-sync-hipersoft-bulk-image-downloader",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/hipersoft~bulk-image-downloader/run-sync": {
            "post": {
                "operationId": "run-sync-hipersoft-bulk-image-downloader",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "imageUrls": {
                        "title": "Image URLs",
                        "type": "array",
                        "description": "Direct image URLs to download (jpg, png, gif, webp, svg, …). One per line.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "urls": {
                        "title": "URLs (alias)",
                        "type": "array",
                        "description": "Alternative field name for the same list of image URLs.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "store": {
                        "title": "Store the files",
                        "type": "boolean",
                        "description": "Save each downloaded image in the key-value store and return a public link. Turn off to only collect metadata (type/size/dimensions/hash) without storing bytes.",
                        "default": true
                    },
                    "maxBytes": {
                        "title": "Max bytes per image",
                        "minimum": 1000,
                        "type": "integer",
                        "description": "Skip images larger than this (bytes).",
                        "default": 25000000
                    },
                    "maxConcurrency": {
                        "title": "Concurrency",
                        "minimum": 1,
                        "maximum": 40,
                        "type": "integer",
                        "description": "How many images to download in parallel.",
                        "default": 10
                    },
                    "maxItems": {
                        "title": "Max images",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Cap total images processed (0 = all).",
                        "default": 0
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional. Enable if a host blocks datacenter IPs.",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
