Skip to content
Back to skills

Pexels Stock Photos

BSecurity

Use when the user wants a REAL photo — 'find a photo of X', 'search for pictures of Y', 'stock image of Z', 'I need a photo for this slide/article'. Searches Pexels free stock library and downloads images. DO NOT use for AI-generated art ('generate an image of', 'create a picture of', 'make me an illustration') — those go to the image_generate tool or fal-enhanced skill. Key distinction: 'photo' = real stock photography = Pexels; 'generate/create/make an image' = AI art = image_generate/fal-e...

  • 89 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 19, 2026
ai-agentsgobashapi

Works with

  • api

Security analysis

B88/100
  • criticalExfiltrates credentials via HTTP — exact pattern from Snyk ToxicSkills study

Pro scans all 3 files and shows the line behind each finding

Scanned October 5, 2026

npx -y skills add moonlight-lupin/agent-skills --skill pexels-stock-photos --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Pexels Stock Photos?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Pexels Stock Photos
[![Security: B — Skills Directory](https://www.skillsdirectory.com/api/skills/moonlight-lupin-pexels-stock-photos/badge)](https://www.skillsdirectory.com/skills/moonlight-lupin-pexels-stock-photos)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: pexels-stock-photos
description: "Use when the user wants a REAL photo — 'find a photo of X', 'search for pictures of Y', 'stock image of Z', 'I need a photo for this slide/article'. Searches Pexels free stock library and downloads images. DO NOT use for AI-generated art ('generate an image of', 'create a picture of', 'make me an illustration') — those go to the image_generate tool or fal-enhanced skill. Key distinction: 'photo' = real stock photography = Pexels; 'generate/create/make an image' = AI art = image_generate/fal-enhanced."
license: MIT
metadata:
  version: 1.0.0
  author: moonlight-lupin
  platforms: [linux, macos, windows]
---

# Pexels Stock Photos

Search and download free stock photos from the Pexels API (200 req/hr, 20k/month
free). All content is free for commercial and non-commercial use; just credit the
photographer and link to Pexels.

## Routing: Pexels vs AI Generation

| User says... | Tool |
|--------------|------|
| "find a photo of Singapore" / "search for office pictures" / "stock image of a desk" | **Pexels** (this skill) |
| "I need a real photo for this slide" / "find pictures for my article" | **Pexels** (this skill) |
| "generate an image of a cat" / "create a picture of..." / "make me an illustration" | Host's image generation tool |
| "upscale this" / "remove background" / "edit: make warmer" | Host's AI image editing skill |
| "production-ready hero image" / "let's do this properly" | Host's multi-stage image generation skill |

**The key word test:** if the user says **photo**, **picture**, **stock image**,
or **find/search** → Pexels. If the user says **generate**, **create**, **make**,
**draw**, or **illustration** → AI generation.

## When to Use

- User asks for a "photo of X" or "stock image of Y"
- Building presentations (PPTX) that need real imagery
- Article/blog illustrations needing authentic photos
- Social media posts requiring professional photography
- Any request for "real" images vs AI-generated

**Don't use for:**
- AI art / creative generation → host's image generation tool
- Editing existing images → host's image editing skill
- Screenshots or diagrams → use appropriate tools

## API Reference

Base URL: `https://api.pexels.com/v1/`
Auth: `Authorization: <PEXELS_API_KEY>` header

### Endpoints

| Endpoint | Method | Purpose |
|----------|--------|---------|
| `/search` | GET | Search photos by query |
| `/curated` | GET | Curated trending photos |
| `/photos/:id` | GET | Get a specific photo by ID |

### Search Parameters

| Param | Type | Default | Notes |
|-------|------|---------|-------|
| `query` | string | **required** | e.g. "singapore skyline" |
| `orientation` | string | — | `landscape`, `portrait`, `square` |
| `size` | string | — | `large` (24MP), `medium` (12MP), `small` (4MP) |
| `color` | string | — | `red`, `orange`, `blue`, ... or hex `#ffffff` |
| `locale` | string | `en-US` | `zh-CN`, `ja-JP`, etc. |
| `per_page` | int | 15 | Max 80 |
| `page` | int | 1 | Pagination |

### Photo Resource `src` Sizes

| Size | Dimensions | Use case |
|------|-----------|----------|
| `original` | Full res | Print, high-quality |
| `large2x` | 940×650 @2x | Retina displays |
| `large` | 940×650 | Web, presentations |
| `medium` | ~350px height | Thumbnails, previews |
| `small` | ~130px height | Small thumbnails |
| `portrait` | 800×1200 | Vertical/mobile |
| `landscape` | 1200×627 | Slides, social |
| `tiny` | 280×200 | Placeholders |

## Workflow

### 1. Search for photos

```bash
curl -s -H "Authorization: $PEXELS_API_KEY" \
  "https://api.pexels.com/v1/search?query=singapore+skyline&per_page=5&orientation=landscape"
```

Parse the JSON response to present results to the user: photo ID, photographer,
alt text, dimensions, and Pexels URL.

### 2. Download a photo

Use the **`src` URLs from the search response** — don't hand-construct
`images.pexels.com` URLs (the slug/extension isn't guaranteed; Pexels' docs say
to use `src`). Each photo object carries ready-made size variants (see the
`src` table above).

```bash
# Download the size you need, straight from the photo's src field
# (e.g. the value of photos[0].src.large from the search JSON)
curl -sL -o /tmp/pexels_<id>.jpeg "<photo.src.large>"
```

Deliver the file to the user via the host's file delivery mechanism.

### 3. Present results

When showing search results, format as a table:

```
| # | ID | Photographer | Alt | Dimensions |
|---|-----|-------------|-----|------|
| 1 | 5097071 | Dylan Chan | Singapore skyline at dusk | 6016×3384 |
```

Include the Pexels URL so the user can preview before downloading.

## Attribution

Per Pexels guidelines:
- Credit the photographer: "Photo by [Name] on Pexels"
- Link back to the photo page URL
- Include "Photos provided by Pexels" when displaying multiple

Example attribution block:
```
Photo by Dylan Chan on Pexels
https://www.pexels.com/photo/high-rise-buildings-in-singapore-5097071/
```

## Common Pitfalls

1. **API key not in environment.** `PEXELS_API_KEY` must be set before making
   requests. Load it from your environment or `.env` file before calling curl.

2. **Using spaces in query.** URL-encode spaces as `+` or `%20`.
   `singapore skyline` → `singapore+skyline`.

3. **Downloading original for previews.** Original files can be 10MB+. Use
   `large` or `medium` for previews, `original` only when the user needs full
   resolution.

4. **Rate limit awareness.** 200 req/hr, 20k/month — but only **API calls**
   (search, curated, photo lookup) count. CDN downloads from the `src` URLs on
   `images.pexels.com` (no API key needed) do **not** count. Batch searches
   with `per_page=15-80` to minimize API calls.

5. **Not including attribution.** Pexels requires visible credit to the
   photographer and a link to Pexels. Always include attribution text when
   delivering photos.

6. **Hand-built photo URLs.** Don't construct `images.pexels.com/photos/...`
   URLs yourself — the slug and extension aren't guaranteed across photos.
   Always download via the `src.*` URLs from the API response.

## Verification Checklist

- [ ] `PEXELS_API_KEY` is set in the environment
- [ ] Search query returns results (check `total_results > 0`)
- [ ] Downloaded file exists and is non-empty
- [ ] Attribution text included with delivered photo
- [ ] Rate limit headers checked if making many requests (`X-Ratelimit-Remaining`)

Files in this skill

  • README.md1020 B
  • SKILL.md6.5 KB
  • tests/test_skill.py5.1 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.