API Bratuha.ru

Что это такое

Public API Bratuha.ru позволяет запускать нейросети по HTTP без cookie-сессии и без ручной работы в интерфейсе. Интеграция строится вокруг асинхронных операций: вы отправляете запрос на запуск, получаете id операции и затем проверяете её состояние отдельным запросом.

Какие маршруты доступны

  • POST /api/v1/operations — создать новую операцию.
  • GET /api/v1/operations/{id} — проверить статус и получить результат конкретной операции.

Для кого это подходит

  • для ботов и внутренних сервисов;
  • для CRM, no-code и серверных интеграций;
  • для продуктов, которым нужно запускать конкретные нейросети по известному slug;
Старт, ключи и документация

Что понадобится перед первой интеграцией

  1. Зарегистрируйтесь в Bratuha.ru и при необходимости пополните баланс.
  2. Создайте API-ключ в кабинете.
  3. Выберите конкретную нейросеть, которую хотите запускать по API.
  4. Откройте её документацию и возьмите оттуда slug и параметры запроса.

Авторизация

  • Заголовок: Authorization: Bearer brth_...
  • Полный API-ключ показывается только один раз в момент создания.
  • Управление ключами выполняется через страницу аккаунта, а не через Public API.

Базовый URL

https://bratuha.ru/api/v1

Где смотреть документацию по конкретной нейросети

  1. Откройте страницу нужной нейросети в каталоге.
  2. Если у нейросети доступен Public API, на странице появится ссылка API документация.
  3. Перейдите по этой ссылке на страницу вида /tools/[slug]/api.
  4. Используйте slug из URL и параметры, описанные на этой странице.

Если ссылки API документация нет, значит публичная документация для этой нейросети сейчас недоступна.

Как работает API

Общая модель работы

Все операции асинхронные. POST /api/v1/operations не ждёт финальный результат и не держит соединение до конца генерации. Он только создаёт задачу, возвращает её идентификатор и стартовое состояние.

Жизненный цикл операции

  • queued — операция принята и ждёт обработки.
  • processing — операция уже выполняется.
  • completed — результат готов и доступен в result.
  • failed — выполнение завершилось ошибкой, текст ошибки приходит в error_message.

Как выглядит рабочий цикл интеграции

  1. Клиент отправляет POST /api/v1/operations.
  2. Сервер создаёт операцию и возвращает id, status, стоимость и время создания.
  3. Клиент сохраняет id у себя.
  4. Затем клиент делает периодический опрос через GET /api/v1/operations/{id}.
  5. Когда статус становится completed, результат можно забирать из поля result.
  6. Если статус 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.
Ошибки API

Формат ошибок

{
  "error": {
    "code": "validation_error",
    "message": "Некорректные данные запроса"
  }
}
error.codeЧто означает
validation_errorНекорректный body запроса, параметр или идентификатор операции.
unauthorizedAPI-ключ не передан.
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.