Веб: HTTP API
HTTP API для получения рекламы и обработки интерактивных действий в веб-приложениях.
Авторизация
| Источник запроса | Авторизация | Идентификатор |
|---|---|---|
| Браузер | ID площадки и разрешённый адрес сайта. Заголовок Origin добавляется браузером. | visitor_id |
| Сервер | Authorization: Bearer sk_live_… | stable_user_id или visitor_id |
API-ключ доступен в настройках паблишера. Храните его на сервере. Серверный запрос к Sidekick отправляется без Origin.
Передавайте ровно один ID пользователя. Допустимые символы: A–Z, a–z, 0–9, _, ., :, -. Сохраняйте ID между запросами; не используйте email или телефон.
Запрос рекламы
POST /api/v1/web/ads
| Поле | Тип | Описание |
|---|---|---|
platform_idобязательно | string | Публичный ID площадки. |
visitor_id | string | ID посетителя, 16–128 символов. Обязателен для браузерных запросов. |
stable_user_id | string | ID пользователя, 1–128 символов. Доступен для серверных запросов вместо visitor_id. |
request_id | string | ID запроса, 1–128 символов. Повторная передача не предотвращает новую выдачу. |
placement | string | Зарегистрированное место показа. По умолчанию chat. |
language_code | string | Язык рекламы. По умолчанию en. |
accept_formats | string[] | text, image, response, card, consent, quiz. По умолчанию все форматы. |
context | object | Контекст показа. Поля зависят от context.type. |
test | boolean | Тестовая реклама без списаний. По умолчанию false. |
test_format | string | Формат тестовой рекламы при test: true. |
Обязательные поля.
Content-Type: application/json. Максимальный размер тела — 64 КиБ.
Запрос с сервера
POST /api/v1/web/adsAuthorization: Bearer sk_live_EXAMPLEContent-Type: application/json{"platform_id": "plt_example","stable_user_id": "customer_42","context": {"question": "Headphones?","answer": "Here are some options…"},"test": true,"test_format": "card"}
Запрос из браузера
visitorId — сохранённый ID посетителя. Запрос отправляется без API-ключа и cookies.
const response = await fetch("https://sidekick-ads.com/api/v1/web/ads", {method: "POST",credentials: "omit",headers: { "Content-Type": "application/json" },body: JSON.stringify({platform_id: "plt_example",visitor_id: visitorId,request_id: "chat-42-message-7",test: true,test_format: "card"})});if (!response.ok) throw new Error("Ad request failed");const payload = await response.json();
Контекст
| context.type | Поля | Ограничения |
|---|---|---|
conversation | question, answer | Оба поля необязательны: до 4 096 и 16 384 символов. Тип по умолчанию. |
article | title, content | Оба поля обязательны: до 4 096 и 16 384 символов. |
feed | text | Обязательное поле, до 16 384 символов. |
static | — | Без текстового контекста. |
Тематический подбор опирается на вопрос пользователя: question или title. У feed и static вопроса нет, поэтому туда приходит только реклама без тематического таргетинга.
Ответ
| Поле | Тип | Описание |
|---|---|---|
has_ad | boolean | Наличие рекламы в ответе. |
ad | object | null | Рекламный объект; null при отсутствии рекламы. |
ad.delivery_id | string | ID выдачи для интерактивных действий. |
ad.expires_at | string | Срок действия рекламы в формате ISO 8601. |
ad.format | string | Формат рекламы. |
ad.disclosure | string | Обязательная рекламная маркировка. |
ad.test | boolean | Признак тестовой рекламы. |
ad.blocks | object[] | Блоки text, media, gallery и buttons в порядке отображения. |
ad.view | string | Квитанция для подтверждения просмотра. Есть только у оплачиваемой рекламы. Просмотр |
{"has_ad": false,"ad": null}
Показ оплачивается, когда реклама увидена, а не при выдаче. Браузерный SDK подтверждает просмотр сам; при своей отрисовке отправьте подтверждение просмотра.
Отрисовка
Отобразите все блоки и маркировку из ответа. Для стандартной карточки используйте mountSidekickAd из браузерного SDK. В примере payload получен от вашего сервера, а /my-ad-interaction — обработчик действий в вашем приложении.
const view = Sidekick.mountSidekickAd(document.querySelector("#ad-slot"), {onAction: async (ad, action) => {const response = await fetch("/my-ad-interaction", {method: "POST",headers: { "Content-Type": "application/json" },body: JSON.stringify({ delivery_id: ad.delivery_id, action })});if (!response.ok) throw new Error("Interaction failed");return (await response.json()).ad;}});view.setAd(payload.has_ad ? payload.ad : null);
Интерактивные действия
POST /api/v1/web/interact
Для consent и quiz передайте action из нажатой кнопки, delivery_id и исходный ID пользователя. Авторизация совпадает с запросом рекламы.
{"platform_id": "plt_example","stable_user_id": "customer_42","delivery_id": "imp_example","action": "signed-action-from-button"}
Ответ: {ok: true, ad}. Замените карточку объектом ad из ответа. Переход к следующей сцене не создаёт новый платный показ.
Если у кнопки задан url, открывайте его по нажатию. Предварительная загрузка рекламных ссылок не допускается.
Подтверждение просмотра
POST /api/v1/web/seen
Показ оплачивается после просмотра: не меньше половины карточки на экране не меньше секунды. Браузерный SDK отправляет запрос сам. При своей отрисовке вызовите trackView(ad) или отправьте запрос с той же авторизацией и тем же ID пользователя.
{"platform_id": "plt_example","stable_user_id": "customer_42","delivery_id": "imp_example","view": "view-receipt-from-ad"}
Ответ: {ok: true}. Квитанция view действует час. Запрос раньше чем через секунду после выдачи вернёт 409. Нажатие кнопки или переход по рекламной ссылке тоже засчитывают показ. Реклама, которую так и не увидели, не оплачивается.
Ошибки
| Статус | Значение |
|---|---|
400 | Неверные поля запроса или идентификатор пользователя. |
401 | Отсутствует или недействителен API-ключ. |
403 | Площадка отключена, адрес сайта не разрешён или ключ принадлежит другому паблишеру. |
409 | Подтверждение просмотра отправлено раньше чем через секунду после выдачи. |
410 | Действие или квитанция просмотра недействительны либо истекли. |
413 | Размер тела запроса превышает 64 КиБ. |
429 | Превышен лимит запросов. |
503 | Сервис временно недоступен. |
При ошибке сохраняйте ответ приложения. Не повторяйте запрос рекламы автоматически после сетевой ошибки или 5xx: каждый запрос — новая выдача.