Обзор API
MARV предоставляет V2 как основную клиентскую API; V1 поддерживается для обратной совместимости. ACP - административный профиль; EXT - внешние вебхуки мерчантов.
Авторизация (V2)
Требуемые и дополнительные заголовки запроса:
| Заголовок | Обязателен | Описание |
|---|---|---|
X-Api-Token | да | Токен платформы (подписанный секретом платформы) |
X-Api-Type | да | Тип API (целое), выбирает конфигурацию платформы |
X-Api-Uid | да | UID пользователя в целевой платформе |
X-Session-Token | да* | Токен сессии (single-session режим) |
X-Client-Version | нет | Версия клиента; валидируется согласно конфигу |
X-Inviter-Uid | нет | UID пригласившего (для первичного входа) |
Порядок проверки: валидация заголовков → проверка минимальной версии → проверка токена платформы → создание/получение пользователя и обновление атрибутов → (опц.) выдача X-Set-Session-Token.
Получение Session Token (vX/users):
- Если включён single-session режим (см.
app.session.single_mode.*в config/main.md), после первого запроса кvX/usersбезX-Session-Tokenсервер вернёт заголовокX-Set-Session-Tokenс новым значением токена. - Далее этот токен нужно передавать в заголовке
X-Session-Tokenво всех последующих запросах (V2). - V2: используйте
POST /v2/users/meили другой методv2/users/*для первичного получения токена. Для V1 - аналогичные методыv1/users/*. - При истечении/отзыве токена сервер вернёт ошибку; сбросьте локальный токен и повторите первичный запрос к
vX/users.
Request ID и страна клиента
- Клиент может (но не обязан) передавать
X-Request-Id. Если заголовок не задан, MARV сгенерирует UUID самостоятельно. - Каждый ответ содержит
X-Request-Id— его можно использовать для сопоставления с логами (trace_idдобавляется вzerologконтекст). - При работе через Cloudflare заголовок
CF-IPCountryпроксируется в ответ какX-Client-Country-Code, поэтому страна клиента доступна даже без отдельного API. - В ответ также добавляется
X-Server-Id: это идентификатор узла (app.server.idиз конфига либо автогенерированное значение), что упрощает отладку и мониторинг лидерства.
Верификация IAP
ApiType/ApiUidвсегда берутся из аутентифицированного пользователя; значения в теле запроса игнорируются.- Поле
user_idопционально. Если его нет, MARV подставляет ApiUid текущего пользователя. Указывайтеuser_idявно только на платформах, где IAP использует другой идентификатор (например, Discord).
Форматы ответов
- Успех (V2):
{ "time": <unix>, "data": <payload> } - Ошибка (V2/ACP):
{ "time": <unix>, "error": { "code": "...", "http_status": N, "message": "...", "details": { ... }}}
Подробно про ошибки и соответствия доменных ошибок см. в V2 Errors.
Практики для контроллеров
- HTTP-слой держим тонким: каждый контроллер объявляет локальные интерфейсы сервисов и передаёт в домен
ctx.Request.Context().
Конфигурация и таймауты
- HTTP‑таймауты и бакеты метрик настраиваются в config/main.md, секциях
app.http.timeouts.*иobservability.metrics.http_buckets_ms.
EXT (мерчанты)
- Общие принципы и требования описаны в EXT Guide. Для каждого мерчанта используется собственная авторизация/подпись.
Метрики и наблюдаемость (ACP)
- Системные метрики доступны по эндпоинту GET /acp/system/metrics. Описание полей и настройки - в Observability.
Реклама (ACP → Ads)
/acp/ads/listвозвращает все объявления иruntime‑снимок контроллерных метрик (количество вызовов, ошибки, p95) по префиксу/acp/ads/*. Эндпоинт read-only, отдельная роль не требуется./acp/ads/create|update|delete|toggleтребуют рольAccessAds(1024). После модификаций ответы всегда содержатcommit: ["ads"]и актуальный списокads, чтобы UI мог обновить состояние без повторного запроса.- DTO и поля объявлений описаны в openapi.yaml (
AcpAd,AcpCreateAdDTO, ...). Поляtitle/description/data— произвольные JSON‑структуры,weightзадаёт приоритет показа.
Alert Center (ACP)
/acp/alerts/list— фильтрует критические уведомления (type, severity, status, tags, диапазон дат). Требует рольAccessAlerts(2048)./acp/alerts/detail— возвращает карточку уведомления и историю доставок (Slack/Telegram webhooks)./acp/alerts/ack— подтверждает обработку, сохраняет комментарий (виден всем операторам).- Конфигурация каналов и шаблонов описана в config/main.md; подробный контракт — в openapi.yaml.
Реклама (V1 → Ads)
POST /v1/ads/fetchвозвращает доступные объявления (только включённые и отфильтрованные по весу). Дополнительно формируетсяvideo_urlпоdomain.stream.subdomainиз конфигурации.POST /v1/ads/impressionиPOST /v1/ads/clickинкрементируют счётчики просмотров/кликов поsid. Эти вызовы не возвращают payload.- Все V1 Ads маршруты используют стандартную платформенную авторизацию (
X-Api-*). См. структурыV1Ad,V1AdImpressionDTO,V1AdClickDTOв openapi.yaml.
Реклама (V2 → Ads)
POST /v2/adsвозвращает массив объявлений (V2Ad) с теми же полями, что и V1 (включая вычисленныйvideo_url).POST /v2/ads/impressionиPOST /v2/ads/clickпринимают DTO (V2AdImpressionDTO,V2AdClickDTO) и увеличивают счётчики поsid.- Все вызовы требуют стандартную V2 авторизацию (
X-Api-*). Ответы следуют формату{ "time": ..., "data": ... }. Схемы перечислены в openapi.yaml.
