Pexels Stock Media Scraper
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.
Input schema
Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | 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. |
searchQueries | array | optional | One or more keywords for mode=search, one per line. Each query is searched separately and duplicates are removed. Example: `nature`, `city skyline`, `coffee`. |
mediaType | string | optional | 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. |
Show all input fields
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | 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. |
searchQueries | array | optional | One or more keywords for mode=search, one per line. Each query is searched separately and duplicates are removed. Example: `nature`, `city skyline`, `coffee`. |
mediaType | string | optional | 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. |
startUrls | array | optional | 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. |
orientation | string | optional | Filter by media orientation. Applies to search, profile, and collection modes. |
size | string | optional | 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. |
color | string | optional | Filter photos by dominant color. Use Color hex instead for an exact hex value. Photos only. |
colorHex | string | optional | Optional hex color such as `#2563eb` or `#fff`. Overrides the Color dropdown when set. Photos only. |
peopleCount | string | optional | Filter by how many people appear in the media. Applies to photos and videos. |
peopleAge | string | optional | Filter by the age of people in the media. Applies to photos and videos. |
locale | string | optional | Pexels locale for titles, descriptions, and search results. Search terms are used as typed. |
minWidth | integer | optional | Only return media at least this wide. 0 disables the filter. Enforced on each returned record. |
minHeight | integer | optional | Only return media at least this tall. 0 disables the filter. Enforced on each returned record. |
minFps | integer | optional | Only return videos with at least this many frames per second (for example 60). 0 disables the filter. Photos always pass. |
minDuration | integer | optional | Only return videos at least this many seconds long. 0 disables the filter. |
maxDuration | integer | optional | Only return videos at most this many seconds long. 0 disables the filter. |
publishedAfter | string | optional | 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. |
publishedBefore | string | optional | 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. |
mediaIds | array | optional | Pexels photo or video IDs, or full photo/video/image-file URLs. Used by Look up media by ID/URL and Similar media modes. |
username | string | optional | Pexels photographer handle, ID, or profile URL for mode=byUser. Example: `alex-ivanov-773258579` or `https://www.pexels.com/@alex-ivanov-773258579/`. |
collectionSlug | string | optional | Pexels collection slug or full collection URL for mode=byCollection. Example: `aquatic-aesthetic-bw7dkse`. |
maxItems | integer | optional | 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. |
includeDetails | boolean | optional | 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. |
dedupe | boolean | optional | Keep only the first occurrence of each photo or video across queries, IDs, and URLs. |
proxyConfiguration | object | optional | Optional Apify proxy override. The actor works directly without a proxy and escalates automatically only if Pexels blocks the run. |
Download the published input schema
View complete JSON
{
"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.",
"properties": {
"collectionSlug": {
"default": "",
"description": "Pexels collection slug or full collection URL for mode=byCollection. Example: `aquatic-aesthetic-bw7dkse`.",
"editor": "textfield",
"prefill": "aquatic-aesthetic-bw7dkse",
"title": "Collection slug or URL",
"type": "string"
},
"color": {
"default": "all",
"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"
],
"prefill": "all",
"title": "Color",
"type": "string"
},
"colorHex": {
"default": "",
"description": "Optional hex color such as `#2563eb` or `#fff`. Overrides the Color dropdown when set. Photos only.",
"editor": "textfield",
"prefill": "",
"title": "Color hex",
"type": "string"
},
"dedupe": {
"default": true,
"description": "Keep only the first occurrence of each photo or video across queries, IDs, and URLs.",
"prefill": true,
"title": "Remove duplicates",
"type": "boolean"
},
"includeDetails": {
"default": false,
"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.",
"prefill": false,
"title": "Include engagement and camera details",
"type": "boolean"
},
"locale": {
"default": "en-US",
"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"
],
"prefill": "en-US",
"title": "Locale",
"type": "string"
},
"maxDuration": {
"default": 0,
"description": "Only return videos at most this many seconds long. 0 disables the filter.",
"maximum": 3600,
"minimum": 0,
"prefill": 0,
"title": "Maximum video duration (seconds)",
"type": "integer"
},
"maxItems": {
"default": 30,
"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.",
"maximum": 5000,
"minimum": 1,
"prefill": 3,
"sectionCaption": "Output options",
"sectionDescription": "Control the size of the dataset and optional per-item enrichment.",
"title": "Max items",
"type": "integer"
},
"mediaIds": {
"default": [],
"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",
"prefill": [
"18872916"
],
"sectionCaption": "Lookup targets",
"sectionDescription": "Targets for the ID, photographer, and collection modes. Each field is used only by its matching mode.",
"title": "Media IDs or URLs",
"type": "array"
},
"mediaType": {
"default": "photos",
"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"
],
"prefill": "photos",
"title": "Media type",
"type": "string"
},
"minDuration": {
"default": 0,
"description": "Only return videos at least this many seconds long. 0 disables the filter.",
"maximum": 3600,
"minimum": 0,
"prefill": 0,
"title": "Minimum video duration (seconds)",
"type": "integer"
},
"minFps": {
"default": 0,
"description": "Only return videos with at least this many frames per second (for example 60). 0 disables the filter. Photos always pass.",
"maximum": 240,
"minimum": 0,
"prefill": 0,
"title": "Minimum frame rate",
"type": "integer"
},
"minHeight": {
"default": 0,
"description": "Only return media at least this tall. 0 disables the filter. Enforced on each returned record.",
"maximum": 20000,
"minimum": 0,
"prefill": 0,
"title": "Minimum height (px)",
"type": "integer"
},
"minWidth": {
"default": 0,
"description": "Only return media at least this wide. 0 disables the filter. Enforced on each returned record.",
"maximum": 20000,
"minimum": 0,
"prefill": 0,
"title": "Minimum width (px)",
"type": "integer"
},
"mode": {
"default": "search",
"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"
],
"prefill": "search",
"title": "Mode",
"type": "string"
},
"orientation": {
"default": "all",
"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"
],
"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.",
"title": "Orientation",
"type": "string"
},
"peopleAge": {
"default": "all",
"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"
],
"prefill": "all",
"title": "People age",
"type": "string"
},
"peopleCount": {
"default": "all",
"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"
],
"prefill": "all",
"title": "Number of people",
"type": "string"
},
"proxyConfiguration": {
"default": {
"useApifyProxy": false
},
"description": "Optional Apify proxy override. The actor works directly without a proxy and escalates automatically only if Pexels blocks the run.",
"editor": "proxy",
"prefill": {
"useApifyProxy": false
},
"sectionCaption": "Advanced",
"sectionDescription": "Optional transport override. Leave the proxy off for the default direct-first behavior.",
"title": "Proxy configuration",
"type": "object"
},
"publishedAfter": {
"default": "",
"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",
"prefill": "",
"title": "Published after",
"type": "string"
},
"publishedBefore": {
"default": "",
"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",
"prefill": "",
"title": "Published before",
"type": "string"
},
"searchQueries": {
"default": [],
"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",
"prefill": [
"nature"
],
"title": "Search queries",
"type": "array"
},
"size": {
"default": "all",
"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)"
],
"prefill": "all",
"title": "Minimum size",
"type": "string"
},
"startUrls": {
"default": [],
"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": {
"properties": {
"url": {
"description": "Pexels search, media, photographer, collection, or file URL.",
"title": "URL",
"type": "string"
}
},
"type": "object"
},
"title": "Pexels URLs",
"type": "array"
},
"username": {
"default": "",
"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",
"prefill": "alex-ivanov-773258579",
"title": "Photographer username",
"type": "string"
}
},
"required": [
"mode"
],
"schemaVersion": 1,
"title": "Pexels Stock Media Scraper Input",
"type": "object"
}
Output schema
Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.
| Field | Type | Required | Description |
|---|---|---|---|
media | string | optional | Dataset containing all scraped Pexels photos and videos. |
Download the published output schema
View complete JSON
{
"actorOutputSchemaVersion": 1,
"description": "Free stock photos and videos from Pexels — titles, photographer credit, dimensions, tags, colors, and direct image/video file URLs.",
"properties": {
"media": {
"description": "Dataset containing all scraped Pexels photos and videos.",
"template": "{{links.apiDefaultDatasetUrl}}/items",
"title": "Pexels media",
"type": "string"
}
},
"title": "Pexels Stock Media Scraper Output"
}
Dataset schema
Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.
Download the published dataset schema
View complete JSON
{
"actorSpecification": 1,
"views": {
"overview": {
"display": {
"component": "table",
"properties": {}
},
"title": "Media",
"transformation": {
"fields": [
"recordType",
"photoId",
"videoId",
"title",
"photographerName",
"width",
"height",
"orientation",
"durationSeconds",
"license",
"attribution",
"downloadUrl",
"pageUrl"
]
}
}
}
}
Key-value schema
Published key-value store definitions, when provided by this build.
This definition is not present in the default published build. See the published README for available documentation.
Published README
Read the full published documentation
Pexels Stock Media Scraper
Scrape 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.
What this actor does
- Seven ways in:
search,curated,byMediaId,byUser,byCollection,similarMedia,byUrl - Photos and videos in one actor: search one type or both, and mix photo/video IDs and URLs
- Full filter surface: orientation, size, color or hex, people count, people age, locale, minimum width/height, minimum FPS, duration range, and publish-date window
- Direct media URLs: multiple image sizes, the original file, every video rendition, and a highest-resolution convenience URL
- Photographer credit: name, profile, avatar, location, socials, donation link, hero/superhero badges, and full profile statistics
- Engagement and camera data: views, downloads, likes, image views, reactions, EXIF camera fields, content-safety ratings, and file size when
includeDetailsis on - Empty fields are omitted: you never have to defend against
null - No browser: the actor uses Pexels' public web JSON route with an HTML fallback, so runs are small and fast
Modes
| Mode | What you give it | What you get |
|---|---|---|
search |
searchQueries + mediaType |
Keyword results, photos, videos, or both |
curated |
nothing | Pexels' editorial photo feed (paginated) |
byMediaId |
mediaIds |
Exact photos and videos by ID or URL, enriched with detail data |
byUser |
username |
A photographer's full portfolio, with profile stats |
byCollection |
collectionSlug |
Every photo and video in a collection |
similarMedia |
mediaIds |
Pexels' related-media feed for each seed |
byUrl |
startUrls |
Automatically routes search, photo, video, profile, collection, image, and video-file URLs |
Legacy 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.
Input
| Field | Type | Default | Description |
|---|---|---|---|
mode |
string | search |
search / curated / byMediaId / byUser / byCollection / similarMedia / byUrl |
searchQueries |
array | [] |
One or more keywords for search |
mediaType |
string | photos |
photos / videos / all |
startUrls |
array | [] |
Pexels URLs for byUrl |
orientation |
string | all |
all / landscape / portrait / square |
size |
string | all |
all / large (24 MP or 4K) / medium (12 MP or Full HD) / small (4 MP or HD) |
color |
string | all |
12 Pexels colors, photos only |
colorHex |
string | empty | Any hex color such as #2563eb; overrides color |
peopleCount |
string | all |
all / 0 / 1 / 2 |
peopleAge |
string | all |
all / baby / child / teenager / adult |
locale |
string | en-US |
28 Pexels locales; localizes titles, descriptions, and search |
minWidth |
integer | 0 |
Minimum width in pixels (0 = off) |
minHeight |
integer | 0 |
Minimum height in pixels (0 = off) |
minFps |
integer | 0 |
Minimum video frame rate (0 = off); photos always pass |
minDuration |
integer | 0 |
Minimum video duration in seconds (0 = off) |
maxDuration |
integer | 0 |
Maximum video duration in seconds (0 = off) |
publishedAfter |
string | empty | YYYY-MM-DD; keep media published on or after this date |
publishedBefore |
string | empty | YYYY-MM-DD; keep media published on or before this date |
mediaIds |
array | [] |
Photo/video IDs or URLs for ID and similar modes |
username |
string | empty | Photographer handle, ID, or profile URL |
collectionSlug |
string | empty | Collection slug or full URL |
maxItems |
integer | 30 |
Global cap (1-5000); prefill 3 for the daily test |
includeDetails |
boolean | false |
Add views/downloads/likes, EXIF, content safety, and full profile stats; one extra request per item |
dedupe |
boolean | true |
Keep only the first occurrence of each media ID |
proxyConfiguration |
object | off | Optional proxy override; the actor works directly and escalates only when blocked |
Examples
Search landscape nature photos at least 24 MP:
{
"mode": "search",
"searchQueries": ["nature"],
"mediaType": "photos",
"orientation": "landscape",
"size": "large",
"maxItems": 50
}
Search short ocean videos at 60 fps or higher:
{
"mode": "search",
"searchQueries": ["ocean"],
"mediaType": "videos",
"minFps": 60,
"maxDuration": 30,
"maxItems": 20
}
Get a photographer's portfolio in Spanish:
{
"mode": "byUser",
"username": "alex-ivanov-773258579",
"locale": "es-ES",
"maxItems": 100
}
Look up a photo and a video by ID:
{
"mode": "byMediaId",
"mediaIds": ["18872916", "25961000"]
}
Scrape a collection, including its videos:
{
"mode": "byCollection",
"collectionSlug": "fashion-kwvfk6o",
"mediaType": "all",
"maxItems": 100
}
Find media similar to a photo or video:
{
"mode": "similarMedia",
"mediaIds": ["18872916"],
"maxItems": 24
}
Paste any Pexels link:
{
"mode": "byUrl",
"startUrls": [
{"url": "https://www.pexels.com/search/nature/?orientation=landscape"},
{"url": "https://www.pexels.com/photo/18872916/"},
{"url": "https://www.pexels.com/@alex-ivanov-773258579/"},
{"url": "https://www.pexels.com/collections/aquatic-aesthetic-bw7dkse/"}
],
"maxItems": 60
}
Output
Every row is one photo or video. Existing field names are preserved.
Photo fields
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.
With 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.
Video fields
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.
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.
Profile fields (detail / portfolio modes)
photographerBio, photographerWebsite, photographerYoutube, photographerTiktok, photographerFollowersCount, photographerFollowingsCount, photographerPhotosCount, photographerMediaCount, photographerPortfolioMediaCount, photographerCollectionsCount, photographerFirstUploadedOn, photographerLastUploadedAt, photographerImageViewsAllTime, photographerImageViewsLast30Days, photographerChallengesWonCount, photographerChallengesParticipatedCount, photographerHomepageFeaturedCount, photographerLeaderboardLast30DaysPosition, photographerLeaderboardAllTimePosition, photographerConfirmed, photographerBadges[].
Provenance
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.
Limits and data notes
- 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. - Curated feed: photos only. The public feed contains about 68,000 curated photos and paginates at 80 per page.
- 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=Nis ignored on those pages; the actor uses the public web JSON route for full pagination. - 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. - 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.
- 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.
- Coordinates and collection membership are not public: the anonymous Pexels route exposes
mediumDetailslatitude/longitude as null and returns an emptycollection_idsarray. The actor keepslatitude,longitude, andcollectionIdsfor compatibility but omits them when Pexels does not provide values. - 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.
- Attribution: Pexels asks API users to credit photographers and link back to Pexels. The actor adds a ready-to-use
attributionfield andlicenseUrlto every record. The Pexels license itself does not require attribution. - 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.
- Proxy: direct connections are the default. The actor escalates automatically only if Pexels blocks the run. The optional
proxyConfigurationfield is an override, not a requirement.
Use cases
- Content and social teams sourcing campaign imagery and clips
- Designers building moodboards and placeholders at specific sizes and orientations
- Video editors finding 4K/60 fps clips by duration
- AI and ML teams building tagged image/video datasets with dimensions, colors, and engagement signals
- Digital asset teams mirroring direct CDN URLs into a DAM with photographer credit and license traceability
- Localization teams pulling the same query in multiple languages
FAQ
Is this affiliated with Pexels? No. This is an independent third-party actor that reads public Pexels pages. It is not affiliated with or endorsed by Pexels.
Do I need a Pexels account or API key? No. The actor does not use the official Pexels API, so there is no account, API key, quota, or cookie to supply.
Are the media files free to use?
Pexels 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.
Why do some records miss camera or location fields? Those 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.
Why did search stop at about 480 records?
That is Pexels' anonymous search ceiling. Split the topic into narrower queries or use curated, byUser, byCollection, or similarMedia, which paginate to larger totals.
Why does a collection return 84 records when I asked for 100?
The collection itself has 84 records. maxItems is a cap, not a guarantee that the source contains that many matches.
Can I get videos in a collection or portfolio?
Yes. Set mediaType to videos or all. Collection media type filtering is applied by the actor; portfolio media type is also filtered server-side.
What is includeDetails?
It 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.
Can I paste a normal Pexels URL?
Yes. byUrl accepts search pages (with their filters), photo pages, video pages, photographer profiles, collections, image-file URLs, and video-file URLs.
Are the CDN links stable?
All 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.
How fresh is the data? Every run reads Pexels live, so engagement counts and search order reflect the moment of the run.
Python quickstart
Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.
Source build rSmmuRgL2b2u0iqFa. Documentation is regenerated from the default published build; private drafts are not included.