curl --request POST \
--url https://api.krea.ai/generate/video/bytedance/seedance-2-5 \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"prompt": "Grand coliseum, warriors battling with magic, resonating with tournament arc anime."
}
'import requests
url = "https://api.krea.ai/generate/video/bytedance/seedance-2-5"
payload = { "prompt": "Grand coliseum, warriors battling with magic, resonating with tournament arc anime." }
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: 'Grand coliseum, warriors battling with magic, resonating with tournament arc anime.'
})
};
fetch('https://api.krea.ai/generate/video/bytedance/seedance-2-5', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.krea.ai/generate/video/bytedance/seedance-2-5",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'prompt' => 'Grand coliseum, warriors battling with magic, resonating with tournament arc anime.'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.krea.ai/generate/video/bytedance/seedance-2-5"
payload := strings.NewReader("{\n \"prompt\": \"Grand coliseum, warriors battling with magic, resonating with tournament arc anime.\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.krea.ai/generate/video/bytedance/seedance-2-5")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"prompt\": \"Grand coliseum, warriors battling with magic, resonating with tournament arc anime.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.krea.ai/generate/video/bytedance/seedance-2-5")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"prompt\": \"Grand coliseum, warriors battling with magic, resonating with tournament arc anime.\"\n}"
response = http.request(request)
puts response.read_body{
"job_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "backlogged",
"created_at": "2023-11-07T05:31:56Z",
"completed_at": null,
"result": null,
"error": {
"code": "<string>",
"message": "<string>"
},
"progress": 0.5
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Seedance 2.5*
Most advanced Seedance with 30s clips, native audio, and up to 50 references. Default choice for most video generations — quality is head and shoulders above other models, it supports durations up to 30 seconds, and it outputs up to 1080p. Reach for this first unless the user asks for a specific model, needs 4k output, or cost is the priority.
- This API endpoint includes Krea prompt enhancement in addition to the base Seedance 2.5 model. When a request carries reference_videos and the prompt reads as an edit of that video, Seedance derives the output ratio and length from the input: Krea sends the adaptive ratio and the -1 duration that task type requires, so aspect_ratio and duration are ignored for those requests rather than rejected. Send them as usual; they do not need to be omitted.
curl --request POST \
--url https://api.krea.ai/generate/video/bytedance/seedance-2-5 \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"prompt": "Grand coliseum, warriors battling with magic, resonating with tournament arc anime."
}
'import requests
url = "https://api.krea.ai/generate/video/bytedance/seedance-2-5"
payload = { "prompt": "Grand coliseum, warriors battling with magic, resonating with tournament arc anime." }
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: 'Grand coliseum, warriors battling with magic, resonating with tournament arc anime.'
})
};
fetch('https://api.krea.ai/generate/video/bytedance/seedance-2-5', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.krea.ai/generate/video/bytedance/seedance-2-5",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'prompt' => 'Grand coliseum, warriors battling with magic, resonating with tournament arc anime.'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.krea.ai/generate/video/bytedance/seedance-2-5"
payload := strings.NewReader("{\n \"prompt\": \"Grand coliseum, warriors battling with magic, resonating with tournament arc anime.\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.krea.ai/generate/video/bytedance/seedance-2-5")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"prompt\": \"Grand coliseum, warriors battling with magic, resonating with tournament arc anime.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.krea.ai/generate/video/bytedance/seedance-2-5")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"prompt\": \"Grand coliseum, warriors battling with magic, resonating with tournament arc anime.\"\n}"
response = http.request(request)
puts response.read_body{
"job_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "backlogged",
"created_at": "2023-11-07T05:31:56Z",
"completed_at": null,
"result": null,
"error": {
"code": "<string>",
"message": "<string>"
},
"progress": 0.5
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Pricing
| Resolution | Video Reference | Price |
|---|---|---|
| 480p | Yes | $0.0614/sec |
| 480p | No | $0.1027/sec |
| 720p | Yes | $0.1382/sec |
| 720p | No | $0.2311/sec |
| 1080p | Yes | $0.3402/sec |
| 1080p | No | $0.5686/sec |
Deprecated request aliases
Deprecated request aliases
| Deprecated | Use instead | Accepted until |
|---|---|---|
startImage | start_image | 2026-06-19 |
aspectRatio | aspect_ratio | 2026-06-19 |
endImage | end_image | 2026-06-19 |
referenceImages | reference_images | 2026-06-19 |
referenceVideos | reference_videos | 2026-06-19 |
referenceAudios | reference_audios | 2026-06-19 |
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Headers
URL to receive a POST request when the job completes. The webhook will receive the job data including results. When signing is configured, deliveries are signed with ECDSA P-256 (ES256); verify them with the keys at https://api.krea.ai/.well-known/jwks.json (see X-Krea-Webhook-* headers). Treat requests without these headers as unauthenticated.
Body
Can be an external URL, base64 data URI, or uploaded asset URL.
102416:9, 4:3, 1:1, 3:4, 9:16, 21:9 Can be an external URL, base64 data URI, or uploaded asset URL.
102430Can be an external URL, base64 data URI, or uploaded asset URL.
102410Can be an external URL, base64 data URI, or uploaded asset URL.
102410Can be an external URL, base64 data URI, or uploaded asset URL.
10244 <= x <= 30480p, 720p, 1080p -9007199254740991 <= x <= 9007199254740991Deprecated and ignored. Accepted until 2026-10-30T00:00:00Z, then rejected. Remove this field from requests.
12Show child attributes
Show child attributes
When true, rewrites the prompt for Seedance 2 using Krea prompt enhancement before video generation.
When true, generates a fast 480p draft of the video instead of a full-quality one, billed at the 480p rate. Use it to validate scene structure, motion, and prompt intent cheaply before rerunning with draft off. Any resolution sent alongside is ignored.
Response
The resulting job data. This will be returned in a pending state until the job is completed. See /jobs/{id} for retrieving the results.
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$backlogged, queued, scheduled, processing, sampling, intermediate-complete, completed, failed, cancelled ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$Show child attributes
Show child attributes
0 <= x <= 1Was this page helpful?