Коди помилок
Будь-яка помилка /api/v1 повертається в єдиному форматі — незалежно від ендпоінта та причини.
Формат помилки
{
"error": {
"code": "missing_scope",
"message": "The API key does not have the scope required by this endpoint.",
"hint": "Request the employees.read scope for this key.",
"docs_url": "https://smengo.com/api-docs/reference/errors#missing_scope",
"request_id": "8f14e45f-9e05-4f1a-8a3e-3d2b1c0f9b1b"
}
}
code— машинозчитуваний код із каталогу нижче; зручно розгалужувати логіку інтеграції за ним.message— людський опис англійською.hint— опційно: що зробити, щоб виправити (наприклад, який скоуп запросити).docs_url— пряме посилання на опис цього коду на цій сторінці.request_id— той самий uuid, що й у заголовкуX-Request-Idвідповіді. Вказуйте його, коли пишете в підтримку — за ним конкретний запит знаходиться в логах, без нього розбір триває довше.
HTTP-статус відповіді відповідає коду (див. таблицю в кінці сторінки). Розгалужувати можна і за статусом, і за error.code — але code надійніший: він однозначно визначає причину, тоді як один HTTP-статус (наприклад, 403) покриває два різні коди.
Каталог кодів
unauthorized
HTTP-статус: 401.
Заголовок Authorization відсутній, його формат зіпсований, ключ невідомий системі або був відкликаний. Усі чотири причини навмисно повертають одну й ту саму відповідь — так API не дає змоги перебором перевірити, чи існує взагалі конкретний ключ.
Як виправити: перевірте, що заголовок передається як Authorization: Bearer smg_live_..., і що ключ актуальний. Якщо ключ точно правильний — зверніться до власника організації: можливо, ключ відкликали.
missing_scope
HTTP-статус: 403.
Ключ валідний, але в нього немає скоупу, необхідного цьому ендпоінту. Який скоуп потрібен — дивіться в hint відповіді та в Скоупах та правах.
Як виправити: попросіть власника організації випустити новий ключ із потрібним скоупом або перевипустити поточний із розширеним набором.
subscription_inactive
HTTP-статус: 403.
В організації, якій належить ключ, неактивна підписка (закінчився тріал, а активної підписки немає). API вимикається разом з рештою платного функціоналу — це той самий гейт, що й в інтерфейсі Smengo.
Як виправити: подовжіть підписку в застосунку Smengo (Налаштування → Білінг). Щойно підписка знову активна, ключ починає працювати без перевипуску.
not_found
HTTP-статус: 404.
Запитаний конкретний ресурс не існує — або існує, але належить іншій організації (тенант-ізоляція навмисно не розрізняє ці два випадки, щоб не розкривати чужі ідентифікатори).
Як виправити: перевірте id у шляху запиту. Зверніть увагу: для фільтрів списків (department_id, employee_id) незнайомий id не дає 404 — там просто повертається порожній список, див. Конвенції → Фільтри.
validation_error
HTTP-статус: 400.
Параметри запиту не пройшли валідацію: невідомий чи зайвий параметр, from пізніше за to, діапазон дат більший за 366 днів, from/to на ресурсі без часового виміру тощо. Причина — в hint.
Як виправити: прочитайте hint і виправте параметри запиту згідно з Конвенціями.
invalid_cursor
HTTP-статус: 400.
Значення cursor зіпсоване або належить іншому набору даних — наприклад, курсор, отриманий з одними фільтрами, передано в запит з іншими.
Як виправити: не збирайте курсор вручну — використовуйте лише meta.next_cursor з попередньої відповіді того самого запиту. Якщо помилка повторюється на «свіжому» курсорі — почніть пагінацію заново без cursor.
rate_limited
HTTP-статус: 429.
Перевищено ліміт запитів ключа за хвилину — rate_limit_per_min (за замовчуванням 60, налаштовується індивідуально для ключа). Вікно ковзне (sliding window, у стилі Cloudflare), а не фіксоване: різкий сплеск рівно на межі хвилини не дає змоги обійти ліміт подвоєною кількістю запитів. Відповідь містить заголовок Retry-After — скільки секунд зачекати до наступної спроби, — а також, як і будь-яка відповідь API, заголовки X-RateLimit-Limit/X-RateLimit-Remaining/X-RateLimit-Reset; докладніше — в Конвенціях → Обмеження частоти.
Як виправити: знизьте частоту запитів або зачекайте вікно, вказане в Retry-After. Якщо ліміту стабільно не вистачає під ваш сценарій — зверніться в підтримку Smengo для підвищення ліміту ключа (ліміт налаштовується на рівні ключа, не організації).
internal_error
HTTP-статус: 500.
Непередбачена помилка на боці Smengo. Такі помилки логуються й розбираються командою — докладати зусиль, щоб «обійти» їх на своєму боці, не потрібно.
Як виправити: повторіть запит пізніше. Якщо помилка повторюється — напишіть у підтримку Smengo і вкажіть request_id з відповіді.
Таблиця статусів
| Код | HTTP-статус |
|---|---|
unauthorized |
401 |
missing_scope |
403 |
subscription_inactive |
403 |
not_found |
404 |
validation_error |
400 |
invalid_cursor |
400 |
rate_limited |
429 |
internal_error |
500 |
Каталог вичерпний для v1 — кодів помилок, крім перелічених, не буває.
Що далі
- Конвенції — формат відповідей, пагінація, фільтри.
- Скоупи та права — яке право потрібне для кожного скоупу.