curl --request POST \
--url https://api.geekidea.ai/v1/videos/clone/quote \
--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/quote"
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/quote', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"object": "video.clone.quote",
"estimated_cost_usd": 0.12,
"model_cost_usd": 0.06,
"fee_usd": 0.06,
"steps": [
"understand"
],
"total_cost_usd": 4.2,
"source_duration_ms": 15000,
"within_budget": true
}{
"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>"
}
]
}
}Quote a video clone
Takes the same body as POST /v1/videos/clone and saves nothing. Returns the amount held when the task is created and an estimate for the whole of revision 1. 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.
curl --request POST \
--url https://api.geekidea.ai/v1/videos/clone/quote \
--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/quote"
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/quote', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"object": "video.clone.quote",
"estimated_cost_usd": 0.12,
"model_cost_usd": 0.06,
"fee_usd": 0.06,
"steps": [
"understand"
],
"total_cost_usd": 4.2,
"source_duration_ms": 15000,
"within_budget": true
}{
"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
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 quote before creating a video clone (POST /v1/videos/clone/quote).
Always video.clone.quote
"video.clone.quote"
Amount held when the task is created (model cost + workflow fee, USD)
0.12
Model cost part (USD)
0.06
Workflow fee part (USD)
0.06
Steps in the first segment
Steps in the first segment
["understand"]
Estimate for the whole of revision 1 (USD)
4.2
Reference video length the estimate is based on (ms)
15000
When budget_usd is given: whether the first segment fits in it
true
