Purpose
Generate one Seedance 2.0 reference-to-video clip via the direct fal.ai endpoint (bytedance/seedance-2.0/reference-to-video), not the Higgsfield MCP. Pay-per-second billing makes this the workhorse for any DIBS / beauty / CPG project that needs the product or the locked creator visible inside a moving shot.
Use this atom when:
- You have a product photograph that must appear pixel-faithfully in the output clip (Seedance reference is much more accurate than text prompts at preserving product geometry, color, labeling).
- You have a locked character anchor and need a short talking-frame or action clip with that exact face.
- You need 1-9 reference images composited into one motion shot — multi-SKU product reveals, character + product, character + world.
- You want native synced audio generated alongside the video (
generate_audio=true, default). - You want to skip Higgsfield's flat-rate billing for short clips.
Use the sibling create-video-seedance (Higgsfield-routed) instead if you need Higgsfield's job-queue infrastructure, you already have your product registered in Marketing Studio, or you want Higgsfield's auto-fallback chain.
Pricing (as of 2026-05)
| Tier | Without video ref | With video ref (0.6×) |
|---|---|---|
| Standard 720p | $0.3024/sec | $0.1814/sec |
| Fast 720p | $0.2419/sec | $0.1452/sec |
1080p costs ~1.7× more; 480p costs ~0.6× less. Auto-duration billed at actual clip length. Source: fal.ai/models/bytedance/seedance-2.0/reference-to-video.
Example: a 5s 720p clip from one reference image = $1.51 standard, $1.21 fast.
Inputs
Required:
--prompt— text prompt. Reference media is addressed inline as@Image1,@Image2, ...,@Video1,@Audio1. Example:"@Image1 is held up to the cheek of @Image2, who swipes the product across her cheekbone. soft window light from left, gentle push-in."--output— local MP4 destination.--ref-image— one or more reference image paths. Repeat the flag for multiple. Max 9 images total (30 MB each, JPEG/PNG/WebP).
Optional:
--ref-video— reference video paths (1-3, combined 2-15s, 480p-720p, max 50 MB total). Triggers the 0.6× pricing discount.--ref-audio— reference audio paths (1-3, combined ≤15s, max 15 MB each). Drives pacing/lipsync.--aspect-ratio—auto | 21:9 | 16:9 | 4:3 | 1:1 | 3:4 | 9:16(default9:16for DIBS / vertical social).--resolution—480p | 720p | 1080p(default720p).--duration—auto | 4-15seconds (default5).--tier—standard | fast(defaultstandard).--no-audio— disable native audio generation (default isgenerate_audio=true).--seed— integer for reproducibility.--with-logs— stream fal queue logs to stderr.
Credentials:
FAL_API_KEY(orFAL_KEY) in.envor env.
Preflight
test -n "$FAL_API_KEY" || test -n "$FAL_KEY" || { echo "Missing FAL_API_KEY"; exit 1; }
python3 -c "import fal_client" || pip3 install fal_client
Workflow
# Single creator + product, 5s 9:16 720p
python3 skills/atoms/video-generation/create-video-seedance-fal/scripts/generate.py \
--prompt "@Image1 (a woman with warm-blonde hair) holds @Image2 (a glossy pink cream-stick) up near her cheek, then swipes it diagonally across her cheekbone. soft warm window light from camera-left. subtle push-in. authentic UGC selfie feel." \
--ref-image dibsbeauty/concept-2-30-second-face/assets/characters/creator-anchor.png \
--ref-image dibsbeauty/concept-2-30-second-face/assets/keyframes/swipe-on-cheek.png \
--output dibsbeauty/concept-2-30-second-face/working/clips/scene-02-swipe.mp4 \
--aspect-ratio 9:16 --resolution 720p --duration 5
# Product-only with world plate, 5s, fast tier
python3 .../generate.py \
--prompt "@Image1 (a pink DIBS cream-stick barrel) slides into the empty marble-vanity world of @Image2 from camera-right, settling at center frame. soft golden-hour shadow. slow elegant push-in. no audio." \
--ref-image dibsbeauty/concept-8-pink-is-personality-hypermotion/assets/keyframes/did-on-marble.png \
--ref-image dibsbeauty/concept-8-pink-is-personality-hypermotion/assets/worlds/marble-vanity.png \
--output dibsbeauty/concept-8-pink-is-personality-hypermotion/working/clips/seg-1-did-arrival.mp4 \
--aspect-ratio 9:16 --resolution 720p --duration 5 --tier fast --no-audio
The script:
- Loads the FAL key via
fal_helpers.load_fal_key(). - Uploads every
--ref-image/--ref-video/--ref-audioto FAL storage; collects URLs. - Builds the request:
{prompt, image_urls, video_urls, audio_urls, resolution, duration, aspect_ratio, generate_audio, seed}. - Routes to
bytedance/seedance-2.0/reference-to-video(or…/fast/…if--tier fast). - Calls
fal_client.subscribe(model, payload)viafal_helpers.subscribe. - Downloads the resulting MP4 to
--output. - Writes
<output>.meta.jsonwith model id, ref-counts, request, result url, duration, and estimated cost.
Prompting guidance — DIBS-tested patterns
- Always reference each image by
@ImageNinline so Seedance binds the prompt to the right reference."@Image1 is held up by @Image2"works;"the woman holds the product"does not. - Lead with the subject + action verb, not the camera. ("@Image1 swipes the cream-stick across her cheek; slow push-in." NOT: "slow push-in on a woman swiping a cream-stick.") — same rule as Higgsfield Seedance (see
_shared/MODEL_BEHAVIORS.md). - Cap motion ambition. Seedance reference-to-video preserves products best when the camera move is slow (slight push-in, subtle parallax, soft drift). Aggressive moves (orbit, jib) start to "imagine" away from the reference.
- For product clips, use
--no-audio— Seedance's native audio is generic ambient that conflicts with a music bed added in post. - For talking-frame clips of a locked creator, leave audio on so micro-mouth-movements stay synced with subtle ambient breathing.
- Duration sweet spot is 4-6s. Above 8s the reference fidelity starts to drift on the back half.
Output
<output_path>— MP4 at requested resolution + aspect-ratio + duration.<output_path>.meta.json— request payload, result URL, cost estimate, model id.
Quality Checks
- Output file exists, plays end-to-end, duration within ±0.5s of requested.
- ffprobe: video stream present, audio stream present (unless
--no-audio). - Visually inspect first/middle/last frame against the reference images: product geometry intact, character identity intact.
meta.jsonincludesgateway: "fal", model id, image_count, video_count, audio_count, andest_cost_usd.
Failure Modes
| Symptom | Likely cause | Fix |
|---|---|---|
| 404 / "model not found" | Wrong model ID. Fal sometimes renames. | Pass --model-id override (TODO if/when needed). |
| 422 / "image too large" | A ref image > 30 MB. | Downscale to ≤ 1920px wide before passing. |
| 422 / "too many reference items" | > 9 images, > 3 videos, > 3 audios, or > 12 total. | Drop refs; pick the most-load-bearing. |
| Output product looks "almost right" but slightly off-spec | Prompt didn't reference @Image1 directly. |
Add @Image1 inline; redo. |
| First 1s is fine but the last 2s drifts | Duration too long for this composition. | Re-run at 4-5s. |
| Audio output is generic ambient noise | generate_audio=true + no audio_url. |
Use --no-audio for product clips. |
Composed by
Used directly by:
dibsbeauty/concept-2-30-second-face/HOW_TO.md(locked-creator talking + macro clips)dibsbeauty/concept-4-out-the-door-diary/HOW_TO.md(multi-location diary clips)dibsbeauty/concept-5-glassy-matte-grwm/HOW_TO.md(step-application clips)dibsbeauty/concept-6-faq-podcast/HOW_TO.md(host talking-frame + product b-roll)dibsbeauty/concept-7-put-it-on-me-music/HOW_TO.md(product macro + creator swipe cuts)dibsbeauty/concept-8-pink-is-personality-hypermotion/HOW_TO.md(product-only arrival + moment clips)
Why this atom exists (vs the Higgsfield-routed sibling)
The Higgsfield-routed create-video-seedance is best when:
- You're already on Higgsfield's job queue for parallel batches.
- You need Higgsfield's auto-fallback (Seedance → Veo on content-filter rejection).
- You're producing a Marketing Studio multi-SKU ad and the product is already registered there.
This Fal-direct atom is best when:
- You're producing standalone clips and want per-second billing visibility.
- You're inside a beauty / CPG project where the same atom needs to run dozens of times with different ref-image combos.
- You want to skip Higgsfield's per-clip overhead and price floor.
For DIBS specifically, every clip uses one or two reference images and runs 4-6s. Fal-direct billing of $1.20-$1.80 per clip beats Higgsfield's effective $10-25 per Hyper Motion clip by an order of magnitude. That's why this atom was created.