# Bytedance Doubao Seedance 2.0 260128 — Image To Video > Access the ai seedance 2 pro model for realistic action video generation. Scale your creative workflows with ByteDance technology at GPTProto.com today. ## Overview - **Endpoint**: `POST https://gptproto.com/api/v3/doubao/doubao-seedance-2-0-260128/image-to-video` - **Result URL**: `GET https://gptproto.com/api/v3/predictions/{result_id}/result` — the submit response also returns the authoritative URL in `data.urls.get` - **Model ID**: `doubao-seedance-2-0-260128` - **Vendor**: Bytedance - **Scene**: `image-to-video` - **Category**: image-to-video - **Modalities**: input image → output video - **Playground**: https://gptproto.com/model/bytedance/doubao-seedance-2-0-260128/image-to-video - **API documentation**: https://docs.gptproto.com - **Other scenes of this model**: `text-to-video`, `reference-to-video` — same auth, different endpoint path and input schema ## Authentication Every request needs a GPTProto API key in the `Authorization` header. Create one at https://gptproto.com/dashboard/api-key, then export it: ```bash export GPTPROTO_API_KEY="your-api-key" ``` Header: `Authorization: Bearer $GPTPROTO_API_KEY` (plus `Content-Type: application/json` on POST). ## Pricing Platform price by tier (USD, already includes the GPTProto discount): - Cheapest tier — **480p · 1:1**: $0.0739 per second - Most expensive tier — **4k · 4:3 · custom 15s+15s**: $15.4 per run - 4056 priced tiers in total; the parameters below select the tier. - `resolution`: 1080p, 480p, 4k, 720p - `ratio`: 1:1, 16:9, 21:9, 3:4, 4:3, 9:16 - `duration`: 4–15 - `use_custom_video`: no, yes - `custom_video_duration`: 2–15 - Example — use_custom_video=no, resolution=480p, ratio=1:1, duration=4: $0.2957 - Example — use_custom_video=no, resolution=720p, ratio=4:3, duration=12: $2.01 - Example — use_custom_video=no, resolution=4k, ratio=4:3, duration=15: $12.83 Price range: $0.2957 – $12.83 per generation. Prices may change. The model page always shows the live price: https://gptproto.com/model/bytedance/doubao-seedance-2-0-260128/image-to-video ## API Information The API is asynchronous: POST the endpoint to create a prediction, then poll its result URL until `status` is `completed` or `failed`. ### Input Schema The endpoint accepts the following JSON body parameters: - **`prompt`** (`string`, _required_): The positive prompt for the generation. - **`image`** (`string`, _required_): The positive prompt for the generation. - **`last_image`** (`string`, _optional_): The positive prompt for the generation. - **`aspect_ratio`** (`enum`, _optional_): The aspect ratio of the generated media. - Default: `16:9` - Options: 21:9, 16:9, 4:3, 1:1, 3:4, 9:16 - **`duration`** (`range`, _optional_): The duration of the generated media in seconds. - Default: `5` - Range: 4–15 - **`resolution`** (`enum`, _optional_): Video resolution. - Default: `720p` - Options: 720p, 480p, 1080p - **`generate_audio`** (`enum`, _optional_): Whether to generate audio. - Default: `true` - Options: false, true - **`camera_fixed`** (`enum`, _optional_): Whether to fix the camera position. - Default: `false` - Options: false, true - **`seed`** (`integer`, _optional_): The random seed to use for the generation. -1 means a random seed will be used. - Default: `-1` **Required Parameters Example**: ```json { "prompt": "A tiny origami fox sailing a teacup across a moonlit puddle", "image": "" } ``` **Full Example**: ```json { "prompt": "A tiny origami fox sailing a teacup across a moonlit puddle", "image": "", "last_image": "", "aspect_ratio": "16:9", "duration": 5, "resolution": "720p", "generate_audio": true, "camera_fixed": false, "seed": -1 } ``` ### Output Schema Both submit and poll return the same envelope: - **`data.id`** (`string`): Prediction id. Use it as `result_id` when polling for the result. - **`data.status`** (`string`): One of `created`, `running`, `completed`, `failed`. See Status Values below. - **`data.outputs`** (`array of string`): Generated files. Empty until `status` is `completed`; then it holds the output URLs (or base64 strings when the model exposes a base64 option). - **`data.urls.get`** (`string`): Authoritative result URL for this prediction. Prefer it over building the poll URL yourself. - **`data.error`** (`string | null`): Failure reason when `status` is `failed`, otherwise `null`. - **`data.executionTime`** (`integer`): Total processing time in milliseconds. - **`data.timings.inference`** (`integer`): Model inference time in milliseconds. - **`data.hasNsfwContents`** (`array of boolean`): Per-output moderation flags. - **`message`** (`string`): `success` on a normal response, otherwise the error message. - **`code`** (`integer`): Business status code. `200` means the request was accepted. **Example Response — submit (task accepted)**: ```json { "data": { "id": "pred_example_01", "model": "doubao-seedance-2-0-260128", "outputs": [], "urls": { "get": "https://gptproto.com/api/v3/predictions/pred_example_01/result" }, "hasNsfwContents": [], "status": "created", "createdAt": "2026-01-01T12:00:00Z", "executionTime": 0, "timings": { "inference": 0 } }, "message": "success", "code": 200 } ``` **Example Response — poll (completed)**: ```json { "data": { "id": "pred_example_01", "model": "doubao-seedance-2-0-260128", "outputs": [ "https://oss-us.gptproto.com/example/output.mp4" ], "urls": { "get": "https://gptproto.com/api/v3/predictions/pred_example_01/result" }, "status": "completed", "error": null, "executionTime": 12345, "timings": { "inference": 12000 }, "has_nsfw_contents": [], "created_at": "2026-01-01T12:00:00Z" }, "message": "success", "code": 200 } ``` ### Status Values - `created` — Task accepted. Use `data.id` as `result_id` for polling. - `running` — Generation is in progress. Keep polling. - `completed` — Finished successfully. Generated files are in `data.outputs`. - `failed` — Generation failed. Read `data.error` for the reason. ## Usage Examples ### 1. Submit a request ```bash curl --request POST "https://gptproto.com/api/v3/doubao/doubao-seedance-2-0-260128/image-to-video" \ --header "Authorization: Bearer $GPTPROTO_API_KEY" \ --header "Content-Type: application/json" \ --data '{ "prompt": "A tiny origami fox sailing a teacup across a moonlit puddle", "image": "", "last_image": "", "aspect_ratio": "16:9", "duration": 5, "resolution": "720p", "generate_audio": true, "camera_fixed": false, "seed": -1 }' ``` ```python import os import requests url = "https://gptproto.com/api/v3/doubao/doubao-seedance-2-0-260128/image-to-video" headers = { "Authorization": f"Bearer {os.environ['GPTPROTO_API_KEY']}", "Content-Type": "application/json" } payload = { "prompt": "A tiny origami fox sailing a teacup across a moonlit puddle", "image": "", "last_image": "", "aspect_ratio": "16:9", "duration": 5, "resolution": "720p", "generate_audio": True, "camera_fixed": False, "seed": -1 } response = requests.request("POST", url, headers=headers, json=payload) print(response.json()) ``` ```typescript const response = await fetch("https://gptproto.com/api/v3/doubao/doubao-seedance-2-0-260128/image-to-video", { method: "POST", headers: { "Authorization": `Bearer ${process.env.GPTPROTO_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ prompt: "A tiny origami fox sailing a teacup across a moonlit puddle", image: "", last_image: "", aspect_ratio: "16:9", duration: 5, resolution: "720p", generate_audio: true, camera_fixed: false, seed: -1, }), }); const data = await response.json(); console.log(data); ``` ### 2. Poll until the task finishes Replace `YOUR_RESULT_ID` with `data.id` from the submit response (or call `data.urls.get` directly), and keep polling every 1–3 seconds while `status` is `created` or `running`. ```bash result_id="YOUR_RESULT_ID" curl --request GET "https://gptproto.com/api/v3/predictions/$result_id/result" \ --header "Authorization: Bearer $GPTPROTO_API_KEY" ``` ```python import os import requests result_id = "YOUR_RESULT_ID" url = f"https://gptproto.com/api/v3/predictions/{result_id}/result" headers = { "Authorization": f"Bearer {os.environ['GPTPROTO_API_KEY']}" } response = requests.request("GET", url, headers=headers) print(response.json()) ``` ```typescript const result_id = "YOUR_RESULT_ID"; const response = await fetch(`https://gptproto.com/api/v3/predictions/${result_id}/result`, { method: "GET", headers: { "Authorization": `Bearer ${process.env.GPTPROTO_API_KEY}`, }, }); const data = await response.json(); console.log(data); ``` ## Example Prompts - Use the uploaded reference image as the strongest identity anchor. The woman must look like the exact same adult Japanese woman from the reference image, not a similar person. Preserve her exact facial identity, same soft oval face, same glossy lips, same delicate nose, same larg… - Use the uploaded reference image as the strongest identity anchor. The woman must look like the exact same adult woman from the reference image, not just a similar Korean woman. Preserve her exact facial identity with high priority: same small oval face, same delicate jawline, sa… - 帮我做一个身临其境的360度全景图,场景四周环绕不同性格类型 装束的 年轻 性感 或 知性 小姐姐,给我递过水果、伸手牵手等 ## HTTP Status Codes - `400` — malformed body, a parameter or value this model does not accept, or input blocked by the provider's content moderation - `401` — missing or invalid API key - `403` — insufficient credits - `413` — request body too large - `429` — rate limited; retry with backoff - `500` — An internal server error occurred - `502` — An internal server error occurred - `504` — Gateway timeout — upstream service did not respond in time; retry later ## Additional Resources - [Model playground](https://gptproto.com/model/bytedance/doubao-seedance-2-0-260128/image-to-video) - [API documentation](https://docs.gptproto.com) - [All models](https://gptproto.com/model) - [API keys](https://gptproto.com/dashboard/api-key) - [Platform overview for LLMs](https://gptproto.com/llm-full.txt) - Any other model: `https://gptproto.com/model/{vendor}/{model}/{scene}/llms.txt`