Seedance prompting and cost control
Seedance's distinguishing features are reference-to-video with up to 50 references, native lip-synced dialogue in 10+ languages, video editing and extension, and 4–30s in a single pass. Its distinguishing risk is that it bills per second generated, rejects included — so the prompt discipline here is inseparable from the cost discipline.
Full numbers, sources and worked budgets:
docs/seedance-cost-model.md.
1. Know what you are buying before you prompt
Seedance is not free on any API route. "Free Seedance" headlines refer to consumer web UIs (watermarked exports) or time-boxed promos.
Capabilities of Seedance 2.5, from the vendor model page:
- Resolution: 480p and 720p only. No 1080p, no 4K. (Seedance 2.0 does 1080p/4K but caps at 15s.) 720p max means an upscale step before Instagram, which prefers 1080×1920.
- 24 fps · 4–30s in a single pass, no stitching ·
.mp4/.mov - Inputs: text, image, video, audio → video. Up to 50 references (30 images +
10 videos + 10 audio), cited in the prompt as
@Image1,@Video1,@Audio1. - Task types: multimodality-to-video, reference-to-video, video editing (e.g. "remove everyone in @Video1 except the protagonist"), video extension, first-frame / first-and-last-frame image-to-video, text-to-video.
- Native synchronised audio and lip-sync dialogue in 10+ languages.
- Individual (non-enterprise) rate limits: 180 RPM, 3 concurrent tasks.
2. The billing formula — memorise this
tokens = (height_px * width_px * duration_seconds * 24) / 1024
cost = tokens * unit_price_per_token
Verified against the vendor's own published price example (5s, 16:9, 720p, no video input → 1280×720×5×24/1024 = 108,000 tokens → the exact published figure).
Two consequences that decide your whole workflow:
- Cost scales with pixels × seconds. 480p vertical is ~2.2× cheaper per second than 720p vertical. Blocking at 480p is nearly free by comparison.
- A rejected 30s take wastes 30s of billing; a rejected 5s clip wastes 5s. Long takes are a cost trap until your hit rate is already high.
Per second of vertical 9:16 video (computed from the formula × published unit prices — reconfirm current prices before budgeting):
| Route | 720p 9:16 | 480p 9:16 |
|---|---|---|
| Seedance 2.5, direct | $0.231 /s | $0.107 /s |
| Seedance 2.5, direct, with a video reference | $0.138 /s | $0.064 /s |
| Seedance 2.5 via a reseller/aggregator | $0.473 /s | $0.221 /s |
| Seedance 2.0 mini, direct | $0.076 /s | $0.035 /s |
Go direct to the vendor API, not through an aggregator — the aggregator route was ~2× the unit price for the identical model. Passing a video reference cuts the rate ~40%.
3. The cost model that actually predicts your bill
Not "number of generations". This:
cost = final_runtime_seconds * attempts_per_keeper * price_per_second
attempts_per_keeper is the number that ruins budgets. A real measured campaign ran
~11.4 attempts per keeper (a ~9% hit rate) while the look was still being found.
Once the look is solved and references are locked, 2–4 is realistic.
Therefore: block cheap, finish expensive.
- Block every shot at 480p / 5s on the cheapest model in the family. Burn the entire creative churn here. (160 blocking passes at 480p/5s on the mini model ≈ $28 — the whole churn of a real campaign for the price of a pizza.)
- Lock the shot list. Feed the approved frames back as
@Image1…references. - Re-render only the locked list at 720p, ~1.5 attempts per shot.
Do not consolidate 14 short clips into four 30s takes to "save money". Final runtime is the same either way, so the only lever is attempts per keeper — and at a low hit rate, consolidating turns wasted seconds into more wasted seconds.
The subscription trap: if you are moving work off a flat-rate plan (e.g. Google Flow credits already paid for) onto Seedance, you are converting a sunk subscription into live cash spend. That, not the per-second rate, is the real decision.
4. Prompting notes specific to Seedance
- Reference syntax lives in the prompt text:
@Image1,@Video1,@Audio1. Address references by identifier, not by natural-language description. - Reference-to-video is a training-free identity path. Up to 30 image references
hold a character across a 30s take with lip-sync. Before investing in LoRA training
or a dataset, spend ~$1 on one 5s 720p reference-to-video test — it may already clear
your quality bar. See
skills/identity-and-likenessfor the zero-shot gate and the consent rules that still apply. - Video extension and video editing are native, and the with-video-input rate is ~40% cheaper. For recurring segments (same set, same characters, new dialogue), generate the base take once and then extend/edit rather than regenerating from text.
- The clip-craft rules do not change: one camera move, max two action beats, no state
change inside a shot, labelled speakers, restated wardrobe. Those are in
skills/wan-3-prompting§1–§5 and apply here too.
5. Wiring it into a pipeline
Treat generated video as one shot source among several, not a replacement for a stock-footage pipeline.
Highest cost/benefit first move: generate only the hook. The first two seconds decide retention, and stock footage is where every cold account looks generic. A 4–5s, 720p, 9:16 hook on the cheap model is ~$0.30–0.38 per video; escalate to the flagship model only for the ones you are actually pushing.
gen_video/
base.py # IVideoGenProvider: generate(prompt, refs, duration, resolution) -> Path
seedance.py # vendor endpoint, poll for completion
cache.py # prompt-hash -> mp4, so re-runs are free
Non-negotiables for any paid generation path:
- Cache by prompt hash so a re-run costs nothing.
- Fall back to stock footage on any error — never fail a batch because a paid provider hiccuped.
- A hard per-run spend cap, so a
--loop-count 20run can never quietly burn $100. - Default the generation flag OFF.