Создание ответа

После обработки запроса ставки от 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 клика – http://my.adserver.com/some/path/handleclick?click=clk, то после вызова макроса можно использовать следующий код с однократно экранированной версией стороннего 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 клика для объявления. Используется вместо макроса CLICK_URL_UNESC, когда значение сначала передается на другой сервер, возвращающий переадресацию.

Например, в 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>

Это позволит зарегистрировать клик в my.adserver.com, а затем перенаправить пользователя на URL, указанный в параметре google_click_url. При этом предполагается, что my.adserver.com отменяет экранирование параметра google_click_url.

После %%CLICK_URL_ESC%% можно добавить URL с двойным экранированием. После того как my.adserver.com снимет экранирование, к google_click_url будет добавлен URL с однократным экранированием. При получении google_click_url он будет экранирован ещё раз, а затем перенаправлен.

CLICK_URL_ESC_ESC

URL объявления с двойным экранированием. Используется вместо макроса CLICK_URL_UNESC, когда значение сначала передается на другой сервер, возвращающий переадресацию.

Например, в 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

Разные значения для рабочей среды и для сканирования креатива в процессе проверки. Формат: %%?VERIFICATION:true-val:false-val%%. В качестве true-val и false-val можно использовать любые значения, кроме макросов, в том числе пустые строки. Мы рекомендуем биржам использовать этот макрос при работе с Open Bidding. В этом случае платформам покупателя не потребуется вносить изменения.

Например, если креатив содержит %%?VERIFICATION:-1:5000%%, то при показе будет подставлен текст 5000, а при проверке – -1. Это позволяет различать эти два набора пингов.

WINNING_PRICE

Закодированная цена за показ (ЦЗУ, а не цена за тысячу показов) в миллионных долях, выраженная в валюте аккаунта. Например, лучшая цена за тысячу показов, равная 5 долл. США, соответствует 5 000 000 миллионных долей от цены за тысячу показов или 5000 миллионных долей от ЦЗУ. Соответственно,закодированное значение WINNING_PRICE будет равно 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_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 позволяет указывать сторонних поставщиков, которые предоставляют независимые услуги по отслеживанию и проверке объявлений, показываемых в мобильных приложениях.

Поддерживаются следующие форматы объявлений: видео, баннеры и межстраничные объявления. Дополнительную информацию о том, как использовать Open Measurement в ответе на запрос ставки, содержащем эти форматы, можно найти в статье Справочного центра, посвященной SDK для отслеживания Open Measurement.

Примеры ответов на запросы ставок

В разделах ниже приведены примеры ответов на запросы ставок для разных типов объявлений.

Баннер с рекламой приложения

OpenRTB Protobuf

OpenRTB JSON

Межстраничное объявление в приложении

OpenRTB Protobuf

OpenRTB JSON

Межстраничное видеообъявление в приложении

OpenRTB Protobuf

OpenRTB JSON

Нативное приложение

OpenRTB Protobuf

OpenRTB JSON

Интернет-видео

OpenRTB Protobuf

OpenRTB JSON

Баннер для мобильных сайтов, предназначенный для покупателей, назначающих ставки на аукционе

OpenRTB Protobuf

OpenRTB JSON