Skip to main content
Quick answers to the questions we hear most. For exact error/limit tables see Errors & Rate Limits; for the walkthrough see the Quickstart.

Video sources & formats

Three ways, all via POST /videos (or the file / resumable variants):
  • By URL — a direct, publicly-fetchable HTTPS media URL.
  • By file — upload the file directly; use the resumable flow for large files.
  • Live streams — attach an rtsp / rtmp / http pull source with Open Stream.
mp4, m4v, mov, mkv, webm, avi, flv, f4v, wmv, mpg, mpeg, 3gp, ts, m2ts. A non-video file returns 415 unsupported_media.
You provide each video as a direct, fetchable media URL (the actual video file) or upload the file yourself. We don’t pull from a TikTok / YouTube / Instagram / X page or account link — resolve it to the underlying media URL first, then pass that as source_url. A platform page URL will fail with source_unresolved. Each video is ingested independently, so a batch is just many POST /videos calls.

Processing time & throughput

Indexing runs preprocess → index → derive and scales with the content processed = duration × fps (default fps: 1.0, i.e. ~1 frame/second). Short clips finish quickly; long video takes proportionally longer. Watch it live by polling GET /operations/{id} — the progress field reports each stage and a percentage.
Videos index in parallel. Submit them all up front — each returns its own operation immediately (202) and they process concurrently, up to the concurrency allowed on your plan (a rolling 2-hour concurrent-indexing cap). You don’t wait for one to finish before starting the next.
Because processing is parallel, a batch does not take N × single-video time. A useful estimate:
So 50 short clips complete in a handful of parallel waves, not 50 sequential runs. For a guaranteed volume throughput / SLA, contact us with your expected daily volume and clip length and we’ll size it.
Yes — indexing works on frames = duration × fps, so fps is your main speed/cost lever. Lower fps (e.g. 0.5) indexes faster and cheaper with coarser temporal detail; raise it for fast action where you need finer moments. Default is 1.0; range 0.1–30.
A little. They’re opt-in collection flags that run extra derivation per video, so a collection with them enabled takes somewhat longer than a plain index. Leave them off on collections that don’t need them.
Each POST /videos still returns immediately, but ingests beyond your plan’s concurrent-indexing cap come back 429 rate_limited with a Retry-After. Back off per that header (or throttle client-side) and the queue drains as slots free up — nothing is lost.
A video becomes searchable once its operation reaches ready. While it’s still processing you can pull derived content incrementally with ?since= — the response’s live: true means indexing is still running, so keep paging until it clears.
Live captioning and events are near-real-time — they surface as the stream plays, rather than after a whole file is uploaded. Latency tracks your fps and any enabled detectors. There’s no fixed session-duration cap.
The operation ends with done: true and a non-null error (e.g. source_unresolved for an unreachable link, unsupported_media for a bad format). Fix the source and re-submit — reuse the same idempotency_key so a retry never double-charges or double-ingests.

Results & notifications

Every slow operation returns 202 + an operation. Either poll GET /operations/{id} until done: true, or attach a webhook (callback_url) and get a signed POST on completion — no polling. done is the only completion signal.
Per moment or whole video: captions, transcripts, frames, clips, titles, summaries, speakers, face entities, and safety events (if a detector is enabled). Read any time-slice with Get Moment, or search across a collection with Search.
Search and retrieval run on OmniRetriever, a multilingual embedding model — you can query in one language and match content in another.

Billing & limits

In the ConsoleUsage & billing — balance, usage, and invoices. Your live balance is also available at GET /usage/balance.
fps 0.1–30 (default 1.0) · list limit 1–100 · Search 5 QPS/user, top_k ≤ 200 · search image ≤ 10 MB · person reference faces 1–20/call, ≤15 MB each. Full table in Errors & Rate Limits.
Signed URLs expire — clip cache ~5h, detail source_url / face image ~24h, search thumbnails ~15 min. Re-fetch on demand; never cache past expiry.
Don’t see your question? Talk to us or point your agent at the MCP Server and just ask.