POST /v1/videos/clone takes a reference video and a request such as “replace the main character with the cat in the reference image”, and makes a new video with the same pacing, shots and motion. Each version of the result is a revision, and each revision is a workflow run (geekidea/video-clone). Progress, confirmation, redo and cancellation use the /v1/workflow_runs endpoints.
Create a video clone
GET /v1/workflow_runs/{run_id}, its event stream or webhooks.
Give exactly one of
source_file_id and source_url. A source that can’t be used returns 400 video_clone_source_invalid; an understand_model without video input returns 400 input_not_supported.
POST /v1/videos/clone/quote takes the same body and saves nothing. It returns estimated_cost_usd, the amount held when the task is created (split into model_cost_usd and fee_usd), the steps in that first segment, total_cost_usd for the whole of revision 1, source_duration_ms the estimate is based on, and within_budget when you sent budget_usd. Before the plan exists the number of shots is unknown, so it is estimated from the reference video length (probed for source_file_id; for source_url, the smaller of max_duration_seconds and 60 seconds) and the video model’s default clip length.
Steps
With
auto_confirm: true no step stops. A new revision skips import and understand and reuses the understanding of the revision it is based on. Skipped steps are not charged.
When the run stops in waiting_input, review the revision, edit the understanding or plan if you like, then call POST /v1/workflow_runs/{id}/confirm. Redo a step with POST /v1/workflow_runs/{id}/steps/{stepKey}/redo and cancel with POST /v1/workflow_runs/{id}/cancel.
Tasks and revisions
Task
status follows the current revision: draft, producing, waiting_input, completed, failed or cancelled.
New revisions
base_revision_no picks the revision to start from (default: the current one; it must already have an understanding). prompt, reference_file_ids (replaces the whole list), understand_model, image_model, video_model, aspect_ratio, resolution, max_duration_seconds, audio_policy, voice_model, voice and budget_usd are as above; fields you leave out keep the base revision’s values. The reference video stays the same; to use another one, create a new task. The new revision becomes current. It returns 409 workflow_invalid_state while the current revision is running.
Edit the understanding and plan
Send{"payload": { … }} with the whole new content, in the same structure as understanding or plan in the revision detail.
- Replacing the understanding resets
planand the later steps. - Replacing the plan first fits it to the video model’s durations and the length limit, then resets
imagesand the later steps.
waiting_input; confirm to continue. Invalid content returns 400 invalid_parameter; a running run returns 409 workflow_invalid_state.
Assets
Images, depth videos, clips and the voice-over are asset candidates (casset_…). Each belongs to a slot (for example image:s01_first or clip:s01), and the selected candidate of a slot is the one used. role is subject, frame, source_frame, motion, clip or voice.
- Regenerate opens its own charge (kind
media) for that one asset’s model cost and feature fee (one image, or the shot’s seconds), and does not reset any step. When it succeeds the new candidate is selected. - Upload adds the image as a new selected candidate in the slot of
asset_id, free of charge. - When a candidate is selected, assets made from it are marked
stale: true. - Regenerate, adopt and upload return
409 workflow_invalid_statewhile the run is running. Regenerate also returns409while the slot is already generating.
id, revision_no, kind (image, video, audio or depth), role, slot, shot_key, subject_key, status (generating, succeeded or failed), selected, stale, source (generated, regenerated, uploaded, extracted or dubbed), file, generation_id, prompt, feedback, error_code and created_at. File urls are signed and expire; query again for fresh links.
