После обработки вашим приложением запроса на размещение ставки от 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 , которые реализуют стандартные поля OpenRTB BidResponse и расширения Google в Protobuf соответственно. Их можно найти в разделе «Прототипы и справочные данные» .
Если вы не хотите участвовать в торгах за показ, вы должны вернуть пустой HTTP-ответ 204. Ваше приложение должно возвращать ответ на каждый BidRequest . Тайм-ауты и ответы, которые не могут быть обработаны, считаются ошибками, и Google ограничивает количество участников торгов с высоким уровнем ошибок.
Креативный ID
В вашем BidResponse указывается креатив через поле BidResponse.seatbid.bid.crid (ограничение 128 байт). Даже похожие креативы должны иметь уникальные значения для этого поля, если они различаются по каким-либо существенным характеристикам, включая, помимо прочего: размер, заявленный URL, атрибуты креатива и типы поставщиков. Другими словами, вы должны присвоить разные идентификаторы креативов любым двум объявлениям, которые:
- Выглядеть или вести себя иначе.
- Визуализация в разные изображения.
- Визуализация может осуществляться различными способами (например, один рекламный ролик состоит из изображения, а другой — из видео).
При разработке приложения следует определиться с систематическим способом генерации идентификаторов, который будет иметь смысл для тех типов креативных материалов, которые вы планируете представить.
Атрибуты объявления
Google рекомендует указывать атрибуты креатива для описания характеристик объявления и его таргетинга, используя либо комбинацию 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.
В разделе «Креативные материалы» вы найдете объяснение того, как получать обратную связь относительно обнаруженных свойств ваших креативов.
Открытые поля для торгов
Ответы на торги, отправляемые участниками биржевых и сетевых торгов, участвующими в открытом тендере, аналогичны ответам авторизованных покупателей, участвующих в стандартном тендере в режиме реального времени. Участники открытого тендера могут указать небольшое количество дополнительных полей, а некоторые существующие поля могут иметь альтернативное назначение. К ним относятся следующие:
| Поле | Подробности |
|---|---|
BidResponse.imp.pmp.deals.id | Идентификатор сделки из пространства имен биржи, связанный с данной заявкой и сообщаемый издателям. |
BidResponse.seatbid.bid.ext.exchange_deal_type | Тип сделки, о которой сообщается издателям, влияющий на то, как сделка будет рассматриваться на аукционе. |
BidResponse.seatbid.bid.ext.third_party_buyer_token | Токен используется для идентификации информации о конечном покупателе (третьей стороне), если биржа, выступающая в качестве открытого участника торгов, является посредником. Этот токен получается от стороннего покупателя и должен быть передан в Google в неизмененном виде в ответе на заявку. |
Рекомендации
- Включите постоянные HTTPS-соединения (также известные как «поддержание соединения» или «повторное использование соединения») на ваших серверах. Установите тайм-аут минимум на 10 секунд — в большинстве случаев более высокие значения будут полезны. Google проверяет это во время первоначальных тестов задержки вашего приложения, поскольку Authorized Buyers отправляет запросы с высокой частотой и должен избегать накладных расходов, связанных с установлением отдельного TCP-соединения для каждого запроса.
Укажите необязательный URL-адрес для отслеживания показов, чтобы отслеживать момент отображения показа, а не момент выигрыша участником торгов. Из-за разницы во времени между выигрышами и отображением это позволит получить более точную статистику отслеживания.
- В коде участника торгов не должно быть зависимостей от устаревших полей , так как это может привести к ошибкам при подаче заявок.
- Включите в свой
BidResponseBidResponse.seatbid.bid.wиBidResponse.seatbid.bid.h.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
-
- АМП
-
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 в разделе сообщения Create BidResponse . Одно из применений этого — добавление дополнительной информации в аргументы URL-адресов, получаемых с ваших серверов в процессе отображения объявления. Это позволяет передавать произвольные данные о показе обратно на ваши собственные серверы.
Большинство правил для HTML-фрагментов, возвращаемых в ответах на ставки, совпадают с правилами для рекламы сторонних компаний. Дополнительную информацию см. в разделах «Руководство по программе авторизованных покупателей» , «Требования к показу рекламы сторонними компаниями» и «Указание URL-адресов переходов по ссылкам в рекламе» .
Укажите макросы
Макросы — это форматированный текст, встроенный в некоторые поля ответа на ставку, содержащий URL-адреса, которые заменяются соответствующим значением во время показа рекламы. Например, если ваша выигрышная ставка включала макрос AUCTION_PRICE в HTML-фрагменте креатива, прилагаемом к вашей ставке, макрос будет заменен значением, которое вы сможете расшифровать, чтобы определить сумму, уплаченную вами за показ на аукционе.
Макросы можно добавлять в следующие поля:
BidResponse.seatbid.bid.admМакросы поддерживаются для HTML-фрагментов, исходного кода, URL-адресов видео и форматов VAST XML для видео.
BidResponse.seatbid.bid.adm_native.eventtrackers.urlBidResponse.seatbid.bid.adm_native.imptrackersBidResponse.seatbid.bid.ext.amp_ad_urlДля креативов AMP поддерживаются только макросы
WINNING_PRICEиWINNING_PRICE_ESC, специфичные для Google.BidResponse.seatbid.bid.burlBidResponse.seatbid.bid.ext.impression_tracking_urlИспользуйте этот код вместо
BidResponse.seatbid.bid.burlесли вам требуется более одного URL-адреса для выставления счетов.
Например, вы можете включить макрос в HTML-фрагмент, встроив ${MACRO} в URL-адрес, используемый для загрузки креатива, где MACRO — один из поддерживаемых макросов, описанных в спецификации OpenRTB .
Макросы Google
Помимо макросов, описанных в спецификации OpenRTB, Google поддерживает и другие макросы. Они имеют другой формат и при встраивании в URL-адрес будут отображаться как %%MACRO%% . В следующей таблице описаны эти макросы:
| Макро | Описание |
|---|---|
ADVERTISING_IDENTIFIER | Позволяет покупателям получать идентификатор iOS IDFA или рекламный идентификатор 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 | Закодированная стоимость показа (то есть, CPI, а не CPM) в микросекундах валюты аккаунта. Например, выигрышная CPM в 5 долларов США соответствует 5 000 000 микросекунд CPM или 5 000 микросекунд CPI. В этом случае декодированное значение Для анализа этого макроса вам потребуется разработать приложение, которое расшифровывает подтверждения цен. Дополнительную информацию см. на странице «Расшифровка подтверждений цен» . |
WINNING_PRICE_ESC | URL-экранированный WINNING_PRICE . |
Google требует использования макроса CLICK_URL_UNESC или CLICK_URL_ESC в креативе рекламного объявления, показываемого сторонним сервисом. Google использует макрос CLICK_URL для отслеживания кликов.
Экранирование URL-адресов в макросах осуществляется по следующей схеме:
- Пробел заменяется знаком плюс (
+). - Буквенно-цифровые символы (0-9, az, AZ) и символы из набора !()*,-./:_~ остаются без изменений.
- Все остальные символы заменяются на
%XX, гдеXX— шестнадцатеричное число, представляющее этот символ.
Ограничения и требования издателя
В заявке на участие в тендере содержится информация об ограничениях и требованиях, которые издатели предъявляют к авторам, участвующим в аукционе.
-
BidRequest.bcat- Вы можете сравнить заблокированные категории, указанные в этом поле, с категориями, обнаруженными для ваших креативов, используя поле
detectedCategoriesв API торгов в реальном времени.
- Вы можете сравнить заблокированные категории, указанные в этом поле, с категориями, обнаруженными для ваших креативов, используя поле
-
BidRequest.imp.ext.allowed_vendor_type -
BidRequest.imp.secure- На практике это значение всегда будет установлено
trueпоскольку Google требует поддержки SSL для всех рекламных материалов.
- На практике это значение всегда будет установлено
-
BidRequest.imp.{audio/banner/native/video} -
BidRequest.imp.{audio/banner/native/video}.api -
BidRequest.imp.{audio/banner/native/video}.battr -
BidRequest.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 в ответе на запрос ставок, содержащем эти форматы, обратитесь к статье в Справочном центре SDK Open Measurement .
Примеры ответов на тендерные предложения
В следующих разделах представлены примеры ответов на ставки для различных типов объявлений.