Mantieni tutto organizzato con le raccolte
Salva e classifica i contenuti in base alle tue preferenze.
Dopo aver elaborato la richiesta di offerta di Google, l'applicazione deve creare
e inviare una risposta. Questa guida spiega come codificare l'applicazione per creare la risposta.
Creare un messaggio Protobuf BidResponse
Authorized Buyers invia il BidRequest come corpo del messaggio di un POST HTTP. Se l'endpoint per le offerte è configurato per utilizzare il formato Protobuf, l'applicazione deve inviare una risposta con l'intestazione Content-Type impostata su application/octet-stream e un corpo del messaggio costituito da un buffer di protocollo serializzato. Il buffer del protocollo è un messaggio BidResponse come definito in openrtb.proto. La tua applicazione deve restituire un BidResponse analizzabile in 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.
Se non vuoi fare offerte per un'impressione, devi restituire una risposta HTTP 204 vuota. Puoi ottenere openrtb.proto dalla pagina
Dati di riferimento.
ID creatività
BidResponse specifica una creatività tramite il campo BidResponse.seatbid.bid.crid (limite di 64 byte). Anche le creatività simili devono avere valori univoci per questo campo se differiscono per caratteristiche notevoli, 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:
Aspetto o 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).
Durante la progettazione dell'applicazione, devi decidere un modo sistematico per generare identificatori che abbiano 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, 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 sulle creatività per una spiegazione su come ricevere un feedback sulle proprietà rilevate delle tue creatività.
Campi Open Bidding
Le risposte alle offerte inviate dagli offerenti di piattaforme di scambio e reti che partecipano a Open Bidding sono simili a quelle di 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 utilizzi alternativi. tra cui:
OpenRTB
Authorized Buyers
Dettagli
BidResponse.imp[].pmp.deals[].id
BidResponse.ad[].adslot[].exchange_deal_id
L'ID deal dello spazio dei nomi della piattaforma di scambio pubblicitario associato a questa offerta e registrato per i publisher.
Token utilizzato per identificare le informazioni dell'acquirente di terze parti finale se la piattaforma di scambio pubblicitario come offerente Open Bidding è un intermediario. Questo valore viene ottenuto dall'acquirente di terze parti e deve essere trasmesso a Google invariato nella risposta all'offerta.
Consigli
Attiva le connessioni HTTPS permanenti (note anche come "keep-alive" o "riutilizzo della connessione") sui tuoi server. Imposta il timeout su almeno 10 secondi. In molti casi, valori più elevati sono utili. Google lo verifica durante i test iniziali della latenza dell'applicazione, perché Authorized Buyers invia richieste a una frequenza elevata e deve evitare il sovraccarico di latenza dovuto all'instaurazione di una connessione TCP separata per ogni richiesta.
Includi l'URL di monitoraggio delle impressioni facoltativo per monitorare il momento in cui viene visualizzata l'impressione anziché quando l'offerente vince. A causa del calo tra le vittorie e i rendering, si ottengono statistiche di monitoraggio più accurate.
Mantieni il codice dell'offerente privo di dipendenze dai campi ritirati,
che possono causare errori di mancata esecuzione delle offerte.
Includi BidResponse.seatbid.bid.w e
BidResponse.seatbid.bid.h in BidResponse. Un
BidResponse per una richiesta che include più dimensioni degli annunci deve
includere questi campi, altrimenti verrà eliminato dall'asta.
Limita le dimensioni della risposta a meno di 8 KB. Risposte molto grandi possono aumentare la latenza della rete e causare timeout.
Importante:i messaggi Protobuf mostrati nei sample sono rappresentati qui come testo leggibile da una persona. Tuttavia, non è così che vengono inviati i messaggi tramite rete. Quando utilizzi il formato Protobuf di Google o OpenRTB, 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 la tua offerta è vincente. L'offerta deve includere uno dei formati degli annunci supportati (AMP, video, nativo). 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 visualizzato 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, in modo che l'annuncio venga recuperato e visualizzato al caricamento della pagina. Devi creare lo snippet HTML in modo che l'annuncio (banner o interstitial) venga visualizzato correttamente all'interno di un iframe e in dimensioni appropriate per l'area annuncio per cui fai offerte.
Inoltre, la dimensione dell'annuncio dichiarata nella risposta all'offerta deve 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 è presente più di una dimensione.
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 viene visualizzato correttamente, ma tieni presente le limitazioni relative alla specifica del campo crid nella sezione Creare il messaggio BidResponse.
Un utilizzo è inserire informazioni aggiuntive negli argomenti degli URL che vengono recuperati dai tuoi server durante il rendering dell'annuncio. In questo modo puoi ritrasmettere ai tuoi server dati arbitrari sull'impressione.
Le macro sono testo formattato incorporato 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à snippet HTML inclusa nell'offerta, la macro verrà sostituita con un valore che potrai decriptare per determinare l'importo che hai pagato per l'impressione nell'asta.
Puoi includere macro nei seguenti campi:
BidResponse.seatbid.bid.adm
Le macro sono supportate per i formati XML VAST, video, URL video e snippet HTML.
Utilizzalo al posto di BidResponse.seatbid.bid.burl se
hai bisogno di più di un URL di fatturazione.
Ad esempio, puoi includere una macro all'interno di uno snippet HTML incorporando ${MACRO} nell'URL utilizzato per recuperare la creatività, dove MACRO è una delle macro supportate descritte nella specifica OpenRTB.
Macro Google RTB
Google supporta macro aggiuntive oltre a quelle presenti nella specifica OpenRTB. Queste macro sono formattate in modo diverso e vengono visualizzate come%%MACRO%% se incorporate in un URL. La seguente tabella descrive queste macro:
Macro
Descrizione
ADVERTISING_IDENTIFIER
Consente agli acquirenti di ricevere l'ID pubblicità di iOS o Android al
momento del rendering delle impressioni.
Per maggiori dettagli, consulta Decriptare gli identificatori dell'inserzionista.
CACHEBUSTER
Una rappresentazione come stringa di un numero intero casuale non firmato di quattro byte.
CLICK_URL_UNESC
L'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 un solo carattere di escape
dell'URL di clic di terze parti dopo l'invocazione della macro:
L'URL registrerà prima il clic con Google, quindi reindirizzerà
all'URL di clic di terze parti.
CLICK_URL_ESC
L'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, in uno snippet HTML potrebbe essere utilizzato il seguente codice:
Il clic verrà registrato in my.adserver.com, che sarà responsabile del reindirizzamento all'URL passato nel parametro google_click_url. Si presume che
my.adserver.com elimini le escape dal parametro
google_click_url.
Puoi aggiungere un URL con doppia evocazione dopo
%%CLICK_URL_ESC%%. Dopo che my.adserver.com ha eseguito lo scollegamento, rimane una versione con un solo carattere di escape dell'URL aggiunto a google_click_url. Quando viene recuperato il valore google_click_url, viene eseguito un'altra volta lo scollegamento e poi il reindirizzamento.
CLICK_URL_ESC_ESC
L'URL con doppio carattere 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, in uno snippet HTML potrebbe essere utilizzato il seguente codice:
Espanso a http: se la richiesta di offerta non richiede SSL o a
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. Sostituito 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 per true-val e
false-val possono essere utilizzati qualsiasi valore
tranne le macro, incluse le stringhe vuote. Per Open Bidding, consigliamo alle piattaforme di scambio pubblicitario di utilizzare questa macro. In questo modo, le piattaforme di scambio pubblicitario lato domanda non devono apportare modifiche.
Ad esempio, se una creatività dovesse includere
%%?VERIFICATION:-1:5000%%, la sostituzione del testo
sarà 5000 nella pubblicazione e -1 nella
pipeline di verifica. Questo è utile per 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
decritta le conferme dei prezzi. Per ulteriori informazioni, consulta la pagina
Decriptazione delle conferme dei prezzi.
WINNING_PRICE_ESC
WINNING_PRICE con escape per URL.
Google richiede di utilizzare la macro CLICK_URL_UNESC o
CLICK_URL_ESC all'interno della creatività dell'annuncio di terze parti pubblicato. Google utilizza le macro CLICK_URL per il monitoraggio dei clic.
L'escape degli URL nelle macro utilizza lo schema seguente:
Il carattere di spazio viene sostituito da un segno più (+).
I caratteri alfanumerici (0-9, a-z, A-Z) e i caratteri dell'insieme !()*,-./:_~ 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 Real-time Bidding.
BidRequest.imp.ext.allowed_vendor_type
BidRequest.imp.secure
In pratica, questo valore sarà sempre impostato su true perché
Google richiede il supporto di 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. Solo i formati degli annunci specificati nella richiesta di offerta compilando campi comeBidRequest.imp.banner devono essere inclusi nell'offerta. Per ulteriori dettagli, consulta i commenti relativi a questi campi nella definizione del buffer del protocollo BidRequest.
Se in BidResponse viene restituito un annuncio, 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 includere tutti i valori. Per ulteriori dettagli, consulta i commenti relativi a questi campi nella definizione del buffer del protocollo BidResponse.
Le risposte per cui non sono impostati questi campi vengono ignorate.
Open Measurement
Open Measurement ti consente di specificare fornitori di terze parti che forniscono servizi di misurazione e verifica indipendenti per gli annunci pubblicati negli ambienti delle app mobile.
I formati degli annunci supportati includono annunci video, banner e interstitial. Per ulteriori informazioni su come utilizzare Open Measurement in una risposta all'offerta contenente questi formati, consulta l'articolo del Centro assistenza sull'SDK Open Measurement.
Risposte all'offerta di esempio
Le sezioni seguenti mostrano risposte di offerta di esempio per diversi tipi di annunci.
id:"96Z599PGNvp7Mr99138Fm0"seatbid{bid{id:"NQb32Ge7Rtt84wFn2p8"impid:"1"price:0.153584adid:"test_creative_id_272596"adomain:"google.com"crid:"test_creative_id_272596"cat:"IAB13-7"burl:"https://test.com/imp?id=123456"adm_native{ver:"1.2"assets{id:1required:truetitle{text:"Luxury Mars Cruises"}}assets{id:2required:truedata{value:"Visit the planet in a luxury spaceship."}}assets{id:3required:falsedata{value:"Book today"}}assets{id:4required:truedata{value:"Galactic Luxury Cruises"}}assets{id:5required:trueimg{url:"https://native.test.com/image?id=123456"w:1200h:627}}link{url:"https://www.google.com"}eventtrackers{event:IMPRESSIONmethod:IMGurl:"https://test.com/event?id=123456"}privacy:"https://adssettings.google.com/whythisad?source=display&reasons=OMITTED"}[com.google.doubleclick.bid]{ad_choices_destination_url:"https://test.com/preferences"billing_id:29846056590dsa{behalf:"TEST_ADVERTISER"paid:"TEST_PAYING_ENTITY"adrender:false}}}bid{id:"4vwb23qm6iqU6w6G978"impid:"1"price:0.153584adid:"test_creative_id_272596"adomain:"google.com"crid:"test_creative_id_272596"cat:"IAB21"burl:"https://test.com/imp?id=123456"adm_native{ver:"1.2"assets{id:1required:truetitle{text:"Luxury Mars Cruises"}}assets{id:2required:truedata{value:"Visit the planet in a luxury spaceship."}}assets{id:3required:falsedata{value:"Book today"}}assets{id:4required:truedata{value:"Galactic Luxury Cruises"}}assets{id:5required:trueimg{url:"https://native.test.com/image?id=123456"w:1200h:627}}link{url:"https://www.google.com"}eventtrackers{event:IMPRESSIONmethod:IMGurl:"https://test.com/event?id=123456"}privacy:"https://adssettings.google.com/whythisad?source=display&reasons=OMITTED"}[com.google.doubleclick.bid]{ad_choices_destination_url:"https://test.com/preferences"dsa{behalf:"TEST_ADVERTISER"paid:"TEST_PAYING_ENTITY"adrender:false}}}seat:"4528:1161:591635"group:false}bidid:"hgu4ev7j-ZK929XM0-79f7-0A23O0VN2CFC"cur:"USD"
JSON OpenRTB
Mostrami l'esempio
{"id":"96Z599PGNvp7Mr99138Fm0","seatbid":[{"bid":[{"id":"NQb32Ge7Rtt84wFn2p8","impid":"1","price":0.153584,"adid":"test_creative_id_272596","adomain":["google.com"],"crid":"test_creative_id_272596","cat":["IAB13-7"],"burl":"https://test.com/imp?id=123456","ext":{"ad_choices_destination_url":"https://test.com/preferences","billing_id":"29846056590","dsa":{"behalf":"TEST_ADVERTISER","paid":"TEST_PAYING_ENTITY","adrender":0}},"adm":"{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"text\":\"Luxury Mars Cruises\"}},{\"id\":2,\"required\":1,\"data\":{\"value\":\"Visit the planet in a luxury spaceship.\"}},{\"id\":3,\"required\":0,\"data\":{\"value\":\"Book today\"}},{\"id\":4,\"required\":1,\"data\":{\"value\":\"Galactic Luxury Cruises\"}},{\"id\":5,\"required\":1,\"img\":{\"url\":\"https://native.test.com/image?id=123456\",\"w\":1200,\"h\":627}}],\"link\":{\"url\":\"https://www.google.com\"},\"eventtrackers\":[{\"event\":1,\"method\":1,\"url\":\"https://test.com/event?id=123456\"}],\"privacy\":\"https://adssettings.google.com/whythisad?source=display&reasons=OMITTED\"}"},{"id":"4vwb23qm6iqU6w6G978","impid":"1","price":0.153584,"adid":"test_creative_id_272596","adomain":["google.com"],"crid":"test_creative_id_272596","cat":["IAB21"],"burl":"https://test.com/imp?id=123456","ext":{"ad_choices_destination_url":"https://test.com/preferences","dsa":{"behalf":"TEST_ADVERTISER","paid":"TEST_PAYING_ENTITY","adrender":0}},"adm":"{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"text\":\"Luxury Mars Cruises\"}},{\"id\":2,\"required\":1,\"data\":{\"value\":\"Visit the planet in a luxury spaceship.\"}},{\"id\":3,\"required\":0,\"data\":{\"value\":\"Book today\"}},{\"id\":4,\"required\":1,\"data\":{\"value\":\"Galactic Luxury Cruises\"}},{\"id\":5,\"required\":1,\"img\":{\"url\":\"https://native.test.com/image?id=123456\",\"w\":1200,\"h\":627}}],\"link\":{\"url\":\"https://www.google.com\"},\"eventtrackers\":[{\"event\":1,\"method\":1,\"url\":\"https://test.com/event?id=123456\"}],\"privacy\":\"https://adssettings.google.com/whythisad?source=display&reasons=OMITTED\"}"}],"seat":"4528:1161:591635","group":0}],"bidid":"hgu4ev7j-ZK929XM0-79f7-0A23O0VN2CFC","cur":"USD"}
ad{adslot{id:1max_cpm_micros:158000billing_id:41106584355deal_id:1}click_through_url:"google.com"attribute:70buyer_creative_id:"test_creative_id_251451"advertiser_name:"Google"native_ad{headline:"Luxury Mars Cruises"body:"Visit the planet in a luxury spaceship."call_to_action:"Book today"advertiser:"Galactic Luxury Cruises"image{url:"https://native.test.com/image?id=123456"width:1200height:222}app_icon{url:"https://native.test.com/icon?id=123456"width:512height:512}star_rating:4.300000190734863click_link_url:"https://www.google.com"}impression_tracking_url:"https://test.com/imp?id=123456"impression_tracking_url:"https://test.com/imp?id=123456"event_notification_token:"token"skadn{version:"4.0"network:"l6x39K4z"itunesitem:"731305960"sourceapp:"627009739"fidelities{fidelity_type:STOREKIT_RENDERED_ADSnonce:"9216faff-74a9-4b35-badc-66878c35f67c"timestamp:1728975919221signature:"b0USXkmg02Q3v6p301kYOHG36CCOWWdEo52RHRttB9t8PTNi79qL17E4D6h7UeUSuq479oTK13G2Ev34MJlU86C5vY1SMVw2"}fidelities{fidelity_type:VIEW_THROUGH_ADSnonce:"9216faff-74a9-4b35-badc-66878c35f67c"timestamp:1728975919221signature:"4Cf4NH6239z9f3wa8j6420Z7H0UISYxyxN5720444dkq6457I5FY0Jg8bk1xge2P8YgiDp74l2738136v2g1A8D50331IRm0"}source_identifier:1}click_tracking_urls:"https://google.com/rtb/click?imp_id=55d2112c-4947-4da5-bc37-b79ebf4577dd"advertised_app_id:"APP_ID_OMITTED"app_promotion_type:INSTALLS}processing_time_ms:63
[[["Facile da capire","easyToUnderstand","thumb-up"],["Il problema è stato risolto","solvedMyProblem","thumb-up"],["Altra","otherUp","thumb-up"]],[["Mancano le informazioni di cui ho bisogno","missingTheInformationINeed","thumb-down"],["Troppo complicato/troppi passaggi","tooComplicatedTooManySteps","thumb-down"],["Obsoleti","outOfDate","thumb-down"],["Problema di traduzione","translationIssue","thumb-down"],["Problema relativo a esempi/codice","samplesCodeIssue","thumb-down"],["Altra","otherDown","thumb-down"]],["Ultimo aggiornamento 2025-03-07 UTC."],[[["Bid responses must be serialized `BidResponse` protocol buffers with the `Content-Type` header set to `application/octet-stream` for Protobuf, and a parsable `BidResponse` is required for each `BidRequest`, while an empty HTTP 204 response signals no bid."],["Each creative needs a unique `crid` (creative ID) limited to 64 bytes, and this ID must be unique across creatives if there are differences in size, declared URL, attributes, vendor types, appearance, behavior, or rendering method."],["Ad characteristics should be declared using `BidResponse.seatbid.bid.apis`, `BidResponse.seatbid.bid.attr`, or `BidResponse.seatbid.bid.ext.attribute`, with specific values indicating VPAID, MRAID, SIZELESS, or PLAYABLE attributes, respectively, and additional attributes from `buyer-declarable-creative-attributes.txt`."],["Responses should remain under 8KB, utilize persistent HTTPS connections with at least a 10-second timeout, and employ `BidResponse.seatbid.bid.burl` or `BidResponse.seatbid.bid.ext.impression_tracking_url` for tracking impressions."],["The `BidResponse` must accurately set creative attributes (`BidResponse.seatbid.bid.attr`), categories (`BidResponse.seatbid.bid.cat`), and advertiser domain (`BidResponse.seatbid.bid.adomain`) or native ad link (`BidResponse.seatbid.bid.adm_native.link.url`), as responses lacking these are discarded."]]],["Applications must respond to each `BidRequest` with a parsable `BidResponse`, using Protobuf or an HTTP 204 for no bids. Creatives are identified by a unique `crid`. Ad attributes, such as VPAID and MRAID, are declared in specific fields. Utilize impression tracking URLs and avoid deprecated fields. Open Bidding bid responses are similar to Authorized Buyers. Ad sizes in the response must match the request. Macros are used in URLs. Publisher requirements are specified in the `BidRequest`. The response must accurately reflect these requirements and provide the accurate ad attributes and links.\n"]]