Skip to main content

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" }
outputTypeKindNotes
blogtextReturns Markdown
linkedintextvariantIndex picks which draft; defaults to the first
xtextThe thread, joined
shortvideoNeeds shortId from the analysis
yt-trimvideoThe 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

StatusCodeCause
400validation_errorBoth or neither of videoId/videoUrl, or videoUrl without durationSec
402limit_exceededNot enough balance for a video that long
404not_foundNo such remix in this workspace
409conflictAlready analyzing, or deleting while analysis runs