install
source · Clone the upstream repo
git clone https://github.com/openclaw/skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/brokenwatch24/unsplash" ~/.claude/skills/clawdbot-skills-unsplash && rm -rf "$T"
manifest:
skills/brokenwatch24/unsplash/SKILL.mdsource content
Unsplash API
Search, browse, and download high-quality free photos from Unsplash's library of millions of images.
Setup & Authentication
Get your Access Key
- Create account at https://unsplash.com/developers
- Register a new application
- Copy your Access Key (starts with your app name)
Store credentials
mkdir -p ~/.config/unsplash echo "YOUR_ACCESS_KEY" > ~/.config/unsplash/access_key chmod 600 ~/.config/unsplash/access_key
Or set environment variable:
export UNSPLASH_ACCESS_KEY="your_access_key_here"
Rate Limits
- Demo: 50 requests/hour
- Production: 5,000 requests/hour (after app approval)
- Only
endpoints count; image URLs (/v1/messages
) don'timages.unsplash.com
Common Operations
Search Photos
curl "https://api.unsplash.com/search/photos?query=nature&per_page=10" \ -H "Authorization: Client-ID ${UNSPLASH_ACCESS_KEY}"
Parameters:
: Search terms (required)query
: Page number (default: 1)page
: Results per page (default: 10, max: 30)per_page
:order_by
(default) orrelevantlatest
: Filter by color (color
,black_and_white
,black
,white
,yellow
,orange
,red
,purple
,magenta
,green
,teal
)blue
:orientation
,landscape
, orportraitsquarish
Get Random Photo
curl "https://api.unsplash.com/photos/random?query=coffee&count=1" \ -H "Authorization: Client-ID ${UNSPLASH_ACCESS_KEY}"
Parameters:
: Limit to search term (optional)query
: Number of photos (1-30, default: 1)count
: Filter by orientationorientation
: Filter by collection IDs (comma-separated)collections
Get Photo Details
curl "https://api.unsplash.com/photos/PHOTO_ID" \ -H "Authorization: Client-ID ${UNSPLASH_ACCESS_KEY}"
Returns full photo metadata including EXIF, location, user info, and all image URLs.
Track Download (Required!)
Important: You MUST trigger this endpoint when downloading a photo to comply with API guidelines.
curl "https://api.unsplash.com/photos/PHOTO_ID/download" \ -H "Authorization: Client-ID ${UNSPLASH_ACCESS_KEY}"
This increments the download counter. Response includes the download URL.
List Editorial Feed
curl "https://api.unsplash.com/photos?per_page=10" \ -H "Authorization: Client-ID ${UNSPLASH_ACCESS_KEY}"
Browse Collections
# List all collections curl "https://api.unsplash.com/collections?per_page=10" \ -H "Authorization: Client-ID ${UNSPLASH_ACCESS_KEY}" # Get collection photos curl "https://api.unsplash.com/collections/COLLECTION_ID/photos" \ -H "Authorization: Client-ID ${UNSPLASH_ACCESS_KEY}"
User Photos
curl "https://api.unsplash.com/users/USERNAME/photos?per_page=10" \ -H "Authorization: Client-ID ${UNSPLASH_ACCESS_KEY}"
Working with Images
Image URLs
Every photo response includes these URLs:
{ "urls": { "raw": "https://images.unsplash.com/photo-xxx?ixid=xxx", "full": "...?ixid=xxx&q=80&fm=jpg", "regular": "...?ixid=xxx&w=1080&fit=max", "small": "...?w=400&fit=max", "thumb": "...?w=200&fit=max" } }
Dynamic Resizing
Add parameters to any image URL (keep the
ixid parameter!):
: Set widthw=1500
: Set heighth=800
: Device pixel ratiodpr=2
: Quality (1-100)q=75
: Format (jpg, png, webp, avif)fm=jpg
: Fit mode (crop, max, clip)fit=crop
: Crop modecrop=entropy
Example:
https://images.unsplash.com/photo-xxx?ixid=xxx&w=1500&h=1000&fit=crop&q=85
BlurHash Placeholders
Each photo includes a
blur_hash field - a compact string representation for showing blurred placeholders while images load.
{ "blur_hash": "LoC%a7IoIVxZ_NM|M{s:%hRjWAo0" }
Response Structure
Photo Object (abbreviated)
{ "id": "LBI7cgq3pbM", "created_at": "2016-05-03T11:00:28-04:00", "width": 5245, "height": 3497, "color": "#60544D", "blur_hash": "LoC%a7IoIVxZ_NM|M{s:%hRjWAo0", "description": "A man drinking coffee", "urls": { "raw": "...", "full": "...", "regular": "..." }, "links": { "download": "...", "download_location": "https://api.unsplash.com/photos/xxx/download" }, "user": { "username": "johndoe", "name": "John Doe", "profile_image": { "small": "...", "medium": "...", "large": "..." } } }
Search Response
{ "total": 133, "total_pages": 7, "results": [ /* array of photo objects */ ] }
Best Practices
Attribution
Always attribute photos to their creators:
Photo by [Name] on Unsplash
Link to photographer's Unsplash profile when possible.
Download Tracking
- Call
before allowing users to download/photos/:id/download - This is required by Unsplash API Guidelines
- Don't use it for just displaying images (that's tracked automatically via hotlinking)
Hotlinking
- You can hotlink images directly from
images.unsplash.com - These don't count against rate limits
- Views are tracked automatically
- Always keep the
parameter in URLsixid
Caching
- Public endpoints (search, photos) are cacheable
- Consider caching search results client-side to reduce API calls
Quick Reference
# Store key export UNSPLASH_ACCESS_KEY="your_key" # Search curl "https://api.unsplash.com/search/photos?query=ocean&per_page=5" \ -H "Authorization: Client-ID ${UNSPLASH_ACCESS_KEY}" # Random photo curl "https://api.unsplash.com/photos/random?query=mountains" \ -H "Authorization: Client-ID ${UNSPLASH_ACCESS_KEY}" # Get photo curl "https://api.unsplash.com/photos/PHOTO_ID" \ -H "Authorization: Client-ID ${UNSPLASH_ACCESS_KEY}" # Track download (required when downloading!) curl "https://api.unsplash.com/photos/PHOTO_ID/download" \ -H "Authorization: Client-ID ${UNSPLASH_ACCESS_KEY}"
Notes
- Base URL:
https://api.unsplash.com - All responses are JSON
- Pagination via
andpage
parametersper_page - Link headers provide first/prev/next/last page URLs
- Image requests to
don't count against rate limitsimages.unsplash.com - Keep the
parameter when using/manipulating image URLsixid - For production use, apply for increased rate limits in your dashboard
Common Filters
Colors
black_and_white, black, white, yellow, orange, red, purple, magenta, green, teal, blue
Orientations
landscape, portrait, squarish
Sort Options
- Photos:
,latest
,oldestpopular - Search:
,relevantlatest
Error Handling
: Invalid or missing access key401 Unauthorized
: Rate limit exceeded or forbidden action403 Forbidden
: Photo/user/collection doesn't exist404 Not Found
Check
X-Ratelimit-Remaining header to monitor your rate limit status.