Мобильные приложения: HTTP API
Android. JSON API: сессия, выдача, действия, просмотр.
Авторизация
| Источник | Authorization | Тело |
|---|---|---|
| Android | Bearer <access_token> | Идентификация из сессии. |
| Сервер | Bearer sk_live_… | platform_id + installation_id | stable_user_id | user_id |
API-ключ только на сервере. Запросы с Origin отклоняются. Серверный ключ должен принадлежать владельцу площадки. Необходимо передавать один и тот же ID в ads, interact и seen.
POST /api/v1/mobile/session
POST /api/v1/mobile/sessionContent-Type: application/json{"platform_id": "plt_example","installation_id": "installation-123456789","os": "android","app_identifier": "com.example.chat"}
Ответ: access_token, expires_at. Срок сессии 1 час. installation_id: случайный постоянный ID установки, 16-128 символов. Package передаётся клиентом; это не аттестация приложения.
Сервер: stable_user_id и user_id равнозначны, 1-128 символов; не совмещаются с installation_id. Допустимые символы ID: A-Z a-z 0-9 _ . : -. os и app_identifier обязательны при ограничении по package; os только android.
POST /api/v1/mobile/ads
POST /api/v1/mobile/adsAuthorization: Bearer sk_live_EXAMPLEContent-Type: application/json{"platform_id": "plt_example","stable_user_id": "customer_42","os": "android","app_identifier": "com.example.chat","placement": "chat","language_code": "ru","context": {"question": "Headphones?", "answer": "Some options"},"test": true,"test_format": "card"}
| Поле | Значение |
|---|---|
| request_id | Необязательный ID, 1-128 символов. Не предотвращает повторную выдачу на сервере. |
| placement | chat; 1-64; A-Z a-z 0-9 _ - |
| language_code | en; 1-32 |
| accept_formats | text, image, response, card, consent, quiz |
| context | question ≤4096; answer ≤16384 |
| test / test_format | false по умолчанию. test_format из accept_formats. Test-площадка всегда возвращает demo. |
Test возвращает демонстрационную рекламу без списаний и начислений.
Ответ
| Поле | Тип | Значение |
|---|---|---|
| has_ad | boolean | Наличие рекламы. |
| ad | object | null | null при no-fill. |
| ad.delivery_id / ad.expires_at | string | ID выдачи / ISO 8601, срок 7 дней. |
| ad.format | string | text | image | response | card | consent | quiz |
| ad.disclosure / ad.test | string / boolean | Маркировка / тестовая выдача. |
| ad.blocks | array | Блоки в порядке отображения. |
| ad.view | string? | Подписанное подтверждение просмотра. Передаётся без изменений. |
Рекламные блоки
| type | Поля | Отображение |
|---|---|---|
text | spans, role? | Текст из последовательных фрагментов spans. role: body, brand или footer: основной текст, бренд или подвал. |
media | url, mime, alt?, role? | Изображение или видео. role=logo: логотип. Кадрирование задаётся в настройках оформления. |
gallery | items | Массив media. Все элементы доступны для просмотра. |
buttons | buttons | Все кнопки и полный текст; перенос длинных подписей. |
Фрагмент текста: spans[]
| Поле | Тип | Значение |
|---|---|---|
text | string | Обязательно. Plain text; переносы сохраняются. Без HTML. |
| bold / italic / underline / strikethrough / code | boolean? | Оформление фрагмента |
url | string? | HTTP(S) |
Кнопка: buttons[]
| Поле | Тип | Значение |
|---|---|---|
| id / text | string | Обязательные поля |
style | string? | primary / secondary |
| url / action | string | Ровно одно поле. url: переход; action: исходный токен для /interact. |
Файлы и ссылки
Медиа: HTTPS; image/jpeg, image/png, image/webp, image/gif, video/mp4. Видео: muted, playsInline. Ссылки: HTTP(S), без prefetch.
{"has_ad": true,"ad": {"delivery_id": "imp_example","expires_at": "2099-01-01T00:00:00.000Z","format": "text","disclosure": "Sponsored","test": true,"blocks": [{"type": "text","role": "body","spans": [{"text": "Try a service for your next trip.","bold": true}]},{"type": "buttons","buttons": [{"id": "primary","text": "Learn more","style": "primary","url": "https://example.com/offer"}]},{"type": "text","role": "footer","spans": [{"text": "Sponsored · Sidekick"}]}]}}
POST /api/v1/mobile/interact
{"delivery_id":"…","action":"…"}
action берётся из кнопки. Ответ: has_ad, ad. ID выдачи сохраняется. Повтор действия не создаёт второе начисление. URL-кнопки открывают исходный url, без запроса interact.
POST /api/v1/mobile/seen
{"delivery_id":"…","view":"…"}
Отправляется после непрерывного просмотра ≥50% карточки в течение 1 секунды, при активном экране и загруженных медиа. Kotlin View/Compose выполняют автоматически. Для своего UI необходим trackView(ad) либо seen с сервера.
Выдача не начисляет показ. Подтверждённый просмотр или действие начисляют его однократно. Повтор seen безопасен. Срок view может быть короче срока объявления.
Ограничения и ошибки
JSON ≤64 КиБ. Сессии: 120/мин на IP; операции: 120/мин на пользователя площадки; выдача: 30/мин. Автоматический повтор ads после сетевого сбоя не допускается.
| HTTP | Причина |
|---|---|
| 400 | Поля или placement. |
| 401 | Ключ или истёкшая сессия. |
| 403 | Origin, владелец, package, отключённая площадка, чужая выдача. |
| 409 | Слишком ранний просмотр. |
| 410 | Истёкший или неверный токен. |
| 413 | Размер тела. |
| 429 | Лимит запросов. |
| 503 | Сервис недоступен. |