Flux 3
Black Forest Labs Flux 3 — up to 20 seconds of video with synchronized audio from text, images, or an existing clip.
POST /v2/videos/generate — model: "flux-3"
Flux 3 is Black Forest Labs' multimodal video model, built on their Self-Flow architecture. It produces mp4 clips of 5 to 20 seconds at 720p or 1080p, with synchronized audio (ambient sound, speech, and effects) generated by default.
The mode follows from the media you attach:
- No media → text-to-video. The whole clip comes from the prompt.
- One image → that image opens the clip, shown pixel for pixel as the first frame.
- Two images → the first starts the clip and the second ends it.
- Three to ten images → a storyboard. The first starts it, the last ends it, and the rest land evenly in between. Set
durationexplicitly for this mode. start_video→ continue an existing clip from its final frames, to extend a shot or chain generations into a longer sequence.
Attach either images or start_video, never both.
See Video Generation overview for common request fields, response format, and error codes.
Model-specific parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
flux3Params.images | string[] | No | — | Up to 10 images. The count selects the mode (see above). PNG, JPEG, or WebP. |
flux3Params.start_video | string | No | — | URL of an mp4 to continue from its final frames. Max 50MB and 15 seconds. Cannot be combined with images. |
flux3Params.aspect_ratio | string | No | "auto" | One of "auto", "21:9", "2:1", "16:9", "4:3", "1:1", "3:4", "9:16". "auto" picks a ratio from your prompt and inputs. |
flux3Params.resolution | string | No | "720p" | Output resolution: "720p" or "1080p". Ignored when draft is on. |
flux3Params.duration | number | No | — | Clip length in whole seconds, 5-20. Omit to let the model pick a length that fits the content — billed at the 20s maximum (see below). Required when you pass three or more images. |
flux3Params.generate_audio | boolean | No | true | Generate synchronized audio. Set to false for a silent clip. |
flux3Params.draft | boolean | No | false | Generate a fast, low-cost 720p preview. Useful for iterating on a prompt before a full-quality run. |
Credit cost
Pricing is per second of video: credits = rate × duration. The rate depends on resolution, draft mode, and whether the request continues a video. Audio is included at no extra cost.
| Variant | Credits / second |
|---|---|
720p | 29 |
1080p | 49 |
draft | 10 |
v2v-720p | 70 |
v2v-1080p | 90 |
v2v-draft | 20 |
A 10-second clip at 1080p, for example, costs 10 × 49 = 490 credits.
The v2v- variants apply whenever start_video is set. draft overrides resolution, since drafts are always 720p.
If you omit duration, the model picks any length from 5 to 20 seconds to fit the content — and the request is billed at the 20-second maximum, since the final length isn't known when credits are deducted. Pass an explicit duration for exact pricing.
Example result
Once the job is COMPLETED, the result object on GET /v2/jobs/:id looks like:
{
"videoUrl": "https://cdn2.apiframe.ai/videos/b2c3d4e5-f6a7-8901-bcde-f23456789012.mp4"
}See Result format for field details.
Code examples
curl -X POST https://api.apiframe.ai/v2/videos/generate \
-H "X-API-Key: afk_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"prompt": "A lighthouse keeper climbs the spiral stairs at dawn, waves crashing below, wind and gulls in the background",
"model": "flux-3",
"flux3Params": {
"duration": 10,
"resolution": "1080p",
"aspect_ratio": "16:9",
"generate_audio": true
}
}'import requests
response = requests.post(
"https://api.apiframe.ai/v2/videos/generate",
headers={
"X-API-Key": "afk_your_api_key_here",
"Content-Type": "application/json",
},
json={
"prompt": "A lighthouse keeper climbs the spiral stairs at dawn, waves crashing below, wind and gulls in the background",
"model": "flux-3",
"flux3Params": {
"duration": 10,
"resolution": "1080p",
"aspect_ratio": "16:9",
"generate_audio": True,
},
},
)
print(response.json())const response = await fetch("https://api.apiframe.ai/v2/videos/generate", {
method: "POST",
headers: {
"X-API-Key": "afk_your_api_key_here",
"Content-Type": "application/json",
},
body: JSON.stringify({
prompt: "A lighthouse keeper climbs the spiral stairs at dawn, waves crashing below, wind and gulls in the background",
model: "flux-3",
flux3Params: {
duration: 10,
resolution: "1080p",
aspect_ratio: "16:9",
generate_audio: true,
},
}),
});
console.log(await response.json());Storyboard from multiple images
Three or more images become keyframes spread evenly across the clip, so the duration has to be explicit.
curl -X POST https://api.apiframe.ai/v2/videos/generate \
-H "X-API-Key: afk_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"prompt": "A slow dolly through the shop as the seasons change outside the window",
"model": "flux-3",
"flux3Params": {
"images": [
"https://example.com/spring.jpg",
"https://example.com/summer.jpg",
"https://example.com/autumn.jpg",
"https://example.com/winter.jpg"
],
"duration": 16,
"resolution": "1080p"
}
}'Continuing a clip
Pass a finished clip as start_video to extend the shot. Chain the calls to build sequences past the 20-second per-generation limit.
curl -X POST https://api.apiframe.ai/v2/videos/generate \
-H "X-API-Key: afk_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"prompt": "The camera keeps rising above the clouds as the music swells",
"model": "flux-3",
"flux3Params": {
"start_video": "https://example.com/opening-shot.mp4",
"duration": 10,
"resolution": "1080p"
}
}'Drafting a prompt cheaply
Turn on draft while you iterate, then rerun the winning prompt without it.
curl -X POST https://api.apiframe.ai/v2/videos/generate \
-H "X-API-Key: afk_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"prompt": "A lighthouse keeper climbs the spiral stairs at dawn",
"model": "flux-3",
"flux3Params": {
"draft": true,
"duration": 5
}
}'Try it
/v2/videos/generateTry it