Intégrer B&A en tant qu'acheteur

Les services d'enchères et de mise aux enchères (B&A) sont un ensemble de services destinés aux acheteurs et aux vendeurs d'annonces. Ils s'exécutent dans un environnement d'exécution sécurisé (TEE) pour faciliter les enchères Protected Audience (PA). Ce guide du développeur explique comment un acheteur peut s'intégrer à une enchère B&A PA pour Chrome.

Présentation

Pour participer à une enchère Protected Audience avec B&A Services, l'acheteur met à jour le groupe d'intérêt (GI) afin d'optimiser la charge utile pour améliorer la latence des enchères.

L'acheteur exige les tâches d'optimisation de la charge utile suivantes :

Groupe d'intérêt pour la publicité et l'analyse

Voici un exemple de configuration de groupe d'intérêt pour une enchère B&A PA avec optimisation de la charge utile appliquée :

navigator.joinAdInterestGroup({
  name: 'example-ig',
  owner: 'https://dsp.example',

  // An ID is mapped to each render URL
  ads: [
    {
      renderURL: 'https://dsp.example/ad.html',
      adRenderId: '12345678' // 12 characters max,
      buyerReportingId: 'brid123', // Optional
      buyerAndSellerReportingId: 'bsrid123', // Optional
      selectableBuyerAndSellerReportingId: ['sbsrid123', 'sbsrid456'], // Optional
    },
  ],
  adComponents: [
    {
      renderURL: 'https://dsp.example/ad-component.html',
      adRenderId: 'abcdefgh'
    },
  ],

  // Flags are set to omit data in the B&A auction payload
  auctionServerRequestFlags: ['omit-ads', 'omit-user-bidding-signals'],

  // Data not included in the B&A auction payload can be fetched as trusted signals
  // The following is an example of how the keys could look, but the actual
  // implementation is up to the ad tech
  trustedBiddingSignalsKeys: [
    'exampleUserBiddingSignalsKey',
    'exampleAdRenderIdKey',
    'exampleAdMetadataKey',
    'exampleAdReportingIdKey',
  ],

  // Optionally, interest groups can be prioritized
  priority: 0.0,
});

Voici les différences entre les configurations des groupes d'intérêt B&A et sur l'appareil :

Fields B&A IG IG sur l'appareil Inclus dans la charge utile des enchères B&A
auctionServerRequestFlags Occasion Non utilisées Non
userBiddingSignals Non recommandé Occasion Non, si l'option omit-user-bidding-signals est définie
adRenderId dans ads et adComponents Occasion Non utilisées Si l'option omit-ads est définie, adRenderId dans ads n'est disponible que dans browserSignals.prevWins de la charge utile. adRenderId défini dans adComponents n'est pas inclus dans la charge utile.

Si l'indicateur omit-ads n'est pas défini, il est disponible dans browserSignals.prevWins, interestGroup.adRenderIds et interestGroup.adComponentRenderIds.

renderURL dans ads et adComponents Occasion Occasion Non
metadata dans ads et adComponents Non utilisées Occasion Non
ID de création de rapports dans ads Occasion Occasion Non
  • Le champ auctionServerRequestFlags permet de définir des indicateurs qui indiquent au navigateur d'omettre certaines données dans la charge utile des enchères B&A.
  • La valeur userBiddingSignals peut être définie dans le groupe d'intérêt, mais il est recommandé de l'omettre en utilisant l'indicateur omit-user-bidding-signals. Les signaux omis peuvent être fournis à l'aide du service K/V.
  • Le champ adRenderId est défini avec le renderURL associé, mais seul le adRenderId fera partie de la charge utile de l'enchère B&A. L'URL de rendu renvoyée par generateBid() ultérieurement pendant la période d'enchères doit correspondre à l'URL de rendu définie dans le groupe d'insertion.
  • Les ID de rapport sont définis dans le guide d'intégration des enchères et mises aux enchères, mais ne sont pas inclus dans la charge utile des enchères et mises aux enchères. L'ID de rapport renvoyé par generateBid() plus tard pendant l'enchère doit correspondre à l'URL de rendu définie dans le groupe d'intérêt.
  • Les ID de ad.metadata et de rapports ne sont pas inclus dans la charge utile des enchères B&A. Ces données sont disponibles via l'utilisation du service de clés/valeurs approuvé.

Notez que les renderURL et les ID de rapport dans ads sont toujours définis dans la configuration du groupe d'intérêt, mais qu'ils ne sont pas inclus dans la charge utile de la demande d'enchères, car le navigateur vérifie que l'URL de rendu et les ID de rapport renvoyés par la fonction generateBid() du service d'enchères correspondent aux valeurs définies dans le groupe d'intérêt.

joinAdInterestGroup() tâches

Les tâches suivantes doivent être effectuées pour l'appel joinAdInterestGroup().

Définir les indicateurs de requête de serveur

Le champ auctionServerRequestFlags de la configuration joinAdInterestGroup() accepte les indicateurs suivants :

Option Description
omit-user-bidding-signals L'indicateur omit-user-bidding-signals omet l'objet userBiddingSignals dans la charge utile de l'enchère.

Si l'indicateur n'est pas défini, la valeur userBiddingSignals définie dans le groupe d'intérêt sera disponible dans generateBid() du service d'enchères.

omit-ads L'indicateur omit-ads indique au navigateur d'omettre les objets ads et adComponents dans la charge utile de l'enchère.

Le adRenderId sera disponible dans la propriété prevWins de browserSignals.

Si l'indicateur n'est pas défini, les champs adRenderIds et adComponentRenderIds de l'argument interestGroup de generateBid() contiendront les ID de rendu d'annonce correspondants.

Nous recommandons vivement aux acheteurs d'opter pour le signalement omit-ads. À l'avenir, la transmission des ID de rendu et des ID de rendu des composants d'annonce depuis le client pourra être abandonnée pour optimiser davantage la charge utile.

Les données omises sont gérées en mettant à disposition les informations pertinentes dans trustedBiddingSignals. Les indicateurs peuvent être utilisés individuellement et ne doivent pas nécessairement être utilisés ensemble.

Exemple d'utilisation :

navigator.joinAdInterestGroup({
  auctionServerRequestFlags: ['omit-user-bidding-signals', 'omit-ads'],
});

Définir des ID de rendu d'annonces

Pour réduire la taille de la charge utile des enchères B&A, les objets ads et adComponents du groupe d'intérêt sont omis. Par conséquent, ces objets ne sont pas disponibles dans la fonction generateBid() exécutée dans le service d'enchères.

Pour gérer les informations manquantes sur les annonces, l'acheteur conserve un identifiant (adRenderId et adComponentRenderId) associé à chaque annonce dans la configuration du groupe d'intérêt. L'identifiant doit être une DOMString de 12 octets maximum. Si l'identifiant est encodé en Base64, sa longueur ne doit pas dépasser 12 octets.

Exemple de groupe d'intérêt avec des ID de rendu d'annonces :

navigator.joinAdInterestGroup({
  ads: [
    {
      renderURL: 'https://dsp.example/ad.html',
      adRenderId: '12345678' // 12 characters max
    },
  ],
  adComponents: [
    {
      renderURL: 'https://dsp.example/ad-component.html',
      adComponentRenderId: 'abcdefgh'
    },
  ],
});

Les adRenderId associés aux annonces seront disponibles dans prevWins.browserSignals en generateBid().

Bien que renderURL ne soit pas inclus dans la charge utile de la requête, l'URL de rendu renvoyée par generateBid() doit correspondre à l'URL de rendu définie dans la configuration du groupe d'intérêt. Les technologies publicitaires peuvent renvoyer des métadonnées d'annonce et d'autres informations dans trustedBiddingSignals, afin que l'URL de rendu de l'annonce et l'URL de rendu du composant d'annonce puissent être générées pour l'enchère lors de l'exécution de generateBid().

Définir les priorités des groupes d'intérêt

Chrome permet aux acheteurs de définir la priorité des groupes d'intérêt. Si la limite de taille de la charge utile par acheteur définie par le vendeur est atteinte, les valeurs de priorité des groupes d'intérêt sont utilisées pour supprimer les groupes d'intérêt de priorité inférieure pour un seul acheteur lorsque la charge utile des enchères B&A est générée pour le vendeur. Pour sélectionner des groupes d'intérêt entre différents acheteurs, le navigateur prend sa décision en fonction de la taille de la charge utile sérialisée. Par défaut, chaque acheteur reçoit une taille égale. Notez que la hiérarchisation réelle a lieu sur les serveurs B&A, et non lorsque la charge utile de la requête est générée.

La priorité est calculée au moment de l'enchère à l'aide des vecteurs de priorité de l'acheteur (priorityVector) et des signaux de priorité du vendeur (prioritySignals). L'acheteur peut remplacer les signaux de priorité du vendeur.

Propriété Description
Vecteur de priorité L'acheteur fournit les vecteurs comme valeur de la clé priorityVector du service clés/valeurs.
Signaux prioritaires Le vendeur fournit les signaux en définissant priority_signals dans la configuration des enchères.
Remplacements des signaux prioritaires L'acheteur fournit le remplacement dans le champ priority_signals_overrides de PerBuyerConfig dans la configuration des enchères.

Pendant l'enchère, le navigateur calcule le produit scalaire creux des clés correspondantes dans priorityVector et prioritySignals pour la priorité. Dans le schéma suivant, la priorité est calculée par (4 * 2) + (3 * -1), qui est réduit à 8 + -3. La priorité de ce groupe d'intérêt au moment de l'enchère est donc de 5.

Chaque clé des objets "vecteur de priorité" et "signaux de priorité" est multipliée par l'autre, puis les résultats sont additionnés pour calculer la priorité.
Figure 1 : Calcul de la priorité à l'aide des vecteurs de l'acheteur et des signaux du vendeur

Des signaux supplémentaires peuvent également être utilisés pour établir des priorités dans B&A :

Signal Description
deviceSignals.one La valeur est toujours égale à 1. Elle est utile pour ajouter une constante au produit scalaire.
deviceSignals.ageInMinutes La valeur décrit l'âge du groupe d'intérêt (le temps écoulé depuis la dernière association à un groupe d'intérêt) en minutes sous la forme d'un entier compris entre 0 et 43 200.
deviceSignals.ageInMinutesMax60 La valeur décrit la même chose que le signal ageInMinutes, mais est plafonnée à 60. Si le groupe a plus d'une heure, la valeur 60 est renvoyée.
deviceSignals.ageInHoursMax24 La valeur décrit l'âge du groupe d'intérêt en heures, avec une limite de 24 heures. Si le groupe a plus d'un jour, la valeur 24 est renvoyée.
deviceSignals.ageInDaysMax30 La valeur décrit l'âge du groupe d'intérêt en jours, avec un maximum de 30 jours. Si le groupe a plus de 30 jours, la valeur renvoyée est 30.

Pour en savoir plus, consultez l'explication sur GitHub.

Configurer des signaux d'enchères de confiance

Étant donné que certaines données seront omises du payload d'enchères B&A, vous pouvez utiliser le service de clés/valeurs pour fournir les données omises en tant que signaux d'enchères fiables à la fonction generateBid().

Le service K/V peut fournir les données omises suivantes :

  • userBiddingSignals si utilisé par l'acheteur
  • metadata associés à chaque annonce
  • adRenderId associés à chaque annonce
  • ID de création de rapports
Les données omises du groupe d'intérêt peuvent être envoyées au serveur de collecte de l'acheteur. Le serveur de collecte envoie les données au service clé/valeur, et le navigateur les charge ultérieurement à partir de ce service.
Figure 2 : Exemple de configuration des signaux fiables

Une approche possible consiste à inclure un identifiant unique dans les clés des signaux d'enchères de confiance, puis à envoyer les données associées à votre serveur afin qu'elles puissent être chargées dans le service de clé/valeur. Toutefois, l'implémentation réelle dépend de l'ad tech, et l'API n'est pas prescriptive.

L'exemple suivant décrit une approche qui peut être mise en œuvre :

const ad1RenderURL = 'https://dsp.example/ad-1.html';
const ad2RenderURL = 'https://dsp.example/ad-2.html';
const ad1RenderId = 'render-id-1';
const ad2RenderId = 'render-id-2';
const ad1ReportingId = 'reporting-id-1';
const ad2ReportingId = 'reporting-id-2';

// Generate a unique identifier
const id = crypto.randomUUID();

// Define the keys with the unique ID
const trustedSignalsKeyForIG = `interest-group-${id}`

// Set the keys in the interest group
navigator.joinAdInterestGroup({
  // …
  ads: [
    {
      renderURL: ad1RenderURL,
      adRenderId: ad1RenderId,
      buyerReportingId: ad1ReportingId
    },
    {
      renderURL: ad2RenderURL,
      adRenderId: ad2RenderId,
      buyerReportingId: ad2ReportingId
    },
  ],
  trustedBiddingSignalsKeys: [
    trustedSignalsKeyForIG
  ]
});

// Send the associated data to your server to be loaded into the Key/Value Service
fetch('https://dsp.example/kv/load', {
  method: 'POST',
  body: JSON.stringify({
    id,
    [trustedSignalsKeyForIG]: {
      userBiddingSignals: {
        favoriteColor: 'blue'
      },
      ads: [
        {
          renderURL: ad1RenderURL,
          adRenderId: ad1RenderId,
          buyerReportingId: ad1ReportingId,
          metadata: {
            color: 'red'
          }   
        },
        {
          renderURL: ad2RenderURL,
          adRenderId: ad2RenderId,
          buyerReportingId: ad2ReportingId,
          metadata: {
            color: 'blue'
          }   
        },
      ]
    }
  })
});

Dans l'exemple, un identifiant unique est défini pour un groupe d'intérêt et fait partie de la clé des signaux fiables. La clé de l'IG et ses valeurs associées sont envoyées à votre serveur pour être chargées dans le service de clé/valeur. Plus tard, pendant l'enchère, le navigateur récupère les signaux fiables et les met à disposition dans la fonction generateBid() de l'acheteur.

Renvoyer le signal de mise à jour du groupe d'intérêt depuis K/V si nécessaire

La clé updateIfOlderThanMs pour les signaux fiables est utilisée pour mettre à jour le groupe d'intérêt plus tôt que l'intervalle quotidien habituel. Si le groupe d'intérêt n'a pas été rejoint ni mis à jour pendant une durée supérieure à la valeur en millisecondes renvoyée pour la clé updateIfOlderThanMs, il sera mis à jour avec le mécanisme updateURL. Notez que Chrome ne met pas à jour les groupes d'intérêt plus d'une fois toutes les 10 minutes.

Si l'enchère B&A renvoie une annonce gagnante qui ne correspond pas à l'une des annonces définies dans le groupe d'intérêt stocké dans le navigateur, l'enchère échouera. Le mécanisme updateIfOlderThanMs peut être utile pour s'assurer que le navigateur et l'enchère B&A s'accordent sur l'ensemble des annonces du groupe d'intérêt.

Pour en savoir plus, consultez l'explication.

generateBid() tâches

Les tâches suivantes doivent être effectuées pour l'appel generateBid().

Lire les signaux du navigateur

L'objet browserSignals transmis à l'appel generateBid() de B&A ressemble à ce qui suit :

{
  topWindowHostname: 'advertiser.example',
  seller: 'https://ssp.example',
  topLevelSeller: 'https://ssp-top.example',
  joinCount: 5,
  bidCount: 24,
  recency: 1684134092,

  // prevWins is [timeInSeconds, adRenderId]
  prevWins: [
    [9342, 'render-id-1'],
    [1314521, 'render-id-2']
  ],

  // Compiled WebAssembly code
  wasmHelper: WebAssembly.Module

  // Data-Version value from K/V response, if available
  dataVersion: 1,
}

Les propriétés modifiées ou nouvelles suivantes sont disponibles dans browserSignals :

Propriété Description
prevWins prevWins est un tableau de tuples de temps et d'annonces. La durée représente le nombre de secondes écoulées depuis la dernière victoire de l'annonce associée au cours des 30 derniers jours.

Il a été modifié pour fournir adRenderId au lieu de l'objet ad.

wasmHelper Objet compilé du code fourni par biddingWasmHelperURL.
dataVersion Un serveur de confiance peut éventuellement inclure un en-tête de réponse numérique Data-Version qui devient disponible dans generateBid().

Pour en savoir plus, consultez l'explication sur GitHub.

Renvoyer l'URL de rendu à partir de generateBid()

Étant donné que l'objet ads est omis dans la charge utile de l'enchère B&A, l'URL de rendu renvoyée par generateBid() doit être recréée. La façon dont l'URL de rendu est recréée dépend de votre implémentation. L'URL renvoyée doit correspondre à l'URL de rendu définie dans le groupe d'intérêt.

Une approche possible consiste à conserver une URL de base et à remplir le modèle avec les informations de interestGroup et trustedBiddingSignals.

Dans cet exemple, nous définissons quatre annonces en fonction de la couleur et du produit :

await navigator.joinAdInterestGroup({
  ads: [
    { renderURL: 'https://dsp.example/red-shirt-ad.html', adRenderId: 'arid1'},
    { renderURL: 'https://dsp.example/blue-shirt-ad.html', adRenderId: 'arid2'},
    { renderURL: 'https://dsp.example/red-pants-ad.html', adRenderId: 'arid3'},
    { renderURL: 'https://dsp.example/blue-pants-ad.html', adRenderId: 'arid4'},
  ],
  trustedBiddingSignalKeys: [
    'userBiddingSignals-someUniqueId',
    // ...and more
  ]
})

Nous envoyons ensuite la couleur préférée de l'utilisateur et les informations sur le produit à charger dans le service clé/valeur :

fetch('https://dsp.example/kv/load', {
  body: JSON.stringify({
    'userBiddingSignals-someUniqueId': {
      favoriteColor: 'blue',
      favoriteProduct: 'shirt'
    }
  })
})

Plus tard, lorsque l'enchère est exécutée, les signaux d'enchères fiables deviennent disponibles dans generateBid(). Ces informations peuvent être utilisées pour reconstruire l'URL :

function generateBid(..., trustedBiddingSignals, browserSignals) {
  const { userBiddingSignals } = trustedBiddingSignals
  const { favoriteColor, favoriteProduct } = userBiddingSignals

  return {
    bid: 1,
    render: `https://dsp.example/${favoriteColor}-${favoriteProduct}-ad.html`
  }
}

Renvoyer les ID de rapport à partir de generateBid()

Étant donné que les ID de rapport ne sont pas inclus dans la charge utile des enchères B&A, l'ID devient disponible pour generateBid() via des signaux d'enchères fiables. Une fois l'ID de reporting à utiliser déterminé, l'ID de reporting choisi est renvoyé à partir de generateBid(). Les ID renvoyés doivent correspondre à ceux définis dans le groupe d'intérêt.

Dans cet exemple, l'annonce 1 est sélectionnée et son ID de rendu associé est renvoyé à partir de generateBid() :

generateBid(..., trustedBiddingSignals, ) {
  const { ad1ReportingId, ad2reportingId } = trustedBiddingSignals;
  // ...
  return {
    bid: 1,
    render: 'https://dsp.example/ad-1.html'
    buyerReportingId: ad1reportingId
  }
}

L'ID de rapport renvoyé devient disponible dans reportWin() via buyerReportingSignals :

reportWin(..., buyerReportingSignals) {
  const { buyerReportingId } = buyerReportingSignals;
}

Si buyerReportingId n'est pas renvoyé par generateBid(), la valeur interestGroupName est disponible dans buyerReportingSignals au lieu de buyerReportingId.

Pour en savoir plus, consultez le guide sur les ID de rapport.

Étapes suivantes

Les ressources suivantes sont à votre disposition :

En savoir plus

Vous avez des questions ?