curl --request POST \
--url https://api.budgetpixel.com/v1/images/flux-3-image \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"prompt": "<string>",
"aspect_ratio": "auto",
"grounding": true,
"num_images": 1,
"reference_images": [
"<string>"
],
"size": "1K"
}
'import requests
url = "https://api.budgetpixel.com/v1/images/flux-3-image"
payload = {
"prompt": "<string>",
"aspect_ratio": "auto",
"grounding": True,
"num_images": 1,
"reference_images": ["<string>"],
"size": "1K"
}
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: 'auto',
grounding: true,
num_images: 1,
reference_images: ['<string>'],
size: '1K'
})
};
fetch('https://api.budgetpixel.com/v1/images/flux-3-image', 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/images/flux-3-image",
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' => 'auto',
'grounding' => true,
'num_images' => 1,
'reference_images' => [
'<string>'
],
'size' => '1K'
]),
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/images/flux-3-image"
payload := strings.NewReader("{\n \"prompt\": \"<string>\",\n \"aspect_ratio\": \"auto\",\n \"grounding\": true,\n \"num_images\": 1,\n \"reference_images\": [\n \"<string>\"\n ],\n \"size\": \"1K\"\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/images/flux-3-image")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"prompt\": \"<string>\",\n \"aspect_ratio\": \"auto\",\n \"grounding\": true,\n \"num_images\": 1,\n \"reference_images\": [\n \"<string>\"\n ],\n \"size\": \"1K\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.budgetpixel.com/v1/images/flux-3-image")
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\": \"auto\",\n \"grounding\": true,\n \"num_images\": 1,\n \"reference_images\": [\n \"<string>\"\n ],\n \"size\": \"1K\"\n}"
response = http.request(request)
puts response.read_body{
"id": "img_a1b2c3d4e5f6",
"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 image with FLUX 3
Black Forest Labs FLUX 3 — text-to-image and image editing in one model. Edit or compose from up to 10 reference images (free), render at five sizes from 768px to 4K, and optionally let the model ground the prompt with web and image search. Billing: per image by size — 768px = 55, 1K = 65, 1.5K = 90, 2K = 130, 4K = 790 credits. Use POST /v1/cost for an exact quote.
Asynchronous. Returns a job id (the image is not in this response). Poll GET /v1/images/{id} until status is succeeded — the generated image URLs are in that response’s images array (each { url, position }).
Examples, sample output and pricing: FLUX 3
curl --request POST \
--url https://api.budgetpixel.com/v1/images/flux-3-image \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"prompt": "<string>",
"aspect_ratio": "auto",
"grounding": true,
"num_images": 1,
"reference_images": [
"<string>"
],
"size": "1K"
}
'import requests
url = "https://api.budgetpixel.com/v1/images/flux-3-image"
payload = {
"prompt": "<string>",
"aspect_ratio": "auto",
"grounding": True,
"num_images": 1,
"reference_images": ["<string>"],
"size": "1K"
}
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: 'auto',
grounding: true,
num_images: 1,
reference_images: ['<string>'],
size: '1K'
})
};
fetch('https://api.budgetpixel.com/v1/images/flux-3-image', 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/images/flux-3-image",
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' => 'auto',
'grounding' => true,
'num_images' => 1,
'reference_images' => [
'<string>'
],
'size' => '1K'
]),
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/images/flux-3-image"
payload := strings.NewReader("{\n \"prompt\": \"<string>\",\n \"aspect_ratio\": \"auto\",\n \"grounding\": true,\n \"num_images\": 1,\n \"reference_images\": [\n \"<string>\"\n ],\n \"size\": \"1K\"\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/images/flux-3-image")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"prompt\": \"<string>\",\n \"aspect_ratio\": \"auto\",\n \"grounding\": true,\n \"num_images\": 1,\n \"reference_images\": [\n \"<string>\"\n ],\n \"size\": \"1K\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.budgetpixel.com/v1/images/flux-3-image")
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\": \"auto\",\n \"grounding\": true,\n \"num_images\": 1,\n \"reference_images\": [\n \"<string>\"\n ],\n \"size\": \"1K\"\n}"
response = http.request(request)
puts response.read_body{
"id": "img_a1b2c3d4e5f6",
"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 image to generate, or of the edit to apply to the reference images.
Output aspect ratio. "auto" (default) follows the first reference image when editing, or lets the model pick a ratio from the prompt for text-to-image.
auto, 1:1, 16:9, 9:16, 4:3, 3:4, 3:2, 2:3, 5:4, 4:5, 2:1, 1:2, 21:9, 9:21 Let the model research the prompt with web and image search before rendering (default true). Set false for faster, self-contained generation. Costs nothing extra.
Number of images to generate. Each image is billed at its size's price.
1 <= x <= 4Optional reference images (up to 10) for image editing and multi-reference composition. Each item is a public image URL, a data URI, raw base64, or an uploaded-file URL from POST /v1/uploads. Omit for text-to-image. Reference images cost nothing extra.
10Output size by approximate pixel count: 768px ≈ 0.6 MP, 1K ≈ 1 MP, 1.5K ≈ 2 MP, 2K ≈ 4 MP, 4K ≈ 16 MP. Sets the price: 55 / 65 / 90 / 130 / 790 credits per image. 4K is returned as a JPEG, smaller sizes as PNG.
768px, 1K, 1.5K, 2K, 4K