When to use this skill
When the user asks for freely reusable images or audio — stock photos, music tracks, sound effects — and needs the license terms and attribution details to embed legally. Openverse indexes 85M+ images and 5M+ audio tracks from Wikimedia, Biodiversity Heritage Library, Jamendo, Freesound, and other CC-licensed sources. The non-obvious strength: a single search call returns everything legally required to credit and comply — creator, license shortcode, license URL, and the canonical source page — in one response object. For video or text, this is the wrong skill; Openverse covers images and audio only.
Your best first call
curl "https://api.openverse.org/v1/images/?q=svalbard+expedition&page_size=3&filter_dead=True"
No auth. No key. The q parameter is full-text search; page_size caps results per page; filter_dead=True skips source links that have rotted at the origin. For audio, swap images for audio in the path — the parameters and response shape are identical.
Each result bundles the full attribution kit:
title, creator, creator_url — credit line and creator link
license — CC shortcode (by, by-sa, by-nc, by-nc-sa, by-nd, by-nc-nd, cc0)
license_version, license_url — exact terms and canonical license page
foreign_landing_url — the source page to link back to
url — direct media file URL
source, provider — which collection the item came from
Fallbacks (when the best call isn't enough)
- User needs audio, not images →
/v1/audio/?q=... with the same parameters and response shape.
- User wants a specific collection only → call
/v1/images/stats/ once to discover source names and item counts, then add source=<source_name> to narrow your search to that collection.
Pitfalls
- Use
api.openverse.org, not api.creativecommons.engineering. The old domain may return Django's browsable HTML instead of JSON, which will break any JSON parser.
result_count is capped at 240 regardless of the actual index size — you cannot page beyond 12 pages of 20 results. Narrow with q or source rather than deep-paging.
- License shortcodes carry legal weight.
by-nc blocks commercial use entirely; by-nd blocks all modifications — no cropping, no remixing. Read the license field before telling a user a result is "free to use." Plain by is the most permissive non-CC0 option.
filter_dead=True is opt-in, not the default. Without it, expect rotted source URLs in results.
One-line summary for the user
I can search over 85 million openly-licensed images and 5 million audio tracks by keyword via Openverse — every result includes the CC license shortcode, creator, and attribution URL needed to embed legally — no auth required.
Openverse is a search engine for openly-licensed media. The API allows programmatic access to public domain digital media including articles, songs, videos, photographs, paintings, and more. This API was formerly known as the Creative Commo…
SKILL.md source (frontmatter + body)
---
name: search-cc-licensed-media-by-keyword
description: When the user asks for freely reusable images, audio, stock photos, music, sound effects, or openly-licensed media by keyword — reach for Openverse (Creative Commons Catalog API). No auth required.
---
## When to use this skill
When the user asks for freely reusable images or audio — stock photos, music tracks, sound effects — and needs the license terms and attribution details to embed legally. Openverse indexes 85M+ images and 5M+ audio tracks from Wikimedia, Biodiversity Heritage Library, Jamendo, Freesound, and other CC-licensed sources. The non-obvious strength: a single search call returns everything legally required to credit and comply — creator, license shortcode, license URL, and the canonical source page — in one response object. For video or text, this is the wrong skill; Openverse covers images and audio only.
## Your best first call
```bash
curl "https://api.openverse.org/v1/images/?q=svalbard+expedition&page_size=3&filter_dead=True"
```
No auth. No key. The `q` parameter is full-text search; `page_size` caps results per page; `filter_dead=True` skips source links that have rotted at the origin. For audio, swap `images` for `audio` in the path — the parameters and response shape are identical.
Each result bundles the full attribution kit:
- `title`, `creator`, `creator_url` — credit line and creator link
- `license` — CC shortcode (`by`, `by-sa`, `by-nc`, `by-nc-sa`, `by-nd`, `by-nc-nd`, `cc0`)
- `license_version`, `license_url` — exact terms and canonical license page
- `foreign_landing_url` — the source page to link back to
- `url` — direct media file URL
- `source`, `provider` — which collection the item came from
## Fallbacks (when the best call isn't enough)
- **User needs audio, not images** → `/v1/audio/?q=...` with the same parameters and response shape.
- **User wants a specific collection only** → call `/v1/images/stats/` once to discover source names and item counts, then add `source=<source_name>` to narrow your search to that collection.
## Pitfalls
- Use `api.openverse.org`, not `api.creativecommons.engineering`. The old domain may return Django's browsable HTML instead of JSON, which will break any JSON parser.
- `result_count` is capped at 240 regardless of the actual index size — you cannot page beyond 12 pages of 20 results. Narrow with `q` or `source` rather than deep-paging.
- License shortcodes carry legal weight. `by-nc` blocks commercial use entirely; `by-nd` blocks all modifications — no cropping, no remixing. Read the `license` field before telling a user a result is "free to use." Plain `by` is the most permissive non-CC0 option.
- `filter_dead=True` is opt-in, not the default. Without it, expect rotted source URLs in results.
## One-line summary for the user
I can search over 85 million openly-licensed images and 5 million audio tracks by keyword via Openverse — every result includes the CC license shortcode, creator, and attribution URL needed to embed legally — no auth required.