UlazAI developer docs
Seedance API documentation: generate, status, 1080p and pricing
Seedance 1.5 Pro reference
Seedance API docs Seedance API documentation: generate, status, 1080p and pricing
To use the Seedance API, authenticate with a Bearer key, use
POST /seedance/generate/ to create jobs, and poll
GET /seedance/status/{generation_id}/ until the video is ready.
UlazAI currently supports Seedance 1.5 Pro output in 480p, 720p, and 1080p with 4, 8, or 12 second durations.
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
This page answers the full developer flow in the first screen: the generate endpoint, status polling, 1080p support, Bearer auth and the pricing route.
Use/seedance/upload/ only when you need image-guided video generation. For text-only runs, call
/seedance/generate/ directly and skip the upload step.
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. Wired into UlazAI today. |
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
UlazAI's public API generates with bytedance/seedance-1.5-pro today. The important part for developers:
when a newer Seedance version is enabled here it reuses the same Bearer auth and the same
generate-and-poll endpoints below. Your integration does not change — only the model identifier does — so
you can build against this reference now and move up the family later.
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 | Only the identifier changes; auth and endpoints stay the same. |
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}/ | Unchanged - the job-based flow is the same across versions. |
Until 2.5 is switched on here, production work stays on seedance-1.5-pro: upload the guide image, generate, poll, download. When the newer identifier goes live, re-run your existing job with only the model field changed and compare output before switching a pipeline over.
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; only the identifier changes between versions. |
| 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
curl -X POST https://ulazai.com/seedance/upload/ \
-H "Authorization: Bearer $ULAZAI_API_KEY" \
-F "[email protected]"
# -> {"url": "https://cdn.ulazai.com/uploads/<id>.jpg"}
# 2. generate, passing that URL back in input_urls
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)
curl -X POST https://api.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
curl -X POST https://api.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://api.ulazai.com"
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://api.ulazai.com";
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
- 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
Seedance billing on UlazAI runs on credits, so cost scales with resolution and duration rather than a fixed per-second rate. Use this as a planning guide; the live credit cost is shown in packages and at request time.
| Output | Typical use | Cost driver |
|---|---|---|
480p | Drafts and quick iterations | Lowest credits per second |
720p | Social-ready clips | Mid credits per second |
1080p | Final delivery | Highest credits per second; longer durations cost more |
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 generation_id, and poll /seedance/status/{generation_id}/ every 5-10 seconds rather than hammering generate. On a 429, back off exponentially (for example 2s, 4s, 8s) before retrying.
Seedance 1.5 Pro vs Seedance 2.0: this reference covers bytedance/seedance-1.5-pro, the model currently wired into Video Studio. ByteDance has since introduced Seedance 2.0 as the next generation; when it is enabled here it uses the same generate-and-poll flow and the same auth, so integration code does not change — only the model identifier does.
Frequently asked questions
Does the UlazAI Seedance API support Seedance 2.0 and 2.5?
The API generates with bytedance/seedance-1.5-pro today. ByteDance released Seedance 2.0 in February 2026 and has since shown 2.5. When a newer version is enabled here it uses the same Bearer auth and the same generate-and-poll endpoints, so your integration code does not change — only the model identifier does.
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 — no ARK account or raw model endpoints to manage.
How do I upload an image for Seedance image-to-video?
Send the image as multipart/form-data to POST /seedance/upload/ with your Bearer key. The response returns a permanent URL; pass it (up to two) in the input_urls array on POST /seedance/generate/. Text-only prompts skip the upload step.
How much does the Seedance API cost?
Billing runs on credits, so cost scales with resolution and duration. A short 480p draft costs the fewest credits; a 12-second 1080p render with audio costs the most. The exact cost shows in packages and again as credits_used in the generate response.
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.