curl --request POST \
--url https://api.geekidea.ai/v1/videos/clone \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"prompt": "把主角换成参考图里的橘猫,背景改成海边",
"understand_model": "google/gemini-3-pro-preview",
"image_model": "openai/gpt-image-2",
"video_model": "bytedance/seedance-1.5-pro",
"source_file_id": "file-0192f1c3a7b87c3e9a4f5b6c7d8e9f01",
"source_url": "https://example.com/reference.mp4",
"reference_file_ids": [
"<string>"
],
"aspect_ratio": "auto",
"resolution": "720p",
"max_duration_seconds": 60,
"audio_policy": "keep",
"voice_model": "qwen/qwen3-tts-flash",
"voice": "Cherry",
"auto_confirm": true,
"budget_usd": 20,
"end_user": "user_42",
"metadata": {}
}
'import requests
url = "https://api.geekidea.ai/v1/videos/clone"
payload = {
"prompt": "把主角换成参考图里的橘猫,背景改成海边",
"understand_model": "google/gemini-3-pro-preview",
"image_model": "openai/gpt-image-2",
"video_model": "bytedance/seedance-1.5-pro",
"source_file_id": "file-0192f1c3a7b87c3e9a4f5b6c7d8e9f01",
"source_url": "https://example.com/reference.mp4",
"reference_file_ids": ["<string>"],
"aspect_ratio": "auto",
"resolution": "720p",
"max_duration_seconds": 60,
"audio_policy": "keep",
"voice_model": "qwen/qwen3-tts-flash",
"voice": "Cherry",
"auto_confirm": True,
"budget_usd": 20,
"end_user": "user_42",
"metadata": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
prompt: '把主角换成参考图里的橘猫,背景改成海边',
understand_model: 'google/gemini-3-pro-preview',
image_model: 'openai/gpt-image-2',
video_model: 'bytedance/seedance-1.5-pro',
source_file_id: 'file-0192f1c3a7b87c3e9a4f5b6c7d8e9f01',
source_url: 'https://example.com/reference.mp4',
reference_file_ids: ['<string>'],
aspect_ratio: 'auto',
resolution: '720p',
max_duration_seconds: 60,
audio_policy: 'keep',
voice_model: 'qwen/qwen3-tts-flash',
voice: 'Cherry',
auto_confirm: true,
budget_usd: 20,
end_user: 'user_42',
metadata: {}
})
};
fetch('https://api.geekidea.ai/v1/videos/clone', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"id": "vclone_0192f1c3a7b87c3e9a4f5b6c7d8e9f01",
"object": "video.clone",
"status": "producing",
"current_revision_no": 1,
"source": {
"file_id": "<string>",
"url": "<string>",
"mime": "<string>",
"width": 123,
"height": 123
},
"source_url": "<string>",
"source_duration_ms": 123,
"prompt": "<string>",
"models": {
"understand": "<string>",
"image": "<string>",
"video": "<string>",
"voice": "<string>"
},
"aspect_ratio": "auto",
"resolution": "720p",
"max_duration_seconds": 300,
"audio_policy": "keep",
"voice": "<string>",
"auto_confirm": true,
"revisions": [
{
"revision_no": 1,
"base_revision_no": 123,
"status": "producing",
"run_id": "wfr_0192f1c3a7b87c3e9a4f5b6c7d8e9f01",
"progress": 40,
"final_video": {
"file_id": "<string>",
"url": "<string>",
"mime": "<string>",
"width": 123,
"height": 123
},
"created_at": 123
}
],
"end_user": "<string>",
"metadata": {},
"created_at": 123
}{
"error": {
"message": "The model does not exist or you do not have access to it.",
"type": "not_found_error",
"param": "model",
"code": "model_not_found",
"retryable": false,
"errors": [
{
"param": "messages",
"code": "missing_parameter",
"message": "<string>"
}
]
}
}{
"error": {
"message": "The model does not exist or you do not have access to it.",
"type": "not_found_error",
"param": "model",
"code": "model_not_found",
"retryable": false,
"errors": [
{
"param": "messages",
"code": "missing_parameter",
"message": "<string>"
}
]
}
}{
"error": {
"message": "The model does not exist or you do not have access to it.",
"type": "not_found_error",
"param": "model",
"code": "model_not_found",
"retryable": false,
"errors": [
{
"param": "messages",
"code": "missing_parameter",
"message": "<string>"
}
]
}
}{
"error": {
"message": "The model does not exist or you do not have access to it.",
"type": "not_found_error",
"param": "model",
"code": "model_not_found",
"retryable": false,
"errors": [
{
"param": "messages",
"code": "missing_parameter",
"message": "<string>"
}
]
}
}{
"error": {
"message": "The model does not exist or you do not have access to it.",
"type": "not_found_error",
"param": "model",
"code": "model_not_found",
"retryable": false,
"errors": [
{
"param": "messages",
"code": "missing_parameter",
"message": "<string>"
}
]
}
}{
"error": {
"message": "The model does not exist or you do not have access to it.",
"type": "not_found_error",
"param": "model",
"code": "model_not_found",
"retryable": false,
"errors": [
{
"param": "messages",
"code": "missing_parameter",
"message": "<string>"
}
]
}
}{
"error": {
"message": "The model does not exist or you do not have access to it.",
"type": "not_found_error",
"param": "model",
"code": "model_not_found",
"retryable": false,
"errors": [
{
"param": "messages",
"code": "missing_parameter",
"message": "<string>"
}
]
}
}{
"error": {
"message": "The model does not exist or you do not have access to it.",
"type": "not_found_error",
"param": "model",
"code": "model_not_found",
"retryable": false,
"errors": [
{
"param": "messages",
"code": "missing_parameter",
"message": "<string>"
}
]
}
}Create a video clone
Creates a task from a reference video (source_file_id of an uploaded video, or a public source_url downloaded in the import step) and starts revision 1: import, understand, plan, images, video, compose. Understand, plan, images and video stop for confirmation unless auto_confirm is true. The amount for the first segment is held when the task is created; returns 402 when the balance or budget_usd is below it. With the same Idempotency-Key the first task is returned.
curl --request POST \
--url https://api.geekidea.ai/v1/videos/clone \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"prompt": "把主角换成参考图里的橘猫,背景改成海边",
"understand_model": "google/gemini-3-pro-preview",
"image_model": "openai/gpt-image-2",
"video_model": "bytedance/seedance-1.5-pro",
"source_file_id": "file-0192f1c3a7b87c3e9a4f5b6c7d8e9f01",
"source_url": "https://example.com/reference.mp4",
"reference_file_ids": [
"<string>"
],
"aspect_ratio": "auto",
"resolution": "720p",
"max_duration_seconds": 60,
"audio_policy": "keep",
"voice_model": "qwen/qwen3-tts-flash",
"voice": "Cherry",
"auto_confirm": true,
"budget_usd": 20,
"end_user": "user_42",
"metadata": {}
}
'import requests
url = "https://api.geekidea.ai/v1/videos/clone"
payload = {
"prompt": "把主角换成参考图里的橘猫,背景改成海边",
"understand_model": "google/gemini-3-pro-preview",
"image_model": "openai/gpt-image-2",
"video_model": "bytedance/seedance-1.5-pro",
"source_file_id": "file-0192f1c3a7b87c3e9a4f5b6c7d8e9f01",
"source_url": "https://example.com/reference.mp4",
"reference_file_ids": ["<string>"],
"aspect_ratio": "auto",
"resolution": "720p",
"max_duration_seconds": 60,
"audio_policy": "keep",
"voice_model": "qwen/qwen3-tts-flash",
"voice": "Cherry",
"auto_confirm": True,
"budget_usd": 20,
"end_user": "user_42",
"metadata": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
prompt: '把主角换成参考图里的橘猫,背景改成海边',
understand_model: 'google/gemini-3-pro-preview',
image_model: 'openai/gpt-image-2',
video_model: 'bytedance/seedance-1.5-pro',
source_file_id: 'file-0192f1c3a7b87c3e9a4f5b6c7d8e9f01',
source_url: 'https://example.com/reference.mp4',
reference_file_ids: ['<string>'],
aspect_ratio: 'auto',
resolution: '720p',
max_duration_seconds: 60,
audio_policy: 'keep',
voice_model: 'qwen/qwen3-tts-flash',
voice: 'Cherry',
auto_confirm: true,
budget_usd: 20,
end_user: 'user_42',
metadata: {}
})
};
fetch('https://api.geekidea.ai/v1/videos/clone', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"id": "vclone_0192f1c3a7b87c3e9a4f5b6c7d8e9f01",
"object": "video.clone",
"status": "producing",
"current_revision_no": 1,
"source": {
"file_id": "<string>",
"url": "<string>",
"mime": "<string>",
"width": 123,
"height": 123
},
"source_url": "<string>",
"source_duration_ms": 123,
"prompt": "<string>",
"models": {
"understand": "<string>",
"image": "<string>",
"video": "<string>",
"voice": "<string>"
},
"aspect_ratio": "auto",
"resolution": "720p",
"max_duration_seconds": 300,
"audio_policy": "keep",
"voice": "<string>",
"auto_confirm": true,
"revisions": [
{
"revision_no": 1,
"base_revision_no": 123,
"status": "producing",
"run_id": "wfr_0192f1c3a7b87c3e9a4f5b6c7d8e9f01",
"progress": 40,
"final_video": {
"file_id": "<string>",
"url": "<string>",
"mime": "<string>",
"width": 123,
"height": 123
},
"created_at": 123
}
],
"end_user": "<string>",
"metadata": {},
"created_at": 123
}{
"error": {
"message": "The model does not exist or you do not have access to it.",
"type": "not_found_error",
"param": "model",
"code": "model_not_found",
"retryable": false,
"errors": [
{
"param": "messages",
"code": "missing_parameter",
"message": "<string>"
}
]
}
}{
"error": {
"message": "The model does not exist or you do not have access to it.",
"type": "not_found_error",
"param": "model",
"code": "model_not_found",
"retryable": false,
"errors": [
{
"param": "messages",
"code": "missing_parameter",
"message": "<string>"
}
]
}
}{
"error": {
"message": "The model does not exist or you do not have access to it.",
"type": "not_found_error",
"param": "model",
"code": "model_not_found",
"retryable": false,
"errors": [
{
"param": "messages",
"code": "missing_parameter",
"message": "<string>"
}
]
}
}{
"error": {
"message": "The model does not exist or you do not have access to it.",
"type": "not_found_error",
"param": "model",
"code": "model_not_found",
"retryable": false,
"errors": [
{
"param": "messages",
"code": "missing_parameter",
"message": "<string>"
}
]
}
}{
"error": {
"message": "The model does not exist or you do not have access to it.",
"type": "not_found_error",
"param": "model",
"code": "model_not_found",
"retryable": false,
"errors": [
{
"param": "messages",
"code": "missing_parameter",
"message": "<string>"
}
]
}
}{
"error": {
"message": "The model does not exist or you do not have access to it.",
"type": "not_found_error",
"param": "model",
"code": "model_not_found",
"retryable": false,
"errors": [
{
"param": "messages",
"code": "missing_parameter",
"message": "<string>"
}
]
}
}{
"error": {
"message": "The model does not exist or you do not have access to it.",
"type": "not_found_error",
"param": "model",
"code": "model_not_found",
"retryable": false,
"errors": [
{
"param": "messages",
"code": "missing_parameter",
"message": "<string>"
}
]
}
}{
"error": {
"message": "The model does not exist or you do not have access to it.",
"type": "not_found_error",
"param": "model",
"code": "model_not_found",
"retryable": false,
"errors": [
{
"param": "messages",
"code": "missing_parameter",
"message": "<string>"
}
]
}
}Authorizations
Provide your API key in the Authorization header using Bearer auth
Headers
Body
Creates a video clone task and starts revision 1 (POST /v1/videos/clone). Give exactly one of source_file_id and source_url.
What to change, e.g. replace the main character or the setting
4000"把主角换成参考图里的橘猫,背景改成海边"
Text model that watches the reference video and writes the plan; it must accept video input
1"google/gemini-3-pro-preview"
Image model for subject sheets and frames
1"openai/gpt-image-2"
Video model for the shot clips
1"bytedance/seedance-1.5-pro"
ID of the reference video uploaded to this project (mp4, mov or webm, up to 5 minutes)
"file-0192f1c3a7b87c3e9a4f5b6c7d8e9f01"
Public http(s) link to the reference video file, downloaded in the import step (up to 200 MB and 5 minutes; web pages are not accepted)
2048"https://example.com/reference.mp4"
IDs of reference images (up to 12), numbered in this order in the understanding and plan
12IDs of reference images (up to 12), numbered in this order in the understanding and plan
auto (default, nearest to the reference video), 9:16, 16:9 or 1:1
"auto"
720p (default) or 1080p
"720p"
Maximum length of the final video in seconds (1–300, default 300); longer reference videos are cut down in the plan
1 <= x <= 30060
keep (default, original audio), mute, dub (new voiceover with voice_model) or generated (audio generated by the video model)
"keep"
Speech model for audio_policy = dub (default qwen/qwen3-tts-flash)
"qwen/qwen3-tts-flash"
Voice for the voiceover; the model default when omitted
64"Cherry"
Do not stop for confirmation after each step
Budget limit for this revision (USD)
x >= 020
End-user identifier
128"user_42"
Caller metadata (up to 16 keys)
Show child attributes
Show child attributes
Response
OK
A video clone task (POST /v1/videos/clone, GET /v1/videos/clone/{id}). The settings are those of the current revision.
Video clone ID
"vclone_0192f1c3a7b87c3e9a4f5b6c7d8e9f01"
Always video.clone
"video.clone"
Status of the current revision: draft / producing / waiting_input / completed / failed / cancelled
draft, producing, waiting_input, completed, failed, cancelled "producing"
Current revision number
1
A file with a signed download link.
Show child attributes
Show child attributes
Link given as source_url
Reference video length (ms), after it has been probed
Request of the current revision
Models used by the video clone.
Show child attributes
Show child attributes
Requested aspect ratio; the plan has the one actually used
"auto"
Resolution
"720p"
Maximum length of the final video (seconds)
300
keep / mute / dub / generated
keep, mute, dub, generated "keep"
Voice for the voiceover
Whether steps are confirmed automatically
Revisions, oldest first
Show child attributes
Show child attributes
End-user identifier
Caller metadata
Show child attributes
Show child attributes
Creation time (Unix seconds)
