API Bratuha.ru
Public API Bratuha.ru позволяет запускать нейросети по HTTP без cookie-сессии и без ручной работы в интерфейсе. Интеграция строится вокруг асинхронных операций: вы отправляете запрос на запуск, получаете id операции и затем проверяете её состояние отдельным запросом.
Какие маршруты доступны
POST /api/v1/operations— создать новую операцию.GET /api/v1/operations/{id}— проверить статус и получить результат конкретной операции.
Для кого это подходит
- для ботов и внутренних сервисов;
- для CRM, no-code и серверных интеграций;
- для продуктов, которым нужно запускать конкретные нейросети по известному slug;
Что понадобится перед первой интеграцией
- Зарегистрируйтесь в Bratuha.ru и при необходимости пополните баланс.
- Создайте API-ключ в кабинете.
- Выберите конкретную нейросеть, которую хотите запускать по API.
- Откройте её документацию и возьмите оттуда slug и параметры запроса.
Авторизация
- Заголовок:
Authorization: Bearer brth_... - Полный API-ключ показывается только один раз в момент создания.
- Управление ключами выполняется через страницу аккаунта, а не через Public API.
Базовый URL
https://bratuha.ru/api/v1
Где смотреть документацию по конкретной нейросети
- Откройте страницу нужной нейросети в каталоге.
- Если у нейросети доступен Public API, на странице появится ссылка
API документация. - Перейдите по этой ссылке на страницу вида
/tools/[slug]/api. - Используйте
slugиз URL и параметры, описанные на этой странице.
Если ссылки API документация нет, значит публичная документация для этой нейросети сейчас недоступна.
Общая модель работы
Все операции асинхронные. POST /api/v1/operations не ждёт финальный результат и не держит соединение до конца генерации. Он только создаёт задачу, возвращает её идентификатор и стартовое состояние.
Жизненный цикл операции
queued— операция принята и ждёт обработки.processing— операция уже выполняется.completed— результат готов и доступен вresult.failed— выполнение завершилось ошибкой, текст ошибки приходит вerror_message.
Как выглядит рабочий цикл интеграции
- Клиент отправляет
POST /api/v1/operations. - Сервер создаёт операцию и возвращает
id,status, стоимость и время создания. - Клиент сохраняет
idу себя. - Затем клиент делает периодический опрос через
GET /api/v1/operations/{id}. - Когда статус становится
completed, результат можно забирать из поляresult. - Если статус
failed, причину нужно читать изerror_message.
Ограничение частоты опроса
Одну и ту же операцию можно проверять не чаще 1 раза в секунду. При более частом опросе сервер вернет 429 с заголовком Retry-After: 1 и кодом rate_limit_exceeded. Ограничение привязано к конкретной операции: параллельный опрос разных операций не блокируется.
Что важно понимать про идентификатор операции
idоперации нужно сохранять на стороне вашего клиента или серверного сервиса сразу после создания.- Если вы хотите позже показывать пользователю статус операции, сохраните
idвместе со своими метаданными в собственной базе.
Формат тела запроса
{
"tool": "tool-slug",
"input": {
"field": "value"
}
}
Что означает каждое поле
tool— slug нейросети, который вы берёте со страницы/tools/[slug]/api.input— объект параметров для конкретной нейросети.- Набор полей внутри
inputвсегда зависит от выбранного инструмента. - Если на странице документации параметр помечен как необязательный, его можно не передавать.
Важное ограничение
POST /api/v1/operationsне идемпотентен.- Каждый успешный повторный запрос создаёт новую операцию.
- Если пользователь может случайно нажать кнопку несколько раз, защитите форму от повторного submit.
URL файлов
Если нейросеть принимает файлы, в Public API нужно передавать публичные URL, доступные извне.
Ограничения
- Только
httpиhttps. - Нельзя передавать
localhost, loopback и private IP. - URL должен соответствовать допустимым расширениям поля.
- Public API не принимает локальные пути,
blob:,data:и другие не-внешние ссылки.
Практика
- Для множественных image/file-полей передавайте массив URL.
- Для проверки статуса используйте периодический опрос с паузой 2-5 секунд и ограничением по числу попыток. Запросы чаще 1 раза в секунду к одной операции будут отклонены с кодом
429. - Для повторной попытки сначала анализируйте
error.codeиerror_message, а не повторяйте запрос вслепую. - Если файл хранится во внутреннем хранилище, сначала опубликуйте временный внешний URL, а уже потом отправляйте запрос в Bratuha.ru.
Формат ошибок
{
"error": {
"code": "validation_error",
"message": "Некорректные данные запроса"
}
}| error.code | Что означает |
|---|---|
validation_error | Некорректный body запроса, параметр или идентификатор операции. |
unauthorized | API-ключ не передан. |
invalid_api_key | Ключ передан, но не распознан или выключен. |
tool_not_found | Нейросеть публично недоступна или slug не существует. |
operation_not_found | Операция не найдена или не принадлежит владельцу ключа. |
insufficient_funds | На балансе недостаточно средств для запуска. |
rate_limit_exceeded | Слишком частый опрос одной операции (не чаще 1 раза в секунду). |
internal_error | Внутренняя ошибка сервера. |
Создание операции: cURL
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "tool-slug",
"input": {
"image_url": "https://cdn.example.com/source.jpg",
"prompt": "Сделай изображение более кинематографичным"
}
}'
Создание операции: JavaScript / TypeScript
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'tool-slug',
input: {
image_url: 'https://cdn.example.com/source.jpg',
prompt: 'Сделай изображение более кинематографичным',
},
}),
})
const data = await response.json()
if (!response.ok) {
throw new Error(data.error?.message ?? 'Не удалось создать операцию')
}
const operationId = data.id
Создание операции: Python
import requests
response = requests.post(
"https://bratuha.ru/api/v1/operations",
headers={
"Authorization": "Bearer brth_ваш_ключ",
"Content-Type": "application/json",
},
json={
"tool": "tool-slug",
"input": {
"image_url": "https://cdn.example.com/source.jpg",
"prompt": "Сделай изображение более кинематографичным",
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Пример ответа на создание
{
"id": "9f4d2f65-4b2c-4df8-bf2a-9c6e8b86b352",
"status": "queued",
"tool": "tool-slug",
"cost": 6,
"balance_after": 194,
"created_at": "2026-03-13T12:34:56.000Z"
}
Проверка статуса: cURL
curl -H "Authorization: Bearer brth_ваш_ключ" \
https://bratuha.ru/api/v1/operations/9f4d2f65-4b2c-4df8-bf2a-9c6e8b86b352
Проверка статуса: JavaScript / TypeScript
const response = await fetch(
'https://bratuha.ru/api/v1/operations/9f4d2f65-4b2c-4df8-bf2a-9c6e8b86b352',
{
headers: {
Authorization: 'Bearer brth_ваш_ключ',
},
},
)
const data = await response.json()
if (!response.ok) {
throw new Error(data.error?.message ?? 'Не удалось получить статус')
}
if (data.status === 'completed') {
console.log(data.result)
}
Пример ответа со статусом completed
{
"id": "9f4d2f65-4b2c-4df8-bf2a-9c6e8b86b352",
"status": "completed",
"tool": "tool-slug",
"cost": 6,
"created_at": "2026-03-13T12:34:56.000Z",
"completed_at": "2026-03-13T12:35:18.000Z",
"result": {
"type": "image",
"images": [
"https://cdn.bratuha.ru/results/example-image-1.jpg"
]
},
"error_message": null
}
Практические рекомендации
- Сохраняйте
idоперации сразу после ответа на create-запрос. - Делайте периодический опрос с интервалом 2-5 секунд, а не непрерывные запросы без паузы. Минимальный допустимый интервал - 1 секунда (при более частых запросах сервер вернет
429). - Ставьте верхнюю границу по времени ожидания на стороне клиента.
- Для повторных попыток разделяйте сетевые ошибки и бизнес-ошибки API.
- Не показывайте пользователю кнопку повторного запуска, пока предыдущий create-запрос ещё в полёте.
- Логируйте у себя
tool,operation id, HTTP-статус иerror.code, чтобы потом было проще разбирать инциденты.
Когда API недоступен
- Если slug указан с ошибкой, API вернёт
404 tool_not_found. - Если Public API у нейросети выключен, ответ будет таким же:
404 tool_not_found. - Если схема нейросети пока несовместима с Public API, публично это тоже выглядит как
404 tool_not_found.