curl --request POST \
--url https://api.geekidea.ai/v1/dramas/quote \
--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/quote"
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/quote', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"object": "drama.quote",
"estimated_cost_usd": 0.12,
"model_cost_usd": 0.08,
"fee_usd": 0.04,
"steps": [
"understand"
],
"episode_cost_usd": 6.8,
"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 drama before creating it
Takes the same body as POST /v1/dramas and saves nothing. Returns the amount held when the drama is created (estimated_cost_usd = model cost + workflow fee; creating returns 402 when the balance is below it) and an estimate for the whole of episode 1. Before the outline and storyboard exist the number of elements and segments is unknown, so it is estimated from defaults and the episode length and errs high; the actual cost is settled from the calls made and the rest of the hold is released.
curl --request POST \
--url https://api.geekidea.ai/v1/dramas/quote \
--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/quote"
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/quote', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"object": "drama.quote",
"estimated_cost_usd": 0.12,
"model_cost_usd": 0.08,
"fee_usd": 0.04,
"steps": [
"understand"
],
"episode_cost_usd": 6.8,
"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
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 quote before creating a drama (POST /v1/dramas/quote).
Object type
"drama.quote"
Amount held when the drama is created, in USD: model cost + workflow fee of the first segment (up to the first confirmation; the whole episode when auto_confirm=true)
0.12
Model cost part, in USD
0.08
Workflow fee part, in USD
0.04
Steps in the first segment
Steps in the first segment
["understand"]
Estimated total for the whole of episode 1, in USD
6.8
When budget_usd is set: whether the first segment fits in it (creating returns 402 workflow_budget_exceeded when it does not)
true
