curl --request POST \
--url https://api.geekidea.ai/v1/dramas \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"text_model": "openai/gpt-5.4",
"image_model": "openai/gpt-image-2",
"video_model": "bytedance/seedance-1.5-pro",
"prompt": "重生回到高考前一天的女孩,决定改写全家人的命运",
"script": "<string>",
"style": "都市逆袭,节奏快,暖色调",
"aspect_ratio": "9:16",
"resolution": "720p",
"language": "zh",
"episodes": 3,
"episode_seconds": 60,
"image_quality": "high",
"web_research": true,
"auto_confirm": true,
"auto_continue": true,
"budget_usd": 20,
"end_user": "user_42",
"metadata": {}
}
'import requests
url = "https://api.geekidea.ai/v1/dramas"
payload = {
"text_model": "openai/gpt-5.4",
"image_model": "openai/gpt-image-2",
"video_model": "bytedance/seedance-1.5-pro",
"prompt": "重生回到高考前一天的女孩,决定改写全家人的命运",
"script": "<string>",
"style": "都市逆袭,节奏快,暖色调",
"aspect_ratio": "9:16",
"resolution": "720p",
"language": "zh",
"episodes": 3,
"episode_seconds": 60,
"image_quality": "high",
"web_research": True,
"auto_confirm": True,
"auto_continue": 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({
text_model: 'openai/gpt-5.4',
image_model: 'openai/gpt-image-2',
video_model: 'bytedance/seedance-1.5-pro',
prompt: '重生回到高考前一天的女孩,决定改写全家人的命运',
script: '<string>',
style: '都市逆袭,节奏快,暖色调',
aspect_ratio: '9:16',
resolution: '720p',
language: 'zh',
episodes: 3,
episode_seconds: 60,
image_quality: 'high',
web_research: true,
auto_confirm: true,
auto_continue: true,
budget_usd: 20,
end_user: 'user_42',
metadata: {}
})
};
fetch('https://api.geekidea.ai/v1/dramas', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"id": "drama_0192f1c3a7b87c3e9a4f5b6c7d8e9f01",
"object": "drama",
"status": "producing",
"source": "ai",
"title": "<string>",
"aspect_ratio": "9:16",
"resolution": "720p",
"language": "zh",
"planned_episodes": 3,
"episode_seconds": 60,
"models": {
"text": "<string>",
"image": "<string>",
"video": "<string>",
"image_quality": "<string>"
},
"web_research": true,
"auto_confirm": true,
"auto_continue": true,
"episodes": [
{
"id": "<string>",
"episode_no": 1,
"status": "draft",
"run_id": "<string>",
"progress": 123,
"final_video": {
"file_id": "<string>",
"url": "<string>",
"mime": "<string>",
"width": 123,
"height": 123
},
"cover": {
"file_id": "<string>",
"url": "<string>",
"mime": "<string>",
"width": 123,
"height": 123
},
"duration_ms": 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 drama
Creates the drama and starts episode 1. Episode 1 runs: understand, story (series outline and episode 1 plot), look, assets, storyboard, keyframes, clips and final; later episodes run an asset check instead of understand. After understand, story, look, assets, storyboard and clips the run waits for confirmation (waiting_input); review or edit the artifacts, then call POST /v1/workflow_runs//confirm to continue (automatic when auto_confirm=true). Cost = the model cost of the calls made by the steps + the per-step workflow fee, held and settled per segment; returns 402 when the balance or budget is not enough.
curl --request POST \
--url https://api.geekidea.ai/v1/dramas \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"text_model": "openai/gpt-5.4",
"image_model": "openai/gpt-image-2",
"video_model": "bytedance/seedance-1.5-pro",
"prompt": "重生回到高考前一天的女孩,决定改写全家人的命运",
"script": "<string>",
"style": "都市逆袭,节奏快,暖色调",
"aspect_ratio": "9:16",
"resolution": "720p",
"language": "zh",
"episodes": 3,
"episode_seconds": 60,
"image_quality": "high",
"web_research": true,
"auto_confirm": true,
"auto_continue": true,
"budget_usd": 20,
"end_user": "user_42",
"metadata": {}
}
'import requests
url = "https://api.geekidea.ai/v1/dramas"
payload = {
"text_model": "openai/gpt-5.4",
"image_model": "openai/gpt-image-2",
"video_model": "bytedance/seedance-1.5-pro",
"prompt": "重生回到高考前一天的女孩,决定改写全家人的命运",
"script": "<string>",
"style": "都市逆袭,节奏快,暖色调",
"aspect_ratio": "9:16",
"resolution": "720p",
"language": "zh",
"episodes": 3,
"episode_seconds": 60,
"image_quality": "high",
"web_research": True,
"auto_confirm": True,
"auto_continue": 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({
text_model: 'openai/gpt-5.4',
image_model: 'openai/gpt-image-2',
video_model: 'bytedance/seedance-1.5-pro',
prompt: '重生回到高考前一天的女孩,决定改写全家人的命运',
script: '<string>',
style: '都市逆袭,节奏快,暖色调',
aspect_ratio: '9:16',
resolution: '720p',
language: 'zh',
episodes: 3,
episode_seconds: 60,
image_quality: 'high',
web_research: true,
auto_confirm: true,
auto_continue: true,
budget_usd: 20,
end_user: 'user_42',
metadata: {}
})
};
fetch('https://api.geekidea.ai/v1/dramas', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"id": "drama_0192f1c3a7b87c3e9a4f5b6c7d8e9f01",
"object": "drama",
"status": "producing",
"source": "ai",
"title": "<string>",
"aspect_ratio": "9:16",
"resolution": "720p",
"language": "zh",
"planned_episodes": 3,
"episode_seconds": 60,
"models": {
"text": "<string>",
"image": "<string>",
"video": "<string>",
"image_quality": "<string>"
},
"web_research": true,
"auto_confirm": true,
"auto_continue": true,
"episodes": [
{
"id": "<string>",
"episode_no": 1,
"status": "draft",
"run_id": "<string>",
"progress": 123,
"final_video": {
"file_id": "<string>",
"url": "<string>",
"mime": "<string>",
"width": 123,
"height": 123
},
"cover": {
"file_id": "<string>",
"url": "<string>",
"mime": "<string>",
"width": 123,
"height": 123
},
"duration_ms": 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
Request to create a drama. Provide prompt, script or both.
Text model (understand, story, storyboard)
1"openai/gpt-5.4"
Image model (reference images, keyframes, poster)
1"openai/gpt-image-2"
Video model (clips); must support the aspect ratio
1"bytedance/seedance-1.5-pro"
One-sentence brief (genre, characters, style…)
20000"重生回到高考前一天的女孩,决定改写全家人的命运"
Script text: the drama is adapted from it
100000Visual style, such as "cinematic realism" or "anime"
2000"都市逆袭,节奏快,暖色调"
Aspect ratio: 9:16 (default, portrait) or 16:9 (landscape)
"9:16"
Resolution: 480p / 720p (default) / 1080p
"720p"
Language of dialogue: zh / en; detected from the prompt or script when omitted
"zh"
Planned number of episodes (1–100, default 1)
1 <= x <= 1003
Episode length in seconds (30–300, default 60)
30 <= x <= 30060
Image quality (when the model supports it)
"high"
Research the web while understanding the brief (when the text model supports it)
Continue automatically after each step instead of waiting for confirmation
Start the next episode automatically when one is completed
Budget for episode 1 in USD; the run pauses when it would be exceeded
x >= 020
End-user identifier
128"user_42"
Your metadata (up to 16 keys)
Show child attributes
Show child attributes
Response
OK
A drama (POST /v1/dramas, GET /v1/dramas/{id}).
ID (drama_ prefix)
"drama_0192f1c3a7b87c3e9a4f5b6c7d8e9f01"
Object type
"drama"
Status: draft / producing / completed / archived
draft, producing, completed, archived "producing"
Source: ai (written from the brief) / script (adapted from a script)
ai, script "ai"
Title (available after understand or the outline)
Aspect ratio
"9:16"
Resolution
"720p"
Language
"zh"
Planned number of episodes
3
Episode length in seconds
60
Models used by the drama.
Show child attributes
Show child attributes
Whether the brief is researched on the web
Whether each step continues automatically
Whether the next episode starts automatically
Episodes started so far
Show child attributes
Show child attributes
End-user identifier
Your metadata
Show child attributes
Show child attributes
Creation time (Unix seconds)
