Search stock media (Pexels / Pixabay / Freesound / Klipy)
Search licensed stock media by keyword. Pass `query` for one search, or `queries[]` (≤10) to run a batch in ONE call — the batch returns `results[]`, one entry per query in order, each with its own `candidates` (and an `error` string if that single query failed; one bad query never discards the rest). `kind` selects the corpus (video/photo → Pexels+Pixabay, sfx → Freesound CC0-only, gif → Klipy); defaults to video. Returns ranked candidates each carrying an opaque `candidateId` — pass it to import_resource to bring the asset into a project. Free + rate-limited; results are cached for 7 days, after which a candidateId must be refreshed by searching again. For sfx, bound the result by clip length with `durationSec` — impacts/ticks ≈ 0–2s, risers/whooshes ≈ 2–8s, ambients unbounded.
API key auth. Prefix cf_live_ for production orgs, cf_test_ for sandbox.
In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
POST /resources/search body — one query, or a batch of queries[].
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/resources/search" \ -H "Content-Type: application/json" \ -d '{}'{ "provider": "pexels", "kind": "video", "candidates": [ { "candidateId": "string", "provider": "pexels", "kind": "video", "thumbnail": "string", "previewUrl": "string", "downloadUrl": "string", "duration": 0, "width": 0, "height": 0, "author": "string", "authorUrl": "string", "assetUrl": "string", "license": "string" } ], "results": [ { "query": "string", "provider": "pexels", "kind": "video", "candidates": [ { "candidateId": "string", "provider": "pexels", "kind": "video", "thumbnail": "string", "previewUrl": "string", "downloadUrl": "string", "duration": 0, "width": 0, "height": 0, "author": "string", "authorUrl": "string", "assetUrl": "string", "license": "string" } ], "error": "string" } ]}{ "error": { "code": "string", "message": "string", "details": { "property1": null, "property2": null } }}{ "error": { "code": "string", "message": "string", "details": { "property1": null, "property2": null } }}{ "x402Version": 2, "accepts": [ {} ], "error": "string"}{ "error": { "code": "string", "message": "string", "details": { "property1": null, "property2": null } }}{ "error": { "code": "string", "message": "string", "details": { "property1": null, "property2": null } }}{ "error": { "code": "string", "message": "string", "details": { "property1": null, "property2": null } }}{ "error": { "code": "string", "message": "string", "details": { "property1": null, "property2": null } }}Import a stock candidate or a curated SFX-pack sound POST
Two lanes. STOCK { projectId, candidateId }: import a candidate returned by search_resources into a project as an org-owned media item (preserving provider/externalId/license provenance; bytes deduped across orgs). Async: returns { id, status:'importing' }; the row flips to complete when the mirror finishes (poll GET /media/:id). A candidate whose 7-day search cache has expired returns 422 — re-search. PACK { kind:"sfx-pack", id:<soundId> }: mint/return the org media item for a curated CC0 SFX-pack sound (soundId from list_catalog's sfx[]) — bytes pre-seeded, so returns { id, status:'ready' } immediately to place as a normal sfx clip. Idempotent per (org, soundId); an unknown soundId is a 422. Pack imports are FREE: no plan feature required, and an x402 payment is released unsettled (no charge).
List switch (multicam) candidates + recommendation for a synced-angle group GET
Required permission: media:read