curl --request POST \
--url https://api.budgetpixel.com/v1/video-upscales/flux-3-video-upscale \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"video": "<string>",
"mode": "precise",
"prompt": "<string>",
"upscale_factor": 2
}
'import requests
url = "https://api.budgetpixel.com/v1/video-upscales/flux-3-video-upscale"
payload = {
"video": "<string>",
"mode": "precise",
"prompt": "<string>",
"upscale_factor": 2
}
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({video: '<string>', mode: 'precise', prompt: '<string>', upscale_factor: 2})
};
fetch('https://api.budgetpixel.com/v1/video-upscales/flux-3-video-upscale', 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/video-upscales/flux-3-video-upscale",
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([
'video' => '<string>',
'mode' => 'precise',
'prompt' => '<string>',
'upscale_factor' => 2
]),
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/video-upscales/flux-3-video-upscale"
payload := strings.NewReader("{\n \"video\": \"<string>\",\n \"mode\": \"precise\",\n \"prompt\": \"<string>\",\n \"upscale_factor\": 2\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/video-upscales/flux-3-video-upscale")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"video\": \"<string>\",\n \"mode\": \"precise\",\n \"prompt\": \"<string>\",\n \"upscale_factor\": 2\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.budgetpixel.com/v1/video-upscales/flux-3-video-upscale")
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 \"video\": \"<string>\",\n \"mode\": \"precise\",\n \"prompt\": \"<string>\",\n \"upscale_factor\": 2\n}"
response = http.request(request)
puts response.read_body{
"credits": 123,
"id": "<string>",
"message": "<string>",
"model": "<string>",
"seconds": 123,
"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"
}
}Upscale a video with FLUX 3 Video Upscale
Black Forest Labs’ FLUX 3 super-resolution for video: 1.5x to 3x the input frame (the aspect ratio is kept; an output frame is capped at about 14 MP), at the input’s frame rate, with its audio kept. Output is H.264 MP4. precise mode keeps the source as it is (faces, products); creative mode adds fine detail. Priced per megapixel-second of OUTPUT (1 MP = 1,048,576 pixels): 95 credits precise, 135 creative, so one second of 1080p output is 188 / 267 credits and of 4K 752 / 1068. Input up to 20 seconds and 2560x1440, ≤100MB.
Asynchronous. Returns a job id (the video is not in this response). Poll GET /v1/video-upscales/{id} until status is succeeded — the video URL is in that response’s video_url.
Examples, sample output and pricing: FLUX 3 Video Upscale
curl --request POST \
--url https://api.budgetpixel.com/v1/video-upscales/flux-3-video-upscale \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"video": "<string>",
"mode": "precise",
"prompt": "<string>",
"upscale_factor": 2
}
'import requests
url = "https://api.budgetpixel.com/v1/video-upscales/flux-3-video-upscale"
payload = {
"video": "<string>",
"mode": "precise",
"prompt": "<string>",
"upscale_factor": 2
}
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({video: '<string>', mode: 'precise', prompt: '<string>', upscale_factor: 2})
};
fetch('https://api.budgetpixel.com/v1/video-upscales/flux-3-video-upscale', 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/video-upscales/flux-3-video-upscale",
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([
'video' => '<string>',
'mode' => 'precise',
'prompt' => '<string>',
'upscale_factor' => 2
]),
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/video-upscales/flux-3-video-upscale"
payload := strings.NewReader("{\n \"video\": \"<string>\",\n \"mode\": \"precise\",\n \"prompt\": \"<string>\",\n \"upscale_factor\": 2\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/video-upscales/flux-3-video-upscale")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"video\": \"<string>\",\n \"mode\": \"precise\",\n \"prompt\": \"<string>\",\n \"upscale_factor\": 2\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.budgetpixel.com/v1/video-upscales/flux-3-video-upscale")
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 \"video\": \"<string>\",\n \"mode\": \"precise\",\n \"prompt\": \"<string>\",\n \"upscale_factor\": 2\n}"
response = http.request(request)
puts response.read_body{
"credits": 123,
"id": "<string>",
"message": "<string>",
"model": "<string>",
"seconds": 123,
"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
The video to upscale (up to 20 seconds and 2560x1440, MP4/MOV/WebM, ≤100MB). A public video URL or an uploaded-file URL from POST /v1/uploads (videos are passed by URL, not inlined).
precise keeps the source as it is; creative adds fine detail (faces and products can change) and costs more.
precise, creative Optional: what the clip shows, to steer the detail creative mode adds (up to 1000 characters).
How many times larger the output frame is. 720p at 3 is 4K (3840x2160).
1.5, 2, 2.5, 3 Response
Job accepted.
Total price of this job (seconds x the model's per-second rate).
Opaque job id (mtn_...) — use it to poll status.
Billed duration — the reference video's length, rounded up.
Lifecycle state. succeeded/failed/timeout are terminal.
pending, starting, processing, completing, succeeded, failed, timeout