# Pexels Stock Media Scraper (`crawlerbros/pexels-stock-media-scraper`) Actor

Scrape free stock photos and videos from Pexels. Search by keyword, browse curated/popular media, a photographer's portfolio, or a curated collection. Get direct image and video file URLs, photographer credit, tags, colors, and more.

- **URL**: https://apify.com/crawlerbros/pexels-stock-media-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Automation, Developer tools, Videos
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.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/platform/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

## Pexels Stock Media Scraper

Scrape **Pexels** — the free stock photo and video platform — without needing an API key. Search by keyword, browse the curated/popular feed, pull an entire photographer's portfolio, grab every photo and video in a curated collection, look up exact photos by ID, or find photos similar/related to a given one. Get direct, hotlink-safe image and video file URLs at multiple sizes/qualities, photographer credit and full profile stats, EXIF camera data, engagement counts, tags, dominant colors, and dimensions. No login, no cookies, no paid proxy required.

### What this actor does

- **Six modes:** `search`, `curated`, `byPhotoId`, `byUser`, `byCollection`, `similarPhotos`
- **Photos and videos:** every mode returns photos, videos, or both
- **Filters:** orientation, minimum width/height, video duration range, number of people (photo search)
- **Direct media URLs:** multiple image sizes and video file qualities, ready to download or embed
- **Photographer credit:** name, profile URL, avatar, social links, and donation link where available
- **Bonus detail data (mode=byPhotoId):** EXIF camera metadata, view/download/like counts, and the photographer's full profile stats — all bundled free with the same page fetch
- **Empty fields are omitted** — you never have to defend against `null`

### Output per photo (`recordType: "photo"`)

- `photoId`, `title`, `description`, `alt`, `slug`
- `width`, `height`, `orientation` (`landscape` / `portrait` / `square`), `aspectRatio`
- `license`, `featured` (Pexels editor's pick)
- `createdAt`, `publishedAt`
- `photographerName`, `photographerId`, `photographerUsername`, `photographerUrl`, `photographerAvatarUrl`, `photographerLocation`, `photographerInstagram`, `photographerTwitter`, `photographerIsHero`, `photographerDonateUrl`
- `tags[]`
- `imageSmallUrl`, `imageMediumUrl`, `imageLargeUrl`, `imageOriginalUrl`, `downloadUrl`
- `avgColor` (hex), `colorPalette[]` (hex)
- `collectionIds[]` — curated collections this photo belongs to (if any)
- `pageUrl`, `sourceUrl`
- `recordType: "photo"`, `scrapedAt`

#### Bonus fields (mode=`byPhotoId` only — bundled free with the detail-page fetch)

- **Camera / EXIF:** `cameraMake`, `cameraModel`, `cameraIso`, `cameraAperture`, `cameraFocalLength`, `cameraShutterSpeed`, `cameraSoftware`, `photographedAt`, `fileSizeBytes`, `latitude`, `longitude`, `locationName` — present only when the photographer's upload retained this metadata
- **Engagement stats:** `viewsCount`, `downloadsCount`, `likesCount`
- **Full photographer profile:** `photographerBio`, `photographerWebsite`, `photographerYoutube`, `photographerTiktok`, `photographerFollowersCount`, `photographerFollowingsCount`, `photographerPhotosCount`, `photographerMediaCount`, `photographerPortfolioMediaCount`, `photographerCollectionsCount`, `photographerFirstUploadedOn` (also included for every record in mode=`byUser`, fetched once per run)

### Output per video (`recordType: "video"`)

- `videoId`, `title`, `description`, `slug`
- `width`, `height`, `orientation`, `aspectRatio`
- `durationSeconds`, `fps`
- `license`, `featured`
- `createdAt`, `publishedAt`
- `photographerName`, `photographerId`, `photographerUsername`, `photographerUrl`, `photographerAvatarUrl`, `photographerLocation`, `photographerInstagram`, `photographerTwitter`, `photographerIsHero`, `photographerDonateUrl`
- `tags[]`
- `videoPreviewUrl`, `thumbnailSmallUrl`, `thumbnailMediumUrl`, `thumbnailLargeUrl`, `downloadUrl`
- `videoFiles[]` — every available quality: `{ url, width, height, fps, fileType, downloadUrl }`
- `bestVideoUrl` — the highest-resolution file, for convenience
- `collectionIds[]`
- `pageUrl`, `sourceUrl`
- `recordType: "video"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search` / `curated` / `byPhotoId` / `byUser` / `byCollection` / `similarPhotos` |
| `searchQuery` | string | `nature` | Keyword to search (mode=search) |
| `mediaType` | string | `photos` | `photos` / `videos` / `all` |
| `orientation` | string | `all` | `all` / `landscape` / `portrait` / `square` |
| `minWidth` | int | `0` | Minimum width in pixels (0 = no filter) |
| `minHeight` | int | `0` | Minimum height in pixels (0 = no filter) |
| `minDuration` | int | `0` | Minimum video length in seconds (videos only) |
| `maxDuration` | int | `0` | Maximum video length in seconds (videos only, 0 = no cap) |
| `peopleCount` | string | `all` | `all` / `0` / `1` / `2` (mode=search, photos only) |
| `photoIds` | array | – | Photo IDs or URLs (mode=byPhotoId: look these up; mode=similarPhotos: find photos similar to these) |
| `username` | string | – | Photographer handle or profile URL (mode=byUser) |
| `collectionSlug` | string | – | Collection slug or URL (mode=byCollection) |
| `maxItems` | int | `30` | Hard cap on returned records (1–1000) |
| `proxyConfiguration` | object | off | Optional Apify proxy |

#### Example: search for landscape nature photos

```json
{
  "mode": "search",
  "searchQuery": "nature",
  "mediaType": "photos",
  "orientation": "landscape",
  "minWidth": 3000,
  "maxItems": 50
}
````

#### Example: search for short ocean videos

```json
{
  "mode": "search",
  "searchQuery": "ocean waves",
  "mediaType": "videos",
  "minDuration": 5,
  "maxDuration": 30,
  "maxItems": 20
}
```

#### Example: a photographer's full portfolio

```json
{
  "mode": "byUser",
  "username": "alex-ivanov-773258579",
  "maxItems": 100
}
```

#### Example: look up specific photos by ID

```json
{
  "mode": "byPhotoId",
  "photoIds": ["18872916", "37237947"]
}
```

#### Example: everything in a curated collection

```json
{
  "mode": "byCollection",
  "collectionSlug": "aquatic-aesthetic-bw7dkse",
  "mediaType": "all",
  "maxItems": 100
}
```

#### Example: photos similar to a given photo

```json
{
  "mode": "similarPhotos",
  "photoIds": ["18872916"],
  "maxItems": 12
}
```

### Use cases

- **Content creators** — source royalty-free photos and videos for blogs, social media, and presentations
- **App/website placeholders** — bulk-fetch themed imagery for mockups and prototypes
- **Marketing teams** — pull a specific photographer's or collection's catalog for campaign moodboards
- **Machine learning** — build labeled image/video datasets with tags and dominant colors
- **Digital asset management** — mirror direct download URLs into your own DAM system

### FAQ

**Is this affiliated with Pexels?**
No, this is an independent third-party actor that reads Pexels' public web pages. It is not affiliated with or endorsed by Pexels.

**Do I need a Pexels account or API key?**
No. All modes work against Pexels' public pages with no login and no API key.

**Are the media files free to use?**
Yes — all content returned is licensed under the Pexels License (free for personal and commercial use, no attribution required), per Pexels' own terms.

**Why do some records not have `photographerLocation` or `photographerInstagram`?**
Those fields are only included when the photographer has filled them in on their Pexels profile. Empty fields are always omitted rather than returned as blank values.

**What does `peopleCount` filter, exactly?**
It filters Pexels' own photo search index by how many people appear in the photo (0, 1, or 2). It only applies to `mode=search` with `mediaType=photos`.

**Can I look up a single video by ID?**
Not currently — Pexels' individual video pages are protected more aggressively than photo pages and could not be scraped reliably (re-verified 2026-07: 5/5 test lookups still blocked with HTTP 403, versus a high success rate for photo detail pages). Videos are still fully available through `search`, `curated`, `byUser`, and `byCollection`.

**Can I filter by color or a minimum "quality" preset?**
Not currently — Pexels' `color=` and `size=` search URL parameters were re-tested (2026-07) and confirmed to have no effect on which photos are returned (the result set changes only due to normal ranking variance, identically for any parameter value, real or nonsense). Use `minWidth`/`minHeight` instead, which are enforced by this actor itself against each photo's real dimensions.

**What is `mode=similarPhotos`?**
It returns photos Pexels itself considers visually/topically similar to each photo ID you supply — the same "related photos" feed shown on a photo's own page, sourced from the same request used by `mode=byPhotoId` (no extra cost).

**Why do some `byPhotoId` records have camera/EXIF fields and others don't?**
`cameraMake`, `cameraModel`, `cameraIso`, `photographedAt`, `latitude`/`longitude`, etc. come from the photo's original file metadata. Pexels only retains this when the photographer's upload included it — many uploads have it stripped, in which case those fields are omitted entirely rather than returned empty.

**Why does `pageUrl` return an error when I open it with `curl` but works fine in my browser?**
`pageUrl`/`sourceUrl` point at Pexels' own page, which is protected by a JavaScript challenge that only real browsers can pass — it opens normally for people (and for anything that renders JavaScript), it just won't respond to a plain command-line request. All `imageXxxUrl`, `videoFiles[].url`, `thumbnailXxxUrl`, and `downloadUrl` fields are direct CDN links and work everywhere, including `curl` and server-side downloads, with no such restriction.

**How fresh is the data?**
Every run reads Pexels' live pages, so results reflect what's on the site at run time.

**How many items can I get per run?**
Up to `maxItems` (max 1000). Actual results depend on how many matches exist for your query/filters. For `mode=similarPhotos`, each input photo ID contributes up to ~12 similar photos; supply more IDs to get more results.

**Why did `mode=search` return only ~450 items even though I set `maxItems` to 1000 and Pexels shows thousands of results?**
Pexels' own search-results pagination reports a large `total_results`/`total_pages` count, but it only actually serves the first ~20 pages (~450-480 photos) of guest/anonymous search results per query — page 21 onward returns an empty result set, even though earlier pages still claimed hundreds of pages remained (re-verified 2026-07 across multiple unrelated queries). This is a hard limit on Pexels' side, not a filter or bug in this actor — once you hit it, set a narrower `searchQuery`, add `orientation`/`minWidth`/`minHeight`/`peopleCount` filters, or switch to `mode=curated`/`byUser`/`byCollection` (which paginate differently) to source more items.

# Actor input Schema

## `mode` (type: `string`):

What to fetch from Pexels.

## `searchQuery` (type: `string`):

Keyword to search for (mode=search). Example: `nature`, `city skyline`, `coffee`.

## `mediaType` (type: `string`):

Which kind of media to return. For mode=search this selects between Pexels' separate photo-search and video-search pages (`all` is treated as `photos`). For mode=curated/byUser/byCollection, `all` returns both photos and videos as they naturally appear in the feed.

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

Filter results by image/video orientation.

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

Only return media whose width is at least this many pixels. 0 disables the filter.

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

Only return media whose height is at least this many pixels. 0 disables the filter.

## `minDuration` (type: `integer`):

Only return videos at least this many seconds long (videos only; ignored for photos). 0 disables the filter.

## `maxDuration` (type: `integer`):

Only return videos at most this many seconds long (videos only; ignored for photos). 0 disables the filter.

## `peopleCount` (type: `string`):

Filter photo search results by how many people appear in them (mode=search, photos only).

## `photoIds` (type: `array`):

Pexels photo IDs or full photo page URLs (mode=byPhotoId: look up these exact photos; mode=similarPhotos: find photos visually/topically similar to each of these). Example: `18872916` or `https://www.pexels.com/photo/18872916/`.

## `username` (type: `string`):

Pexels photographer handle or profile URL (mode=byUser). Example: `alex-ivanov-773258579` or `https://www.pexels.com/@alex-ivanov-773258579/`.

## `collectionSlug` (type: `string`):

Pexels curated collection slug or full collection URL (mode=byCollection). Example: `aquatic-aesthetic-bw7dkse` or `https://www.pexels.com/collections/aquatic-aesthetic-bw7dkse/`.

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

Maximum number of media records to return. NOTE: Pexels' own public search pagination resets to empty results past page 20 (confirmed live: page 20 returns real results, page 21+ returns 0 items regardless of the query), so a single search-style query reliably returns roughly 450 items even when far more matches exist and a higher value is requested here.

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

Optional Apify proxy. Pexels is generally reachable without a proxy; enable the free Automatic datacenter group only if you experience blocking.

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "nature",
  "mediaType": "photos",
  "orientation": "all",
  "minWidth": 0,
  "minHeight": 0,
  "minDuration": 0,
  "maxDuration": 0,
  "peopleCount": "all",
  "photoIds": [
    "18872916"
  ],
  "username": "alex-ivanov-773258579",
  "collectionSlug": "aquatic-aesthetic-bw7dkse",
  "maxItems": 30,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `media` (type: `string`):

Dataset containing all scraped Pexels photos and videos.

# 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 = {
    "mode": "search",
    "searchQuery": "nature",
    "mediaType": "photos",
    "orientation": "all",
    "minWidth": 0,
    "minHeight": 0,
    "minDuration": 0,
    "maxDuration": 0,
    "peopleCount": "all",
    "photoIds": [
        "18872916"
    ],
    "username": "alex-ivanov-773258579",
    "collectionSlug": "aquatic-aesthetic-bw7dkse",
    "maxItems": 30,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/pexels-stock-media-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 = {
    "mode": "search",
    "searchQuery": "nature",
    "mediaType": "photos",
    "orientation": "all",
    "minWidth": 0,
    "minHeight": 0,
    "minDuration": 0,
    "maxDuration": 0,
    "peopleCount": "all",
    "photoIds": ["18872916"],
    "username": "alex-ivanov-773258579",
    "collectionSlug": "aquatic-aesthetic-bw7dkse",
    "maxItems": 30,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/pexels-stock-media-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 '{
  "mode": "search",
  "searchQuery": "nature",
  "mediaType": "photos",
  "orientation": "all",
  "minWidth": 0,
  "minHeight": 0,
  "minDuration": 0,
  "maxDuration": 0,
  "peopleCount": "all",
  "photoIds": [
    "18872916"
  ],
  "username": "alex-ivanov-773258579",
  "collectionSlug": "aquatic-aesthetic-bw7dkse",
  "maxItems": 30,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call crawlerbros/pexels-stock-media-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Pexels Stock Media Scraper",
        "description": "Scrape free stock photos and videos from Pexels. Search by keyword, browse curated/popular media, a photographer's portfolio, or a curated collection. Get direct image and video file URLs, photographer credit, tags, colors, and more.",
        "version": "1.0",
        "x-build-id": "E4RfdzlnD0kj9mdT3"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/crawlerbros~pexels-stock-media-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-crawlerbros-pexels-stock-media-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/crawlerbros~pexels-stock-media-scraper/runs": {
            "post": {
                "operationId": "runs-sync-crawlerbros-pexels-stock-media-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/crawlerbros~pexels-stock-media-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-crawlerbros-pexels-stock-media-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",
                "required": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "search",
                            "curated",
                            "byPhotoId",
                            "byUser",
                            "byCollection",
                            "similarPhotos"
                        ],
                        "type": "string",
                        "description": "What to fetch from Pexels.",
                        "default": "search"
                    },
                    "searchQuery": {
                        "title": "Search query",
                        "type": "string",
                        "description": "Keyword to search for (mode=search). Example: `nature`, `city skyline`, `coffee`."
                    },
                    "mediaType": {
                        "title": "Media type",
                        "enum": [
                            "photos",
                            "videos",
                            "all"
                        ],
                        "type": "string",
                        "description": "Which kind of media to return. For mode=search this selects between Pexels' separate photo-search and video-search pages (`all` is treated as `photos`). For mode=curated/byUser/byCollection, `all` returns both photos and videos as they naturally appear in the feed.",
                        "default": "photos"
                    },
                    "orientation": {
                        "title": "Orientation",
                        "enum": [
                            "all",
                            "landscape",
                            "portrait",
                            "square"
                        ],
                        "type": "string",
                        "description": "Filter results by image/video orientation.",
                        "default": "all"
                    },
                    "minWidth": {
                        "title": "Minimum width (px)",
                        "minimum": 0,
                        "maximum": 20000,
                        "type": "integer",
                        "description": "Only return media whose width is at least this many pixels. 0 disables the filter.",
                        "default": 0
                    },
                    "minHeight": {
                        "title": "Minimum height (px)",
                        "minimum": 0,
                        "maximum": 20000,
                        "type": "integer",
                        "description": "Only return media whose height is at least this many pixels. 0 disables the filter.",
                        "default": 0
                    },
                    "minDuration": {
                        "title": "Minimum video duration (seconds)",
                        "minimum": 0,
                        "maximum": 3600,
                        "type": "integer",
                        "description": "Only return videos at least this many seconds long (videos only; ignored for photos). 0 disables the filter.",
                        "default": 0
                    },
                    "maxDuration": {
                        "title": "Maximum video duration (seconds)",
                        "minimum": 0,
                        "maximum": 3600,
                        "type": "integer",
                        "description": "Only return videos at most this many seconds long (videos only; ignored for photos). 0 disables the filter.",
                        "default": 0
                    },
                    "peopleCount": {
                        "title": "Number of people",
                        "enum": [
                            "all",
                            "0",
                            "1",
                            "2"
                        ],
                        "type": "string",
                        "description": "Filter photo search results by how many people appear in them (mode=search, photos only).",
                        "default": "all"
                    },
                    "photoIds": {
                        "title": "Photo IDs or URLs",
                        "type": "array",
                        "description": "Pexels photo IDs or full photo page URLs (mode=byPhotoId: look up these exact photos; mode=similarPhotos: find photos visually/topically similar to each of these). Example: `18872916` or `https://www.pexels.com/photo/18872916/`.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "username": {
                        "title": "Photographer username",
                        "type": "string",
                        "description": "Pexels photographer handle or profile URL (mode=byUser). Example: `alex-ivanov-773258579` or `https://www.pexels.com/@alex-ivanov-773258579/`."
                    },
                    "collectionSlug": {
                        "title": "Collection slug or URL",
                        "type": "string",
                        "description": "Pexels curated collection slug or full collection URL (mode=byCollection). Example: `aquatic-aesthetic-bw7dkse` or `https://www.pexels.com/collections/aquatic-aesthetic-bw7dkse/`."
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum number of media records to return. NOTE: Pexels' own public search pagination resets to empty results past page 20 (confirmed live: page 20 returns real results, page 21+ returns 0 items regardless of the query), so a single search-style query reliably returns roughly 450 items even when far more matches exist and a higher value is requested here.",
                        "default": 30
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional Apify proxy. Pexels is generally reachable without a proxy; enable the free Automatic datacenter group only if you experience blocking.",
                        "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
