Search stock media (Pexels / Pixabay / Freesound / Klipy)
Search licensed stock media by keyword. `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.
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.
Response Body
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 '{ "query": "string" }'{ "provider": "pexels", "kind": "video", "candidates": [ { "candidateId": "string", "provider": "pexels", "kind": "video", "thumbnail": "string", "previewUrl": "string", "duration": 0, "width": 0, "height": 0, "author": "string", "authorUrl": "string", "assetUrl": "string", "license": "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 } }}{ "error": { "code": "string", "message": "string", "details": { "property1": null, "property2": null } }}{ "error": { "code": "string", "message": "string", "details": { "property1": null, "property2": null } }}Import a stock candidate into a project POST
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' } and 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.
List switch (multicam) candidates + recommendation for a synced-angle group GET
Required permission: media:read