API Bratuha.ru
Что это такое
Маршруты API и для каких задач он подходит.
Public API Bratuha.ru позволяет запускать нейросети по HTTP без cookie-сессии и без ручной работы в интерфейсе. Интеграция строится вокруг асинхронных операций: вы отправляете запрос на запуск, получаете id операции и затем проверяете её состояние отдельным запросом. Для ИИ-агентов доступны поиск нейросетей, машиночитаемые схемы, оценка цены, временная загрузка файлов и MCP.
Какие маршруты доступны
POST /api/v1/operations— создать новую операцию.GET /api/v1/operations/{id}— проверить статус и получить результат конкретной операции.GET /api/v1/tools— найти нейросеть с открытым API.GET /api/v1/tools/{slug}/schema— получить JSON Schema параметров.POST /api/v1/operations/estimate— узнать точную цену до списания.POST /api/v1/uploadsи/uploads/presign— загрузить временный входной файл.
Нужна настройка Claude Code, Codex, Cursor или MCP? Откройте Братуха для ИИ-агентов.
Для кого это подходит
- для ботов и внутренних сервисов;
- для CRM, no-code и серверных интеграций;
- для продуктов, которым нужно запускать конкретные нейросети по известному slug;
Старт и ключи
Ключ, авторизация, базовый адрес и документация нейросетей.
Что понадобится перед первой интеграцией
- Зарегистрируйтесь в Bratuha.ru и при необходимости пополните баланс.
- Создайте API-ключ в кабинете.
- Найдите нейросеть через
GET /api/v1/tools. - Прочитайте её JSON Schema через
GET /api/v1/tools/{slug}/schema.
Авторизация
- Заголовок:
Authorization: Bearer brth_... - Полный API-ключ показывается только один раз в момент создания.
- Управление ключами выполняется через страницу аккаунта, а не через Public API.
Базовый URL
https://bratuha.ru/api/v1
Где смотреть документацию по конкретной нейросети
- Запросите
GET /api/v1/tools: он возвращает только доступные вашему ключу нейросети. - Прочитайте
GET /api/v1/tools/{slug}/schemaперед составлением запроса. - HTML-описание остаётся на странице вида
/tools/[slug]/api; markdown — на/tools/[slug]/api.md.
Закрытая или несовместимая нейросеть не попадает в агентский каталог и отвечает как несуществующая.
Как работает 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всегда зависит от выбранного инструмента. - Если на странице документации параметр помечен как необязательный, его можно не передавать.
Повторы и предел цены
- Без заголовка
Idempotency-Keyкаждый успешный повторный запрос создаёт новую операцию. Если пользователь может нажать кнопку несколько раз, защитите форму от повторного submit или передавайте ключ. - С заголовком
Idempotency-Key(строка от 1 до 255 символов, обычно UUID) повтор с тем же телом в течение 24 часов возвращает ту же операцию с заголовкомIdempotent-Replayed: trueи без второго списания. Тот же ключ с другим телом — 409idempotency_conflict. - Необязательное поле
max_priceв теле — предел цены в рублях: если точная стоимость выше, сервер ответит 400 и ничего не создаст.
Что делать при ошибке 503
- Ответ
503с кодомservice_unavailableозначает временную нагрузку на базу: операция не создана и средства не списаны. - Такой запрос нужно повторить через время из заголовка
Retry-After. - Остальные коды повторять автоматически не нужно:
4xxтребуют исправить запрос, а500стоит сообщить в поддержку. 500на создании операции повторять особенно не стоит: в редком случае обрыва связи операция могла успеть создаться, и повтор оплатит её второй раз. Сверьтесь со списком операций или напишите в поддержку сrequest_id.- В каждом ответе есть
X-Request-Id, а в теле ошибки —error.request_id. Сохраняйте его и присылайте в поддержку: по нему мы находим конкретный запрос в логах. - Запросы можно отправлять параллельно: всплеск из 25 одновременных запросов по одному ключу проходит за 0.7 секунды в худшем случае. Специально ограничивать параллельность не нужно — достаточно соблюдать
Retry-After, если всё же пришёл503.
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.
Ошибки API
Формат ответа с ошибкой и все коды.
Формат ошибок
{
"error": {
"code": "validation_error",
"message": "Некорректные данные запроса"
}
}- error.code
validation_errorЧто означаетНекорректный body запроса, параметр или идентификатор операции. - error.code
unauthorizedЧто означаетAPI-ключ не передан. - error.code
invalid_api_keyЧто означаетКлюч передан, но не распознан или выключен. - error.code
tool_not_foundЧто означаетНейросеть публично недоступна или slug не существует. - error.code
operation_not_foundЧто означаетОперация не найдена или не принадлежит владельцу ключа. - error.code
insufficient_fundsЧто означаетНа балансе недостаточно средств для запуска. - error.code
key_spend_limit_exceededЧто означаетИсчерпан дневной или месячный лимит трат ключа (код 402). Деньги не списаны. Лимит меняется в личном кабинете, раздел API. - error.code
idempotency_conflictЧто означаетIdempotency-Key уже использован с другим запросом (код 409). Для нового запуска нужен новый ключ. - error.code
rate_limit_exceededЧто означаетСлишком частый опрос одной операции или слишком много запусков с одного ключа. Повторите после Retry-After. - error.code
service_unavailableЧто означаетВременная ошибка базы данных при высокой параллельности. Приходит с кодом 503 и заголовком Retry-After. Операция не создана и деньги не списаны, запрос можно повторить. - error.code
internal_errorЧто означаетВнутренняя ошибка сервера.
| error.code | Что означает |
|---|---|
validation_error | Некорректный body запроса, параметр или идентификатор операции. |
unauthorized | API-ключ не передан. |
invalid_api_key | Ключ передан, но не распознан или выключен. |
tool_not_found | Нейросеть публично недоступна или slug не существует. |
operation_not_found | Операция не найдена или не принадлежит владельцу ключа. |
insufficient_funds | На балансе недостаточно средств для запуска. |
key_spend_limit_exceeded | Исчерпан дневной или месячный лимит трат ключа (код 402). Деньги не списаны. Лимит меняется в личном кабинете, раздел API. |
idempotency_conflict | Idempotency-Key уже использован с другим запросом (код 409). Для нового запуска нужен новый ключ. |
rate_limit_exceeded | Слишком частый опрос одной операции или слишком много запусков с одного ключа. Повторите после Retry-After. |
service_unavailable | Временная ошибка базы данных при высокой параллельности. Приходит с кодом 503 и заголовком Retry-After. Операция не создана и деньги не списаны, запрос можно повторить. |
internal_error | Внутренняя ошибка сервера. |
Примеры запросов
cURL, JavaScript и Python: запуск и проверка статуса.
Создание операции: 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
}
Практика интеграции
Как не потерять операцию и что делать, когда API недоступен.
Практические рекомендации
- Сохраняйте
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.