<!-- /docs/errors (ru) -->

# Ошибки

## Формат

Ошибки приходят в едином конверте:

```json
{
  "statusCode": 400,
  "message": "duration must be an integer number",
}
```

- `statusCode` — HTTP-код;
- `message` — строка или массив строк (ошибки валидации);
- `code` — машиночитаемый код (не всегда присутствует).

## Коды

| Код | Когда |
|---|---|
| 400 | Неверные параметры запроса (валидация DTO) |
| 401 | Нет ключа / ключ неизвестен или деактивирован |
| 403 | Legacy service-ключ; доступ запрещён |
| 404 | Ресурс не найден |
| 429 | Превышен лимит запросов (60/мин на партнёра по умолчанию; общий гейт 100/мин на IP). Ответ содержит `Retry-After` |
| 500 | Внутренняя ошибка — безопасно повторить позже; при повторениях сообщите в поддержку |

## Валидация

Глобальный валидационный пайплайн отбрасывает неизвестные поля и приводит типы. Массив `message` перечисляет все нарушения сразу:

```json
{
  "statusCode": 400,
  "message": [
    "duration must be an integer number",
    "resolution must be shorter than or equal to 16 characters"
  ]
}
```

## Рекомендации по ретраям

- 429 — экспоненциальная задержка, начиная с 1–2 секунд; при наличии заголовка `Retry-After` ориентируйтесь на него.
- 5xx — повтор с задержкой; операции идемпотентны на стороне списаний, но перед повтором «запускающих» эндпоинтов генерации проверяйте статус задачи.
- 401/403 — не повторять: проверьте ключ.
