Подключение инвентаря (SSP) к бирже
SSP подключается к Ibiza Exchange как источник трафика: вы отправляете запросы OpenRTB 2.6 на адрес вида https://<хост биржи>/bid/<имя источника>, биржа проводит аукцион среди подключенных демандов и возвращает одну ставку по цене нетто — за вычетом своей комиссии. Ниже — формат запроса, обязательные поля, коды ответа, состав ставки и какие уведомления нужно вызывать.
Как это работает
ваш аукцион ──BidRequest──▶ Ibiza Exchange ──▶ деманды (DSP)
▲ │
└──── ставка нетто ◀─────────┘
- Вы присылаете запрос на ставку.
- Биржа поднимает ваш флор на свою комиссию, добавляет свой узел в цепочку поставки и рассылает запрос демандам — тем, кому разрешен этот тип трафика.
- Лучшая ставка возвращается вам по цене нетто:
нетто = гросс × (1 − комиссия). Если нетто ниже вашего флора, биржа отвечает no-bid. - Исход решает ваш аукцион: биржа участвует в нем как обычный покупатель.
Роль биржи между SSP и DSP описана в статье про ad exchange, а устройство SSP — в статье про SSP.
1. Адрес и авторизация
Источник заводит команда биржи. Вы получаете:
| Параметр | Значение |
|---|---|
| Адрес | POST https://<хост биржи>/bid/<имя источника> |
| Имя источника | Латиница в нижнем регистре, цифры, _ и -, от 2 до 64 символов, например mynetwork |
| Токен | Необязателен. Если выдан — передавайте Authorization: Bearer <токен> |
| Комиссия биржи | Задается для источника, от 0 до 99,99 % |
Новый источник создается выключенным и включается после проверки цепочки на тестовых запросах.
POST /bid/mynetwork HTTP/1.1
Host: <хост биржи>
Content-Type: application/json
Authorization: Bearer <токен>
2. Запрос
Тело — JSON BidRequest OpenRTB 2.6, до 256 КБ.
Обязательные и важные поля
| Поле | Статус | Комментарий |
|---|---|---|
id |
обязательно | ID запроса — вернется в BidResponse.id. Без него биржа сгенерирует свой |
imp[] |
обязательно, хотя бы один | Разыгрывается только первый imp |
imp.id |
обязательно | Вернется в bid.impid |
imp.tagid |
рекомендуется | ID плейсмента; по нему строится разрез по слотам. Без него слотом считается imp.id |
imp.banner / imp.native / imp.video |
обязательно | Формат; мультиформатный imp поддерживается. native.request — строкой по спецификации, объект тоже принимается |
imp.bidfloor, imp.bidfloorcur |
рекомендуется | Флор CPM. Указывайте валюту явно: без нее биржа считает флор рублевым, хотя по спецификации пустое поле — USD |
app или site |
обязательно | Контекст площадки: bundle для приложений, domain/page для сайтов |
device.ifa, device.ip, device.ua |
рекомендуется | Без идентификаторов демандам почти нечего купить |
device.geo.country |
рекомендуется | ISO alpha-3 (RUS) или alpha-2 (RU). Если для демандов включен гео-фильтр, запрос без страны к ним не уйдет |
tmax |
рекомендуется | Биржа укладывается в ваш бюджет |
badv, bcat, bapp, battr (в imp.banner и imp.video) |
по необходимости | Передаются демандам и проверяются на их ответах |
source.schain (2.6) или source.ext.schain (2.5) |
по необходимости | Ваша цепочка сохраняется, биржа дописывает свой узел туда же, где она пришла |
regs, user |
по необходимости | Сигналы согласия передаются демандам как есть |
Что такое флор и как его выбирать — в статье bidfloor.
Пример запроса
{
"id": "a7f3c2d1-5e6b-4c8a-9f0e-1d2c3b4a5f60",
"tmax": 300,
"imp": [{
"id": "1",
"tagid": "slot-feed-2",
"secure": 1,
"bidfloor": 40.0,
"bidfloorcur": "RUB",
"native": { "request": "{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":90}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"wmin\":600,\"hmin\":300}},{\"id\":3,\"img\":{\"type\":1,\"w\":80,\"h\":80}}]}", "ver": "1.2" }
}],
"app": {
"id": "1042",
"bundle": "com.example.news",
"publisher": { "id": "77" }
},
"device": {
"ua": "Mozilla/5.0 (Linux; Android 14; SM-A546E) ...",
"ip": "176.59.10.20",
"geo": { "country": "RUS" },
"os": "Android", "osv": "14",
"connectiontype": 6, "devicetype": 4,
"ifa": "6f1c2a3b-4d5e-4f60-8a9b-0c1d2e3f4a5b"
},
"bcat": ["IAB25", "IAB26"]
}
3. Время ответа
Если в запросе есть tmax, биржа укладывается в него: на свой аукцион она берет tmax минус 20 мс на сериализацию ответа, но не меньше 100 мс. Демандам уходит уже уменьшенный tmax — время, которое у них реально есть. Общий потолок обработки запроса на бирже — 500 мс. Почему время ответа так важно, разобрано в статье tmax.
4. Ответ
| Код | Когда |
|---|---|
200 OK + JSON |
Есть ставка |
204 No Content |
Нет ставки; источник неизвестен или выключен |
400 Bad Request |
Тело не разбирается как JSON BidRequest или в запросе нет imp |
401 Unauthorized |
Для источника задан токен, а заголовок неверный или отсутствует |
413 |
Тело больше 256 КБ |
415 |
Заголовок Content-Type передан и это не application/json (запрос без заголовка принимается) |
Заголовки ответа со ставкой: Content-Type: application/json, X-OpenRTB-Version: 2.6, Cache-Control: no-store.
Состав ставки
| Поле | Значение |
|---|---|
id |
BidRequest.id |
bidid |
ID ответа биржи |
cur |
RUB |
seatbid[0].seat |
Seat, согласованный для вашего источника, иначе seat победившего деманда |
bid.impid |
imp.id первого imp |
bid.price |
Цена нетто, CPM в рублях — уже за вычетом комиссии биржи |
bid.adm, bid.nurl, bid.burl, bid.lurl |
Креатив и уведомления победившего деманда |
bid.crid, bid.adomain, bid.bundle, bid.mtype, bid.ext |
Из ставки деманда, включая маркировку bid.ext.nroa.erid. Недостающие служебные поля биржа дополняет: mtype, ext.type, цепочку ext.dchain (при наличии ЕРИД), служебные поля native |
Пример ответа
Деманд поставил 52 ₽, комиссия источника для примера — 15 %:
{
"id": "a7f3c2d1-5e6b-4c8a-9f0e-1d2c3b4a5f60",
"bidid": "e0b5c7a9-3f21-4d8e-b6a4-9c2d1e0f7a83",
"cur": "RUB",
"seatbid": [{
"seat": "ibiza",
"bid": [{
"id": "b-77123-1",
"impid": "1",
"price": 44.2,
"adm": "{\"native\":{\"ver\":\"1.2\",\"assets\":[...],\"link\":{\"url\":\"https://...\"},\"imptrackers\":[\"https://...\"]}}",
"nurl": "https://dsp.example/win?a=123&p=52",
"burl": "https://dsp.example/bill?a=123&p=52",
"lurl": "https://dsp.example/loss?a=123&reason=${AUCTION_LOSS}",
"crid": "77123",
"adomain": ["advertiser.example"],
"mtype": 4,
"ext": { "nroa": { "erid": "2SDnjbx1Xyz" } }
}]
}]
}
Макрос ${AUCTION_PRICE} в уведомлениях деманда биржа уже раскрыла своей ценой. Остальные макросы аукциона — ${AUCTION_ID}, ${AUCTION_LOSS}, ${AUCTION_MIN_TO_WIN} и другие — остаются вам: раскройте их по спецификации OpenRTB.
5. Уведомления и учет показа
nurl— вызывайте при выигрыше ставки в вашем аукционе.burl— вызывайте при оплачиваемом показе. По нему деманд бронирует расход.lurl— вызывайте при проигрыше, раскрыв макросы причины и цены.- Разметку
admотображайте как есть. Биржа может встроить в креатив собственный пиксель показа — по нему ведется ее учет. Если вырезать незнакомые<img>и трекеры, показы не будут засчитаны.
Учет для источника настраивается одним из способов: по выигрышу или только по показу, подтвержденному пикселем. Режим согласуется при подключении. Подробнее про уведомления — в статье win notice.
6. Прозрачность цепочки: sellers.json и schain
Биржа публикует https://<хост биржи>/sellers.json по стандарту IAB. Ваш источник в нем — запись типа INTERMEDIARY, а в цепочку schain каждого перепроданного запроса биржа дописывает узел с hp: 1 и sid, равным вашему seller_id в этом файле. Узел добавляется в ту же форму, в которой цепочка пришла (source.schain по 2.6 или source.ext.schain по 2.5); если цепочки не было, биржа создает ее в source.schain. Так деманды проверяют, через кого прошел трафик.
7. Частые ошибки
| Симптом | Вероятная причина | Что проверить |
|---|---|---|
На каждый запрос 204 |
Источник еще не включен или в адресе опечатка в имени | Имя источника в пути /bid/<имя> и статус подключения у менеджера |
401 |
Токен не передан или передан без префикса Bearer |
Заголовок Authorization: Bearer <токен> |
| Ставок мало при высоком флоре | Демандам уходит флор, поднятый на комиссию, а нетто ниже вашего флора отбрасывается | Флор и комиссию: при флоре 40 ₽ и комиссии 15 % деманду нужно поставить не меньше 47,06 ₽ |
| Флор не учитывается | Флор в валюте без курса пересчета | bidfloorcur = RUB |
| Показы не засчитываются | Из adm вырезаны пиксели биржи |
Разметку отображайте без изменений |
8. Чек-лист подключения
- Получите от нас имя источника, адрес и, при необходимости, токен.
- Отправьте тестовые запросы: один
imp, явныйbidfloorcur, заполненныеdevice.ifa,device.ip,device.geo.country. - Убедитесь, что получаете
204на no-bid и200со ставкой, аbid.impidсовпадает с вашимimp.id. - Проверьте, что вызываете
nurl,burl,lurlи не вырезаете пиксели изadm. - После проверки цепочки мы включаем источник на боевой трафик.
Если вы также покупаете трафик, то есть работаете как DSP, условия для демандов описаны в статье подключение деманда. Чтобы биржа не перепродавала ваш трафик вашему же деманду, такой деманд исключается в настройках источника — сообщите о нем при подключении.
Частые вопросы
В какой валюте указывать флор?
Явно в bidfloorcur, лучше RUB. По спецификации OpenRTB пустое поле означает USD, но биржа читает флор без валюты как рублевый; флор в валюте без курса пересчета она не учитывает.
Сколько imp можно передать в одном запросе?
Биржа разыгрывает только первый imp запроса и отвечает на него. Отправляйте по одному imp на запрос.
Что значит ответ 204?
Нет ставки. Тот же код приходит, если источник неизвестен или выключен — так биржа не раскрывает свой реестр и не ломает повторные попытки.