Integrar com a B&A como comprador

Os serviços de lances e leilões (B&A) são um conjunto de serviços para compradores e vendedores de anúncios que são executados em um ambiente de execução confiável (TEE) para facilitar um leilão da Protected Audience (PA). Este guia para desenvolvedores explica como um comprador pode fazer a integração com um leilão de PA da B&A para Chrome.

Visão geral

Para participar de um leilão da Protected Audience com os serviços de B&A, o comprador atualiza o grupo de interesse (GI) para otimizar o payload e melhorar a latência do leilão.

As seguintes tarefas de otimização de payload são necessárias para o comprador:

Grupo de interesse para B&A

Confira a seguir um exemplo de configuração de grupo de interesse para um leilão de PA de B&A com otimização de payload aplicada:

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,
});

As diferenças entre as configurações de grupo de interesse no dispositivo e de B&A são:

Campos B&A IG IG no dispositivo Incluído na carga útil do leilão de B&A
auctionServerRequestFlags Usado Não utilizado Não
userBiddingSignals Não recomendado Usado Não, se a flag omit-user-bidding-signals estiver definida
adRenderId em ads e adComponents Usado Não utilizado Se a flag omit-ads estiver definida, adRenderId em ads estará disponível apenas em browserSignals.prevWins da carga útil. O adRenderId definido em adComponents não está incluído no payload.

Se a flag omit-ads não estiver definida, disponível em browserSignals.prevWins, interestGroup.adRenderIds e interestGroup.adComponentRenderIds.

renderURL em ads e adComponents Usado Usado Não
metadata em ads e adComponents Não utilizado Usado Não
Códigos de relatórios no ads Usado Usado Não
  • O campo auctionServerRequestFlags permite definir flags que informam ao navegador para omitir alguns dados na carga útil do leilão de B&A.
  • O valor userBiddingSignals pode ser definido no grupo de interesse, mas é recomendável omiti-los usando a flag omit-user-bidding-signals. Os indicadores omitidos podem ser fornecidos usando o serviço K/V.
  • O campo adRenderId é definido com o renderURL associado, mas apenas o adRenderId fará parte do payload do leilão de B&A. O URL de renderização retornado de generateBid() mais tarde durante o leilão precisa corresponder ao URL de renderização definido no IG.
  • Os IDs de relatórios são definidos no IG do B&A, mas não estão incluídos na carga útil do leilão do B&A. O ID de relatórios retornado de generateBid() mais tarde durante o tempo do leilão precisa corresponder ao URL de renderização definido no IG.
  • Os IDs de relatório e ad.metadata não estão incluídos na carga útil do leilão da B&A. Em vez disso, esses dados ficam disponíveis com o uso do Serviço de chave-valor confiável.

Os renderURLs e os IDs de relatórios em ads ainda são definidos na configuração do grupo de interesse, mas não são incluídos na carga útil da solicitação de leilão. Isso acontece porque o navegador verifica se o URL de renderização e os IDs de relatórios retornados da função generateBid() do serviço de lances correspondem aos valores definidos no grupo de interesse.

joinAdInterestGroup() tarefas

As seguintes tarefas precisam ser realizadas para a chamada joinAdInterestGroup().

Definir flags de solicitação do servidor

O campo auctionServerRequestFlags da configuração joinAdInterestGroup() aceita as seguintes flags:

Sinalização Descrição
omit-user-bidding-signals A flag omit-user-bidding-signals omite o objeto userBiddingSignals no payload do leilão.

Se a flag não estiver definida, o valor userBiddingSignals definido no grupo de interesse vai ficar disponível em generateBid() do serviço de lances.

omit-ads A flag omit-ads informa ao navegador para omitir os objetos ads e adComponents no payload do leilão.

O adRenderId vai estar disponível na propriedade prevWins de browserSignals.

Se a flag não estiver definida, os campos adRenderIds e adComponentRenderIds no argumento interestGroup de generateBid() vão conter os IDs de renderização de anúncio correspondentes.

É altamente recomendável que os compradores escolham a flag omit-ads. Em algum momento no futuro, a transmissão de IDs de renderização e IDs de renderização de componentes de anúncio do cliente poderá ser descontinuada para otimizar ainda mais a carga útil.

Os dados omitidos são tratados disponibilizando informações relevantes em trustedBiddingSignals. Elas podem ser usadas individualmente ou juntas.

Exemplo de uso:

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

Definir IDs de renderização de anúncios

Para reduzir o tamanho da carga útil do leilão de B&A, os objetos ads e adComponents do grupo de interesse são omitidos. Assim, esses objetos não ficam disponíveis na função generateBid() em execução no serviço de lances.

Para lidar com as informações de anúncio ausentes, o comprador mantém um identificador (adRenderId e adComponentRenderId) associado a cada anúncio na configuração do grupo de interesse. O identificador precisa ser uma DOMString com 12 bytes ou menos. Se o identificador for codificado em Base64, ele precisará ter 12 bytes ou menos.

Exemplo de um grupo de interesse com IDs de renderização de anúncios:

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

Os adRenderId associados aos anúncios ficam disponíveis no prevWins.browserSignals em generateBid().

Embora o renderURL não esteja incluído no payload da solicitação, o URL de renderização retornado de generateBid() precisa corresponder ao URL de renderização definido na configuração do grupo de interesse. As adtechs podem enviar metadados de anúncios e outras informações em trustedBiddingSignals para que o URL de renderização do anúncio e o URL de renderização do componente do anúncio sejam gerados para o lance durante a execução de generateBid().

Definir prioridades de grupo de interesse

O Chrome permite que os compradores priorizem grupos de interesse. Se o limite de tamanho de payload por comprador definido pelo vendedor for atingido, os valores de prioridade do grupo de interesse serão usados para descartar os grupos de interesse de menor prioridade para um único comprador quando o payload do leilão de B&A for gerado para o vendedor. Para selecionar grupos de interesse entre diferentes compradores, o navegador decide com base no tamanho do payload serializado. Por padrão, cada comprador recebe um tamanho igual. A priorização real ocorre nos servidores do B&A, e não quando o payload da solicitação é gerado.

A prioridade é calculada no momento do leilão usando os vetores de prioridade do comprador (priorityVector) e os indicadores de prioridade do vendedor (prioritySignals). O comprador pode substituir os indicadores de prioridade do vendedor.

Propriedade Descrição
Vetor de prioridade O comprador fornece os vetores como o valor da chave priorityVector do serviço de chave-valor.
Indicadores de prioridade O vendedor fornece os indicadores definindo priority_signals da configuração do leilão.
Substituições de indicadores de prioridade O comprador fornece a substituição no campo priority_signals_overrides do PerBuyerConfig na configuração do leilão.

Durante o leilão, o navegador calcula o produto escalar esparso das chaves correspondentes em priorityVector e prioritySignals para a prioridade. No diagrama a seguir, a prioridade é calculada por (4 * 2) + (3 * -1), que é reduzida para 8 + -3. Portanto, a prioridade desse grupo de interesse no momento do leilão é 5.

Cada chave no vetor de prioridade e nos objetos de indicadores de prioridade é multiplicada entre si. Em seguida, os resultados são somados para calcular a prioridade.
Figura 1: cálculo de prioridade usando vetores do comprador e indicadores do vendedor

Outros indicadores também podem ser usados para priorização na B&A:

Indicador Descrição
deviceSignals.one O valor é sempre 1 e é útil para adicionar uma constante ao produto escalar.
deviceSignals.ageInMinutes O valor descreve a idade do grupo de interesse (o tempo desde a entrada mais recente no grupo de interesse) em minutos como um número inteiro entre 0 e 43.200.
deviceSignals.ageInMinutesMax60 O valor descreve o mesmo que o indicador ageInMinutes, mas é limitado a 60. Se o grupo tiver mais de uma hora, o valor 60 será retornado.
deviceSignals.ageInHoursMax24 O valor descreve a idade do grupo de interesse em horas, com um máximo de 24 horas. Se o grupo tiver mais de um dia, 24 será retornado.
deviceSignals.ageInDaysMax30 O valor descreve a idade do grupo de interesse em dias, com um máximo de 30 dias. Se o grupo tiver mais de 30 dias, o valor retornado será 30.

Para saber mais, acesse a explicação no GitHub.

Configurar indicadores de lances confiáveis

Como alguns dados serão omitidos da carga útil do leilão do B&A, use o serviço de chave/valor para fornecer os dados omitidos como indicadores de lances confiáveis à função generateBid().

Os seguintes dados omitidos podem ser fornecidos pelo serviço K/V:

  • userBiddingSignals se usado pelo comprador
  • metadata associados a cada anúncio
  • adRenderId associados a cada anúncio
  • Código do relatório
Os dados omitidos do grupo de interesse podem ser enviados ao servidor de coleta do comprador. O servidor de coleta envia os dados para o serviço de chave/valor, e, mais tarde, o navegador carrega esses dados do serviço de chave/valor.
Figura 2: exemplo de configuração de indicadores de confiança

Uma abordagem possível é incluir um identificador exclusivo nas chaves de indicadores de lances confiáveis e enviar os dados associados ao seu servidor para que possam ser carregados no serviço de chave/valor. No entanto, a implementação real depende da adtech, e a API não é prescritiva.

O exemplo a seguir descreve uma abordagem que pode ser implementada:

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'
          }   
        },
      ]
    }
  })
});

No exemplo, um identificador exclusivo é definido para um grupo de interesse e passa a fazer parte da chave de indicadores de confiança. A chave do IG e os valores associados são enviados ao seu servidor para serem carregados no serviço de chave-valor. Em um momento posterior durante o leilão, o navegador busca os indicadores de confiança e os disponibiliza na função generateBid() do comprador.

Retornar o indicador de atualização do grupo de interesse de K/V, se necessário

A chave updateIfOlderThanMs para os indicadores de confiança é usada para atualizar o grupo de interesse antes do intervalo diário normal. Se o grupo de interesse não tiver sido adicionado ou atualizado em um período superior ao valor de milissegundos retornado para a chave updateIfOlderThanMs, ele será atualizado com o mecanismo updateURL. O Chrome não atualiza os grupos de interesse mais do que uma vez a cada 10 minutos.

Se o leilão de B&A retornar um anúncio vencedor que não corresponda a um dos anúncios definidos no grupo de interesse armazenado no navegador, o navegador vai falhar no leilão. O mecanismo updateIfOlderThanMs pode ser útil para garantir que o navegador e o leilão de B&A concordem com o conjunto de anúncios no grupo de interesse.

Acesse a explicação para saber mais.

generateBid() tarefas

As seguintes tarefas precisam ser realizadas para a chamada generateBid().

Ler indicadores do navegador

O objeto browserSignals transmitido para a chamada generateBid() da B&A tem esta aparência:

{
  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,
}

As seguintes propriedades modificadas ou novas estão disponíveis em browserSignals:

Propriedade Descrição
prevWins prevWins é uma matriz de tuplas de tempo e anúncio. O tempo representa os segundos decorridos desde a vitória anterior do anúncio associado nos últimos 30 dias.

Ele foi modificado para fornecer o adRenderId em vez do objeto ad.

wasmHelper Objeto compilado do código fornecido por biddingWasmHelperURL.
dataVersion Um servidor confiável pode incluir opcionalmente um cabeçalho de resposta numérica Data-Version que fica disponível em generateBid().

Leia a explicação no GitHub para saber mais.

Retornar o URL de renderização de generateBid()

Como o objeto ads é omitido na carga útil do leilão de B&A, o URL de renderização retornado de generateBid() precisa ser recriado. A forma como o URL de renderização é recriado é determinada pela sua implementação, e o URL retornado precisa corresponder ao URL de renderização definido no grupo de interesse.

Uma abordagem possível é manter um URL base e preencher o modelo com as informações de interestGroup e trustedBiddingSignals.

Neste exemplo, definimos quatro anúncios com base na cor e no produto:

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
  ]
})

Em seguida, enviamos a cor favorita do usuário e as informações do produto para serem carregadas no serviço de chave/valor:

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

Mais tarde, quando o leilão for executado, os indicadores de lances confiáveis vão ficar disponíveis em generateBid(), e essas informações poderão ser usadas para reconstruir o URL:

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

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

Retornar IDs de relatórios de generateBid()

Como os IDs de relatórios não estão incluídos no payload do leilão do B&A, o ID fica disponível para generateBid() por indicadores de lances confiáveis. Depois que o ID de relatório a ser usado é determinado, o ID escolhido é retornado de generateBid(). Os IDs retornados precisam corresponder aos definidos no grupo de interesse.

Neste exemplo, o anúncio 1 é escolhido, e o ID de renderização associado a ele é retornado de generateBid():

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

O ID de relatórios retornado fica disponível em reportWin() por buyerReportingSignals:

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

Se buyerReportingId não for retornado de generateBid(), o valor interestGroupName estará disponível em buyerReportingSignals em vez de buyerReportingId.

Acesse o guia de IDs de relatórios para saber mais.

Próximas etapas

Os seguintes recursos estão disponíveis para você

Saiba mais

Dúvidas?