curl --request POST \
--url https://api.ttapi.io/bfl/v1/flux-3-image \
--header 'Content-Type: application/json' \
--header 'TT-API-KEY: <api-key>' \
--data '
{
"prompt": "<string>",
"images": "<string>",
"aspect_ratio": "auto",
"resolution": "1k",
"safety_tolerance": 2,
"grounding": true,
"webhook_url": "<string>"
}
'import requests
url = "https://api.ttapi.io/bfl/v1/flux-3-image"
payload = {
"prompt": "<string>",
"images": "<string>",
"aspect_ratio": "auto",
"resolution": "1k",
"safety_tolerance": 2,
"grounding": True,
"webhook_url": "<string>"
}
headers = {
"TT-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'TT-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
prompt: '<string>',
images: '<string>',
aspect_ratio: 'auto',
resolution: '1k',
safety_tolerance: 2,
grounding: true,
webhook_url: '<string>'
})
};
fetch('https://api.ttapi.io/bfl/v1/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.ttapi.io/bfl/v1/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>',
'images' => '<string>',
'aspect_ratio' => 'auto',
'resolution' => '1k',
'safety_tolerance' => 2,
'grounding' => true,
'webhook_url' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"TT-API-KEY: <api-key>"
],
]);
$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.ttapi.io/bfl/v1/flux-3-image"
payload := strings.NewReader("{\n \"prompt\": \"<string>\",\n \"images\": \"<string>\",\n \"aspect_ratio\": \"auto\",\n \"resolution\": \"1k\",\n \"safety_tolerance\": 2,\n \"grounding\": true,\n \"webhook_url\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("TT-API-KEY", "<api-key>")
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.ttapi.io/bfl/v1/flux-3-image")
.header("TT-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"prompt\": \"<string>\",\n \"images\": \"<string>\",\n \"aspect_ratio\": \"auto\",\n \"resolution\": \"1k\",\n \"safety_tolerance\": 2,\n \"grounding\": true,\n \"webhook_url\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ttapi.io/bfl/v1/flux-3-image")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["TT-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"prompt\": \"<string>\",\n \"images\": \"<string>\",\n \"aspect_ratio\": \"auto\",\n \"resolution\": \"1k\",\n \"safety_tolerance\": 2,\n \"grounding\": true,\n \"webhook_url\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"status": "SUCCESS",
"message": "success",
"data": {
"jobId": "jobId"
}
}{
"status": "FAILED",
"message": "\"prompt\" cannot be empty.",
"data": {}
}{
"status": "FAILED",
"message": "Wrong TT-API-KEY or email is not activated."
}Generate an image with FLUX 3
Use the FLUX 3 Image API to generate an image from text, or edit, restyle, and combine up to 10 reference images.
curl --request POST \
--url https://api.ttapi.io/bfl/v1/flux-3-image \
--header 'Content-Type: application/json' \
--header 'TT-API-KEY: <api-key>' \
--data '
{
"prompt": "<string>",
"images": "<string>",
"aspect_ratio": "auto",
"resolution": "1k",
"safety_tolerance": 2,
"grounding": true,
"webhook_url": "<string>"
}
'import requests
url = "https://api.ttapi.io/bfl/v1/flux-3-image"
payload = {
"prompt": "<string>",
"images": "<string>",
"aspect_ratio": "auto",
"resolution": "1k",
"safety_tolerance": 2,
"grounding": True,
"webhook_url": "<string>"
}
headers = {
"TT-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'TT-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
prompt: '<string>',
images: '<string>',
aspect_ratio: 'auto',
resolution: '1k',
safety_tolerance: 2,
grounding: true,
webhook_url: '<string>'
})
};
fetch('https://api.ttapi.io/bfl/v1/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.ttapi.io/bfl/v1/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>',
'images' => '<string>',
'aspect_ratio' => 'auto',
'resolution' => '1k',
'safety_tolerance' => 2,
'grounding' => true,
'webhook_url' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"TT-API-KEY: <api-key>"
],
]);
$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.ttapi.io/bfl/v1/flux-3-image"
payload := strings.NewReader("{\n \"prompt\": \"<string>\",\n \"images\": \"<string>\",\n \"aspect_ratio\": \"auto\",\n \"resolution\": \"1k\",\n \"safety_tolerance\": 2,\n \"grounding\": true,\n \"webhook_url\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("TT-API-KEY", "<api-key>")
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.ttapi.io/bfl/v1/flux-3-image")
.header("TT-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"prompt\": \"<string>\",\n \"images\": \"<string>\",\n \"aspect_ratio\": \"auto\",\n \"resolution\": \"1k\",\n \"safety_tolerance\": 2,\n \"grounding\": true,\n \"webhook_url\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ttapi.io/bfl/v1/flux-3-image")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["TT-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"prompt\": \"<string>\",\n \"images\": \"<string>\",\n \"aspect_ratio\": \"auto\",\n \"resolution\": \"1k\",\n \"safety_tolerance\": 2,\n \"grounding\": true,\n \"webhook_url\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"status": "SUCCESS",
"message": "success",
"data": {
"jobId": "jobId"
}
}{
"status": "FAILED",
"message": "\"prompt\" cannot be empty.",
"data": {}
}{
"status": "FAILED",
"message": "Wrong TT-API-KEY or email is not activated."
}Authorizations
You can obtain your API key from the TTAPI Dashboard.
Body
Free-form prompt describing the image. Without images, it generates a new image from the prompt. With reference images, state what to change and refer to them in order as image 1 and image 2. Bounding boxes can be appended to the prompt, using a 0 to 1000 grid as [top, left, bottom, right].
Optional reference images. Omit them for text-to-image. When present, the prompt edits a detail, changes the style, or combines the references. Each item is an http(s) URL or base64, 1 to 10 total. Each image must be at least 256ร256.
Output aspect ratio. With auto, a ratio named in the prompt wins; otherwise the output keeps the first reference image's framing. Without references, the prompt decides, otherwise 1:1. Set the ratio explicitly for text-to-image.
auto, 21:9, 2:1, 16:9, 3:2, 7:5, 4:3, 5:4, 1:1, 4:5, 3:4, 5:7, 2:3, 9:16, 1:2, 9:21 Image resolution tier by similar pixel area. Exact width and height vary with the aspect ratio.
768sq, 1k, 1.5k, 2k, 4k Harm moderation tolerance from 0 to 7, with 0 the strictest. Default is 2. The route and organization determine the approved maximum and the ceiling for each category.
0 <= x <= 7When true (default), the prompt may be grounded with web search and image search. When false, both are off, generation is faster, and the model uses only the prompt.
Async callback URL. The initial response returns jobId. Use this callback or the Flux fetch API to get the final image.