FLUX 3 Max Image to Video API
blackforestlabs/flux-3-max/image-to-videoFLUX 3 Max Image to Video animates a start image into a 5–20 second 720p or 1080p clip with native audio, optionally landing on an end frame you supply. It keeps the composition, subject and palette of your images while adding the motion and sound in the prompt.
Drag and drop files, paste from clipboard, or provide a URL. Required. Add 1–2 JPEG, PNG or WebP images in order: start frame, then an optional end frame.
2/2 files added
REST API
Quick Start
Make your first FLUX 3 Max Image to Video request in three steps. The example sends a start and end frame for a 6-second clip and returns a task_id.
Connect to the Vidgo API
Create an API key, keep it on your server, and send it in the Authorization header as a Bearer token.
- Endpoint
- POST
https://api.vidgo.ai/api/generate/submit - Authentication
- Authorization: Bearer VIDGO_API_KEY
Submit one generation task
Run the short example with a prompt and at least one image URL in image_urls.
curl --request POST \
--url "https://api.vidgo.ai/api/generate/submit" \
--header "Authorization: Bearer $VIDGO_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"model": "blackforestlabs/flux-3-max/image-to-video",
"input": {
"prompt": "Start on the closed ceramic teapot from the first image. Steam begins to curl from the spout, the lid lifts slightly and settles, and the camera pushes in slowly until it holds on the poured cup shown in the second image. Warm kitchen window light throughout, shallow depth of field. Native audio: quiet kettle hiss, a soft clink of porcelain, distant birdsong. No text, no logos, no watermark.",
"image_urls": [
"https://cdn.vidgo.ai/apis/models/blackforestlabs/flux-3-max/image-to-video/v1/01/input-start-frame.webp",
"https://cdn.vidgo.ai/apis/models/blackforestlabs/flux-3-max/image-to-video/v1/01/input-end-frame.webp"
],
"duration": 6,
"resolution": "720p",
"aspect_ratio": "auto",
"sound": true
}
}'Wait for the result
Use the returned task_id to check the same task until it reaches finished or failed. On success, read data.files[].file_url.
Track status
GET https://api.vidgo.ai/api/generate/status/{task_id}Poll every few seconds while the status is not_started or running, and stop on finished or failed. On success, read data.files[].file_url. For longer clips, lengthen the interval gradually or add callback_url to the submit request.
not_startedrunningfinishedfailed{
"code": 200,
"data": {
"task_id": "IB2OH450L0Z585RW",
"status": "not_started",
"created_time": "2026-11-05T07:04:45"
}
}{
"code": 200,
"data": {
"task_id": "IB2OH450L0Z585RW",
"status": "finished",
"files": [
{
"file_url": "https://cdn.vidgo.ai/apis/models/blackforestlabs/flux-3-max/image-to-video/v2/01/output-01.mp4",
"file_type": "video"
}
],
"created_time": "2026-11-05T07:04:45",
"error_message": null,
"progress": 100
}
}Complete runnable example
Open this after the three-step flow is clear. It combines submission, polling, terminal-state handling and result extraction in one script.
set -euo pipefail
: "${VIDGO_API_KEY:?Set VIDGO_API_KEY in your environment}"
REQUEST_BODY=$(cat <<'JSON'
{
"model": "blackforestlabs/flux-3-max/image-to-video",
"input": {
"prompt": "Start on the closed ceramic teapot from the first image. Steam begins to curl from the spout, the lid lifts slightly and settles, and the camera pushes in slowly until it holds on the poured cup shown in the second image. Warm kitchen window light throughout, shallow depth of field. Native audio: quiet kettle hiss, a soft clink of porcelain, distant birdsong. No text, no logos, no watermark.",
"image_urls": [
"https://cdn.vidgo.ai/apis/models/blackforestlabs/flux-3-max/image-to-video/v1/01/input-start-frame.webp",
"https://cdn.vidgo.ai/apis/models/blackforestlabs/flux-3-max/image-to-video/v1/01/input-end-frame.webp"
],
"duration": 6,
"resolution": "720p",
"aspect_ratio": "auto",
"sound": true
}
}
JSON
)
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
--request POST \
--url "https://api.vidgo.ai/api/generate/submit" \
--header "Authorization: Bearer $VIDGO_API_KEY" \
--header "Content-Type: application/json" \
--data "$REQUEST_BODY")
TASK_ID=$(printf '%s' "$SUBMIT_RESPONSE" | jq -r '.data.task_id // .task_id // empty')
if [ -z "$TASK_ID" ]; then
printf 'Submit response did not include task_id:
%s
' "$SUBMIT_RESPONSE" >&2
exit 1
fi
while true; do
STATUS_RESPONSE=$(curl --silent --show-error --fail-with-body \
--url "https://api.vidgo.ai/api/generate/status/$TASK_ID" \
--header "Authorization: Bearer $VIDGO_API_KEY")
STATUS=$(printf '%s' "$STATUS_RESPONSE" | jq -r '.data.status // .status // empty')
case "$STATUS" in
finished)
printf '%s' "$STATUS_RESPONSE" | jq -r '(.data.files // .files // [])[]?.file_url'
break
;;
failed)
printf '%s' "$STATUS_RESPONSE" | jq -r '.data.error_message // .error_message // "Generation failed"' >&2
exit 1
;;
not_started|running)
sleep 2
;;
*)
printf 'Unexpected task status: %s
' "$STATUS" >&2
exit 1
;;
esac
doneRequest Parameters
model and callback_url belong at the request root; generation parameters belong inside input.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| model | string | Yes | — | Fixed to blackforestlabs/flux-3-max/image-to-video. |
| callback_url | string (URL) | No | — | A public HTTP(S) URL that receives the task result when it finishes. |
| input | object | Yes | — | Generation parameters: a prompt and 1–2 images, plus optional duration, resolution, aspect_ratio and sound. |
| input.prompt | string | Yes | — | Text prompt for the shot, including audio cues when sound is on. |
| input.image_urls | string[] | Yes | — | 1–2 URLs: [start_frame] or [start_frame, end_frame]. |
| input.duration | integer | No | 5 | Whole seconds, 5–20. |
| input.resolution | string | No | 720p | 720p or 1080p. |
| input.aspect_ratio | string | No | auto | auto, 21:9, 2:1, 16:9, 4:3, 1:1, 3:4, 9:16. |
| input.sound | boolean | No | true | Native audio on or off; does not change the price. |
Response Fields
Submission returns the task identity immediately. Status responses add progress, output files or a failure message as the task advances.
| Field | Type | Description |
|---|---|---|
| code | integer | Application result code. Successful responses use 0 or 200. |
| message | string | Human-readable response or error message when present. |
| data.task_id | string | Task identifier used in the status endpoint path. |
| data.status | string | Current state: not_started, running, finished or failed. |
| data.created_time | string | Task creation time in date-time format. |
| data.progress | number | Completion percentage when the provider reports progress. |
| data.files[] | array | Generated output files returned after a successful task. |
| data.files[].file_url | string | Public URL of the generated video. |
| data.files[].file_type | string | Generated file type, such as video. |
| data.files[].watermark_url | string | null | Watermarked output URL when one is available. |
| data.error_message | string | null | Failure detail when status is failed. |
Task Lifecycle
Treat not_started and running as non-terminal states. finished and failed are terminal; stop polling when either is returned.
not_startedThe task has been accepted and is queued to start.
runningThe video is being generated. Keep polling the status endpoint.
finishedThe task is complete. Read the video URL from data.files[].file_url.
failedGeneration failed. Read data.error_message for details and stop polling.
Polling and Errors
- Authentication401 means the Bearer API key is missing or invalid. Check your key in the dashboard before retrying.
- Validation400 means a request field is invalid or belongs to another endpoint. Check image_urls (1–2 public URLs) and duration.
- Polling intervalPoll every few seconds while the task runs, and lengthen the interval gradually for longer clips.
- Terminal statesPoll only while the status is not_started or running. Stop on finished or failed.
- Callback optionAdd callback_url at the request root to receive the final result without continuous polling.
Model Specifications
| Specification | Value | Description |
|---|---|---|
| Model | blackforestlabs/flux-3-max/image-to-video | Model identifier for asynchronous image-to-video generation with an optional end frame. |
| Duration | 5–20 | Whole seconds; defaults to 5. |
| Resolution | 720p | 1080p | Defaults to 720p. |
| Aspect ratio | auto | 21:9 | 2:1 | 16:9 | 4:3 | 1:1 | 3:4 | 9:16 | Defaults to auto. |
| Pricing | 34 / 58 credits/s | 720p / 1080p, per output second; audio is included. |
Related Models
FLUX 3 Max Image to Video API FAQ
What is the FLUX 3 Max Image to Video API?
FLUX 3 Max Image to Video is a video model post-trained by fal in collaboration with Black Forest Labs for animating still images. It turns a start image, and optionally an end image, into a 5–20 second 720p or 1080p clip with native audio. Built on the FLUX 3 video base, it keeps the subject, composition and palette of your frames while adding the motion and sound you describe. You can call it programmatically or try it from the playground above.
How do start and end frames work in FLUX 3 Max Image to Video?
Put the URLs in image_urls in order. The first image opens the clip; a second image becomes the frame the clip ends on, and the prompt describes the movement between them.
What aspect ratio does FLUX 3 Max Image to Video output?
With aspect_ratio set to auto, the output follows the start image. You can also choose 21:9, 2:1, 16:9, 4:3, 1:1, 3:4 or 9:16 to target a specific format.
Which image files work with FLUX 3 Max Image to Video?
Use public HTTP(S) URLs to PNG, JPEG or WebP images. The playground uploads local files up to 30 MB and inserts their URLs for you.
Does FLUX 3 Max Image to Video add sound to my image?
Yes. sound defaults to true, and the model generates audio that follows the motion and the sounds named in your prompt. Set sound to false for silent output at the same price.
How much does FLUX 3 Max Image to Video cost?
It costs 34 credits ($0.17) per output second at 720p and 58 credits ($0.29) at 1080p. A 6-second 720p clip with a start and end frame is 204 credits.
When should I use FLUX 3 Max Keyframes to Video instead of Image to Video?
Image to Video fixes the first and, optionally, the last frame. Choose Keyframes to Video when you need three or more images, or images pinned to specific moments in the middle of the clip.















