Crea la risposta

Dopo che l'applicazione ha elaborato la richiesta di offerta di Google, deve creare e inviare una risposta. Questa guida spiega come programmare l'applicazione per creare la risposta.

Crea un messaggio BidResponse

Per inviare un'offerta, la tua applicazione di asta deve rispondere a una richiesta di offerta con un BidResponse contenente un Bid nel formato configurato. Se utilizzi il formato JSON, la risposta deve impostare l'intestazione Content-Type su application/json; charset=utf-8 e includere il JSON BidResponse nel corpo. Se utilizzi il formato Protobuf, la tua applicazione deve impostare l'intestazione Content-Type su application/octet-stream e includere il BidResponse serializzato nel corpo.

Per creare e serializzare un BidResponse per il formato Protobuf, devi generare e utilizzare librerie Protobuf basate su openrtb.proto e openrtb-adx.proto, che implementano rispettivamente i campi BidResponse OpenRTB standard e le estensioni Google in Protobuf. Questi possono essere trovati in Protos & Reference Data.

Se non vuoi fare un'offerta per un'impressione, devi restituire una risposta HTTP 204 vuota. La tua applicazione deve restituire una risposta a ogni BidRequest. I timeout e le risposte che non possono essere analizzate sono considerati errori e Google limita gli offerenti con tassi di errore elevati.

ID creatività

La tua BidResponse specifica una creatività tramite il campo BidResponse.seatbid.bid.crid (limite di 128 byte). Anche le creatività simili devono avere valori univoci per questo campo se differiscono per caratteristiche importanti, tra cui, a titolo esemplificativo, dimensioni, URL dichiarato, attributi della creatività e tipi di fornitori. In altre parole, devi assegnare ID creatività diversi a due annunci che:

  • Avere un aspetto o un comportamento diverso.
  • Esegui il rendering in immagini diverse.
  • Vengono visualizzati con mezzi diversi (ad esempio, un annuncio è costituito da un'immagine, mentre l'altro è un video).

Quando progetti la tua applicazione, devi decidere un modo sistematico per generare identificatori che abbia senso per i tipi di creatività che prevedi di inviare.

Attributi annuncio

Google consiglia di dichiarare gli attributi delle creatività per descrivere le caratteristiche dell'annuncio e il relativo targeting utilizzando una combinazione di BidResponse.seatbid.bid.apis e BidResponse.seatbid.bid.attr o l'estensione BidResponse.seatbid.bid.ext.attribute. Di seguito viene descritto come dichiarare gli attributi:

  • VPAID
    Imposta BidResponse.seatbid.bid.apis su VPAID_1 o VPAID_2. Per il formato JSON, questo valore può essere impostato rispettivamente su 1 o 2.
  • MRAID
    Imposta BidResponse.seatbid.bid.apis su MRAID_1 o 3 per il formato JSON.
  • SIZELESS
    Imposta BidResponse.seatbid.bid.attr su RESPONSIVE o 18 per il formato JSON.
  • PLAYABLE
    Questo viene indicato impostando BidResponse.seatbid.bid.attr su USER_INTERACTIVE o 13 per il formato JSON.

Consulta la risorsa Creatives per una spiegazione su come ricevere feedback sulle proprietà rilevate delle tue creatività.

Campi di Open Bidding

Le risposte all'offerta inviate dagli offerenti della piattaforma di scambio e della rete che partecipano a Open Bidding sono simili a quelle degli Authorized Buyers che partecipano alle offerte in tempo reale standard. I clienti di Open Bidding possono specificare un numero ridotto di campi aggiuntivi e alcuni campi esistenti potrebbero avere usi alternativi. Sono inclusi i seguenti tipi:

Campo Dettagli
BidResponse.imp.pmp.deals.id

L'ID deal dello spazio dei nomi della piattaforma di scambio pubblicitario associato a questa offerta e segnalato ai publisher.

BidResponse.seatbid.bid.ext.exchange_deal_type

Il tipo di deal segnalato ai publisher, che influisce sul modo in cui il deal viene trattato nell'asta.

BidResponse.seatbid.bid.ext.third_party_buyer_token Token utilizzato per identificare le informazioni sull'acquirente di terze parti finale se la piattaforma di scambio come offerente di Open Bidding è un intermediario. Questo valore viene ottenuto dall'acquirente di terze parti e deve essere trasmesso a Google inalterato nella risposta all'offerta.

Consigli

  • Attiva le connessioni HTTPS persistenti (note anche come "keep-alive" o "riutilizzo della connessione") sui tuoi server. Imposta il timeout su un valore minimo di 10 secondi; in molti casi è preferibile impostare valori più elevati. Google verifica questo aspetto durante i test di latenza iniziali della tua applicazione, perché Authorized Buyers invia richieste a una frequenza elevata e deve evitare l'overhead di latenza dovuto alla creazione di una connessione TCP separata per ogni richiesta.
  • Includi l'URL di monitoraggio delle impressioni facoltativo per monitorare quando viene eseguito il rendering dell'impressione anziché quando l'offerente vince. A causa della differenza tra vincite e rendering, questo produce statistiche di monitoraggio più accurate.

  • Assicurati che il codice dell'offerente non contenga dipendenze da campi ritirati, che possono causare errori nelle offerte.
  • Includi BidResponse.seatbid.bid.w e BidResponse.seatbid.bid.h nel tuo BidResponse. Una BidResponse per una richiesta che include più dimensioni dell'annuncio deve includere questi campi, altrimenti verrà esclusa dall'asta.
  • Limita le dimensioni della risposta a meno di 8 kB. Risposte molto grandi possono aumentare la latenza di rete e causare timeout.
  • Segui le linee guida per le offerte sull'inventario iOS che richiedono l'attribuzione SKAdNetwork.

Esempio di risposta all'offerta

I seguenti esempi rappresentano esempi leggibili delle richieste Protobuf e JSON.

OpenRTB Protobuf

OpenRTB JSON

Importante: i messaggi Protobuf mostrati negli esempi sono rappresentati qui come testo leggibile. Tuttavia, non è così che i messaggi vengono inviati in rete. Quando utilizzi il formato OpenRTB Protobuf, verranno accettati solo i messaggi BidResponse serializzati.

Puoi creare e serializzare un messaggio BidResponse utilizzando il seguente codice 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
}

Specifica la creatività

La risposta all'offerta specifica la creatività da pubblicare se l'offerta vince. L'offerta deve includere uno dei formati degli annunci supportati (AMP, video, nativi). In questo esempio, specifichiamo la creatività utilizzando il campo html_snippet.

In alternativa, puoi specificare la creatività utilizzando uno dei seguenti campi, in base al formato dell'annuncio:

  • Annuncio sottoposto a rendering dall'SDK
    • BidResponse.seatbid.bid.ext.sdk_rendered_ad
  • AMP
    • BidResponse.seatbid.bid.amp_ad_url
  • Video
    • BidResponse.seatbid.bid.adm
  • Nativo
    • BidResponse.seatbid.bid.adm_native

Specifica un annuncio ospitato sui tuoi server utilizzando uno snippet HTML nel campo BidResponse.seatbid.bid.adm. Lo snippet è racchiuso in un iFrame inserito nella pagina web, il che comporta il recupero e il rendering dell'annuncio quando la pagina viene caricata. Devi creare lo snippet HTML in modo che l'annuncio (banner o interstitial) venga visualizzato correttamente all'interno di un iFrame e con dimensioni appropriate per l'area annuncio per cui stai facendo un'offerta.

Inoltre, le dimensioni dell'annuncio dichiarate nella risposta all'offerta devono corrispondere esattamente a una delle combinazioni di dimensioni nella richiesta di offerta quando:

  • Un annuncio è un banner normale (non video, nativo o interstitial).
  • L'offerente ha dichiarato le dimensioni nella risposta all'offerta. La dichiarazione delle dimensioni è obbligatoria ogni volta che nella richiesta sono presenti più dimensioni.
  • Viene fatta un'eccezione per gli annunci interstitial. Per gli interstitial, la larghezza deve essere almeno il 50% della larghezza dello schermo e l'altezza almeno il 40% dell'altezza dello schermo.

Puoi specificare una creatività snippet HTML utilizzando qualsiasi codice HTML valido che venga visualizzato correttamente, ma tieni presente le limitazioni relative alla specifica del campo crid nella sezione Crea messaggio BidResponse. Un utilizzo di questa funzionalità consiste nell'inserire informazioni aggiuntive negli argomenti degli URL recuperati dai tuoi server nell'ambito del rendering dell'annuncio. In questo modo puoi trasmettere dati arbitrari sull'impressione ai tuoi server.

La maggior parte delle norme relative agli snippet HTML restituiti nelle risposte all'offerta è la stessa degli annunci di terze parti. Per saperne di più, consulta le Linee guida del programma Authorized Buyers, i Requisiti per la pubblicazione di annunci di terze parti e Dichiara gli URL di clickthrough negli annunci.

Utilizza URL di clickthrough coerenti

L'URL di clickthrough specificato nel campo BidResponse.seatbid.bid.ext.clickurl deve essere identico all'URL pagina di destinazione specificato nella creatività. Di seguito sono riportati alcuni esempi di creatività nei formati supportati coerenti con il campo clickurl impostato su 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>

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>

Nativo

{
  "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"
  ]
}

Specifica le macro

Le macro sono testi formattati incorporati in alcuni campi della risposta all'offerta contenenti URL che vengono sostituiti con un valore pertinente al momento della pubblicazione dell'annuncio. Ad esempio, se la tua offerta vincente includeva la macro AUCTION_PRICE nella creatività dello snippet HTML inclusa nell'offerta, la macro verrebbe sostituita con un valore che potresti decriptare per determinare l'importo pagato per l'impressione nell'asta.

Puoi includere macro nei seguenti campi:

  • BidResponse.seatbid.bid.adm

    Le macro sono supportate per i formati snippet HTML, nativo, URL video e XML VAST video.

  • BidResponse.seatbid.bid.adm_native.eventtrackers.url

  • BidResponse.seatbid.bid.adm_native.imptrackers

  • BidResponse.seatbid.bid.ext.amp_ad_url

    Per le creatività AMP sono supportate solo le macro WINNING_PRICE e WINNING_PRICE_ESC specifiche di Google.

  • BidResponse.seatbid.bid.burl

  • BidResponse.seatbid.bid.ext.impression_tracking_url

    Utilizza questo campo anziché BidResponse.seatbid.bid.burl se hai bisogno di più di un URL di fatturazione.

Ad esempio, puoi includere una macro come parte di uno snippet HTML incorporando ${MACRO} nell'URL utilizzato per recuperare la creatività, dove MACRO è una delle macro supportate descritte nella specifica OpenRTB.

Macro di Google

Google supporta macro aggiuntive oltre a quelle presenti nella specifica OpenRTB. Queste sono formattate in modo diverso e vengono visualizzate come %%MACRO%% se incorporate in un URL. La tabella seguente descrive queste macro:

Macro Descrizione
ADVERTISING_IDENTIFIER Consente agli acquirenti di ricevere l'IDFA di iOS o l'ID pubblicità di Android durante il rendering delle impressioni. Per informazioni dettagliate, consulta Decriptazione degli identificatori pubblicità.
CACHEBUSTER Rappresentazione come stringa di un numero intero casuale non firmato di 4 byte.
CLICK_URL_UNESC

URL di clic senza caratteri di escape dell'annuncio. Nello snippet, la macro deve essere seguita direttamente da una versione con caratteri di escape dell'URL di clic di terze parti.

Ad esempio, se l'URL di clic di terze parti è http://my.adserver.com/some/path/handleclick?click=clk, il seguente codice potrebbe essere utilizzato con la versione con caratteri di escape singoli dell'URL di clic di terze parti dopo la chiamata della macro:

<a href="%%CLICK_URL_UNESC%%http%3A%2F%2Fmy.adserver.com%2Fsome%2Fpath%2Fhandleclick%3Fclick%3Dclk"></a>

Al momento della pubblicazione dell'annuncio, questa macro viene espansa nel seguente modo:

<a href="http://google-click-url?...&ad_url=http%3A%2F%2Fmy.adserver.com%2Fsome%2Fpath%2Fhandleclick%3Fclick%3Dclk"></a>

L'URL registrerà prima il clic con Google, poi reindirizzerà all'URL di clic di terze parti.

CLICK_URL_ESC

URL di clic con caratteri di escape dell'annuncio. Da utilizzare al posto di CLICK_URL_UNESC se devi passare prima il valore tramite un altro server che restituisce un reindirizzamento.

Ad esempio, il seguente codice potrebbe essere utilizzato in uno snippet HTML:

<a href="http://my.adserver.com/click?google_click_url=%%CLICK_URL_ESC%%"></a>

Al momento della pubblicazione dell'annuncio, questa macro viene espansa nel seguente modo:

<a href="http://my.adserver.com/click?google_click_url=http://google-click- url%3F...%26ad_url%3D"></a>

In questo modo, il clic verrà registrato con my.adserver.com, che sarà poi responsabile del reindirizzamento all'URL passato nel parametro google_click_url. Questo presuppone che my.adserver.com esegua l'unescape del parametro google_click_url.

Puoi aggiungere un URL con doppio escape dopo %%CLICK_URL_ESC%%. Dopo la rimozione dei caratteri di escape da parte di my.adserver.com, rimane una versione con un singolo carattere di escape dell'URL aggiunto a google_click_url. Quando viene recuperato l'google_click_url, viene eseguito nuovamente l'unescape e poi il reindirizzamento.

CLICK_URL_ESC_ESC

L'URL con doppio escape dell'annuncio. Da utilizzare al posto di CLICK_URL_UNESC se devi passare prima il valore tramite un altro server che restituisce un reindirizzamento.

Ad esempio, il seguente codice potrebbe essere utilizzato in uno snippet HTML:

<a href="http://my.adserver.com/click?google_click_url=%%CLICK_URL_ESC_ESC%%"></a>

Al momento della pubblicazione dell'annuncio, questa macro viene espansa nel seguente modo:

<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 Espanso in http: se la richiesta di offerta non richiede SSL o in https: se la richiesta di offerta richiede SSL.
SITE Il dominio URL con caratteri di escape dell'URL di contenuti o l'ID anonimo per l'inventario anonimo.
SITE_URL Deprecato. Sostituita dalla macro SITE, che fornisce funzionalità identiche.
TZ_OFFSET La differenza di fuso orario.
VERIFICATION

I diversi valori per la produzione e per la scansione della creatività nella pipeline di verifica. Il formato è: %%?VERIFICATION:true-val:false-val%% dove è possibile utilizzare qualsiasi valore tranne le macro per true-val e false-val, incluse le stringhe vuote. Per Open Bidding, consigliamo alle piattaforme di scambio pubblicitario di utilizzare questa macro. Una volta fatto, le Demand-Side Platform non devono apportare modifiche.

Ad esempio, se una creatività dovesse includere %%?VERIFICATION:-1:5000%%, la sostituzione del testo sarebbe 5000 al momento della pubblicazione e -1 nella pipeline di verifica. Questo serve a distinguere tra questi due insiemi di ping.

WINNING_PRICE

Costo impressione codificato (CPI) in micro della valuta dell'account. Ad esempio, un CPM vincente di 5 $corrisponde a un CPM di 5.000.000 di micro, o un CPI di 5000 micro. In questo caso,il valore decodificato di WINNING_PRICE sarebbe 5000. Il prezzo vincente è specificato in CPI.

Per analizzare questa macro, dovrai implementare un'applicazione che decripti le conferme del prezzo. Per ulteriori informazioni, consulta la pagina Decriptazione delle conferme dei prezzi.

WINNING_PRICE_ESC WINNING_PRICE con URL in codifica escape.

Google richiede l'utilizzo della macro CLICK_URL_UNESC o CLICK_URL_ESC all'interno della creatività dell'annuncio pubblicato da terze parti. Google utilizza le macro CLICK_URL per il monitoraggio dei clic.

L'escaping degli URL nelle macro utilizza il seguente schema:

  • Il carattere di spazio viene sostituito da un segno più (+).
  • I caratteri alfanumerici (0-9, a-z, A-Z) e i caratteri del set !()*,-./:_~ rimangono invariati.
  • Tutti gli altri caratteri vengono sostituiti da %XX, dove XX è il numero esadecimale che rappresenta il carattere.

Limitazioni e requisiti per i publisher

La richiesta di offerta include informazioni sui tipi di limitazioni e requisiti che i publisher applicano alle creatività nell'asta.

  • BidRequest.bcat
    • Puoi confrontare le categorie bloccate specificate da questo campo con quelle rilevate per le creatività inviate utilizzando il campo detectedCategories dell'API Offerte in tempo reale.
  • BidRequest.imp.ext.allowed_vendor_type
  • BidRequest.imp.secure
    • In pratica, questo valore sarà sempre impostato su true perché Google richiede il supporto SSL per tutte le creatività.
  • 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

Non fare mai offerte con un annuncio contenente una funzionalità con limitazioni. Per le funzionalità consentite, come il tipo di fornitore, restituisci un annuncio solo se il tipo di fornitore è presente nell'elenco allowed_vendor_type in BidRequest. Nell'offerta devono essere inclusi solo i formati degli annunci specificati nella richiesta di offerta compilando campi come BidRequest.imp.banner. Per ulteriori dettagli, consulta i commenti per questi campi nella definizione del buffer di protocollo BidRequest.

Se un annuncio viene restituito in BidResponse, devi impostare con precisione i campi BidResponse.seatbid.bid.attr, BidResponse.seatbid.bid.cat e BidResponse.seatbid.bid.adomain o BidResponse.seatbid.bid.adm_native.link.url in BidResponse. Se un annuncio ha più valori applicabili per questi campi, devi includerli tutti. Per ulteriori dettagli, consulta i commenti relativi a questi campi nella definizione del buffer di protocollo BidResponse. Le risposte in cui questi campi non sono impostati vengono ignorate.

Open Measurement

Open Measurement ti consente di specificare fornitori di terze parti che offrono servizi di misurazione e verifica indipendenti per gli annunci pubblicati in ambienti di app mobile.

I formati degli annunci supportati sono video, banner e interstitial. Per saperne di più su come utilizzare Open Measurement in una risposta all'offerta contenente questi formati, consulta l'articolo del Centro assistenza SDK di misurazione Open Measurement.

Esempi di risposte all'offerta

Le sezioni seguenti mostrano esempi di risposte all'offerta per diversi tipi di annunci.

Banner app

OpenRTB Protobuf

OpenRTB JSON

Interstitial per app

OpenRTB Protobuf

OpenRTB JSON

Video interstitial per app

OpenRTB Protobuf

OpenRTB JSON

App nativa

OpenRTB Protobuf

OpenRTB JSON

Video sul Web

OpenRTB Protobuf

OpenRTB JSON

Banner per il web mobile per l'offerente della piattaforma di scambio

OpenRTB Protobuf

OpenRTB JSON