Перейти к содержимому
Разделы документации
HTTP APIМобильные приложенияHTTP API

Мобильные приложения: HTTP API

Android. JSON API: сессия, выдача, действия, просмотр.

Kotlin SDK · Создать площадку

Авторизация

ИсточникAuthorizationТело
AndroidBearer <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

Session
POST /api/v1/mobile/session
Content-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

Server request
POST /api/v1/mobile/ads
Authorization: Bearer sk_live_EXAMPLE
Content-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 символов. Не предотвращает повторную выдачу на сервере.
placementchat; 1-64; A-Z a-z 0-9 _ -
language_codeen; 1-32
accept_formatstext, image, response, card, consent, quiz
contextquestion ≤4096; answer ≤16384
test / test_formatfalse по умолчанию. test_format из accept_formats. Test-площадка всегда возвращает demo.

Test возвращает демонстрационную рекламу без списаний и начислений.

Ответ

ПолеТипЗначение
has_adbooleanНаличие рекламы.
adobject | nullnull при no-fill.
ad.delivery_id / ad.expires_atstringID выдачи / ISO 8601, срок 7 дней.
ad.formatstringtext | image | response | card | consent | quiz
ad.disclosure / ad.teststring / booleanМаркировка / тестовая выдача.
ad.blocksarrayБлоки в порядке отображения.
ad.viewstring?Подписанное подтверждение просмотра. Передаётся без изменений.

Рекламные блоки

typeПоляОтображение
textspans, role?Текст из последовательных фрагментов spans. role: body, brand или footer: основной текст, бренд или подвал.
mediaurl, mime, alt?, role?Изображение или видео. role=logo: логотип. Кадрирование задаётся в настройках оформления.
galleryitemsМассив media. Все элементы доступны для просмотра.
buttonsbuttonsВсе кнопки и полный текст; перенос длинных подписей.

Фрагмент текста: spans[]

ПолеТипЗначение
textstringОбязательно. Plain text; переносы сохраняются. Без HTML.
bold / italic / underline / strikethrough / codeboolean?Оформление фрагмента
urlstring?HTTP(S)

Кнопка: buttons[]

ПолеТипЗначение
id / textstringОбязательные поля
stylestring?primary / secondary
url / actionstringРовно одно поле. 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

Body (+ server identity)
{"delivery_id":"…","action":"…"}

action берётся из кнопки. Ответ: has_ad, ad. ID выдачи сохраняется. Повтор действия не создаёт второе начисление. URL-кнопки открывают исходный url, без запроса interact.

POST /api/v1/mobile/seen

Body (+ server identity)
{"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Ключ или истёкшая сессия.
403Origin, владелец, package, отключённая площадка, чужая выдача.
409Слишком ранний просмотр.
410Истёкший или неверный токен.
413Размер тела.
429Лимит запросов.
503Сервис недоступен.