# Unsplash Image Scraper (`memo23/unsplash-image-scraper`) Actor

Turn Unsplash into structured photo data — no API key, no rate limits to apply for. Search keywords or paste any collection, topic, or photographer URL. Every row: 5 image sizes, full attribution, EXIF, geolocation, views and downloads. Premium filtered out. JSON/CSV export

- **URL**: https://apify.com/memo23/unsplash-image-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Automation, AI, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 photo scrapeds

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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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

## Unsplash Image Scraper

**Turn Unsplash into structured photo data — no API key, no rate-limited developer app.** Scrape photos from any keyword search, collection, topic, or photographer portfolio on unsplash.com — image URLs in 5 resolutions, photographer attribution (name, profile, portfolio, social), likes, dimensions, dominant color, BlurHash, plus optional EXIF camera data, geolocation, view/download counts, and tags — pulled straight from the site's own JSON API. JSON or CSV out, no compute charge per run, just per result.

#### How it works

![How Unsplash Image Scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-unsplash.png)

#### ✨ Why use this scraper?

Building a mood-board tool, training an image model, sourcing freely-usable visuals at scale, or analysing what performs on the world's biggest free-photo platform?

- 🎯 **Five starting points.** Keywords, search URLs (`/s/photos/{term}`), collections (`/collections/{id}`), topics (`/t/{slug}`), photographer portfolios (`/@{username}`) and single photo URLs — all auto-classified, mixable in one run.
- ⚡ **The site's own JSON API as the data source.** Every row comes from the same endpoints the unsplash.com frontend calls — no HTML parsing, no brittle selectors, no official-API key or 50-requests-per-hour demo limit.
- 🖼️ **Five image resolutions per photo.** `raw`, `full` (2000px), `regular` (1080px), `small` (400px), `thumb` (200px) — plus the tracked `downloadUrl`.
- 📷 **EXIF, geolocation and engagement stats.** Opt-in `includePhotoDetails` adds camera make/model, aperture, ISO, GPS coordinates, view + download counts, tags and topics — fields most Unsplash scrapers don't return at all.
- 👤 **Full photographer attribution.** Name, username, profile URL, portfolio link, Instagram/Twitter handles, for-hire flag, and total photo/like counts — everything you need to credit correctly.
- 🚫 **Unsplash+ (premium) photos filtered out by default.** Every row you pay for is a freely-usable photo, not a watermarked paid asset. Flip `includePremium` if you want them anyway.
- 📤 **Clean exports.** One row per photo, deduped across all your keywords and URLs. JSON + CSV from the Apify dataset.

#### 🎯 Use cases

| Team | What they build |
|------|-----------------|
| **Design / creative tools** | Keyword-driven image pickers and mood-board generators with proper attribution baked in |
| **ML / computer vision** | Curated training datasets filtered by orientation, color and topic, with dimensions + EXIF metadata |
| **Content & marketing** | Bulk sourcing of blog/social visuals with the exact resolution variant they need |
| **Market research** | Engagement analysis — which subjects, colors and compositions earn the most views and downloads |
| **Photographer scouting** | For-hire photographers by topic, with portfolio links and social handles |
| **SEO / web performance** | BlurHash placeholders + multi-resolution URLs for responsive image pipelines |

#### 📥 Supported inputs

Use `queries` for keyword searches, `startUrls` for URLs, or both in the same run.

| Input | Behaviour |
|---|---|
| `queries: ["coffee shop"]` | **Search** — each keyword runs as its own search, with your orientation/color/sort filters applied |
| `https://unsplash.com/s/photos/{term}` | **Search URL** — filters in the URL (`?orientation=…`) are picked up automatically |
| `https://unsplash.com/collections/{id}/{slug}` | **Collection** — every photo in the collection |
| `https://unsplash.com/t/{slug}` | **Topic** — e.g. `/t/nature`, `/t/architecture-interior` |
| `https://unsplash.com/@{username}` | **Photographer portfolio** — all of a user's photos |
| `https://unsplash.com/photos/{slug}` | **Single photo** — one full-detail row (EXIF, location, stats included automatically) |

Easiest workflow: browse unsplash.com, copy the URL out of the address bar, paste it into `startUrls`.

**Not supported:** logged-in content (likes, private collections), Unsplash+ full-resolution originals (requires an Unsplash+ subscription).

#### 🔄 How it works

1. **Classify each keyword and URL** into a search, collection, topic, photographer or single-photo source.
2. **Walk each source's JSON feed page by page** until it's exhausted or `maxItems` is reached.
3. **Dedupe photos** across all sources and **skip Unsplash+ premium rows** (unless `includePremium` is on).
4. **Optionally fetch each photo's detail record** for EXIF, geolocation, views, downloads, tags and topics.
5. **Push one row per photo** to the dataset — JSON and CSV export come free with the Apify dataset.

#### ⚙️ Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `queries` | array | `["nature"]` | Search keywords — each runs as its own Unsplash search. |
| `startUrls` | array | (none) | unsplash.com URLs: search, collection, topic, photographer, or single photo. Mix freely with `queries`. |
| `orientation` | string | `any` | Search filter: `landscape`, `portrait`, `squarish`. |
| `color` | string | `any` | Search filter: `black_and_white`, `black`, `white`, `yellow`, `orange`, `red`, `purple`, `magenta`, `green`, `teal`, `blue`. |
| `orderBy` | string | `relevant` | Search ordering: best match (`relevant`) or newest first (`latest`). |
| `includePhotoDetails` | boolean | `false` | Fetch each photo's detail record for EXIF, geolocation, views, downloads, tags, topics. One extra HTTP call per photo. |
| `includePremium` | boolean | `false` | Include Unsplash+ paid photos (their full-size URLs are watermarked without an Unsplash+ plan). |
| `maxItems` | integer | `100` | Hard cap on photos collected across all sources — controls billing. |
| `maxConcurrency` | integer | `10` | Parallel photo-detail calls. |
| `maxRequestRetries` | integer | `5` | Retries before a failed request is given up. |
| `proxy` | object | built-in | Leave empty — the actor routes through its own residential proxy at no extra cost. Set only to use your own pool. |

#### 📊 Output overview

Each scraped photo is one **single dataset row**. Search filters (orientation, color, sort) are applied server-side by Unsplash, so the row count equals what you asked for — premium photos are filtered out *before* they count against `maxItems`, and duplicates across sources are pushed only once.

#### 📦 Output sample

One row per photo (`includePhotoDetails: true` shown):

```json
{
    "photoId": "TD4DBagg2wE",
    "slug": "coffee-bean-lot-TD4DBagg2wE",
    "photoUrl": "https://unsplash.com/photos/coffee-bean-lot-TD4DBagg2wE",
    "description": null,
    "altDescription": "coffee bean lot",
    "width": 4889,
    "height": 3728,
    "color": "#0c0c0c",
    "blurHash": "LFE2t$oL0LR*R*WBofWB0fWC},sm",
    "likes": 2743,
    "createdAt": "2015-11-19T12:52:31Z",
    "premium": false,
    "plus": false,
    "sponsored": false,
    "urls": {
        "raw": "https://images.unsplash.com/photo-1447933601403-0c6688de566e?ixid=…",
        "full": "https://images.unsplash.com/photo-1447933601403-0c6688de566e?…q=85",
        "regular": "https://images.unsplash.com/photo-1447933601403-0c6688de566e?…w=1080",
        "small": "https://images.unsplash.com/photo-1447933601403-0c6688de566e?…w=400",
        "thumb": "https://images.unsplash.com/photo-1447933601403-0c6688de566e?…w=200"
    },
    "downloadUrl": "https://unsplash.com/photos/TD4DBagg2wE/download?ixid=…",
    "photographer": {
        "username": "asthetik",
        "name": "Mike Kenneally",
        "profileUrl": "https://unsplash.com/@asthetik",
        "portfolioUrl": null,
        "instagram": null,
        "twitter": null,
        "forHire": true,
        "totalPhotos": 24,
        "totalLikes": 291
    },
    "views": 42491249,
    "downloads": 513192,
    "exif": {
        "make": "NIKON CORPORATION",
        "model": "NIKON D600",
        "exposureTime": "1/125",
        "aperture": "5.6",
        "focalLength": "50.0",
        "iso": 220
    },
    "location": {
        "name": "Ireland",
        "city": null,
        "country": "Ireland",
        "latitude": 53.41291,
        "longitude": -8.24389
    },
    "tags": ["background", "coffee", "coffee shop", "brown", "coffee beans", "…"],
    "topics": [],
    "source": { "type": "search", "query": "coffee", "url": "https://unsplash.com/s/photos/coffee" },
    "scrapedAt": "2026-07-12T03:42:55.510Z"
}
````

#### 🗂 Key output fields

| Group | Fields |
|---|---|
| **Identifiers** | `photoId`, `slug`, `photoUrl`, `scrapedAt` |
| **Content** | `description`, `altDescription`, `width`, `height`, `color` (dominant hex), `blurHash` (placeholder hash), `assetType` |
| **Image URLs** | `urls.{raw,full,regular,small,thumb}` (≈ original / 2000px / 1080px / 400px / 200px), `downloadUrl` (tracked download endpoint) |
| **Engagement** | `likes`; with details: `views`, `downloads` |
| **Photographer** | `photographer.{id,username,name,bio,location,profileUrl,portfolioUrl,instagram,twitter,forHire,totalPhotos,totalLikes,totalCollections,profileImage}` |
| **Licensing flags** | `premium`, `plus` (Unsplash+ paid content), `sponsored`, `publicDomain` *(details only)* |
| **Camera EXIF** *(details only)* | `exif.{make,model,name,exposureTime,aperture,focalLength,iso}` |
| **Geolocation** *(details only)* | `location.{name,city,country,latitude,longitude}` |
| **Discovery** *(details only)* | `tags[]`, `topics[]` |
| **Provenance** | `source.{type,query/collectionId/topic/username,url}` — which keyword or URL produced the row |

#### ❓ FAQ

**Do I need an Unsplash API key?**
No. The actor reads the same public JSON endpoints the unsplash.com website itself uses — no developer application, no demo-tier 50 requests/hour limit, no OAuth.

**How is this different from the official Unsplash API?**
The official API is great but requires an approved developer app for production rate limits, and its terms restrict certain uses. This actor needs zero setup and returns bulk structured rows ready for JSON/CSV export. For high-volume commercial products embedding Unsplash, the official partnership route may still be the right choice.

**What are `premium` / `plus` photos and why are they skipped?**
They're Unsplash+ paid content — their full-size URLs are watermarked unless you have an Unsplash+ subscription. By default the actor filters them out *before* they count toward `maxItems`, so every billed row is a freely-usable photo. Set `includePremium: true` to keep them.

**When should I enable `includePhotoDetails`?**
When you need EXIF camera data, GPS location, view/download counts, or tags. It costs one extra HTTP call per photo, so a 1,000-photo run makes 1,000 additional requests. Single-photo startUrls always return full details at no extra cost.

**Can I download the actual image files?**
The dataset contains direct `images.unsplash.com` URLs in five sizes plus the tracked `downloadUrl` — pipe them into any downloader. The actor itself stores metadata, not binaries, to keep results fast and cheap.

**How do I limit results?**
Set `maxItems`. The actor stops walking feeds the moment the cap is reserved, so a `maxItems: 100` run fetches only ~5 search pages.

**Do search filters apply to collections and photographer feeds?**
No — orientation/color/sort are Unsplash search parameters, so they apply to `queries` and search URLs. Collections, topics and portfolios return their photos as curated.

#### 💬 Support

- For issues or feature requests, please use the **Issues** tab on the actor's Apify Console page.
- Author's website: <https://muhamed-didovic.github.io/>
- Email: <muhamed.didovic@gmail.com>

#### 🛠 Additional services

- Custom output shape, additional fields, or one-off datasets: <muhamed.didovic@gmail.com>
- Need a similar scraper for other image or content platforms? Drop an email.
- For API access (no Apify fee, just a usage fee for the API): <muhamed.didovic@gmail.com>

#### 🔎 Explore more scrapers

If this Unsplash Image Scraper was useful, see other scrapers and actors at [memo23's Apify profile](https://apify.com/memo23) — covering job boards, real estate, social media, and more.

***

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Unsplash Inc. or any of its subsidiaries or affiliates. All trademarks mentioned are the property of their respective owners.

The scraper accesses only publicly available photo data via unsplash.com's public JSON endpoints — no authenticated content, no Unsplash+ original files, no personal data beyond the public photographer profiles Unsplash itself displays. Photos on Unsplash are governed by the [Unsplash License](https://unsplash.com/license); Unsplash+ content requires a separate subscription. Users are responsible for ensuring their use complies with Unsplash's Terms of Service, the Unsplash License, applicable data-protection law (GDPR, CCPA, etc.), and any contractual obligations of their own organisation.

***

### SEO Keywords

unsplash scraper, scrape unsplash, unsplash api alternative, unsplash image scraper, unsplash photo scraper, apify unsplash, unsplash bulk download, unsplash metadata scraper, unsplash without api key, free stock photo scraper, stock image scraper, unsplash collection scraper, unsplash photographer scraper, unsplash exif data, unsplash search api, image dataset builder, ml training images scraper, mood board image scraper, royalty free image api, unsplash downloads statistics, unsplash tags scraper

# Actor input Schema

## `queries` (type: `array`):

Each keyword runs as its own Unsplash search, e.g. `nature`, `coffee shop`, `minimal workspace`.

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

Full unsplash.com URLs to crawl. Supported: search (`/s/photos/{term}`), collection (`/collections/{id}/...`), topic (`/t/{slug}`), photographer (`/@{username}`) and single photo (`/photos/{slug}`) URLs. Mix freely with keywords.

## `orientation` (type: `string`):

Only return photos with this orientation.

## `color` (type: `string`):

Only return photos with this dominant color tone.

## `orderBy` (type: `string`):

Order search results by best match or newest first.

## `includePhotoDetails` (type: `boolean`):

When enabled, each photo's full detail record is fetched to add camera EXIF (make, model, aperture, ISO...), geolocation, view + download counts, tags and topics. Costs one extra HTTP call per photo, so runs are slower.

## `includePremium` (type: `boolean`):

Unsplash+ photos are paid content — their full-size URLs are watermarked unless you have an Unsplash+ subscription. Disabled by default so every row you pay for is a freely-usable photo.

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

Hard cap on the number of photos collected across all keywords and URLs. Use this to control billing.

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

Maximum number of photo detail calls processed in parallel.

## `maxRequestRetries` (type: `integer`):

Number of retries before a failed request is given up.

## `proxy` (type: `object`):

Leave empty — the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies.

## Actor input object example

```json
{
  "queries": [
    "nature"
  ],
  "orientation": "any",
  "color": "any",
  "orderBy": "relevant",
  "includePhotoDetails": false,
  "includePremium": false,
  "maxItems": 100,
  "maxConcurrency": 10,
  "maxRequestRetries": 5
}
```

# 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 = {
    "queries": [
        "nature"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/unsplash-image-scraper").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 = { "queries": ["nature"] }

# Run the Actor and wait for it to finish
run = client.actor("memo23/unsplash-image-scraper").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 '{
  "queries": [
    "nature"
  ]
}' |
apify call memo23/unsplash-image-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Unsplash Image Scraper",
        "description": "Turn Unsplash into structured photo data — no API key, no rate limits to apply for. Search keywords or paste any collection, topic, or photographer URL. Every row: 5 image sizes, full attribution, EXIF, geolocation, views and downloads. Premium filtered out. JSON/CSV export",
        "version": "0.0",
        "x-build-id": "Gt48kCupNra5ACgfQ"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/memo23~unsplash-image-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-memo23-unsplash-image-scraper",
                "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/memo23~unsplash-image-scraper/runs": {
            "post": {
                "operationId": "runs-sync-memo23-unsplash-image-scraper",
                "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/memo23~unsplash-image-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-memo23-unsplash-image-scraper",
                "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": {
                    "queries": {
                        "title": "Search keywords",
                        "type": "array",
                        "description": "Each keyword runs as its own Unsplash search, e.g. `nature`, `coffee shop`, `minimal workspace`.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "Unsplash URLs",
                        "type": "array",
                        "description": "Full unsplash.com URLs to crawl. Supported: search (`/s/photos/{term}`), collection (`/collections/{id}/...`), topic (`/t/{slug}`), photographer (`/@{username}`) and single photo (`/photos/{slug}`) URLs. Mix freely with keywords.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "orientation": {
                        "title": "Orientation",
                        "enum": [
                            "any",
                            "landscape",
                            "portrait",
                            "squarish"
                        ],
                        "type": "string",
                        "description": "Only return photos with this orientation.",
                        "default": "any"
                    },
                    "color": {
                        "title": "Dominant color",
                        "enum": [
                            "any",
                            "black_and_white",
                            "black",
                            "white",
                            "yellow",
                            "orange",
                            "red",
                            "purple",
                            "magenta",
                            "green",
                            "teal",
                            "blue"
                        ],
                        "type": "string",
                        "description": "Only return photos with this dominant color tone.",
                        "default": "any"
                    },
                    "orderBy": {
                        "title": "Sort order",
                        "enum": [
                            "relevant",
                            "latest"
                        ],
                        "type": "string",
                        "description": "Order search results by best match or newest first.",
                        "default": "relevant"
                    },
                    "includePhotoDetails": {
                        "title": "Include photo details (EXIF, location, views, downloads, tags)",
                        "type": "boolean",
                        "description": "When enabled, each photo's full detail record is fetched to add camera EXIF (make, model, aperture, ISO...), geolocation, view + download counts, tags and topics. Costs one extra HTTP call per photo, so runs are slower.",
                        "default": false
                    },
                    "includePremium": {
                        "title": "Include Unsplash+ (premium) photos",
                        "type": "boolean",
                        "description": "Unsplash+ photos are paid content — their full-size URLs are watermarked unless you have an Unsplash+ subscription. Disabled by default so every row you pay for is a freely-usable photo.",
                        "default": false
                    },
                    "maxItems": {
                        "title": "Maximum photos to scrape",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Hard cap on the number of photos collected across all keywords and URLs. Use this to control billing.",
                        "default": 100
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of photo detail calls processed in parallel.",
                        "default": 10
                    },
                    "maxRequestRetries": {
                        "title": "Max request retries",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Number of retries before a failed request is given up.",
                        "default": 5
                    },
                    "proxy": {
                        "title": "Proxy configuration (optional override)",
                        "type": "object",
                        "description": "Leave empty — the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
