レスポンスを作成する

アプリケーションは、Google からの入札リクエストを処理した後、レスポンスを作成して送信する必要があります。このガイドでは、レスポンスを構築するようにアプリケーションをコーディングする方法について説明します。

BidResponse メッセージを作成する

入札を送信するには、入札アプリケーションが、設定した形式の Bid を含む BidResponse を使用して入札リクエストに応答する必要があります。JSON 形式を使用している場合、レスポンスでは Content-Type ヘッダーを application/json; charset=utf-8 に設定し、本文に JSON BidResponse を含める必要があります。Protobuf 形式を使用している場合、アプリケーションは Content-Type ヘッダーを application/octet-stream に設定し、シリアル化された BidResponse を本文に含める必要があります。

Protobuf 形式の BidResponse をビルドしてシリアル化するには、openrtb.proto と openrtb-adx.proto に基づいて Protobuf ライブラリを生成して使用する必要があります。これらは、標準の OpenRTB BidResponse フィールドと Google 拡張機能をそれぞれ Protobuf に実装します。これらは、Protos & Reference Data で確認できます。

インプレッションに入札しない場合は、空の HTTP 204 レスポンスを返す必要があります。アプリケーションは、すべての BidRequest に対してレスポンスを返す必要があります。タイムアウトと解析できないレスポンスはエラーと見なされ、エラー率の高いビッダーは Google によってスロットリングされます。

クリエイティブ ID

BidResponse は、BidResponse.seatbid.bid.crid フィールド(128 バイトの上限)でクリエイティブを指定します。類似したクリエイティブであっても、サイズ、宣言された URL、クリエイティブ属性、ベンダータイプなど、重要な特性が異なる場合は、このフィールドに一意の値を指定する必要があります。つまり、次のいずれかの条件に該当する 2 つの広告には、異なるクリエイティブ ID を割り当てる必要があります。

  • 外観や動作が異なる。
  • 別の画像にレンダリングする。
  • 異なる方法でレンダリングする(たとえば、1 つの広告は画像で構成され、もう 1 つは動画で構成される)。

アプリケーションを設計する際は、送信するクリエイティブの種類に適した識別子を生成する体系的な方法を決定する必要があります。

広告の帰属表示

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 に設定するか、JSON 形式の場合は 3 に設定します。
  • SIZELESS
    BidResponse.seatbid.bid.attr を RESPONSIVE に設定するか、JSON 形式の場合は 18 に設定します。
  • PLAYABLE
    これは、BidResponse.seatbid.bid.attr を USER_INTERACTIVE に設定するか、JSON 形式の場合は 13 に設定することで示されます。

クリエイティブの検出されたプロパティに関するフィードバックを取得する方法については、クリエイティブ リソースをご覧ください。

Open Bidding のフィールド

Open Bidding に参加しているエクスチェンジ ビッダーとネットワーク ビッダーから送信される入札レスポンスは、標準のリアルタイム ビッダーに参加している認定バイヤーの入札レスポンスと似ています。Open Bidding のお客様は、少数の追加フィールドを指定できます。また、既存のフィールドの一部は別の用途に使用できます。次に例を示します。

フィールド 詳細
BidResponse.imp.pmp.deals.id

この入札に関連付けられ、パブリッシャーに報告される、エクスチェンジの名前空間の取引 ID。

BidResponse.seatbid.bid.ext.exchange_deal_type

パブリッシャーに報告される取引のタイプ。オークションでの取引の処理方法に影響します。

BidResponse.seatbid.bid.ext.third_party_buyer_token Open Bidding ユーザーとしてのエクスチェンジが仲介者である場合に、エンドの第三者購入者情報を識別するために使用されるトークン。これは第三者購入者から取得され、入札レスポンスで変更されずに Google に渡される必要があります。

推奨事項

  • サーバーで永続的な HTTPS 接続(「キープアライブ」または「接続の再利用」とも呼ばれます)を有効にします。タイムアウトを 10 秒以上に設定します。多くの場合、値を大きくすると効果的です。認定バイヤーは高いレートでリクエストを送信し、リクエストごとに個別の TCP 接続を確立するレイテンシ オーバーヘッドを回避する必要があるため、Google はアプリケーションの初期レイテンシ テスト中にこれを確認します。
  • オプションのインプレッション トラッキング URL を含めると、ビッダーが落札したときではなく、インプレッションがレンダリングされたときにトラッキングできます。落札とレンダリングの間にドロップオフがあるため、この方法の方がより正確なトラッキング統計情報を得ることができます。

  • ビッダーのコードが非推奨のフィールドに依存しないようにしてください。依存していると、入札がエラーで失敗する可能性があります。
  • BidResponse に BidResponse.seatbid.bid.w と BidResponse.seatbid.bid.h を含めます。複数の広告サイズを含むリクエストに対する BidResponse には、これらのフィールドを含める必要があります。含まれていない場合、オークションから除外されます。
  • レスポンスのサイズを 8K 未満に制限します。レスポンスが非常に大きいと、ネットワーク レイテンシが増加し、タイムアウトが発生する可能性があります。
  • SKAdNetwork アトリビューションが必要な iOS 広告枠の入札に関するガイドラインに沿って対応してください。

入札レスポンスの例

次の例は、Protobuf リクエストと JSON リクエストの人が読めるサンプルです。

OpenRTB Protobuf

OpenRTB JSON

重要: サンプルに示されている Protobuf メッセージは、人間が読めるテキストとして表されています。ただし、これはメッセージがネットワーク経由で送信される方法ではありません。OpenRTB Protobuf 形式を使用する場合、シリアル化された BidResponse メッセージのみが受け入れられます。

次の C++ コードを使用して、BidResponse メッセージを作成してシリアル化できます。

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

BidResponse.seatbid.bid.adm フィールドの HTML スニペットを使用して、独自のサーバーでホストされている広告を指定します。スニペットはウェブページに挿入された iframe で囲まれているため、ページが読み込まれると広告が取得されてレンダリングされます。広告(バナーまたはインタースティシャル)が iframe 内で正しくレンダリングされ、入札対象の広告スロットに適したサイズになるように、HTML スニペットを作成する必要があります。

また、入札レスポンスで宣言された広告サイズは、次の条件を満たす場合、入札リクエストのサイズ組み合わせのいずれかと完全に一致する必要があります。

  • 広告が通常のバナーである(動画、ネイティブ、インタースティシャルではない)。
  • 入札者が入札レスポンスでサイズを宣言している。リクエストに複数のサイズが含まれる場合は、サイズ宣言が必要です。
  • インタースティシャル広告は例外です。インタースティシャルの場合、幅は画面幅の 50% 以上、高さは画面の高さの 40% 以上にする必要があります。

HTML スニペット クリエイティブは、正しくレンダリングされる有効な HTML コードを使用して指定できますが、BidResponse メッセージを作成するセクションの crid フィールドの指定に関する制限事項に注意してください。この機能の用途の一つは、広告のレンダリングの一環としてサーバーから取得される URL の引数に、追加情報を挿入することです。これにより、インプレッションに関する任意のデータを独自のサーバーに返すことができます。

入札レスポンスで返される HTML スニペットに関するポリシーのほとんどは、第三者広告に関するポリシーと同じです。詳しくは、認定バイヤー プログラム ガイドライン、第三者広告配信に関する要件、広告でリンク先 URL を宣言するをご覧ください。

一貫したリンク先 URL を使用する

BidResponse.seatbid.bid.ext.clickurl フィールドで指定するリンク先 URL は、クリエイティブで指定されているランディング ページ URL と同じである必要があります。clickurl フィールドが https://play.google.com/store/apps/details?id=com.example.myawesomeapp&referrer=utm_source%3Dgoogle_ab%26utm_medium%3Dcpc%26utm_campaign%3Dinstall_campaign_1 に設定されている場合、サポートされている形式のクリエイティブの例を以下に示します。

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>

VAST XML

<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 を含む一部の入札レスポンス フィールドに埋め込まれた書式設定されたテキストで、広告配信時に関連する値に置き換えられます。たとえば、落札した入札に、入札に含まれる HTML スニペット クリエイティブの AUCTION_PRICE マクロが含まれている場合、マクロは、オークションでインプレッションに支払った金額を特定するために復号できる値に置き換えられます。

マクロは次のフィールドに含めることができます。

  • BidResponse.seatbid.bid.adm

    マクロは、HTML スニペット、ネイティブ、動画 URL、動画 VAST XML の各形式でサポートされています。

  • 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

    複数の請求 URL が必要な場合は、BidResponse.seatbid.bid.burl の代わりにこれを使用します。

たとえば、クリエイティブの取得に使用する URL に ${MACRO} を埋め込むことで、HTML スニペットの一部としてマクロを含めることができます。ここで、MACRO は、OpenRTB 仕様で説明されているサポートされているマクロの 1 つです。

Google マクロ

Google では、OpenRTB 仕様に記載されているマクロ以外にもマクロをサポートしています。これらのマクロは形式が異なり、URL に埋め込まれている場合は %%MACRO%% のように表示されます。次の表に、これらのマクロを示します。

マクロ 説明
ADVERTISING_IDENTIFIER 購入者がインプレッションのレンダリング時に iOS IDFA または Android の広告 ID を受け取れるようにします。 詳しくは、広告 ID の復号をご覧ください。
CACHEBUSTER ランダムな 4 バイト符号なし整数の文字列表現。
CLICK_URL_UNESC

エスケープ処理なしの広告のクリック URL。スニペットでは、エスケープ処理された第三者のクリック URL をこのマクロの直後に記述する必要があります。

たとえば、第三者のクリック URL が http://my.adserver.com/some/path/handleclick?click=clk の場合、次のコードでは、マクロ呼び出しの後に、1 回エスケープ処理された第三者のクリック 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 に登録され、google_click_url パラメータで渡された URL へのリダイレクトが行われます。これは、my.adserver.com が google_click_url パラメータをエスケープ解除することを前提としています。

%%CLICK_URL_ESC%% の後に、二重エスケープされた URL を追加できます。my.adserver.com によってエスケープ解除が行われると、1 回エスケープされたバージョンの URL が google_click_url に追加されます。google_click_url が取得されると、もう一度エスケープ解除されてからリダイレクトされます。

CLICK_URL_ESC_ESC

広告の URL(2 回エスケープ)。まず別のサーバーに値を渡し、そのサーバーからリダイレクトを返すようにする場合は、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 入札リクエストで SSL が不要な場合は http:、SSL が必要な場合は https: に展開されます。
SITE コンテンツ URL の URL がエスケープされたドメイン、または匿名広告枠の匿名 ID。
SITE_URL 非推奨です。同じ機能を提供する SITE マクロに置き換えられました。
TZ_OFFSET タイムゾーン オフセット。
VERIFICATION

本番環境と、検証パイプラインでクリエイティブがスキャンされる場合で異なる値。形式は %%?VERIFICATION:true-val:false-val%% です。true-val と false-val には、マクロ以外の任意の値(空の文字列を含む)を使用できます。Open Bidding では、エクスチェンジがこのマクロを使用することをおすすめします。エクスチェンジがこのマクロを使用すれば、デマンドサイド プラットフォームで変更を行う必要はありません。

たとえば、クリエイティブに %%?VERIFICATION:-1:5000%% が含まれている場合、テキストの置換は、配信時は 5000、検証パイプラインでは -1 になります。これは、これら 2 つの ping セットを区別するのに役立ちます。

WINNING_PRICE

エンコードされたインプレッションの費用(CPM ではなく CPI)をアカウントの通貨で 100 万倍した値を返します。たとえば 5 米ドルの落札 CPM は、500 万マイクロ CPM または 5,000 マイクロ CPI に相当し、WINNING_PRICE をデコードした値は 5,000 になります。落札価格は CPI で表されます。

このマクロを解析するには、価格確認を復号するアプリケーションを実装する必要があります。詳しくは、価格確認の復号のページをご覧ください。

WINNING_PRICE_ESC URL エスケープされた WINNING_PRICE。

第三者配信広告のクリエイティブ内で CLICK_URL_UNESC マクロまたは CLICK_URL_ESC マクロを使用する必要があります。Google では、クリック トラッキングに CLICK_URL マクロを使用します。

マクロでの URL エスケープでは、次のスキームが使用されます。

  • スペース文字はプラス記号(+)に置き換えられます。
  • 英数字(0 ~ 9、a ~ z、A ~ Z)と、!()*,-./:_~ のセットに含まれる文字は変更されません。
  • その他の文字はすべて %XX に置き換えられます。ここで、XX は文字を表す 16 進数です。

パブリッシャー向け制限コンテンツと要件

入札リクエストには、オークションでパブリッシャーがクリエイティブに適用する制限や要件の種類に関する情報が含まれます。

  • BidRequest.bcat
    • このフィールドで指定されたブロックされたカテゴリと、送信したクリエイティブで検出されたカテゴリを比較するには、Real-time Bidding API の detectedCategories フィールドを使用します。
  • BidRequest.imp.ext.allowed_vendor_type
  • BidRequest.imp.secure
    • Google ではすべてのクリエイティブで SSL のサポートが必須となっているため、実際には常に true に設定されます。
  • 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

制限付きの機能を含む広告で入札しないでください。ベンダータイプなどの許可された機能については、ベンダータイプが BidRequest の allowed_vendor_type リストにある場合にのみ広告を返します。入札リクエストで BidRequest.imp.banner などのフィールドに入力して指定した広告フォーマットのみを入札に含める必要があります。詳細については、BidRequest プロトコル バッファ定義のこれらのフィールドのコメントをご覧ください。

BidResponse で広告が返された場合は、BidResponse の BidResponse.seatbid.bid.attr、BidResponse.seatbid.bid.cat、BidResponse.seatbid.bid.adomain または BidResponse.seatbid.bid.adm_native.link.url フィールドを正確に設定する必要があります。広告にこれらのフィールドに適用可能な値が複数ある場合は、すべての値を含める必要があります。詳細については、BidResponse プロトコル バッファ定義のこれらのフィールドのコメントをご覧ください。これらのフィールドが設定されていないレスポンスは破棄されます。

Open Measurement

Open Measurement を使用すると、モバイルアプリ環境に配信される広告の独立した測定および検証サービスを提供するサードパーティ ベンダーを指定できます。

サポートされている広告フォーマットには、動画広告、バナー広告、インタースティシャル広告があります。これらのフォーマットを含む入札レスポンスで Open Measurement を使用する方法については、Open Measurement SDK のヘルプセンター記事をご覧ください。

入札レスポンスの例

以降のセクションでは、さまざまな広告タイプの入札レスポンスの例を示します。

アプリバナー

OpenRTB Protobuf

OpenRTB JSON

アプリ内インタースティシャル

OpenRTB Protobuf

OpenRTB JSON

アプリ内インタースティシャル動画

OpenRTB Protobuf

OpenRTB JSON

アプリネイティブ

OpenRTB Protobuf

OpenRTB JSON

ウェブ動画

OpenRTB Protobuf

OpenRTB JSON

エクスチェンジ ビッダー用のモバイルウェブ バナー

OpenRTB Protobuf

OpenRTB JSON