Структура ответа об ошибке
Все ошибки возвращаются в следующем формате:Поля ответа
code(обязательное): Машиночитаемый код ошибки. Используйте его для программной обработки ошибок.message(обязательное): Человекочитаемое описание ошибки на языке, указанном в заголовкеAccept-Languageили языке по умолчанию.details(опциональное): Дополнительная информация об ошибке. Структура зависит от типа ошибки.request_id(опциональное): Эхо заголовкаX-Request-ID, переданного в запросе. Используется для трассировки запросов.
Коды ошибок
Ошибки аутентификации и авторизации
401 Unauthorized
Ошибка аутентификации. Возвращается в следующих случаях:- Отсутствует или недействителен клиентский сертификат (mTLS): Запрос не содержит валидный клиентский сертификат или сертификат не прошел проверку.
- Отсутствует или недействителен Bearer токен: Заголовок
Authorizationотсутствует, имеет неверный формат, или токен истек/недействителен. - Неверный формат токена: Токен не является валидным JWT или имеет неверную структуру.
403 Forbidden
Недостаточно прав для выполнения операции. Возвращается в следующих случаях:- Отсутствует необходимый scope в токене: Токен валиден, но не содержит требуемый scope для данной операции.
- Неверный audience (aud) в токене: Поле
audв JWT не соответствует ожидаемому значению для данного API.
Ошибки валидации и бизнес-логики
400 Bad Request
Некорректный запрос. Возвращается при ошибках валидации входных данных. Код ошибки:ValidationError
Пример ответа:
404 Not Found
Ресурс не найден. Возвращается в следующих случаях: Код ошибки:CatalogResourceNotFound
Ресурс каталога (бизнес-зал или фаст-трек) не найден.
Пример ответа:
BookingNotFound
Бронирование не найдено.
Пример ответа:
409 Conflict
Конфликт состояния операции. Возвращается в следующих случаях: Код ошибки:IdempotencyConflict
Конфликт идемпотентности. Возвращается, когда запрос с существующим Idempotency-Key содержит тело запроса, отличающееся от сохранённого при первом использовании ключа.
Пример ответа:
BookingAlreadyConfirmed
Попытка подтвердить уже подтверждённую бронь.
Пример ответа:
BookingAlreadyCanceled
Попытка отменить уже отменённую бронь.
Пример ответа:
Ошибки обработки
202 Accepted (PassNotReady)
Бронь находится в обработке, данные для прохода недоступны. Это не ошибка, а индикатор того, что данные ещё не готовы. Код ошибки:PassNotReady
Заголовки ответа:
Location: URL ресурса для поллинга статуса (тот же endpoint/pass)Retry-After: Рекомендуемая задержка перед повтором в секундах
- Используйте заголовок
Retry-Afterдля определения интервала поллинга - Повторяйте запрос к тому же endpoint
/passдо получения успешного ответа или ошибки
500 Internal Server Error
Внутренняя ошибка сервиса. Возвращается при неожиданных ошибках на стороне сервера. Код ошибки:InternalError
Пример ответа:
- Не повторяйте запрос немедленно — это может быть временная проблема
- Если ошибка повторяется, обратитесь в поддержку с
request_id
503 Service Unavailable
Сервис временно недоступен. Возвращается при временной недоступности сервиса (например, при техническом обслуживании). Код ошибки:ServiceUnavailable
Заголовки ответа:
Retry-After: Рекомендуемая задержка перед повтором в секундах
- Используйте экспоненциальную задержку между повторными попытками
- Учитывайте заголовок
Retry-Afterпри планировании повторных запросов
Успешные ответы
304 Not Modified
Ресурс не был изменен с момента последнего запроса. Возвращается при использовании условных запросов с заголовкамиIf-None-Match или If-Modified-Since.
Особенности:
- Тело ответа отсутствует (экономия трафика)
- Возвращаются заголовки
ETagиLast-Modified
Обработка ошибок
Рекомендации
-
Используйте код ошибки для логики: Проверяйте поле
codeдля программной обработки ошибок, а не HTTP статус код или сообщение. -
Сохраняйте request_id: Всегда логируйте
request_idиз ответа об ошибке. Это поможет при обращении в поддержку. -
Обрабатывайте детали ошибки: Поле
detailsможет содержать полезную информацию для исправления проблемы (например, какие поля не прошли валидацию). -
Повторные запросы:
- Для
503 Service Unavailable: используйте экспоненциальную задержку и учитывайтеRetry-After - Для
202 PassNotReady: повторяйте запрос с интервалом, указанным вRetry-After - Для
500 Internal Error: не повторяйте немедленно, это может быть постоянная проблема
- Для
-
Ошибки аутентификации: При получении
401 Unauthorizedпроверьте:- Наличие и валидность клиентского сертификата (mTLS)
- Наличие и валидность Bearer токена
- Срок действия токена (токены действительны 1 час)
-
Ошибки авторизации: При получении
403 Forbiddenпроверьте:- Наличие необходимых scope в токене
- Правильность audience (aud) в JWT токене
Таблица кодов ошибок
| HTTP код | Код ошибки | Описание |
|---|---|---|
| 400 | ValidationError | Ошибка валидации входных данных |
| 401 | Unauthorized | Ошибка аутентификации |
| 403 | Forbidden | Недостаточно прав для операции |
| 404 | CatalogResourceNotFound | Ресурс каталога не найден |
| 404 | BookingNotFound | Бронирование не найдено |
| 409 | IdempotencyConflict | Конфликт идемпотентности |
| 409 | BookingAlreadyConfirmed | Бронь уже подтверждена |
| 409 | BookingAlreadyCanceled | Бронь уже отменена |
| 500 | InternalError | Внутренняя ошибка сервиса |
| 503 | ServiceUnavailable | Сервис временно недоступен |
| 202 | PassNotReady | Данные для прохода ещё не готовы |