Get started
Batch Seedance clips without hitting limits
- 1
Create, do not wait
POST /v1/videos returns with a job id and the clip renders in the background, so your code does not hold a connection open for the whole render.
- 2
Pace creates
Stay under your tier's video limit (20 per minute on Standard); for big batches, send them from a queue at a steady rate instead of all at once.
- 3
Use webhooks
Pass webhook_url instead of polling every job, so polling never eats your limit. Keep a slow sweep with GET /v1/jobs/{job_id} for anything that never reported back.
- 4
Back off on 429
Wait the seconds in Retry-After, then resend with the same Idempotency-Key, so a resend can never create a second clip.
- 5
Grow into a higher tier
Paid top-ups over the last 30 days raise the video limit automatically, up to 300 per minute at Enterprise.
Rate limits per developer account
| Endpoint | Limit |
|---|---|
| POST /v1/uploads | 60 per minute |
| PUT /v1/uploads | 60 per minute |
| DELETE /v1/uploads/{upload_id} | 60 per minute |
| GET /v1/storage | 60 per minute |
| POST /v1/images | 60 per minute |
| POST /v1/characters | 60 per minute |
| GET /v1/characters | 60 per minute |
| GET/DELETE /v1/characters/{character_id} | 60 per minute |
| POST /v1/videos | 20 / 60 / 120 / 300 per minute by volume tier (Standard / Scale / Growth / Enterprise) |
| POST /v1/video-edits | 20 / 60 / 120 / 300 per minute by volume tier (Standard / Scale / Growth / Enterprise) |
| POST /v1/videos/edit and /v1/videos/extend (shared with POST /v1/videos) | 20 per minute |
| POST /v1/lip-sync | 20 per minute |
| GET /v1/jobs/{job_id} | 120 per minute, per job |
| GET/HEAD /v1/jobs/{job_id}/output | 300 per minute |
| API key creation | 5 per 600 s, per user |
Video request limit by volume tier
Your tier comes from paid top-ups over the last 30 days and applies to POST /v1/videos and /v1/video-edits. It also lowers the Seedance price.
| Tier | Paid top-ups | Video requests / minute | Seedance price |
|---|---|---|---|
| Standard | Any | 20 | List price |
| Scale | $1,000+ | 60 | up to 5% off |
| Growth | $2,500+ | 120 | up to 7.5% off |
| Enterprise | $5,000+ | 300 | up to 10% off |
Seedance API price per second on KreatorFlow
Seedance 2.0 and 2.5 at 720p and above on the KreatorFlow API: price per second, tokens per 5-second clip, and clips per prepaid top-up.
| Model · resolution | Tokens | 5 s clip | List rate per second | $20 top-up · 400 tokens | $50 top-up · 1,000 tokens | $100 top-up · 2,000 tokens | $250 top-up · 5,000 tokens |
|---|---|---|---|---|---|---|---|
| Seedance 2.0 · 720p | 11/5s | $0.55 | $0.110/s | 36 | 90 | 181 | 454 |
| Seedance 2.0 · 1080p | 24/5s | $1.20 | $0.240/s | 16 | 41 | 83 | 208 |
| Seedance 2.0 · 4K | 58/5s | $2.90 | $0.580/s | 6 | 17 | 34 | 86 |
| Seedance 2.5 · 720p | 21/5s | $1.05 | $0.207/s | 19 | 47 | 95 | 238 |
| Seedance 2.5 · 1080p | 45/5s | $2.25 | $0.444/s | 8 | 22 | 44 | 111 |
| Seedance 2.5 · 4K | 100/5s | $5.00 | $0.999/s | 4 | 10 | 20 | 50 |
Seedance 2.0 and 2.5, 720p and above. List rate per second is the rate card price; a clip is billed at that rate and its total rounded up to whole tokens ($0.05), which is why a 5-second clip can cost a cent or two more than rate x 5. Top-up columns: 5-second clips each top-up covers, without a video input. A 10-second clip uses about twice the tokens.
How the limits work
Limits are counted per developer account in a one-minute window, and every key on the account shares them. Creating video jobs, polling a job and downloading its output each have their own bucket, so polling never takes away from your video creates and downloads never slow your polling.
The video create limit counts requests, not running jobs. A clip takes minutes to render and there is no cap on how many Seedance jobs render at the same time, so a steady stream of creates builds up a large number of jobs in flight.
How many clips is that an hour?
At the Standard limit you can start 1200 video jobs an hour; at Enterprise it is 18000. Most products never get near that: the practical limit is usually your balance and how many clips your users actually need.
- Standard: up to 1200 video jobs started an hour
- Scale: up to 3600 video jobs started an hour
- Growth: up to 7200 video jobs started an hour
- Enterprise: up to 18000 video jobs started an hour
How often should I poll a Seedance job?
Every 10 to 15 seconds for video is plenty; a clip takes minutes, not seconds. The polling limit is 120 per minute per job, with a cap across the account as well, and downloads of finished output have their own bucket (300 per minute). Better still, use a webhook and keep a slow sweep for anything that never reported back.
Webhooks instead of polling
Send webhook_url (or callback_url) with the create request and KreatorFlow calls it when the job ends: completed, failed, canceled or blocked. Deliveries go to HTTPS addresses only and carry an X-KreatorFlow-Signature header signed with your workspace signing secret from the Webhooks tab, so you can check the call really came from KreatorFlow.
Webhooks make a big batch cheap on limits: your creates are the only requests that scale with the batch, and your server hears about each clip the moment it is ready.
Handling a 429
A 429 means the window is full. Nothing was reserved or charged. Wait the number of seconds in Retry-After and send the same request again with the same Idempotency-Key. Never resend in a tight loop: it keeps the window full and slows the whole batch.
Python: create with backoff
import os, time, uuid, requests API = "https://kreatorflow.ai/v1" HEADERS = {"Authorization": f"Bearer {os.environ['KREATORFLOW_API_KEY']}"} def create_video(body, key=None): key = key or str(uuid.uuid4()) while True: r = requests.post(f"{API}/videos", json=body, timeout=90, headers={**HEADERS, "Idempotency-Key": key}) if r.status_code == 429: # Over the limit: nothing was reserved. Wait, then resend with the SAME key. time.sleep(int(r.headers.get("Retry-After", "10"))) continue r.raise_for_status() return r.json()["data"]["job"]
Pacing a batch
For a batch, spread creates evenly across the minute instead of firing them all at once. A simple gap between requests works for a script; in production, use a queue worker that sends at your tier's rate and puts any 429 back on the queue.
Node.js: a paced batch with webhooks
// Node: send a batch at a steady pace instead of all at once. const PER_MINUTE = 20; // your tier's video limit const gap = Math.ceil(60000 / PER_MINUTE); for (const [i, prompt] of prompts.entries()) { const res = await fetch("https://kreatorflow.ai/v1/videos", { method: "POST", headers: { Authorization: "Bearer " + process.env.KREATORFLOW_API_KEY, "Content-Type": "application/json", "Idempotency-Key": "batch-42-" + i, }, body: JSON.stringify({ model: "kreator-video-fast", prompt, duration: 5, aspect_ratio: "9:16", resolution: "720p", webhook_url: "https://your-app.example/hooks/kreatorflow", }), }); if (res.status === 429) { await new Promise((r) => setTimeout(r, Number(res.headers.get("Retry-After") || 10) * 1000)); continue; // in production, put the item back on your queue and resend it with the same key } await new Promise((r) => setTimeout(r, gap)); }
Can I get higher limits?
The video limit rises on its own with your volume tier, up to 300 requests a minute. If your product needs more than that, contact support with your expected volume.
Volume pricing for the Seedance API
The more you top up, the less Seedance video costs. Your tier comes from the token top-ups you paid for in the last 30 days. It lowers the per-second price of Seedance video and raises your video request limit, automatically, with no contract and no sales call. If your top-ups drop, the tier moves back down.
Every job's quote shows your price before it runs; a few low-priced settings get a smaller discount. Smaller top-ups add up toward a tier too. Price comparisons on this site use list prices unless a price is marked as at volume. Need more volume? Custom pricing for committed monthly spend: email harry@kreatorflow.ai.
- Standard: Any · List price · 20 video requests / minute
- Scale: $1,000+ · up to 5% off · 60 video requests / minute
- Growth: $2,500+ · up to 7.5% off · 120 video requests / minute
- Enterprise: $5,000+ · up to 10% off · 300 video requests / minute
Frequently asked questions
What is the Seedance API rate limit on KreatorFlow?
20 to 300 per minute for POST /v1/videos depending on your volume tier, and 120 per minute per job for GET /v1/jobs/{id}. Limits are per developer account.
What happens over the limit?
The request returns 429 with a Retry-After header. Nothing is reserved.
Are limits per key or per account?
Per developer account, shared by all its keys.
How do I fix a Seedance API 429 error?
Wait the seconds in the Retry-After header, then resend with the same Idempotency-Key. If it happens often, pace your creates from a queue and use webhooks instead of polling.
How many Seedance jobs can run at the same time?
There is no limit on concurrent Seedance jobs at any tier. The limit is on how many new video jobs you create per minute.
Does a 429 cost tokens?
No. A rate-limited request never becomes a job, so nothing is reserved or charged.
Does polling count against my video limit?
No. Polling and output downloads have their own buckets, separate from video creates.
How do I raise my Seedance API rate limit?
Top up more: paid top-ups over the last 30 days move the account to a higher volume tier, up to 300 video requests a minute at Enterprise. For more than that, contact support.
Is there volume pricing for the Seedance API?
Yes. Once your paid top-ups in the last 30 days reach $1,000, Seedance video costs up to 5% less per second, rising to up to 10% off at $5,000 (Enterprise), and your video request limit goes up with each tier. It applies automatically, with no contract, and each job's quote shows your price before it runs. For more volume than that, email harry@kreatorflow.ai.

