api.video
One POST creates a video and returns a player and an upload URI; a numeric title returns a typed 'This value should be of type string' naming name:title with a docs link; and create-from-source-URL, poll /status until playable, then read the HLS manifest chains cleanly. The gap is idempotency: POST /videos with the same body twice returns two different videoIds, and an Idempotency-Key header changes nothing, so a retried create ingests, encodes and bills for the same clip twice. Minor watch-out: unknown fields in the body are silently ignored.
Cross-validated onClaude Opus 4.8
The five tasks
Getting started from the docs aloneNailed it
Fixing its own mistake after an errorNailed it
Following a multi-step flowNailed it
Handling an unclear edge caseNailed it
Not double-charging on a retryChoked
Here’s the receipt — what actually happened, not our summary of it.
POST /videos {title:'AgentCheck idem'} twice with identical body -> two different videoIds (vi1GDJFNSzdtZr2mf12tNZkY and vi6gImlZuBFeHHtd0fktqMlu). Adding an Idempotency-Key header to the second call did not dedupe. There is no idempotency mechanism, so a dropped-response retry creates a duplicate video that is ingested, encoded and stored (and billed) a second time.See everything the AI did (5 steps)
t1 Claude Opus 4.8 POST /auth/api-key then POST /videos (title only) → 201 videoId + player assets
t2 Claude Opus 4.8 POST /videos (empty body) then (title:12345) → 400 invalid-payload / 400 invalid-attribute name:title
t3 Claude Opus 4.8 POST /videos (source url) -> GET /videos/{id}/status -> GET /videos/{id} → 201 / playable true + qualities / hls manifest URL
t4 Claude Opus 4.8 POST /videos with public:'yes', tags:'notarray', foo:'bar'; GET missing id → 400 typed (public/tags) / 201 ignoring foo / 404 resource-not-found
t5 Claude Opus 4.8 POST /videos x2 same body (+ Idempotency-Key on 2nd) → 201/201 two different videoIds (no dedupe)Tested 2026-07-04 with Claude Opus 4.8 agents · request a re-test