List media items
Paginated library list. Filter with ?kind= (video|audio|image|gif|asset|source|stock), ?source= (upload|generated|import-url|stock), ?tag= (exact tag) so a real library isn't an undifferentiated soup.
API key auth. Prefix cf_live_ for production orgs, cf_test_ for sandbox.
In: header
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/v1/media"{ "data": [ { "id": "string", "status": "string", "source": "upload", "name": "string", "mimeType": "string", "fileSize": 0, "duration": 0, "width": 0, "height": 0, "frameRate": 0, "progress": { "phase": "string", "percent": 0 }, "analysis": { "property1": null, "property2": null }, "listUsd": 0, "thumbnailUrl": "string", "previewUrl": "string", "kind": "string", "tags": [ "string" ], "attribution": { "provider": "pexels", "externalId": "string", "assetUrl": "string", "license": "string" }, "processingStatus": { "phase": "idle", "percent": 0, "message": "string", "error": "string" }, "createdAt": "string", "updatedAt": "string" } ], "pagination": { "hasMore": true, "nextCursor": "string", "prevCursor": "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 } }}{ "error": { "code": "string", "message": "string", "details": { "property1": null, "property2": null } }}Import media from a URL (server-side fetch) POST
Import media into the project from a public https URL — the server fetches and mirrors the bytes (SSRF-filtered), then processes it (transcode + transcribe). Async: returns a media id that flips to ready when the mirror and processing finish; poll GET /media/:id or use a media.completed webhook.
Semantic search over the org's own footage GET
Find MOMENTS in your library by describing what they look like. The query is embedded with the same CLIP model that embedded every indexed frame, so it matches on visual content — "wide shot of a speaker at a whiteboard", "hands on a keyboard", "city skyline at dusk" — including shots nobody talks about (which is where transcript search fails). Results are time-ranged: feed `mediaId` + `startSec`/`endSec` straight into apply_composition as a clip. `q` is required; `limit` defaults to 10 and caps at 25. `indexing` is COVERAGE, not emptiness: it is true whenever some of the org's footage is not in the visual index yet (media that predates it, or still processing), and it can be true ALONGSIDE results — then read them as "the best moments among what we have looked at so far". Empty `results` with `indexing: true` is a state, not a failure; re-run the item through processing to index it. TIMING: the text encoder scales to zero, so the first search after an idle period can take up to ~90s while it cold-starts — that is a documented wait, not a hang; subsequent searches are fast.