curl --request POST \
--url https://api.budgetpixel.com/v1/videos/flux-3-video \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"prompt": "<string>",
"aspect_ratio": "16:9",
"end_image": "<string>",
"generate_audio": true,
"image": "<string>",
"length_seconds": 5,
"resolution": "720p",
"video": "<string>"
}
'import requests
url = "https://api.budgetpixel.com/v1/videos/flux-3-video"
payload = {
"prompt": "<string>",
"aspect_ratio": "16:9",
"end_image": "<string>",
"generate_audio": True,
"image": "<string>",
"length_seconds": 5,
"resolution": "720p",
"video": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
prompt: '<string>',
aspect_ratio: '16:9',
end_image: '<string>',
generate_audio: true,
image: '<string>',
length_seconds: 5,
resolution: '720p',
video: '<string>'
})
};
fetch('https://api.budgetpixel.com/v1/videos/flux-3-video', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.budgetpixel.com/v1/videos/flux-3-video",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'prompt' => '<string>',
'aspect_ratio' => '16:9',
'end_image' => '<string>',
'generate_audio' => true,
'image' => '<string>',
'length_seconds' => 5,
'resolution' => '720p',
'video' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.budgetpixel.com/v1/videos/flux-3-video"
payload := strings.NewReader("{\n \"prompt\": \"<string>\",\n \"aspect_ratio\": \"16:9\",\n \"end_image\": \"<string>\",\n \"generate_audio\": true,\n \"image\": \"<string>\",\n \"length_seconds\": 5,\n \"resolution\": \"720p\",\n \"video\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.budgetpixel.com/v1/videos/flux-3-video")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"prompt\": \"<string>\",\n \"aspect_ratio\": \"16:9\",\n \"end_image\": \"<string>\",\n \"generate_audio\": true,\n \"image\": \"<string>\",\n \"length_seconds\": 5,\n \"resolution\": \"720p\",\n \"video\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.budgetpixel.com/v1/videos/flux-3-video")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"prompt\": \"<string>\",\n \"aspect_ratio\": \"16:9\",\n \"end_image\": \"<string>\",\n \"generate_audio\": true,\n \"image\": \"<string>\",\n \"length_seconds\": 5,\n \"resolution\": \"720p\",\n \"video\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"message": "<string>",
"model": "<string>",
"status": "pending"
}{
"error": {
"code": "model_not_available",
"message": "<string>",
"type": "invalid_request_error"
}
}{
"error": {
"code": "model_not_available",
"message": "<string>",
"type": "invalid_request_error"
}
}{
"error": {
"code": "model_not_available",
"message": "<string>",
"type": "invalid_request_error"
}
}{
"error": {
"code": "model_not_available",
"message": "<string>",
"type": "invalid_request_error"
}
}Generate video with FLUX 3 Video
Black Forest Labs FLUX 3 Video, with generated audio (sound effects, ambience, and dialogue with lip sync). Text-to-video; image-to-video from a first frame, or a first and a last frame; and video extension (supply a video to continue it from its last frames: the result is your clip followed by the new footage). 720p, 1080p, 1440p or 4K at 24 fps; 5-20 seconds (an extension adds 5-15). Billed per second of output by resolution, an extension at its own rate (the source clip is not billed): see mode_pricing in GET /v1/models or POST /v1/cost.
Asynchronous. Returns a job id (the video is not in this response). Poll GET /v1/videos/{id} until status is succeeded — the video URL is in that response’s video_url.
Examples, sample output and pricing: FLUX 3 Video
curl --request POST \
--url https://api.budgetpixel.com/v1/videos/flux-3-video \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"prompt": "<string>",
"aspect_ratio": "16:9",
"end_image": "<string>",
"generate_audio": true,
"image": "<string>",
"length_seconds": 5,
"resolution": "720p",
"video": "<string>"
}
'import requests
url = "https://api.budgetpixel.com/v1/videos/flux-3-video"
payload = {
"prompt": "<string>",
"aspect_ratio": "16:9",
"end_image": "<string>",
"generate_audio": True,
"image": "<string>",
"length_seconds": 5,
"resolution": "720p",
"video": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
prompt: '<string>',
aspect_ratio: '16:9',
end_image: '<string>',
generate_audio: true,
image: '<string>',
length_seconds: 5,
resolution: '720p',
video: '<string>'
})
};
fetch('https://api.budgetpixel.com/v1/videos/flux-3-video', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.budgetpixel.com/v1/videos/flux-3-video",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'prompt' => '<string>',
'aspect_ratio' => '16:9',
'end_image' => '<string>',
'generate_audio' => true,
'image' => '<string>',
'length_seconds' => 5,
'resolution' => '720p',
'video' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.budgetpixel.com/v1/videos/flux-3-video"
payload := strings.NewReader("{\n \"prompt\": \"<string>\",\n \"aspect_ratio\": \"16:9\",\n \"end_image\": \"<string>\",\n \"generate_audio\": true,\n \"image\": \"<string>\",\n \"length_seconds\": 5,\n \"resolution\": \"720p\",\n \"video\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.budgetpixel.com/v1/videos/flux-3-video")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"prompt\": \"<string>\",\n \"aspect_ratio\": \"16:9\",\n \"end_image\": \"<string>\",\n \"generate_audio\": true,\n \"image\": \"<string>\",\n \"length_seconds\": 5,\n \"resolution\": \"720p\",\n \"video\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.budgetpixel.com/v1/videos/flux-3-video")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"prompt\": \"<string>\",\n \"aspect_ratio\": \"16:9\",\n \"end_image\": \"<string>\",\n \"generate_audio\": true,\n \"image\": \"<string>\",\n \"length_seconds\": 5,\n \"resolution\": \"720p\",\n \"video\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"message": "<string>",
"model": "<string>",
"status": "pending"
}{
"error": {
"code": "model_not_available",
"message": "<string>",
"type": "invalid_request_error"
}
}{
"error": {
"code": "model_not_available",
"message": "<string>",
"type": "invalid_request_error"
}
}{
"error": {
"code": "model_not_available",
"message": "<string>",
"type": "invalid_request_error"
}
}{
"error": {
"code": "model_not_available",
"message": "<string>",
"type": "invalid_request_error"
}
}Authorizations
API key as a bearer token: Authorization: Bearer bpx_live_xxx
Body
Text description of the video, including the sound you want (a line in quotes is spoken). When extending, describe what happens next, not the source.
Aspect ratio for text-to-video. With image or video the picture sets the shape and this is ignored.
16:9, 9:16, 1:1, 4:3, 3:4, 21:9, 2:1, 9:21 Optional last frame, used together with image: the video moves from the first frame to this one. Same input forms as image.
Generate sound with the video (default true; no price impact). false makes a silent clip.
Optional first frame for image-to-video; the video starts from it and follows its shape. Provide a public image URL, a data URI, raw base64, or an uploaded-file URL from POST /v1/uploads. Can't be combined with video.
Video length in seconds, any whole number from 5 to 20. When extending, the seconds of NEW footage, 5 to 15.
5 <= x <= 20Output resolution: 720p (1280x704 at 16:9), 1080p (1920x1088), 1440p (2560x1440) or 4k (3840x2176). Sets the price per second, see mode_pricing in GET /v1/models.
720p, 1080p, 1440p, 4k Optional video to EXTEND (MP4 or MOV, 1 second to 2 minutes, up to 100MB). The model continues it from its last frames for length_seconds of new footage guided by prompt, and the result is the source followed by the continuation, at the chosen resolution. Provide a public video URL or an uploaded-file URL from POST /v1/uploads. Can't be combined with image/end_image. Only the new seconds are billed, at the extend rate.