Sources royalty-free images and videos from Pexels API for design work, placeholders, or content. Creates sidecar metadata files for each asset.
How this skill is triggered — by the user, by Claude, or both
Slash command
/issue-driven-development:pexels-mediaopusThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Source high-quality, royalty-free images and videos from Pexels for design work, placeholders, or content creation.
Source high-quality, royalty-free images and videos from Pexels for design work, placeholders, or content creation.
This skill requires the PEXELS_API_KEY environment variable to be set.
# Check if API key is available
echo $PEXELS_API_KEY
If not set, obtain a free API key from Pexels API.
https://api.pexels.com/v1/https://api.pexels.com/videos/All requests require the Authorization header:
curl -H "Authorization: $PEXELS_API_KEY" "https://api.pexels.com/v1/search?query=nature"
curl -H "Authorization: $PEXELS_API_KEY" \
"https://api.pexels.com/v1/search?query=QUERY&orientation=ORIENTATION&size=SIZE&color=COLOR&locale=LOCALE&page=PAGE&per_page=PER_PAGE"
Parameters:
| Parameter | Required | Values |
|---|---|---|
query | Yes | Search term |
orientation | No | landscape, portrait, square |
size | No | large (24MP), medium (12MP), small (4MP) |
color | No | red, orange, yellow, green, turquoise, blue, violet, pink, brown, black, gray, white, or hex code (e.g., #ffffff) |
locale | No | en-US, pt-BR, es-ES, de-DE, fr-FR, ja-JP, zh-CN, ko-KR, etc. |
page | No | Page number (default: 1) |
per_page | No | Results per page (default: 15, max: 80) |
Trending photos curated by the Pexels team (updated hourly):
curl -H "Authorization: $PEXELS_API_KEY" \
"https://api.pexels.com/v1/curated?page=1&per_page=15"
curl -H "Authorization: $PEXELS_API_KEY" \
"https://api.pexels.com/v1/photos/PHOTO_ID"
curl -H "Authorization: $PEXELS_API_KEY" \
"https://api.pexels.com/videos/search?query=QUERY&orientation=ORIENTATION&size=SIZE&min_width=MIN_WIDTH&min_height=MIN_HEIGHT&min_duration=MIN_DURATION&max_duration=MAX_DURATION&page=PAGE&per_page=PER_PAGE"
Additional Video Parameters:
| Parameter | Description |
|---|---|
min_width | Minimum width in pixels |
min_height | Minimum height in pixels |
min_duration | Minimum duration in seconds |
max_duration | Maximum duration in seconds |
curl -H "Authorization: $PEXELS_API_KEY" \
"https://api.pexels.com/videos/popular?min_width=1920&min_duration=10&max_duration=60&page=1&per_page=15"
curl -H "Authorization: $PEXELS_API_KEY" \
"https://api.pexels.com/videos/videos/VIDEO_ID"
curl -H "Authorization: $PEXELS_API_KEY" \
"https://api.pexels.com/v1/collections/featured?page=1&per_page=15"
curl -H "Authorization: $PEXELS_API_KEY" \
"https://api.pexels.com/v1/collections/COLLECTION_ID?type=TYPE&page=1&per_page=15"
Type parameter: photos, videos, or omit for both.
When downloading photos, these sizes are available in the API response:
| Key | Description |
|---|---|
original | Original size uploaded by photographer |
large2x | Width 940px, height doubled |
large | Width 940px |
medium | Height 350px |
small | Height 130px |
portrait | Width 800px, height 1200px |
landscape | Width 1200px, height 627px |
tiny | Width 280px, height 200px |
Videos include multiple quality files in the response:
| Quality | Typical Resolution |
|---|---|
hd | 1280x720 |
sd | 640x360 |
hls | Adaptive streaming |
| Various | Full HD, 4K when available |
CRITICAL REQUIREMENT: For EVERY downloaded file, you MUST create a sidecar metadata file.
For a downloaded file mountain-sunset.jpg, create mountain-sunset.jpg.meta.json.
{
"source": "pexels",
"type": "photo",
"id": 12345,
"url": "https://www.pexels.com/photo/12345/",
"download_url": "https://images.pexels.com/photos/12345/pexels-photo-12345.jpeg",
"downloaded_size": "large",
"width": 1920,
"height": 1080,
"photographer": "John Doe",
"photographer_url": "https://www.pexels.com/@johndoe",
"photographer_id": 67890,
"avg_color": "#7E5835",
"alt": "Brown mountain during sunset",
"license": "Pexels License - Free for personal and commercial use",
"attribution": "Photo by John Doe on Pexels",
"attribution_html": "<a href=\"https://www.pexels.com/photo/12345/\">Photo</a> by <a href=\"https://www.pexels.com/@johndoe\">John Doe</a> on <a href=\"https://www.pexels.com\">Pexels</a>",
"downloaded_at": "2025-12-02T14:30:00Z",
"api_response": {
// Full original API response for this photo
}
}
{
"source": "pexels",
"type": "video",
"id": 12345,
"url": "https://www.pexels.com/video/12345/",
"download_url": "https://videos.pexels.com/video-files/12345/...",
"downloaded_quality": "hd",
"width": 1920,
"height": 1080,
"duration": 30,
"user": {
"id": 67890,
"name": "John Doe",
"url": "https://www.pexels.com/@johndoe"
},
"video_files": [
{
"id": 1,
"quality": "hd",
"file_type": "video/mp4",
"width": 1920,
"height": 1080,
"link": "https://..."
}
],
"video_pictures": [
{
"id": 1,
"picture": "https://...",
"nr": 0
}
],
"license": "Pexels License - Free for personal and commercial use",
"attribution": "Video by John Doe on Pexels",
"downloaded_at": "2025-12-02T14:30:00Z",
"api_response": {
// Full original API response for this video
}
}
# Search for photos
RESPONSE=$(curl -s -H "Authorization: $PEXELS_API_KEY" \
"https://api.pexels.com/v1/search?query=office+workspace&orientation=landscape&per_page=5")
# Parse and display results
echo "$RESPONSE" | jq '.photos[] | {id, photographer, alt, url: .src.large}'
# Get photo details
PHOTO_ID=12345
PHOTO_DATA=$(curl -s -H "Authorization: $PEXELS_API_KEY" \
"https://api.pexels.com/v1/photos/$PHOTO_ID")
# Extract download URL (choose size)
DOWNLOAD_URL=$(echo "$PHOTO_DATA" | jq -r '.src.large')
FILENAME="pexels-$PHOTO_ID-large.jpg"
# Download the image
curl -L -o "$FILENAME" "$DOWNLOAD_URL"
# Create sidecar metadata (MANDATORY)
echo "$PHOTO_DATA" | jq '{
source: "pexels",
type: "photo",
id: .id,
url: .url,
download_url: .src.large,
downloaded_size: "large",
width: .width,
height: .height,
photographer: .photographer,
photographer_url: .photographer_url,
photographer_id: .photographer_id,
avg_color: .avg_color,
alt: .alt,
license: "Pexels License - Free for personal and commercial use",
attribution: ("Photo by " + .photographer + " on Pexels"),
downloaded_at: (now | todate),
api_response: .
}' > "$FILENAME.meta.json"
X-Ratelimit-LimitX-Ratelimit-RemainingX-Ratelimit-ResetWhile not legally required by the Pexels license, attribution is encouraged:
attribution_html from the sidecar file# Get 5 abstract/minimal images for placeholders
curl -s -H "Authorization: $PEXELS_API_KEY" \
"https://api.pexels.com/v1/search?query=minimal+abstract&orientation=square&size=small&per_page=5"
# Find short, wide landscape videos
curl -s -H "Authorization: $PEXELS_API_KEY" \
"https://api.pexels.com/videos/search?query=nature+aerial&orientation=landscape&min_width=1920&min_duration=5&max_duration=15"
# Search for clean, neutral backgrounds
curl -s -H "Authorization: $PEXELS_API_KEY" \
"https://api.pexels.com/v1/search?query=white+background+texture&color=white&size=large"
When using this skill:
PEXELS_API_KEY is setnpx claudepluginhub troykelly/claude-skills --plugin issue-driven-developmentSearches and fetches high-quality, free-to-use photography from Unsplash for websites, apps, and marketing materials.
Automates Pexels tasks (search photos, videos, collections) via Composio's toolkit through Rube MCP. Requires Rube MCP connection and active Pexels integration.
Resizes photos and videos to exact pixel dimensions or aspect ratios using Adobe tools. Useful for any request specifying target dimensions, resolution, or named sizes like 4K or HD.