{
  "data": {
    "id": "rSmmuRgL2b2u0iqFa",
    "actId": "b6anw2Kxq3xyPpgNC",
    "userId": "IYgBDiXtHOijAaUel",
    "startedAt": "2026-11-05T12:29:54.668Z",
    "finishedAt": "2026-11-05T12:30:03.723Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 8969,
      "runTimeSecs": 8.969,
      "computeUnits": 0.009965555555555556,
      "imageSizeBytes": 358185472
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "QYo53EZkJk0prePWY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Pexels Stock Media Scraper Input\",\n  \"description\": \"Scrape free stock photos and videos from Pexels by keyword, photographer, collection, exact media ID/URL, similar media, curated feed, or any pasted Pexels URL. No Pexels account, cookie, or API key is required.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"Mode\",\n      \"type\": \"string\",\n      \"description\": \"What to fetch from Pexels. Use Search by keyword for discovery, Look up media by ID/URL for exact assets, Photographer portfolio or Collection for a catalog, Similar media for related assets, Curated feed for Pexels' editorial selection, or Paste URLs to route any Pexels link automatically.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"search\",\n        \"curated\",\n        \"byMediaId\",\n        \"byUser\",\n        \"byCollection\",\n        \"similarMedia\",\n        \"byUrl\"\n      ],\n      \"enumTitles\": [\n        \"Search by keyword\",\n        \"Curated feed (editorial photos)\",\n        \"Look up media by ID or URL\",\n        \"Photographer portfolio\",\n        \"Collection\",\n        \"Similar / related media\",\n        \"Paste Pexels URLs\"\n      ],\n      \"default\": \"search\",\n      \"prefill\": \"search\"\n    },\n    \"searchQueries\": {\n      \"title\": \"Search queries\",\n      \"type\": \"array\",\n      \"description\": \"One or more keywords for mode=search, one per line. Each query is searched separately and duplicates are removed. Example: `nature`, `city skyline`, `coffee`.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": [\n        \"nature\"\n      ]\n    },\n    \"mediaType\": {\n      \"title\": \"Media type\",\n      \"type\": \"string\",\n      \"description\": \"Photos, videos, or both. `all` searches photos and videos and merges the results. Exact ID/URL lookups return the requested media type regardless of this setting.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"photos\",\n        \"videos\",\n        \"all\"\n      ],\n      \"enumTitles\": [\n        \"Photos only\",\n        \"Videos only\",\n        \"Photos and videos\"\n      ],\n      \"default\": \"photos\",\n      \"prefill\": \"photos\"\n    },\n    \"startUrls\": {\n      \"title\": \"Pexels URLs\",\n      \"type\": \"array\",\n      \"description\": \"Pexels search, photo, video, photographer, collection, image-file, or video-file URLs for mode=byUrl. Search URLs keep their orientation, size, color, people, and page filters.\",\n      \"editor\": \"requestListSources\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"url\": {\n            \"type\": \"string\",\n            \"title\": \"URL\",\n            \"description\": \"Pexels search, media, photographer, collection, or file URL.\"\n          }\n        }\n      },\n      \"default\": []\n    },\n    \"orientation\": {\n      \"title\": \"Orientation\",\n      \"type\": \"string\",\n      \"description\": \"Filter by media orientation. Applies to search, profile, and collection modes.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"all\",\n        \"landscape\",\n        \"portrait\",\n        \"square\"\n      ],\n      \"enumTitles\": [\n        \"Any orientation\",\n        \"Landscape\",\n        \"Portrait\",\n        \"Square\"\n      ],\n      \"default\": \"all\",\n      \"prefill\": \"all\",\n      \"sectionCaption\": \"Search filters\",\n      \"sectionDescription\": \"Optional filters. They apply to search, photographer portfolios, collections, and similar-media feeds; exact ID/URL lookups return the requested asset in full.\"\n    },\n    \"size\": {\n      \"title\": \"Minimum size\",\n      \"type\": \"string\",\n      \"description\": \"Pexels minimum-size filter. Photos: large is 24 MP, medium is 12 MP, small is 4 MP. Videos: large is 4K, medium is Full HD, small is HD.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"all\",\n        \"large\",\n        \"medium\",\n        \"small\"\n      ],\n      \"enumTitles\": [\n        \"Any size\",\n        \"Large (24 MP / 4K)\",\n        \"Medium (12 MP / Full HD)\",\n        \"Small (4 MP / HD)\"\n      ],\n      \"default\": \"all\",\n      \"prefill\": \"all\"\n    },\n    \"color\": {\n      \"title\": \"Color\",\n      \"type\": \"string\",\n      \"description\": \"Filter photos by dominant color. Use Color hex instead for an exact hex value. Photos only.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"all\",\n        \"red\",\n        \"orange\",\n        \"yellow\",\n        \"green\",\n        \"turquoise\",\n        \"blue\",\n        \"violet\",\n        \"pink\",\n        \"brown\",\n        \"black\",\n        \"gray\",\n        \"white\"\n      ],\n      \"enumTitles\": [\n        \"Any color\",\n        \"Red\",\n        \"Orange\",\n        \"Yellow\",\n        \"Green\",\n        \"Turquoise\",\n        \"Blue\",\n        \"Violet\",\n        \"Pink\",\n        \"Brown\",\n        \"Black\",\n        \"Gray\",\n        \"White\"\n      ],\n      \"default\": \"all\",\n      \"prefill\": \"all\"\n    },\n    \"colorHex\": {\n      \"title\": \"Color hex\",\n      \"type\": \"string\",\n      \"description\": \"Optional hex color such as `#2563eb` or `#fff`. Overrides the Color dropdown when set. Photos only.\",\n      \"editor\": \"textfield\",\n      \"default\": \"\",\n      \"prefill\": \"\"\n    },\n    \"peopleCount\": {\n      \"title\": \"Number of people\",\n      \"type\": \"string\",\n      \"description\": \"Filter by how many people appear in the media. Applies to photos and videos.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"all\",\n        \"0\",\n        \"1\",\n        \"2\"\n      ],\n      \"enumTitles\": [\n        \"Any\",\n        \"No people\",\n        \"1 person\",\n        \"2 people\"\n      ],\n      \"default\": \"all\",\n      \"prefill\": \"all\"\n    },\n    \"peopleAge\": {\n      \"title\": \"People age\",\n      \"type\": \"string\",\n      \"description\": \"Filter by the age of people in the media. Applies to photos and videos.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"all\",\n        \"baby\",\n        \"child\",\n        \"teenager\",\n        \"adult\"\n      ],\n      \"enumTitles\": [\n        \"Any age\",\n        \"Baby\",\n        \"Child\",\n        \"Teenager\",\n        \"Adult\"\n      ],\n      \"default\": \"all\",\n      \"prefill\": \"all\"\n    },\n    \"locale\": {\n      \"title\": \"Locale\",\n      \"type\": \"string\",\n      \"description\": \"Pexels locale for titles, descriptions, and search results. Search terms are used as typed.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"en-US\",\n        \"pt-BR\",\n        \"es-ES\",\n        \"ca-ES\",\n        \"de-DE\",\n        \"it-IT\",\n        \"fr-FR\",\n        \"sv-SE\",\n        \"id-ID\",\n        \"pl-PL\",\n        \"ja-JP\",\n        \"zh-TW\",\n        \"zh-CN\",\n        \"ko-KR\",\n        \"th-TH\",\n        \"nl-NL\",\n        \"hu-HU\",\n        \"vi-VN\",\n        \"cs-CZ\",\n        \"da-DK\",\n        \"fi-FI\",\n        \"uk-UA\",\n        \"el-GR\",\n        \"ro-RO\",\n        \"nb-NO\",\n        \"sk-SK\",\n        \"tr-TR\",\n        \"ru-RU\"\n      ],\n      \"enumTitles\": [\n        \"English (US)\",\n        \"Portuguese (Brazil)\",\n        \"Spanish (Spain)\",\n        \"Catalan\",\n        \"German\",\n        \"Italian\",\n        \"French\",\n        \"Swedish\",\n        \"Indonesian\",\n        \"Polish\",\n        \"Japanese\",\n        \"Chinese (Taiwan)\",\n        \"Chinese (Simplified)\",\n        \"Korean\",\n        \"Thai\",\n        \"Dutch\",\n        \"Hungarian\",\n        \"Vietnamese\",\n        \"Czech\",\n        \"Danish\",\n        \"Finnish\",\n        \"Ukrainian\",\n        \"Greek\",\n        \"Romanian\",\n        \"Norwegian (Bokmal)\",\n        \"Slovak\",\n        \"Turkish\",\n        \"Russian\"\n      ],\n      \"default\": \"en-US\",\n      \"prefill\": \"en-US\"\n    },\n    \"minWidth\": {\n      \"title\": \"Minimum width (px)\",\n      \"type\": \"integer\",\n      \"description\": \"Only return media at least this wide. 0 disables the filter. Enforced on each returned record.\",\n      \"minimum\": 0,\n      \"maximum\": 20000,\n      \"default\": 0,\n      \"prefill\": 0\n    },\n    \"minHeight\": {\n      \"title\": \"Minimum height (px)\",\n      \"type\": \"integer\",\n      \"description\": \"Only return media at least this tall. 0 disables the filter. Enforced on each returned record.\",\n      \"minimum\": 0,\n      \"maximum\": 20000,\n      \"default\": 0,\n      \"prefill\": 0\n    },\n    \"minFps\": {\n      \"title\": \"Minimum frame rate\",\n      \"type\": \"integer\",\n      \"description\": \"Only return videos with at least this many frames per second (for example 60). 0 disables the filter. Photos always pass.\",\n      \"minimum\": 0,\n      \"maximum\": 240,\n      \"default\": 0,\n      \"prefill\": 0\n    },\n    \"minDuration\": {\n      \"title\": \"Minimum video duration (seconds)\",\n      \"type\": \"integer\",\n      \"description\": \"Only return videos at least this many seconds long. 0 disables the filter.\",\n      \"minimum\": 0,\n      \"maximum\": 3600,\n      \"default\": 0,\n      \"prefill\": 0\n    },\n    \"maxDuration\": {\n      \"title\": \"Maximum video duration (seconds)\",\n      \"type\": \"integer\",\n      \"description\": \"Only return videos at most this many seconds long. 0 disables the filter.\",\n      \"minimum\": 0,\n      \"maximum\": 3600,\n      \"default\": 0,\n      \"prefill\": 0\n    },\n    \"publishedAfter\": {\n      \"title\": \"Published after\",\n      \"type\": \"string\",\n      \"description\": \"Optional YYYY-MM-DD date. Only return media published on or after this date. Applied to the records returned by the current search/all listing.\",\n      \"editor\": \"textfield\",\n      \"default\": \"\",\n      \"prefill\": \"\"\n    },\n    \"publishedBefore\": {\n      \"title\": \"Published before\",\n      \"type\": \"string\",\n      \"description\": \"Optional YYYY-MM-DD date. Only return media published on or before this date. Applied to the records returned by the current search/all listing.\",\n      \"editor\": \"textfield\",\n      \"default\": \"\",\n      \"prefill\": \"\"\n    },\n    \"mediaIds\": {\n      \"title\": \"Media IDs or URLs\",\n      \"type\": \"array\",\n      \"description\": \"Pexels photo or video IDs, or full photo/video/image-file URLs. Used by Look up media by ID/URL and Similar media modes.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": [\n        \"18872916\"\n      ],\n      \"sectionCaption\": \"Lookup targets\",\n      \"sectionDescription\": \"Targets for the ID, photographer, and collection modes. Each field is used only by its matching mode.\"\n    },\n    \"username\": {\n      \"title\": \"Photographer username\",\n      \"type\": \"string\",\n      \"description\": \"Pexels photographer handle, ID, or profile URL for mode=byUser. Example: `alex-ivanov-773258579` or `https://www.pexels.com/@alex-ivanov-773258579/`.\",\n      \"editor\": \"textfield\",\n      \"default\": \"\",\n      \"prefill\": \"alex-ivanov-773258579\"\n    },\n    \"collectionSlug\": {\n      \"title\": \"Collection slug or URL\",\n      \"type\": \"string\",\n      \"description\": \"Pexels collection slug or full collection URL for mode=byCollection. Example: `aquatic-aesthetic-bw7dkse`.\",\n      \"editor\": \"textfield\",\n      \"default\": \"\",\n      \"prefill\": \"aquatic-aesthetic-bw7dkse\"\n    },\n    \"maxItems\": {\n      \"title\": \"Max items\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum number of media records to return across all queries, IDs, and URLs. Pexels search serves at most about 480 records per query (20 pages of 24); a single search query cannot exceed that even with a higher value.\",\n      \"minimum\": 1,\n      \"maximum\": 5000,\n      \"default\": 30,\n      \"prefill\": 3,\n      \"sectionCaption\": \"Output options\",\n      \"sectionDescription\": \"Control the size of the dataset and optional per-item enrichment.\"\n    },\n    \"includeDetails\": {\n      \"title\": \"Include engagement and camera details\",\n      \"type\": \"boolean\",\n      \"description\": \"Open each media's detail page to add views, downloads, likes, camera/EXIF data, and the photographer's full profile. Adds one request per item and can be slow on large runs. Mode=byMediaId always enriches.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"dedupe\": {\n      \"title\": \"Remove duplicates\",\n      \"type\": \"boolean\",\n      \"description\": \"Keep only the first occurrence of each photo or video across queries, IDs, and URLs.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"proxyConfiguration\": {\n      \"title\": \"Proxy configuration\",\n      \"type\": \"object\",\n      \"description\": \"Optional Apify proxy override. The actor works directly without a proxy and escalates automatically only if Pexels blocks the run.\",\n      \"editor\": \"proxy\",\n      \"default\": {\n        \"useApifyProxy\": false\n      },\n      \"prefill\": {\n        \"useApifyProxy\": false\n      },\n      \"sectionCaption\": \"Advanced\",\n      \"sectionDescription\": \"Optional transport override. Leave the proxy off for the default direct-first behavior.\"\n    }\n  },\n  \"required\": [\n    \"mode\"\n  ]\n}",
    "readme": "# Pexels Stock Media Scraper\n\nScrape **Pexels** photos and videos without a Pexels account, cookie, or API key. Search by keyword, browse the curated feed, pull a photographer's portfolio or a collection, look up exact photos and videos by ID or URL, find similar media, or paste any Pexels link. Get direct CDN URLs at every size and video rendition, tags, colors, dimensions, photographer credit, engagement counts, camera metadata, and the full photographer profile.\n\n## What this actor does\n\n- **Seven ways in:** `search`, `curated`, `byMediaId`, `byUser`, `byCollection`, `similarMedia`, `byUrl`\n- **Photos and videos in one actor:** search one type or both, and mix photo/video IDs and URLs\n- **Full filter surface:** orientation, size, color or hex, people count, people age, locale, minimum width/height, minimum FPS, duration range, and publish-date window\n- **Direct media URLs:** multiple image sizes, the original file, every video rendition, and a highest-resolution convenience URL\n- **Photographer credit:** name, profile, avatar, location, socials, donation link, hero/superhero badges, and full profile statistics\n- **Engagement and camera data:** views, downloads, likes, image views, reactions, EXIF camera fields, content-safety ratings, and file size when `includeDetails` is on\n- **Empty fields are omitted:** you never have to defend against `null`\n- **No browser:** the actor uses Pexels' public web JSON route with an HTML fallback, so runs are small and fast\n\n## Modes\n\n| Mode | What you give it | What you get |\n|---|---|---|\n| `search` | `searchQueries` + `mediaType` | Keyword results, photos, videos, or both |\n| `curated` | nothing | Pexels' editorial photo feed (paginated) |\n| `byMediaId` | `mediaIds` | Exact photos and videos by ID or URL, enriched with detail data |\n| `byUser` | `username` | A photographer's full portfolio, with profile stats |\n| `byCollection` | `collectionSlug` | Every photo and video in a collection |\n| `similarMedia` | `mediaIds` | Pexels' related-media feed for each seed |\n| `byUrl` | `startUrls` | Automatically routes search, photo, video, profile, collection, image, and video-file URLs |\n\nLegacy mode values are still accepted in code: `byPhotoId` maps to `byMediaId` and `similarPhotos` maps to `similarMedia`. The old `searchQuery` and `photoIds` input keys are mapped too, so saved tasks keep working.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `search` | `search` / `curated` / `byMediaId` / `byUser` / `byCollection` / `similarMedia` / `byUrl` |\n| `searchQueries` | array | `[]` | One or more keywords for search |\n| `mediaType` | string | `photos` | `photos` / `videos` / `all` |\n| `startUrls` | array | `[]` | Pexels URLs for `byUrl` |\n| `orientation` | string | `all` | `all` / `landscape` / `portrait` / `square` |\n| `size` | string | `all` | `all` / `large` (24 MP or 4K) / `medium` (12 MP or Full HD) / `small` (4 MP or HD) |\n| `color` | string | `all` | 12 Pexels colors, photos only |\n| `colorHex` | string | empty | Any hex color such as `#2563eb`; overrides `color` |\n| `peopleCount` | string | `all` | `all` / `0` / `1` / `2` |\n| `peopleAge` | string | `all` | `all` / `baby` / `child` / `teenager` / `adult` |\n| `locale` | string | `en-US` | 28 Pexels locales; localizes titles, descriptions, and search |\n| `minWidth` | integer | `0` | Minimum width in pixels (0 = off) |\n| `minHeight` | integer | `0` | Minimum height in pixels (0 = off) |\n| `minFps` | integer | `0` | Minimum video frame rate (0 = off); photos always pass |\n| `minDuration` | integer | `0` | Minimum video duration in seconds (0 = off) |\n| `maxDuration` | integer | `0` | Maximum video duration in seconds (0 = off) |\n| `publishedAfter` | string | empty | `YYYY-MM-DD`; keep media published on or after this date |\n| `publishedBefore` | string | empty | `YYYY-MM-DD`; keep media published on or before this date |\n| `mediaIds` | array | `[]` | Photo/video IDs or URLs for ID and similar modes |\n| `username` | string | empty | Photographer handle, ID, or profile URL |\n| `collectionSlug` | string | empty | Collection slug or full URL |\n| `maxItems` | integer | `30` | Global cap (1-5000); prefill 3 for the daily test |\n| `includeDetails` | boolean | `false` | Add views/downloads/likes, EXIF, content safety, and full profile stats; one extra request per item |\n| `dedupe` | boolean | `true` | Keep only the first occurrence of each media ID |\n| `proxyConfiguration` | object | off | Optional proxy override; the actor works directly and escalates only when blocked |\n\n## Examples\n\nSearch landscape nature photos at least 24 MP:\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQueries\": [\"nature\"],\n  \"mediaType\": \"photos\",\n  \"orientation\": \"landscape\",\n  \"size\": \"large\",\n  \"maxItems\": 50\n}\n```\n\nSearch short ocean videos at 60 fps or higher:\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQueries\": [\"ocean\"],\n  \"mediaType\": \"videos\",\n  \"minFps\": 60,\n  \"maxDuration\": 30,\n  \"maxItems\": 20\n}\n```\n\nGet a photographer's portfolio in Spanish:\n\n```json\n{\n  \"mode\": \"byUser\",\n  \"username\": \"alex-ivanov-773258579\",\n  \"locale\": \"es-ES\",\n  \"maxItems\": 100\n}\n```\n\nLook up a photo and a video by ID:\n\n```json\n{\n  \"mode\": \"byMediaId\",\n  \"mediaIds\": [\"18872916\", \"25961000\"]\n}\n```\n\nScrape a collection, including its videos:\n\n```json\n{\n  \"mode\": \"byCollection\",\n  \"collectionSlug\": \"fashion-kwvfk6o\",\n  \"mediaType\": \"all\",\n  \"maxItems\": 100\n}\n```\n\nFind media similar to a photo or video:\n\n```json\n{\n  \"mode\": \"similarMedia\",\n  \"mediaIds\": [\"18872916\"],\n  \"maxItems\": 24\n}\n```\n\nPaste any Pexels link:\n\n```json\n{\n  \"mode\": \"byUrl\",\n  \"startUrls\": [\n    {\"url\": \"https://www.pexels.com/search/nature/?orientation=landscape\"},\n    {\"url\": \"https://www.pexels.com/photo/18872916/\"},\n    {\"url\": \"https://www.pexels.com/@alex-ivanov-773258579/\"},\n    {\"url\": \"https://www.pexels.com/collections/aquatic-aesthetic-bw7dkse/\"}\n  ],\n  \"maxItems\": 60\n}\n```\n\n## Output\n\nEvery row is one photo or video. Existing field names are preserved.\n\n### Photo fields\n\n`photoId`, `title`, `description`, `alt`, `slug`, `width`, `height`, `orientation`, `aspectRatio`, `license`, `licenseUrl`, `featured`, `createdAt`, `publishedAt`, `updatedAt`, `feedAt`, `photographerName`, `photographerId`, `photographerUsername`, `photographerUrl`, `photographerAvatarUrl`, `photographerLocation`, `photographerInstagram`, `photographerTwitter`, `photographerIsHero`, `photographerSuperhero`, `photographerActiveHero`, `photographerBadges`, `photographerDonateUrl`, `attribution`, `tags`, `imageSmallUrl`, `imageMediumUrl`, `imageLargeUrl`, `imageOriginalUrl`, `downloadUrl`, `downloadPageUrl`, `avgColor`, `colorPalette`, `collectionIds`, `reactionEmotionalCount`, `reactionTechnicalCount`, `reactionStylisticCount`, `pageUrl`, `sourceUrl`, `recordType`, `scrapedAt`.\n\nWith `includeDetails` or `byMediaId`, photos can also include `cameraMake`, `cameraModel`, `cameraIso`, `cameraAperture`, `cameraFocalLength`, `cameraShutterSpeed`, `cameraSoftware`, `photographedAt`, `cameraOrientation`, `fileSizeBytes`, `latitude`, `longitude`, `locationName`, `copyright`, `googlePlaceId`, `contentSafety`, `viewsCount`, `downloadsCount`, `likesCount`, `imageViewsCount`, and the full profile fields below.\n\n### Video fields\n\n`videoId`, `title`, `description`, `slug`, `width`, `height`, `orientation`, `aspectRatio`, `durationSeconds`, `fps`, `license`, `licenseUrl`, `featured`, `createdAt`, `publishedAt`, `updatedAt`, `feedAt`, `photographerName`, `photographerId`, `photographerUsername`, `photographerUrl`, `photographerAvatarUrl`, `photographerLocation`, `photographerInstagram`, `photographerTwitter`, `photographerIsHero`, `photographerSuperhero`, `photographerActiveHero`, `photographerBadges`, `photographerDonateUrl`, `attribution`, `tags`, `videoPreviewUrl`, `videoProvider`, `thumbnailSmallUrl`, `thumbnailMediumUrl`, `thumbnailLargeUrl`, `downloadUrl`, `downloadPageUrl`, `videoFiles[]`, `bestVideoUrl`, `collectionIds`, `reactionEmotionalCount`, `reactionTechnicalCount`, `reactionStylisticCount`, `pageUrl`, `sourceUrl`, `recordType`, `scrapedAt`.\n\n`videoFiles[]` entries contain `url`, `quality` (when Pexels supplies it), `width`, `height`, `fps`, `fileType`, and `downloadUrl`. There is no top-level `videoQuality` field; the quality label lives inside each `videoFiles[]` entry.\n\n### Profile fields (detail / portfolio modes)\n\n`photographerBio`, `photographerWebsite`, `photographerYoutube`, `photographerTiktok`, `photographerFollowersCount`, `photographerFollowingsCount`, `photographerPhotosCount`, `photographerMediaCount`, `photographerPortfolioMediaCount`, `photographerCollectionsCount`, `photographerFirstUploadedOn`, `photographerLastUploadedAt`, `photographerImageViewsAllTime`, `photographerImageViewsLast30Days`, `photographerChallengesWonCount`, `photographerChallengesParticipatedCount`, `photographerHomepageFeaturedCount`, `photographerLeaderboardLast30DaysPosition`, `photographerLeaderboardAllTimePosition`, `photographerConfirmed`, `photographerBadges[]`.\n\n### Provenance\n\n`foundBy` is one of `keyword`, `curated`, `id`, `user`, `collection`, or `similar`; `query`, `seedMediaId`, `collectionSlug`, and `username` are added where they apply. `sourceUrl` remains the media page URL for backward compatibility.\n\n## Limits and data notes\n\n- **Search depth:** Pexels serves at most about **480 records per search query** (20 pages of 24). Page 21 and beyond return empty even though the site displays `total_results=10000`. Use narrower queries, filters, multiple queries, or the curated/profile/collection modes for more.\n- **Curated feed:** photos only. The public feed contains about **68,000 curated photos** and paginates at 80 per page.\n- **Photographer, collection, and similar feeds:** 80 records per page and paginate to the source total. The HTML fallback is limited to its first 12 records because `?page=N` is ignored on those pages; the actor uses the public web JSON route for full pagination.\n- **Video by ID:** Pexels returns 403 for a bare numeric video URL without a locale prefix; the actor resolves video IDs through the media JSON route first, then falls back to the locale-prefixed video page (`/{locale}/video/<id>/`) and its detail data.\n- **Server-side filters:** orientation, size, color/hex, people count, people age, locale, and video resolution/frame-rate parameters are honored. Duration, width, height, and publish-date filters are applied by the actor on the returned records because Pexels' web route ignores them.\n- **Camera and location fields are conditional:** in a 10-photo sample, camera data was present on 50%, a location name on 20%, and latitude/longitude on 0%. A later 50-photo audit found camera and location text on 26-60% of records but no coordinates. Empty fields are omitted, never fabricated.\n- **Coordinates and collection membership are not public:** the anonymous Pexels route exposes `mediumDetails` latitude/longitude as null and returns an empty `collection_ids` array. The actor keeps `latitude`, `longitude`, and `collectionIds` for compatibility but omits them when Pexels does not provide values.\n- **Image originals:** most originals are JPEG, but some are PNG. The actor takes the original URL from Pexels' own download link instead of assuming an extension.\n- **Attribution:** Pexels asks API users to credit photographers and link back to Pexels. The actor adds a ready-to-use `attribution` field and `licenseUrl` to every record. The Pexels license itself does not require attribution.\n- **No account, cookie, or API key:** all data comes from public Pexels pages and Pexels' public browser route. The actor keeps an HTML fallback if the public route changes.\n- **Proxy:** direct connections are the default. The actor escalates automatically only if Pexels blocks the run. The optional `proxyConfiguration` field is an override, not a requirement.\n\n## Use cases\n\n- Content and social teams sourcing campaign imagery and clips\n- Designers building moodboards and placeholders at specific sizes and orientations\n- Video editors finding 4K/60 fps clips by duration\n- AI and ML teams building tagged image/video datasets with dimensions, colors, and engagement signals\n- Digital asset teams mirroring direct CDN URLs into a DAM with photographer credit and license traceability\n- Localization teams pulling the same query in multiple languages\n\n## FAQ\n\n**Is this affiliated with Pexels?**\nNo. This is an independent third-party actor that reads public Pexels pages. It is not affiliated with or endorsed by Pexels.\n\n**Do I need a Pexels account or API key?**\nNo. The actor does not use the official Pexels API, so there is no account, API key, quota, or cookie to supply.\n\n**Are the media files free to use?**\nPexels publishes its content under the Pexels License, which allows free personal and commercial use without attribution. Review the current license and the context of each asset before publishing. The actor returns `licenseUrl` and `attribution` to make credit easy.\n\n**Why do some records miss camera or location fields?**\nThose values come from the original upload and the photographer's profile. Pexels only retains them when they were supplied. The actor omits unavailable fields instead of returning an empty column.\n\n**Why did `search` stop at about 480 records?**\nThat is Pexels' anonymous search ceiling. Split the topic into narrower queries or use `curated`, `byUser`, `byCollection`, or `similarMedia`, which paginate to larger totals.\n\n**Why does a collection return 84 records when I asked for 100?**\nThe collection itself has 84 records. `maxItems` is a cap, not a guarantee that the source contains that many matches.\n\n**Can I get videos in a collection or portfolio?**\nYes. Set `mediaType` to `videos` or `all`. Collection media type filtering is applied by the actor; portfolio media type is also filtered server-side.\n\n**What is `includeDetails`?**\nIt opens each media's detail page to add views, downloads, likes, camera/EXIF data, content safety, and full profile stats. It costs one extra request per item. `byMediaId` always enriches because exact lookup is expected to return the complete record.\n\n**Can I paste a normal Pexels URL?**\nYes. `byUrl` accepts search pages (with their filters), photo pages, video pages, photographer profiles, collections, image-file URLs, and video-file URLs.\n\n**Are the CDN links stable?**\nAll tested `images.pexels.com` and `videos.pexels.com` links returned 200. The actor returns the URLs exactly as Pexels supplies them, including the original file and every video rendition. Keep the media ID as the stable key.\n\n**How fresh is the data?**\nEvery run reads Pexels live, so engagement counts and search order reflect the moment of the run.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "pexels-stock-media-scraper-2",
      "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",
      "buildTag": "latest",
      "dockerfile": "./Dockerfile",
      "readme": "# Pexels Stock Media Scraper\n\nScrape **Pexels** photos and videos without a Pexels account, cookie, or API key. Search by keyword, browse the curated feed, pull a photographer's portfolio or a collection, look up exact photos and videos by ID or URL, find similar media, or paste any Pexels link. Get direct CDN URLs at every size and video rendition, tags, colors, dimensions, photographer credit, engagement counts, camera metadata, and the full photographer profile.\n\n## What this actor does\n\n- **Seven ways in:** `search`, `curated`, `byMediaId`, `byUser`, `byCollection`, `similarMedia`, `byUrl`\n- **Photos and videos in one actor:** search one type or both, and mix photo/video IDs and URLs\n- **Full filter surface:** orientation, size, color or hex, people count, people age, locale, minimum width/height, minimum FPS, duration range, and publish-date window\n- **Direct media URLs:** multiple image sizes, the original file, every video rendition, and a highest-resolution convenience URL\n- **Photographer credit:** name, profile, avatar, location, socials, donation link, hero/superhero badges, and full profile statistics\n- **Engagement and camera data:** views, downloads, likes, image views, reactions, EXIF camera fields, content-safety ratings, and file size when `includeDetails` is on\n- **Empty fields are omitted:** you never have to defend against `null`\n- **No browser:** the actor uses Pexels' public web JSON route with an HTML fallback, so runs are small and fast\n\n## Modes\n\n| Mode | What you give it | What you get |\n|---|---|---|\n| `search` | `searchQueries` + `mediaType` | Keyword results, photos, videos, or both |\n| `curated` | nothing | Pexels' editorial photo feed (paginated) |\n| `byMediaId` | `mediaIds` | Exact photos and videos by ID or URL, enriched with detail data |\n| `byUser` | `username` | A photographer's full portfolio, with profile stats |\n| `byCollection` | `collectionSlug` | Every photo and video in a collection |\n| `similarMedia` | `mediaIds` | Pexels' related-media feed for each seed |\n| `byUrl` | `startUrls` | Automatically routes search, photo, video, profile, collection, image, and video-file URLs |\n\nLegacy mode values are still accepted in code: `byPhotoId` maps to `byMediaId` and `similarPhotos` maps to `similarMedia`. The old `searchQuery` and `photoIds` input keys are mapped too, so saved tasks keep working.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `search` | `search` / `curated` / `byMediaId` / `byUser` / `byCollection` / `similarMedia` / `byUrl` |\n| `searchQueries` | array | `[]` | One or more keywords for search |\n| `mediaType` | string | `photos` | `photos` / `videos` / `all` |\n| `startUrls` | array | `[]` | Pexels URLs for `byUrl` |\n| `orientation` | string | `all` | `all` / `landscape` / `portrait` / `square` |\n| `size` | string | `all` | `all` / `large` (24 MP or 4K) / `medium` (12 MP or Full HD) / `small` (4 MP or HD) |\n| `color` | string | `all` | 12 Pexels colors, photos only |\n| `colorHex` | string | empty | Any hex color such as `#2563eb`; overrides `color` |\n| `peopleCount` | string | `all` | `all` / `0` / `1` / `2` |\n| `peopleAge` | string | `all` | `all` / `baby` / `child` / `teenager` / `adult` |\n| `locale` | string | `en-US` | 28 Pexels locales; localizes titles, descriptions, and search |\n| `minWidth` | integer | `0` | Minimum width in pixels (0 = off) |\n| `minHeight` | integer | `0` | Minimum height in pixels (0 = off) |\n| `minFps` | integer | `0` | Minimum video frame rate (0 = off); photos always pass |\n| `minDuration` | integer | `0` | Minimum video duration in seconds (0 = off) |\n| `maxDuration` | integer | `0` | Maximum video duration in seconds (0 = off) |\n| `publishedAfter` | string | empty | `YYYY-MM-DD`; keep media published on or after this date |\n| `publishedBefore` | string | empty | `YYYY-MM-DD`; keep media published on or before this date |\n| `mediaIds` | array | `[]` | Photo/video IDs or URLs for ID and similar modes |\n| `username` | string | empty | Photographer handle, ID, or profile URL |\n| `collectionSlug` | string | empty | Collection slug or full URL |\n| `maxItems` | integer | `30` | Global cap (1-5000); prefill 3 for the daily test |\n| `includeDetails` | boolean | `false` | Add views/downloads/likes, EXIF, content safety, and full profile stats; one extra request per item |\n| `dedupe` | boolean | `true` | Keep only the first occurrence of each media ID |\n| `proxyConfiguration` | object | off | Optional proxy override; the actor works directly and escalates only when blocked |\n\n## Examples\n\nSearch landscape nature photos at least 24 MP:\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQueries\": [\"nature\"],\n  \"mediaType\": \"photos\",\n  \"orientation\": \"landscape\",\n  \"size\": \"large\",\n  \"maxItems\": 50\n}\n```\n\nSearch short ocean videos at 60 fps or higher:\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQueries\": [\"ocean\"],\n  \"mediaType\": \"videos\",\n  \"minFps\": 60,\n  \"maxDuration\": 30,\n  \"maxItems\": 20\n}\n```\n\nGet a photographer's portfolio in Spanish:\n\n```json\n{\n  \"mode\": \"byUser\",\n  \"username\": \"alex-ivanov-773258579\",\n  \"locale\": \"es-ES\",\n  \"maxItems\": 100\n}\n```\n\nLook up a photo and a video by ID:\n\n```json\n{\n  \"mode\": \"byMediaId\",\n  \"mediaIds\": [\"18872916\", \"25961000\"]\n}\n```\n\nScrape a collection, including its videos:\n\n```json\n{\n  \"mode\": \"byCollection\",\n  \"collectionSlug\": \"fashion-kwvfk6o\",\n  \"mediaType\": \"all\",\n  \"maxItems\": 100\n}\n```\n\nFind media similar to a photo or video:\n\n```json\n{\n  \"mode\": \"similarMedia\",\n  \"mediaIds\": [\"18872916\"],\n  \"maxItems\": 24\n}\n```\n\nPaste any Pexels link:\n\n```json\n{\n  \"mode\": \"byUrl\",\n  \"startUrls\": [\n    {\"url\": \"https://www.pexels.com/search/nature/?orientation=landscape\"},\n    {\"url\": \"https://www.pexels.com/photo/18872916/\"},\n    {\"url\": \"https://www.pexels.com/@alex-ivanov-773258579/\"},\n    {\"url\": \"https://www.pexels.com/collections/aquatic-aesthetic-bw7dkse/\"}\n  ],\n  \"maxItems\": 60\n}\n```\n\n## Output\n\nEvery row is one photo or video. Existing field names are preserved.\n\n### Photo fields\n\n`photoId`, `title`, `description`, `alt`, `slug`, `width`, `height`, `orientation`, `aspectRatio`, `license`, `licenseUrl`, `featured`, `createdAt`, `publishedAt`, `updatedAt`, `feedAt`, `photographerName`, `photographerId`, `photographerUsername`, `photographerUrl`, `photographerAvatarUrl`, `photographerLocation`, `photographerInstagram`, `photographerTwitter`, `photographerIsHero`, `photographerSuperhero`, `photographerActiveHero`, `photographerBadges`, `photographerDonateUrl`, `attribution`, `tags`, `imageSmallUrl`, `imageMediumUrl`, `imageLargeUrl`, `imageOriginalUrl`, `downloadUrl`, `downloadPageUrl`, `avgColor`, `colorPalette`, `collectionIds`, `reactionEmotionalCount`, `reactionTechnicalCount`, `reactionStylisticCount`, `pageUrl`, `sourceUrl`, `recordType`, `scrapedAt`.\n\nWith `includeDetails` or `byMediaId`, photos can also include `cameraMake`, `cameraModel`, `cameraIso`, `cameraAperture`, `cameraFocalLength`, `cameraShutterSpeed`, `cameraSoftware`, `photographedAt`, `cameraOrientation`, `fileSizeBytes`, `latitude`, `longitude`, `locationName`, `copyright`, `googlePlaceId`, `contentSafety`, `viewsCount`, `downloadsCount`, `likesCount`, `imageViewsCount`, and the full profile fields below.\n\n### Video fields\n\n`videoId`, `title`, `description`, `slug`, `width`, `height`, `orientation`, `aspectRatio`, `durationSeconds`, `fps`, `license`, `licenseUrl`, `featured`, `createdAt`, `publishedAt`, `updatedAt`, `feedAt`, `photographerName`, `photographerId`, `photographerUsername`, `photographerUrl`, `photographerAvatarUrl`, `photographerLocation`, `photographerInstagram`, `photographerTwitter`, `photographerIsHero`, `photographerSuperhero`, `photographerActiveHero`, `photographerBadges`, `photographerDonateUrl`, `attribution`, `tags`, `videoPreviewUrl`, `videoProvider`, `thumbnailSmallUrl`, `thumbnailMediumUrl`, `thumbnailLargeUrl`, `downloadUrl`, `downloadPageUrl`, `videoFiles[]`, `bestVideoUrl`, `collectionIds`, `reactionEmotionalCount`, `reactionTechnicalCount`, `reactionStylisticCount`, `pageUrl`, `sourceUrl`, `recordType`, `scrapedAt`.\n\n`videoFiles[]` entries contain `url`, `quality` (when Pexels supplies it), `width`, `height`, `fps`, `fileType`, and `downloadUrl`. There is no top-level `videoQuality` field; the quality label lives inside each `videoFiles[]` entry.\n\n### Profile fields (detail / portfolio modes)\n\n`photographerBio`, `photographerWebsite`, `photographerYoutube`, `photographerTiktok`, `photographerFollowersCount`, `photographerFollowingsCount`, `photographerPhotosCount`, `photographerMediaCount`, `photographerPortfolioMediaCount`, `photographerCollectionsCount`, `photographerFirstUploadedOn`, `photographerLastUploadedAt`, `photographerImageViewsAllTime`, `photographerImageViewsLast30Days`, `photographerChallengesWonCount`, `photographerChallengesParticipatedCount`, `photographerHomepageFeaturedCount`, `photographerLeaderboardLast30DaysPosition`, `photographerLeaderboardAllTimePosition`, `photographerConfirmed`, `photographerBadges[]`.\n\n### Provenance\n\n`foundBy` is one of `keyword`, `curated`, `id`, `user`, `collection`, or `similar`; `query`, `seedMediaId`, `collectionSlug`, and `username` are added where they apply. `sourceUrl` remains the media page URL for backward compatibility.\n\n## Limits and data notes\n\n- **Search depth:** Pexels serves at most about **480 records per search query** (20 pages of 24). Page 21 and beyond return empty even though the site displays `total_results=10000`. Use narrower queries, filters, multiple queries, or the curated/profile/collection modes for more.\n- **Curated feed:** photos only. The public feed contains about **68,000 curated photos** and paginates at 80 per page.\n- **Photographer, collection, and similar feeds:** 80 records per page and paginate to the source total. The HTML fallback is limited to its first 12 records because `?page=N` is ignored on those pages; the actor uses the public web JSON route for full pagination.\n- **Video by ID:** Pexels returns 403 for a bare numeric video URL without a locale prefix; the actor resolves video IDs through the media JSON route first, then falls back to the locale-prefixed video page (`/{locale}/video/<id>/`) and its detail data.\n- **Server-side filters:** orientation, size, color/hex, people count, people age, locale, and video resolution/frame-rate parameters are honored. Duration, width, height, and publish-date filters are applied by the actor on the returned records because Pexels' web route ignores them.\n- **Camera and location fields are conditional:** in a 10-photo sample, camera data was present on 50%, a location name on 20%, and latitude/longitude on 0%. A later 50-photo audit found camera and location text on 26-60% of records but no coordinates. Empty fields are omitted, never fabricated.\n- **Coordinates and collection membership are not public:** the anonymous Pexels route exposes `mediumDetails` latitude/longitude as null and returns an empty `collection_ids` array. The actor keeps `latitude`, `longitude`, and `collectionIds` for compatibility but omits them when Pexels does not provide values.\n- **Image originals:** most originals are JPEG, but some are PNG. The actor takes the original URL from Pexels' own download link instead of assuming an extension.\n- **Attribution:** Pexels asks API users to credit photographers and link back to Pexels. The actor adds a ready-to-use `attribution` field and `licenseUrl` to every record. The Pexels license itself does not require attribution.\n- **No account, cookie, or API key:** all data comes from public Pexels pages and Pexels' public browser route. The actor keeps an HTML fallback if the public route changes.\n- **Proxy:** direct connections are the default. The actor escalates automatically only if Pexels blocks the run. The optional `proxyConfiguration` field is an override, not a requirement.\n\n## Use cases\n\n- Content and social teams sourcing campaign imagery and clips\n- Designers building moodboards and placeholders at specific sizes and orientations\n- Video editors finding 4K/60 fps clips by duration\n- AI and ML teams building tagged image/video datasets with dimensions, colors, and engagement signals\n- Digital asset teams mirroring direct CDN URLs into a DAM with photographer credit and license traceability\n- Localization teams pulling the same query in multiple languages\n\n## FAQ\n\n**Is this affiliated with Pexels?**\nNo. This is an independent third-party actor that reads public Pexels pages. It is not affiliated with or endorsed by Pexels.\n\n**Do I need a Pexels account or API key?**\nNo. The actor does not use the official Pexels API, so there is no account, API key, quota, or cookie to supply.\n\n**Are the media files free to use?**\nPexels publishes its content under the Pexels License, which allows free personal and commercial use without attribution. Review the current license and the context of each asset before publishing. The actor returns `licenseUrl` and `attribution` to make credit easy.\n\n**Why do some records miss camera or location fields?**\nThose values come from the original upload and the photographer's profile. Pexels only retains them when they were supplied. The actor omits unavailable fields instead of returning an empty column.\n\n**Why did `search` stop at about 480 records?**\nThat is Pexels' anonymous search ceiling. Split the topic into narrower queries or use `curated`, `byUser`, `byCollection`, or `similarMedia`, which paginate to larger totals.\n\n**Why does a collection return 84 records when I asked for 100?**\nThe collection itself has 84 records. `maxItems` is a cap, not a guarantee that the source contains that many matches.\n\n**Can I get videos in a collection or portfolio?**\nYes. Set `mediaType` to `videos` or `all`. Collection media type filtering is applied by the actor; portfolio media type is also filtered server-side.\n\n**What is `includeDetails`?**\nIt opens each media's detail page to add views, downloads, likes, camera/EXIF data, content safety, and full profile stats. It costs one extra request per item. `byMediaId` always enriches because exact lookup is expected to return the complete record.\n\n**Can I paste a normal Pexels URL?**\nYes. `byUrl` accepts search pages (with their filters), photo pages, video pages, photographer profiles, collections, image-file URLs, and video-file URLs.\n\n**Are the CDN links stable?**\nAll tested `images.pexels.com` and `videos.pexels.com` links returned 200. The actor returns the URLs exactly as Pexels supplies them, including the original file and every video rendition. Keep the media ID as the stable key.\n\n**How fresh is the data?**\nEvery run reads Pexels live, so engagement counts and search order reflect the moment of the run.\n",
      "input": {
        "title": "Pexels Stock Media Scraper Input",
        "description": "Scrape free stock photos and videos from Pexels by keyword, photographer, collection, exact media ID/URL, similar media, curated feed, or any pasted Pexels URL. No Pexels account, cookie, or API key is required.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "description": "What to fetch from Pexels. Use Search by keyword for discovery, Look up media by ID/URL for exact assets, Photographer portfolio or Collection for a catalog, Similar media for related assets, Curated feed for Pexels' editorial selection, or Paste URLs to route any Pexels link automatically.",
            "editor": "select",
            "enum": [
              "search",
              "curated",
              "byMediaId",
              "byUser",
              "byCollection",
              "similarMedia",
              "byUrl"
            ],
            "enumTitles": [
              "Search by keyword",
              "Curated feed (editorial photos)",
              "Look up media by ID or URL",
              "Photographer portfolio",
              "Collection",
              "Similar / related media",
              "Paste Pexels URLs"
            ],
            "default": "search",
            "prefill": "search"
          },
          "searchQueries": {
            "title": "Search queries",
            "type": "array",
            "description": "One or more keywords for mode=search, one per line. Each query is searched separately and duplicates are removed. Example: `nature`, `city skyline`, `coffee`.",
            "editor": "stringList",
            "default": [],
            "prefill": [
              "nature"
            ]
          },
          "mediaType": {
            "title": "Media type",
            "type": "string",
            "description": "Photos, videos, or both. `all` searches photos and videos and merges the results. Exact ID/URL lookups return the requested media type regardless of this setting.",
            "editor": "select",
            "enum": [
              "photos",
              "videos",
              "all"
            ],
            "enumTitles": [
              "Photos only",
              "Videos only",
              "Photos and videos"
            ],
            "default": "photos",
            "prefill": "photos"
          },
          "startUrls": {
            "title": "Pexels URLs",
            "type": "array",
            "description": "Pexels search, photo, video, photographer, collection, image-file, or video-file URLs for mode=byUrl. Search URLs keep their orientation, size, color, people, and page filters.",
            "editor": "requestListSources",
            "items": {
              "type": "object",
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL",
                  "description": "Pexels search, media, photographer, collection, or file URL."
                }
              }
            },
            "default": []
          },
          "orientation": {
            "title": "Orientation",
            "type": "string",
            "description": "Filter by media orientation. Applies to search, profile, and collection modes.",
            "editor": "select",
            "enum": [
              "all",
              "landscape",
              "portrait",
              "square"
            ],
            "enumTitles": [
              "Any orientation",
              "Landscape",
              "Portrait",
              "Square"
            ],
            "default": "all",
            "prefill": "all",
            "sectionCaption": "Search filters",
            "sectionDescription": "Optional filters. They apply to search, photographer portfolios, collections, and similar-media feeds; exact ID/URL lookups return the requested asset in full."
          },
          "size": {
            "title": "Minimum size",
            "type": "string",
            "description": "Pexels minimum-size filter. Photos: large is 24 MP, medium is 12 MP, small is 4 MP. Videos: large is 4K, medium is Full HD, small is HD.",
            "editor": "select",
            "enum": [
              "all",
              "large",
              "medium",
              "small"
            ],
            "enumTitles": [
              "Any size",
              "Large (24 MP / 4K)",
              "Medium (12 MP / Full HD)",
              "Small (4 MP / HD)"
            ],
            "default": "all",
            "prefill": "all"
          },
          "color": {
            "title": "Color",
            "type": "string",
            "description": "Filter photos by dominant color. Use Color hex instead for an exact hex value. Photos only.",
            "editor": "select",
            "enum": [
              "all",
              "red",
              "orange",
              "yellow",
              "green",
              "turquoise",
              "blue",
              "violet",
              "pink",
              "brown",
              "black",
              "gray",
              "white"
            ],
            "enumTitles": [
              "Any color",
              "Red",
              "Orange",
              "Yellow",
              "Green",
              "Turquoise",
              "Blue",
              "Violet",
              "Pink",
              "Brown",
              "Black",
              "Gray",
              "White"
            ],
            "default": "all",
            "prefill": "all"
          },
          "colorHex": {
            "title": "Color hex",
            "type": "string",
            "description": "Optional hex color such as `#2563eb` or `#fff`. Overrides the Color dropdown when set. Photos only.",
            "editor": "textfield",
            "default": "",
            "prefill": ""
          },
          "peopleCount": {
            "title": "Number of people",
            "type": "string",
            "description": "Filter by how many people appear in the media. Applies to photos and videos.",
            "editor": "select",
            "enum": [
              "all",
              "0",
              "1",
              "2"
            ],
            "enumTitles": [
              "Any",
              "No people",
              "1 person",
              "2 people"
            ],
            "default": "all",
            "prefill": "all"
          },
          "peopleAge": {
            "title": "People age",
            "type": "string",
            "description": "Filter by the age of people in the media. Applies to photos and videos.",
            "editor": "select",
            "enum": [
              "all",
              "baby",
              "child",
              "teenager",
              "adult"
            ],
            "enumTitles": [
              "Any age",
              "Baby",
              "Child",
              "Teenager",
              "Adult"
            ],
            "default": "all",
            "prefill": "all"
          },
          "locale": {
            "title": "Locale",
            "type": "string",
            "description": "Pexels locale for titles, descriptions, and search results. Search terms are used as typed.",
            "editor": "select",
            "enum": [
              "en-US",
              "pt-BR",
              "es-ES",
              "ca-ES",
              "de-DE",
              "it-IT",
              "fr-FR",
              "sv-SE",
              "id-ID",
              "pl-PL",
              "ja-JP",
              "zh-TW",
              "zh-CN",
              "ko-KR",
              "th-TH",
              "nl-NL",
              "hu-HU",
              "vi-VN",
              "cs-CZ",
              "da-DK",
              "fi-FI",
              "uk-UA",
              "el-GR",
              "ro-RO",
              "nb-NO",
              "sk-SK",
              "tr-TR",
              "ru-RU"
            ],
            "enumTitles": [
              "English (US)",
              "Portuguese (Brazil)",
              "Spanish (Spain)",
              "Catalan",
              "German",
              "Italian",
              "French",
              "Swedish",
              "Indonesian",
              "Polish",
              "Japanese",
              "Chinese (Taiwan)",
              "Chinese (Simplified)",
              "Korean",
              "Thai",
              "Dutch",
              "Hungarian",
              "Vietnamese",
              "Czech",
              "Danish",
              "Finnish",
              "Ukrainian",
              "Greek",
              "Romanian",
              "Norwegian (Bokmal)",
              "Slovak",
              "Turkish",
              "Russian"
            ],
            "default": "en-US",
            "prefill": "en-US"
          },
          "minWidth": {
            "title": "Minimum width (px)",
            "type": "integer",
            "description": "Only return media at least this wide. 0 disables the filter. Enforced on each returned record.",
            "minimum": 0,
            "maximum": 20000,
            "default": 0,
            "prefill": 0
          },
          "minHeight": {
            "title": "Minimum height (px)",
            "type": "integer",
            "description": "Only return media at least this tall. 0 disables the filter. Enforced on each returned record.",
            "minimum": 0,
            "maximum": 20000,
            "default": 0,
            "prefill": 0
          },
          "minFps": {
            "title": "Minimum frame rate",
            "type": "integer",
            "description": "Only return videos with at least this many frames per second (for example 60). 0 disables the filter. Photos always pass.",
            "minimum": 0,
            "maximum": 240,
            "default": 0,
            "prefill": 0
          },
          "minDuration": {
            "title": "Minimum video duration (seconds)",
            "type": "integer",
            "description": "Only return videos at least this many seconds long. 0 disables the filter.",
            "minimum": 0,
            "maximum": 3600,
            "default": 0,
            "prefill": 0
          },
          "maxDuration": {
            "title": "Maximum video duration (seconds)",
            "type": "integer",
            "description": "Only return videos at most this many seconds long. 0 disables the filter.",
            "minimum": 0,
            "maximum": 3600,
            "default": 0,
            "prefill": 0
          },
          "publishedAfter": {
            "title": "Published after",
            "type": "string",
            "description": "Optional YYYY-MM-DD date. Only return media published on or after this date. Applied to the records returned by the current search/all listing.",
            "editor": "textfield",
            "default": "",
            "prefill": ""
          },
          "publishedBefore": {
            "title": "Published before",
            "type": "string",
            "description": "Optional YYYY-MM-DD date. Only return media published on or before this date. Applied to the records returned by the current search/all listing.",
            "editor": "textfield",
            "default": "",
            "prefill": ""
          },
          "mediaIds": {
            "title": "Media IDs or URLs",
            "type": "array",
            "description": "Pexels photo or video IDs, or full photo/video/image-file URLs. Used by Look up media by ID/URL and Similar media modes.",
            "editor": "stringList",
            "default": [],
            "prefill": [
              "18872916"
            ],
            "sectionCaption": "Lookup targets",
            "sectionDescription": "Targets for the ID, photographer, and collection modes. Each field is used only by its matching mode."
          },
          "username": {
            "title": "Photographer username",
            "type": "string",
            "description": "Pexels photographer handle, ID, or profile URL for mode=byUser. Example: `alex-ivanov-773258579` or `https://www.pexels.com/@alex-ivanov-773258579/`.",
            "editor": "textfield",
            "default": "",
            "prefill": "alex-ivanov-773258579"
          },
          "collectionSlug": {
            "title": "Collection slug or URL",
            "type": "string",
            "description": "Pexels collection slug or full collection URL for mode=byCollection. Example: `aquatic-aesthetic-bw7dkse`.",
            "editor": "textfield",
            "default": "",
            "prefill": "aquatic-aesthetic-bw7dkse"
          },
          "maxItems": {
            "title": "Max items",
            "type": "integer",
            "description": "Maximum number of media records to return across all queries, IDs, and URLs. Pexels search serves at most about 480 records per query (20 pages of 24); a single search query cannot exceed that even with a higher value.",
            "minimum": 1,
            "maximum": 5000,
            "default": 30,
            "prefill": 3,
            "sectionCaption": "Output options",
            "sectionDescription": "Control the size of the dataset and optional per-item enrichment."
          },
          "includeDetails": {
            "title": "Include engagement and camera details",
            "type": "boolean",
            "description": "Open each media's detail page to add views, downloads, likes, camera/EXIF data, and the photographer's full profile. Adds one request per item and can be slow on large runs. Mode=byMediaId always enriches.",
            "default": false,
            "prefill": false
          },
          "dedupe": {
            "title": "Remove duplicates",
            "type": "boolean",
            "description": "Keep only the first occurrence of each photo or video across queries, IDs, and URLs.",
            "default": true,
            "prefill": true
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Optional Apify proxy override. The actor works directly without a proxy and escalates automatically only if Pexels blocks the run.",
            "editor": "proxy",
            "default": {
              "useApifyProxy": false
            },
            "prefill": {
              "useApifyProxy": false
            },
            "sectionCaption": "Advanced",
            "sectionDescription": "Optional transport override. Leave the proxy off for the default direct-first behavior."
          }
        },
        "required": [
          "mode"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Pexels Stock Media Scraper Output",
        "description": "Free stock photos and videos from Pexels — titles, photographer credit, dimensions, tags, colors, and direct image/video file URLs.",
        "properties": {
          "media": {
            "type": "string",
            "title": "Pexels media",
            "description": "Dataset containing all scraped Pexels photos and videos.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "defaultMemoryMbytes": 2048,
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "views": {
            "overview": {
              "title": "Media",
              "transformation": {
                "fields": [
                  "recordType",
                  "photoId",
                  "videoId",
                  "title",
                  "photographerName",
                  "width",
                  "height",
                  "orientation",
                  "durationSeconds",
                  "license",
                  "attribution",
                  "downloadUrl",
                  "pageUrl"
                ]
              },
              "display": {
                "component": "table",
                "properties": {}
              }
            }
          }
        }
      },
      "environmentVariables": {},
      "defaultRunOptions": {
        "build": "latest",
        "timeoutSecs": 3600,
        "memoryMbytes": 1024
      }
    },
    "buildNumber": "1.0.2",
    "imageDigest": "02c3741b85ef397cf3efd7894d106e199cd850b3a0191ed99250343e0e40d150",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.009965555555555556
    }
  }
}