Создаёт новые изображения и редактирует существующие по текстовому заданию (промпт на английском). Цена - от 5 ₽ за изображение.
Общая документация Public API · API-ключ можно создать в настройках аккаунта
Flux Kontext из линейки FLUX.1 умеет две вещи: рисовать картинку по тексту и точечно править готовое изображение. Сильная сторона - именно правки: заменить фон, переодеть человека, убрать лишний предмет, поменять надпись на вывеске, сохранив всё остальное в кадре.
Сценарии:
inputImage, картинка создаётся с нуля.inputImage и заданием, что поменять.Модель понимает задания только на английском. По умолчанию включён автоперевод, так что можно писать и по-русски.
Каждый вызов создаёт асинхронную операцию. После запуска сохраните её id и проверяйте статус отдельным запросом.
POST /api/v1/operationsAuthorization: Bearer brth_...id и стартовый статус queued.Версия модели выбирается параметром model:
flux-kontext-pro - быстрые повседневные правки и генерации, 5 ₽;flux-kontext-max - аккуратнее с деталями, сложными сценами и надписями, 8 ₽.Режим редактирования включается наличием поля inputImage.
{
"tool": "flux-kontext",
"input": {
"model": "flux-kontext-pro",
"prompt": "...",
"aspectRatio": "auto",
"outputFormat": "jpeg"
}
}
tool - slug нейросети, всегда "flux-kontext".input - параметры запуска. Все поля передаются прямо внутри этого объекта, без дополнительной вложенности.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
model | enum | Да | Версия модели. flux-kontext-pro - базовая, flux-kontext-max - максимальное качество и точнее работает с текстом в кадре. Если не передать, будет flux-kontext-pro. |
prompt | string | Да | Что нарисовать или как изменить изображение. От 3 до 3000 символов. Модель понимает только английский - при включённом enableTranslation текст на другом языке переводится автоматически. |
inputImage | string (url) | Нет | Ссылка на одно изображение для редактирования. Форматы: jpg, jpeg, png, webp, jfif, pjpeg, pjp. Только внешние http/https URL. Без этого поля картинка создаётся с нуля. |
enableTranslation | boolean | Нет | Автоперевод задания на английский. По умолчанию true. Отключайте, если пишете сразу по-английски. |
aspectRatio | enum | Да | Соотношение сторон результата. Варианты: auto, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16. При auto редактирование сохраняет пропорции исходника, а генерация без изображения даёт 16:9. Если не передать, будет auto. |
outputFormat | enum | Да | Формат файла: jpeg или png. PNG лучше для графики и мелкого текста. Если не передать, будет jpeg. |
promptUpsampling | boolean | Нет | Автоматически дописывает и уточняет задание перед запуском. Полезно для коротких расплывчатых запросов. По умолчанию false. |
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "flux-kontext",
"input": {
"model": "flux-kontext-pro",
"prompt": "Витрина маленькой пекарни утром, на полках круассаны и багеты, над дверью вывеска «Хлеб и кофе», мягкий солнечный свет",
"enableTranslation": true,
"aspectRatio": "4:3",
"outputFormat": "jpeg"
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'flux-kontext',
input: {
model: 'flux-kontext-pro',
prompt:
'Витрина маленькой пекарни утром, на полках круассаны и багеты, над дверью вывеска «Хлеб и кофе», мягкий солнечный свет',
enableTranslation: true,
aspectRatio: '4:3',
outputFormat: 'jpeg',
},
}),
})
const data = await response.json()
console.log(data.id, data.status)
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'flux-kontext',
'input': {
'model': 'flux-kontext-pro',
'prompt': 'Витрина маленькой пекарни утром, на полках круассаны и багеты, над дверью вывеска «Хлеб и кофе», мягкий солнечный свет',
'enableTranslation': True,
'aspectRatio': '4:3',
'outputFormat': 'jpeg',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Модель меняет только то, что указано в задании. При aspectRatio: "auto" результат сохраняет пропорции исходного фото.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "flux-kontext",
"input": {
"model": "flux-kontext-pro",
"prompt": "Сделай фон ночным городом с неоновыми вывесками, человека и позу не меняй",
"inputImage": "https://cdn.example.com/portrait-1.jpg",
"enableTranslation": true,
"aspectRatio": "auto",
"outputFormat": "jpeg"
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'flux-kontext',
input: {
model: 'flux-kontext-pro',
prompt: 'Сделай фон ночным городом с неоновыми вывесками, человека и позу не меняй',
inputImage: 'https://cdn.example.com/portrait-1.jpg',
enableTranslation: true,
aspectRatio: 'auto',
outputFormat: 'jpeg',
},
}),
})
const data = await response.json()
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'flux-kontext',
'input': {
'model': 'flux-kontext-pro',
'prompt': 'Сделай фон ночным городом с неоновыми вывесками, человека и позу не меняй',
'inputImage': 'https://cdn.example.com/portrait-1.jpg',
'enableTranslation': True,
'aspectRatio': 'auto',
'outputFormat': 'jpeg',
},
},
timeout=30,
)
print(response.json())
Когда задание уже на английском, автоперевод можно выключить. Версия Max аккуратнее меняет надписи.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "flux-kontext",
"input": {
"model": "flux-kontext-max",
"prompt": "Replace the text on the shop sign with \"FRESH BREAD\", keep the font style and everything else unchanged",
"inputImage": "https://cdn.example.com/shop-front.png",
"enableTranslation": false,
"aspectRatio": "auto",
"outputFormat": "png",
"promptUpsampling": false
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'flux-kontext',
input: {
model: 'flux-kontext-max',
prompt:
'Replace the text on the shop sign with "FRESH BREAD", keep the font style and everything else unchanged',
inputImage: 'https://cdn.example.com/shop-front.png',
enableTranslation: false,
aspectRatio: 'auto',
outputFormat: 'png',
promptUpsampling: false,
},
}),
})
const data = await response.json()
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'flux-kontext',
'input': {
'model': 'flux-kontext-max',
'prompt': 'Replace the text on the shop sign with "FRESH BREAD", keep the font style and everything else unchanged',
'inputImage': 'https://cdn.example.com/shop-front.png',
'enableTranslation': False,
'aspectRatio': 'auto',
'outputFormat': 'png',
'promptUpsampling': False,
},
},
timeout=30,
)
print(response.json())
{
"id": "op_uuid-123",
"status": "queued",
"tool": "flux-kontext",
"cost": 5,
"balance_after": 495,
"created_at": "2026-09-30T12:45:51.971762+00:00"
}
{
"id": "op_uuid-123",
"status": "completed",
"tool": "flux-kontext",
"cost": 5,
"created_at": "2026-09-30T12:45:51.971762+00:00",
"completed_at": "2026-09-30T12:46:21.540316+00:00",
"result": {
"type": "image",
"urls": [
"https://storage.bratuha.ru/results/flux-kontext/image-1.jpg"
]
},
"error_message": null
}
{
"id": "op_uuid-123",
"status": "failed",
"tool": "flux-kontext",
"cost": 5,
"created_at": "2026-09-30T12:45:51.971762+00:00",
"completed_at": "2026-09-30T12:46:05.180442+00:00",
"result": null,
"error_message": "Ваш запрос не прошел модерацию."
}
Сохраните id из ответа на создание и запрашивайте статус операции по нему:
GET /api/v1/operations/{id}
curl -H "Authorization: Bearer brth_ваш_ключ" \
https://bratuha.ru/api/v1/operations/op_uuid-123
async function waitForResult(id: string) {
while (true) {
const response = await fetch(`https://bratuha.ru/api/v1/operations/${id}`, {
headers: { Authorization: 'Bearer brth_ваш_ключ' },
})
const operation = await response.json()
if (operation.status === 'completed' || operation.status === 'failed') {
return operation
}
await new Promise((resolve) => setTimeout(resolve, 5000))
}
}
Статус меняется с queued на processing, а затем на completed или failed. Обычно результат готов за 20-40 секунд. Опрашивать одну операцию можно не чаще раза в секунду, разумный интервал - 3-5 секунд.
{
"type": "image",
"urls": [
"https://storage.bratuha.ru/results/flux-kontext/image-1.jpg"
]
}
type - всегда "image".urls - массив с одной ссылкой на готовое изображение в выбранном outputFormat.Результат около 1 мегапикселя. Например, портрет 768×1152 при aspectRatio: "auto" возвращается размером 816×1232.
Цена фиксирована за одно изображение и зависит только от версии модели. Генерация и редактирование стоят одинаково, автоперевод и улучшение задания бесплатны.
model | Цена |
|---|---|
flux-kontext-pro | 5 ₽ |
flux-kontext-max | 8 ₽ |
Стоимость списывается при создании операции и приходит в поле cost ответа.
POST /api/v1/operations не идемпотентен: каждый повторный запрос создаёт новую оплаченную операцию. Если ответ потерялся, не повторяйте запрос вслепую.queued, результат забирается по id.inputImage передаётся одна внешняя ссылка http/https. Ссылка должна открываться без авторизации. Несколько изображений за раз модель не принимает.enableTranslation и написать по-русски, модель может понять задание неправильно.failed и сообщением «Ваш запрос не прошел модерацию.»inputImage - результат предыдущего.