UlazAI developer docs
Seedance API documentation: generate, status, 1080p and pricing
Reading order: the Current route section below is all you need for new work. Most of what follows (retired endpoints, the old upload flow, the 1.5 Pro quickstart and its price table) is the historical 1.5 Pro reference: that route is retired and returns HTTP 410, so its examples are not copy-paste material for production. The FAQ is mixed: answers marked historical describe the retired route, the rest describes the current Seedance 2.x Video Studio route.
Seedance 1.5 Pro is no longer available on UlazAI
ByteDance ends support for the model on 21 October 2026, so we removed it from UlazAI on 20 October. The /seedance/generate/ endpoint now returns HTTP 410 and charges no credits. For new video jobs, use Seedance 2.0 through the Video API. The rest of this page stays online as reference.
Seedance 1.5 Pro reference
Seedance API docs Seedance API documentation: generate, status, 1080p and pricing
Until 21 October 2026 the Seedance API worked like this: authenticate with a
Bearer key, create jobs with POST /seedance/generate/, and poll
GET /seedance/status/{generation_id}/ until the video was ready, with
480p, 720p, and 1080p output in 4, 8, or 12 second durations.
That route now returns HTTP 410. For new Seedance jobs use the Video Studio API:
POST /api/v1/video-studio/generate/ with model_slug
seedance_2_5, seedance_2, seedance_2_fast or
seedance_2_mini, documented on the Video API docs.
Core endpoints
POST /seedance/upload/
POST /seedance/generate/
GET /seedance/status/{generation_id}/
Current capabilities
Text-to-video and image-to-video
Up to 2 guide images
Optional native audio
Tip
New work uses the Video Studio API: POST /api/v1/video-studio/generate/ with a model_slug, status via /api/v1/video-studio/status/{job_id}/.
/seedance/upload/ existed for image-guided runs and text-only runs skipped it.
Current route: Seedance 2.x through the Video Studio API
New Seedance integrations use the Video Studio API. Authenticate with the same Bearer key,
send a model_slug, and poll the job status. Supported Seedance slugs today:
seedance_2_5 (up to 30 s, up to 50 multimodal references),
seedance_2, seedance_2_fast and seedance_2_mini.
Fetch the live model matrix and current per-model credit rates from
GET /api/v1/models/video/.
curl -X POST https://ulazai.com/api/v1/video-studio/generate/ \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model_slug": "seedance_2_mini",
"prompt": "A quiet Dutch canal at dusk, bicycles on the bridge, warm window light, gentle camera push-in",
"aspect_ratio": "16:9",
"duration_seconds": 4,
"quality_mode": "480p"
}'
curl https://ulazai.com/api/v1/video-studio/status/JOB_ID/ \
-H "Authorization: Bearer YOUR_API_KEY"
This payload is the cheapest possible test call (seedance_2_mini, 480p, 4 seconds, text-to-video) and it is the exact request behind the captured responses below; swap in seedance_2_5, seedance_2 or seedance_2_fast for higher quality tiers. The generate call answers immediately with a job id list and your remaining credit balance; per-model credit rates come from the models matrix, and the exact amount a job charged shows up as credits_charged in the status response once the job completes:
// POST /api/v1/video-studio/generate/ (captured response, 2026-10-26)
{
"success": true,
"job_ids": ["0752648f-c0b1-451d-a1dc-6d0261600197"],
"credits_remaining_total": 98
}
// GET /api/v1/video-studio/status/0752648f-c0b1-451d-a1dc-6d0261600197/ after the job finished
{
"success": true,
"job": {
"job_id": "0752648f-c0b1-451d-a1dc-6d0261600197",
"model_slug": "seedance_2_mini",
"status": "completed",
"duration_seconds": 4,
"quality_mode": "480p",
"result_urls": ["https://media.ulazai.com/video_studio/seedance/.../video_1.mp4"],
"credits_charged": 38,
"completed_at": "2026-10-26T11:51:00.320868+00:00"
}
}
Error responses follow the same shape. A missing or invalid Bearer key returns 401 {"detail": "..."}, an unsupported duration_seconds for the slug returns 400 {"success": false, "error": "Invalid duration for this model"}, and an unknown slug returns 404 {"success": false, "error": "Unknown model"}. A 4-second 480p seedance_2_mini text-to-video render charged exactly 38 credits (9.5 credits/second), matching the rate in the models matrix.
The full request contract (all fields, reference inputs and status flow) lives on the
Video API docs; per-second credit rates per slug come from GET /api/v1/models/video/, and the status response confirms the exact credits_charged per job.
Seedance 1.5 Pro pricing as it stood until retirement (historical table)
The retired Seedance 1.5 Pro route billed per render in credits, not per subscription. The table
below is the exact matrix that route charged until 21 October 2026, the same numbers its
generate response reported as credits_used. It stays here as a pricing reference,
not as a current offer. Current Seedance 2.x pricing runs per model in the
Video Studio credit system.
| Resolution | Duration | Without audio | With native audio |
|---|---|---|---|
| 480p | 4 s | 10 credits | 20 credits |
| 480p | 8 s | 20 credits | 30 credits |
| 480p | 12 s | 30 credits | 50 credits |
| 720p | 4 s | 20 credits | 35 credits |
| 720p | 8 s | 40 credits | 50 credits |
| 720p | 12 s | 60 credits | 90 credits |
| 1080p | 4 s | 40 credits | 70 credits |
| 1080p | 8 s | 70 credits | 140 credits |
| 1080p | 12 s | 110 credits | 180 credits |
Credits to dollars
Credits converted at the price of the credit package you picked, so a 720p 8-second render without audio was 40 credits minus any package discount. The generate response always confirmed the exact credits_used before the job ran. On the current Video Studio route, pricing is per model_slug per second, fetch the live matrix from /api/v1/models/video/.
The Seedance model family: 1.5 Pro, 2.0 and 2.5
Seedance is ByteDance's text-to-video and image-to-video model. ByteDance launched the first Seedance in June 2025, released Seedance 2.0 in February 2026, and has since shown Seedance 2.5. Each generation pushes the same core idea further: cinematic motion, stronger prompt-following, multi-shot scenes, image and video references, and optional native audio in a single render. The API guide covers the currently supported Seedance versions without requiring you to set up ByteDance's own platform.
| Version | Released by ByteDance | What it adds |
|---|---|---|
Seedance 1.5 Pro | 2025 | Text- and image-to-video, up to 2 guide images, optional audio, 480p/720p/1080p. Ran on UlazAI until it was retired on 21 October 2026. |
Seedance 2.0 | Feb 2026 | Multimodal inputs (text, image, video, audio), multi-camera storytelling, native audio co-generation, longer clips. |
Seedance 2.5 | 2026 | The newest step ByteDance has shown, aimed at faster generation and further quality and control gains. |
Same code, newer model
The 1.5 Pro route is retired and the current Video Studio API is a different integration: other endpoints (/api/v1/video-studio/generate/), a model_slug field and
a job-based status flow. Plan the migration as a small rewrite, not a model-ID swap; the
Video API docs hold the current request contract.
Seedance 2.5 on this API: model IDs and referencing
Queries for seedance 2.5 api usually want two things: the model identifier to send, and how image references work on the new generation. ByteDance positions Seedance 2.5 around one-take creation and flexible referencing - more input images steering the same scene - while keeping the generate-and-poll job shape that this page documents.
| What you send today | What changes when 2.5 is enabled here |
|---|---|
model: bytedance/seedance-1.5-pro | Historical. The current route uses model_slug: seedance_2_5 on new endpoints. |
input_urls with up to 2 guide images | Expect a wider referencing budget on the 2.x generation; the array shape stays the same. |
POST /seedance/generate/ then poll /seedance/status/{id}/ | Historical. Current route: POST /api/v1/video-studio/generate/ with model_slug, poll /api/v1/video-studio/status/{job_id}/. |
This section describes the retired 1.5 Pro contract for reference. Production work moves to the Video Studio API with model_slug (for example seedance_2_5): different endpoints, a job-based status flow, and pricing per model_slug per second, see the Video API docs.
ByteDance and ARK: the official model, one unified route
People searching for ByteDance Seedance official documentation or the ARK Seedance API are usually looking for two different things: the model itself, and a way to actually call it. Seedance is ByteDance's own model, published through ByteDance's Volcano Engine ARK platform. That route means setting up an ARK account, region access, and raw model endpoints.
UlazAI sits in front of that as a third-party API layer. You get one Bearer key, a hosted
image upload step, a shared credit wallet, and the small set of endpoints on this page, no ARK
onboarding, no regional workaround, and no VPN or Chinese phone number to reach the model. If you specifically searched
ARK API Seedance image upload, the equivalent here is a single call: POST /seedance/upload/
returns a permanent URL that you drop into input_urls on generate (see the upload endpoint below).
ARK concepts mapped to this API
If you already read ByteDance's ARK documentation, the vocabulary is different but the steps are the same. This is the direct translation:
| On ByteDance ARK | Here | What changes for you |
|---|---|---|
| ARK account, project and endpoint setup | One Bearer key | No platform onboarding before the first call. |
| Host the guide image yourself, pass a public URL | POST /seedance/upload/ |
You can send the raw file; the response gives you a permanent URL. |
| Model id in the request body | model field |
Same idea; historical note: the retired route used one model identifier; the current Video Studio route uses model_slug on new endpoints. |
| Poll the task until it completes | GET /seedance/status/{generation_id}/ |
Same polling shape, one endpoint. |
Image-to-video in two calls
This is the whole image-upload flow. The first call stores the image and returns a URL, the second call uses that URL as visual guidance for the video.
# 1. upload the guide image
# HISTORICAL (retired 21 Oct 2026) - current route: /api/v1/video-studio/
curl -X POST https://ulazai.com/seedance/upload/ \
-H "Authorization: Bearer $ULAZAI_API_KEY" \
-F "file=@/path/to/image.jpg"
# -> {"url": "https://cdn.ulazai.com/uploads/<id>.jpg"}
# 2. generate, passing that URL back in input_urls
# HISTORICAL (retired 21 Oct 2026) - current route: /api/v1/video-studio/
curl -X POST https://ulazai.com/seedance/generate/ \
-H "Authorization: Bearer $ULAZAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "slow dolly in, warm evening light",
"input_urls": ["https://cdn.ulazai.com/uploads/<id>.jpg"],
"resolution": "1080p"
}'
You can pass up to two URLs in input_urls. Two images are read as a start and
end reference, which is the usual way to keep a character or product consistent across the
clip. For text-only generation, skip the upload call entirely.
Quick integration summary
| Auth | Bearer API key from /dashboard/ -> API Keys |
|---|---|
| Model ID | bytedance/seedance-1.5-pro |
| Durations | 4s, 8s, 12s |
| Resolutions | 480p, 720p, 1080p |
| Aspect ratios | 1:1, 21:9, 4:3, 3:4, 16:9, 9:16 |
| Inputs | Prompt only, or prompt plus up to 2 image URLs |
| Polling flow | Create a job, store generation_id, then poll status until completed |
Public endpoint summary
| Method | Endpoint | When to use it |
|---|---|---|
| POST | /seedance/upload/ |
Upload an image first if you want image-to-video guidance |
| POST | /seedance/generate/ |
Create a Seedance 1.5 Pro generation job |
| GET | /seedance/status/{generation_id}/ |
Check whether the job is still processing, completed, or failed |
Authentication
All API requests require a Bearer token:
Authorization: Bearer YOUR_API_KEY
Get an API key from your dashboard under API Keys. If you still need credits, go to packages first.
/seedance/upload/
Upload input images for image-to-video guidance
Upload a guide image before generation if you want Seedance to anchor composition, character framing, or scene setup.
The response gives you a permanent URL to pass into input_urls.
Request headers
Authorization: Bearer YOUR_API_KEY
Content-Type: multipart/form-data
Form data parameters
file * (file)
JPG, PNG, or WebP, up to 10MB.
Success response (200)
{
"success": true,
"url": "https://media.ulazai.com/seedance_images/u1_abc123.jpg",
"filename": "seedance_images/u1_abc123.jpg"
}
Example usage (cURL)
# HISTORICAL (retired 21 Oct 2026) - current route: /api/v1/video-studio/
curl -X POST https://ulazai.com/seedance/upload/ \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "file=@/path/to/image.jpg"
/seedance/generate/
Create a Seedance 1.5 Pro generation task
Send either the simplified payload below or the explicit model plus input format.
Use the simplified version if you only need the public Seedance route with prompt, optional guide images, and output settings.
Request body (simple)
{
"prompt": "A cinematic close-up of a chef flipping noodles in slow motion",
"input_urls": ["https://media.ulazai.com/seedance_images/u1_abc123.jpg"],
"aspect_ratio": "16:9",
"resolution": "1080p",
"duration": "4",
"fixed_lens": true,
"generate_audio": false,
"prompt_directory_optin": true
}
Request body (model/input style)
{
"model": "bytedance/seedance-1.5-pro",
"input": {
"prompt": "A cinematic close-up of a chef flipping noodles in slow motion",
"input_urls": ["https://media.ulazai.com/seedance_images/u1_abc123.jpg"],
"aspect_ratio": "16:9",
"resolution": "720p",
"duration": "8",
"fixed_lens": true,
"generate_audio": true
}
}
Parameters
prompt * (string)
3 to 2500 characters describing the scene, motion, framing, and audio intent.
input_urls (array)
Optional. Up to 2 image URLs for image-to-video guidance.
aspect_ratio (string)
One of: 1:1, 21:9, 4:3, 3:4, 16:9, 9:16.
resolution (string)
One of: 480p, 720p, 1080p.
duration (string)
4, 8, or 12 seconds.
fixed_lens (boolean)
Enable for a more stable camera view.
generate_audio (boolean)
Enable synchronized audio generation. This increases credit usage.
prompt_directory_optin (boolean)
Optional. Share eligible prompts to the prompt directory and apply a discount when supported.
Success response (200)
{
"success": true,
"generation_id": "abc12345-1234-1234-1234-123456789012",
"task_id": "seedance_task_xyz789",
"credits_used": 40,
"directory_discount_applied": true,
"message": "Video generation started. This may take a few minutes."
}
/seedance/status/{generation_id}/
Poll task status
Poll this endpoint until the job leaves processing. On success you get a video URL back; on failure
you should inspect the error and retry with a corrected payload.
Processing response
{
"success": true,
"status": "processing",
"message": "Video is being generated..."
}
Success response (200)
{
"success": true,
"status": "completed",
"video_url": "https://media.ulazai.com/seedance_outputs/video.mp4"
}
Code examples: cURL, Python and JavaScript
The full flow is submit → store generation_id → poll status. Here is the generate call in three common stacks; swap in your own key and prompt.
cURL
# HISTORICAL (retired 21 Oct 2026) - current route: /api/v1/video-studio/
curl -X POST https://ulazai.com/seedance/generate/ \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "A cinematic close-up of a chef flipping noodles in slow motion",
"aspect_ratio": "16:9",
"resolution": "1080p",
"duration": "4"
}'
Python (requests)
import time, requests
BASE = "https://ulazai.com" # HISTORICAL 1.5 Pro route (retired 21 Oct 2026); current route: /api/v1/video-studio/
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}
# 1. Start the job
job = requests.post(f"{BASE}/seedance/generate/", headers=HEADERS, json={
"prompt": "A cinematic close-up of a chef flipping noodles in slow motion",
"aspect_ratio": "16:9",
"resolution": "1080p",
"duration": "4",
}).json()
generation_id = job["generation_id"]
# 2. Poll until it leaves "processing"
while True:
status = requests.get(f"{BASE}/seedance/status/{generation_id}/", headers=HEADERS).json()
if status.get("status") == "completed":
print("Video:", status["video_url"])
break
if status.get("status") == "failed":
raise RuntimeError(status)
time.sleep(8) # back off; do not hammer generate
JavaScript (fetch)
const BASE = "https://ulazai.com"; // HISTORICAL 1.5 Pro route (retired 21 Oct 2026); current: /api/v1/video-studio/
const HEADERS = { "Authorization": "Bearer YOUR_API_KEY", "Content-Type": "application/json" };
const job = await fetch(`${BASE}/seedance/generate/`, {
method: "POST",
headers: HEADERS,
body: JSON.stringify({
prompt: "A cinematic close-up of a chef flipping noodles in slow motion",
aspect_ratio: "16:9",
resolution: "1080p",
duration: "4",
}),
}).then(r => r.json());
const id = job.generation_id;
let video;
while (!video) {
const s = await fetch(`${BASE}/seedance/status/${id}/`, { headers: HEADERS }).then(r => r.json());
if (s.status === "completed") video = s.video_url;
else if (s.status === "failed") throw new Error(JSON.stringify(s));
else await new Promise(r => setTimeout(r, 8000)); // poll every ~8s
}
console.log("Video:", video);
Usage flow (historical 1.5 Pro route)
- Upload one or two guide images with
/seedance/upload/only if you need image-to-video guidance. - Call
/seedance/generate/with your prompt, output settings, and optionalinput_urls. - Store the returned
generation_id. - Poll
/seedance/status/{generation_id}/untilstatusbecomescompleted. - Use the returned
video_urlto download, embed, or pass the final asset into your own workflow.
Error codes
400 Invalid request parameters
401 Authentication failed (missing or invalid API key)
402 Insufficient credits
429 Rate limit exceeded
500 Internal server error
Pricing and rate limits
Credits for one 5-second text-to-video clip, read from the same table the Video Studio API bills from. Ten seconds costs double. A video input (video-to-video or extend) changes the rate, so check GET /api/v1/models/video/ for those. Package prices are on the packages page.
| model_slug | 480p | 720p | 1080p |
|---|---|---|---|
seedance_2_mini | 48 credits | 103 credits | not offered |
seedance_2_fast | 78 credits | 165 credits | not offered |
seedance_2 | 95 credits | 205 credits | 510 credits |
seedance_2_5 | 140 credits | 315 credits | 570 credits |
Rate limits and 429 handling: if you submit many jobs in parallel you may receive 429 Rate limit exceeded. Treat the API as job-based: submit, store the job id, and poll /api/v1/video-studio/status/{job_id}/ every 5 to 10 seconds instead of resubmitting. On a 429, back off exponentially (for example 2s, 4s, 8s) before retrying.
Seedance 1.5 Pro vs Seedance 2.0: this section is the historical 1.5 Pro reference; the model ran on UlazAI until 21 October 2026. Seedance 2.x runs on the Video Studio API with model_slug and different endpoints, so the migration is a small rewrite. See the Video API docs.
Frequently asked questions
Does the UlazAI Seedance API support Seedance 2.0 and 2.5?
The dedicated 1.5 Pro API route is retired (HTTP 410 since 21 October 2026). Seedance 2.0 and 2.5 run on the Video Studio API: POST /api/v1/video-studio/generate/ with model_slug seedance_2_5, seedance_2, seedance_2_fast or seedance_2_mini, polling /api/v1/video-studio/status/{job_id}/.
How does UlazAI relate to ByteDance's official Seedance / ARK API?
Seedance is ByteDance's own model, offered through ByteDance's Volcano Engine ARK platform. UlazAI is a third-party API layer that runs Seedance behind one simplified route with a single Bearer key, hosted image upload, and a shared credit wallet. You need no ARK account or raw model endpoints to manage.
How do I upload an image for Seedance image-to-video?
Historical route (retired 21 October 2026): send the image as multipart/form-data to POST /seedance/upload/ with your Bearer key. The response returned a permanent URL, which you passed (up to two) in the input_urls array on POST /seedance/generate/. Text-only prompts skipped the upload step. On the current Video Studio route, reference inputs ride along in the generate payload. See the Video API docs.
How much does the Seedance 2.0 API cost?
For a 5-second clip without video input: 95 credits at 480p, 205 at 720p and 510 at 1080p on seedance_2. seedance_2_mini is the cheap test model at 48 credits for 480p, Seedance 2.5 starts at 140. The table under Pricing and rate limits has every tier, and the status response shows credits_charged for each job.
Is the Seedance API free?
No. Each job is paid from prepaid credits, without a subscription or free API tier. The cheapest call we ran, seedance_2_mini at 480p for 4 seconds, charged 38 credits on 26 October 2026.
Is the Seedance 2.5 API available?
Yes, as model_slug seedance_2_5 on the Video Studio API. It renders 480p, 720p or 1080p, up to 30 seconds, with up to 50 multimodal references.
Does the image_url parameter accept base64 image data?
On the current Video Studio route, no: reference_image_urls and input_image_urls accept public HTTPS URLs or asset:// references, and the frame fields (first_frame_url, last_frame_url) take URLs too. Base64 payloads are not accepted; upload the image first and pass the resulting URL. On the historical 1.5 Pro route the flow had the same shape: multipart upload to POST /seedance/upload/ returned a URL for input_urls.
Is Seedance available worldwide through the API?
Yes. You call UlazAI's hosted HTTPS endpoints with a Bearer key, so no VPN, regional workaround, or Chinese phone number is needed. Any server that can make an authenticated HTTPS request can submit jobs and poll for results.
Where to go next
Build Seedance API requests around media validation and job status
Validate reference files and supported fields before upload, submit one job and retain its identifier. Poll until a terminal state and show partial upload or generation errors explicitly.
Use the UlazAI request schema and model availability shown in this reference as the integration contract, even when an ARK example uses different field names.