14Справочник
Коды ошибок
Каждая ошибка API приходит в одном формате. Стройте логику по HTTP-статусу, коду и полям details, а текст message показывайте человеку.
Формат ошибки
Ошибка — это JSON с объектом error из трёх полей:
- code
- Стабильный код вида
ERR_…. По нему выбирайте, что делать. - message
- Текст для показа человеку. Он на английском, формулировка может меняться: не разбирайте её программой.
- details
- Подробности: что именно не так и что исправить. Поле может быть пустым.
HTTP/1.1 400 Bad Request { "error": { "code": "ERR_INVALID_REQUEST", "message": "The reference image is no longer available. Upload the file again.", "details": { "reason": "reference_unavailable", "input_index": 0, "retryable": false } } }
Тело, которое не является корректным JSON, и multipart-загрузка без обязательного поля отклоняются с 422 и телом вида {"detail": […]}. Деньги не списываются. Не путайте их с ERR_INPUT_FETCH_FAILED: он тоже приходит с 422, но в обычном формате.
Справочник кодов
Строки можно отфильтровать по статусу и найти по слову. Ответы 429 и 503 содержат заголовок Retry-After в секундах.
| Код | HTTP | Что значит и что делать |
|---|---|---|
ERR_INVALID_REQUEST | 400 | Запрос нельзя выполнить в таком виде. Прочитайте error.message и error.details, исправьте запрос и отправьте заново. Деньги не списаны. |
ERR_CONTENT_POLICY | 400 | Зарезервированный код. Отказ по правилам безопасности определяется после приёма запроса и приходит как задание со статусом failed и failure.code: content_policy. |
ERR_API_KEY_INVALID | 401 | Ключа нет или он не распознан: details.reason — api_key_missing или api_key_invalid. Проверьте ключ, Ключи и вход. |
ERR_INSUFFICIENT_BALANCE | 402 | Не хватает денег на балансе или исчерпан месячный лимит ключа или аккаунта. Баланс. |
ERR_ACCOUNT_DISABLED | 403 | Ключ верный, но аккаунт отключён. Напишите в поддержку. |
ERR_API_SUSPENDED | 403 | Доступ аккаунта к API приостановлен. Остановите отправку и напишите в поддержку; кабинет остаётся доступен. |
ERR_MODEL_NOT_FOUND | 404 | Такой модели нет у вашего аккаунта. Список — в GET /models. |
ERR_NOT_FOUND | 404 | Задание не найдено или принадлежит другому аккаунту. Проверьте id. |
ERR_RATE_LIMIT | 429 | Слишком частые запросы, опрос задания чаще раза в 5 секунд, дневной лимит загрузок у нового аккаунта или блокировка после ошибок доступа. Подождите Retry-After секунд, Лимиты. |
ERR_QUOTA_EXCEEDED | 429 | Слишком много заданий в работе либо тот же ключ повтора отправили одновременно. Выждите и повторите с теми же идентификаторами. |
ERR_INPUT_FETCH_FAILED | 422 | Образец не удалось скачать или проверить до генерации и списания. Повторяйте только при details.retryable = true, иначе замените образец. |
ERR_GENERATION_FAILED | 500 | Генерацию не удалось запустить или завершить. Списанная сумма возвращается сама. details.reason = pricing_unavailable — не удалось определить цену до списания: повторите позже. |
ERR_PROVIDER_UNAVAILABLE | 503 | Временная недоступность. Подождите Retry-After, посмотрите details.reason и ограничьте число повторов. |
ERR_INTERNAL | 500, 503 | Внутренняя ошибка, 500 или 503. 500 не говорит, принят ли запрос: перед повтором проверьте задание по тому же ключу повтора. Списание за запрос, который ничего не создал, возвращается само. 503 приходит с Retry-After. |
Ошибки доступа
Эти ответы общие для всех методов с ключом. Не повторяйте запрос с тем же ключом: повторные 401 и 403 с одного IP-адреса приводят к блокировке на время (подробнее — Лимиты). Как хранить и менять ключи — Ключи и вход.
| Что случилось | Ответ | Что делать |
|---|---|---|
| Ключа нет в запросе | 401 ERR_API_KEY_INVALID details.reason = api_key_missing; message: «no API key on the request» | Передайте ключ в заголовке Authorization или X-API-Key |
| Ключ не распознан | 401 ERR_API_KEY_INVALID details.reason = api_key_invalid; message: «API key not recognized» | Проверьте, что ключ скопирован целиком и не отозван в кабинете |
| Аккаунт отключён | 403 ERR_ACCOUNT_DISABLED details.reason = account_disabled; message: «this account is disabled» | Остановите отправку и напишите в поддержку |
| Доступ к API приостановлен | 403 ERR_API_SUSPENDED details.reason = api_suspended; message: «API access is paused for this account by its account manager» | Остановите отправку и напишите в поддержку; кабинет остаётся доступен |
Ошибки запроса
Эти отказы приходят до списания. Генерация не начинается, деньги не тратятся.
| Что случилось | Ответ | Что делать |
|---|---|---|
| Образец недоступен | 400 ERR_INVALID_REQUEST details.reason = reference_unavailable, details.input_index — позиция образца с нуля | Загрузите файл заново и замените file_id. Повтор с тем же файлом не поможет |
| Образец нельзя скачать | 422 ERR_INPUT_FETCH_FAILED details.reason = input_fetch_failed, details.retryable | При retryable: true повторите позже, иначе замените образец |
| Формат образца не подходит | 400 ERR_INVALID_REQUEST «Unsupported image format. Supported formats: PNG, JPEG, WebP.» | Пересохраните в PNG, JPEG или WebP, Картинки-образцы |
| Пустой промпт | 400 ERR_INVALID_REQUEST details.fields: ["prompt"] | Передайте описание картинки, даже если есть образцы |
| Маска в запросе | 400 ERR_INVALID_REQUEST в details.fields — mask или mask_file_id | Маски не поддерживаются. Передайте исходную картинку как образец и опишите правку в промпте |
| Невозможное разрешение или формат | 400 ERR_INVALID_REQUEST details.supported — список допустимых | Выберите из списка, Модели и параметры |
| Нет такой комбинации для аккаунта | 400 ERR_INVALID_REQUEST details.reason = provider_policy_no_route | Измените разрешение или формат кадра либо напишите в поддержку |
Временные отказы
503 значит, что запрос сейчас принять нельзя. Смотрите details.reason:
details.reason | Что значит | Деньги |
|---|---|---|
overloaded | Сервис перегружен, запрос отклонён. Повторите позже | Не списаны |
no_provider_enabled | Запрошенная конфигурация сейчас недоступна аккаунту. Подождите и напишите в поддержку, если отказ повторяется | Не списаны |
provider_unavailable | Не удалось запустить генерацию | Если списывали, сумма вернётся сама |
Иногда приходит 503 ERR_INTERNAL с пустым details: зависимый сервис временно недоступен. 5xx сам по себе не говорит, принят ли запрос: сверяйтесь с заданием по ключу повтора.
Ожидание и повторы
- Ответы
429и503содержатRetry-Afterв секундах. Ждите не меньше, а при опросе заданий — не меньше большего изRetry-Afterиdetails.min_interval_seconds. - Повторяйте ограниченное число раз и добавляйте небольшую случайную задержку, чтобы процессы не стучались одновременно.
400,401,402,403,404не повторяйте без изменений: сначала исправьте причину.- Если ответ потерялся, на запрос пришёл
500или истёк тайм-аут, не создавайте новое задание: повторите тот же запрос с тем же ключом повтора (Повтор без двойного списания).
Генерация оплачивается заранее, а при неудаче деньги возвращаются сами. Ошибка не подтверждает возврат: сумму видно на балансе и в журнале операций кабинета.
Ошибки после приёма задания
Если запрос принят (202), а картинка не получилась, это не HTTP-ошибка. GET /creations/ отвечает 200 со статусом failed и строкой error. Сумма возвращается на баланс сама.
"The image or prompt was rejected by the safety filter. Try a different image or rephrase the prompt." "The source image was rejected. Try a different photo." "Generation failed. Please try again." "Nothing was rendered for this request. Describe the image you want in the prompt, or attach the source photo it refers to." "Generation timed out." "The reference image is no longer available. Upload the file again." "Could not download the reference image. Please try again later." "The service is temporarily unavailable. Please try again later." "Generation failed."
- Отказ по правилам безопасности: измените промпт или возьмите другую картинку.
- «Nothing was rendered…»: опишите нужную картинку в промпте или приложите образец, на который он ссылается.
- «The reference image is no longer available…»: загрузите файл заново и замените
file_id. - Таймаут, временная недоступность, общий сбой: повторите ограниченное число раз. Если сбои повторяются, пришлите в поддержку
idзадания.
Чтобы намеренно создать новую картинку после failed, возьмите новый ключ повтора: прежний ключ задание не перезапустит, а повтор с ним вернёт сохранённый ответ 202 с тем же id. Новая попытка оплачивается как обычно и возвращается при неудаче.
Причина сбоя для программ
С 24 сентября 2026 года неудачное задание содержит ещё и объект failure: в GET /creations/ и в вебхуке creation.failed. Он есть только при status: "failed", поэтому при разборе считайте его необязательным.
{
"id": "5b0214ae-9e39-460a-820a-f6ae3e24400b",
"status": "failed",
"error": "The image or prompt was rejected by the safety filter. Try a different image or rephrase the prompt.",
"failure": {
"type": "declined",
"code": "content_policy",
"retryable": false
}
}- declined
- Причина в самом запросе: в промпте, образце или входных данных. Тот же запрос даст тот же результат: измените его.
- error
- Причина на стороне сервиса. Тот же запрос можно отправить снова, если
retryableне равенfalse.
| Код | Что значит и что делать | Повтор |
|---|---|---|
content_policy | Правила безопасности отклонили промпт или образец. Измените промпт или возьмите другую картинку | нет |
source_image_rejected | Образец отклонён. Возьмите другое фото | нет |
no_image_output | Модель ответила текстом вместо картинки, например описала её словами или промпт ссылается на не приложенную картинку. Опишите нужное изображение или приложите фото | нет |
reference_unavailable | Образец больше недоступен. Загрузите его заново и замените file_id | нет |
invalid_request | Запрос нельзя выполнить в таком виде, например модель не рисует выбранный формат. Исправьте запрос | нет |
| Код | Что значит и что делать | Повтор |
|---|---|---|
timeout | Время генерации истекло. Повторите | да |
unavailable | Сервис был временно недоступен. Повторите позже | да |
reference_fetch_failed | Не удалось скачать образец. Повторите позже | да |
internal | Другой сбой на стороне сервиса. Повторите позже | да |
Стройте логику по failure.type и failure.code, а не по тексту error: он для показа, и формулировка может меняться. Список кодов пока закрыт, но новые могут появиться: незнакомый код обрабатывайте по его failure.type.
Неудачный запрос бесплатен: сумма сразу возвращается на баланс.
Это относится к обоим типам: и declined, и error.
Частые вопросы
Какую ошибку считать окончательной, а какую повторять?
429, 503 и 500 (последний — осторожно, с тем же ключом повтора), а также задания с failure.retryable, не равным false. 4xx, кроме 429, сначала исправьте.Вернутся ли деньги, если пришла ошибка?
Почему текст ошибки на английском?
message и строка error одинаковы для всех клиентов и могут меняться. Для логики используйте код, статус и failure, а человеку показывайте свой текст.Что делать, если ошибка повторяется?
id задания или время запроса. Ключ API и промпт присылать не нужно.