Une fois que votre application a traité la requête d'enchère de Google, elle doit créer et envoyer une réponse. Ce guide explique comment coder votre application pour créer la réponse.
Créer un message Protobuf BidResponse
Authorized Buyers envoie le BidRequest en tant que corps de message d'une POST HTTP. Si votre point de terminaison d'enchères est configuré pour utiliser le format Protobuf, votre application doit envoyer une réponse avec l'en-tête Content-Type défini sur application/octet-stream et un corps de message constitué d'un tampon de protocole sérialisé. Le tampon de protocole est un message BidResponse tel que défini dans openrtb.proto. Votre application doit renvoyer un BidResponse analysable en réponse à chaque BidRequest. Les délais d'inactivité et les réponses qui ne peuvent pas être analysées sont considérés comme des erreurs. Google limite les enchérisseurs dont les taux d'erreur sont élevés.
Si vous ne souhaitez pas définir d'enchère pour une impression, vous devez renvoyer une réponse HTTP 204 vide. Vous pouvez obtenir openrtb.proto sur la page Données de référence.
ID de la création
Votre BidResponse spécifie une création via le champ BidResponse.seatbid.bid.crid (limite de 64 octets). Même les créations similaires doivent avoir des valeurs uniques pour ce champ si elles diffèrent sur des caractéristiques notables, y compris, mais sans s'y limiter, la taille, l'URL déclarée, les attributs de la création et les types de fournisseurs. En d'autres termes, vous devez attribuer des ID de création différents à deux annonces qui:
avoir un look ou un comportement différents ;
Affichez le rendu sur différentes images.
Affichage par différents moyens (par exemple, une annonce se compose d'une image, tandis que l'autre est une vidéo).
Lorsque vous concevez votre application, vous devez choisir une méthode systématique de génération d'identifiants adaptée aux types de créations que vous prévoyez d'envoyer.
Attributs d'annonce
Google recommande de déclarer des attributs de création pour décrire les caractéristiques de votre annonce et son ciblage à l'aide d'une combinaison de BidResponse.seatbid.bid.apis et BidResponse.seatbid.bid.attr, ou de l'extension BidResponse.seatbid.bid.ext.attribute. Vous trouverez ci-dessous la description de la déclaration d'attributs:
VPAID
Définissez BidResponse.seatbid.bid.apis sur VPAID_1 ou VPAID_2. Pour le format JSON, vous pouvez définir cette valeur sur 1 ou 2, respectivement.
MRAID
Définissez BidResponse.seatbid.bid.apis sur MRAID_1 ou 3 pour le format JSON.
SIZELESS
Définissez BidResponse.seatbid.bid.attr sur RESPONSIVE ou 18 pour le format JSON.
PLAYABLE
Pour ce faire, définissez BidResponse.seatbid.bid.attr sur USER_INTERACTIVE ou 13 pour le format JSON.
Consultez la ressource sur les créations pour savoir comment obtenir des commentaires sur les propriétés détectées de vos créations.
Champs Open Bidding
Les réponses aux enchères envoyées par les enchérisseurs de place de marché et de réseau participant à Open Bidding sont similaires à celles d'Authorized Buyers participant aux enchères en temps réel standards. Les clients Open Bidding peuvent spécifier un petit nombre de champs supplémentaires, et certains champs existants peuvent avoir d'autres utilisations. En voici quelques-uns:
OpenRTB
Authorized Buyers
Détails
BidResponse.imp[].pmp.deals[].id
BidResponse.ad[].adslot[].exchange_deal_id
ID de l'accord de l'espace de noms de la place de marché associé à cette enchère et signalé aux éditeurs.
Jeton utilisé pour identifier les informations sur l'acheteur tiers final si la place de marché en tant qu'enchérisseur Open Bidding est un intermédiaire. Il est obtenu auprès de l'acheteur tiers et doit être transmis à Google tel quel dans la réponse à l'enchère.
Recommandations
Activez les connexions HTTPS persistantes (également appelées "keep-alive" ou "réutilisation de la connexion") sur vos serveurs. Définissez le délai avant expiration sur au moins 10 secondes. Des valeurs plus élevées sont bénéfiques dans de nombreux cas. Google vérifie cela lors des tests de latence initiaux de votre application, car Authorized Buyers envoie des requêtes à un débit élevé et doit éviter les coûts liés à la latence liés à l'établissement d'une connexion TCP distincte pour chaque requête.
Incluez l'URL de suivi des impressions facultative pour suivre le moment où l'impression s'affiche plutôt que le moment où l'enchérisseur remporte l'enchère. En raison de la baisse entre les victoires et les rendus, les statistiques de suivi sont plus précises.
Assurez-vous que votre code d'enchérisseur ne dépend pas de champs obsolètes, ce qui pourrait entraîner l'échec de vos enchères avec des erreurs.
Incluez BidResponse.seatbid.bid.w et BidResponse.seatbid.bid.h dans votre BidResponse. Une BidResponse pour une demande incluant plusieurs tailles d'annonces doit inclure ces champs, sinon elle sera supprimée de l'enchère.
Limitez la taille de votre réponse à moins de 8 ko. Des réponses très volumineuses peuvent augmenter la latence du réseau et entraîner des délais avant expiration.
Important:Les messages Protobuf représentés dans les exemples sont présentés ici sous forme de texte lisible par l'homme. Cependant, ce n'est pas ainsi que les messages sont envoyés sur le fil. Lorsque vous utilisez le format Google ou OpenRTB Protobuf, seuls les messages BidResponse sérialisés sont acceptés.
Vous pouvez créer et sérialiser un message BidResponse à l'aide du code C++ suivant:
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
}
Spécifier la création
Votre réponse à l'enchère spécifie la création à diffuser si votre enchère est gagnante. Votre enchère doit inclure l'un des formats d'annonces compatibles (AMP, vidéo, native). Dans cet exemple, nous spécifions la création à l'aide du champ html_snippet.
Vous pouvez également spécifier votre création à l'aide de l'un des champs suivants, en fonction du format de l'annonce:
Annonce affichée par le SDK
BidResponse.seatbid.bid.ext.sdk_rendered_ad
AMP
BidResponse.seatbid.bid.amp_ad_url
Vidéo
BidResponse.seatbid.bid.adm
Native
BidResponse.seatbid.bid.adm_native
Spécifiez une annonce hébergée sur votre ou vos serveurs à l'aide d'un extrait HTML dans le champ BidResponse.seatbid.bid.adm. L'extrait est inclus dans un iFrame inséré dans la page Web. L'annonce est ainsi récupérée et affichée lorsque la page est chargée. Vous devez créer l'extrait HTML de sorte que l'annonce (bannière ou interstitielle) s'affiche correctement dans un iFrame et à une taille appropriée pour l'emplacement publicitaire sur lequel vous enchérissez.
De plus, la taille de l'annonce déclarée dans la réponse à l'enchère doit correspondre exactement à l'une des combinaisons de tailles de la demande d'enchère lorsque:
L'annonce est une bannière standard (et non une vidéo, une annonce native ou un interstitiel).
L'enchérisseur a déclaré la taille dans la réponse à l'enchère. La déclaration de taille est obligatoire chaque fois qu'une demande comporte plusieurs tailles.
Une exception est faite pour les annonces interstitielles. Pour les interstitiels, la largeur doit être d'au moins 50% de la largeur de l'écran et la hauteur d'au moins 40% de sa hauteur.
Vous pouvez spécifier une création d'extrait de code HTML à l'aide de n'importe quel code HTML valide qui s'affiche correctement, mais gardez à l'esprit les restrictions concernant la spécification du champ crid dans la section Créer un message BidResponse.
Vous pouvez par exemple utiliser cette fonctionnalité pour ajouter des informations supplémentaires aux arguments des URL extraites de vos serveurs lors de l'affichage de l'annonce. Vous pouvez ainsi renvoyer des données arbitraires sur l'impression à vos propres serveurs.
Les macros sont du texte mis en forme intégré à certains champs de réponse aux enchères contenant des URL qui sont remplacées par une valeur pertinente au moment de la diffusion de l'annonce. Par exemple, si votre enchère gagnante incluait la macro AUCTION_PRICE dans la création d'extrait de code HTML incluse avec votre enchère, la macro serait remplacée par une valeur que vous pourriez déchiffrer pour déterminer le montant que vous avez payé pour l'impression lors de l'enchère.
Vous pouvez inclure des macros dans les champs suivants:
BidResponse.seatbid.bid.adm
Les macros sont acceptées pour les formats d'extrait de code HTML, natif, URL de vidéo et XML VAST vidéo.
Utilisez-le à la place de BidResponse.seatbid.bid.burl si vous avez besoin de plusieurs URL de facturation.
Par exemple, vous pouvez inclure une macro dans un extrait HTML en insérant ${MACRO} dans l'URL utilisée pour extraire la création, MACRO étant l'une des macros compatibles décrites dans la spécification OpenRTB.
Macros Google RTB
Google accepte des macros supplémentaires en plus de celles que vous trouverez dans la spécification OpenRTB. Elles sont mises en forme différemment et s'affichent sous la forme %%MACRO%% si elles sont intégrées à une URL. Le tableau suivant décrit ces macros:
Macro
Description
ADVERTISING_IDENTIFIER
Permet aux acheteurs de recevoir l'IDFA iOS ou l'identifiant publicitaire Android lors de l'affichage de l'impression.
Pour en savoir plus, consultez Décrypter les identifiants des annonceurs.
CACHEBUSTER
Représentation sous forme de chaîne d'un entier aléatoire non signé de quatre octets.
CLICK_URL_UNESC
URL de destination sans échappement de l'annonce. Dans l'extrait, une version échappée de l'URL de clic tierce doit suivre directement la macro.
Par exemple, si l'URL de suivi des clics tiers est http://my.adserver.com/some/path/handleclick?click=clk, le code suivant peut être utilisé avec la version à une seule échappée de l'URL de suivi des clics tiers après l'appel de la macro:
L'URL enregistre d'abord le clic auprès de Google, puis redirige vers l'URL de suivi des clics tiers.
CLICK_URL_ESC
URL de destination de l'annonce avec échappement. Utilisez cette macro à la place de CLICK_URL_UNESC si vous devez d'abord transférer la valeur via un autre serveur qui renverra la redirection.
Par exemple, le code suivant peut être utilisé dans un extrait HTML:
Le clic sera enregistré avec my.adserver.com, qui sera ensuite chargé de rediriger vers l'URL transmise dans le paramètre google_click_url. Cela suppose que my.adserver.com échappe le paramètre google_click_url.
Vous pouvez ajouter une URL à double échappement après %%CLICK_URL_ESC%%. Une fois l'échappement inverse effectué par my.adserver.com, une version de l'URL avec un seul échappement est ajoutée à google_click_url. Lorsque google_click_url est extrait, il est à nouveau dé-encodé, puis redirigé.
CLICK_URL_ESC_ESC
URL à double échappement de l'annonce. Utilisez cette macro à la place de CLICK_URL_UNESC si vous devez d'abord transférer la valeur via un autre serveur qui renverra la redirection.
Par exemple, le code suivant peut être utilisé dans un extrait HTML:
Développé en http: si la demande d'enchère ne nécessite pas de SSL ou en https: si elle nécessite de SSL.
SITE
Domaine avec séquence d'échappement dans l'URL de contenu ou ID anonyme pour l'inventaire anonyme.
SITE_URL
Obsolète. Remplacement par la macro SITE, qui offre une fonctionnalité identique.
TZ_OFFSET
Décalage de fuseau horaire.
VERIFICATION
Différentes valeurs pour la production et lorsque la création est analysée dans le pipeline de validation. Le format est le suivant : %%?VERIFICATION:true-val:false-val%%, où toutes les valeurs, à l'exception des macros, peuvent être utilisées pour true-val et false-val, y compris les chaînes vides. Pour Open Bidding, nous recommandons aux places de marché d'utiliser cette macro. Une fois qu'elles l'auront fait, les plates-formes côté demande n'auront pas besoin d'apporter de modifications.
Par exemple, si une création devait inclure %%?VERIFICATION:-1:5000%%, le remplacement de texte serait 5000 lors de la diffusion et -1 dans le pipeline de validation. Cela permet de différencier ces deux ensembles de pings.
WINNING_PRICE
Le coût de l'impression codée (CPI plutôt que CPM) en micro-unités de la devise du compte. Par exemple, une enchère au CPM gagnante d'un montant de 5 USD équivaut à 5 000 000 micro-unités de CPM, soit 5 000 micro-unités de CPI. La valeur décodée de WINNING_PRICE serait dans ce cas de 5 000.
Le prix gagnant est exprimé en CPI.
Pour analyser cette macro, vous devrez implémenter une application qui déchiffre les confirmations de prix. Pour en savoir plus, consultez la page Décrypter les confirmations de prix.
WINNING_PRICE_ESC
WINNING_PRICE encodée en URL.
Google vous demande d'utiliser la macro CLICK_URL_UNESC ou CLICK_URL_ESC dans la création de l'annonce diffusée par un tiers. Google utilise les macros CLICK_URL pour le suivi des clics.
L'échappement d'URL dans les macros utilise le schéma suivant:
Le caractère espace est remplacé par un signe plus (+).
Les caractères alphanumériques (0-9, a-z, A-Z) et les caractères de l'ensemble !()*,-./:_~ restent inchangés.
Tous les autres caractères sont remplacés par %XX, où XX est le nombre hexadécimal représentant le caractère.
Restrictions et exigences applicables aux éditeurs
La demande d'enchère inclut des informations sur les types de restrictions et d'exigences que les éditeurs imposent aux créations lors de l'enchère.
BidRequest.bcat
Vous pouvez comparer les catégories bloquées spécifiées par ce champ à celles détectées pour vos créations envoyées à l'aide du champ detectedCategories de l'API Real-time Bidding.
BidRequest.imp.ext.allowed_vendor_type
BidRequest.imp.secure
En pratique, cette valeur est toujours définie sur true, car Google exige la prise en charge de SSL pour toutes les créations.
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
N'enchérissez jamais avec une annonce contenant une fonctionnalité soumise à restriction. Pour les fonctionnalités autorisées telles que le type de fournisseur, ne renvoyez une annonce que si son type de fournisseur figure dans la liste allowed_vendor_type de BidRequest. Seuls les formats d'annonces spécifiés dans la demande d'enchères en remplissant des champs tels que BidRequest.imp.banner doivent être inclus dans votre enchère. Pour en savoir plus, consultez les commentaires de ces champs dans la définition du protocole BidRequest.
Si une annonce est renvoyée dans BidResponse, vous devez définir avec précision les champs BidResponse.seatbid.bid.attr, BidResponse.seatbid.bid.cat et BidResponse.seatbid.bid.adomain ou BidResponse.seatbid.bid.adm_native.link.url dans BidResponse. Si une annonce comporte plusieurs valeurs applicables pour ces champs, vous devez inclure toutes les valeurs. Pour en savoir plus, consultez les commentaires de ces champs dans la définition du tampon de protocole BidResponse.
Les réponses pour lesquelles ces champs ne sont pas définis sont supprimées.
Open Measurement
Open Measurement vous permet de spécifier des fournisseurs tiers qui fournissent des services de mesure et de validation indépendants pour les annonces diffusées dans les environnements d'applications mobiles.
Les formats d'annonces compatibles incluent les annonces vidéo, les bannières et les interstitiels. Pour en savoir plus sur l'utilisation d'Open Measurement dans une réponse d'enchère contenant ces formats, consultez l'article du Centre d'aide sur le SDK Open Measurement.
Exemples de réponses aux enchères
Les sections suivantes présentent des exemples de réponses aux enchères pour différents types d'annonces.
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"
OpenRTB JSON
Afficher l'exemple
{"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
Sauf indication contraire, le contenu de cette page est régi par une licence Creative Commons Attribution 4.0, et les échantillons de code sont régis par une licence Apache 2.0. Pour en savoir plus, consultez les Règles du site Google Developers. Java est une marque déposée d'Oracle et/ou de ses sociétés affiliées.
Dernière mise à jour le 2025/03/07 (UTC).
[null,null,["Dernière mise à jour le 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"]]