OpenRTB: что это за протокол и как устроены запрос и ответ
OpenRTB — открытый стандарт IAB Tech Lab, описывающий, как биржи и SSP передают покупателям запрос на рекламный показ и как DSP отвечают ставкой. Протокол задает транспорт (HTTP, обычно POST с JSON), набор объектов и полей, единицы цены, уведомления о выигрыше и отказ от участия. Благодаря ему одна DSP может торговаться на десятках бирж без отдельной интеграции под каждую.
Версии OpenRTB
| Версия | Что важно |
|---|---|
| 2.3–2.4 | нативная реклама (2.3), аудио и объект метрик imp.metric (2.4) |
| 2.5 | уведомления burl и lurl, объект source |
| 2.6 | поддержка CTV и рекламных пауз (pod), source.schain в основном объекте, перечни кодов вынесены в AdCOM; с 2.6-202211 обновления без смены номера версии выходят регулярно, примерно раз в месяц |
| 3.0 | новая структура с отдельной моделью AdCOM; распространения почти не получила |
Большинство платформ в России и мире работает с 2.5 или 2.6 и расширениями в полях ext.
Из чего состоит запрос
Bid request — объект BidRequest, внутри которого:
id— уникальный идентификатор аукциона;imp[]— места показа: формат (banner,video,native,audio),tagid,bidfloorиbidfloorcur;appилиsite— где будет показ;device— ОС, модель, IP, рекламный идентификаторifa;user,regs— пользователь и регуляторные признаки;at— тип аукциона:1— первая цена,2— вторая цена плюс (по умолчанию);tmax— сколько миллисекунд биржа ждет ответ, см. tmax;cur,bcat,badv— допустимые валюты и блокировки.
Из чего состоит ответ
{
"id": "1234567890",
"seatbid": [{
"seat": "512",
"bid": [{
"id": "1",
"impid": "102",
"price": 9.43,
"adm": "<img src=\"…\">",
"adomain": ["example.com"],
"crid": "cr-31",
"nurl": "https://dsp.example/win?id=1&p=${AUCTION_PRICE}",
"burl": "https://dsp.example/bill?id=1&p=${AUCTION_PRICE}",
"lurl": "https://dsp.example/loss?id=1&r=${AUCTION_LOSS}"
}]
}],
"cur": "USD"
}
price— ставка в CPM; обязательное поле.adm— разметка креатива; если есть иadm, и разметка в ответе наnurl, приоритет уadm.nurl,burl,lurl— URL уведомлений о выигрыше, оплачиваемом событии и проигрыше. Подробнее — в статье про win notice.
Макросы подстановки
Перед вызовом URL биржа заменяет макросы значениями:
| Макрос | Значение |
|---|---|
${AUCTION_ID} |
BidRequest.id |
${AUCTION_IMP_ID} |
imp.id выигранного места |
${AUCTION_PRICE} |
цена списания в той же валюте и единицах, что и ставка |
${AUCTION_CURRENCY} |
валюта ставки |
${AUCTION_LOSS} |
код причины проигрыша |
${AUCTION_MIN_TO_WIN} |
минимальная ставка, которой хватило бы для выигрыша (2.6) |
Значения можно шифровать (например, цену), алгоритм стороны согласуют между собой — спецификация его не задает.
OpenRTB в Ibiza
Биржа Ibiza работает по OpenRTB 2.6: принимает запросы от источников трафика и рассылает их demand-партнерам с заголовком X-OpenRTB-Version: 2.6. DSP Ibiza отвечает на базе 2.5 с отдельными полями 2.6 (например, mtype — тип креатива) и указывает в ответе X-OpenRTB-Version: 2.5. Поддерживаемые поля и расширения описаны в документации по интеграции предложения.
Ошибки при интеграции
- Путать CPM и цену за показ.
price: 9.43— ставка за тысячу показов, то есть 0,00943 USD за один показ. - Игнорировать
bidfloorcur. Флор в рублях и ставка в долларах без пересчета дают отклоненные ответы. - Отвечать 200 с пустым
seatbid. Работает, но тратит трафик; HTTP 204 — штатный no-bid. - Полагаться на
extбез договоренности. Поля расширений у каждой биржи свои.
Как проходит весь цикл торгов — в статье про RTB.
Частые вопросы
Какую версию OpenRTB используют чаще всего?
На практике — ветку 2.x: 2.5 и 2.6. Версия 3.0 с моделью AdCOM широкого распространения не получила, поэтому IAB Tech Lab продолжает развивать 2.6.
Как в OpenRTB ответить «не буду ставить»?
Вернуть пустой ответ с HTTP 204 No Content. Спецификация называет это самым экономным способом сообщить no-bid; можно также вернуть ответ с кодом причины в поле nbr.
В какой валюте и за что указывается цена в OpenRTB?
bid.price и imp.bidfloor — за тысячу показов (CPM), хотя сделка заключается за один показ. Валюта — ISO-4217, по умолчанию USD, если не указано иное.