Формат ошибки
json
{
"error": {
"type": "authentication_error",
"code": "invalid_api_key",
"message": "Invalid or inactive API key",
"request_id": "req_abc123"
}
}Таблица ошибок
| HTTP | Type | Code | Описание | Решение |
|---|---|---|---|---|
| 400 | validation_error | idempotency_key_required | Не передан Idempotency-Key | Добавьте заголовок |
| 400 | validation_error | invalid_parameter | Невалидный параметр | Проверьте формат данных |
| 401 | authentication_error | invalid_api_key | Неверный API ключ | Проверьте ключ в дашборде |
| 401 | authentication_error | invalid_credentials | Неверный email/пароль | Проверьте данные |
| 401 | authentication_error | token_expired | JWT токен истёк | Обновите через /auth/refresh |
| 401 | authentication_error | token_revoked | Токен отозван | Получите новый через login |
| 401 | authentication_error | invalid_refresh_token | Невалидный refresh token | Повторите вход |
| 403 | authentication_error | insufficient_permissions | Нет доступа | Используйте admin токен |
| 404 | api_error | client_not_found | Клиент не найден | Проверьте ID |
| 404 | api_error | webhook_not_found | Webhook не найден | Проверьте ID |
| 409 | validation_error | email_taken | Email уже зарегистрирован | Используйте другой email |
| 409 | api_error | idempotency_conflict | Запрос уже обрабатывается | Подождите завершения |
| 429 | rate_limit_error | rate_limit_exceeded | Превышен лимит запросов | Подождите до X-RateLimit-Reset |
| 500 | api_error | internal_error | Внутренняя ошибка | Повторите позже |
| 503 | proxy_error | session_expired | Сессия Kaspi истекла | Обратитесь в поддержку |
| 503 | proxy_error | circuit_open | Прокси временно недоступен | Повторите через 30 секунд |
| 503 | proxy_error | proxy_unreachable | Прокси не отвечает | Повторите позже |
| 504 | proxy_error | proxy_timeout | Таймаут прокси | Повторите позже |
Обработка ошибок
python
try:
response = requests.post(url, headers=headers, json=data)
response.raise_for_status()
except requests.HTTPError as e:
error = e.response.json().get("error", {})
if error.get("code") == "rate_limit_exceeded":
reset = int(e.response.headers.get("X-RateLimit-Reset", 0))
time.sleep(max(0, reset - time.time()))
elif error.get("code") == "token_expired":
refresh_tokens()
retry()