Remix
One long video in, a set of shorts and drafted copy out. Remix watches the whole thing, finds the moments worth cutting, and writes the blog post and social posts to go with them.
Create
POST /v1/remixes
Two sources. A video already in the workspace:
curl -X POST https://api.vidocu.ai/v1/remixes \
-H "Authorization: Bearer vdo_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{"videoId": "vid_abc123"}'
Or an external URL, which needs the duration since nothing has inspected the file yet:
-d '{"videoUrl": "https://example.com/talk.mp4", "durationSec": 2400, "title": "Q3 keynote"}'
Exactly one of videoId or videoUrl. Creating a remix analyzes nothing - it just sets it up.
402 if the workspace hasn't the balance for a video that long. The check happens here; the charge
happens when analysis completes.
Analyze
POST /v1/remixes/:id/analyze
{ "status": "analyzing", "remixId": "...", "jobId": "..." }
Returns 202. This is the slow part - poll GET /v1/remixes/:id until status is ready.
A workspace runs one analysis at a time. If another is already running you get:
{ "status": "queued", "remixId": "..." }
That is not an error and needs no retry. The queued remix starts on its own when the running one finishes, oldest first.
Billed per minute of source video, when the analysis completes.
Read the result
GET /v1/remixes/:id returns the full analysis once ready: the shorts it found with their
timings, chapters, and drafted blog, LinkedIn and X copy.
GET /v1/remixes lists them, cursor-paginated and
filterable by status and projectId. The list omits analysis - it is far too large to return
per row.
Statuses: pending (created, not analyzed), queued, analyzing, ready, failed. When a
remix fails, error says why and analysis can be run again.
Update and delete
PATCH /v1/remixes/:id changes the title or moves the remix to a project folder. Status, analysis
and exports belong to the pipeline and can't be set - writing them by hand would desynchronise a
running job.
DELETE /v1/remixes/:id is refused with 409 while analysis is running. Videos already exported
from the remix are separate objects and are untouched.
Export
POST /v1/remixes/:id/export
Text outputs come back immediately:
curl -X POST https://api.vidocu.ai/v1/remixes/rmx_123/export \
-H "Authorization: Bearer vdo_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{"outputType": "blog"}'
{ "exportId": "...", "status": "completed", "content": "# How we cut onboarding in half\n\n..." }
Video outputs start a render and return 202 with a job:
{ "exportId": "...", "jobId": "...", "status": "processing" }
outputType | Kind | Notes |
|---|---|---|
blog | text | Returns Markdown |
linkedin | text | variantIndex picks which draft; defaults to the first |
x | text | The thread, joined |
short | video | Needs shortId from the analysis |
yt-trim | video | The trimmed cut |
Each export counts as one against the plan's export allowance regardless of length; 402 when
that's exhausted. Poll GET /v1/remixes/:id/exports for a video export's URL.
Regenerate the copy
POST /v1/remixes/:id/regenerate with {"outputType": "blog" | "linkedin" | "x"}
Rewrites that output from the analyzed transcript and returns the updated analysis. It replaces the current draft, so don't call it on copy someone has edited.
Free: no credit charge, and it doesn't count as an export.
Exports list
GET /v1/remixes/:id/exports lists what has been produced - each with its output type, status and
URL.
Errors
| Status | Code | Cause |
|---|---|---|
| 400 | validation_error | Both or neither of videoId/videoUrl, or videoUrl without durationSec |
| 402 | limit_exceeded | Not enough balance for a video that long |
| 404 | not_found | No such remix in this workspace |
| 409 | conflict | Already analyzing, or deleting while analysis runs |