FLUX-3 video generation
Black Forest Labs' FLUX-3 video model, with synchronized audio generated by default. The operation is selected by an explicit operation discriminator — fields invalid for that operation are rejected with a 400.
operation | Required inputs | What it does |
|---|---|---|
textToVideo | prompt | Generate a clip from a text prompt. |
imageToVideo | prompt, image | Animate a single source image as the first frame. |
firstLastFrameToVideo | prompt, startImage, endImage | Generate a clip that starts on one image and ends on another. |
keyframesToVideo | prompt, keyframes (1–10) | Pin up to 10 images to exact frame positions and generate the motion between them. |
extendVideo | prompt, sourceVideo | Continue an existing clip from its final frames. |
draftEnhance | prompt, draftCache, duration | Re-render a previously generated draft at full-quality 1080p. |
Default choice: resolution: "720p", duration: 5, generateAudio: true. FLUX-3 jobs exceed the 100-second request timeout — always submit with wait=0.
Flux image vs FLUX-3 video
This page covers the videoGen engine (engine: "flux"). For Flux image generation see Flux 2 and Flux 1.
Drafts
Every generation operation accepts draft: true, which renders a fast 720p preview at roughly a third of the standard rate. A draft response carries an extra draftCache blob alongside the video; passing that blob's url to draftEnhance re-renders the same clip at full-quality 1080p.
This makes iteration cheap: explore with drafts, then pay the full rate once on the take you want.
textToVideo (draft: true) → output.video 720p preview, 390 Buzz at 5s
→ output.draftCache opaque bundle
↓
draftEnhance (draftCache) → output.video 1080p final, 1885 Buzz at 5sTwo constraints follow from how drafts work:
- Drafts always render at 720p. Sending
draft: truewithresolution: "1080p"is rejected with a400— take the draft at 720p and enhance it instead. draftEnhanceneeds the draft'sdurationrestated on the request, because the cache bundle is opaque and the duration cannot be recovered from it. Pass the same value you used for the draft.
The request shape
Every FLUX-3 request is a single videoGen step on SubmitWorkflow. Three keys select which leaf schema the rest of the body is validated against:
{
"$type": "videoGen",
"input": {
"engine": "flux",
"version": "v3.0",
"operation": "textToVideo"
}
}"v3.0" is currently the only release. Send it explicitly — it also pins you against future versions changing the defaults under you.
textToVideo
POST https://orchestration.civitai.com/v2/consumer/workflows?wait=0
Authorization: Bearer <your-token>
Content-Type: application/json
{
"steps": [{
"$type": "videoGen",
"input": {
"engine": "flux",
"version": "v3.0",
"operation": "textToVideo",
"prompt": "A little girl walking on a road at sunset, cinematic lighting, smooth camera movement",
"aspectRatio": "16:9",
"resolution": "1080p",
"duration": 5
}
}]
}/v2/consumer/workflowsRequest body — edit to customize (e.g. swap the image URL or prompt)
As a draft
Same request with draft: true and no resolution:
{
"engine": "flux",
"version": "v3.0",
"operation": "textToVideo",
"prompt": "A little girl walking on a road at sunset, cinematic lighting, smooth camera movement",
"aspectRatio": "16:9",
"duration": 5,
"draft": true
}/v2/consumer/workflowsRequest body — edit to customize (e.g. swap the image URL or prompt)
Feed the resulting output.draftCache.url to draftEnhance when you want the full-quality render.
imageToVideo
Pass a single image used as the first frame.
{
"engine": "flux",
"version": "v3.0",
"operation": "imageToVideo",
"prompt": "Camera slowly pushes in",
"image": "https://image.civitai.com/.../first-frame.jpeg",
"resolution": "1080p",
"duration": 5
}/v2/consumer/workflowsRequest body — edit to customize (e.g. swap the image URL or prompt)
firstLastFrameToVideo
Generate the motion between two fixed frames.
{
"engine": "flux",
"version": "v3.0",
"operation": "firstLastFrameToVideo",
"prompt": "A smooth transition between the two shots",
"startImage": "https://image.civitai.com/.../first.jpeg",
"endImage": "https://image.civitai.com/.../last.jpeg",
"resolution": "720p",
"duration": 5
}/v2/consumer/workflowsRequest body — edit to customize (e.g. swap the image URL or prompt)
keyframesToVideo
Pin 1–10 images to exact positions in the generated video. The output runs at 24 fps, so frameIndex must be between 0 and duration × 24 — at duration: 5 the last valid index is 120. Every frameIndex must be unique.
{
"engine": "flux",
"version": "v3.0",
"operation": "keyframesToVideo",
"prompt": "A slow pan across the scene",
"keyframes": [
{ "image": "https://image.civitai.com/.../a.jpeg", "frameIndex": 0 },
{ "image": "https://image.civitai.com/.../b.jpeg", "frameIndex": 120 }
],
"resolution": "720p",
"duration": 5
}/v2/consumer/workflowsRequest body — edit to customize (e.g. swap the image URL or prompt)
extendVideo
Continue an existing clip from its final frames. The source must be an MP4 under 15 seconds and under 50 MB; duration is the length of the new footage.
{
"engine": "flux",
"version": "v3.0",
"operation": "extendVideo",
"prompt": "The camera keeps drifting forward as the sun sets",
"sourceVideo": "https://image.civitai.com/.../clip.mp4",
"resolution": "720p",
"duration": 5
}extendVideo re-renders the source alongside the continuation, so it bills at roughly 2.4× the standard rate — see Cost.
Supply your own MP4
There's no live widget here — the operation needs an MP4 under 15 seconds, and the shared sample clips are longer. Point sourceVideo at your own short MP4 to try it.
draftEnhance
Take output.draftCache.url from a completed draft and submit it back. prompt is required for moderation but does not steer the render — the enhance reproduces exactly what the draft previewed, at 1080p.
{
"engine": "flux",
"version": "v3.0",
"operation": "draftEnhance",
"prompt": "A little girl walking on a road at sunset, cinematic lighting, smooth camera movement",
"draftCache": "https://orchestration.civitai.com/v2/consumer/blobs/abc123.draftcache?...",
"duration": 5
}Restate the draft's duration — the cache is opaque, so the value can't be recovered from it, and it determines the price.
Swap in your own draft-cache url
draftCache above is a placeholder. There's no live widget for this operation because the url has to come from your own completed draft run. Draft-cache urls are signed and expire like any other blob url — refetch the draft workflow for a fresh one rather than storing it long-term.
Parameters
Shared across operations unless noted. The per-operation schema in the API reference is authoritative.
| Field | Default | Used by | Notes |
|---|---|---|---|
engine | — ✅ | All | "flux" |
version | — ✅ | All | "v3.0" is the only release. |
operation | — ✅ | All | See the table above. |
prompt | — ✅ | All | Required on every operation, including draftEnhance (moderation only there). |
duration | 5 | All | Integer seconds, 5–20. Required on draftEnhance — restate the draft's value. |
resolution | "720p" | All generation ops | "720p" or "1080p". Rejected alongside draft: true; draftEnhance always outputs 1080p. |
aspectRatio | "auto" | All generation ops | "auto", "21:9", "2:1", "16:9", "4:3", "1:1", "3:4", "9:16". "auto" lets the model choose. |
generateAudio | true | All generation ops | Set false for a silent clip. No cost difference. |
draft | false | All generation ops | Fast 720p preview that also returns draftCache. See Drafts. |
image | — ✅ | imageToVideo | Single image used as the first frame. |
startImage / endImage | — ✅ | firstLastFrameToVideo | First and last frame. |
keyframes[] | — ✅ | keyframesToVideo | 1–10 { image, frameIndex } entries, unique frameIndex ≤ duration × 24. |
sourceVideo | — ✅ | extendVideo | MP4 url, under 15 s and 50 MB. |
draftCache | — ✅ | draftEnhance | output.draftCache.url from a prior draft. |
FLUX-3 takes no seed — the model does not accept one. Identical requests therefore resolve to the same cached result; vary the prompt if you want a different take.
Cost
Billed per output second in Buzz on the workflow's transactions. Use whatif=true for an exact preview; see Payments (Buzz) for currency selection.
total = buzzPerSecond × duration| Operation | 720p | 1080p | Draft (720p) |
|---|---|---|---|
textToVideo, imageToVideo, firstLastFrameToVideo, keyframesToVideo | 221 Buzz/s | 377 Buzz/s | 78 Buzz/s |
extendVideo | 533 Buzz/s | 689 Buzz/s | 156 Buzz/s |
draftEnhance | — | 377 Buzz/s | — |
Totals at duration: 5: 1 105 / 1 885 / 390 for the standard operations, 2 665 / 3 445 / 780 for extendVideo, and 1 885 for draftEnhance.
A draft-then-enhance round trip at 5 s costs 390 + 1 885 = 2 275 against 1 885 for going straight to 1080p — so drafts pay off when you expect to discard takes, not when you already know what you want.
Reading the result
A standard videoGen step output, plus draftCache when the step ran a draft:
{
"status": "succeeded",
"steps": [{
"name": "0",
"$type": "videoGen",
"status": "succeeded",
"output": {
"video": { "id": "blob_...", "url": "https://.../signed.mp4" },
"draftCache": { "id": "abc123.draftcache", "url": "https://.../signed.bin" }
}
}]
}draftCache is absent on non-draft runs. Its contents are opaque and encrypted — the only thing to do with it is pass its url to draftEnhance.
Blob urls are signed and expire — refetch the workflow or call GetBlob for a fresh url.
Long-running jobs
FLUX-3 jobs typically take a few minutes, longer at 1080p and at higher durations; drafts are substantially faster. All exceed the 100-second request timeout — submit with wait=0 and:
- Webhooks (recommended): register a callback with
type: ["workflow:succeeded", "workflow:failed"]— see Results & webhooks. - Polling:
GET /v2/consumer/workflows/{workflowId}on a 10 s → 30 s → 60 s cadence.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
400 with unknown field | Field isn't valid for this operation | Each operation maps to its own typed schema; check it via SubmitWorkflow. |
400 "FLUX-3 drafts always render at 720p" | Sent draft: true with resolution: "1080p" | Drop resolution (or use "720p"), then use draftEnhance for the 1080p render. |
400 "keyframesToVideo requires between 1 and 10 keyframes" | keyframes was empty or had >10 entries | Provide 1–10. |
400 "Keyframe frameIndex values must be unique" | Two keyframes shared a position | Give each a distinct frameIndex. |
400 "Keyframe frameIndex must be between 0 and duration × 24" | Index past the end of the clip | The video is 24 fps — cap indexes at duration × 24, or raise duration. |
400 "requires a source video shorter than 15 seconds" | sourceVideo too long | Trim the clip before submitting. |
Step failed after a draftEnhance | Draft-cache url expired | Refetch the draft workflow for a fresh draftCache.url and resubmit. |
Step failed, reason = "no_provider_available" | Provider queue busy | Retry shortly. |
Step failed, reason = "blocked" | Moderation rejected the input or output | Re-prompt with different content. FLUX-3 jobs run with the provider's safety filter at its most permissive setting and Civitai moderates instead, so there is no knob to loosen — though the model still applies a floor of its own. |
Related
SubmitWorkflow— operation used by every example hereGetWorkflow— for polling- Results & webhooks — production result handling
- Full parameter catalog: the
Flux3V3<Operation>Inputschemas in the API reference —Flux3V3TextToVideoInput,Flux3V3ImageToVideoInput,Flux3V3FirstLastFrameToVideoInput,Flux3V3KeyframesToVideoInput,Flux3V3ExtendVideoInput,Flux3V3DraftEnhanceInput - Happy-Horse video generation — comparable multi-operation commercial video model
- MiniMax H3 video generation — 2K native video with reference image / video / audio
- Veo 3 video generation — Google's multi-mode video model
- Flux 2 image generation — the Flux family's image models