Коди помилок
HTTP-коди статусу та формат відповідей з помилками для API Qamera AI.
API Qamera AI використовує стандартні HTTP-коди статусу для позначення результату кожного запиту. Успішні запити повертають 200. Відповіді з помилками містять JSON-тіло з полем error, що описує проблему.
Формат відповіді
Усі відповіді з помилками мають таку структуру:
{
"error": "A human-readable description of the problem."
}
Коди статусу
200 OK
Запит оброблено успішно. Тіло відповіді містить запитані дані або підтвердження виконаної дії.
400 Bad Request
У тілі запиту відсутні обов'язкові поля, містяться недійсні значення або воно має неправильний формат.
{
"error": "Validation failed: 'productId' is required."
}
Поширені причини:
- Відсутні обов'язкові поля в тілі POST-запиту.
- Недійсні типи полів (наприклад, рядок замість очікуваного числа).
- Неправильний формат JSON.
401 Unauthorized
API key відсутній, недійсний, прострочений або відкликаний.
{
"error": "Invalid API key."
}
Поширені причини:
- Не надано заголовок
X-Api-KeyабоAuthorization. - Ключ було відкликано або минув термін його дії.
- Друкарська помилка у значенні ключа.
402 Payment Required
На акаунті, пов'язаному з API key, недостатньо кредитів для виконання запитаної операції.
{
"error": "Insufficient credits. Required: 5, available: 2."
}
Що робити:
- Придбайте додаткові кредити або кредитний пакет у налаштуваннях білінгу вашого робочого простору.
- Перевірте поточний баланс перед надсиланням запитів на генерацію.
403 Forbidden
API key не має необхідного scope для цього ендпоінта.
{
"error": "Missing required scope: 'content.register'."
}
Поширені причини:
- Ключ було видано без scope, необхідного для запитаної дії.
- Спроба виконати POST-операцію ключем, який має лише scope
content.read.
404 Not Found
Запитаний ресурс не існує, або ваш акаунт не має до нього доступу.
{
"error": "Product not found."
}
Поширені причини:
- Некоректний ID ресурсу в URL.
- Ресурс належить іншому акаунту.
- Ресурс було видалено.
429 Too Many Requests
API key перевищив ліміт запитів — 60 запитів на хвилину.
{
"error": "Too many requests. Please retry after a short delay."
}
Що робити:
- Зачекайте перед повторною спробою. Використовуйте експоненціальне відступання з jitter.
- Дивіться сторінку Обмеження запитів для детальних стратегій повторних спроб.
500 Internal Server Error
На сервері сталася непередбачена помилка.
{
"error": "An internal error occurred. Please try again later."
}
Що робити:
- Повторіть запит після невеликої затримки.
- Якщо помилка повторюється, зверніться до служби підтримки, вказавши деталі запиту та приблизний час.
502 Bad Gateway
Зовнішній сервіс, від якого залежить API, повернув неочікувану відповідь.
{
"error": "External service returned an unexpected response."
}
Поширені причини:
- Нижчестоящий сервіс ШІ-генерації тимчасово недоступний.
- Мережеві проблеми між Qamera AI та постачальниками сервісів.
Що робити:
- Повторіть спробу через кілька секунд. Ці помилки зазвичай тимчасові.
503 Service Unavailable
Немає активного генератора контенту для обробки запиту.
{
"error": "No active generator available. Please try again later."
}
Поширені причини:
- Усі робочі процеси генерації офлайн або на обслуговуванні.
- Тимчасові проблеми з потужністю під час пікового навантаження.
Що робити:
- Повторіть спробу через 30–60 секунд.
- Перевірте сторінку статусу Qamera AI щодо поточних інцидентів.
Зведена таблиця
| Код | Значення | Можна повторити |
|---|---|---|
| 200 | Успіх | — |
| 400 | Некоректний ввід | Ні (виправте запит) |
| 401 | Недійсний ключ | Ні (перевірте ключ) |
| 402 | Недостатньо кредитів | Ні (поповніть кредити) |
| 403 | Відсутній scope | Ні (перевірте дозволи ключа) |
| 404 | Не знайдено | Ні (перевірте ID ресурсу) |
| 429 | Перевищено ліміт | Так (з відступанням) |
| 500 | Помилка сервера | Так (із затримкою) |
| 502 | Помилка зовнішнього сервісу | Так (із затримкою) |
| 503 | Немає активного генератора | Так (через 30–60 с) |
Категорії невдач завдань
Коди вище описують, чи вдався ваш запит. Завдання генерації — це інше: його надсилання завершується одразу кодом 200, а сама робота відбувається пізніше. Завдання, яке зазнає невдачі згодом, повідомляється всередині успішної відповіді, а не як помилка HTTP.
Коли ви опитуєте GET /api/external/orders/:id, кожне завдання несе два поля, що описують невдачу:
errorCategory— фіксоване значення з таблиці нижче. Будуйте логіку на ньому.errorHint— одне речення з поясненням категорії та що робити. Показуйте його людині, не парсіть.
Обидва дорівнюють null для успішних завдань і для невдач, записаних до появи цієї класифікації.
errorCategory | Що сталося | Що робити |
|---|---|---|
TRANSIENT_INFRA | Тимчасова проблема інфраструктури. | Нічого — завдання буде повторено автоматично. |
RATE_LIMIT | Постачальник генерації обмежив кількість наших запитів. | Нічого — завдання буде повторено автоматично. |
PROVIDER_CAPACITY | У постачальника генерації не було вільних потужностей. | Нічого — завдання буде повторено автоматично. |
CONTENT_POLICY | Правила вмісту постачальника відхилили запит. | Повтор із тими самими даними завершиться так само. Змініть промпт або вихідне зображення та створіть нове замовлення. |
INPUT_MISSING | Не вдалося знайти потрібні вхідні дані — найчастіше вихідне зображення, вказане в замовленні. | Перевірте надіслані посилання та створіть нове замовлення. |
INPUT_NOT_READY | Вхідні дані, потрібні завданню, ще готуються на нашому боці — найчастіше вихідне фото в процесі апскейлу. | Нічого, поки завдання чекає — воно запуститься саме, щойно дані будуть готові. Якщо завдання завершиться як failed, підготовка не встигла: створіть замовлення ще раз, щойно вихідне зображення стане доступним. |
PROVIDER_ACCOUNT | Проблема з нашим акаунтом у постачальника заблокувала генерацію. | Нічого з вашого боку. Зверніться до підтримки, вказавши orderId. |
INTERNAL_BUG | Дефект з нашого боку. | Нічого з вашого боку. Зверніться до підтримки, вказавши orderId. |
TRANSIENT_INFRA, RATE_LIMIT, PROVIDER_CAPACITY та INPUT_NOT_READY повторюються автоматично, тож завдання з такою категорією може все одно завершитися успішно — сприймайте їх як інформацію про хід роботи, а не як остаточний результат. Дійте лише тоді, коли замовлення перестане змінюватися, а status завдання дорівнює failed. Категорія залишається в рядку й після цього, тож читайте її разом зі status: те саме INPUT_NOT_READY означає очікування при retry_pending і відмову після очікування при failed. errorHint каже, який це випадок.
Необроблені повідомлення від постачальників навмисно не розкриваються. Вони містять назви постачальників і деталі внутрішніх систем, які змінюються без попередження — інтеграції, що їх парсили, ламалися за кожної зміни постачальника. Стабільним контрактом є категорія.