Перейти к содержимому

Справочник API

Ошибки

Единый формат ошибок Clipia API — поля type, code и message, таблица HTTP-статусов и кодов, какие ошибки повторять и как читать уточнение в message.

Все ошибки REST API приходят в одном формате: объект error с полями type, code и message. HTTP-статус задаёт класс ошибки, code — машиночитаемую причину. Повторять с паузой имеет смысл только временные ошибки: 409 request_in_progress, 429, 500 и 503.

{
  "error": {
    "type": "billing_error",
    "code": "insufficient_credits",
    "message": "Недостаточно кредитов. Пополните баланс, чтобы продолжить."
  }
}

Ветвите логику по code. Поле message предназначено для человека и может меняться. Для 400 invalid_request в message лежит уточнение — короткий идентификатор вроде prompt_required или webhook_url_invalid; полный список для отправки генерации — на странице «Постановка генерации». Большинство сообщений приходит на английском, но часть отказов проверки входа (например, слишком короткий промпт или несовместимые референсы) приходит на русском независимо от заголовка. У ошибок 402 и отказов по настройкам музыки заголовок Accept-Language: ru переключает текст на русский.

Иногда в error есть поля retry_after_ms или retry_after_seconds — подсказка, через сколько повторить.

Тот же формат у ответов, до обработчика маршрута не дошедших: 400 invalid_request на тело, которое не разбирается как JSON, 415 unsupported_media_type на тип тела, который сервер не разбирает (например, application/xml), 413 request_too_large на тело больше 10 МБ и 404 not_found на неизвестный путь под /v1/ (включая preflight OPTIONS с неразрешённого origin). Внутренние пути сервера в этих ответах не раскрываются.

Коды

HTTPcodetypeКогдаПовторять
400invalid_requestinvalid_request_errorневерное тело, параметры или идентификатор; причина в messageнет, исправьте запрос
401invalid_api_keyauthentication_errorключа нет, он неверный, отозван или истёкнет
402insufficient_creditsbilling_errorне хватает кредитовпосле пополнения
402subscription_requiredbilling_errorнужна активная подписка: условие публичного API на боевом ключе или кредиты заморожены до продления тарифапосле оформления тарифа
402insufficient_quotabilling_errorзапрос не укладывается в бюджет ключа, см. «Управление ключами»когда бюджет освободится
403insufficient_scopepermission_errorу ключа нет нужного праванет
404not_foundinvalid_request_errorнет такой модели (model_not_found) или запроса (request_not_found)нет
409idempotency_key_reuseidempotency_errorтот же Idempotency-Key с другим теломнет, смените ключ
409request_in_progressidempotency_errorповтор, пока первый запрос ещё обрабатываетсяда, через несколько секунд
422model_input_invalidinvalid_request_errorпараметры не подходят моделинет, исправьте input
429rate_limit_exceededrate_limit_errorпревышен лимит запросовда, после Retry-After
429concurrency_limit_exceededrate_limit_errorпревышен лимит одновременных генераций, если он задан; retry_after_seconds: 5 и Retry-After: 5да, когда завершится одна из задач
500internal_errorapi_errorвнутренняя ошибкада, с растущей паузой
503service_unavailableapi_errorсервис временно недоступенда, с растущей паузой

Ошибки AI Gateway (/v1/chat/completions и соседние) приходят в формате OpenAI, их коды описаны на странице «Chat Completions».

Боевой ключ требует активной подписки

Генерация по ключу clipia_live_ доступна, только пока у аккаунта активна подписка на clipia.ai; тестовый ключ clipia_test_ работает без оплаты. Без подписки отправка возвращает 402 subscription_required: покупка пакета кредитов без подписки доступ не открывает, нужен тариф. Проверить состояние заранее: GET /v1/account показывает баланс, а 402 на оценке стоимости не возникает — она считает цену без проверки оплаты.

Два ответа вне общего формата

Ответ на тело, которое не разбирается как JSON (400), и на несуществующий маршрут (404) приходит не в конверте error, а в виде { "statusCode", "timestamp", "path", "message" }. Проверяйте HTTP-статус, прежде чем читать error.code.

Повторы

Что повторять

429, 500 и 503 повторяйте с растущей паузой: 1, 2, 4, 8 секунд, не больше 5 попыток. Для 429 ждите столько, сколько указано в Retry-After. Отправку генерации повторяйте с тем же Idempotency-Key — так повтор не создаст вторую задачу. Ошибки 4xx, кроме 409 request_in_progress и 429, при повторе без изменений вернутся снова.

Без внутренних деталей

Сообщения ошибок не раскрывают внутреннюю инфраструктуру. Для ошибок 500 и 503 текст общий: «An internal error occurred. Please retry or contact support.» и «Service temporarily unavailable. Please retry later.».

Ошибка самой генерации — не HTTP-ошибка: запрос результата вернёт 200 со status: "FAILED" и объектом error с кодом из отдельного словаря (generation_failed, content_moderated, model_unavailable и другие), а кредиты вернутся на баланс. См. «Результат».

На этой странице