После обработки запроса ставки от Google ваше приложение должно создать и отправить ответ. В этом руководстве рассказывается, как написать код приложения, чтобы создать ответ.
Создание сообщения BidResponse
Чтобы назначить ставку, ваше приложение должно ответить на запрос ставки с помощью BidResponse, содержащего Bid в настроенном вами формате. Если вы используете формат JSON, в ответе должен быть заголовок Content-Type со значением application/json; charset=utf-8, а в теле – JSON-объект BidResponse. Если вы используете формат Protobuf, ваше приложение должно задать для заголовка Content-Type значение application/octet-stream и включить сериализованный объект BidResponse в тело запроса.
Чтобы создать и сериализовать BidResponse для формата Protobuf, необходимо сгенерировать и использовать библиотеки Protobuf на основе openrtb.proto и openrtb-adx.proto, которые реализуют стандартные поля BidResponse OpenRTB и расширения Google в Protobuf соответственно. Их можно найти в разделе Прототипы и справочные данные.
Если вы не хотите назначать ставку за показ, необходимо вернуть пустой ответ HTTP 204. Ваше приложение должно возвращать ответ на каждый запрос BidRequest. Тайм-ауты и ответы, которые не удается обработать, считаются ошибками. Google ограничивает работу систем назначения ставок с высоким уровнем ошибок.
Идентификатор креатива
В поле BidResponse.seatbid.bid.crid (не более 128 байт) вашего объекта BidResponse указан креатив. Даже у похожих креативов должны быть уникальные значения в этом поле, если они отличаются по каким-либо характеристикам, включая размер, заявленный URL, атрибуты креатива и типы поставщиков. Другими словами, разные идентификаторы креативов должны быть у любых двух объявлений, которые:
- Выглядеть или вести себя иначе.
- Создавайте разные изображения.
- Отрисовываются по-разному (например, одно объявление содержит изображение, а другое – видео).
При разработке приложения необходимо выбрать систематический способ создания идентификаторов, который подходит для креативов, которые вы планируете отправлять.
Атрибуты объявления
Мы рекомендуем указывать атрибуты креативов, чтобы описать характеристики объявления и его таргетинг. Для этого можно использовать сочетание BidResponse.seatbid.bid.apis и BidResponse.seatbid.bid.attr или расширение BidResponse.seatbid.bid.ext.attribute. Ниже описано, как объявлять атрибуты.
VPAIDЗадайте для параметраBidResponse.seatbid.bid.apisзначениеVPAID_1илиVPAID_2. Для формата JSON можно задать значения1или2соответственно.MRAIDЗадайте для параметраBidResponse.seatbid.bid.apisзначениеMRAID_1или3для формата JSON.SIZELESSЗадайте для параметраBidResponse.seatbid.bid.attrзначениеRESPONSIVEили18для формата JSON.PLAYABLEДля этого задайте для параметраBidResponse.seatbid.bid.attrзначениеUSER_INTERACTIVEили13(для формата JSON).
Подробную информацию о том, как получить отзывы о выявленных свойствах креативов, можно найти в статье Ресурс Creatives.
Поля Open Bidding
Ответы на запросы ставок, отправленные покупателями, которые используют Open Bidding, похожи на ответы Авторизованных покупателей, участвующих в стандартном назначении ставок в реальном времени. Клиенты, использующие Open Bidding, могут указать небольшое количество дополнительных полей, а некоторые существующие поля могут иметь альтернативное применение. К ним относятся:
| Поле | Сведения |
|---|---|
BidResponse.imp.pmp.deals.id |
Идентификатор сделки из пространства имен биржи, который связан с этой ставкой и передается издателям. |
BidResponse.seatbid.bid.ext.exchange_deal_type |
Тип сделки, о котором сообщается издателям. Он влияет на то, как сделка обрабатывается на аукционе. |
BidResponse.seatbid.bid.ext.third_party_buyer_token |
Токен, используемый для идентификации информации о конечном стороннем покупателе, если биржа, выступающая в качестве участника аукциона Open Bidding, является посредником. Этот идентификатор предоставляется сторонним покупателем и должен передаваться в Google в ответе на запрос ставки без изменений. |
Рекомендации
- Включите на серверах постоянные HTTPS-подключения (также известные как keep-alive или повторное использование подключений). Установите время ожидания не менее 10 секунд. Во многих случаях лучше задать более высокое значение. Google проверяет это во время начальных тестов задержки вашего приложения, поскольку Авторизованные покупатели отправляют запросы с высокой частотой и должны избегать задержек, связанных с установлением отдельного TCP-соединения для каждого запроса.
Добавьте необязательный URL отслеживания показов, чтобы отслеживать, когда выполняется отрисовка показа, а не когда покупатель выигрывает аукцион. Поскольку не все выигравшие объявления показываются, это позволяет получать более точную статистику.
- Убедитесь, что в коде вашей системы назначения ставок нет зависимостей от устаревших полей, которые могут вызывать ошибки при назначении ставок.
- Добавьте
BidResponse.seatbid.bid.wиBidResponse.seatbid.bid.hвBidResponse.BidResponseна запрос, содержащий несколько размеров объявлений, должен включать эти поля, иначе он будет исключен из аукциона. - Размер ответа не должен превышать 8 КБ. Очень большие ответы могут увеличить задержку сети и привести к тайм-аутам.
- Следуйте рекомендациям по назначению ставок на инвентарь iOS, для которого требуется атрибуция SKAdNetwork.
Пример ответа на запрос ставки
Ниже приведены примеры запросов Protobuf и JSON в человекочитаемом формате.
OpenRTB Protobuf
OpenRTB JSON
Важно! Сообщения Protobuf в примерах представлены в виде человекочитаемого текста. Однако это не то, как сообщения отправляются по проводам. При использовании формата OpenRTB Protobuf будут приниматься только сериализованные сообщения BidResponse.
Создать и сериализовать сообщение BidResponse можно с помощью следующего кода C++:
BidResponse bid_response;
// fill in bid response with bid information
string post_response;
if (bid_response.SerializeToString(&post_response)) {
// respond to the POST with post_response as the content
} else {
// return an error to the POST
}Укажите креатив
В ответе на запрос ставки указывается креатив, который будет показан, если ваша ставка выиграет. Ставка должна включать один из поддерживаемых форматов объявлений (AMP, видео, нативные). В этом примере мы указываем креатив с помощью поля html_snippet.
Вы также можете указать креатив, используя одно из следующих полей в зависимости от формата объявления:
- Объявление, отрисованное с помощью SDK
BidResponse.seatbid.bid.ext.sdk_rendered_ad
- AMP
BidResponse.seatbid.bid.amp_ad_url
- Видео
BidResponse.seatbid.bid.adm
- Нативные объявления
BidResponse.seatbid.bid.adm_native
Укажите объявление, размещенное на ваших серверах, с помощью фрагмента HTML в поле BidResponse.seatbid.bid.adm. Фрагмент кода заключен в тег iframe, который вставляется в веб-страницу. В результате при загрузке страницы объявление извлекается и отображается. Фрагмент HTML-кода должен быть составлен так, чтобы объявление (баннер или межстраничное объявление) корректно отображалось в окне iframe и имело размер, соответствующий рекламному месту, на которое вы делаете ставку.
Кроме того, размер объявления, указанный в ответе на запрос ставки, должен точно соответствовать одной из комбинаций размеров в запросе ставки, если:
- Объявление является обычным баннером (не видео, нативным или межстраничным).
- Участник аукциона указал размер в ответе на запрос ставки. Если в запросе указано несколько размеров, необходимо объявить размер.
- Исключение составляют межстраничные объявления. Межстраничные объявления должны занимать не менее 50% ширины и 40% высоты экрана.
Вы можете указать креатив в виде фрагмента HTML-кода, используя любой действительный HTML-код, который корректно отображается. Однако помните об ограничениях, связанных с заполнением поля crid в разделе Создание сообщения BidResponse.
Например, вы можете добавить дополнительную информацию в аргументы URL, которые извлекаются с ваших серверов при отрисовке объявления. Это позволяет передавать на ваши серверы произвольные данные о показе.
Большинство правил, касающихся фрагментов HTML, которые возвращаются в ответах на запросы ставок, совпадают с правилами для сторонних объявлений. Дополнительную информацию можно найти в правилах программы "Авторизованные покупатели", требованиях к показу сторонних объявлений и статье Как объявлять URL перехода по клику в объявлениях.
Используйте одинаковые URL перехода по клику
URL перехода по клику, указанный в поле BidResponse.seatbid.bid.ext.clickurl, должен совпадать с URL целевой страницы, заданным в креативе. Ниже приведены примеры креативов в поддерживаемых форматах, которые соответствуют значению https://play.google.com/store/apps/details?id=com.example.myawesomeapp&referrer=utm_source%3Dgoogle_ab%26utm_medium%3Dcpc%26utm_campaign%3Dinstall_campaign_1 в поле clickurl.
HTML
<div id="my-app-install-ad"
style="font-family: sans-serif; border: 1px solid #ddd; padding: 10px;
display: flex; align-items: center; width: 100%; height: 100%;
box-sizing: border-box; cursor: pointer;"
onclick="window.open('https://play.google.com/store/apps/details?id=com.example.myawesomeapp&referrer=utm_source%3Dgoogle_ab%26utm_medium%3Dcpc%26utm_campaign%3Dinstall_campaign_1', '_blank')">
<img src="https://example.com/path/to/app_icon.png" alt="App Icon"
style="width: 60px; height: 60px; margin-right: 10px;
border-radius: 8px;">
<div style="flex-grow: 1;">
<h4 style="margin: 0 0 5px 0; font-size: 16px; color: #1a73e8;">
My Awesome App
</h4>
<p style="margin: 0 0 10px 0; font-size: 14px; color: #5f6368;">
The best app for doing awesome things! Download now and get started!
</p>
<span style="background-color: #1a73e8; color: white; padding: 8px 12px;
text-align: center; text-decoration: none;
display: inline-block; border-radius: 4px; font-size: 14px;
font-weight: bold;">Install</span>
</div>
</div>XML-код VAST
<VAST version="3.0"> <Ad id="creative_id_789"> <InLine> <AdSystem>MyBidderSystem</AdSystem> <AdTitle>My Awesome App Install Video</AdTitle> <Description>Install My Awesome App now!</Description> <Error> <![CDATA[https://tracking.example.com/vast_error?errorcode=[ERRORCODE]]]> </Error> <Impression> <![CDATA[https://tracking.example.com/vast_impression]]> </Impression> <Creatives> <!-- Main Video Creative --> <Creative> <Linear> <Duration>00:00:15</Duration> <TrackingEvents> <Tracking event="start"> <![CDATA[https://tracking.example.com/vast_event?label=start]]> </Tracking> <Tracking event="firstQuartile"> <![CDATA[https://tracking.example.com/vast_event?label=firstQuartile]]> </Tracking> <Tracking event="midpoint"> <![CDATA[https://tracking.example.com/vast_event?label=midpoint]]> </Tracking> <Tracking event="thirdQuartile"> <![CDATA[https://tracking.example.com/vast_event?label=thirdQuartile]]> </Tracking> <Tracking event="complete"> <![CDATA[https://tracking.example.com/vast_event?label=complete]]> </Tracking> </TrackingEvents> <VideoClicks> <ClickThrough id="gplay-video"> <![CDATA[https://play.google.com/store/apps/details?id=com.example.myawesomeapp&referrer=utm_source%3Dgoogle_ab%26utm_medium%3Dcpc%26utm_campaign%3Dinstall_campaign_1]]> </ClickThrough> <ClickTracking id="bidder-tracker-video"> <![CDATA[https://tracking.example.com/vast_click]]> </ClickTracking> </VideoClicks> <MediaFiles> <MediaFile delivery="progressive" type="video/mp4" width="640" height="360" bitrate="800" scalable="true" maintainAspectRatio="true"> <![CDATA[https://cdn.example.com/myawesomeapp_video.mp4]]> </MediaFile> </MediaFiles> </Linear> </Creative> <!-- Companion Ad Creative --> <Creative> <CompanionAds> <Companion id="companion1" width="300" height="250" assetWidth="300" assetHeight="250"> <StaticResource creativeType="image/png"> <![CDATA[https://cdn.example.com/companion_banner_300x250.png]]> </StaticResource> <TrackingEvents> <Tracking event="creativeView"> <![CDATA[https://tracking.example.com/vast_companion_view]]> </Tracking> </TrackingEvents> <CompanionClickThrough> <![CDATA[https://play.google.com/store/apps/details?id=com.example.myawesomeapp&referrer=utm_source%3Dgoogle_ab%26utm_medium%3Dcpc%26utm_campaign%3Dinstall_campaign_1]]> </CompanionClickThrough> <CompanionClickTracking> <![CDATA[https://tracking.example.com/vast_companion_click]]> </CompanionClickTracking> </Companion> </CompanionAds> </Creative> </Creatives> </InLine> </Ad> </VAST>
Стандартное
{ "ver": "1.2", "assets": [ { "id": 1, "title": { "text": "My Awesome App" } }, { "id": 2, "img": { "url": "https://example.com/path/to/app_icon.png", "w": 60, "h": 60 } }, { "id": 3, "data": { "value": "The best app for doing awesome things! Download now and get started!" } }, { "id": 4, "data": { "value": "Install" } } ], "link": { "url": "https://play.google.com/store/apps/details?id=com.example.myawesomeapp&referrer=utm_source%3Dgoogle_ab%26utm_medium%3Dcpc%26utm_campaign%3Dinstall_campaign_1", "clicktrackers": [ "https://tracking.example.com/native_click" ] }, "imptrackers": [ "https://tracking.example.com/native_impression" ] }
Укажите макросы
Макросы – это фрагменты форматированного текста, которые встраиваются в некоторые поля ответа на запрос ставки, содержащие URL. При показе объявления макросы заменяются на соответствующие значения. Например, если ваша выигрышная ставка включала макрос AUCTION_PRICE во фрагменте HTML-кода креатива, то макрос будет заменен значением, которое можно расшифровать, чтобы определить сумму, уплаченную за показ на аукционе.
Макросы можно добавлять в следующие поля:
-
BidResponse.seatbid.bid.admМакросы поддерживаются в форматах фрагментов HTML, нативных объявлений, URL видео и XML-кода VAST для видео.
-
BidResponse.seatbid.bid.adm_native.eventtrackers.url -
BidResponse.seatbid.bid.adm_native.imptrackers -
BidResponse.seatbid.bid.ext.amp_ad_urlВ креативах AMP поддерживаются только макросы Google
WINNING_PRICEиWINNING_PRICE_ESC. -
BidResponse.seatbid.bid.burl -
BidResponse.seatbid.bid.ext.impression_tracking_urlИспользуйте этот параметр вместо
BidResponse.seatbid.bid.burl, если вам нужно указать несколько URL для оплаты.
Например, вы можете добавить макрос в фрагмент HTML-кода, вставив ${MACRO} в URL, который используется для получения креатива. В этом случае MACRO – один из поддерживаемых макросов, описанных в спецификации OpenRTB.
Макросы Google
Google поддерживает дополнительные макросы, помимо тех, которые указаны в спецификации OpenRTB. Они имеют другой формат и при встраивании в URL выглядят как %%MACRO%%. В таблице ниже описаны эти макросы.
| Макро | Описание |
|---|---|
ADVERTISING_IDENTIFIER |
Позволяет покупателям получать идентификатор IDFA для iOS или рекламный идентификатор для Android при отрисовке показа. Подробнее о расшифровке рекламных идентификаторов. |
CACHEBUSTER |
Строковое представление случайного беззнакового четырехбайтового целого числа. |
CLICK_URL_UNESC |
Неэкранированный URL клика для объявления. Непосредственно после макроса должна указываться экранированная версия стороннего URL клика. Например, если сторонний URL клика – <a href="%%CLICK_URL_UNESC%%http%3A%2F%2Fmy.adserver.com%2Fsome%2Fpath%2Fhandleclick%3Fclick%3Dclk"></a> При показе объявления этот код преобразуется в следующий: <a href="http://google-click-url?...&ad_url=http%3A%2F%2Fmy.adserver.com%2Fsome%2Fpath%2Fhandleclick%3Fclick%3Dclk"></a> URL сначала зарегистрирует клик в Google, а затем перенаправит пользователя на сторонний URL клика. |
CLICK_URL_ESC |
Экранированный URL клика для объявления. Используется вместо макроса Например, в HTML-фрагменте можно использовать следующий код: <a href="http://my.adserver.com/click?google_click_url=%%CLICK_URL_ESC%%"></a> При показе объявления этот код преобразуется в следующий: <a href="http://my.adserver.com/click?google_click_url=http://google-click- url%3F...%26ad_url%3D"></a> Это позволит зарегистрировать клик в После |
CLICK_URL_ESC_ESC |
URL объявления с двойным экранированием. Используется вместо макроса Например, в HTML-фрагменте можно использовать следующий код: <a href="http://my.adserver.com/click?google_click_url=%%CLICK_URL_ESC_ESC%%"></a> При показе объявления этот код преобразуется в следующий: <a href="http://my.otheradserver.com/click?google_click_url=http%3A%2F%2Fmy.adserver.com%2Fclick%3Fgoogle_click_url%3Dhttp%3A%2F%2Fgoogle-click-%20url%253F...%2526ad_url%253D"></a> |
SCHEME |
Заменяется на http:, если запрос ставки не требует SSL, или на https:, если запрос ставки требует SSL. |
SITE |
Экранированный домен URL контента или анонимный идентификатор анонимного инвентаря. |
SITE_URL |
Устаревший метод. Заменен макросом SITE, который выполняет те же функции. |
TZ_OFFSET |
Смещение часового пояса. |
VERIFICATION |
Разные значения для рабочей среды и для сканирования креатива в процессе проверки. Формат: Например, если креатив содержит |
WINNING_PRICE |
Закодированная цена за показ (ЦЗУ, а не цена за тысячу показов) в миллионных долях, выраженная в валюте аккаунта. Например, лучшая цена за тысячу показов, равная 5 долл. США, соответствует 5 000 000 миллионных долей от цены за тысячу показов или 5000 миллионных долей от ЦЗУ. Соответственно,закодированное значение Чтобы обработать этот макрос, вам потребуется реализовать приложение, которое расшифровывает подтверждения цены. Подробную информацию вы найдете в статье Расшифровка подтверждений цены. |
WINNING_PRICE_ESC |
Макрос WINNING_PRICE с закодированным URL. |
Google требует, чтобы вы использовали макрос CLICK_URL_UNESC или CLICK_URL_ESC в креативе стороннего объявления. Для отслеживания кликов Google использует макросы CLICK_URL.
Экранирование URL в макросах выполняется по следующей схеме:
- Пробел заменяется знаком плюса (
+). - Буквы и цифры (0–9, a–z, A–Z), а также символы !()*,-./:_~ остаются без изменений.
- Все остальные символы заменяются на
%XX, гдеXX– шестнадцатеричное число, представляющее символ.
Ограничения и требования для издателей
Запрос ставки содержит информацию о том, какие ограничения и требования издатели устанавливают для креативов на аукционе.
BidRequest.bcat- Вы можете сравнить заблокированные категории, указанные в этом поле, с категориями, которые были определены для ваших креативов, с помощью поля
detectedCategoriesв Real-time Bidding API.
- Вы можете сравнить заблокированные категории, указанные в этом поле, с категориями, которые были определены для ваших креативов, с помощью поля
BidRequest.imp.ext.allowed_vendor_typeBidRequest.imp.secure- На практике всегда будет задано значение
true, поскольку Google требует поддержки SSL для всех креативов.
- На практике всегда будет задано значение
BidRequest.imp.{audio/banner/native/video}BidRequest.imp.{audio/banner/native/video}.apiBidRequest.imp.{audio/banner/native/video}.battrBidRequest.imp.{audio/banner/video}.mimes
Не назначайте ставки для объявлений, содержащих функции с ограничениями. Для разрешенных функций, таких как тип поставщика, возвращайте объявление, только если тип его поставщика указан в списке allowed_vendor_type в BidRequest. В ставке должны быть указаны только те форматы объявлений, которые заданы в запросе ставки в полях, подобных BidRequest.imp.banner. Подробную информацию вы найдете в комментариях к этим полям в определении буфера протокола BidRequest.
Если в BidResponse возвращается объявление, вы должны точно задать поля BidResponse.seatbid.bid.attr, BidResponse.seatbid.bid.cat и BidResponse.seatbid.bid.adomain или BidResponse.seatbid.bid.adm_native.link.url в BidResponse. Если к объявлению применимо несколько значений для этих полей, необходимо указать все значения. Подробную информацию можно найти в комментариях к этим полям в определении буфера протокола BidResponse.
Ответы, в которых эти поля не заданы, отбрасываются.
Open Measurement
Open Measurement позволяет указывать сторонних поставщиков, которые предоставляют независимые услуги по отслеживанию и проверке объявлений, показываемых в мобильных приложениях.
Поддерживаются следующие форматы объявлений: видео, баннеры и межстраничные объявления. Дополнительную информацию о том, как использовать Open Measurement в ответе на запрос ставки, содержащем эти форматы, можно найти в статье Справочного центра, посвященной SDK для отслеживания Open Measurement.
Примеры ответов на запросы ставок
В разделах ниже приведены примеры ответов на запросы ставок для разных типов объявлений.