# Statuser API (v1.0.0)


Официальный API для интеграции с платформой Statuser.

Statuser — сервис мониторинга доступности серверов, сайтов и приложений. С помощью публичного API вы можете интегрировать мониторинг в свою систему, управлять проверками, получать инциденты, настраивать уведомления и страницы статуса.

---

### Аутентификация

Все запросы требуют аутентификации с помощью API ключа, который можно создать в <a href="https://statuser.cloud/my/account/api-keys" target="_blank" rel="noopener noreferrer">панели управления</a>. API ключ необходимо передавать в заголовке каждого запроса:

```
Authorization: Bearer <ваш токен>
```

---

### Версионирование

Все эндпоинты и примеры в документации используют явную версию. Версионирование задаётся на уровне каждого эндпоинта и не является глобальным.

Версия указывается в пути запроса сразу после базового URL. Например:

```
GET /v1/account
```

Этот запрос обращается к первой версии метода получения данных об аккаунте.

API Statuser следует принципам [семантического версионирования](https://semver.org/lang/ru/), при этом добавление новых полей в ответ может происходить без изменения версии эндпоинта.

Рекомендуется обрабатывать только нужные поля, а не весь ответ целиком. Не передавайте ответы API сторонним системам без валидации.

Разрабатывайте интеграции так, чтобы они были устойчивы к добавлению новых полей и не полагались на порядок ключей в JSON-объекте.

---

### Ограничение частоты запросов

Чтобы обеспечить стабильность для всех пользователей, Statuser защищает API от всплесков входящего трафика, анализируя количество запросов c каждого аккаунта к каждой конечной точке.

В каждом ответе API возвращаются заголовки, содержащие информацию о текущем лимите:

| Заголовок              | Описание                                                                 |
|------------------------|--------------------------------------------------------------------------|
| `ratelimit-limit`      | Максимальное количество запросов в рамках текущего окна                  |
| `ratelimit-policy`     | Политика лимитов, например `3000;w=900` означает 3000 запросов на 900 сек |
| `ratelimit-remaining`  | Количество оставшихся запросов в текущем окне                            |
| `ratelimit-reset`      | Через сколько секунд произойдёт сброс лимита                             |

Если лимит превышен, API вернёт ошибку в формате:

```json
{
  "status": 429,
  "error_code": "too_many_requests"
  "message": "Too many requests from this IP, try again later",
}
```

Для корректной работы с ограничениями частоты запросов используйте значение `ratelimit-reset`, чтобы отложить повторный запрос до завершения текущего окна лимита.

---


## Серверы

- `https://api.statuser.cloud`

## Аутентификация

- `bearer` — http / bearer / JWT

## Эндпоинты

### Аккаунт

#### `GET /v1/telegram/linked` — Получить список привязанных Телеграм аккаунтов

**Аутентификация:** `bearer`

**Ответы:**
- `200` — Возвращает список привязанных аккаунтов Телеграм

#### `PATCH /v1/telegram/set-topic` — Установить топик для уведомлений

**Аутентификация:** `bearer`

**Ответы:**
- `204` — Топик для уведомлений успешно установлен

#### `GET /v1/account` — Получить информацию об аккаунте

**Аутентификация:** `bearer`

**Ответы:**
- `200` — Информация об аккаунте успешно получена
  - `application/json`: object
    - `id` (number, пример: `1`) **required** — ID аккаунта
    - `email` (string, пример: `"user@example.com"`) **required** — Электронная почта пользователя
    - `name` (string, пример: `"Иван Иванов"`) **required** — Имя пользователя
    - `status` (string, пример: `"active"`) **required** — Статус аккаунта
    - `password` (string, пример: `"password"`) **required** — Пароль аккаунта
    - `avatar_url` (object | null) **required** — URL аватара пользователя
    - `created_at` (string (date-time), пример: `"2023-01-01T00:00:00.000Z"`) **required** — Дата создания аккаунта
    - `password_changed_at` (object | null) **required** — Дата последней смены пароля
    - `timezone` (string, пример: `"Europe/Moscow"`) **required** — Часовой пояс, который используется для отображения времени в нотификациях
    - `is_ai_assistant_enabled` (boolean, пример: `true`) **required** — Отображается ли чат с ИИ помощником в панели управления
  Пример:
  
  ```json
  {
    "id": 1,
    "email": "user@example.com",
    "name": "Иван Иванов",
    "status": "active",
    "password": "password",
    "avatar_url": "https://example.com/avatar.jpg",
    "created_at": "2023-01-01T00:00:00.000Z",
    "password_changed_at": "2023-01-05T00:00:00.000Z",
    "timezone": "Europe/Moscow",
    "is_ai_assistant_enabled": true
  }
  ```
- `404` — Аккаунт не найден

#### `PATCH /v1/account` — Обновить информацию об аккаунте

**Аутентификация:** `bearer`

**Тело запроса** (обязательное)

Content-Type: `application/json`

object
  - `email` (string, пример: `"user@example.com"`) — Электронная почта пользователя
  - `name` (string, пример: `"Иван Иванов"`) — Имя пользователя
  - `timezone` (string, пример: `"Europe/Moscow"`) — Часовой пояс, который используется для отображения времени в нотификациях
  - `is_ai_assistant_enabled` (boolean, пример: `true`) — Отображается ли чат с ИИ помощником в панели управления

Пример:

```json
{
  "email": "user@example.com",
  "name": "Иван Иванов",
  "timezone": "Europe/Moscow",
  "is_ai_assistant_enabled": true
}
```

**Ответы:**
- `200` — Информация об аккаунте успешно обновлена
  - `application/json`: object
    - `id` (number, пример: `1`) **required** — ID аккаунта
    - `email` (string, пример: `"user@example.com"`) **required** — Электронная почта пользователя
    - `name` (string, пример: `"Иван Иванов"`) **required** — Имя пользователя
    - `status` (string, пример: `"active"`) **required** — Статус аккаунта
    - `password` (string, пример: `"password"`) **required** — Пароль аккаунта
    - `avatar_url` (object | null) **required** — URL аватара пользователя
    - `created_at` (string (date-time), пример: `"2023-01-01T00:00:00.000Z"`) **required** — Дата создания аккаунта
    - `password_changed_at` (object | null) **required** — Дата последней смены пароля
    - `timezone` (string, пример: `"Europe/Moscow"`) **required** — Часовой пояс, который используется для отображения времени в нотификациях
    - `is_ai_assistant_enabled` (boolean, пример: `true`) **required** — Отображается ли чат с ИИ помощником в панели управления
  Пример:
  
  ```json
  {
    "id": 1,
    "email": "user@example.com",
    "name": "Иван Иванов",
    "status": "active",
    "password": "password",
    "avatar_url": "https://example.com/avatar.jpg",
    "created_at": "2023-01-01T00:00:00.000Z",
    "password_changed_at": "2023-01-05T00:00:00.000Z",
    "timezone": "Europe/Moscow",
    "is_ai_assistant_enabled": true
  }
  ```
- `404` — Аккаунт не найден

#### `GET /v1/max/links` — Получить ссылку для привязки аккаунта MAX

**Аутентификация:** `bearer`

**Ответы:**
- `200` — Возвращает ссылку для привязки
  - `application/json`: object
    - `link_user` (string, пример: `"https://max.ru/statuser_notify_bot?start=ab12cd34"`) **required** — Ссылка для привязки аккаунта MAX пользователя
    - `link_group` (string, пример: `"https://max.ru/statuser_notify_bot?start=ab12cd34_group"`) **required** — Ссылка для запуска групповой привязки в MAX
  Пример:
  
  ```json
  {
    "link_user": "https://max.ru/statuser_notify_bot?start=ab12cd34",
    "link_group": "https://max.ru/statuser_notify_bot?start=ab12cd34_group"
  }
  ```

#### `GET /v1/max/linked` — Получить список привязанных MAX аккаунтов

**Аутентификация:** `bearer`

**Ответы:**
- `200` — Возвращает список привязанных MAX аккаунтов
  - `application/json`: array of object
    - `max_id` (string, пример: `"1234567890"`) **required** — ID чата в Max
    - `max_name` (object | null) **required** — Название чата или имя пользователя
    - `avatar_url` (object | null) **required** — Прямая ссылка на аватар в S3
    - `type` (string, enum: "user", "chat", пример: `"chat"`) **required** — Тип получателя: пользователь или чат
    - `created_at` (string (date-time), пример: `"2024-11-30T14:48:00.000Z"`) **required** — Дата привязки аккаунта MAX
    - `is_2fa_account` (boolean, пример: `true`) **required** — Используется ли аккаунт для двухфакторной аутентификации
  Пример:
  
  ```json
  [
    {
      "max_id": "1234567890",
      "max_name": "My Team Chat",
      "avatar_url": "https://s3.statuser.cloud/avatars/avatar_a1b2c3d4-e5f6-7890-abcd-ef1234567890.jpg",
      "type": "chat",
      "created_at": "2024-11-30T14:48:00.000Z",
      "is_2fa_account": true
    }
  ]
  ```

#### `DELETE /v1/max/unlink` — Отвязать MAX аккаунт

**Аутентификация:** `bearer`

**Тело запроса** (обязательное)

ID аккаунта MAX, который нужно отвязать

Content-Type: `application/json`

object
  - `max_id` (string) — ID получателя MAX

Пример:

```json
{
  "max_id": ""
}
```

**Ответы:**
- `204` — Аккаунт MAX успешно отвязан

#### `PATCH /v1/max/2fa-account` — Изменить используемый для 2fa MAX аккаунт

**Аутентификация:** `bearer`

**Тело запроса** (обязательное)

Content-Type: `application/json`

object
  - `max_id` (string) **required** — ID чата в Max

Пример:

```json
{
  "max_id": ""
}
```

**Ответы:**
- `204` — Изменяет используемый для 2fa MAX аккаунт

#### `GET /v1/holiday-mode` — Получить статус режима праздников

**Аутентификация:** `bearer`

**Ответы:**
- `200`
  - `application/json`: object
    - `holiday_until` (string | null) **required** — Дата и время (UTC) до включения уведомлений, либо null, если режим отключен
  Пример:
  
  ```json
  {
    "holiday_until": null
  }
  ```

#### `POST /v1/holiday-mode` — Изменить статус режима праздников

**Аутентификация:** `bearer`

**Тело запроса** (обязательное)

Content-Type: `application/json`

object
  - `holiday_until` (object | null) **required** — Дата и время (UTC) до включения уведомлений, либо null для выключения режима

Пример:

```json
{
  "holiday_until": "2025-08-18 13:20:25.495746+00"
}
```

**Ответы:**
- `201`
  - `application/json`: object
    - `holiday_until` (string | null) **required** — Дата и время (UTC) до включения уведомлений, либо null, если режим отключен
  Пример:
  
  ```json
  {
    "holiday_until": null
  }
  ```

#### `GET /v1/2fa` — Получить информацию по 2fa на аккаунте

**Аутентификация:** `bearer`

**Ответы:**
- `200` — Информацию по 2fa успешно получена
  - `application/json`: object
    - `preferred_method` (string | null, enum: "telegram", "max", "email", "totp", пример: `"telegram"`) **required** — Предпочитаемый метод двухфакторной аутентификации
    - `allowed_methods` (array of string, enum: "telegram", "max", "email", "totp") **required** — Список доступных методов двухфакторной аутентификации
  Пример:
  
  ```json
  {
    "preferred_method": "telegram",
    "allowed_methods": [
      "telegram",
      "max",
      "totp",
      "email"
    ]
  }
  ```

### Биллинг

#### `GET /v1/billing/current-plan` — Получить информацию о текущем тарифе аккаунта

**Аутентификация:** `bearer`

**Ответы:**
- `200` — Информация о тарифе успешно получена
  - `application/json`: object
    - `id` (number, пример: `2`) **required** — ID тарифа
    - `name` (string, пример: `"Pro"`) **required** — Название текущего тарифа
    - `price_per_month` (number, пример: `199`) **required** — Стоимость тарифа в месяц (в рублях)
    - `price_per_year` (number, пример: `1990`) **required** — Стоимость тарифа в год (в рублях)
    - `features` (object) **required** — Ограничения и возможности тарифа
      - `servers_limit` (number, пример: `50`) **required** — Максимальное количество серверов
      - `available_locations` (array of string) **required** — Список доступных локаций мониторинга
      - `allow_location_selection` (boolean, пример: `true`) **required** — Возможность ручного выбора локаций
      - `min_check_interval_seconds` (number, пример: `60`) **required** — Минимальный интервал проверок (в секундах)
      - `ssl_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга SSL
      - `domain_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга доменов
      - `dns_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга DNS
      - `dns_history_retention_days` (number, пример: `30`) **required** — Срок хранения истории DNS записей (в днях)
      - `keyword_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга ключевых слов
      - `heartbeat_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга heartbeat
      - `latency_alerts_enabled` (boolean, пример: `true`) **required** — Поддержка уведомлений о медленном ответе
      - `incident_retention_days` (number, пример: `60`) **required** — Срок хранения инцидентов (в днях)
      - `network_diagnostics_enabled` (boolean, пример: `true`) **required** — Доступность сетевой диагностики
      - `screenshots_enabled` (boolean, пример: `true`) **required** — Поддержка скриншотов при проверках
      - `incident_comments_enabled` (boolean, пример: `true`) **required** — Возможность комментирования инцидентов
      - `incident_report_enabled` (boolean, пример: `true`) **required** — Возможность скачивания отчета по инциденту
      - `webhook_notifications_enabled` (boolean, пример: `false`) **required** — Доступность вебхук-уведомлений
      - `status_pages_limit` (number, пример: `3`) **required** — Максимальное количество страниц статуса
      - `custom_domain_enabled` (boolean, пример: `true`) **required** — Поддержка подключения собственного домена
      - `password_protected_status_page` (boolean, пример: `true`) **required** — Защита страниц паролем
      - `indexing_control_enabled` (boolean, пример: `true`) **required** — Исключение страниц из индексации поисковиками
      - `white_label_enabled` (boolean, пример: `false`) **required** — Возможность вайтлейбла (удаления логотипа Статусера)
      - `status_page_minimum_incident_duration_enabled` (boolean, пример: `true`) **required** — Возможность задавать минимальную длительность инцидента для отображения на странице статуса
      - `status_page_incident_reports_per_month_limit` (number, пример: `1`) **required** — Лимит количества публичных отчётов по инцидентам для страниц статуса в месяц
      - `status_page_planned_maintenances_per_month_limit` (number, пример: `1`) **required** — Лимит количества записей о плановых работах для страниц статуса в месяц
    - `valid_until` (object) **required** — Срок действия текущего тарифа
    - `current_billing_period` (string | null, enum: "month", "year", пример: `"month"`) **required** — Период оплаты текущего тарифа
    - `pending_plan` (object | null) **required** — Планируемый тариф на который произойдет даунгрейд
      - `id` (number, пример: `2`) **required** — ID тарифа
      - `name` (string, пример: `"Pro"`) **required** — Название текущего тарифа
      - `price_per_month` (number, пример: `199`) **required** — Стоимость тарифа в месяц (в рублях)
      - `price_per_year` (number, пример: `1990`) **required** — Стоимость тарифа в год (в рублях)
      - `features` (object) **required** — Ограничения и возможности тарифа
        - `servers_limit` (number, пример: `50`) **required** — Максимальное количество серверов
        - `available_locations` (array of string) **required** — Список доступных локаций мониторинга
        - `allow_location_selection` (boolean, пример: `true`) **required** — Возможность ручного выбора локаций
        - `min_check_interval_seconds` (number, пример: `60`) **required** — Минимальный интервал проверок (в секундах)
        - `ssl_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга SSL
        - `domain_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга доменов
        - `dns_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга DNS
        - `dns_history_retention_days` (number, пример: `30`) **required** — Срок хранения истории DNS записей (в днях)
        - `keyword_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга ключевых слов
        - `heartbeat_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга heartbeat
        - `latency_alerts_enabled` (boolean, пример: `true`) **required** — Поддержка уведомлений о медленном ответе
        - `incident_retention_days` (number, пример: `60`) **required** — Срок хранения инцидентов (в днях)
        - `network_diagnostics_enabled` (boolean, пример: `true`) **required** — Доступность сетевой диагностики
        - `screenshots_enabled` (boolean, пример: `true`) **required** — Поддержка скриншотов при проверках
        - `incident_comments_enabled` (boolean, пример: `true`) **required** — Возможность комментирования инцидентов
        - `incident_report_enabled` (boolean, пример: `true`) **required** — Возможность скачивания отчета по инциденту
        - `webhook_notifications_enabled` (boolean, пример: `false`) **required** — Доступность вебхук-уведомлений
        - `status_pages_limit` (number, пример: `3`) **required** — Максимальное количество страниц статуса
        - `custom_domain_enabled` (boolean, пример: `true`) **required** — Поддержка подключения собственного домена
        - `password_protected_status_page` (boolean, пример: `true`) **required** — Защита страниц паролем
        - `indexing_control_enabled` (boolean, пример: `true`) **required** — Исключение страниц из индексации поисковиками
        - `white_label_enabled` (boolean, пример: `false`) **required** — Возможность вайтлейбла (удаления логотипа Статусера)
        - `status_page_minimum_incident_duration_enabled` (boolean, пример: `true`) **required** — Возможность задавать минимальную длительность инцидента для отображения на странице статуса
        - `status_page_incident_reports_per_month_limit` (number, пример: `1`) **required** — Лимит количества публичных отчётов по инцидентам для страниц статуса в месяц
        - `status_page_planned_maintenances_per_month_limit` (number, пример: `1`) **required** — Лимит количества записей о плановых работах для страниц статуса в месяц
    - `pending_plan_effective_at` (object | null) **required** — Дата применения запланированного даунгрейда
  Пример:
  
  ```json
  {
    "id": 2,
    "name": "Pro",
    "price_per_month": 199,
    "price_per_year": 1990,
    "features": {
      "servers_limit": 50,
      "available_locations": [
        "msk-1",
        "ams-1",
        "ala-1"
      ],
      "allow_location_selection": true,
      "min_check_interval_seconds": 60,
      "ssl_monitoring_enabled": true,
      "domain_monitoring_enabled": true,
      "dns_monitoring_enabled": true,
      "dns_history_retention_days": 30,
      "keyword_monitoring_enabled": true,
      "heartbeat_monitoring_enabled": true,
      "latency_alerts_enabled": true,
      "incident_retention_days": 60,
      "network_diagnostics_enabled": true,
      "screenshots_enabled": true,
      "incident_comments_enabled": true,
      "incident_report_enabled": true,
      "webhook_notifications_enabled": false,
      "status_pages_limit": 3,
      "custom_domain_enabled": true,
      "password_protected_status_page": true,
      "indexing_control_enabled": true,
      "white_label_enabled": false,
      "status_page_minimum_incident_duration_enabled": true,
      "status_page_incident_reports_per_month_limit": 1,
      "status_page_planned_maintenances_per_month_limit": 1
    },
    "valid_until": "2025-12-31T23:59:59.000Z",
    "current_billing_period": "month",
    "pending_plan": {
      "id": 2,
      "name": "Pro",
      "price_per_month": 199,
      "price_per_year": 1990,
      "features": {
        "servers_limit": 50,
        "available_locations": [
          "msk-1",
          "ams-1",
          "ala-1"
        ],
        "allow_location_selection": true,
        "min_check_interval_seconds": 60,
        "ssl_monitoring_enabled": true,
        "domain_monitoring_enabled": true,
        "dns_monitoring_enabled": true,
        "dns_history_retention_days": 30,
        "keyword_monitoring_enabled": true,
        "heartbeat_monitoring_enabled": true,
        "latency_alerts_enabled": true,
        "incident_retention_days": 60,
        "network_diagnostics_enabled": true,
        "screenshots_enabled": true,
        "incident_comments_enabled": true,
        "incident_report_enabled": true,
        "webhook_notifications_enabled": false,
        "status_pages_limit": 3,
        "custom_domain_enabled": true,
        "password_protected_status_page": true,
        "indexing_control_enabled": true,
        "white_label_enabled": false,
        "status_page_minimum_incident_duration_enabled": true,
        "status_page_incident_reports_per_month_limit": 1,
        "status_page_planned_maintenances_per_month_limit": 1
      }
    },
    "pending_plan_effective_at": "2025-12-31T23:59:59.000Z"
  }
  ```

#### `GET /v1/billing/plans` — Получить список публичных тарифов

**Ответы:**
- `200` — Публичные тарифы успешно получены
  - `application/json`: array of object
    - `id` (number, пример: `2`) **required** — ID тарифа
    - `name` (string, пример: `"Pro"`) **required** — Название текущего тарифа
    - `price_per_month` (number, пример: `199`) **required** — Стоимость тарифа в месяц (в рублях)
    - `price_per_year` (number, пример: `1990`) **required** — Стоимость тарифа в год (в рублях)
    - `features` (object) **required** — Ограничения и возможности тарифа
      - `servers_limit` (number, пример: `50`) **required** — Максимальное количество серверов
      - `available_locations` (array of string) **required** — Список доступных локаций мониторинга
      - `allow_location_selection` (boolean, пример: `true`) **required** — Возможность ручного выбора локаций
      - `min_check_interval_seconds` (number, пример: `60`) **required** — Минимальный интервал проверок (в секундах)
      - `ssl_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга SSL
      - `domain_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга доменов
      - `dns_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга DNS
      - `dns_history_retention_days` (number, пример: `30`) **required** — Срок хранения истории DNS записей (в днях)
      - `keyword_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга ключевых слов
      - `heartbeat_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга heartbeat
      - `latency_alerts_enabled` (boolean, пример: `true`) **required** — Поддержка уведомлений о медленном ответе
      - `incident_retention_days` (number, пример: `60`) **required** — Срок хранения инцидентов (в днях)
      - `network_diagnostics_enabled` (boolean, пример: `true`) **required** — Доступность сетевой диагностики
      - `screenshots_enabled` (boolean, пример: `true`) **required** — Поддержка скриншотов при проверках
      - `incident_comments_enabled` (boolean, пример: `true`) **required** — Возможность комментирования инцидентов
      - `incident_report_enabled` (boolean, пример: `true`) **required** — Возможность скачивания отчета по инциденту
      - `webhook_notifications_enabled` (boolean, пример: `false`) **required** — Доступность вебхук-уведомлений
      - `status_pages_limit` (number, пример: `3`) **required** — Максимальное количество страниц статуса
      - `custom_domain_enabled` (boolean, пример: `true`) **required** — Поддержка подключения собственного домена
      - `password_protected_status_page` (boolean, пример: `true`) **required** — Защита страниц паролем
      - `indexing_control_enabled` (boolean, пример: `true`) **required** — Исключение страниц из индексации поисковиками
      - `white_label_enabled` (boolean, пример: `false`) **required** — Возможность вайтлейбла (удаления логотипа Статусера)
      - `status_page_minimum_incident_duration_enabled` (boolean, пример: `true`) **required** — Возможность задавать минимальную длительность инцидента для отображения на странице статуса
      - `status_page_incident_reports_per_month_limit` (number, пример: `1`) **required** — Лимит количества публичных отчётов по инцидентам для страниц статуса в месяц
      - `status_page_planned_maintenances_per_month_limit` (number, пример: `1`) **required** — Лимит количества записей о плановых работах для страниц статуса в месяц
  Пример:
  
  ```json
  [
    {
      "id": 2,
      "name": "Pro",
      "price_per_month": 199,
      "price_per_year": 1990,
      "features": {
        "servers_limit": 50,
        "available_locations": [
          "msk-1",
          "ams-1",
          "ala-1"
        ],
        "allow_location_selection": true,
        "min_check_interval_seconds": 60,
        "ssl_monitoring_enabled": true,
        "domain_monitoring_enabled": true,
        "dns_monitoring_enabled": true,
        "dns_history_retention_days": 30,
        "keyword_monitoring_enabled": true,
        "heartbeat_monitoring_enabled": true,
        "latency_alerts_enabled": true,
        "incident_retention_days": 60,
        "network_diagnostics_enabled": true,
        "screenshots_enabled": true,
        "incident_comments_enabled": true,
        "incident_report_enabled": true,
        "webhook_notifications_enabled": false,
        "status_pages_limit": 3,
        "custom_domain_enabled": true,
        "password_protected_status_page": true,
        "indexing_control_enabled": true,
        "white_label_enabled": false,
        "status_page_minimum_incident_duration_enabled": true,
        "status_page_incident_reports_per_month_limit": 1,
        "status_page_planned_maintenances_per_month_limit": 1
      }
    }
  ]
  ```

### Серверы

#### `GET /v1/servers` — Получить все серверы на аккаунте

**Аутентификация:** `bearer`

**Параметры (query):**

- `limit` (number) — Максимальное количество серверов
- `offset` (number) — Смещение для пагинации

**Ответы:**
- `200` — Список серверов успешно получен

#### `POST /v1/servers` — Добавить в мониторинг новый сервер

**Аутентификация:** `bearer`

**Тело запроса** (обязательное)

Content-Type: `application/json`

object
  - `host` (string, пример: `"192.168.1.1"`) **required** — Адрес нового сервера
  - `protocol` (string, пример: `"http"`) **required** — Протокол проверки
  - `port` (number, пример: `"22"`) **required** — Порт для проверки
  - `http_method` (string, enum: "head", "get", "options", "post", "put", "patch", пример: `"head"`) **required** — HTTP метод
  - `body` (object | null) **required** — Тело запроса
  - `keyword` (object | null) **required** — Ключевое слово для мониторинга
  - `keyword_mode` (string | null, enum: "present", "absent", пример: `"present"`) **required** — Режим проверки ключевого слова: успех если слово есть/если слова нет
  - `headers` (array of string) **required** — Собственные заголовки запроса
  - `is_follow_redirects` (boolean, пример: `true`) **required** — Следовать за редиректами или нет
  - `request_timeout` (number, пример: `"10"`) **required** — Таймаут запроса
  - `check_interval` (number, пример: `60`) **required** — Интервал проверки сервера в секундах
  - `heartbeat_grace_interval` (object | null) — Допустимое опоздание в секундах для heartbeat: сколько ждать сверх check_interval
  - `name` (string, пример: `"Восхитительный сервер"`) **required** — Название сервиса
  - `description` (string, пример: `"Восхитительный сервер для проверки статуса"`) **required** — Описание сервиса
  - `is_ssl_check` (boolean, пример: `true`) **required** — Требуется ли выполнять проверку SSL-сертификата
  - `is_domain_check` (boolean, пример: `true`) **required** — Требуется ли выполнять проверку домена
  - `is_latency_alert_enabled` (boolean, пример: `true`) — Включить уведомления о медленном ответе сервера
  - `latency_trigger_ms` (number, пример: `800`) — Порог в мс для определения медленного ответа
  - `locations` (array of `unknown`) **required** — Локации, из которых требуется выполнять проверки
  - `dns_record_types` (string, enum: "A", "AAAA", "CNAME", "MX", "TXT", "NS", "SOA", "PTR", "SRV", пример: `["A","AAAA","MX"]`) **required** — Типы DNS записей для мониторинга

Пример:

```json
{
  "host": "192.168.1.1",
  "protocol": "http",
  "port": "22",
  "http_method": "head",
  "body": "{\"key\": \"value\"}",
  "keyword": "Welcome",
  "keyword_mode": "present",
  "headers": [],
  "is_follow_redirects": true,
  "request_timeout": "10",
  "check_interval": 60,
  "heartbeat_grace_interval": 300,
  "name": "Восхитительный сервер",
  "description": "Восхитительный сервер для проверки статуса",
  "is_ssl_check": true,
  "is_domain_check": true,
  "is_latency_alert_enabled": true,
  "latency_trigger_ms": 800,
  "locations": [
    "msk-1",
    "ams-1",
    "ala-1"
  ],
  "dns_record_types": [
    "A",
    "AAAA",
    "MX"
  ]
}
```

**Ответы:**
- `201` — Сервер успешно добавлен
  - `application/json`: object
    - `id` (number, пример: `1`) **required** — ID сервера
    - `host` (string, пример: `"192.168.1.1"`) **required** — IP адрес сервера
    - `protocol` (string, пример: `"http"`) **required** — Протокол сервера
    - `heartbeat_token` (object | null) **required** — Токен для heartbeat URL (только для protocol=heartbeat)
    - `last_heartbeat_at` (object | null) **required** — Время последнего полученного heartbeat (только для protocol=heartbeat)
    - `heartbeat_grace_interval` (object | null) **required** — Допустимое опоздание в секундах для heartbeat: сколько ждать сверх check_interval
    - `port` (object) **required** — Порт для проверки tcp
    - `http_method` (string, enum: "head", "get", "options", "post", "put", "patch", пример: `"head"`) **required** — HTTP метод
    - `request_timeout` (number, пример: `"10"`) **required** — Таймаут запроса
    - `check_interval` (number, пример: `60`) **required** — Интервал проверки сервера в секундах
    - `name` (object) **required** — Название сервиса
    - `description` (object | null) **required** — Описание сервиса
    - `status` (string, пример: `"online"`) **required** — Текущий статус сервиса
    - `body` (object | null) **required** — Тело запроса для проверки
    - `keyword` (object | null) **required** — Ключевое слово для мониторинга
    - `keyword_mode` (string | null, enum: "present", "absent", пример: `"present"`) **required** — Режим проверки ключевого слова
    - `headers` (array of string) **required** — Собственные заголовки запроса
    - `is_follow_redirects` (boolean, пример: `true`) **required** — Следовать за редиректами или нет
    - `last_unavailable_at` (object) **required** — Время, когда сервер в последний раз стал недоступен (начало текущего или последнего инцидента)
    - `last_available_at` (object) **required** — Время, когда сервер в последний раз восстановил доступность (завершение последнего инцидента или последняя успешная проверка)
    - `last_checked_at` (object) **required** — Время последней проверки сервера
    - `is_ssl_check` (boolean, пример: `true`) **required** — Включены ли проверки SSL-сертификата
    - `ssl` (object) **required** — Информация о SSL-сертификате
    - `is_domain_check` (boolean, пример: `true`) **required** — Включены ли проверки времени окончания домена
    - `domain` (object) **required** — Информация о домене
    - `is_latency_alert_enabled` (boolean, пример: `true`) **required** — Включены ли уведомления о медленном ответе
    - `latency_trigger_ms` (number, пример: `800`) **required** — Порог в мс для перехода в состояние SLOW
    - `locations` (array of string) **required** — Локации, из которых выполняются проверки
    - `dns_record_types` (object | null) **required** — Типы DNS записей для мониторинга
    - `dns_records` (array of object | null) **required** — Текущие DNS записи домена
      - `record_type` (string, enum: "A", "AAAA", "CNAME", "MX", "TXT", "NS", "SOA", "PTR", "SRV", пример: `"A"`) **required** — Тип DNS записи
      - `records` (array of string) **required** — Структурированные значения DNS записей
    - `dns_error_code` (string | null, enum: "NODATA", "NXDOMAIN", "SERVFAIL", "REFUSED", "FORMERR", "NOTIMP", "UNKNOWN", пример: `"NODATA"`) **required** — Код последней DNS ошибки (только для protocol=dns)
    - `created_at` (string (date-time), пример: `"2023-01-01T00:00:00.000Z"`) **required** — Время создания сервера
  Пример:
  
  ```json
  {
    "id": 1,
    "host": "192.168.1.1",
    "protocol": "http",
    "heartbeat_token": "550e8400-e29b-41d4-a716-446655440000",
    "last_heartbeat_at": "2025-12-31T23:59:59.000Z",
    "heartbeat_grace_interval": 300,
    "port": "22",
    "http_method": "head",
    "request_timeout": "10",
    "check_interval": 60,
    "name": "Восхитительный сервер",
    "description": "Восхитительный сервер для проверки статуса",
    "status": "online",
    "body": "{\"key\": \"value\"}",
    "keyword": "Welcome",
    "keyword_mode": "present",
    "headers": "{\"Authorization\": \"Bearer token\"}",
    "is_follow_redirects": true,
    "last_unavailable_at": "2023-01-02T00:00:00.000Z",
    "last_available_at": "2023-01-03T12:34:56.000Z",
    "last_checked_at": "2023-01-02T00:00:00.000Z",
    "is_ssl_check": true,
    "ssl": {},
    "is_domain_check": true,
    "domain": {},
    "is_latency_alert_enabled": true,
    "latency_trigger_ms": 800,
    "locations": [
      "msk-1",
      "ams-1",
      "ala-1"
    ],
    "dns_record_types": [
      "A",
      "AAAA",
      "MX"
    ],
    "dns_records": [
      {
        "record_type": "A",
        "records": [
          {
            "value": "192.168.1.1"
          },
          {
            "value": "192.168.1.2"
          },
          {
            "priority": 10,
            "exchange": "mail.example.com"
          },
          {
            "priority": 10,
            "weight": 5,
            "port": 443,
            "target": "service.example.com"
          }
        ]
      }
    ],
    "dns_error_code": "NODATA",
    "created_at": "2023-01-01T00:00:00.000Z"
  }
  ```

#### `GET /v1/servers/{id}` — Получить сервер

**Аутентификация:** `bearer`

**Параметры (path):**

- `id` (number) **required**

**Ответы:**
- `200` — Сервер успешно получен
  - `application/json`: object
    - `id` (number, пример: `1`) **required** — ID сервера
    - `host` (string, пример: `"192.168.1.1"`) **required** — IP адрес сервера
    - `protocol` (string, пример: `"http"`) **required** — Протокол сервера
    - `heartbeat_token` (object | null) **required** — Токен для heartbeat URL (только для protocol=heartbeat)
    - `last_heartbeat_at` (object | null) **required** — Время последнего полученного heartbeat (только для protocol=heartbeat)
    - `heartbeat_grace_interval` (object | null) **required** — Допустимое опоздание в секундах для heartbeat: сколько ждать сверх check_interval
    - `port` (object) **required** — Порт для проверки tcp
    - `http_method` (string, enum: "head", "get", "options", "post", "put", "patch", пример: `"head"`) **required** — HTTP метод
    - `request_timeout` (number, пример: `"10"`) **required** — Таймаут запроса
    - `check_interval` (number, пример: `60`) **required** — Интервал проверки сервера в секундах
    - `name` (object) **required** — Название сервиса
    - `description` (object | null) **required** — Описание сервиса
    - `status` (string, пример: `"online"`) **required** — Текущий статус сервиса
    - `body` (object | null) **required** — Тело запроса для проверки
    - `keyword` (object | null) **required** — Ключевое слово для мониторинга
    - `keyword_mode` (string | null, enum: "present", "absent", пример: `"present"`) **required** — Режим проверки ключевого слова
    - `headers` (array of string) **required** — Собственные заголовки запроса
    - `is_follow_redirects` (boolean, пример: `true`) **required** — Следовать за редиректами или нет
    - `last_unavailable_at` (object) **required** — Время, когда сервер в последний раз стал недоступен (начало текущего или последнего инцидента)
    - `last_available_at` (object) **required** — Время, когда сервер в последний раз восстановил доступность (завершение последнего инцидента или последняя успешная проверка)
    - `last_checked_at` (object) **required** — Время последней проверки сервера
    - `is_ssl_check` (boolean, пример: `true`) **required** — Включены ли проверки SSL-сертификата
    - `ssl` (object) **required** — Информация о SSL-сертификате
    - `is_domain_check` (boolean, пример: `true`) **required** — Включены ли проверки времени окончания домена
    - `domain` (object) **required** — Информация о домене
    - `is_latency_alert_enabled` (boolean, пример: `true`) **required** — Включены ли уведомления о медленном ответе
    - `latency_trigger_ms` (number, пример: `800`) **required** — Порог в мс для перехода в состояние SLOW
    - `locations` (array of string) **required** — Локации, из которых выполняются проверки
    - `dns_record_types` (object | null) **required** — Типы DNS записей для мониторинга
    - `dns_records` (array of object | null) **required** — Текущие DNS записи домена
      - `record_type` (string, enum: "A", "AAAA", "CNAME", "MX", "TXT", "NS", "SOA", "PTR", "SRV", пример: `"A"`) **required** — Тип DNS записи
      - `records` (array of string) **required** — Структурированные значения DNS записей
    - `dns_error_code` (string | null, enum: "NODATA", "NXDOMAIN", "SERVFAIL", "REFUSED", "FORMERR", "NOTIMP", "UNKNOWN", пример: `"NODATA"`) **required** — Код последней DNS ошибки (только для protocol=dns)
    - `created_at` (string (date-time), пример: `"2023-01-01T00:00:00.000Z"`) **required** — Время создания сервера
  Пример:
  
  ```json
  {
    "id": 1,
    "host": "192.168.1.1",
    "protocol": "http",
    "heartbeat_token": "550e8400-e29b-41d4-a716-446655440000",
    "last_heartbeat_at": "2025-12-31T23:59:59.000Z",
    "heartbeat_grace_interval": 300,
    "port": "22",
    "http_method": "head",
    "request_timeout": "10",
    "check_interval": 60,
    "name": "Восхитительный сервер",
    "description": "Восхитительный сервер для проверки статуса",
    "status": "online",
    "body": "{\"key\": \"value\"}",
    "keyword": "Welcome",
    "keyword_mode": "present",
    "headers": "{\"Authorization\": \"Bearer token\"}",
    "is_follow_redirects": true,
    "last_unavailable_at": "2023-01-02T00:00:00.000Z",
    "last_available_at": "2023-01-03T12:34:56.000Z",
    "last_checked_at": "2023-01-02T00:00:00.000Z",
    "is_ssl_check": true,
    "ssl": {},
    "is_domain_check": true,
    "domain": {},
    "is_latency_alert_enabled": true,
    "latency_trigger_ms": 800,
    "locations": [
      "msk-1",
      "ams-1",
      "ala-1"
    ],
    "dns_record_types": [
      "A",
      "AAAA",
      "MX"
    ],
    "dns_records": [
      {
        "record_type": "A",
        "records": [
          {
            "value": "192.168.1.1"
          },
          {
            "value": "192.168.1.2"
          },
          {
            "priority": 10,
            "exchange": "mail.example.com"
          },
          {
            "priority": 10,
            "weight": 5,
            "port": 443,
            "target": "service.example.com"
          }
        ]
      }
    ],
    "dns_error_code": "NODATA",
    "created_at": "2023-01-01T00:00:00.000Z"
  }
  ```
- `404` — Сервер не найден

#### `PATCH /v1/servers/{id}` — Обновить сервер

**Аутентификация:** `bearer`

**Параметры (path):**

- `id` (number) **required**

**Тело запроса** (обязательное)

Content-Type: `application/json`

object
  - `host` (string, пример: `"192.168.1.1"`) — Адрес сервера
  - `protocol` (string, пример: `"http"`) — Протокол проверки
  - `port` (number, пример: `22`) — Порт для проверки
  - `http_method` (string, enum: "head", "get", "options", "post", "put", "patch", пример: `"head"`) **required** — HTTP метод
  - `body` (object | null) **required** — Тело запроса
  - `keyword` (object | null) — Ключевое слово для мониторинга
  - `keyword_mode` (string | null, enum: "present", "absent", пример: `"present"`) — Режим проверки ключевого слова
  - `headers` (array of object) **required** — Собственные заголовки запроса
    - `key` (string, пример: `"Content-Type"`) **required** — Ключ заголовка
    - `value` (string, пример: `"application/json"`) **required** — Значение заголовка
  - `is_follow_redirects` (boolean, пример: `true`) **required** — Следовать за редиректами или нет
  - `request_timeout` (number, пример: `"10"`) **required** — Таймаут запроса
  - `check_interval` (number, пример: `60`) — Интервал проверки сервера в секундах
  - `heartbeat_grace_interval` (object | null) — Период ожидания в секундах для heartbeat: сколько ждать сверх check_interval
  - `name` (string, пример: `"Восхитительный сервер"`) — Название сервиса
  - `description` (string, пример: `"Восхитительный сервер для проверки статуса"`) **required** — Описание сервиса
  - `is_ssl_check` (boolean, пример: `true`) **required** — Требуется ли выполнять проверку SSL-сертификата
  - `is_domain_check` (boolean, пример: `true`) **required** — Требуется ли выполнять проверку домена
  - `is_latency_alert_enabled` (boolean, пример: `true`) — Включить уведомления о медленном ответе сервера
  - `latency_trigger_ms` (number, пример: `800`) — Порог (мс) для определения медленного ответа
  - `locations` (array of `unknown`) **required** — Локации, из которых требуется выполнять проверки
  - `dns_record_types` (string, enum: "A", "AAAA", "CNAME", "MX", "TXT", "NS", "SOA", "PTR", "SRV", пример: `["A","AAAA","MX"]`) — Типы DNS записей для мониторинга

Пример:

```json
{
  "host": "192.168.1.1",
  "protocol": "http",
  "port": 22,
  "http_method": "head",
  "body": "{\"key\": \"value\"}",
  "keyword": "Welcome",
  "keyword_mode": "present",
  "headers": [
    {
      "key": "Authorization",
      "value": "Bearer token"
    }
  ],
  "is_follow_redirects": true,
  "request_timeout": "10",
  "check_interval": 60,
  "heartbeat_grace_interval": 300,
  "name": "Восхитительный сервер",
  "description": "Восхитительный сервер для проверки статуса",
  "is_ssl_check": true,
  "is_domain_check": true,
  "is_latency_alert_enabled": true,
  "latency_trigger_ms": 800,
  "locations": [
    "msk-1",
    "ams-1",
    "ala-1"
  ],
  "dns_record_types": [
    "A",
    "AAAA",
    "MX"
  ]
}
```

**Ответы:**
- `200` — Сервер успешно обновлен
  - `application/json`: object
    - `id` (number, пример: `1`) **required** — ID сервера
    - `host` (string, пример: `"192.168.1.1"`) **required** — IP адрес сервера
    - `protocol` (string, пример: `"http"`) **required** — Протокол сервера
    - `heartbeat_token` (object | null) **required** — Токен для heartbeat URL (только для protocol=heartbeat)
    - `last_heartbeat_at` (object | null) **required** — Время последнего полученного heartbeat (только для protocol=heartbeat)
    - `heartbeat_grace_interval` (object | null) **required** — Допустимое опоздание в секундах для heartbeat: сколько ждать сверх check_interval
    - `port` (object) **required** — Порт для проверки tcp
    - `http_method` (string, enum: "head", "get", "options", "post", "put", "patch", пример: `"head"`) **required** — HTTP метод
    - `request_timeout` (number, пример: `"10"`) **required** — Таймаут запроса
    - `check_interval` (number, пример: `60`) **required** — Интервал проверки сервера в секундах
    - `name` (object) **required** — Название сервиса
    - `description` (object | null) **required** — Описание сервиса
    - `status` (string, пример: `"online"`) **required** — Текущий статус сервиса
    - `body` (object | null) **required** — Тело запроса для проверки
    - `keyword` (object | null) **required** — Ключевое слово для мониторинга
    - `keyword_mode` (string | null, enum: "present", "absent", пример: `"present"`) **required** — Режим проверки ключевого слова
    - `headers` (array of string) **required** — Собственные заголовки запроса
    - `is_follow_redirects` (boolean, пример: `true`) **required** — Следовать за редиректами или нет
    - `last_unavailable_at` (object) **required** — Время, когда сервер в последний раз стал недоступен (начало текущего или последнего инцидента)
    - `last_available_at` (object) **required** — Время, когда сервер в последний раз восстановил доступность (завершение последнего инцидента или последняя успешная проверка)
    - `last_checked_at` (object) **required** — Время последней проверки сервера
    - `is_ssl_check` (boolean, пример: `true`) **required** — Включены ли проверки SSL-сертификата
    - `ssl` (object) **required** — Информация о SSL-сертификате
    - `is_domain_check` (boolean, пример: `true`) **required** — Включены ли проверки времени окончания домена
    - `domain` (object) **required** — Информация о домене
    - `is_latency_alert_enabled` (boolean, пример: `true`) **required** — Включены ли уведомления о медленном ответе
    - `latency_trigger_ms` (number, пример: `800`) **required** — Порог в мс для перехода в состояние SLOW
    - `locations` (array of string) **required** — Локации, из которых выполняются проверки
    - `dns_record_types` (object | null) **required** — Типы DNS записей для мониторинга
    - `dns_records` (array of object | null) **required** — Текущие DNS записи домена
      - `record_type` (string, enum: "A", "AAAA", "CNAME", "MX", "TXT", "NS", "SOA", "PTR", "SRV", пример: `"A"`) **required** — Тип DNS записи
      - `records` (array of string) **required** — Структурированные значения DNS записей
    - `dns_error_code` (string | null, enum: "NODATA", "NXDOMAIN", "SERVFAIL", "REFUSED", "FORMERR", "NOTIMP", "UNKNOWN", пример: `"NODATA"`) **required** — Код последней DNS ошибки (только для protocol=dns)
    - `created_at` (string (date-time), пример: `"2023-01-01T00:00:00.000Z"`) **required** — Время создания сервера
  Пример:
  
  ```json
  {
    "id": 1,
    "host": "192.168.1.1",
    "protocol": "http",
    "heartbeat_token": "550e8400-e29b-41d4-a716-446655440000",
    "last_heartbeat_at": "2025-12-31T23:59:59.000Z",
    "heartbeat_grace_interval": 300,
    "port": "22",
    "http_method": "head",
    "request_timeout": "10",
    "check_interval": 60,
    "name": "Восхитительный сервер",
    "description": "Восхитительный сервер для проверки статуса",
    "status": "online",
    "body": "{\"key\": \"value\"}",
    "keyword": "Welcome",
    "keyword_mode": "present",
    "headers": "{\"Authorization\": \"Bearer token\"}",
    "is_follow_redirects": true,
    "last_unavailable_at": "2023-01-02T00:00:00.000Z",
    "last_available_at": "2023-01-03T12:34:56.000Z",
    "last_checked_at": "2023-01-02T00:00:00.000Z",
    "is_ssl_check": true,
    "ssl": {},
    "is_domain_check": true,
    "domain": {},
    "is_latency_alert_enabled": true,
    "latency_trigger_ms": 800,
    "locations": [
      "msk-1",
      "ams-1",
      "ala-1"
    ],
    "dns_record_types": [
      "A",
      "AAAA",
      "MX"
    ],
    "dns_records": [
      {
        "record_type": "A",
        "records": [
          {
            "value": "192.168.1.1"
          },
          {
            "value": "192.168.1.2"
          },
          {
            "priority": 10,
            "exchange": "mail.example.com"
          },
          {
            "priority": 10,
            "weight": 5,
            "port": 443,
            "target": "service.example.com"
          }
        ]
      }
    ],
    "dns_error_code": "NODATA",
    "created_at": "2023-01-01T00:00:00.000Z"
  }
  ```
- `404` — Сервер не найден

#### `DELETE /v1/servers/{id}` — Удалить сервер из мониторинга

**Аутентификация:** `bearer`

**Параметры (path):**

- `id` (number) **required**

**Ответы:**
- `204` — Сервер успешно удален
- `404` — Сервер не найден

#### `GET /v1/servers/{id}/checks` — Получить проверки сервера

**Аутентификация:** `bearer`

**Параметры (path):**

- `id` (number) **required**

**Параметры (query):**

- `startDate` (string) — Дата начала для фильтрации
- `endDate` (string) — Дата окончания для фильтрации

**Ответы:**
- `200` — Список проверок сервера успешно получен
- `404` — Сервер не найден

#### `GET /v1/servers/{id}/heartbeat/events` — Получить heartbeat события сервера

**Аутентификация:** `bearer`

**Параметры (path):**

- `id` (number) **required**

**Параметры (query):**

- `startDate` (string) — Дата начала для фильтрации
- `endDate` (string) — Дата окончания для фильтрации

**Ответы:**
- `200` — Список heartbeat событий успешно получен
- `404` — Сервер не найден

#### `PATCH /v1/servers/{id}/{action}` — Приостановить или возобновить проверки сервера

**Аутентификация:** `bearer`

**Параметры (path):**

- `id` (number) **required**
- `action` (string) **required**

**Ответы:**
- `200` — Статус проверок сервера успешно обновлён
- `404` — Сервер не найден

#### `GET /v1/servers/{id}/dns-history` — Получить историю изменений DNS записей сервера

**Аутентификация:** `bearer`

**Параметры (path):**

- `id` (number) **required**

**Ответы:**
- `200` — История изменений DNS записей успешно получена
  - `application/json`: array of object
    - `id` (number, пример: `1`) **required** — Уникальный идентификатор изменения
    - `domain` (string, пример: `"example.com"`) **required** — Доменное имя
    - `record_type` (string, enum: "A", "AAAA", "CNAME", "MX", "TXT", "NS", "SOA", "PTR", "SRV", пример: `"A"`) **required** — Тип DNS записи
    - `added_records` (object | null) **required** — Добавленные DNS записи
    - `removed_records` (object | null) **required** — Удаленные DNS записи
    - `change_type` (string, enum: "added", "modified", "removed", пример: `"modified"`) **required** — Тип изменения
    - `changed_at` (string (date-time), пример: `"2023-01-01T00:00:00.000Z"`) **required** — Время изменения записи
  Пример:
  
  ```json
  [
    {
      "id": 1,
      "domain": "example.com",
      "record_type": "A",
      "added_records": [
        {
          "value": "new-record.example.com"
        }
      ],
      "removed_records": [
        {
          "value": "old-record.example.com"
        }
      ],
      "change_type": "modified",
      "changed_at": "2023-01-01T00:00:00.000Z"
    }
  ]
  ```
- `404` — Сервер не найден

#### `POST /v1/servers/{id}/test-notify` — Отправить тестовую нотификацию для сервера

**Аутентификация:** `bearer`

**Параметры (path):**

- `id` (number) **required**

**Ответы:**
- `204` — Тестовая нотификация успешно отправлена
- `404` — Сервер не найден

### Нотификации

#### `GET /v1/notification-rules` — Получить правила уведомлений для аккаунта

**Аутентификация:** `bearer`

**Ответы:**
- `200` — Список правил уведомлений успешно получен
  - `application/json`: array of object
    - `type` (string, enum: "updates", "weekly_reports", "service_alerts", "test_alerts", "ssl_alerts", "domain_alerts", "dns_alerts", "ideas", "billing_alerts", "holiday_mode", "api_key_alerts", "security_alerts", "receipt", пример: `"service_alerts"`) **required** — Тип подписки на уведомления, например, для оповещений или обновлений
    - `channels` (object) **required** — Каналы для уведомлений и их активный статус
      - `email` (boolean, пример: `true`) — Включены ли уведомления на емейл для данного типа подписки
      - `telegram` (boolean, пример: `true`) — Включены ли уведомления в Телеграм для данного типа подписки
      - `max` (boolean, пример: `true`) — Включены ли уведомления в MAX для данного типа подписки
  Пример:
  
  ```json
  [
    {
      "type": "service_alerts",
      "channels": {
        "email": true,
        "telegram": true,
        "max": true
      }
    }
  ]
  ```

#### `PATCH /v1/notification-rules` — Обновить правило уведомлений для аккаунта

**Аутентификация:** `bearer`

**Тело запроса** (обязательное)

Content-Type: `application/json`

object
  - `type` (string, enum: "updates", "weekly_reports", "service_alerts", "test_alerts", "ssl_alerts", "domain_alerts", "dns_alerts", "ideas", "billing_alerts", "holiday_mode", "api_key_alerts", "security_alerts", "receipt", пример: `"service_alerts"`) **required** — Тип подписки на уведомления, например, для оповещений или обновлений
  - `email` (boolean, пример: `true`) **required** — Включены ли уведомления по емейл для данного типа подписки
  - `telegram` (boolean, пример: `true`) **required** — Включены ли уведомления в Телеграм для данного типа подписки
  - `max` (boolean, пример: `true`) **required** — Включены ли уведомления в MAX для данного типа подписки

Пример:

```json
{
  "type": "service_alerts",
  "email": true,
  "telegram": true,
  "max": true
}
```

**Ответы:**
- `200` — Правило уведомлений успешно обновлено
  - `application/json`: object
    - `type` (string, enum: "updates", "weekly_reports", "service_alerts", "test_alerts", "ssl_alerts", "domain_alerts", "dns_alerts", "ideas", "billing_alerts", "holiday_mode", "api_key_alerts", "security_alerts", "receipt", пример: `"service_alerts"`) **required** — Тип подписки на уведомления, например, для оповещений или обновлений
    - `channels` (object) **required** — Каналы для уведомлений и их активный статус
      - `email` (boolean, пример: `true`) — Включены ли уведомления на емейл для данного типа подписки
      - `telegram` (boolean, пример: `true`) — Включены ли уведомления в Телеграм для данного типа подписки
      - `max` (boolean, пример: `true`) — Включены ли уведомления в MAX для данного типа подписки
  Пример:
  
  ```json
  {
    "type": "service_alerts",
    "channels": {
      "email": true,
      "telegram": true,
      "max": true
    }
  }
  ```

### Вебхуки

#### `GET /v1/webhooks` — Получить список вебхуков аккаунта

**Аутентификация:** `bearer`

**Ответы:**
- `200` — Список вебхуков успешно получен
  - `application/json`: array of object
    - `id` (number, пример: `1`) **required** — ID вебхука
    - `name` (string, пример: `"Slack prod"`) **required** — Название вебхука
    - `url` (string, пример: `"https://example.com/webhooks/statuser"`) **required** — URL, куда будет отправляться вебхук
    - `subscriptions` (array of string, enum: "updates", "weekly_reports", "service_alerts", "test_alerts", "ssl_alerts", "domain_alerts", "dns_alerts", "ideas", "billing_alerts", "holiday_mode", "api_key_alerts", "security_alerts", "receipt") **required** — Список подписок, которые отправляются на этот webhook
    - `is_secret_set` (boolean, пример: `true`) **required** — Указан ли секрет для подписи запросов вебхука
    - `created_at` (string (date-time), пример: `"2026-02-08T12:00:00.000Z"`) **required** — Дата добавления вебхука
  Пример:
  
  ```json
  [
    {
      "id": 1,
      "name": "Slack prod",
      "url": "https://example.com/webhooks/statuser",
      "subscriptions": [
        "service_alerts",
        "dns_alerts"
      ],
      "is_secret_set": true,
      "created_at": "2026-02-08T12:00:00.000Z"
    }
  ]
  ```

#### `POST /v1/webhooks` — Создать вебхук

**Аутентификация:** `bearer`

**Тело запроса** (обязательное)

Content-Type: `application/json`

object
  - `name` (string, пример: `"Slack prod"`) **required** — Название вебхука
  - `url` (string, пример: `"https://example.com/webhooks/statuser"`) **required** — URL, куда будет отправляться вебхук
  - `secret` (object | null) **required** — Секрет для подписи запросов вебхука. Не возвращается обратно из API
  - `subscriptions` (array of string, enum: "updates", "weekly_reports", "service_alerts", "test_alerts", "ssl_alerts", "domain_alerts", "dns_alerts", "ideas", "billing_alerts", "holiday_mode", "api_key_alerts", "security_alerts", "receipt") **required** — Список типов подписок, которые должны отправляться на этот вебхук

Пример:

```json
{
  "name": "Slack prod",
  "url": "https://example.com/webhooks/statuser",
  "secret": null,
  "subscriptions": [
    "service_alerts",
    "dns_alerts"
  ]
}
```

**Ответы:**
- `201` — Вебхук успешно создан
  - `application/json`: object
    - `id` (number, пример: `1`) **required** — ID вебхука
    - `name` (string, пример: `"Slack prod"`) **required** — Название вебхука
    - `url` (string, пример: `"https://example.com/webhooks/statuser"`) **required** — URL, куда будет отправляться вебхук
    - `subscriptions` (array of string, enum: "updates", "weekly_reports", "service_alerts", "test_alerts", "ssl_alerts", "domain_alerts", "dns_alerts", "ideas", "billing_alerts", "holiday_mode", "api_key_alerts", "security_alerts", "receipt") **required** — Список подписок, которые отправляются на этот webhook
    - `is_secret_set` (boolean, пример: `true`) **required** — Указан ли секрет для подписи запросов вебхука
    - `created_at` (string (date-time), пример: `"2026-02-08T12:00:00.000Z"`) **required** — Дата добавления вебхука
  Пример:
  
  ```json
  {
    "id": 1,
    "name": "Slack prod",
    "url": "https://example.com/webhooks/statuser",
    "subscriptions": [
      "service_alerts",
      "dns_alerts"
    ],
    "is_secret_set": true,
    "created_at": "2026-02-08T12:00:00.000Z"
  }
  ```

#### `PATCH /v1/webhooks/{id}` — Обновить вебхук

**Аутентификация:** `bearer`

**Параметры (path):**

- `id` (number) **required**

**Тело запроса** (обязательное)

Content-Type: `application/json`

object
  - `name` (string, пример: `"Slack prod"`) — Название вебхука
  - `url` (string, пример: `"https://example.com/webhooks/statuser"`) — URL, куда будет отправляться вебхук
  - `secret` (object | null) — Секрет для подписи запросов вебхука. Не возвращается обратно из API
  - `subscriptions` (array of string, enum: "updates", "weekly_reports", "service_alerts", "test_alerts", "ssl_alerts", "domain_alerts", "dns_alerts", "ideas", "billing_alerts", "holiday_mode", "api_key_alerts", "security_alerts", "receipt") — Список типов подписок, которые должны отправляться на этот вебхук

Пример:

```json
{
  "name": "Slack prod",
  "url": "https://example.com/webhooks/statuser",
  "secret": "my-secret",
  "subscriptions": [
    "service_alerts",
    "dns_alerts"
  ]
}
```

**Ответы:**
- `200` — Вебхук успешно обновлён
  - `application/json`: object
    - `id` (number, пример: `1`) **required** — ID вебхука
    - `name` (string, пример: `"Slack prod"`) **required** — Название вебхука
    - `url` (string, пример: `"https://example.com/webhooks/statuser"`) **required** — URL, куда будет отправляться вебхук
    - `subscriptions` (array of string, enum: "updates", "weekly_reports", "service_alerts", "test_alerts", "ssl_alerts", "domain_alerts", "dns_alerts", "ideas", "billing_alerts", "holiday_mode", "api_key_alerts", "security_alerts", "receipt") **required** — Список подписок, которые отправляются на этот webhook
    - `is_secret_set` (boolean, пример: `true`) **required** — Указан ли секрет для подписи запросов вебхука
    - `created_at` (string (date-time), пример: `"2026-02-08T12:00:00.000Z"`) **required** — Дата добавления вебхука
  Пример:
  
  ```json
  {
    "id": 1,
    "name": "Slack prod",
    "url": "https://example.com/webhooks/statuser",
    "subscriptions": [
      "service_alerts",
      "dns_alerts"
    ],
    "is_secret_set": true,
    "created_at": "2026-02-08T12:00:00.000Z"
  }
  ```

#### `DELETE /v1/webhooks/{id}` — Удалить вебхук

**Аутентификация:** `bearer`

**Параметры (path):**

- `id` (number) **required**

**Ответы:**
- `204` — Вебхук успешно удалён

#### `POST /v1/webhooks/{id}/test-notify` — Отправить тестовый запрос в вебхук

**Аутентификация:** `bearer`

**Параметры (path):**

- `id` (number) **required**

**Ответы:**
- `204` — Тестовый запрос в вебхук успешно отправлен
- `502` — Не удалось доставить тестовый вебхук
  - `application/json`: any, пример: `{"statusCode":502,"error_code":"webhook_test_delivery_failed","message":"Failed to deliver test webhook","meta":{"reason":"timeout","webhook_status":500}}`
  Пример:
  
  ```json
  {
    "statusCode": 502,
    "error_code": "webhook_test_delivery_failed",
    "message": "Failed to deliver test webhook",
    "meta": {
      "reason": "timeout",
      "webhook_status": 500
    }
  }
  ```

### Инциденты

#### `GET /v1/servers/{serverId}/incidents` — Получить инциденты сервера

**Аутентификация:** `bearer`

**Параметры (path):**

- `serverId` (number) **required**

**Ответы:**
- `200` — Инциденты сервера успешно получены
  - `application/json`: object
    - `id` (number, пример: `1`) **required** — ID инцидента
    - `server_id` (number, пример: `1`) **required** — ID сервера
    - `started_at` (string (date-time), пример: `"2023-01-01T00:00:00.000Z"`) **required** — Время начала инцидента
    - `ended_at` (object | null) **required** — Время окончания инцидента
    - `status` (string, enum: "ongoing", "resolved", "dismissed", "auto_closed_changed", "auto_closed_timeout", пример: `"resolved"`) **required** — Статус инцидента
    - `root_error` (string) **required** — Основная ошибка проверки сервера
    - `keyword` (object | null) **required** — Ключевое слово, которое искали при типе проверки keyword
    - `screenshot` (object) **required** — Ссылка на скриншот страницы
    - `replay` (object) **required** — Команда для повтора запроса
    - `details` (object) **required** — Детали проваленной проверки
  Пример:
  
  ```json
  {
    "id": 1,
    "server_id": 1,
    "started_at": "2023-01-01T00:00:00.000Z",
    "ended_at": "2023-01-02T00:00:00.000Z",
    "status": "resolved",
    "root_error": "",
    "keyword": "simple",
    "screenshot": "https://s3.statuser.cloud/sreenshots/img.png",
    "replay": "curl -X GET 1.1.1.1",
    "details": {}
  }
  ```
- `404` — Сервер не найден

#### `GET /v1/incidents/{incidentId}` — Получить инцидент

**Аутентификация:** `bearer`

**Параметры (path):**

- `incidentId` (number) **required**

**Ответы:**
- `200` — Инцидент успешно получен
  - `application/json`: object
    - `id` (number, пример: `1`) **required** — ID инцидента
    - `server_id` (number, пример: `1`) **required** — ID сервера
    - `started_at` (string (date-time), пример: `"2023-01-01T00:00:00.000Z"`) **required** — Время начала инцидента
    - `ended_at` (object | null) **required** — Время окончания инцидента
    - `status` (string, enum: "ongoing", "resolved", "dismissed", "auto_closed_changed", "auto_closed_timeout", пример: `"resolved"`) **required** — Статус инцидента
    - `root_error` (string) **required** — Основная ошибка проверки сервера
    - `keyword` (object | null) **required** — Ключевое слово, которое искали при типе проверки keyword
    - `screenshot` (object) **required** — Ссылка на скриншот страницы
    - `replay` (object) **required** — Команда для повтора запроса
    - `details` (object) **required** — Детали проваленной проверки
  Пример:
  
  ```json
  {
    "id": 1,
    "server_id": 1,
    "started_at": "2023-01-01T00:00:00.000Z",
    "ended_at": "2023-01-02T00:00:00.000Z",
    "status": "resolved",
    "root_error": "",
    "keyword": "simple",
    "screenshot": "https://s3.statuser.cloud/sreenshots/img.png",
    "replay": "curl -X GET 1.1.1.1",
    "details": {}
  }
  ```
- `404` — Инцидент не найден

#### `GET /v1/incidents` — Получить все инциденты на аккаунте

**Аутентификация:** `bearer`

**Параметры (query):**

- `status` (string, enum: "ongoing", "resolved", "dismissed", "auto_closed_changed", "auto_closed_timeout") — Статус инцидента (опционально)

**Ответы:**
- `200` — Инциденты успешно получены
  - `application/json`: object
    - `id` (number, пример: `1`) **required** — ID инцидента
    - `server_id` (number, пример: `1`) **required** — ID сервера
    - `started_at` (string (date-time), пример: `"2023-01-01T00:00:00.000Z"`) **required** — Время начала инцидента
    - `ended_at` (object | null) **required** — Время окончания инцидента
    - `status` (string, enum: "ongoing", "resolved", "dismissed", "auto_closed_changed", "auto_closed_timeout", пример: `"resolved"`) **required** — Статус инцидента
    - `root_error` (string) **required** — Основная ошибка проверки сервера
    - `keyword` (object | null) **required** — Ключевое слово, которое искали при типе проверки keyword
    - `screenshot` (object) **required** — Ссылка на скриншот страницы
    - `replay` (object) **required** — Команда для повтора запроса
    - `details` (object) **required** — Детали проваленной проверки
  Пример:
  
  ```json
  {
    "id": 1,
    "server_id": 1,
    "started_at": "2023-01-01T00:00:00.000Z",
    "ended_at": "2023-01-02T00:00:00.000Z",
    "status": "resolved",
    "root_error": "",
    "keyword": "simple",
    "screenshot": "https://s3.statuser.cloud/sreenshots/img.png",
    "replay": "curl -X GET 1.1.1.1",
    "details": {}
  }
  ```

#### `GET /v1/incidents/{incidentId}/events` — Получить события инцидента

**Аутентификация:** `bearer`

**Параметры (path):**

- `incidentId` (number) **required**

**Ответы:**
- `200` — События инцидента успешно получены
  - `application/json`: object
    - `created_at` (string (date-time), пример: `"2023-01-01T00:00:00.000Z"`) **required** — Время создания события
    - `type` (string, enum: "error", "resolved", "notification", "comment", "start", "end", пример: `"end"`) **required** — Тип события
    - `meta` (`ErrorMeta` | `NotificationMeta` | `CommentMeta` | null) **required** — Метаданные события
  Пример:
  
  ```json
  {
    "created_at": "2023-01-01T00:00:00.000Z",
    "type": "end",
    "meta": null
  }
  ```
- `404` — Инцидент не найден

#### `GET /v1/incidents/{incidentId}/server` — Получить сервер по инциденту

**Аутентификация:** `bearer`

**Параметры (path):**

- `incidentId` (number) **required**

**Ответы:**
- `200` — Сервер успешно получен
  - `application/json`: object
    - `id` (number, пример: `1`) **required** — ID сервера
    - `host` (string, пример: `"192.168.1.1"`) **required** — IP адрес сервера
    - `protocol` (string, пример: `"http"`) **required** — Протокол сервера
    - `heartbeat_token` (object | null) **required** — Токен для heartbeat URL (только для protocol=heartbeat)
    - `last_heartbeat_at` (object | null) **required** — Время последнего полученного heartbeat (только для protocol=heartbeat)
    - `heartbeat_grace_interval` (object | null) **required** — Допустимое опоздание в секундах для heartbeat: сколько ждать сверх check_interval
    - `port` (object) **required** — Порт для проверки tcp
    - `http_method` (string, enum: "head", "get", "options", "post", "put", "patch", пример: `"head"`) **required** — HTTP метод
    - `request_timeout` (number, пример: `"10"`) **required** — Таймаут запроса
    - `check_interval` (number, пример: `60`) **required** — Интервал проверки сервера в секундах
    - `name` (object) **required** — Название сервиса
    - `description` (object | null) **required** — Описание сервиса
    - `status` (string, пример: `"online"`) **required** — Текущий статус сервиса
    - `body` (object | null) **required** — Тело запроса для проверки
    - `keyword` (object | null) **required** — Ключевое слово для мониторинга
    - `keyword_mode` (string | null, enum: "present", "absent", пример: `"present"`) **required** — Режим проверки ключевого слова
    - `headers` (array of string) **required** — Собственные заголовки запроса
    - `is_follow_redirects` (boolean, пример: `true`) **required** — Следовать за редиректами или нет
    - `last_unavailable_at` (object) **required** — Время, когда сервер в последний раз стал недоступен (начало текущего или последнего инцидента)
    - `last_available_at` (object) **required** — Время, когда сервер в последний раз восстановил доступность (завершение последнего инцидента или последняя успешная проверка)
    - `last_checked_at` (object) **required** — Время последней проверки сервера
    - `is_ssl_check` (boolean, пример: `true`) **required** — Включены ли проверки SSL-сертификата
    - `ssl` (object) **required** — Информация о SSL-сертификате
    - `is_domain_check` (boolean, пример: `true`) **required** — Включены ли проверки времени окончания домена
    - `domain` (object) **required** — Информация о домене
    - `is_latency_alert_enabled` (boolean, пример: `true`) **required** — Включены ли уведомления о медленном ответе
    - `latency_trigger_ms` (number, пример: `800`) **required** — Порог в мс для перехода в состояние SLOW
    - `locations` (array of string) **required** — Локации, из которых выполняются проверки
    - `dns_record_types` (object | null) **required** — Типы DNS записей для мониторинга
    - `dns_records` (array of object | null) **required** — Текущие DNS записи домена
      - `record_type` (string, enum: "A", "AAAA", "CNAME", "MX", "TXT", "NS", "SOA", "PTR", "SRV", пример: `"A"`) **required** — Тип DNS записи
      - `records` (array of string) **required** — Структурированные значения DNS записей
    - `dns_error_code` (string | null, enum: "NODATA", "NXDOMAIN", "SERVFAIL", "REFUSED", "FORMERR", "NOTIMP", "UNKNOWN", пример: `"NODATA"`) **required** — Код последней DNS ошибки (только для protocol=dns)
    - `created_at` (string (date-time), пример: `"2023-01-01T00:00:00.000Z"`) **required** — Время создания сервера
  Пример:
  
  ```json
  {
    "id": 1,
    "host": "192.168.1.1",
    "protocol": "http",
    "heartbeat_token": "550e8400-e29b-41d4-a716-446655440000",
    "last_heartbeat_at": "2025-12-31T23:59:59.000Z",
    "heartbeat_grace_interval": 300,
    "port": "22",
    "http_method": "head",
    "request_timeout": "10",
    "check_interval": 60,
    "name": "Восхитительный сервер",
    "description": "Восхитительный сервер для проверки статуса",
    "status": "online",
    "body": "{\"key\": \"value\"}",
    "keyword": "Welcome",
    "keyword_mode": "present",
    "headers": "{\"Authorization\": \"Bearer token\"}",
    "is_follow_redirects": true,
    "last_unavailable_at": "2023-01-02T00:00:00.000Z",
    "last_available_at": "2023-01-03T12:34:56.000Z",
    "last_checked_at": "2023-01-02T00:00:00.000Z",
    "is_ssl_check": true,
    "ssl": {},
    "is_domain_check": true,
    "domain": {},
    "is_latency_alert_enabled": true,
    "latency_trigger_ms": 800,
    "locations": [
      "msk-1",
      "ams-1",
      "ala-1"
    ],
    "dns_record_types": [
      "A",
      "AAAA",
      "MX"
    ],
    "dns_records": [
      {
        "record_type": "A",
        "records": [
          {
            "value": "192.168.1.1"
          },
          {
            "value": "192.168.1.2"
          },
          {
            "priority": 10,
            "exchange": "mail.example.com"
          },
          {
            "priority": 10,
            "weight": 5,
            "port": 443,
            "target": "service.example.com"
          }
        ]
      }
    ],
    "dns_error_code": "NODATA",
    "created_at": "2023-01-01T00:00:00.000Z"
  }
  ```
- `404` — Инцидент не найден

#### `GET /v1/incidents/{incidentId}/report` — Скачать PDF отчет по инциденту

**Аутентификация:** `bearer`

**Параметры (path):**

- `incidentId` (number) **required**

**Параметры (query):**

- `sections` (array of string, enum: "ai_summary", "diagnostics", "technical_reference", "events") — Секции, которые будут включены в отчет. Требуется передавать как repeated query (?sections=ai_summary&sections=events)

**Ответы:**
- `200` — PDF отчет по инциденту успешно сформирован
- `403` — PDF отчет по инциденту недоступен на текущем тарифе
- `404` — Инцидент не найден

#### `POST /v1/incidents/{incidentId}/ai-summary` — Сгенерировать AI саммари инцидента

**Аутентификация:** `bearer`

**Параметры (path):**

- `incidentId` (number) **required**

**Ответы:**
- `200` — AI саммари успешно сгенерировано
  - `application/json`: object
    - `summary` (object) **required** — Сгенерированное ИИ саммари диагностики инцидента
    - `rating` (string | null, enum: "positive", "negative", пример: `"positive"`) **required** — Оценка саммари пользователем
  Пример:
  
  ```json
  {
    "summary": "Сервер недоступен из-за сетевого таймаута...",
    "rating": "positive"
  }
  ```
- `404` — Инцидент не найден

#### `POST /v1/incidents/{incidentId}/ai-summary/rating` — Оценить AI саммари инцидента

**Аутентификация:** `bearer`

**Параметры (path):**

- `incidentId` (number) **required**

**Тело запроса** (обязательное)

Content-Type: `application/json`

object
  - `rating` (string | null, enum: "positive", "negative", пример: `"positive"`) **required** — Оценка саммари

Пример:

```json
{
  "rating": "positive"
}
```

**Ответы:**
- `200` — Оценка успешно сохранена
  - `application/json`: object
    - `summary` (object) **required** — Сгенерированное ИИ саммари диагностики инцидента
    - `rating` (string | null, enum: "positive", "negative", пример: `"positive"`) **required** — Оценка саммари пользователем
  Пример:
  
  ```json
  {
    "summary": "Сервер недоступен из-за сетевого таймаута...",
    "rating": "positive"
  }
  ```
- `404` — Инцидент не найден

#### `GET /v1/incidents/{incidentId}/comments` — Получить все комментарии к инциденту

**Аутентификация:** `bearer`

**Параметры (path):**

- `incidentId` (number) **required**

**Ответы:**
- `200` — Комментарии успешно получены
  - `application/json`: array of object
    - `id` (number, пример: `1`) **required** — ID комментария
    - `comment_text` (string, пример: `"Комментарий"`) **required** — Текст комментария
    - `attached_files` (array of object) **required** — Прикрепленные к комментарию файлы
      - `url` (string, пример: `"https://s3.statuser.cloud/incident-attachments-dev/uuid.png"`) **required** — URL вложенного файла
      - `file_name` (string, пример: `"error-screenshot.png"`) **required** — Имя вложенного файла
    - `created_at` (string (date-time), пример: `"2023-01-01T00:00:00.000Z"`) **required** — Дата создания комментария
    - `updated_at` (string (date-time), пример: `"2023-01-01T00:00:00.000Z"`) **required** — Дата обновления комментария
  Пример:
  
  ```json
  [
    {
      "id": 1,
      "comment_text": "Комментарий",
      "attached_files": [],
      "created_at": "2023-01-01T00:00:00.000Z",
      "updated_at": "2023-01-01T00:00:00.000Z"
    }
  ]
  ```

#### `POST /v1/incidents/{incidentId}/comments` — Создать комментарий к инциденту

**Аутентификация:** `bearer`

**Параметры (path):**

- `incidentId` (number) **required**

**Тело запроса** (обязательное)

Content-Type: `application/json`

object
  - `comment_text` (string, пример: `"Текст комментария"`) **required** — Текст комментария
  - `attached_files` (array of object) — Список прикрепленных файлов
    - `url` (string, пример: `"https://s3.statuser.cloud/incident-attachments-dev/uuid.png"`) **required** — URL вложенного файла
    - `file_name` (string, пример: `"error-screenshot.png"`) **required** — Имя вложенного файла

Пример:

```json
{
  "comment_text": "Текст комментария",
  "attached_files": [
    {
      "url": "https://s3.statuser.cloud/incident-attachments-dev/uuid.png",
      "file_name": "error-screenshot.png"
    }
  ]
}
```

**Ответы:**
- `201` — Комментарий успешно создан
  - `application/json`: object
    - `id` (number, пример: `1`) **required** — ID комментария
    - `comment_text` (string, пример: `"Комментарий"`) **required** — Текст комментария
    - `attached_files` (array of object) **required** — Прикрепленные к комментарию файлы
      - `url` (string, пример: `"https://s3.statuser.cloud/incident-attachments-dev/uuid.png"`) **required** — URL вложенного файла
      - `file_name` (string, пример: `"error-screenshot.png"`) **required** — Имя вложенного файла
    - `created_at` (string (date-time), пример: `"2023-01-01T00:00:00.000Z"`) **required** — Дата создания комментария
    - `updated_at` (string (date-time), пример: `"2023-01-01T00:00:00.000Z"`) **required** — Дата обновления комментария
  Пример:
  
  ```json
  {
    "id": 1,
    "comment_text": "Комментарий",
    "attached_files": [],
    "created_at": "2023-01-01T00:00:00.000Z",
    "updated_at": "2023-01-01T00:00:00.000Z"
  }
  ```

#### `POST /v1/incidents/{incidentId}/comments/upload-url` — Получить ссылку для загрузки вложения к комментарию инцидента

**Аутентификация:** `bearer`

**Параметры (path):**

- `incidentId` (number) **required**

**Тело запроса** (обязательное)

Content-Type: `application/json`

object
  - `file_name` (string, пример: `"incident-log.txt"`) **required** — Имя файла для загрузки
  - `content_type` (string, пример: `"text/plain"`) — MIME-тип файла
  - `file_size` (number, пример: `1024`) — Размер файла в байтах

Пример:

```json
{
  "file_name": "incident-log.txt",
  "content_type": "text/plain",
  "file_size": 1024
}
```

**Ответы:**
- `201` — Ссылка успешно получена
  - `application/json`: object
    - `uploadUrl` (string, пример: `"https://s3.timeweb.cloud/..."`) **required**
    - `fileUrl` (string, пример: `"https://s3.statuser.cloud/status-pages/..."`) **required**
  Пример:
  
  ```json
  {
    "uploadUrl": "https://s3.timeweb.cloud/...",
    "fileUrl": "https://s3.statuser.cloud/status-pages/..."
  }
  ```

#### `PATCH /v1/incidents/{incidentId}/comments/{commentId}` — Обновить комментарий

**Аутентификация:** `bearer`

**Параметры (path):**

- `incidentId` (number) **required**
- `commentId` (number) **required**

**Тело запроса** (обязательное)

Content-Type: `application/json`

object
  - `comment_text` (string, пример: `"Текст комментария"`) — Текст комментария
  - `attached_files` (array of object) — Список прикрепленных файлов с именами
    - `url` (string, пример: `"https://s3.statuser.cloud/incident-attachments-dev/uuid.png"`) **required** — URL вложенного файла
    - `file_name` (string, пример: `"error-screenshot.png"`) **required** — Имя вложенного файла

Пример:

```json
{
  "comment_text": "Текст комментария",
  "attached_files": [
    {
      "url": "https://s3.statuser.cloud/incident-attachments-dev/uuid.png",
      "file_name": "error-screenshot.png"
    }
  ]
}
```

**Ответы:**
- `200` — Комментарий успешно обновлен
  - `application/json`: object
    - `id` (number, пример: `1`) **required** — ID комментария
    - `comment_text` (string, пример: `"Комментарий"`) **required** — Текст комментария
    - `attached_files` (array of object) **required** — Прикрепленные к комментарию файлы
      - `url` (string, пример: `"https://s3.statuser.cloud/incident-attachments-dev/uuid.png"`) **required** — URL вложенного файла
      - `file_name` (string, пример: `"error-screenshot.png"`) **required** — Имя вложенного файла
    - `created_at` (string (date-time), пример: `"2023-01-01T00:00:00.000Z"`) **required** — Дата создания комментария
    - `updated_at` (string (date-time), пример: `"2023-01-01T00:00:00.000Z"`) **required** — Дата обновления комментария
  Пример:
  
  ```json
  {
    "id": 1,
    "comment_text": "Комментарий",
    "attached_files": [],
    "created_at": "2023-01-01T00:00:00.000Z",
    "updated_at": "2023-01-01T00:00:00.000Z"
  }
  ```

#### `DELETE /v1/incidents/{incidentId}/comments/{commentId}` — Удалить комментарий

**Аутентификация:** `bearer`

**Параметры (path):**

- `incidentId` (number) **required**
- `commentId` (number) **required**

**Ответы:**
- `204` — Комментарий успешно удалён
- `404` — Комментарий не найден

### Страницы статуса

#### `GET /v1/status-pages/check-slug/{slug}` — Проверить, свободен ли путь

**Аутентификация:** `bearer`

**Параметры (path):**

- `slug` (string) **required**

**Ответы:**
- `200` — Результат проверки пути
  - `application/json`: object
    - `available` (boolean, пример: `true`) **required** — Флаг, указывающий, свободен ли путь
  Пример:
  
  ```json
  {
    "available": true
  }
  ```

#### `GET /v1/status-pages/check-domain/{domain}` — Проверить, свободен ли домен

**Аутентификация:** `bearer`

**Параметры (path):**

- `domain` (string) **required**

**Ответы:**
- `200` — Результат проверки домена
  - `application/json`: object
    - `available` (boolean, пример: `true`) **required** — Флаг, указывающий, не занят ли домен другой страницей статуса
    - `cname_valid` (boolean, пример: `true`) **required** — Флаг, указывающий, корректно ли настроена CNAME-запись
  Пример:
  
  ```json
  {
    "available": true,
    "cname_valid": true
  }
  ```

#### `POST /v1/status-pages/{id}/upload-url` — Получить ссылку для загрузки логотипа или фавикона

**Аутентификация:** `bearer`

**Параметры (path):**

- `id` (number) **required**

**Тело запроса** (обязательное)

Content-Type: `application/json`

object
  - `type` (string, enum: "logo", "favicon") **required**

Пример:

```json
{
  "type": "logo"
}
```

**Ответы:**
- `201` — Ссылка успешно получена
  - `application/json`: any, пример: `{"uploadUrl":"https://s3.timeweb.cloud/...","fileUrl":"https://s3.statuser.cloud/status-pages/..."}`
  Пример:
  
  ```json
  {
    "uploadUrl": "https://s3.timeweb.cloud/...",
    "fileUrl": "https://s3.statuser.cloud/status-pages/..."
  }
  ```

#### `GET /v1/status-pages` — Получить все страницы статуса на аккаунте

**Аутентификация:** `bearer`

**Ответы:**
- `200` — Страницы статуса успешно получены
  - `application/json`: array of object
    - `id` (number, пример: `1`) **required** — ID страницы статуса
    - `name` (string, пример: `"Statuser"`) **required** — Название страницы статуса
    - `status` (string, пример: `"operational"`) **required** — Общий статус сервисов
    - `slug` (string, пример: `"statuser"`) **required** — Уникальный путь страницы статуса
    - `description` (object | null) **required** — Описание страницы статуса
    - `logo_url` (object | null) **required** — URL логотипа
    - `favicon_url` (object | null) **required** — URL фавикона
    - `company_url` (object | null) **required** — URL сайта компании
    - `support_url` (object | null) **required** — Email службы поддержки
    - `domains` (array of object) **required** — Привязанные к странице статуса домены
      - `domain` (string, пример: `"up.example.com"`) **required** — Домен страницы статуса
      - `status` (string, пример: `"active"`) **required** — Статус домена
    - `is_indexed` (boolean, пример: `true`) **required** — Индексируется ли страница поисковиками
    - `is_published` (boolean, пример: `true`) **required** — Опубликована ли страница
    - `is_white_labeled` (boolean, пример: `false`) **required** — Вайт-лейблинг: скрыт ли бренд Statuser
    - `timeline_days` (number, пример: `60`) **required** — Количество дней, показываемых в таймлайне
    - `timezone` (string, пример: `"Europe/Moscow"`) **required** — Таймзона страницы статуса
    - `uptime_decimal_places` (number, пример: `2`) **required** — Количество знаков после запятой у аптайма
    - `theme_mode` (string, enum: "user", "light", "dark", пример: `"user"`) **required** — Режим темы страницы статуса
    - `is_not_monitored_operational` (boolean, пример: `false`) **required** — Показывать ли статус Не в мониторинге зелёным, как Доступен
    - `minimum_incident_duration` (number, пример: `0`) **required** — Минимальная длительность инцидента в секундах для отображения на странице
    - `is_password_protected` (boolean, пример: `true`) **required** — Защищена ли страница статуса паролем
    - `servers` (array of object) **required** — Список серверов, добавленных на страницу статуса
      - `name` (string, пример: `"My Server"`) **required** — Публичное имя сервера на странице статуса
      - `description` (string | null, пример: `"My Server"`) **required** — Комментарий к серверу
      - `uptime` (number, пример: `99.93`) **required** — Общее время безотказной работы сервера в процентах
      - `current_status` (string, enum: "operational", "downtime", "not_monitored", "degraded", "under_maintenance", пример: `"operational"`) **required** — Статус доступности сервера
      - `order` (number, пример: `99.93`) **required** — Общее время безотказной работы сервера в процентах
      - `group_id` (number, пример: `1`) **required** — Идентификатор группы серверов
      - `availability` (array of array of `unknown`) **required** — Доступность сервера по датам
    - `groups` (array of object) **required** — Список групп серверов
      - `id` (number, пример: `1`) **required** — Идентификатор группы
      - `name` (string, пример: `"Бэкенд-сервисы"`) **required** — Имя группы
      - `description` (string | null, пример: `"Группа для основных API-сервисов"`) **required** — Описание группы
      - `order` (number, пример: `0`) **required** — Порядок отображения группы
      - `status` (string, пример: `"operational"`) **required** — Статус группы
    - `incident_reports` (array of object) **required** — Публичные отчёты по инцидентам на странице статуса
      - `id` (number, пример: `10100`) **required** — ID отчёта
      - `title` (string, пример: `"Проблемы с доступностью API Gateway"`) **required** — Заголовок отчёта
      - `started_at` (string (date-time), пример: `"2026-03-06T16:10:00.000Z"`) **required** — Время начала отчёта
      - `current_status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Текущий статус отчёта по последнему известному состоянию сервисов
      - `incidents` (array of object) **required** — Инциденты, связанные с отчётом
        - `incident_id` (number, пример: `42`) **required** — ID инцидента
        - `server_id` (number, пример: `7`) **required** — ID сервера, к которому относится инцидент
        - `server_name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервера на странице статуса
        - `status` (string, enum: "ongoing", "resolved", "dismissed", "auto_closed_changed", "auto_closed_timeout", пример: `"ongoing"`) **required** — Статус инцидента
        - `started_at` (string (date-time), пример: `"2026-03-06T16:10:00.000Z"`) **required** — Время начала инцидента
        - `ended_at` (object | null) **required** — Время окончания инцидента
      - `servers` (array of object) **required** — Актуальные статусы сервисов внутри отчёта
        - `id` (number, пример: `1`) **required** — ID сервиса на status page
        - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
        - `status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Статус влияния на сервис
      - `updates` (array of object) **required** — Таймлайн сообщений внутри отчёта
        - `id` (number, пример: `10100`) **required** — ID обновления внутри отчёта
        - `message` (string, пример: `"Мы нашли причину сбоя и уже выкатываем исправление. Следующее обновление через 10 минут"`) **required** — Текст апдейта
        - `is_initial` (boolean, пример: `true`) **required** — Является ли запись стартовым сообщением отчёта
        - `published_at` (string (date-time), пример: `"2026-03-06T16:12:00.000Z"`) **required** — Когда обновление было опубликовано
        - `servers` (array of object) **required** — Статусы серверов на момент этого обновления
          - `id` (number, пример: `1`) **required** — ID сервиса на status page
          - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
          - `status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Статус влияния на сервис
    - `planned_maintenances` (array of object) **required** — Плановые работы на странице статуса
      - `id` (number, пример: `10100`) **required** — ID плановых работ
      - `title` (string, пример: `"Плановое обновление API Gateway"`) **required** — Заголовок плановых работ
      - `description` (string, пример: `"Во время обновления возможны кратковременные перерывы в работе API и панели управления."`) **required** — Описание плановых работ
      - `started_at` (string (date-time), пример: `"2026-03-20T01:00:00.000Z"`) **required** — Время начала плановых работ
      - `ended_at` (string (date-time), пример: `"2026-03-20T03:00:00.000Z"`) **required** — Время завершения плановых работ
      - `servers` (array of object) **required** — Сервисы на странице статуса, затрагиваемые плановыми работами
        - `id` (number, пример: `1`) **required** — ID сервиса на status page
        - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
      - `updates` (array of object) **required** — История обновлений по плановым работам
        - `id` (number, пример: `10100`) **required** — ID обновления внутри записи плановых работ
        - `message` (string, пример: `"Работы идут по плану. Возможны кратковременные перерывы в работе API."`) **required** — Текст апдейта
        - `is_initial` (boolean, пример: `true`) **required** — Является ли запись стартовым сообщением
        - `published_at` (string (date-time), пример: `"2026-03-06T16:12:00.000Z"`) **required** — Когда обновление было опубликовано
        - `servers` (array of object) **required** — Сервисы, которых касается это обновление
          - `id` (number, пример: `1`) **required** — ID сервиса на status page
          - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
      - `created_at` (string (date-time), пример: `"2026-03-18T12:00:00.000Z"`) **required** — Дата создания записи
    - `created_at` (string (date-time), пример: `"2024-01-01T00:00:00.000Z"`) **required** — Дата создания страницы статуса
  Пример:
  
  ```json
  [
    {
      "id": 1,
      "name": "Statuser",
      "status": "operational",
      "slug": "statuser",
      "description": "Описание страницы статуса",
      "logo_url": "https://example.com/logo.png",
      "favicon_url": "https://example.com/favicon.png",
      "company_url": "https://example.com",
      "support_url": "support@example.com",
      "domains": [
        {
          "domain": "up.example.com",
          "status": "active"
        }
      ],
      "is_indexed": true,
      "is_published": true,
      "is_white_labeled": false,
      "timeline_days": 60,
      "timezone": "Europe/Moscow",
      "uptime_decimal_places": 2,
      "theme_mode": "user",
      "is_not_monitored_operational": false,
      "minimum_incident_duration": 0,
      "is_password_protected": true,
      "servers": [
        {
          "name": "My Server",
          "description": "My Server",
          "uptime": 99.93,
          "current_status": "operational",
          "order": 99.93,
          "group_id": 1,
          "availability": [
            [
              null
            ]
          ]
        }
      ],
      "groups": [
        {
          "id": 1,
          "name": "Бэкенд-сервисы",
          "description": "Группа для основных API-сервисов",
          "order": 0,
          "status": "operational"
        }
      ],
      "incident_reports": [
        {
          "id": 10100,
          "title": "Проблемы с доступностью API Gateway",
          "started_at": "2026-03-06T16:10:00.000Z",
          "current_status": "degraded",
          "incidents": [
            {
              "incident_id": 42,
              "server_id": 7,
              "server_name": "API Gateway",
              "status": "ongoing",
              "started_at": "2026-03-06T16:10:00.000Z",
              "ended_at": "2026-03-06T16:45:00.000Z"
            }
          ],
          "servers": [
            {
              "id": 1,
              "name": "API Gateway",
              "status": "degraded"
            }
          ],
          "updates": [
            {
              "id": 10100,
              "message": "Мы нашли причину сбоя и уже выкатываем исправление. Следующее обновление через 10 минут",
              "is_initial": true,
              "published_at": "2026-03-06T16:12:00.000Z",
              "servers": [
                {
                  "id": 1,
                  "name": "API Gateway",
                  "status": "degraded"
                }
              ]
            }
          ]
        }
      ],
      "planned_maintenances": [
        {
          "id": 10100,
          "title": "Плановое обновление API Gateway",
          "description": "Во время обновления возможны кратковременные перерывы в работе API и панели управления.",
          "started_at": "2026-03-20T01:00:00.000Z",
          "ended_at": "2026-03-20T03:00:00.000Z",
          "servers": [
            {
              "id": 1,
              "name": "API Gateway"
            }
          ],
          "updates": [
            {
              "id": 10100,
              "message": "Работы идут по плану. Возможны кратковременные перерывы в работе API.",
              "is_initial": true,
              "published_at": "2026-03-06T16:12:00.000Z",
              "servers": [
                {
                  "id": 1,
                  "name": "API Gateway"
                }
              ]
            }
          ],
          "created_at": "2026-03-18T12:00:00.000Z"
        }
      ],
      "created_at": "2024-01-01T00:00:00.000Z"
    }
  ]
  ```

#### `POST /v1/status-pages` — Создать новую страницу статуса

**Аутентификация:** `bearer`

**Тело запроса** (обязательное)

Content-Type: `application/json`

object
  - `name` (string, пример: `"Statuser"`) **required** — Название страницы статуса
  - `slug` (string | null, пример: `"statuser"`) **required** — Уникальный путь страницы статуса
  - `description` (object | null) **required** — Описание страницы статуса
  - `logo_url` (object | null) **required** — URL логотипа
  - `favicon_url` (object | null) **required** — URL фавикона
  - `company_url` (object | null) **required** — URL сайта компании
  - `support_url` (object | null) **required** — Email службы поддержки
  - `domain` (object | null) **required** — Собственный домен страницы статуса
  - `is_indexed` (boolean, пример: `true`) **required** — Индексируется ли страница поисковиками
  - `is_published` (boolean, пример: `true`) **required** — Опубликована ли страница
  - `is_white_labeled` (boolean, пример: `false`) **required** — Вайт-лейблинг: скрыть бренд Statuser
  - `timeline_days` (number, пример: `60`) — Количество дней таймлайна на странице статуса
  - `timezone` (string, пример: `"Europe/Moscow"`) — Таймзона, в которой считаются дни на странице статуса
  - `uptime_decimal_places` (number, пример: `2`) — Количество знаков после запятой для аптайма
  - `theme_mode` (string, enum: "user", "light", "dark", пример: `"user"`) — Режим темы страницы статуса
  - `is_not_monitored_operational` (boolean, пример: `false`) — Показывать ли статус Не в мониторинге зелёным, как Доступен
  - `minimum_incident_duration` (number, пример: `0`) — Минимальная длительность инцидента в секундах для отображения на странице
  - `password` (object | null) **required** — Пароль для доступа к странице статуса

Пример:

```json
{
  "name": "Statuser",
  "slug": "statuser",
  "description": "Описание страницы статуса",
  "logo_url": "https://example.com/logo.png",
  "favicon_url": "https://example.com/favicon.png",
  "company_url": "https://example.com",
  "support_url": "support@example.com",
  "domain": "status.example.com",
  "is_indexed": true,
  "is_published": true,
  "is_white_labeled": false,
  "timeline_days": 60,
  "timezone": "Europe/Moscow",
  "uptime_decimal_places": 2,
  "theme_mode": "user",
  "is_not_monitored_operational": false,
  "minimum_incident_duration": 0,
  "password": "mysecretpassword"
}
```

**Ответы:**
- `201` — Страница статуса успешно создана
  - `application/json`: object
    - `id` (number, пример: `1`) **required** — ID страницы статуса
    - `name` (string, пример: `"Statuser"`) **required** — Название страницы статуса
    - `status` (string, пример: `"operational"`) **required** — Общий статус сервисов
    - `slug` (string, пример: `"statuser"`) **required** — Уникальный путь страницы статуса
    - `description` (object | null) **required** — Описание страницы статуса
    - `logo_url` (object | null) **required** — URL логотипа
    - `favicon_url` (object | null) **required** — URL фавикона
    - `company_url` (object | null) **required** — URL сайта компании
    - `support_url` (object | null) **required** — Email службы поддержки
    - `domains` (array of object) **required** — Привязанные к странице статуса домены
      - `domain` (string, пример: `"up.example.com"`) **required** — Домен страницы статуса
      - `status` (string, пример: `"active"`) **required** — Статус домена
    - `is_indexed` (boolean, пример: `true`) **required** — Индексируется ли страница поисковиками
    - `is_published` (boolean, пример: `true`) **required** — Опубликована ли страница
    - `is_white_labeled` (boolean, пример: `false`) **required** — Вайт-лейблинг: скрыт ли бренд Statuser
    - `timeline_days` (number, пример: `60`) **required** — Количество дней, показываемых в таймлайне
    - `timezone` (string, пример: `"Europe/Moscow"`) **required** — Таймзона страницы статуса
    - `uptime_decimal_places` (number, пример: `2`) **required** — Количество знаков после запятой у аптайма
    - `theme_mode` (string, enum: "user", "light", "dark", пример: `"user"`) **required** — Режим темы страницы статуса
    - `is_not_monitored_operational` (boolean, пример: `false`) **required** — Показывать ли статус Не в мониторинге зелёным, как Доступен
    - `minimum_incident_duration` (number, пример: `0`) **required** — Минимальная длительность инцидента в секундах для отображения на странице
    - `is_password_protected` (boolean, пример: `true`) **required** — Защищена ли страница статуса паролем
    - `servers` (array of object) **required** — Список серверов, добавленных на страницу статуса
      - `name` (string, пример: `"My Server"`) **required** — Публичное имя сервера на странице статуса
      - `description` (string | null, пример: `"My Server"`) **required** — Комментарий к серверу
      - `uptime` (number, пример: `99.93`) **required** — Общее время безотказной работы сервера в процентах
      - `current_status` (string, enum: "operational", "downtime", "not_monitored", "degraded", "under_maintenance", пример: `"operational"`) **required** — Статус доступности сервера
      - `order` (number, пример: `99.93`) **required** — Общее время безотказной работы сервера в процентах
      - `group_id` (number, пример: `1`) **required** — Идентификатор группы серверов
      - `availability` (array of array of `unknown`) **required** — Доступность сервера по датам
    - `groups` (array of object) **required** — Список групп серверов
      - `id` (number, пример: `1`) **required** — Идентификатор группы
      - `name` (string, пример: `"Бэкенд-сервисы"`) **required** — Имя группы
      - `description` (string | null, пример: `"Группа для основных API-сервисов"`) **required** — Описание группы
      - `order` (number, пример: `0`) **required** — Порядок отображения группы
      - `status` (string, пример: `"operational"`) **required** — Статус группы
    - `incident_reports` (array of object) **required** — Публичные отчёты по инцидентам на странице статуса
      - `id` (number, пример: `10100`) **required** — ID отчёта
      - `title` (string, пример: `"Проблемы с доступностью API Gateway"`) **required** — Заголовок отчёта
      - `started_at` (string (date-time), пример: `"2026-03-06T16:10:00.000Z"`) **required** — Время начала отчёта
      - `current_status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Текущий статус отчёта по последнему известному состоянию сервисов
      - `incidents` (array of object) **required** — Инциденты, связанные с отчётом
        - `incident_id` (number, пример: `42`) **required** — ID инцидента
        - `server_id` (number, пример: `7`) **required** — ID сервера, к которому относится инцидент
        - `server_name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервера на странице статуса
        - `status` (string, enum: "ongoing", "resolved", "dismissed", "auto_closed_changed", "auto_closed_timeout", пример: `"ongoing"`) **required** — Статус инцидента
        - `started_at` (string (date-time), пример: `"2026-03-06T16:10:00.000Z"`) **required** — Время начала инцидента
        - `ended_at` (object | null) **required** — Время окончания инцидента
      - `servers` (array of object) **required** — Актуальные статусы сервисов внутри отчёта
        - `id` (number, пример: `1`) **required** — ID сервиса на status page
        - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
        - `status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Статус влияния на сервис
      - `updates` (array of object) **required** — Таймлайн сообщений внутри отчёта
        - `id` (number, пример: `10100`) **required** — ID обновления внутри отчёта
        - `message` (string, пример: `"Мы нашли причину сбоя и уже выкатываем исправление. Следующее обновление через 10 минут"`) **required** — Текст апдейта
        - `is_initial` (boolean, пример: `true`) **required** — Является ли запись стартовым сообщением отчёта
        - `published_at` (string (date-time), пример: `"2026-03-06T16:12:00.000Z"`) **required** — Когда обновление было опубликовано
        - `servers` (array of object) **required** — Статусы серверов на момент этого обновления
          - `id` (number, пример: `1`) **required** — ID сервиса на status page
          - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
          - `status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Статус влияния на сервис
    - `planned_maintenances` (array of object) **required** — Плановые работы на странице статуса
      - `id` (number, пример: `10100`) **required** — ID плановых работ
      - `title` (string, пример: `"Плановое обновление API Gateway"`) **required** — Заголовок плановых работ
      - `description` (string, пример: `"Во время обновления возможны кратковременные перерывы в работе API и панели управления."`) **required** — Описание плановых работ
      - `started_at` (string (date-time), пример: `"2026-03-20T01:00:00.000Z"`) **required** — Время начала плановых работ
      - `ended_at` (string (date-time), пример: `"2026-03-20T03:00:00.000Z"`) **required** — Время завершения плановых работ
      - `servers` (array of object) **required** — Сервисы на странице статуса, затрагиваемые плановыми работами
        - `id` (number, пример: `1`) **required** — ID сервиса на status page
        - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
      - `updates` (array of object) **required** — История обновлений по плановым работам
        - `id` (number, пример: `10100`) **required** — ID обновления внутри записи плановых работ
        - `message` (string, пример: `"Работы идут по плану. Возможны кратковременные перерывы в работе API."`) **required** — Текст апдейта
        - `is_initial` (boolean, пример: `true`) **required** — Является ли запись стартовым сообщением
        - `published_at` (string (date-time), пример: `"2026-03-06T16:12:00.000Z"`) **required** — Когда обновление было опубликовано
        - `servers` (array of object) **required** — Сервисы, которых касается это обновление
          - `id` (number, пример: `1`) **required** — ID сервиса на status page
          - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
      - `created_at` (string (date-time), пример: `"2026-03-18T12:00:00.000Z"`) **required** — Дата создания записи
    - `created_at` (string (date-time), пример: `"2024-01-01T00:00:00.000Z"`) **required** — Дата создания страницы статуса
  Пример:
  
  ```json
  {
    "id": 1,
    "name": "Statuser",
    "status": "operational",
    "slug": "statuser",
    "description": "Описание страницы статуса",
    "logo_url": "https://example.com/logo.png",
    "favicon_url": "https://example.com/favicon.png",
    "company_url": "https://example.com",
    "support_url": "support@example.com",
    "domains": [
      {
        "domain": "up.example.com",
        "status": "active"
      }
    ],
    "is_indexed": true,
    "is_published": true,
    "is_white_labeled": false,
    "timeline_days": 60,
    "timezone": "Europe/Moscow",
    "uptime_decimal_places": 2,
    "theme_mode": "user",
    "is_not_monitored_operational": false,
    "minimum_incident_duration": 0,
    "is_password_protected": true,
    "servers": [
      {
        "name": "My Server",
        "description": "My Server",
        "uptime": 99.93,
        "current_status": "operational",
        "order": 99.93,
        "group_id": 1,
        "availability": [
          [
            null
          ]
        ]
      }
    ],
    "groups": [
      {
        "id": 1,
        "name": "Бэкенд-сервисы",
        "description": "Группа для основных API-сервисов",
        "order": 0,
        "status": "operational"
      }
    ],
    "incident_reports": [
      {
        "id": 10100,
        "title": "Проблемы с доступностью API Gateway",
        "started_at": "2026-03-06T16:10:00.000Z",
        "current_status": "degraded",
        "incidents": [
          {
            "incident_id": 42,
            "server_id": 7,
            "server_name": "API Gateway",
            "status": "ongoing",
            "started_at": "2026-03-06T16:10:00.000Z",
            "ended_at": "2026-03-06T16:45:00.000Z"
          }
        ],
        "servers": [
          {
            "id": 1,
            "name": "API Gateway",
            "status": "degraded"
          }
        ],
        "updates": [
          {
            "id": 10100,
            "message": "Мы нашли причину сбоя и уже выкатываем исправление. Следующее обновление через 10 минут",
            "is_initial": true,
            "published_at": "2026-03-06T16:12:00.000Z",
            "servers": [
              {
                "id": 1,
                "name": "API Gateway",
                "status": "degraded"
              }
            ]
          }
        ]
      }
    ],
    "planned_maintenances": [
      {
        "id": 10100,
        "title": "Плановое обновление API Gateway",
        "description": "Во время обновления возможны кратковременные перерывы в работе API и панели управления.",
        "started_at": "2026-03-20T01:00:00.000Z",
        "ended_at": "2026-03-20T03:00:00.000Z",
        "servers": [
          {
            "id": 1,
            "name": "API Gateway"
          }
        ],
        "updates": [
          {
            "id": 10100,
            "message": "Работы идут по плану. Возможны кратковременные перерывы в работе API.",
            "is_initial": true,
            "published_at": "2026-03-06T16:12:00.000Z",
            "servers": [
              {
                "id": 1,
                "name": "API Gateway"
              }
            ]
          }
        ],
        "created_at": "2026-03-18T12:00:00.000Z"
      }
    ],
    "created_at": "2024-01-01T00:00:00.000Z"
  }
  ```
- `404` — Страница не найдена

#### `GET /v1/status-pages/{id}` — Получить страницу статуса

**Аутентификация:** `bearer`

**Параметры (path):**

- `id` (number) **required**

**Ответы:**
- `200` — Страница статуса успешно получена
  - `application/json`: object
    - `id` (number, пример: `1`) **required** — ID страницы статуса
    - `name` (string, пример: `"Statuser"`) **required** — Название страницы статуса
    - `status` (string, пример: `"operational"`) **required** — Общий статус сервисов
    - `slug` (string, пример: `"statuser"`) **required** — Уникальный путь страницы статуса
    - `description` (object | null) **required** — Описание страницы статуса
    - `logo_url` (object | null) **required** — URL логотипа
    - `favicon_url` (object | null) **required** — URL фавикона
    - `company_url` (object | null) **required** — URL сайта компании
    - `support_url` (object | null) **required** — Email службы поддержки
    - `domains` (array of object) **required** — Привязанные к странице статуса домены
      - `domain` (string, пример: `"up.example.com"`) **required** — Домен страницы статуса
      - `status` (string, пример: `"active"`) **required** — Статус домена
    - `is_indexed` (boolean, пример: `true`) **required** — Индексируется ли страница поисковиками
    - `is_published` (boolean, пример: `true`) **required** — Опубликована ли страница
    - `is_white_labeled` (boolean, пример: `false`) **required** — Вайт-лейблинг: скрыт ли бренд Statuser
    - `timeline_days` (number, пример: `60`) **required** — Количество дней, показываемых в таймлайне
    - `timezone` (string, пример: `"Europe/Moscow"`) **required** — Таймзона страницы статуса
    - `uptime_decimal_places` (number, пример: `2`) **required** — Количество знаков после запятой у аптайма
    - `theme_mode` (string, enum: "user", "light", "dark", пример: `"user"`) **required** — Режим темы страницы статуса
    - `is_not_monitored_operational` (boolean, пример: `false`) **required** — Показывать ли статус Не в мониторинге зелёным, как Доступен
    - `minimum_incident_duration` (number, пример: `0`) **required** — Минимальная длительность инцидента в секундах для отображения на странице
    - `is_password_protected` (boolean, пример: `true`) **required** — Защищена ли страница статуса паролем
    - `servers` (array of object) **required** — Список серверов, добавленных на страницу статуса
      - `name` (string, пример: `"My Server"`) **required** — Публичное имя сервера на странице статуса
      - `description` (string | null, пример: `"My Server"`) **required** — Комментарий к серверу
      - `uptime` (number, пример: `99.93`) **required** — Общее время безотказной работы сервера в процентах
      - `current_status` (string, enum: "operational", "downtime", "not_monitored", "degraded", "under_maintenance", пример: `"operational"`) **required** — Статус доступности сервера
      - `order` (number, пример: `99.93`) **required** — Общее время безотказной работы сервера в процентах
      - `group_id` (number, пример: `1`) **required** — Идентификатор группы серверов
      - `availability` (array of array of `unknown`) **required** — Доступность сервера по датам
    - `groups` (array of object) **required** — Список групп серверов
      - `id` (number, пример: `1`) **required** — Идентификатор группы
      - `name` (string, пример: `"Бэкенд-сервисы"`) **required** — Имя группы
      - `description` (string | null, пример: `"Группа для основных API-сервисов"`) **required** — Описание группы
      - `order` (number, пример: `0`) **required** — Порядок отображения группы
      - `status` (string, пример: `"operational"`) **required** — Статус группы
    - `incident_reports` (array of object) **required** — Публичные отчёты по инцидентам на странице статуса
      - `id` (number, пример: `10100`) **required** — ID отчёта
      - `title` (string, пример: `"Проблемы с доступностью API Gateway"`) **required** — Заголовок отчёта
      - `started_at` (string (date-time), пример: `"2026-03-06T16:10:00.000Z"`) **required** — Время начала отчёта
      - `current_status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Текущий статус отчёта по последнему известному состоянию сервисов
      - `incidents` (array of object) **required** — Инциденты, связанные с отчётом
        - `incident_id` (number, пример: `42`) **required** — ID инцидента
        - `server_id` (number, пример: `7`) **required** — ID сервера, к которому относится инцидент
        - `server_name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервера на странице статуса
        - `status` (string, enum: "ongoing", "resolved", "dismissed", "auto_closed_changed", "auto_closed_timeout", пример: `"ongoing"`) **required** — Статус инцидента
        - `started_at` (string (date-time), пример: `"2026-03-06T16:10:00.000Z"`) **required** — Время начала инцидента
        - `ended_at` (object | null) **required** — Время окончания инцидента
      - `servers` (array of object) **required** — Актуальные статусы сервисов внутри отчёта
        - `id` (number, пример: `1`) **required** — ID сервиса на status page
        - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
        - `status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Статус влияния на сервис
      - `updates` (array of object) **required** — Таймлайн сообщений внутри отчёта
        - `id` (number, пример: `10100`) **required** — ID обновления внутри отчёта
        - `message` (string, пример: `"Мы нашли причину сбоя и уже выкатываем исправление. Следующее обновление через 10 минут"`) **required** — Текст апдейта
        - `is_initial` (boolean, пример: `true`) **required** — Является ли запись стартовым сообщением отчёта
        - `published_at` (string (date-time), пример: `"2026-03-06T16:12:00.000Z"`) **required** — Когда обновление было опубликовано
        - `servers` (array of object) **required** — Статусы серверов на момент этого обновления
          - `id` (number, пример: `1`) **required** — ID сервиса на status page
          - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
          - `status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Статус влияния на сервис
    - `planned_maintenances` (array of object) **required** — Плановые работы на странице статуса
      - `id` (number, пример: `10100`) **required** — ID плановых работ
      - `title` (string, пример: `"Плановое обновление API Gateway"`) **required** — Заголовок плановых работ
      - `description` (string, пример: `"Во время обновления возможны кратковременные перерывы в работе API и панели управления."`) **required** — Описание плановых работ
      - `started_at` (string (date-time), пример: `"2026-03-20T01:00:00.000Z"`) **required** — Время начала плановых работ
      - `ended_at` (string (date-time), пример: `"2026-03-20T03:00:00.000Z"`) **required** — Время завершения плановых работ
      - `servers` (array of object) **required** — Сервисы на странице статуса, затрагиваемые плановыми работами
        - `id` (number, пример: `1`) **required** — ID сервиса на status page
        - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
      - `updates` (array of object) **required** — История обновлений по плановым работам
        - `id` (number, пример: `10100`) **required** — ID обновления внутри записи плановых работ
        - `message` (string, пример: `"Работы идут по плану. Возможны кратковременные перерывы в работе API."`) **required** — Текст апдейта
        - `is_initial` (boolean, пример: `true`) **required** — Является ли запись стартовым сообщением
        - `published_at` (string (date-time), пример: `"2026-03-06T16:12:00.000Z"`) **required** — Когда обновление было опубликовано
        - `servers` (array of object) **required** — Сервисы, которых касается это обновление
          - `id` (number, пример: `1`) **required** — ID сервиса на status page
          - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
      - `created_at` (string (date-time), пример: `"2026-03-18T12:00:00.000Z"`) **required** — Дата создания записи
    - `created_at` (string (date-time), пример: `"2024-01-01T00:00:00.000Z"`) **required** — Дата создания страницы статуса
  Пример:
  
  ```json
  {
    "id": 1,
    "name": "Statuser",
    "status": "operational",
    "slug": "statuser",
    "description": "Описание страницы статуса",
    "logo_url": "https://example.com/logo.png",
    "favicon_url": "https://example.com/favicon.png",
    "company_url": "https://example.com",
    "support_url": "support@example.com",
    "domains": [
      {
        "domain": "up.example.com",
        "status": "active"
      }
    ],
    "is_indexed": true,
    "is_published": true,
    "is_white_labeled": false,
    "timeline_days": 60,
    "timezone": "Europe/Moscow",
    "uptime_decimal_places": 2,
    "theme_mode": "user",
    "is_not_monitored_operational": false,
    "minimum_incident_duration": 0,
    "is_password_protected": true,
    "servers": [
      {
        "name": "My Server",
        "description": "My Server",
        "uptime": 99.93,
        "current_status": "operational",
        "order": 99.93,
        "group_id": 1,
        "availability": [
          [
            null
          ]
        ]
      }
    ],
    "groups": [
      {
        "id": 1,
        "name": "Бэкенд-сервисы",
        "description": "Группа для основных API-сервисов",
        "order": 0,
        "status": "operational"
      }
    ],
    "incident_reports": [
      {
        "id": 10100,
        "title": "Проблемы с доступностью API Gateway",
        "started_at": "2026-03-06T16:10:00.000Z",
        "current_status": "degraded",
        "incidents": [
          {
            "incident_id": 42,
            "server_id": 7,
            "server_name": "API Gateway",
            "status": "ongoing",
            "started_at": "2026-03-06T16:10:00.000Z",
            "ended_at": "2026-03-06T16:45:00.000Z"
          }
        ],
        "servers": [
          {
            "id": 1,
            "name": "API Gateway",
            "status": "degraded"
          }
        ],
        "updates": [
          {
            "id": 10100,
            "message": "Мы нашли причину сбоя и уже выкатываем исправление. Следующее обновление через 10 минут",
            "is_initial": true,
            "published_at": "2026-03-06T16:12:00.000Z",
            "servers": [
              {
                "id": 1,
                "name": "API Gateway",
                "status": "degraded"
              }
            ]
          }
        ]
      }
    ],
    "planned_maintenances": [
      {
        "id": 10100,
        "title": "Плановое обновление API Gateway",
        "description": "Во время обновления возможны кратковременные перерывы в работе API и панели управления.",
        "started_at": "2026-03-20T01:00:00.000Z",
        "ended_at": "2026-03-20T03:00:00.000Z",
        "servers": [
          {
            "id": 1,
            "name": "API Gateway"
          }
        ],
        "updates": [
          {
            "id": 10100,
            "message": "Работы идут по плану. Возможны кратковременные перерывы в работе API.",
            "is_initial": true,
            "published_at": "2026-03-06T16:12:00.000Z",
            "servers": [
              {
                "id": 1,
                "name": "API Gateway"
              }
            ]
          }
        ],
        "created_at": "2026-03-18T12:00:00.000Z"
      }
    ],
    "created_at": "2024-01-01T00:00:00.000Z"
  }
  ```
- `404` — Страница не найдена

#### `PATCH /v1/status-pages/{id}` — Обновить страницу статуса

**Аутентификация:** `bearer`

**Параметры (path):**

- `id` (number) **required**

**Тело запроса** (обязательное)

Content-Type: `application/json`

object
  - `name` (string, пример: `"Statuser"`) — Название страницы статуса
  - `slug` (string, пример: `"statuser"`) — Уникальный путь страницы статуса
  - `description` (object | null) — Описание страницы статуса
  - `logo_url` (object | null) — URL логотипа
  - `favicon_url` (object | null) — URL фавикона
  - `company_url` (object | null) — URL сайта компании
  - `support_url` (object | null) — Email службы поддержки
  - `domain` (object | null) — Собственный домен страницы статуса
  - `is_indexed` (boolean, пример: `true`) — Индексируется ли страница поисковиками
  - `is_published` (boolean, пример: `true`) **required** — Опубликована ли страница
  - `is_white_labeled` (boolean, пример: `false`) — Вайт-лейблинг: скрыть бренд Statuser
  - `timeline_days` (number, пример: `60`) — Количество дней таймлайна на странице статуса
  - `timezone` (string, пример: `"Europe/Moscow"`) — Таймзона, в которой считаются дни на странице статуса
  - `uptime_decimal_places` (number, пример: `2`) — Количество знаков после запятой для аптайма
  - `theme_mode` (string, enum: "user", "light", "dark", пример: `"user"`) — Режим темы страницы статуса
  - `is_not_monitored_operational` (boolean, пример: `false`) — Показывать ли статус Не в мониторинге зелёным, как Доступен
  - `minimum_incident_duration` (number, пример: `0`) — Минимальная длительность инцидента в секундах для отображения на странице
  - `password` (object | null) — Пароль для доступа к странице статуса

Пример:

```json
{
  "name": "Statuser",
  "slug": "statuser",
  "description": "Описание страницы статуса",
  "logo_url": "https://example.com/logo.png",
  "favicon_url": "https://example.com/favicon.png",
  "company_url": "https://example.com",
  "support_url": "support@example.com",
  "domain": "status.example.com",
  "is_indexed": true,
  "is_published": true,
  "is_white_labeled": false,
  "timeline_days": 60,
  "timezone": "Europe/Moscow",
  "uptime_decimal_places": 2,
  "theme_mode": "user",
  "is_not_monitored_operational": false,
  "minimum_incident_duration": 0,
  "password": "mysecretpassword"
}
```

**Ответы:**
- `200` — Страница успешно обновлена
  - `application/json`: object
    - `id` (number, пример: `1`) **required** — ID страницы статуса
    - `name` (string, пример: `"Statuser"`) **required** — Название страницы статуса
    - `status` (string, пример: `"operational"`) **required** — Общий статус сервисов
    - `slug` (string, пример: `"statuser"`) **required** — Уникальный путь страницы статуса
    - `description` (object | null) **required** — Описание страницы статуса
    - `logo_url` (object | null) **required** — URL логотипа
    - `favicon_url` (object | null) **required** — URL фавикона
    - `company_url` (object | null) **required** — URL сайта компании
    - `support_url` (object | null) **required** — Email службы поддержки
    - `domains` (array of object) **required** — Привязанные к странице статуса домены
      - `domain` (string, пример: `"up.example.com"`) **required** — Домен страницы статуса
      - `status` (string, пример: `"active"`) **required** — Статус домена
    - `is_indexed` (boolean, пример: `true`) **required** — Индексируется ли страница поисковиками
    - `is_published` (boolean, пример: `true`) **required** — Опубликована ли страница
    - `is_white_labeled` (boolean, пример: `false`) **required** — Вайт-лейблинг: скрыт ли бренд Statuser
    - `timeline_days` (number, пример: `60`) **required** — Количество дней, показываемых в таймлайне
    - `timezone` (string, пример: `"Europe/Moscow"`) **required** — Таймзона страницы статуса
    - `uptime_decimal_places` (number, пример: `2`) **required** — Количество знаков после запятой у аптайма
    - `theme_mode` (string, enum: "user", "light", "dark", пример: `"user"`) **required** — Режим темы страницы статуса
    - `is_not_monitored_operational` (boolean, пример: `false`) **required** — Показывать ли статус Не в мониторинге зелёным, как Доступен
    - `minimum_incident_duration` (number, пример: `0`) **required** — Минимальная длительность инцидента в секундах для отображения на странице
    - `is_password_protected` (boolean, пример: `true`) **required** — Защищена ли страница статуса паролем
    - `servers` (array of object) **required** — Список серверов, добавленных на страницу статуса
      - `name` (string, пример: `"My Server"`) **required** — Публичное имя сервера на странице статуса
      - `description` (string | null, пример: `"My Server"`) **required** — Комментарий к серверу
      - `uptime` (number, пример: `99.93`) **required** — Общее время безотказной работы сервера в процентах
      - `current_status` (string, enum: "operational", "downtime", "not_monitored", "degraded", "under_maintenance", пример: `"operational"`) **required** — Статус доступности сервера
      - `order` (number, пример: `99.93`) **required** — Общее время безотказной работы сервера в процентах
      - `group_id` (number, пример: `1`) **required** — Идентификатор группы серверов
      - `availability` (array of array of `unknown`) **required** — Доступность сервера по датам
    - `groups` (array of object) **required** — Список групп серверов
      - `id` (number, пример: `1`) **required** — Идентификатор группы
      - `name` (string, пример: `"Бэкенд-сервисы"`) **required** — Имя группы
      - `description` (string | null, пример: `"Группа для основных API-сервисов"`) **required** — Описание группы
      - `order` (number, пример: `0`) **required** — Порядок отображения группы
      - `status` (string, пример: `"operational"`) **required** — Статус группы
    - `incident_reports` (array of object) **required** — Публичные отчёты по инцидентам на странице статуса
      - `id` (number, пример: `10100`) **required** — ID отчёта
      - `title` (string, пример: `"Проблемы с доступностью API Gateway"`) **required** — Заголовок отчёта
      - `started_at` (string (date-time), пример: `"2026-03-06T16:10:00.000Z"`) **required** — Время начала отчёта
      - `current_status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Текущий статус отчёта по последнему известному состоянию сервисов
      - `incidents` (array of object) **required** — Инциденты, связанные с отчётом
        - `incident_id` (number, пример: `42`) **required** — ID инцидента
        - `server_id` (number, пример: `7`) **required** — ID сервера, к которому относится инцидент
        - `server_name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервера на странице статуса
        - `status` (string, enum: "ongoing", "resolved", "dismissed", "auto_closed_changed", "auto_closed_timeout", пример: `"ongoing"`) **required** — Статус инцидента
        - `started_at` (string (date-time), пример: `"2026-03-06T16:10:00.000Z"`) **required** — Время начала инцидента
        - `ended_at` (object | null) **required** — Время окончания инцидента
      - `servers` (array of object) **required** — Актуальные статусы сервисов внутри отчёта
        - `id` (number, пример: `1`) **required** — ID сервиса на status page
        - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
        - `status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Статус влияния на сервис
      - `updates` (array of object) **required** — Таймлайн сообщений внутри отчёта
        - `id` (number, пример: `10100`) **required** — ID обновления внутри отчёта
        - `message` (string, пример: `"Мы нашли причину сбоя и уже выкатываем исправление. Следующее обновление через 10 минут"`) **required** — Текст апдейта
        - `is_initial` (boolean, пример: `true`) **required** — Является ли запись стартовым сообщением отчёта
        - `published_at` (string (date-time), пример: `"2026-03-06T16:12:00.000Z"`) **required** — Когда обновление было опубликовано
        - `servers` (array of object) **required** — Статусы серверов на момент этого обновления
          - `id` (number, пример: `1`) **required** — ID сервиса на status page
          - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
          - `status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Статус влияния на сервис
    - `planned_maintenances` (array of object) **required** — Плановые работы на странице статуса
      - `id` (number, пример: `10100`) **required** — ID плановых работ
      - `title` (string, пример: `"Плановое обновление API Gateway"`) **required** — Заголовок плановых работ
      - `description` (string, пример: `"Во время обновления возможны кратковременные перерывы в работе API и панели управления."`) **required** — Описание плановых работ
      - `started_at` (string (date-time), пример: `"2026-03-20T01:00:00.000Z"`) **required** — Время начала плановых работ
      - `ended_at` (string (date-time), пример: `"2026-03-20T03:00:00.000Z"`) **required** — Время завершения плановых работ
      - `servers` (array of object) **required** — Сервисы на странице статуса, затрагиваемые плановыми работами
        - `id` (number, пример: `1`) **required** — ID сервиса на status page
        - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
      - `updates` (array of object) **required** — История обновлений по плановым работам
        - `id` (number, пример: `10100`) **required** — ID обновления внутри записи плановых работ
        - `message` (string, пример: `"Работы идут по плану. Возможны кратковременные перерывы в работе API."`) **required** — Текст апдейта
        - `is_initial` (boolean, пример: `true`) **required** — Является ли запись стартовым сообщением
        - `published_at` (string (date-time), пример: `"2026-03-06T16:12:00.000Z"`) **required** — Когда обновление было опубликовано
        - `servers` (array of object) **required** — Сервисы, которых касается это обновление
          - `id` (number, пример: `1`) **required** — ID сервиса на status page
          - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
      - `created_at` (string (date-time), пример: `"2026-03-18T12:00:00.000Z"`) **required** — Дата создания записи
    - `created_at` (string (date-time), пример: `"2024-01-01T00:00:00.000Z"`) **required** — Дата создания страницы статуса
  Пример:
  
  ```json
  {
    "id": 1,
    "name": "Statuser",
    "status": "operational",
    "slug": "statuser",
    "description": "Описание страницы статуса",
    "logo_url": "https://example.com/logo.png",
    "favicon_url": "https://example.com/favicon.png",
    "company_url": "https://example.com",
    "support_url": "support@example.com",
    "domains": [
      {
        "domain": "up.example.com",
        "status": "active"
      }
    ],
    "is_indexed": true,
    "is_published": true,
    "is_white_labeled": false,
    "timeline_days": 60,
    "timezone": "Europe/Moscow",
    "uptime_decimal_places": 2,
    "theme_mode": "user",
    "is_not_monitored_operational": false,
    "minimum_incident_duration": 0,
    "is_password_protected": true,
    "servers": [
      {
        "name": "My Server",
        "description": "My Server",
        "uptime": 99.93,
        "current_status": "operational",
        "order": 99.93,
        "group_id": 1,
        "availability": [
          [
            null
          ]
        ]
      }
    ],
    "groups": [
      {
        "id": 1,
        "name": "Бэкенд-сервисы",
        "description": "Группа для основных API-сервисов",
        "order": 0,
        "status": "operational"
      }
    ],
    "incident_reports": [
      {
        "id": 10100,
        "title": "Проблемы с доступностью API Gateway",
        "started_at": "2026-03-06T16:10:00.000Z",
        "current_status": "degraded",
        "incidents": [
          {
            "incident_id": 42,
            "server_id": 7,
            "server_name": "API Gateway",
            "status": "ongoing",
            "started_at": "2026-03-06T16:10:00.000Z",
            "ended_at": "2026-03-06T16:45:00.000Z"
          }
        ],
        "servers": [
          {
            "id": 1,
            "name": "API Gateway",
            "status": "degraded"
          }
        ],
        "updates": [
          {
            "id": 10100,
            "message": "Мы нашли причину сбоя и уже выкатываем исправление. Следующее обновление через 10 минут",
            "is_initial": true,
            "published_at": "2026-03-06T16:12:00.000Z",
            "servers": [
              {
                "id": 1,
                "name": "API Gateway",
                "status": "degraded"
              }
            ]
          }
        ]
      }
    ],
    "planned_maintenances": [
      {
        "id": 10100,
        "title": "Плановое обновление API Gateway",
        "description": "Во время обновления возможны кратковременные перерывы в работе API и панели управления.",
        "started_at": "2026-03-20T01:00:00.000Z",
        "ended_at": "2026-03-20T03:00:00.000Z",
        "servers": [
          {
            "id": 1,
            "name": "API Gateway"
          }
        ],
        "updates": [
          {
            "id": 10100,
            "message": "Работы идут по плану. Возможны кратковременные перерывы в работе API.",
            "is_initial": true,
            "published_at": "2026-03-06T16:12:00.000Z",
            "servers": [
              {
                "id": 1,
                "name": "API Gateway"
              }
            ]
          }
        ],
        "created_at": "2026-03-18T12:00:00.000Z"
      }
    ],
    "created_at": "2024-01-01T00:00:00.000Z"
  }
  ```
- `404` — Страница не найдена

#### `DELETE /v1/status-pages/{id}` — Удалить страницу статуса

**Аутентификация:** `bearer`

**Параметры (path):**

- `id` (number) **required**

**Ответы:**
- `204` — Страница успешно удалена
- `404` — Страница не найдена

#### `PATCH /v1/status-pages/{id}/servers` — Обновить группы и серверы на странице статуса

**Аутентификация:** `bearer`

**Параметры (path):**

- `id` (number) **required**

**Тело запроса** (обязательное)

Content-Type: `application/json`

object

**Ответы:**
- `200` — Группы и серверы обновлены
- `404` — Страница не найдена

#### `PATCH /v1/status-pages/{id}/{action}` — Опубликовать или снять с публикации страницу статуса

**Аутентификация:** `bearer`

**Параметры (path):**

- `id` (number) **required**
- `action` (string) **required**

**Ответы:**
- `200` — Статус публикации страницы успешно обновлён
- `404` — Страница не найдена

#### `GET /v1/status-pages/{id}/incident-reports` — Получить отчёты инцидентов для страницы статуса

**Аутентификация:** `bearer`

**Параметры (path):**

- `id` (number) **required**

**Ответы:**
- `200`
  - `application/json`: array of object
    - `id` (number, пример: `10100`) **required** — ID отчёта
    - `title` (string, пример: `"Проблемы с доступностью API Gateway"`) **required** — Заголовок отчёта
    - `started_at` (string (date-time), пример: `"2026-03-06T16:10:00.000Z"`) **required** — Время начала отчёта
    - `current_status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Текущий статус отчёта по последнему известному состоянию сервисов
    - `incidents` (array of object) **required** — Инциденты, связанные с отчётом
      - `incident_id` (number, пример: `42`) **required** — ID инцидента
      - `server_id` (number, пример: `7`) **required** — ID сервера, к которому относится инцидент
      - `server_name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервера на странице статуса
      - `status` (string, enum: "ongoing", "resolved", "dismissed", "auto_closed_changed", "auto_closed_timeout", пример: `"ongoing"`) **required** — Статус инцидента
      - `started_at` (string (date-time), пример: `"2026-03-06T16:10:00.000Z"`) **required** — Время начала инцидента
      - `ended_at` (object | null) **required** — Время окончания инцидента
    - `servers` (array of object) **required** — Актуальные статусы сервисов внутри отчёта
      - `id` (number, пример: `1`) **required** — ID сервиса на status page
      - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
      - `status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Статус влияния на сервис
    - `updates` (array of object) **required** — Таймлайн сообщений внутри отчёта
      - `id` (number, пример: `10100`) **required** — ID обновления внутри отчёта
      - `message` (string, пример: `"Мы нашли причину сбоя и уже выкатываем исправление. Следующее обновление через 10 минут"`) **required** — Текст апдейта
      - `is_initial` (boolean, пример: `true`) **required** — Является ли запись стартовым сообщением отчёта
      - `published_at` (string (date-time), пример: `"2026-03-06T16:12:00.000Z"`) **required** — Когда обновление было опубликовано
      - `servers` (array of object) **required** — Статусы серверов на момент этого обновления
        - `id` (number, пример: `1`) **required** — ID сервиса на status page
        - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
        - `status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Статус влияния на сервис
  Пример:
  
  ```json
  [
    {
      "id": 10100,
      "title": "Проблемы с доступностью API Gateway",
      "started_at": "2026-03-06T16:10:00.000Z",
      "current_status": "degraded",
      "incidents": [
        {
          "incident_id": 42,
          "server_id": 7,
          "server_name": "API Gateway",
          "status": "ongoing",
          "started_at": "2026-03-06T16:10:00.000Z",
          "ended_at": "2026-03-06T16:45:00.000Z"
        }
      ],
      "servers": [
        {
          "id": 1,
          "name": "API Gateway",
          "status": "degraded"
        }
      ],
      "updates": [
        {
          "id": 10100,
          "message": "Мы нашли причину сбоя и уже выкатываем исправление. Следующее обновление через 10 минут",
          "is_initial": true,
          "published_at": "2026-03-06T16:12:00.000Z",
          "servers": [
            {
              "id": 1,
              "name": "API Gateway",
              "status": "degraded"
            }
          ]
        }
      ]
    }
  ]
  ```

#### `POST /v1/status-pages/{id}/incident-reports` — Создать отчёт по инциденту для страницы статуса

**Аутентификация:** `bearer`

**Параметры (path):**

- `id` (number) **required**

**Тело запроса** (обязательное)

Content-Type: `application/json`

object
  - `title` (string, пример: `"Проблемы с доступностью API Gateway"`) **required** — Заголовок отчёта
  - `initial_message` (string, пример: `"Часть пользователей может сталкиваться с ошибками 502. Команда уже расследует причину"`) **required** — Текст стартового сообщения отчёта
  - `started_at` (string (date-time), пример: `"2026-03-06T16:12:00.000Z"`) **required** — Время начала отчёта
  - `incident_ids` (array of string) — Связанные инциденты, если отчёт основан на существующих инцидентах
  - `servers` (array of object) **required** — Стартовые статусы серверов в рамках отчёта
    - `server_id` (number, пример: `1`) **required** — ID сервера на странице статуса
    - `status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"downtime"`) **required** — Статус влияния на сервер в момент создания отчёта

Пример:

```json
{
  "title": "Проблемы с доступностью API Gateway",
  "initial_message": "Часть пользователей может сталкиваться с ошибками 502. Команда уже расследует причину",
  "started_at": "2026-03-06T16:12:00.000Z",
  "incident_ids": [
    42,
    43
  ],
  "servers": [
    {
      "server_id": 1,
      "status": "downtime"
    }
  ]
}
```

**Ответы:**
- `201`
  - `application/json`: object
    - `id` (number, пример: `10100`) **required** — ID отчёта
    - `title` (string, пример: `"Проблемы с доступностью API Gateway"`) **required** — Заголовок отчёта
    - `started_at` (string (date-time), пример: `"2026-03-06T16:10:00.000Z"`) **required** — Время начала отчёта
    - `current_status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Текущий статус отчёта по последнему известному состоянию сервисов
    - `incidents` (array of object) **required** — Инциденты, связанные с отчётом
      - `incident_id` (number, пример: `42`) **required** — ID инцидента
      - `server_id` (number, пример: `7`) **required** — ID сервера, к которому относится инцидент
      - `server_name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервера на странице статуса
      - `status` (string, enum: "ongoing", "resolved", "dismissed", "auto_closed_changed", "auto_closed_timeout", пример: `"ongoing"`) **required** — Статус инцидента
      - `started_at` (string (date-time), пример: `"2026-03-06T16:10:00.000Z"`) **required** — Время начала инцидента
      - `ended_at` (object | null) **required** — Время окончания инцидента
    - `servers` (array of object) **required** — Актуальные статусы сервисов внутри отчёта
      - `id` (number, пример: `1`) **required** — ID сервиса на status page
      - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
      - `status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Статус влияния на сервис
    - `updates` (array of object) **required** — Таймлайн сообщений внутри отчёта
      - `id` (number, пример: `10100`) **required** — ID обновления внутри отчёта
      - `message` (string, пример: `"Мы нашли причину сбоя и уже выкатываем исправление. Следующее обновление через 10 минут"`) **required** — Текст апдейта
      - `is_initial` (boolean, пример: `true`) **required** — Является ли запись стартовым сообщением отчёта
      - `published_at` (string (date-time), пример: `"2026-03-06T16:12:00.000Z"`) **required** — Когда обновление было опубликовано
      - `servers` (array of object) **required** — Статусы серверов на момент этого обновления
        - `id` (number, пример: `1`) **required** — ID сервиса на status page
        - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
        - `status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Статус влияния на сервис
  Пример:
  
  ```json
  {
    "id": 10100,
    "title": "Проблемы с доступностью API Gateway",
    "started_at": "2026-03-06T16:10:00.000Z",
    "current_status": "degraded",
    "incidents": [
      {
        "incident_id": 42,
        "server_id": 7,
        "server_name": "API Gateway",
        "status": "ongoing",
        "started_at": "2026-03-06T16:10:00.000Z",
        "ended_at": "2026-03-06T16:45:00.000Z"
      }
    ],
    "servers": [
      {
        "id": 1,
        "name": "API Gateway",
        "status": "degraded"
      }
    ],
    "updates": [
      {
        "id": 10100,
        "message": "Мы нашли причину сбоя и уже выкатываем исправление. Следующее обновление через 10 минут",
        "is_initial": true,
        "published_at": "2026-03-06T16:12:00.000Z",
        "servers": [
          {
            "id": 1,
            "name": "API Gateway",
            "status": "degraded"
          }
        ]
      }
    ]
  }
  ```

#### `PATCH /v1/status-pages/{id}/incident-reports/{reportId}` — Обновить отчёт для страницы статуса

**Аутентификация:** `bearer`

**Параметры (path):**

- `id` (number) **required**
- `reportId` (number) **required**

**Тело запроса** (обязательное)

Content-Type: `application/json`

object
  - `title` (string, пример: `"Проблемы с доступностью API Gateway"`) — Заголовок отчёта
  - `started_at` (string (date-time), пример: `"2026-03-06T16:12:00.000Z"`) — Время начала отчёта

Пример:

```json
{
  "title": "Проблемы с доступностью API Gateway",
  "started_at": "2026-03-06T16:12:00.000Z"
}
```

**Ответы:**
- `200`
  - `application/json`: object
    - `id` (number, пример: `10100`) **required** — ID отчёта
    - `title` (string, пример: `"Проблемы с доступностью API Gateway"`) **required** — Заголовок отчёта
    - `started_at` (string (date-time), пример: `"2026-03-06T16:10:00.000Z"`) **required** — Время начала отчёта
    - `current_status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Текущий статус отчёта по последнему известному состоянию сервисов
    - `incidents` (array of object) **required** — Инциденты, связанные с отчётом
      - `incident_id` (number, пример: `42`) **required** — ID инцидента
      - `server_id` (number, пример: `7`) **required** — ID сервера, к которому относится инцидент
      - `server_name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервера на странице статуса
      - `status` (string, enum: "ongoing", "resolved", "dismissed", "auto_closed_changed", "auto_closed_timeout", пример: `"ongoing"`) **required** — Статус инцидента
      - `started_at` (string (date-time), пример: `"2026-03-06T16:10:00.000Z"`) **required** — Время начала инцидента
      - `ended_at` (object | null) **required** — Время окончания инцидента
    - `servers` (array of object) **required** — Актуальные статусы сервисов внутри отчёта
      - `id` (number, пример: `1`) **required** — ID сервиса на status page
      - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
      - `status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Статус влияния на сервис
    - `updates` (array of object) **required** — Таймлайн сообщений внутри отчёта
      - `id` (number, пример: `10100`) **required** — ID обновления внутри отчёта
      - `message` (string, пример: `"Мы нашли причину сбоя и уже выкатываем исправление. Следующее обновление через 10 минут"`) **required** — Текст апдейта
      - `is_initial` (boolean, пример: `true`) **required** — Является ли запись стартовым сообщением отчёта
      - `published_at` (string (date-time), пример: `"2026-03-06T16:12:00.000Z"`) **required** — Когда обновление было опубликовано
      - `servers` (array of object) **required** — Статусы серверов на момент этого обновления
        - `id` (number, пример: `1`) **required** — ID сервиса на status page
        - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
        - `status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Статус влияния на сервис
  Пример:
  
  ```json
  {
    "id": 10100,
    "title": "Проблемы с доступностью API Gateway",
    "started_at": "2026-03-06T16:10:00.000Z",
    "current_status": "degraded",
    "incidents": [
      {
        "incident_id": 42,
        "server_id": 7,
        "server_name": "API Gateway",
        "status": "ongoing",
        "started_at": "2026-03-06T16:10:00.000Z",
        "ended_at": "2026-03-06T16:45:00.000Z"
      }
    ],
    "servers": [
      {
        "id": 1,
        "name": "API Gateway",
        "status": "degraded"
      }
    ],
    "updates": [
      {
        "id": 10100,
        "message": "Мы нашли причину сбоя и уже выкатываем исправление. Следующее обновление через 10 минут",
        "is_initial": true,
        "published_at": "2026-03-06T16:12:00.000Z",
        "servers": [
          {
            "id": 1,
            "name": "API Gateway",
            "status": "degraded"
          }
        ]
      }
    ]
  }
  ```

#### `DELETE /v1/status-pages/{id}/incident-reports/{reportId}` — Удалить отчёт по инциденту для страницы статуса

**Аутентификация:** `bearer`

**Параметры (path):**

- `id` (number) **required**
- `reportId` (number) **required**

**Ответы:**
- `204`

#### `POST /v1/status-pages/{id}/incident-reports/{reportId}/updates` — Добавить обновление в отчёт для страницы статуса

**Аутентификация:** `bearer`

**Параметры (path):**

- `id` (number) **required**
- `reportId` (number) **required**

**Тело запроса** (обязательное)

Content-Type: `application/json`

object
  - `message` (string, пример: `"Мы нашли причину сбоя и уже выкатываем исправление. Следующее обновление через 10 минут"`) **required** — Текст апдейта
  - `published_at` (string (date-time), пример: `"2026-03-06T16:22:00.000Z"`) — Время публикации апдейта
  - `servers` (array of object) **required** — Новые статусы сервисов в рамках апдейта
    - `server_id` (number, пример: `1`) **required** — ID сервера на странице статуса
    - `status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"downtime"`) **required** — Новый статус влияния на сервер

Пример:

```json
{
  "message": "Мы нашли причину сбоя и уже выкатываем исправление. Следующее обновление через 10 минут",
  "published_at": "2026-03-06T16:22:00.000Z",
  "servers": [
    {
      "server_id": 1,
      "status": "downtime"
    }
  ]
}
```

**Ответы:**
- `201`
  - `application/json`: object
    - `id` (number, пример: `10100`) **required** — ID отчёта
    - `title` (string, пример: `"Проблемы с доступностью API Gateway"`) **required** — Заголовок отчёта
    - `started_at` (string (date-time), пример: `"2026-03-06T16:10:00.000Z"`) **required** — Время начала отчёта
    - `current_status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Текущий статус отчёта по последнему известному состоянию сервисов
    - `incidents` (array of object) **required** — Инциденты, связанные с отчётом
      - `incident_id` (number, пример: `42`) **required** — ID инцидента
      - `server_id` (number, пример: `7`) **required** — ID сервера, к которому относится инцидент
      - `server_name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервера на странице статуса
      - `status` (string, enum: "ongoing", "resolved", "dismissed", "auto_closed_changed", "auto_closed_timeout", пример: `"ongoing"`) **required** — Статус инцидента
      - `started_at` (string (date-time), пример: `"2026-03-06T16:10:00.000Z"`) **required** — Время начала инцидента
      - `ended_at` (object | null) **required** — Время окончания инцидента
    - `servers` (array of object) **required** — Актуальные статусы сервисов внутри отчёта
      - `id` (number, пример: `1`) **required** — ID сервиса на status page
      - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
      - `status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Статус влияния на сервис
    - `updates` (array of object) **required** — Таймлайн сообщений внутри отчёта
      - `id` (number, пример: `10100`) **required** — ID обновления внутри отчёта
      - `message` (string, пример: `"Мы нашли причину сбоя и уже выкатываем исправление. Следующее обновление через 10 минут"`) **required** — Текст апдейта
      - `is_initial` (boolean, пример: `true`) **required** — Является ли запись стартовым сообщением отчёта
      - `published_at` (string (date-time), пример: `"2026-03-06T16:12:00.000Z"`) **required** — Когда обновление было опубликовано
      - `servers` (array of object) **required** — Статусы серверов на момент этого обновления
        - `id` (number, пример: `1`) **required** — ID сервиса на status page
        - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
        - `status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Статус влияния на сервис
  Пример:
  
  ```json
  {
    "id": 10100,
    "title": "Проблемы с доступностью API Gateway",
    "started_at": "2026-03-06T16:10:00.000Z",
    "current_status": "degraded",
    "incidents": [
      {
        "incident_id": 42,
        "server_id": 7,
        "server_name": "API Gateway",
        "status": "ongoing",
        "started_at": "2026-03-06T16:10:00.000Z",
        "ended_at": "2026-03-06T16:45:00.000Z"
      }
    ],
    "servers": [
      {
        "id": 1,
        "name": "API Gateway",
        "status": "degraded"
      }
    ],
    "updates": [
      {
        "id": 10100,
        "message": "Мы нашли причину сбоя и уже выкатываем исправление. Следующее обновление через 10 минут",
        "is_initial": true,
        "published_at": "2026-03-06T16:12:00.000Z",
        "servers": [
          {
            "id": 1,
            "name": "API Gateway",
            "status": "degraded"
          }
        ]
      }
    ]
  }
  ```

#### `PATCH /v1/status-pages/{id}/incident-reports/{reportId}/updates/{updateId}` — Обновить сообщение в отчёте для страницы статуса

**Аутентификация:** `bearer`

**Параметры (path):**

- `id` (number) **required**
- `reportId` (number) **required**
- `updateId` (number) **required**

**Тело запроса** (обязательное)

Content-Type: `application/json`

object
  - `message` (string, пример: `"Мы нашли причину сбоя и уже выкатываем исправление. Следующее обновление через 10 минут"`) **required** — Обновлённый текст апдейта

Пример:

```json
{
  "message": "Мы нашли причину сбоя и уже выкатываем исправление. Следующее обновление через 10 минут"
}
```

**Ответы:**
- `200`
  - `application/json`: object
    - `id` (number, пример: `10100`) **required** — ID отчёта
    - `title` (string, пример: `"Проблемы с доступностью API Gateway"`) **required** — Заголовок отчёта
    - `started_at` (string (date-time), пример: `"2026-03-06T16:10:00.000Z"`) **required** — Время начала отчёта
    - `current_status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Текущий статус отчёта по последнему известному состоянию сервисов
    - `incidents` (array of object) **required** — Инциденты, связанные с отчётом
      - `incident_id` (number, пример: `42`) **required** — ID инцидента
      - `server_id` (number, пример: `7`) **required** — ID сервера, к которому относится инцидент
      - `server_name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервера на странице статуса
      - `status` (string, enum: "ongoing", "resolved", "dismissed", "auto_closed_changed", "auto_closed_timeout", пример: `"ongoing"`) **required** — Статус инцидента
      - `started_at` (string (date-time), пример: `"2026-03-06T16:10:00.000Z"`) **required** — Время начала инцидента
      - `ended_at` (object | null) **required** — Время окончания инцидента
    - `servers` (array of object) **required** — Актуальные статусы сервисов внутри отчёта
      - `id` (number, пример: `1`) **required** — ID сервиса на status page
      - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
      - `status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Статус влияния на сервис
    - `updates` (array of object) **required** — Таймлайн сообщений внутри отчёта
      - `id` (number, пример: `10100`) **required** — ID обновления внутри отчёта
      - `message` (string, пример: `"Мы нашли причину сбоя и уже выкатываем исправление. Следующее обновление через 10 минут"`) **required** — Текст апдейта
      - `is_initial` (boolean, пример: `true`) **required** — Является ли запись стартовым сообщением отчёта
      - `published_at` (string (date-time), пример: `"2026-03-06T16:12:00.000Z"`) **required** — Когда обновление было опубликовано
      - `servers` (array of object) **required** — Статусы серверов на момент этого обновления
        - `id` (number, пример: `1`) **required** — ID сервиса на status page
        - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
        - `status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Статус влияния на сервис
  Пример:
  
  ```json
  {
    "id": 10100,
    "title": "Проблемы с доступностью API Gateway",
    "started_at": "2026-03-06T16:10:00.000Z",
    "current_status": "degraded",
    "incidents": [
      {
        "incident_id": 42,
        "server_id": 7,
        "server_name": "API Gateway",
        "status": "ongoing",
        "started_at": "2026-03-06T16:10:00.000Z",
        "ended_at": "2026-03-06T16:45:00.000Z"
      }
    ],
    "servers": [
      {
        "id": 1,
        "name": "API Gateway",
        "status": "degraded"
      }
    ],
    "updates": [
      {
        "id": 10100,
        "message": "Мы нашли причину сбоя и уже выкатываем исправление. Следующее обновление через 10 минут",
        "is_initial": true,
        "published_at": "2026-03-06T16:12:00.000Z",
        "servers": [
          {
            "id": 1,
            "name": "API Gateway",
            "status": "degraded"
          }
        ]
      }
    ]
  }
  ```

#### `DELETE /v1/status-pages/{id}/incident-reports/{reportId}/updates/{updateId}` — Удалить сообщение из отчёта для страницы статуса

**Аутентификация:** `bearer`

**Параметры (path):**

- `id` (number) **required**
- `reportId` (number) **required**
- `updateId` (number) **required**

**Ответы:**
- `204`

#### `GET /v1/status-pages/{id}/planned-maintenances` — Получить плановые работы для страницы статуса

**Аутентификация:** `bearer`

**Параметры (path):**

- `id` (number) **required**

**Ответы:**
- `200`
  - `application/json`: array of object
    - `id` (number, пример: `10100`) **required** — ID плановых работ
    - `title` (string, пример: `"Плановое обновление API Gateway"`) **required** — Заголовок плановых работ
    - `description` (string, пример: `"Во время обновления возможны кратковременные перерывы в работе API и панели управления."`) **required** — Описание плановых работ
    - `started_at` (string (date-time), пример: `"2026-03-20T01:00:00.000Z"`) **required** — Время начала плановых работ
    - `ended_at` (string (date-time), пример: `"2026-03-20T03:00:00.000Z"`) **required** — Время завершения плановых работ
    - `servers` (array of object) **required** — Сервисы на странице статуса, затрагиваемые плановыми работами
      - `id` (number, пример: `1`) **required** — ID сервиса на status page
      - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
    - `updates` (array of object) **required** — История обновлений по плановым работам
      - `id` (number, пример: `10100`) **required** — ID обновления внутри записи плановых работ
      - `message` (string, пример: `"Работы идут по плану. Возможны кратковременные перерывы в работе API."`) **required** — Текст апдейта
      - `is_initial` (boolean, пример: `true`) **required** — Является ли запись стартовым сообщением
      - `published_at` (string (date-time), пример: `"2026-03-06T16:12:00.000Z"`) **required** — Когда обновление было опубликовано
      - `servers` (array of object) **required** — Сервисы, которых касается это обновление
        - `id` (number, пример: `1`) **required** — ID сервиса на status page
        - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
    - `created_at` (string (date-time), пример: `"2026-03-18T12:00:00.000Z"`) **required** — Дата создания записи
  Пример:
  
  ```json
  [
    {
      "id": 10100,
      "title": "Плановое обновление API Gateway",
      "description": "Во время обновления возможны кратковременные перерывы в работе API и панели управления.",
      "started_at": "2026-03-20T01:00:00.000Z",
      "ended_at": "2026-03-20T03:00:00.000Z",
      "servers": [
        {
          "id": 1,
          "name": "API Gateway"
        }
      ],
      "updates": [
        {
          "id": 10100,
          "message": "Работы идут по плану. Возможны кратковременные перерывы в работе API.",
          "is_initial": true,
          "published_at": "2026-03-06T16:12:00.000Z",
          "servers": [
            {
              "id": 1,
              "name": "API Gateway"
            }
          ]
        }
      ],
      "created_at": "2026-03-18T12:00:00.000Z"
    }
  ]
  ```

#### `POST /v1/status-pages/{id}/planned-maintenances` — Создать плановые работы для страницы статуса

**Аутентификация:** `bearer`

**Параметры (path):**

- `id` (number) **required**

**Тело запроса** (обязательное)

Content-Type: `application/json`

object
  - `title` (string, пример: `"Плановое обновление API Gateway"`) **required** — Заголовок плановых работ
  - `description` (string, пример: `"Во время обновления возможны кратковременные перерывы в работе API и панели управления."`) **required** — Описание плановых работ
  - `started_at` (string (date-time), пример: `"2026-03-20T01:00:00.000Z"`) **required** — Время начала плановых работ
  - `ended_at` (string (date-time), пример: `"2026-03-20T03:00:00.000Z"`) **required** — Время завершения плановых работ
  - `servers` (array of object) **required** — Сервисы на странице статуса, затрагиваемые плановыми работами
    - `id` (number, пример: `1`) **required** — ID сервиса на странице статуса

Пример:

```json
{
  "title": "Плановое обновление API Gateway",
  "description": "Во время обновления возможны кратковременные перерывы в работе API и панели управления.",
  "started_at": "2026-03-20T01:00:00.000Z",
  "ended_at": "2026-03-20T03:00:00.000Z",
  "servers": [
    {
      "id": 1
    },
    {
      "id": 2
    },
    {
      "id": 3
    }
  ]
}
```

**Ответы:**
- `201`
  - `application/json`: object
    - `id` (number, пример: `10100`) **required** — ID плановых работ
    - `title` (string, пример: `"Плановое обновление API Gateway"`) **required** — Заголовок плановых работ
    - `description` (string, пример: `"Во время обновления возможны кратковременные перерывы в работе API и панели управления."`) **required** — Описание плановых работ
    - `started_at` (string (date-time), пример: `"2026-03-20T01:00:00.000Z"`) **required** — Время начала плановых работ
    - `ended_at` (string (date-time), пример: `"2026-03-20T03:00:00.000Z"`) **required** — Время завершения плановых работ
    - `servers` (array of object) **required** — Сервисы на странице статуса, затрагиваемые плановыми работами
      - `id` (number, пример: `1`) **required** — ID сервиса на status page
      - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
    - `updates` (array of object) **required** — История обновлений по плановым работам
      - `id` (number, пример: `10100`) **required** — ID обновления внутри записи плановых работ
      - `message` (string, пример: `"Работы идут по плану. Возможны кратковременные перерывы в работе API."`) **required** — Текст апдейта
      - `is_initial` (boolean, пример: `true`) **required** — Является ли запись стартовым сообщением
      - `published_at` (string (date-time), пример: `"2026-03-06T16:12:00.000Z"`) **required** — Когда обновление было опубликовано
      - `servers` (array of object) **required** — Сервисы, которых касается это обновление
        - `id` (number, пример: `1`) **required** — ID сервиса на status page
        - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
    - `created_at` (string (date-time), пример: `"2026-03-18T12:00:00.000Z"`) **required** — Дата создания записи
  Пример:
  
  ```json
  {
    "id": 10100,
    "title": "Плановое обновление API Gateway",
    "description": "Во время обновления возможны кратковременные перерывы в работе API и панели управления.",
    "started_at": "2026-03-20T01:00:00.000Z",
    "ended_at": "2026-03-20T03:00:00.000Z",
    "servers": [
      {
        "id": 1,
        "name": "API Gateway"
      }
    ],
    "updates": [
      {
        "id": 10100,
        "message": "Работы идут по плану. Возможны кратковременные перерывы в работе API.",
        "is_initial": true,
        "published_at": "2026-03-06T16:12:00.000Z",
        "servers": [
          {
            "id": 1,
            "name": "API Gateway"
          }
        ]
      }
    ],
    "created_at": "2026-03-18T12:00:00.000Z"
  }
  ```

#### `PATCH /v1/status-pages/{id}/planned-maintenances/{maintenanceId}` — Обновить плановые работы для страницы статуса

**Аутентификация:** `bearer`

**Параметры (path):**

- `id` (number) **required**
- `maintenanceId` (number) **required**

**Тело запроса** (обязательное)

Content-Type: `application/json`

object
  - `title` (string, пример: `"Плановое обновление API Gateway"`) — Заголовок плановых работ
  - `description` (string, пример: `"Во время обновления возможны кратковременные перерывы в работе API и панели управления."`) — Описание плановых работ
  - `started_at` (string (date-time), пример: `"2026-03-20T01:00:00.000Z"`) — Время начала плановых работ
  - `ended_at` (string (date-time), пример: `"2026-03-20T03:00:00.000Z"`) — Время завершения плановых работ
  - `servers` (array of object) — Сервисы на странице статуса, затрагиваемые плановыми работами
    - `id` (number, пример: `1`) **required** — ID сервиса на странице статуса

Пример:

```json
{
  "title": "Плановое обновление API Gateway",
  "description": "Во время обновления возможны кратковременные перерывы в работе API и панели управления.",
  "started_at": "2026-03-20T01:00:00.000Z",
  "ended_at": "2026-03-20T03:00:00.000Z",
  "servers": [
    {
      "id": 1
    },
    {
      "id": 2
    },
    {
      "id": 3
    }
  ]
}
```

**Ответы:**
- `200`
  - `application/json`: object
    - `id` (number, пример: `10100`) **required** — ID плановых работ
    - `title` (string, пример: `"Плановое обновление API Gateway"`) **required** — Заголовок плановых работ
    - `description` (string, пример: `"Во время обновления возможны кратковременные перерывы в работе API и панели управления."`) **required** — Описание плановых работ
    - `started_at` (string (date-time), пример: `"2026-03-20T01:00:00.000Z"`) **required** — Время начала плановых работ
    - `ended_at` (string (date-time), пример: `"2026-03-20T03:00:00.000Z"`) **required** — Время завершения плановых работ
    - `servers` (array of object) **required** — Сервисы на странице статуса, затрагиваемые плановыми работами
      - `id` (number, пример: `1`) **required** — ID сервиса на status page
      - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
    - `updates` (array of object) **required** — История обновлений по плановым работам
      - `id` (number, пример: `10100`) **required** — ID обновления внутри записи плановых работ
      - `message` (string, пример: `"Работы идут по плану. Возможны кратковременные перерывы в работе API."`) **required** — Текст апдейта
      - `is_initial` (boolean, пример: `true`) **required** — Является ли запись стартовым сообщением
      - `published_at` (string (date-time), пример: `"2026-03-06T16:12:00.000Z"`) **required** — Когда обновление было опубликовано
      - `servers` (array of object) **required** — Сервисы, которых касается это обновление
        - `id` (number, пример: `1`) **required** — ID сервиса на status page
        - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
    - `created_at` (string (date-time), пример: `"2026-03-18T12:00:00.000Z"`) **required** — Дата создания записи
  Пример:
  
  ```json
  {
    "id": 10100,
    "title": "Плановое обновление API Gateway",
    "description": "Во время обновления возможны кратковременные перерывы в работе API и панели управления.",
    "started_at": "2026-03-20T01:00:00.000Z",
    "ended_at": "2026-03-20T03:00:00.000Z",
    "servers": [
      {
        "id": 1,
        "name": "API Gateway"
      }
    ],
    "updates": [
      {
        "id": 10100,
        "message": "Работы идут по плану. Возможны кратковременные перерывы в работе API.",
        "is_initial": true,
        "published_at": "2026-03-06T16:12:00.000Z",
        "servers": [
          {
            "id": 1,
            "name": "API Gateway"
          }
        ]
      }
    ],
    "created_at": "2026-03-18T12:00:00.000Z"
  }
  ```

#### `DELETE /v1/status-pages/{id}/planned-maintenances/{maintenanceId}` — Удалить плановые работы для страницы статуса

**Аутентификация:** `bearer`

**Параметры (path):**

- `id` (number) **required**
- `maintenanceId` (number) **required**

**Ответы:**
- `204`

#### `POST /v1/status-pages/{id}/planned-maintenances/{maintenanceId}/updates` — Добавить обновление в запись плановых работ для страницы статуса

**Аутентификация:** `bearer`

**Параметры (path):**

- `id` (number) **required**
- `maintenanceId` (number) **required**

**Тело запроса** (обязательное)

Content-Type: `application/json`

object
  - `message` (string, пример: `"Работы идут по плану. Возможны кратковременные перерывы в работе API."`) **required** — Текст апдейта о ходе плановых работ
  - `published_at` (string (date-time), пример: `"2026-03-20T01:30:00.000Z"`) — Время публикации апдейта

Пример:

```json
{
  "message": "Работы идут по плану. Возможны кратковременные перерывы в работе API.",
  "published_at": "2026-03-20T01:30:00.000Z"
}
```

**Ответы:**
- `201`
  - `application/json`: object
    - `id` (number, пример: `10100`) **required** — ID плановых работ
    - `title` (string, пример: `"Плановое обновление API Gateway"`) **required** — Заголовок плановых работ
    - `description` (string, пример: `"Во время обновления возможны кратковременные перерывы в работе API и панели управления."`) **required** — Описание плановых работ
    - `started_at` (string (date-time), пример: `"2026-03-20T01:00:00.000Z"`) **required** — Время начала плановых работ
    - `ended_at` (string (date-time), пример: `"2026-03-20T03:00:00.000Z"`) **required** — Время завершения плановых работ
    - `servers` (array of object) **required** — Сервисы на странице статуса, затрагиваемые плановыми работами
      - `id` (number, пример: `1`) **required** — ID сервиса на status page
      - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
    - `updates` (array of object) **required** — История обновлений по плановым работам
      - `id` (number, пример: `10100`) **required** — ID обновления внутри записи плановых работ
      - `message` (string, пример: `"Работы идут по плану. Возможны кратковременные перерывы в работе API."`) **required** — Текст апдейта
      - `is_initial` (boolean, пример: `true`) **required** — Является ли запись стартовым сообщением
      - `published_at` (string (date-time), пример: `"2026-03-06T16:12:00.000Z"`) **required** — Когда обновление было опубликовано
      - `servers` (array of object) **required** — Сервисы, которых касается это обновление
        - `id` (number, пример: `1`) **required** — ID сервиса на status page
        - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
    - `created_at` (string (date-time), пример: `"2026-03-18T12:00:00.000Z"`) **required** — Дата создания записи
  Пример:
  
  ```json
  {
    "id": 10100,
    "title": "Плановое обновление API Gateway",
    "description": "Во время обновления возможны кратковременные перерывы в работе API и панели управления.",
    "started_at": "2026-03-20T01:00:00.000Z",
    "ended_at": "2026-03-20T03:00:00.000Z",
    "servers": [
      {
        "id": 1,
        "name": "API Gateway"
      }
    ],
    "updates": [
      {
        "id": 10100,
        "message": "Работы идут по плану. Возможны кратковременные перерывы в работе API.",
        "is_initial": true,
        "published_at": "2026-03-06T16:12:00.000Z",
        "servers": [
          {
            "id": 1,
            "name": "API Gateway"
          }
        ]
      }
    ],
    "created_at": "2026-03-18T12:00:00.000Z"
  }
  ```

#### `PATCH /v1/status-pages/{id}/planned-maintenances/{maintenanceId}/updates/{updateId}` — Обновить сообщение в записи плановых работ для страницы статуса

**Аутентификация:** `bearer`

**Параметры (path):**

- `id` (number) **required**
- `maintenanceId` (number) **required**
- `updateId` (number) **required**

**Тело запроса** (обязательное)

Content-Type: `application/json`

object
  - `message` (string, пример: `"Работы идут по плану. Завершаем проверку и скоро опубликуем финальный апдейт."`) **required** — Обновлённый текст апдейта

Пример:

```json
{
  "message": "Работы идут по плану. Завершаем проверку и скоро опубликуем финальный апдейт."
}
```

**Ответы:**
- `200`
  - `application/json`: object
    - `id` (number, пример: `10100`) **required** — ID плановых работ
    - `title` (string, пример: `"Плановое обновление API Gateway"`) **required** — Заголовок плановых работ
    - `description` (string, пример: `"Во время обновления возможны кратковременные перерывы в работе API и панели управления."`) **required** — Описание плановых работ
    - `started_at` (string (date-time), пример: `"2026-03-20T01:00:00.000Z"`) **required** — Время начала плановых работ
    - `ended_at` (string (date-time), пример: `"2026-03-20T03:00:00.000Z"`) **required** — Время завершения плановых работ
    - `servers` (array of object) **required** — Сервисы на странице статуса, затрагиваемые плановыми работами
      - `id` (number, пример: `1`) **required** — ID сервиса на status page
      - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
    - `updates` (array of object) **required** — История обновлений по плановым работам
      - `id` (number, пример: `10100`) **required** — ID обновления внутри записи плановых работ
      - `message` (string, пример: `"Работы идут по плану. Возможны кратковременные перерывы в работе API."`) **required** — Текст апдейта
      - `is_initial` (boolean, пример: `true`) **required** — Является ли запись стартовым сообщением
      - `published_at` (string (date-time), пример: `"2026-03-06T16:12:00.000Z"`) **required** — Когда обновление было опубликовано
      - `servers` (array of object) **required** — Сервисы, которых касается это обновление
        - `id` (number, пример: `1`) **required** — ID сервиса на status page
        - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
    - `created_at` (string (date-time), пример: `"2026-03-18T12:00:00.000Z"`) **required** — Дата создания записи
  Пример:
  
  ```json
  {
    "id": 10100,
    "title": "Плановое обновление API Gateway",
    "description": "Во время обновления возможны кратковременные перерывы в работе API и панели управления.",
    "started_at": "2026-03-20T01:00:00.000Z",
    "ended_at": "2026-03-20T03:00:00.000Z",
    "servers": [
      {
        "id": 1,
        "name": "API Gateway"
      }
    ],
    "updates": [
      {
        "id": 10100,
        "message": "Работы идут по плану. Возможны кратковременные перерывы в работе API.",
        "is_initial": true,
        "published_at": "2026-03-06T16:12:00.000Z",
        "servers": [
          {
            "id": 1,
            "name": "API Gateway"
          }
        ]
      }
    ],
    "created_at": "2026-03-18T12:00:00.000Z"
  }
  ```

#### `DELETE /v1/status-pages/{id}/planned-maintenances/{maintenanceId}/updates/{updateId}` — Удалить сообщение из записи плановых работ для страницы статуса

**Аутентификация:** `bearer`

**Параметры (path):**

- `id` (number) **required**
- `maintenanceId` (number) **required**
- `updateId` (number) **required**

**Ответы:**
- `204`

## Модели данных

### AccountResponseDto

object
  - `id` (number, пример: `1`) **required** — ID аккаунта
  - `email` (string, пример: `"user@example.com"`) **required** — Электронная почта пользователя
  - `name` (string, пример: `"Иван Иванов"`) **required** — Имя пользователя
  - `status` (string, пример: `"active"`) **required** — Статус аккаунта
  - `password` (string, пример: `"password"`) **required** — Пароль аккаунта
  - `avatar_url` (object | null) **required** — URL аватара пользователя
  - `created_at` (string (date-time), пример: `"2023-01-01T00:00:00.000Z"`) **required** — Дата создания аккаунта
  - `password_changed_at` (object | null) **required** — Дата последней смены пароля
  - `timezone` (string, пример: `"Europe/Moscow"`) **required** — Часовой пояс, который используется для отображения времени в нотификациях
  - `is_ai_assistant_enabled` (boolean, пример: `true`) **required** — Отображается ли чат с ИИ помощником в панели управления

### UpdateAccountDto

object
  - `email` (string, пример: `"user@example.com"`) — Электронная почта пользователя
  - `name` (string, пример: `"Иван Иванов"`) — Имя пользователя
  - `timezone` (string, пример: `"Europe/Moscow"`) — Часовой пояс, который используется для отображения времени в нотификациях
  - `is_ai_assistant_enabled` (boolean, пример: `true`) — Отображается ли чат с ИИ помощником в панели управления

### PlanFeaturesResponseDto

object
  - `servers_limit` (number, пример: `50`) **required** — Максимальное количество серверов
  - `available_locations` (array of string) **required** — Список доступных локаций мониторинга
  - `allow_location_selection` (boolean, пример: `true`) **required** — Возможность ручного выбора локаций
  - `min_check_interval_seconds` (number, пример: `60`) **required** — Минимальный интервал проверок (в секундах)
  - `ssl_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга SSL
  - `domain_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга доменов
  - `dns_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга DNS
  - `dns_history_retention_days` (number, пример: `30`) **required** — Срок хранения истории DNS записей (в днях)
  - `keyword_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга ключевых слов
  - `heartbeat_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга heartbeat
  - `latency_alerts_enabled` (boolean, пример: `true`) **required** — Поддержка уведомлений о медленном ответе
  - `incident_retention_days` (number, пример: `60`) **required** — Срок хранения инцидентов (в днях)
  - `network_diagnostics_enabled` (boolean, пример: `true`) **required** — Доступность сетевой диагностики
  - `screenshots_enabled` (boolean, пример: `true`) **required** — Поддержка скриншотов при проверках
  - `incident_comments_enabled` (boolean, пример: `true`) **required** — Возможность комментирования инцидентов
  - `incident_report_enabled` (boolean, пример: `true`) **required** — Возможность скачивания отчета по инциденту
  - `webhook_notifications_enabled` (boolean, пример: `false`) **required** — Доступность вебхук-уведомлений
  - `status_pages_limit` (number, пример: `3`) **required** — Максимальное количество страниц статуса
  - `custom_domain_enabled` (boolean, пример: `true`) **required** — Поддержка подключения собственного домена
  - `password_protected_status_page` (boolean, пример: `true`) **required** — Защита страниц паролем
  - `indexing_control_enabled` (boolean, пример: `true`) **required** — Исключение страниц из индексации поисковиками
  - `white_label_enabled` (boolean, пример: `false`) **required** — Возможность вайтлейбла (удаления логотипа Статусера)
  - `status_page_minimum_incident_duration_enabled` (boolean, пример: `true`) **required** — Возможность задавать минимальную длительность инцидента для отображения на странице статуса
  - `status_page_incident_reports_per_month_limit` (number, пример: `1`) **required** — Лимит количества публичных отчётов по инцидентам для страниц статуса в месяц
  - `status_page_planned_maintenances_per_month_limit` (number, пример: `1`) **required** — Лимит количества записей о плановых работах для страниц статуса в месяц

### PlanResponseDto

object
  - `id` (number, пример: `2`) **required** — ID тарифа
  - `name` (string, пример: `"Pro"`) **required** — Название текущего тарифа
  - `price_per_month` (number, пример: `199`) **required** — Стоимость тарифа в месяц (в рублях)
  - `price_per_year` (number, пример: `1990`) **required** — Стоимость тарифа в год (в рублях)
  - `features` (object) **required** — Ограничения и возможности тарифа
    - `servers_limit` (number, пример: `50`) **required** — Максимальное количество серверов
    - `available_locations` (array of string) **required** — Список доступных локаций мониторинга
    - `allow_location_selection` (boolean, пример: `true`) **required** — Возможность ручного выбора локаций
    - `min_check_interval_seconds` (number, пример: `60`) **required** — Минимальный интервал проверок (в секундах)
    - `ssl_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга SSL
    - `domain_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга доменов
    - `dns_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга DNS
    - `dns_history_retention_days` (number, пример: `30`) **required** — Срок хранения истории DNS записей (в днях)
    - `keyword_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга ключевых слов
    - `heartbeat_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга heartbeat
    - `latency_alerts_enabled` (boolean, пример: `true`) **required** — Поддержка уведомлений о медленном ответе
    - `incident_retention_days` (number, пример: `60`) **required** — Срок хранения инцидентов (в днях)
    - `network_diagnostics_enabled` (boolean, пример: `true`) **required** — Доступность сетевой диагностики
    - `screenshots_enabled` (boolean, пример: `true`) **required** — Поддержка скриншотов при проверках
    - `incident_comments_enabled` (boolean, пример: `true`) **required** — Возможность комментирования инцидентов
    - `incident_report_enabled` (boolean, пример: `true`) **required** — Возможность скачивания отчета по инциденту
    - `webhook_notifications_enabled` (boolean, пример: `false`) **required** — Доступность вебхук-уведомлений
    - `status_pages_limit` (number, пример: `3`) **required** — Максимальное количество страниц статуса
    - `custom_domain_enabled` (boolean, пример: `true`) **required** — Поддержка подключения собственного домена
    - `password_protected_status_page` (boolean, пример: `true`) **required** — Защита страниц паролем
    - `indexing_control_enabled` (boolean, пример: `true`) **required** — Исключение страниц из индексации поисковиками
    - `white_label_enabled` (boolean, пример: `false`) **required** — Возможность вайтлейбла (удаления логотипа Статусера)
    - `status_page_minimum_incident_duration_enabled` (boolean, пример: `true`) **required** — Возможность задавать минимальную длительность инцидента для отображения на странице статуса
    - `status_page_incident_reports_per_month_limit` (number, пример: `1`) **required** — Лимит количества публичных отчётов по инцидентам для страниц статуса в месяц
    - `status_page_planned_maintenances_per_month_limit` (number, пример: `1`) **required** — Лимит количества записей о плановых работах для страниц статуса в месяц

### CurrentPlanResponseDto

object
  - `id` (number, пример: `2`) **required** — ID тарифа
  - `name` (string, пример: `"Pro"`) **required** — Название текущего тарифа
  - `price_per_month` (number, пример: `199`) **required** — Стоимость тарифа в месяц (в рублях)
  - `price_per_year` (number, пример: `1990`) **required** — Стоимость тарифа в год (в рублях)
  - `features` (object) **required** — Ограничения и возможности тарифа
    - `servers_limit` (number, пример: `50`) **required** — Максимальное количество серверов
    - `available_locations` (array of string) **required** — Список доступных локаций мониторинга
    - `allow_location_selection` (boolean, пример: `true`) **required** — Возможность ручного выбора локаций
    - `min_check_interval_seconds` (number, пример: `60`) **required** — Минимальный интервал проверок (в секундах)
    - `ssl_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга SSL
    - `domain_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга доменов
    - `dns_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга DNS
    - `dns_history_retention_days` (number, пример: `30`) **required** — Срок хранения истории DNS записей (в днях)
    - `keyword_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга ключевых слов
    - `heartbeat_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга heartbeat
    - `latency_alerts_enabled` (boolean, пример: `true`) **required** — Поддержка уведомлений о медленном ответе
    - `incident_retention_days` (number, пример: `60`) **required** — Срок хранения инцидентов (в днях)
    - `network_diagnostics_enabled` (boolean, пример: `true`) **required** — Доступность сетевой диагностики
    - `screenshots_enabled` (boolean, пример: `true`) **required** — Поддержка скриншотов при проверках
    - `incident_comments_enabled` (boolean, пример: `true`) **required** — Возможность комментирования инцидентов
    - `incident_report_enabled` (boolean, пример: `true`) **required** — Возможность скачивания отчета по инциденту
    - `webhook_notifications_enabled` (boolean, пример: `false`) **required** — Доступность вебхук-уведомлений
    - `status_pages_limit` (number, пример: `3`) **required** — Максимальное количество страниц статуса
    - `custom_domain_enabled` (boolean, пример: `true`) **required** — Поддержка подключения собственного домена
    - `password_protected_status_page` (boolean, пример: `true`) **required** — Защита страниц паролем
    - `indexing_control_enabled` (boolean, пример: `true`) **required** — Исключение страниц из индексации поисковиками
    - `white_label_enabled` (boolean, пример: `false`) **required** — Возможность вайтлейбла (удаления логотипа Статусера)
    - `status_page_minimum_incident_duration_enabled` (boolean, пример: `true`) **required** — Возможность задавать минимальную длительность инцидента для отображения на странице статуса
    - `status_page_incident_reports_per_month_limit` (number, пример: `1`) **required** — Лимит количества публичных отчётов по инцидентам для страниц статуса в месяц
    - `status_page_planned_maintenances_per_month_limit` (number, пример: `1`) **required** — Лимит количества записей о плановых работах для страниц статуса в месяц
  - `valid_until` (object) **required** — Срок действия текущего тарифа
  - `current_billing_period` (string | null, enum: "month", "year", пример: `"month"`) **required** — Период оплаты текущего тарифа
  - `pending_plan` (object | null) **required** — Планируемый тариф на который произойдет даунгрейд
    - `id` (number, пример: `2`) **required** — ID тарифа
    - `name` (string, пример: `"Pro"`) **required** — Название текущего тарифа
    - `price_per_month` (number, пример: `199`) **required** — Стоимость тарифа в месяц (в рублях)
    - `price_per_year` (number, пример: `1990`) **required** — Стоимость тарифа в год (в рублях)
    - `features` (object) **required** — Ограничения и возможности тарифа
      - `servers_limit` (number, пример: `50`) **required** — Максимальное количество серверов
      - `available_locations` (array of string) **required** — Список доступных локаций мониторинга
      - `allow_location_selection` (boolean, пример: `true`) **required** — Возможность ручного выбора локаций
      - `min_check_interval_seconds` (number, пример: `60`) **required** — Минимальный интервал проверок (в секундах)
      - `ssl_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга SSL
      - `domain_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга доменов
      - `dns_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга DNS
      - `dns_history_retention_days` (number, пример: `30`) **required** — Срок хранения истории DNS записей (в днях)
      - `keyword_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга ключевых слов
      - `heartbeat_monitoring_enabled` (boolean, пример: `true`) **required** — Поддержка мониторинга heartbeat
      - `latency_alerts_enabled` (boolean, пример: `true`) **required** — Поддержка уведомлений о медленном ответе
      - `incident_retention_days` (number, пример: `60`) **required** — Срок хранения инцидентов (в днях)
      - `network_diagnostics_enabled` (boolean, пример: `true`) **required** — Доступность сетевой диагностики
      - `screenshots_enabled` (boolean, пример: `true`) **required** — Поддержка скриншотов при проверках
      - `incident_comments_enabled` (boolean, пример: `true`) **required** — Возможность комментирования инцидентов
      - `incident_report_enabled` (boolean, пример: `true`) **required** — Возможность скачивания отчета по инциденту
      - `webhook_notifications_enabled` (boolean, пример: `false`) **required** — Доступность вебхук-уведомлений
      - `status_pages_limit` (number, пример: `3`) **required** — Максимальное количество страниц статуса
      - `custom_domain_enabled` (boolean, пример: `true`) **required** — Поддержка подключения собственного домена
      - `password_protected_status_page` (boolean, пример: `true`) **required** — Защита страниц паролем
      - `indexing_control_enabled` (boolean, пример: `true`) **required** — Исключение страниц из индексации поисковиками
      - `white_label_enabled` (boolean, пример: `false`) **required** — Возможность вайтлейбла (удаления логотипа Статусера)
      - `status_page_minimum_incident_duration_enabled` (boolean, пример: `true`) **required** — Возможность задавать минимальную длительность инцидента для отображения на странице статуса
      - `status_page_incident_reports_per_month_limit` (number, пример: `1`) **required** — Лимит количества публичных отчётов по инцидентам для страниц статуса в месяц
      - `status_page_planned_maintenances_per_month_limit` (number, пример: `1`) **required** — Лимит количества записей о плановых работах для страниц статуса в месяц
  - `pending_plan_effective_at` (object | null) **required** — Дата применения запланированного даунгрейда

### CreateServerDto

object
  - `host` (string, пример: `"192.168.1.1"`) **required** — Адрес нового сервера
  - `protocol` (string, пример: `"http"`) **required** — Протокол проверки
  - `port` (number, пример: `"22"`) **required** — Порт для проверки
  - `http_method` (string, enum: "head", "get", "options", "post", "put", "patch", пример: `"head"`) **required** — HTTP метод
  - `body` (object | null) **required** — Тело запроса
  - `keyword` (object | null) **required** — Ключевое слово для мониторинга
  - `keyword_mode` (string | null, enum: "present", "absent", пример: `"present"`) **required** — Режим проверки ключевого слова: успех если слово есть/если слова нет
  - `headers` (array of string) **required** — Собственные заголовки запроса
  - `is_follow_redirects` (boolean, пример: `true`) **required** — Следовать за редиректами или нет
  - `request_timeout` (number, пример: `"10"`) **required** — Таймаут запроса
  - `check_interval` (number, пример: `60`) **required** — Интервал проверки сервера в секундах
  - `heartbeat_grace_interval` (object | null) — Допустимое опоздание в секундах для heartbeat: сколько ждать сверх check_interval
  - `name` (string, пример: `"Восхитительный сервер"`) **required** — Название сервиса
  - `description` (string, пример: `"Восхитительный сервер для проверки статуса"`) **required** — Описание сервиса
  - `is_ssl_check` (boolean, пример: `true`) **required** — Требуется ли выполнять проверку SSL-сертификата
  - `is_domain_check` (boolean, пример: `true`) **required** — Требуется ли выполнять проверку домена
  - `is_latency_alert_enabled` (boolean, пример: `true`) — Включить уведомления о медленном ответе сервера
  - `latency_trigger_ms` (number, пример: `800`) — Порог в мс для определения медленного ответа
  - `locations` (array of `unknown`) **required** — Локации, из которых требуется выполнять проверки
  - `dns_record_types` (string, enum: "A", "AAAA", "CNAME", "MX", "TXT", "NS", "SOA", "PTR", "SRV", пример: `["A","AAAA","MX"]`) **required** — Типы DNS записей для мониторинга

### DnsRecord

object
  - `record_type` (string, enum: "A", "AAAA", "CNAME", "MX", "TXT", "NS", "SOA", "PTR", "SRV", пример: `"A"`) **required** — Тип DNS записи
  - `records` (array of string) **required** — Структурированные значения DNS записей

### ServerResponseDto

object
  - `id` (number, пример: `1`) **required** — ID сервера
  - `host` (string, пример: `"192.168.1.1"`) **required** — IP адрес сервера
  - `protocol` (string, пример: `"http"`) **required** — Протокол сервера
  - `heartbeat_token` (object | null) **required** — Токен для heartbeat URL (только для protocol=heartbeat)
  - `last_heartbeat_at` (object | null) **required** — Время последнего полученного heartbeat (только для protocol=heartbeat)
  - `heartbeat_grace_interval` (object | null) **required** — Допустимое опоздание в секундах для heartbeat: сколько ждать сверх check_interval
  - `port` (object) **required** — Порт для проверки tcp
  - `http_method` (string, enum: "head", "get", "options", "post", "put", "patch", пример: `"head"`) **required** — HTTP метод
  - `request_timeout` (number, пример: `"10"`) **required** — Таймаут запроса
  - `check_interval` (number, пример: `60`) **required** — Интервал проверки сервера в секундах
  - `name` (object) **required** — Название сервиса
  - `description` (object | null) **required** — Описание сервиса
  - `status` (string, пример: `"online"`) **required** — Текущий статус сервиса
  - `body` (object | null) **required** — Тело запроса для проверки
  - `keyword` (object | null) **required** — Ключевое слово для мониторинга
  - `keyword_mode` (string | null, enum: "present", "absent", пример: `"present"`) **required** — Режим проверки ключевого слова
  - `headers` (array of string) **required** — Собственные заголовки запроса
  - `is_follow_redirects` (boolean, пример: `true`) **required** — Следовать за редиректами или нет
  - `last_unavailable_at` (object) **required** — Время, когда сервер в последний раз стал недоступен (начало текущего или последнего инцидента)
  - `last_available_at` (object) **required** — Время, когда сервер в последний раз восстановил доступность (завершение последнего инцидента или последняя успешная проверка)
  - `last_checked_at` (object) **required** — Время последней проверки сервера
  - `is_ssl_check` (boolean, пример: `true`) **required** — Включены ли проверки SSL-сертификата
  - `ssl` (object) **required** — Информация о SSL-сертификате
  - `is_domain_check` (boolean, пример: `true`) **required** — Включены ли проверки времени окончания домена
  - `domain` (object) **required** — Информация о домене
  - `is_latency_alert_enabled` (boolean, пример: `true`) **required** — Включены ли уведомления о медленном ответе
  - `latency_trigger_ms` (number, пример: `800`) **required** — Порог в мс для перехода в состояние SLOW
  - `locations` (array of string) **required** — Локации, из которых выполняются проверки
  - `dns_record_types` (object | null) **required** — Типы DNS записей для мониторинга
  - `dns_records` (array of object | null) **required** — Текущие DNS записи домена
    - `record_type` (string, enum: "A", "AAAA", "CNAME", "MX", "TXT", "NS", "SOA", "PTR", "SRV", пример: `"A"`) **required** — Тип DNS записи
    - `records` (array of string) **required** — Структурированные значения DNS записей
  - `dns_error_code` (string | null, enum: "NODATA", "NXDOMAIN", "SERVFAIL", "REFUSED", "FORMERR", "NOTIMP", "UNKNOWN", пример: `"NODATA"`) **required** — Код последней DNS ошибки (только для protocol=dns)
  - `created_at` (string (date-time), пример: `"2023-01-01T00:00:00.000Z"`) **required** — Время создания сервера

### ServerHeader

object
  - `key` (string, пример: `"Content-Type"`) **required** — Ключ заголовка
  - `value` (string, пример: `"application/json"`) **required** — Значение заголовка

### UpdateServerDto

object
  - `host` (string, пример: `"192.168.1.1"`) — Адрес сервера
  - `protocol` (string, пример: `"http"`) — Протокол проверки
  - `port` (number, пример: `22`) — Порт для проверки
  - `http_method` (string, enum: "head", "get", "options", "post", "put", "patch", пример: `"head"`) **required** — HTTP метод
  - `body` (object | null) **required** — Тело запроса
  - `keyword` (object | null) — Ключевое слово для мониторинга
  - `keyword_mode` (string | null, enum: "present", "absent", пример: `"present"`) — Режим проверки ключевого слова
  - `headers` (array of object) **required** — Собственные заголовки запроса
    - `key` (string, пример: `"Content-Type"`) **required** — Ключ заголовка
    - `value` (string, пример: `"application/json"`) **required** — Значение заголовка
  - `is_follow_redirects` (boolean, пример: `true`) **required** — Следовать за редиректами или нет
  - `request_timeout` (number, пример: `"10"`) **required** — Таймаут запроса
  - `check_interval` (number, пример: `60`) — Интервал проверки сервера в секундах
  - `heartbeat_grace_interval` (object | null) — Период ожидания в секундах для heartbeat: сколько ждать сверх check_interval
  - `name` (string, пример: `"Восхитительный сервер"`) — Название сервиса
  - `description` (string, пример: `"Восхитительный сервер для проверки статуса"`) **required** — Описание сервиса
  - `is_ssl_check` (boolean, пример: `true`) **required** — Требуется ли выполнять проверку SSL-сертификата
  - `is_domain_check` (boolean, пример: `true`) **required** — Требуется ли выполнять проверку домена
  - `is_latency_alert_enabled` (boolean, пример: `true`) — Включить уведомления о медленном ответе сервера
  - `latency_trigger_ms` (number, пример: `800`) — Порог (мс) для определения медленного ответа
  - `locations` (array of `unknown`) **required** — Локации, из которых требуется выполнять проверки
  - `dns_record_types` (string, enum: "A", "AAAA", "CNAME", "MX", "TXT", "NS", "SOA", "PTR", "SRV", пример: `["A","AAAA","MX"]`) — Типы DNS записей для мониторинга

### DnsRecordDiffResponseDto

object
  - `id` (number, пример: `1`) **required** — Уникальный идентификатор изменения
  - `domain` (string, пример: `"example.com"`) **required** — Доменное имя
  - `record_type` (string, enum: "A", "AAAA", "CNAME", "MX", "TXT", "NS", "SOA", "PTR", "SRV", пример: `"A"`) **required** — Тип DNS записи
  - `added_records` (object | null) **required** — Добавленные DNS записи
  - `removed_records` (object | null) **required** — Удаленные DNS записи
  - `change_type` (string, enum: "added", "modified", "removed", пример: `"modified"`) **required** — Тип изменения
  - `changed_at` (string (date-time), пример: `"2023-01-01T00:00:00.000Z"`) **required** — Время изменения записи

### NotificationRuleResponseDto

object
  - `type` (string, enum: "updates", "weekly_reports", "service_alerts", "test_alerts", "ssl_alerts", "domain_alerts", "dns_alerts", "ideas", "billing_alerts", "holiday_mode", "api_key_alerts", "security_alerts", "receipt", пример: `"service_alerts"`) **required** — Тип подписки на уведомления, например, для оповещений или обновлений
  - `channels` (object) **required** — Каналы для уведомлений и их активный статус
    - `email` (boolean, пример: `true`) — Включены ли уведомления на емейл для данного типа подписки
    - `telegram` (boolean, пример: `true`) — Включены ли уведомления в Телеграм для данного типа подписки
    - `max` (boolean, пример: `true`) — Включены ли уведомления в MAX для данного типа подписки

### CreateNotificationRuleDto

object
  - `type` (string, enum: "updates", "weekly_reports", "service_alerts", "test_alerts", "ssl_alerts", "domain_alerts", "dns_alerts", "ideas", "billing_alerts", "holiday_mode", "api_key_alerts", "security_alerts", "receipt", пример: `"service_alerts"`) **required** — Тип подписки на уведомления, например, для оповещений или обновлений
  - `email` (boolean, пример: `true`) **required** — Включены ли уведомления по емейл для данного типа подписки
  - `telegram` (boolean, пример: `true`) **required** — Включены ли уведомления в Телеграм для данного типа подписки
  - `max` (boolean, пример: `true`) **required** — Включены ли уведомления в MAX для данного типа подписки

### WebhookEndpointResponseDto

object
  - `id` (number, пример: `1`) **required** — ID вебхука
  - `name` (string, пример: `"Slack prod"`) **required** — Название вебхука
  - `url` (string, пример: `"https://example.com/webhooks/statuser"`) **required** — URL, куда будет отправляться вебхук
  - `subscriptions` (array of string, enum: "updates", "weekly_reports", "service_alerts", "test_alerts", "ssl_alerts", "domain_alerts", "dns_alerts", "ideas", "billing_alerts", "holiday_mode", "api_key_alerts", "security_alerts", "receipt") **required** — Список подписок, которые отправляются на этот webhook
  - `is_secret_set` (boolean, пример: `true`) **required** — Указан ли секрет для подписи запросов вебхука
  - `created_at` (string (date-time), пример: `"2026-02-08T12:00:00.000Z"`) **required** — Дата добавления вебхука

### CreateWebhookEndpointDto

object
  - `name` (string, пример: `"Slack prod"`) **required** — Название вебхука
  - `url` (string, пример: `"https://example.com/webhooks/statuser"`) **required** — URL, куда будет отправляться вебхук
  - `secret` (object | null) **required** — Секрет для подписи запросов вебхука. Не возвращается обратно из API
  - `subscriptions` (array of string, enum: "updates", "weekly_reports", "service_alerts", "test_alerts", "ssl_alerts", "domain_alerts", "dns_alerts", "ideas", "billing_alerts", "holiday_mode", "api_key_alerts", "security_alerts", "receipt") **required** — Список типов подписок, которые должны отправляться на этот вебхук

### UpdateWebhookEndpointDto

object
  - `name` (string, пример: `"Slack prod"`) — Название вебхука
  - `url` (string, пример: `"https://example.com/webhooks/statuser"`) — URL, куда будет отправляться вебхук
  - `secret` (object | null) — Секрет для подписи запросов вебхука. Не возвращается обратно из API
  - `subscriptions` (array of string, enum: "updates", "weekly_reports", "service_alerts", "test_alerts", "ssl_alerts", "domain_alerts", "dns_alerts", "ideas", "billing_alerts", "holiday_mode", "api_key_alerts", "security_alerts", "receipt") — Список типов подписок, которые должны отправляться на этот вебхук

### CreateMaxLinkDto

object
  - `link_user` (string, пример: `"https://max.ru/statuser_notify_bot?start=ab12cd34"`) **required** — Ссылка для привязки аккаунта MAX пользователя
  - `link_group` (string, пример: `"https://max.ru/statuser_notify_bot?start=ab12cd34_group"`) **required** — Ссылка для запуска групповой привязки в MAX

### MaxResponseDto

object
  - `max_id` (string, пример: `"1234567890"`) **required** — ID чата в Max
  - `max_name` (object | null) **required** — Название чата или имя пользователя
  - `avatar_url` (object | null) **required** — Прямая ссылка на аватар в S3
  - `type` (string, enum: "user", "chat", пример: `"chat"`) **required** — Тип получателя: пользователь или чат
  - `created_at` (string (date-time), пример: `"2024-11-30T14:48:00.000Z"`) **required** — Дата привязки аккаунта MAX
  - `is_2fa_account` (boolean, пример: `true`) **required** — Используется ли аккаунт для двухфакторной аутентификации

### UpdateMaxDto

object
  - `max_id` (string) **required** — ID чата в Max

### HolidayModeResponseDto

object
  - `holiday_until` (string | null) **required** — Дата и время (UTC) до включения уведомлений, либо null, если режим отключен

### CreateHolidayModeDto

object
  - `holiday_until` (object | null) **required** — Дата и время (UTC) до включения уведомлений, либо null для выключения режима

### IncidentResponseDto

object
  - `id` (number, пример: `1`) **required** — ID инцидента
  - `server_id` (number, пример: `1`) **required** — ID сервера
  - `started_at` (string (date-time), пример: `"2023-01-01T00:00:00.000Z"`) **required** — Время начала инцидента
  - `ended_at` (object | null) **required** — Время окончания инцидента
  - `status` (string, enum: "ongoing", "resolved", "dismissed", "auto_closed_changed", "auto_closed_timeout", пример: `"resolved"`) **required** — Статус инцидента
  - `root_error` (string) **required** — Основная ошибка проверки сервера
  - `keyword` (object | null) **required** — Ключевое слово, которое искали при типе проверки keyword
  - `screenshot` (object) **required** — Ссылка на скриншот страницы
  - `replay` (object) **required** — Команда для повтора запроса
  - `details` (object) **required** — Детали проваленной проверки

### IncidentEventResponseDto

object
  - `created_at` (string (date-time), пример: `"2023-01-01T00:00:00.000Z"`) **required** — Время создания события
  - `type` (string, enum: "error", "resolved", "notification", "comment", "start", "end", пример: `"end"`) **required** — Тип события
  - `meta` (`ErrorMeta` | `NotificationMeta` | `CommentMeta` | null) **required** — Метаданные события

### IncidentSummaryResponseDto

object
  - `summary` (object) **required** — Сгенерированное ИИ саммари диагностики инцидента
  - `rating` (string | null, enum: "positive", "negative", пример: `"positive"`) **required** — Оценка саммари пользователем

### IncidentSummaryRatingDto

object
  - `rating` (string | null, enum: "positive", "negative", пример: `"positive"`) **required** — Оценка саммари

### IncidentCommentAttachmentDto

object
  - `url` (string, пример: `"https://s3.statuser.cloud/incident-attachments-dev/uuid.png"`) **required** — URL вложенного файла
  - `file_name` (string, пример: `"error-screenshot.png"`) **required** — Имя вложенного файла

### CreateIncidentCommentDto

object
  - `comment_text` (string, пример: `"Текст комментария"`) **required** — Текст комментария
  - `attached_files` (array of object) — Список прикрепленных файлов
    - `url` (string, пример: `"https://s3.statuser.cloud/incident-attachments-dev/uuid.png"`) **required** — URL вложенного файла
    - `file_name` (string, пример: `"error-screenshot.png"`) **required** — Имя вложенного файла

### CommentResponseDto

object
  - `id` (number, пример: `1`) **required** — ID комментария
  - `comment_text` (string, пример: `"Комментарий"`) **required** — Текст комментария
  - `attached_files` (array of object) **required** — Прикрепленные к комментарию файлы
    - `url` (string, пример: `"https://s3.statuser.cloud/incident-attachments-dev/uuid.png"`) **required** — URL вложенного файла
    - `file_name` (string, пример: `"error-screenshot.png"`) **required** — Имя вложенного файла
  - `created_at` (string (date-time), пример: `"2023-01-01T00:00:00.000Z"`) **required** — Дата создания комментария
  - `updated_at` (string (date-time), пример: `"2023-01-01T00:00:00.000Z"`) **required** — Дата обновления комментария

### CreateIncidentCommentUploadUrlDto

object
  - `file_name` (string, пример: `"incident-log.txt"`) **required** — Имя файла для загрузки
  - `content_type` (string, пример: `"text/plain"`) — MIME-тип файла
  - `file_size` (number, пример: `1024`) — Размер файла в байтах

### PresignedUploadUrlResponseDto

object
  - `uploadUrl` (string, пример: `"https://s3.timeweb.cloud/..."`) **required**
  - `fileUrl` (string, пример: `"https://s3.statuser.cloud/status-pages/..."`) **required**

### UpdateIncidentCommentDto

object
  - `comment_text` (string, пример: `"Текст комментария"`) — Текст комментария
  - `attached_files` (array of object) — Список прикрепленных файлов с именами
    - `url` (string, пример: `"https://s3.statuser.cloud/incident-attachments-dev/uuid.png"`) **required** — URL вложенного файла
    - `file_name` (string, пример: `"error-screenshot.png"`) **required** — Имя вложенного файла

### CheckSlugAvailabilityResponseDto

object
  - `available` (boolean, пример: `true`) **required** — Флаг, указывающий, свободен ли путь

### CheckDomainAvailabilityResponseDto

object
  - `available` (boolean, пример: `true`) **required** — Флаг, указывающий, не занят ли домен другой страницей статуса
  - `cname_valid` (boolean, пример: `true`) **required** — Флаг, указывающий, корректно ли настроена CNAME-запись

### PresignedUploadUrlDto

object
  - `type` (string, enum: "logo", "favicon") **required**

### StatusPageDomain

object
  - `domain` (string, пример: `"up.example.com"`) **required** — Домен страницы статуса
  - `status` (string, пример: `"active"`) **required** — Статус домена

### ReportServerStatusPage

object
  - `name` (string, пример: `"My Server"`) **required** — Публичное имя сервера на странице статуса
  - `description` (string | null, пример: `"My Server"`) **required** — Комментарий к серверу
  - `uptime` (number, пример: `99.93`) **required** — Общее время безотказной работы сервера в процентах
  - `current_status` (string, enum: "operational", "downtime", "not_monitored", "degraded", "under_maintenance", пример: `"operational"`) **required** — Статус доступности сервера
  - `order` (number, пример: `99.93`) **required** — Общее время безотказной работы сервера в процентах
  - `group_id` (number, пример: `1`) **required** — Идентификатор группы серверов
  - `availability` (array of array of `unknown`) **required** — Доступность сервера по датам

### ReportServerGroupStatusPage

object
  - `id` (number, пример: `1`) **required** — Идентификатор группы
  - `name` (string, пример: `"Бэкенд-сервисы"`) **required** — Имя группы
  - `description` (string | null, пример: `"Группа для основных API-сервисов"`) **required** — Описание группы
  - `order` (number, пример: `0`) **required** — Порядок отображения группы
  - `status` (string, пример: `"operational"`) **required** — Статус группы

### StatusPageIncidentReportLinkedIncidentResponseDto

object
  - `incident_id` (number, пример: `42`) **required** — ID инцидента
  - `server_id` (number, пример: `7`) **required** — ID сервера, к которому относится инцидент
  - `server_name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервера на странице статуса
  - `status` (string, enum: "ongoing", "resolved", "dismissed", "auto_closed_changed", "auto_closed_timeout", пример: `"ongoing"`) **required** — Статус инцидента
  - `started_at` (string (date-time), пример: `"2026-03-06T16:10:00.000Z"`) **required** — Время начала инцидента
  - `ended_at` (object | null) **required** — Время окончания инцидента

### StatusPageIncidentReportServerDto

object
  - `id` (number, пример: `1`) **required** — ID сервиса на status page
  - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
  - `status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Статус влияния на сервис

### StatusPageIncidentReportUpdateResponseDto

object
  - `id` (number, пример: `10100`) **required** — ID обновления внутри отчёта
  - `message` (string, пример: `"Мы нашли причину сбоя и уже выкатываем исправление. Следующее обновление через 10 минут"`) **required** — Текст апдейта
  - `is_initial` (boolean, пример: `true`) **required** — Является ли запись стартовым сообщением отчёта
  - `published_at` (string (date-time), пример: `"2026-03-06T16:12:00.000Z"`) **required** — Когда обновление было опубликовано
  - `servers` (array of object) **required** — Статусы серверов на момент этого обновления
    - `id` (number, пример: `1`) **required** — ID сервиса на status page
    - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
    - `status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Статус влияния на сервис

### StatusPageIncidentReportResponseDto

object
  - `id` (number, пример: `10100`) **required** — ID отчёта
  - `title` (string, пример: `"Проблемы с доступностью API Gateway"`) **required** — Заголовок отчёта
  - `started_at` (string (date-time), пример: `"2026-03-06T16:10:00.000Z"`) **required** — Время начала отчёта
  - `current_status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Текущий статус отчёта по последнему известному состоянию сервисов
  - `incidents` (array of object) **required** — Инциденты, связанные с отчётом
    - `incident_id` (number, пример: `42`) **required** — ID инцидента
    - `server_id` (number, пример: `7`) **required** — ID сервера, к которому относится инцидент
    - `server_name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервера на странице статуса
    - `status` (string, enum: "ongoing", "resolved", "dismissed", "auto_closed_changed", "auto_closed_timeout", пример: `"ongoing"`) **required** — Статус инцидента
    - `started_at` (string (date-time), пример: `"2026-03-06T16:10:00.000Z"`) **required** — Время начала инцидента
    - `ended_at` (object | null) **required** — Время окончания инцидента
  - `servers` (array of object) **required** — Актуальные статусы сервисов внутри отчёта
    - `id` (number, пример: `1`) **required** — ID сервиса на status page
    - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
    - `status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Статус влияния на сервис
  - `updates` (array of object) **required** — Таймлайн сообщений внутри отчёта
    - `id` (number, пример: `10100`) **required** — ID обновления внутри отчёта
    - `message` (string, пример: `"Мы нашли причину сбоя и уже выкатываем исправление. Следующее обновление через 10 минут"`) **required** — Текст апдейта
    - `is_initial` (boolean, пример: `true`) **required** — Является ли запись стартовым сообщением отчёта
    - `published_at` (string (date-time), пример: `"2026-03-06T16:12:00.000Z"`) **required** — Когда обновление было опубликовано
    - `servers` (array of object) **required** — Статусы серверов на момент этого обновления
      - `id` (number, пример: `1`) **required** — ID сервиса на status page
      - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
      - `status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Статус влияния на сервис

### StatusPagePlannedMaintenanceServerDto

object
  - `id` (number, пример: `1`) **required** — ID сервиса на status page
  - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса

### StatusPagePlannedMaintenanceUpdateResponseDto

object
  - `id` (number, пример: `10100`) **required** — ID обновления внутри записи плановых работ
  - `message` (string, пример: `"Работы идут по плану. Возможны кратковременные перерывы в работе API."`) **required** — Текст апдейта
  - `is_initial` (boolean, пример: `true`) **required** — Является ли запись стартовым сообщением
  - `published_at` (string (date-time), пример: `"2026-03-06T16:12:00.000Z"`) **required** — Когда обновление было опубликовано
  - `servers` (array of object) **required** — Сервисы, которых касается это обновление
    - `id` (number, пример: `1`) **required** — ID сервиса на status page
    - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса

### StatusPagePlannedMaintenanceResponseDto

object
  - `id` (number, пример: `10100`) **required** — ID плановых работ
  - `title` (string, пример: `"Плановое обновление API Gateway"`) **required** — Заголовок плановых работ
  - `description` (string, пример: `"Во время обновления возможны кратковременные перерывы в работе API и панели управления."`) **required** — Описание плановых работ
  - `started_at` (string (date-time), пример: `"2026-03-20T01:00:00.000Z"`) **required** — Время начала плановых работ
  - `ended_at` (string (date-time), пример: `"2026-03-20T03:00:00.000Z"`) **required** — Время завершения плановых работ
  - `servers` (array of object) **required** — Сервисы на странице статуса, затрагиваемые плановыми работами
    - `id` (number, пример: `1`) **required** — ID сервиса на status page
    - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
  - `updates` (array of object) **required** — История обновлений по плановым работам
    - `id` (number, пример: `10100`) **required** — ID обновления внутри записи плановых работ
    - `message` (string, пример: `"Работы идут по плану. Возможны кратковременные перерывы в работе API."`) **required** — Текст апдейта
    - `is_initial` (boolean, пример: `true`) **required** — Является ли запись стартовым сообщением
    - `published_at` (string (date-time), пример: `"2026-03-06T16:12:00.000Z"`) **required** — Когда обновление было опубликовано
    - `servers` (array of object) **required** — Сервисы, которых касается это обновление
      - `id` (number, пример: `1`) **required** — ID сервиса на status page
      - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
  - `created_at` (string (date-time), пример: `"2026-03-18T12:00:00.000Z"`) **required** — Дата создания записи

### StatusPageResponseDto

object
  - `id` (number, пример: `1`) **required** — ID страницы статуса
  - `name` (string, пример: `"Statuser"`) **required** — Название страницы статуса
  - `status` (string, пример: `"operational"`) **required** — Общий статус сервисов
  - `slug` (string, пример: `"statuser"`) **required** — Уникальный путь страницы статуса
  - `description` (object | null) **required** — Описание страницы статуса
  - `logo_url` (object | null) **required** — URL логотипа
  - `favicon_url` (object | null) **required** — URL фавикона
  - `company_url` (object | null) **required** — URL сайта компании
  - `support_url` (object | null) **required** — Email службы поддержки
  - `domains` (array of object) **required** — Привязанные к странице статуса домены
    - `domain` (string, пример: `"up.example.com"`) **required** — Домен страницы статуса
    - `status` (string, пример: `"active"`) **required** — Статус домена
  - `is_indexed` (boolean, пример: `true`) **required** — Индексируется ли страница поисковиками
  - `is_published` (boolean, пример: `true`) **required** — Опубликована ли страница
  - `is_white_labeled` (boolean, пример: `false`) **required** — Вайт-лейблинг: скрыт ли бренд Statuser
  - `timeline_days` (number, пример: `60`) **required** — Количество дней, показываемых в таймлайне
  - `timezone` (string, пример: `"Europe/Moscow"`) **required** — Таймзона страницы статуса
  - `uptime_decimal_places` (number, пример: `2`) **required** — Количество знаков после запятой у аптайма
  - `theme_mode` (string, enum: "user", "light", "dark", пример: `"user"`) **required** — Режим темы страницы статуса
  - `is_not_monitored_operational` (boolean, пример: `false`) **required** — Показывать ли статус Не в мониторинге зелёным, как Доступен
  - `minimum_incident_duration` (number, пример: `0`) **required** — Минимальная длительность инцидента в секундах для отображения на странице
  - `is_password_protected` (boolean, пример: `true`) **required** — Защищена ли страница статуса паролем
  - `servers` (array of object) **required** — Список серверов, добавленных на страницу статуса
    - `name` (string, пример: `"My Server"`) **required** — Публичное имя сервера на странице статуса
    - `description` (string | null, пример: `"My Server"`) **required** — Комментарий к серверу
    - `uptime` (number, пример: `99.93`) **required** — Общее время безотказной работы сервера в процентах
    - `current_status` (string, enum: "operational", "downtime", "not_monitored", "degraded", "under_maintenance", пример: `"operational"`) **required** — Статус доступности сервера
    - `order` (number, пример: `99.93`) **required** — Общее время безотказной работы сервера в процентах
    - `group_id` (number, пример: `1`) **required** — Идентификатор группы серверов
    - `availability` (array of array of `unknown`) **required** — Доступность сервера по датам
  - `groups` (array of object) **required** — Список групп серверов
    - `id` (number, пример: `1`) **required** — Идентификатор группы
    - `name` (string, пример: `"Бэкенд-сервисы"`) **required** — Имя группы
    - `description` (string | null, пример: `"Группа для основных API-сервисов"`) **required** — Описание группы
    - `order` (number, пример: `0`) **required** — Порядок отображения группы
    - `status` (string, пример: `"operational"`) **required** — Статус группы
  - `incident_reports` (array of object) **required** — Публичные отчёты по инцидентам на странице статуса
    - `id` (number, пример: `10100`) **required** — ID отчёта
    - `title` (string, пример: `"Проблемы с доступностью API Gateway"`) **required** — Заголовок отчёта
    - `started_at` (string (date-time), пример: `"2026-03-06T16:10:00.000Z"`) **required** — Время начала отчёта
    - `current_status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Текущий статус отчёта по последнему известному состоянию сервисов
    - `incidents` (array of object) **required** — Инциденты, связанные с отчётом
      - `incident_id` (number, пример: `42`) **required** — ID инцидента
      - `server_id` (number, пример: `7`) **required** — ID сервера, к которому относится инцидент
      - `server_name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервера на странице статуса
      - `status` (string, enum: "ongoing", "resolved", "dismissed", "auto_closed_changed", "auto_closed_timeout", пример: `"ongoing"`) **required** — Статус инцидента
      - `started_at` (string (date-time), пример: `"2026-03-06T16:10:00.000Z"`) **required** — Время начала инцидента
      - `ended_at` (object | null) **required** — Время окончания инцидента
    - `servers` (array of object) **required** — Актуальные статусы сервисов внутри отчёта
      - `id` (number, пример: `1`) **required** — ID сервиса на status page
      - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
      - `status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Статус влияния на сервис
    - `updates` (array of object) **required** — Таймлайн сообщений внутри отчёта
      - `id` (number, пример: `10100`) **required** — ID обновления внутри отчёта
      - `message` (string, пример: `"Мы нашли причину сбоя и уже выкатываем исправление. Следующее обновление через 10 минут"`) **required** — Текст апдейта
      - `is_initial` (boolean, пример: `true`) **required** — Является ли запись стартовым сообщением отчёта
      - `published_at` (string (date-time), пример: `"2026-03-06T16:12:00.000Z"`) **required** — Когда обновление было опубликовано
      - `servers` (array of object) **required** — Статусы серверов на момент этого обновления
        - `id` (number, пример: `1`) **required** — ID сервиса на status page
        - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
        - `status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"degraded"`) **required** — Статус влияния на сервис
  - `planned_maintenances` (array of object) **required** — Плановые работы на странице статуса
    - `id` (number, пример: `10100`) **required** — ID плановых работ
    - `title` (string, пример: `"Плановое обновление API Gateway"`) **required** — Заголовок плановых работ
    - `description` (string, пример: `"Во время обновления возможны кратковременные перерывы в работе API и панели управления."`) **required** — Описание плановых работ
    - `started_at` (string (date-time), пример: `"2026-03-20T01:00:00.000Z"`) **required** — Время начала плановых работ
    - `ended_at` (string (date-time), пример: `"2026-03-20T03:00:00.000Z"`) **required** — Время завершения плановых работ
    - `servers` (array of object) **required** — Сервисы на странице статуса, затрагиваемые плановыми работами
      - `id` (number, пример: `1`) **required** — ID сервиса на status page
      - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
    - `updates` (array of object) **required** — История обновлений по плановым работам
      - `id` (number, пример: `10100`) **required** — ID обновления внутри записи плановых работ
      - `message` (string, пример: `"Работы идут по плану. Возможны кратковременные перерывы в работе API."`) **required** — Текст апдейта
      - `is_initial` (boolean, пример: `true`) **required** — Является ли запись стартовым сообщением
      - `published_at` (string (date-time), пример: `"2026-03-06T16:12:00.000Z"`) **required** — Когда обновление было опубликовано
      - `servers` (array of object) **required** — Сервисы, которых касается это обновление
        - `id` (number, пример: `1`) **required** — ID сервиса на status page
        - `name` (string, пример: `"API Gateway"`) **required** — Публичное имя сервиса на странице статуса
    - `created_at` (string (date-time), пример: `"2026-03-18T12:00:00.000Z"`) **required** — Дата создания записи
  - `created_at` (string (date-time), пример: `"2024-01-01T00:00:00.000Z"`) **required** — Дата создания страницы статуса

### CreateStatusPageDto

object
  - `name` (string, пример: `"Statuser"`) **required** — Название страницы статуса
  - `slug` (string | null, пример: `"statuser"`) **required** — Уникальный путь страницы статуса
  - `description` (object | null) **required** — Описание страницы статуса
  - `logo_url` (object | null) **required** — URL логотипа
  - `favicon_url` (object | null) **required** — URL фавикона
  - `company_url` (object | null) **required** — URL сайта компании
  - `support_url` (object | null) **required** — Email службы поддержки
  - `domain` (object | null) **required** — Собственный домен страницы статуса
  - `is_indexed` (boolean, пример: `true`) **required** — Индексируется ли страница поисковиками
  - `is_published` (boolean, пример: `true`) **required** — Опубликована ли страница
  - `is_white_labeled` (boolean, пример: `false`) **required** — Вайт-лейблинг: скрыть бренд Statuser
  - `timeline_days` (number, пример: `60`) — Количество дней таймлайна на странице статуса
  - `timezone` (string, пример: `"Europe/Moscow"`) — Таймзона, в которой считаются дни на странице статуса
  - `uptime_decimal_places` (number, пример: `2`) — Количество знаков после запятой для аптайма
  - `theme_mode` (string, enum: "user", "light", "dark", пример: `"user"`) — Режим темы страницы статуса
  - `is_not_monitored_operational` (boolean, пример: `false`) — Показывать ли статус Не в мониторинге зелёным, как Доступен
  - `minimum_incident_duration` (number, пример: `0`) — Минимальная длительность инцидента в секундах для отображения на странице
  - `password` (object | null) **required** — Пароль для доступа к странице статуса

### UpdateStatusPageDto

object
  - `name` (string, пример: `"Statuser"`) — Название страницы статуса
  - `slug` (string, пример: `"statuser"`) — Уникальный путь страницы статуса
  - `description` (object | null) — Описание страницы статуса
  - `logo_url` (object | null) — URL логотипа
  - `favicon_url` (object | null) — URL фавикона
  - `company_url` (object | null) — URL сайта компании
  - `support_url` (object | null) — Email службы поддержки
  - `domain` (object | null) — Собственный домен страницы статуса
  - `is_indexed` (boolean, пример: `true`) — Индексируется ли страница поисковиками
  - `is_published` (boolean, пример: `true`) **required** — Опубликована ли страница
  - `is_white_labeled` (boolean, пример: `false`) — Вайт-лейблинг: скрыть бренд Statuser
  - `timeline_days` (number, пример: `60`) — Количество дней таймлайна на странице статуса
  - `timezone` (string, пример: `"Europe/Moscow"`) — Таймзона, в которой считаются дни на странице статуса
  - `uptime_decimal_places` (number, пример: `2`) — Количество знаков после запятой для аптайма
  - `theme_mode` (string, enum: "user", "light", "dark", пример: `"user"`) — Режим темы страницы статуса
  - `is_not_monitored_operational` (boolean, пример: `false`) — Показывать ли статус Не в мониторинге зелёным, как Доступен
  - `minimum_incident_duration` (number, пример: `0`) — Минимальная длительность инцидента в секундах для отображения на странице
  - `password` (object | null) — Пароль для доступа к странице статуса

### UpdateStatusPageGroupsDto

object

### CreateStatusPageIncidentReportServerDto

object
  - `server_id` (number, пример: `1`) **required** — ID сервера на странице статуса
  - `status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"downtime"`) **required** — Статус влияния на сервер в момент создания отчёта

### CreateStatusPageIncidentReportDto

object
  - `title` (string, пример: `"Проблемы с доступностью API Gateway"`) **required** — Заголовок отчёта
  - `initial_message` (string, пример: `"Часть пользователей может сталкиваться с ошибками 502. Команда уже расследует причину"`) **required** — Текст стартового сообщения отчёта
  - `started_at` (string (date-time), пример: `"2026-03-06T16:12:00.000Z"`) **required** — Время начала отчёта
  - `incident_ids` (array of string) — Связанные инциденты, если отчёт основан на существующих инцидентах
  - `servers` (array of object) **required** — Стартовые статусы серверов в рамках отчёта
    - `server_id` (number, пример: `1`) **required** — ID сервера на странице статуса
    - `status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"downtime"`) **required** — Статус влияния на сервер в момент создания отчёта

### UpdateStatusPageIncidentReportDto

object
  - `title` (string, пример: `"Проблемы с доступностью API Gateway"`) — Заголовок отчёта
  - `started_at` (string (date-time), пример: `"2026-03-06T16:12:00.000Z"`) — Время начала отчёта

### CreateStatusPageIncidentReportUpdateServerDto

object
  - `server_id` (number, пример: `1`) **required** — ID сервера на странице статуса
  - `status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"downtime"`) **required** — Новый статус влияния на сервер

### CreateStatusPageIncidentReportUpdateDto

object
  - `message` (string, пример: `"Мы нашли причину сбоя и уже выкатываем исправление. Следующее обновление через 10 минут"`) **required** — Текст апдейта
  - `published_at` (string (date-time), пример: `"2026-03-06T16:22:00.000Z"`) — Время публикации апдейта
  - `servers` (array of object) **required** — Новые статусы сервисов в рамках апдейта
    - `server_id` (number, пример: `1`) **required** — ID сервера на странице статуса
    - `status` (string, enum: "not_affected", "downtime", "degraded", "resolved", пример: `"downtime"`) **required** — Новый статус влияния на сервер

### UpdateStatusPageIncidentReportUpdateDto

object
  - `message` (string, пример: `"Мы нашли причину сбоя и уже выкатываем исправление. Следующее обновление через 10 минут"`) **required** — Обновлённый текст апдейта

### CreateStatusPagePlannedMaintenanceServerDto

object
  - `id` (number, пример: `1`) **required** — ID сервиса на странице статуса

### CreateStatusPagePlannedMaintenanceDto

object
  - `title` (string, пример: `"Плановое обновление API Gateway"`) **required** — Заголовок плановых работ
  - `description` (string, пример: `"Во время обновления возможны кратковременные перерывы в работе API и панели управления."`) **required** — Описание плановых работ
  - `started_at` (string (date-time), пример: `"2026-03-20T01:00:00.000Z"`) **required** — Время начала плановых работ
  - `ended_at` (string (date-time), пример: `"2026-03-20T03:00:00.000Z"`) **required** — Время завершения плановых работ
  - `servers` (array of object) **required** — Сервисы на странице статуса, затрагиваемые плановыми работами
    - `id` (number, пример: `1`) **required** — ID сервиса на странице статуса

### UpdateStatusPagePlannedMaintenanceServerDto

object
  - `id` (number, пример: `1`) **required** — ID сервиса на странице статуса

### UpdateStatusPagePlannedMaintenanceDto

object
  - `title` (string, пример: `"Плановое обновление API Gateway"`) — Заголовок плановых работ
  - `description` (string, пример: `"Во время обновления возможны кратковременные перерывы в работе API и панели управления."`) — Описание плановых работ
  - `started_at` (string (date-time), пример: `"2026-03-20T01:00:00.000Z"`) — Время начала плановых работ
  - `ended_at` (string (date-time), пример: `"2026-03-20T03:00:00.000Z"`) — Время завершения плановых работ
  - `servers` (array of object) — Сервисы на странице статуса, затрагиваемые плановыми работами
    - `id` (number, пример: `1`) **required** — ID сервиса на странице статуса

### CreateStatusPagePlannedMaintenanceUpdateDto

object
  - `message` (string, пример: `"Работы идут по плану. Возможны кратковременные перерывы в работе API."`) **required** — Текст апдейта о ходе плановых работ
  - `published_at` (string (date-time), пример: `"2026-03-20T01:30:00.000Z"`) — Время публикации апдейта

### UpdateStatusPagePlannedMaintenanceUpdateDto

object
  - `message` (string, пример: `"Работы идут по плану. Завершаем проверку и скоро опубликуем финальный апдейт."`) **required** — Обновлённый текст апдейта

### Info2faResponseDto

object
  - `preferred_method` (string | null, enum: "telegram", "max", "email", "totp", пример: `"telegram"`) **required** — Предпочитаемый метод двухфакторной аутентификации
  - `allowed_methods` (array of string, enum: "telegram", "max", "email", "totp") **required** — Список доступных методов двухфакторной аутентификации
