GPT-6 Astra is now live on CometAPI →
technology/CometAPI research

How to Use Seedance 2.0 API

Seedance 2.0 API is ByteDance’s latest multimodal AI video generation model (launched April 9, 2026). It accepts text, images, video clips, and audio in a single request to produce cinematic 4–15 second MP4 videos with native audio sync, director-level camera control, and exceptional motion consistency. To use it: sign up on a CometAPI.com, obtain an API key, submit an async task via REST, poll for completion, and download the video URL.

CometAPI
AnnaAI model and API research team
Updated Sep 3, 2026 10 min read
How to Use Seedance 2.0 API
Use this pattern

Make the first API call.

from openai import OpenAI

client = OpenAI(
    api_key="YOUR_COMETAPI_KEY",
    base_url="https://api.cometapi.com/v1",
)

response = client.chat.completions.create(
    model="gpt-5-mini",
    messages=[{"role": "user", "content": "Build this workflow."}],
)

print(response.choices[0].message.content)

Seedance 2.0, ByteDance’s flagship multimodal video generation model, officially launched on April 9, 2026, and is now live across major platforms including fal.ai. This powerful AI tool transforms text, images, audio, and video references into cinematic 4–15 second videos with native audio synchronization, director-level camera control, and real-world physics—all in a single generation pass. Whether you’re a developer building automated video workflows, a marketer creating viral content, or a filmmaker prototyping scenes, the Seedance 2.0 API delivers production-grade results faster than ever.

What Is Seedance 2.0? Key Features and Capabilities

Seedance 2.0 is ByteDance’s next-generation unified multimodal audio-video joint generation model. Unlike earlier versions or competitors limited to text or single-image inputs, it natively supports up to 9 images + 3 video clips + 3 audio clips (12 assets total) in one request.

Core capabilities include:

  • Native audio-video co-generation: Music, dialogue, sound effects, and lip-sync are created together with the video—no post-production required.
  • Director-level control: Precise camera movements (dolly zoom, tracking shots, POV switches, handheld), lighting, shadows, and physics.
  • Multi-shot storytelling: Natural cuts and transitions within 4–15 second clips.
  • Output specs: MP4 at 480p/720p, aspect ratios (16:9, 9:16, 1:1, etc.), resolutions up to 2K in some tiers.

Three main modes:

  • text_to_video: Pure prompt-based.
  • first_last_frames: 1–2 images as start/end frames.
  • omni_reference: Full multimodal with @reference syntax for precise control.

Benchmarks on SeedVideoBench-2.0 show Seedance 2.0 leading in motion stability, prompt adherence, and character consistency compared to predecessors. It’s positioned as a strong Sora alternative for cinematic, immersive output. As of April 15, 2026, developers report generation times under 2 minutes for 10-second clips, with superior real-world physics and audio quality compared to predecessors.

Getting Started: Access Seedance 2.0 API via CometAPI

Seedance 2.0 is available through multiple providers, but CometAPI.com stands out for developers. As a unified gateway to 500+ AI models (including video generators like Sora 2 and Gemini video), CometAPI offers:

  • OpenAI-compatible REST endpoints.
  • Single API key for all models.
  • Competitive pricing with free starter credits.
  • Built-in SDKs, async job handling, and usage dashboards.
  • No vendor lock-in—switch models by changing the model ID.

API Authentication & Core Workflow

Most providers use async job-based REST APIs:

  • POST to create task → returns task_id.
  • GET /tasks/{task_id} to poll status (queued → processing → completed).
  • Retrieve video_url on success.

Authentication: Bearer token or X-API-Key header.

Step-by-step setup on CometAPI

1) setup on CometAPI

Visit CometAPI.com and sign up (new users get free credits).

Go to your dashboard → API Tokens → Create new key.

Copy your sk- key and set it as an environment variable (COMETAPI_KEY).

Use the unified /v1/chat/completions-style or dedicated video endpoints for Seedance 2.0 (model name: bytedance/seedance-2.0 or seedance-2-preview).

This approach saves hours versus managing separate keys for fal.ai, PiAPI, etc. CometAPI also provides lower-latency routes and bundled credits ideal for production scaling.

2) Prepare a strong prompt

Seedance 2.0 responds best when the prompt acts like a mini director brief. Say what the subject is, what the camera should do, what style you want, what should stay consistent, and what must not change. Because the model supports multiple references, you can also attach a frame reference, a motion reference, and an audio reference instead of forcing everything into one text prompt.

A practical prompt formula looks like this: subject + action + camera movement + visual style + lighting + reference notes + constraints. For example, instead of writing “a stylish car ad,” write “a glossy electric sedan parked on a wet rooftop at night, slow dolly-in, neon reflections, premium commercial lighting, no camera shake, keep the car centered, 16:9.” That kind of prompt matches the model’s director-level positioning much better.

3) Send an async generation request

Here is a clean curl example for a Seedance 2.0-style request:

import json
import os
import time

import requests

# Get your CometAPI key from https://www.cometapi.com/console/token, and paste it here
BASE_URL = "https://api.cometapi.com"
OUTPUT_DIR = "./output"
POLL_INTERVAL_SECONDS = 10
RETRY_DELAY_SECONDS = 5
MAX_CREATE_ATTEMPTS = 5
MAX_QUERY_ATTEMPTS = 3
TERMINAL_STATUSES = {"success", "completed", "failed", "error"}
SUCCESS_STATUSES = {"success", "completed"}


def is_progress_complete(progress):
    if isinstance(progress, int):
        return progress >= 100
    if isinstance(progress, float):
        return progress >= 100
    if isinstance(progress, str):
        try:
            return float(progress.rstrip("%")) >= 100
        except ValueError:
            return False
    return False


def is_transient_status(status_code):
    return status_code == 429 or 500 <= status_code < 600


def create_task(files):
    for attempt in range(1, MAX_CREATE_ATTEMPTS + 1):
        response = requests.post(
            f"{BASE_URL}/v1/videos",
            headers=headers,
            files=files,
            timeout=30,
        )
        if response.ok:
            return response
        if not is_transient_status(response.status_code) or attempt == MAX_CREATE_ATTEMPTS:
            response.raise_for_status()
        print(f"Create request returned {response.status_code}, retrying...")
        time.sleep(RETRY_DELAY_SECONDS)

    raise SystemExit("Failed to create task.")


def get_task(task_id):
    for attempt in range(1, MAX_QUERY_ATTEMPTS + 1):
        response = requests.get(
            f"{BASE_URL}/v1/videos/{task_id}",
            headers=headers,
            timeout=15,
        )
        if response.ok:
            return response
        if not is_transient_status(response.status_code) or attempt == MAX_QUERY_ATTEMPTS:
            response.raise_for_status()
        print(f"Status request returned {response.status_code}, retrying...")
        time.sleep(RETRY_DELAY_SECONDS)

    raise SystemExit("Failed to query task.")

if COMETAPI_KEY == "<YOUR_COMETAPI_KEY>":
    print("Set COMETAPI_KEY before running this example.")
    raise SystemExit(0)

headers = {"Authorization": f"Bearer G00igxF5pXVB56lrtvvgn3hGXJA4bsobmX9YMpGukWAwJDiy"}

create_response = create_task(
    {
        "prompt": (None, "A slow cinematic camera push across a coastal landscape at sunrise."),
        "model": (None, "doubao-seedance-2-0"),
        "seconds": (None, "5"),
        "size": (None, "16:9"),
    }
)
create_response.raise_for_status()
create_result = create_response.json()

task_id = create_result.get("id") or create_result.get("task_id")
if not task_id:
    print(json.dumps(create_result, indent=2))
    raise SystemExit("No task id returned.")

print(f"Task created: {task_id}")
print(f"Initial status: {create_result.get('status')}")

while True:
    task_response = get_task(task_id)
    task_response.raise_for_status()
    task = task_response.json()
    status = str(task.get("status") or "unknown")
    normalized_status = status.lower()
    progress = task.get("progress")
    should_try_download = normalized_status in SUCCESS_STATUSES or (
        normalized_status == "unknown" and is_progress_complete(progress)
    )

    print(f"Status: {status}, progress: {progress}")

    if should_try_download or normalized_status in TERMINAL_STATUSES:
        if should_try_download:
            video_url = task.get("video_url") or ""
            content_url = f"{BASE_URL}/v1/videos/{task_id}/content"
            output_path = os.path.join(OUTPUT_DIR, f"{task_id}.mp4")

            os.makedirs(OUTPUT_DIR, exist_ok=True)
            with requests.get(
                content_url,
                headers=headers,
                timeout=120,
                stream=True,
            ) as video_response:
                video_response.raise_for_status()
                with open(output_path, "wb") as output_file:
                    for chunk in video_response.iter_content(chunk_size=8192):
                        if chunk:
                            output_file.write(chunk)

            print(f"Video URL: {video_url}")
            print(f"Content endpoint: {content_url}")
            print(f"Saved to {output_path}")
            print(f"File size: {os.path.getsize(output_path)} bytes")
        else:
            print(json.dumps(task, indent=2))
            raise SystemExit(1)
        break

    time.sleep(POLL_INTERVAL_SECONDS)

CometAPI’s own Seedance 2.0 walkthrough uses the same endpoint pattern and shows output controls such as resolution: "1080p" and duration_s: 12 as part of the request shape.

4) Poll for completion and download the result

The typical flow is: submit job, store task ID, poll status, then retrieve the video URL. the task endpoint returns a task ID and the status is checked with GET /volc/v3/contents/generations/tasks/{task_id} until the job finishes.

Seedance 2.0 Generation Modes Explained

ModeBest ForInput ExampleMax References
text_to_videoQuick ideationText prompt only0
first_last_framesStoryboarding with keyframes1–2 images + prompt2
omni_referenceProfessional cinematic controlImages + video + audio + text12

Step-by-Step: Text-to-Video with Python Code Example

Here is a Python example you can adapt:

import osimport timeimport requestsAPI_KEY = os.environ["COMETAPI_API_KEY"]BASE_URL = "https://api.cometapi.com/volc/v3/contents/generations/tasks"headers = {    "Authorization": f"Bearer {API_KEY}",    "Content-Type": "application/json",}payload = {    "model": "doubao-seedance-2-pro",    "content": [        {            "type": "text",            "text": (                "A cinematic drone shot over a rain-soaked neon street at night, "                "slow push-in, realistic reflections, subtle crowd motion."            )        },        {            "type": "image",            "url": "https://example.com/reference-frame.jpg"        }    ],    "output": {        "resolution": "1080p",        "duration_s": 12    }}resp = requests.post(BASE_URL, json=payload, headers=headers, timeout=60)resp.raise_for_status()data = resp.json()task_id = data.get("id") or data.get("task_id")if not task_id:    raise RuntimeError(f"Unexpected response, no task ID found: {data}")status_url = f"{BASE_URL}/{task_id}"for _ in range(60):    status_resp = requests.get(status_url, headers=headers, timeout=30)    status_resp.raise_for_status()    status_data = status_resp.json()    status = status_data.get("status")    if status in {"succeeded", "failed"}:        break    time.sleep(5)print("Final status:", status)if status == "succeeded":    result = status_data.get("result", {})    print("Video URL:", result.get("download_url"))else:    print("Task details:", status_data)

This pattern matches the asynchronous workflow documented on CometAPI’s Seedance pages: submit the job, poll the task, then read the result payload when the job is complete.

Image-to-Video & First/Last Frames

Add image_urls or reference_images to the payload:

payload = {
    "model": MODEL,
    "prompt": "The character turns and smiles at camera, natural motion",
    "image_urls": ["https://example.com/start-frame.jpg"],  # first frame
    "task_type": "first_last_frames"  # or omni_reference
}

Advanced Multimodal Omni-Reference Example

payload = {
    "model": MODEL,
    "prompt": "A professional chef cooks pasta while explaining steps. Use @image1 for chef face consistency, @video1 for kitchen layout, @audio1 for upbeat Italian music and voiceover.",
    # Upload references via provider dashboard or pre-signed URLs
    "references": {  # Platform-specific field
        "image1": "https://.../chef.jpg",
        "video1": "https://.../kitchen.mp4",
        "audio1": "https://.../music.wav"
    }
}

Prompt Engineering Best Practices for Seedance 2.0

  • Be specific: “Slow dolly zoom from wide shot to close-up, golden hour lighting, realistic physics.”
  • Use references: Always prefix with @assetN.
  • Camera language: “Handheld tracking shot, rack focus, smooth orbit.”
  • Audio cues: “Sync cuts to bass drop, clear dialogue with lip-sync.”
  • Length control: Specify “8-second clip, 5 shots.”

Pro tip: Test prompts in the provider playground first (CometAPI offers one-click testing).

Comparison Table: Seedance 2.0 vs Top Competitors (2026)

FeatureSeedance 2.0Kling 3.0Runway Gen-4Luma Ray 2 / Sora 2
Native Audio⭐⭐⭐⭐⭐ (best)⭐⭐⭐⭐⭐⭐⭐⭐⭐
Multimodal ReferencesUp to 12 filesLimitedImages onlyVaries
Max Duration15s10–15s8–16s8–20s
Camera ControlDirector-levelStrongExcellentGood
Motion ConsistencyIndustry-leadingVery goodGoodExcellent
Best ForCinematic storytellingCharacter consistencyArtistic polishPhotorealism

Seedance 2.0 wins for native audio and multimodal control.

Real-World Use Cases

  • Marketing: Product demos with synced voiceovers.
  • Social Media: Viral short-form content with music-driven cuts.
  • Film Pre-vis: Storyboard-to-video with consistent characters.
  • Education: Animated explainers with lip-synced narration.

CometAPI users report 40% faster iteration by switching between Seedance 2.0 and complementary models in one codebase.

Best Practices, Scaling & Error Handling

  • Implement exponential backoff for polling.
  • Use idempotency keys for retries.
  • Monitor usage via CometAPI dashboard.
  • Watermark removal available on some tiers.
  • Respect content moderation (no illegal/deceptive content).

Python error-handling snippet:

try:
    video_url = generate_seedance_video(...)
except requests.exceptions.HTTPError as e:
    if e.response.status_code == 429:
        print("Rate limit – retry after backoff")

Troubleshooting Common Issues

  • Task stuck in queue: Check provider status; use fast tier.
  • Poor consistency: Add more reference images with @ syntax.
  • Audio desync: Explicitly describe rhythm in prompt.
  • High cost: Switch to fast-preview models for testing.

Conclusion & Next Steps

Seedance 2.0 API represents a leap forward in controllable, audio-native AI video generation. With the code examples above and CometAPI.com’s unified platform, you can start building production video workflows today—often in under 30 minutes.

Ready to try it? Head to CometAPI.com, grab your free credits, and generate your first Seedance 2.0 video instantly. Whether you’re a solo creator, agency, or enterprise team, CometAPI delivers the lowest-friction, highest-value access to Seedance 2.0 and 500+ other models.

Start building cinematic AI video today—your next viral campaign (or feature film pre-vis) is just one API call away.

Continue learning

Connect this article to the next decision.

View all topics
Published on Apr 17, 2026
Last updated Sep 3, 2026
729 views
Reviewed for clarity, source attribution and current API terminology.

Ready to cut AI development costs by 20%?

Start free in minutes. Free trial credits included. No credit card required.

Read More