Before April 2026, the only way to actually use Seedance was through ByteDance's Dreamina web console — there was no programmatic API at all, which means any tutorial you find showing a pure click-through UI walkthrough predates real API access and is describing a different workflow than what's available now. The official API launched through ByteDance's Volcengine Ark platform shortly after, with an international counterpart through BytePlus ModelArk. That timeline matters mostly because it explains why guides written even a few months apart can describe genuinely different ways of using the same model.
Right now there are three realistic paths to actually generating a Seedance video, and which one fits depends less on skill level and more on what you're actually building.
Path 1: the Dreamina web app — no code, one video at a time
If you want a single video for a one-off use case — a social post, a quick mockup, testing whether the model can do what you're imagining before committing to building anything — the Dreamina web interface is the fastest path. Create an account, describe or upload your reference, generate, download. No API key, no billing setup beyond whatever credits the console requires. This is the right choice if "use Seedance" means "make one video," not "build something that generates videos."
Path 2: the official API — full control, more setup friction than you'd expect
If you're building something that needs to generate video programmatically — a pipeline, an app feature, a batch process — you're calling the official API directly through either Volcengine Ark or BytePlus ModelArk, which are effectively the same underlying service split by region. This is where the first real friction shows up: the model IDs differ depending on which platform you're calling through. Volcengine Ark uses IDs like doubao-seedance-2-0-260128 for standard and a -fast variant for quicker, cheaper generation; BytePlus ModelArk uses dreamina-seedance-2-0-260128 and its own -fast variant instead. Same underlying model, different ID prefix depending on which console issued your account — worth confirming which platform you're actually registered on before copying a model string from a guide that might be describing the other one.
There's no free tier on either platform — you create an account, generate an API key from the console, and purchase model-specific credits before you can call anything. Budget for that setup step; it's not instant the way a free-tier trial on some other AI APIs is.
The actual request pattern is a standard async job: submit a generation task, get back a task ID, poll a status endpoint until it reports success, then fetch the result. One detail worth building into your code from the start rather than discovering later: the generated video's URL expires — commonly documented around 24 hours — so download or move it to your own storage promptly rather than treating the returned URL as a permanent link.
import os
import time
import requests
API_KEY = os.environ["ARK_API_KEY"]
BASE_URL = "https://ark.bytepluses.com/api/v3" # confirm current base URL for your region/platform
def submit_task(prompt, model="dreamina-seedance-2-0-fast-260128"):
response = requests.post(
f"{BASE_URL}/contents/generations/tasks",
headers={"Authorization": f"Bearer {API_KEY}"},
json={
"model": model,
"content": [{"type": "text", "text": prompt}],
"duration": 4,
"ratio": "16:9",
"generate_audio": True,
},
)
response.raise_for_status()
return response.json()["id"]
def poll_task(task_id, interval=5, timeout=300):
start = time.time()
while time.time() - start < timeout:
res = requests.get(
f"{BASE_URL}/contents/generations/tasks/{task_id}",
headers={"Authorization": f"Bearer {API_KEY}"},
)
data = res.json()
if data["status"] == "succeeded":
return data["content"]["video_url"] # download this promptly — it expires
if data["status"] == "failed":
raise RuntimeError(f"Task failed: {data.get('error')}")
time.sleep(interval)
raise TimeoutError(f"Task {task_id} did not complete within {timeout}s")
task_id = submit_task("A tiny robot watering a basil plant in morning light.")
video_url = poll_task(task_id)
print(f"Done — download promptly, URL expires: {video_url}")
Path 3: a routing gateway — one key, less platform-specific friction
If the Volcengine-vs-BytePlus model ID split, region-specific accounts, and credit purchases per platform sound like more setup than you want for a feature that's one part of a larger project already calling other models, a gateway that lists Seedance alongside other providers behind one key is the third option. RouteAI, for instance, includes Seedance in its catalog alongside text models like DeepSeek, Qwen, and Kimi, so you're not managing a separate Volcengine or BytePlus account and its own billing relationship on top of whatever else you're already routing. It doesn't change the underlying model's behavior or capabilities — it changes how much account and key management you're doing to reach it.
The gotcha that catches a lot of first attempts: realistic human faces
This is worth knowing before your first real request rather than after a confusing rejection: the official API consistently rejects inputs containing realistic human faces — including AI-generated ones — and returns an error rather than a generated video. This isn't a bug or a rate limit issue; it's a content-policy restriction on the input side specifically. The commonly used workaround is converting a reference photo to a stylized or cartoon-style image before submitting it, rather than using a photorealistic face reference directly. If your use case fundamentally requires photorealistic human likeness in a reference image, that's worth confirming against current policy directly before building a workflow around it, since this is exactly the kind of restriction that's easy to hit once and then design around badly out of confusion rather than understanding the actual cause.
What it actually costs
There's no free tier, so budgeting matters from the first test call. A commonly cited reference point is roughly $0.93 for a 5-second 1080p clip on the standard model, with the -fast variants priced lower — treat that as a ballpark for planning rather than a locked number, since video-generation pricing on this platform is usage-metered off actual output tokens rather than a flat per-clip rate, and specifics shift between releases.
Picking a path
If you need one video and don't want to write any code, use Dreamina directly. If you're building a real feature or pipeline and want full control over the official platform's specific capabilities, go through Volcengine Ark or BytePlus ModelArk directly, budget time for the account and credit setup, and double-check which model ID prefix matches your actual account. If you're already juggling multiple model providers behind one key and want Seedance access without another separate account, a gateway is the lower-friction option — with the trade-off of one more layer between you and the platform's own newest features on day one of release. None of the three paths changes the face-restriction behavior described above; that's a property of the underlying model regardless of which door you walk through.
TL;DR: There are three real ways to use Seedance right now — the no-code Dreamina web app, the official API through Volcengine Ark or BytePlus ModelArk (which use different model ID prefixes for the same underlying model), or a routing gateway that consolidates account management. Regardless of path, the API consistently rejects realistic human face inputs, which is worth knowing before your first real request rather than after a confusing failure.
Website: https://www.fastrouteai.com

Top comments (0)