Guia para desenvolvedores da API FLEDGE

Qual é o público deste artigo?

Esta postagem é uma referência técnica à iteração atual da API Protected Audience experimental.

O que é a API Protected Audience?

A API Protected Audience é uma proposta do Sandbox de privacidade a ser veiculada remarketing e públicos-alvo personalizados, criados para que não possam ser usados por o rastreamento do comportamento de navegação do usuário em sites. A API permite leilões no dispositivo navegador, para escolher anúncios relevantes para sites que o usuário já visitou.

A API Protected Audience foi o primeiro experimento implementado no Chromium nos TURTLEDOVE de propostas.

O diagrama abaixo fornece uma visão geral do ciclo de vida do FLEDGE:

Ilustração oferecendo uma visão geral de cada estágio do ciclo de vida do FLEDGE
Ciclo de vida do FLEDGE.

Como posso testar a API Protected Audience?

Demonstração da API Protected Audience

Um tutorial de uma implantação básica da API Protected Audience nos sites do anunciante e do editor está disponível em protected-audience-demo.web.app.

O vídeo de demonstração explica como o código de demonstração funciona e mostra como usar o Chrome DevTools para depuração da Protected Audience.

Participe de um teste de origem da API Protected Audience

Um teste de origem de relevância e medição do Sandbox de privacidade foi disponibilizadas na versão Beta 101.0.4951.26 do Chrome e versões mais recentes em computadores para a API Protected Audience, Tópicos APIs Attribution Reporting.

Para participar, registre-se para receber um token de teste de origem.

Depois de se inscrever no teste, use a API Protected Audience JavaScript nas páginas. que forneçam um token de teste válido: por exemplo, para pedir que o navegador participe de um ou mais grupos de interesse; e fazer um leilão de anúncios para selecionar e exibir um anúncio.

A demonstração da Protected Audience oferece um exemplo básico de uma implantação completa da Protected Audience.

Forneça um token de teste para cada página em que você quer executar o código da API Protected Audience:

  • Como uma metatag em <head>:

    <meta http-equiv="origin-trial" content="TOKEN_GOES_HERE">

  • Como um cabeçalho HTTP:

    Origin-Trial: TOKEN_GOES_HERE

  • Ao fornecer um token de maneira programática:

    const otMeta = document.createElement('meta');
    otMeta.httpEquiv = 'origin-trial';
    otMeta.content = 'TOKEN_GOES_HERE';
    document.head.append(otMeta);
    

Um iframe que executa o código da API Protected Audience, como navigator.joinAdInterestGroup(). por um proprietário de grupo de interesse, precisará fornecer um token que corresponda à sua origem.

Proposta de detalhes do teste de origem do primeiro público protegido fornece mais detalhes sobre os objetivos do primeiro teste e explica quais recursos são compatíveis.

Testar esta API

Você pode testar a API Protected Audience para um único usuário no Chrome Beta 101.0.4951.26 e versões mais recentes no computador:

  • Ativando todas as APIs de privacidade de anúncios em chrome://settings/adPrivacy
  • Definindo sinalizações na linha de comando.

Renderizar anúncios em iframes ou frames delimitados

Os anúncios podem ser renderizados em <iframe> ou <fencedframe>. dependendo das sinalizações definidas.

Para usar <fencedframe> na renderização de anúncios:

--enable-features=InterestGroupStorage,AdInterestGroupAPI,Fledge,FencedFrames

Para usar <iframe> na renderização de anúncios:

--enable-features=InterestGroupStorage,AdInterestGroupAPI,Fledge,AllowURNsInIframes --disable-features=FencedFrames

Inclua a flag BiddingAndScoringDebugReportingAPI para ativar os métodos temporários de geração de relatórios de perda/vitória de depuração.

Executar o Chromium com flags explica como definir sinalizações ao executar o Google Chrome e outros navegadores baseados no Chromium a partir do comando linha A lista completa de sinalizações da API Protected Audience está disponível em Pesquisa de código do Chromium.

Quais recursos são compatíveis com a versão mais recente do Chrome?

A API Protected Audience será disponibilizada por trás das flags de recursos do Chromium como uma das primeiras edições. para testar os seguintes recursos da proposta da API Protected Audience:

  • Grupos de interesse: armazenados pelo navegador, com metadados associados para configurar lances de anúncios. e renderização.
  • Lances no dispositivo por compradores (DSP ou anunciante): com base em indicadores e grupos de interesse armazenados do vendedor.
  • Seleção de anúncios no dispositivo pelo vendedor (SSP ou editor): com base nos lances de leilão e metadados dos compradores.
  • Renderização de anúncios em uma versão temporariamente relaxada de Fenced Frames: com acesso à rede e geração de registros permitida para renderização de anúncios.

A explicação sobre a API fornece mais detalhes suporte a atributos e restrições.

Permissões do grupo de interesse

O padrão na implementação atual da API Protected Audience é permitir chamar joinAdInterestGroup() usando em qualquer lugar da página, até mesmo de iframes de vários domínios. No futuro, quando os proprietários de sites tiverem tempo ajustar as políticas de permissões de iframe entre domínios, o plano é proibir chamadas de de vários domínios, conforme a explicação.

Serviço de chave-valor

Como parte de um leilão de anúncios da API Protected Audience, o navegador pode acessar um serviço de chave-valor que retorna pares de chave-valor simples para fornecer informações ao comprador de anúncios, como o orçamento da campanha. a proposta da API Protected Audience exige que esse servidor "não execute nenhum registro em nível de evento e não tenha outros efeitos colaterais com base solicitações".

O código de serviço de chave-valor da API Protected Audience agora está disponível em um repositório do GitHub do Sandbox de privacidade (link em inglês). Esse serviço pode ser usado por desenvolvedores do Chrome e do Android. Confira o anúncio no blog (em inglês) para saber mais sobre a atualização do status. Saiba mais sobre o serviço de chave-valor da API Protected Audience na explicação da API e na explicação do modelo de confiança.

Para o teste inicial, é usado o modelo "traga seu próprio servidor". A longo prazo, as adtechs vão precisar usar os serviços de chave-valor de público-alvo protegido de código aberto em execução em ambientes de execução confiável para recuperar dados em tempo real.

Para garantir que o ecossistema tenha tempo suficiente para testes, não esperamos exigir o uso dos serviços de chave-valor de código aberto ou TEEs até algum tempo após a descontinuação dos cookies de terceiros. Antes dessa transição, vamos enviar avisos para os desenvolvedores começarem os testes e a adoção.

Detectar suporte a recursos

Antes de usar a API, verifique se ela é compatível com o navegador e está disponível no documento:

'joinAdInterestGroup' in navigator &&
  document.featurePolicy.allowsFeature('join-ad-interest-group') &&
  document.featurePolicy.allowsFeature('run-ad-auction') ?
  console.log('navigator.joinAdInterestGroup() is supported on this page') :
  console.log('navigator.joinAdInterestGroup() is not supported on this page');

Como posso desativar a API Protected Audience?

É possível bloquear o acesso à API Protected Audience como proprietário do site ou como usuário individual.

Como os sites podem controlar o acesso?

A API Protected Audience vai exigir que os sites definam uma política de permissões. para que a funcionalidade da API Protected Audience fique disponível. Isso garante que terceiros arbitrários não possam usar a API sem a permissão conhecimento. No entanto, para facilitar o teste durante o primeiro teste de origem, esse requisito é isento por padrão. Os sites que quiserem desativar explicitamente a funcionalidade da API Protected Audience durante o período de teste podem usar a política de permissões relevante para bloquear o acesso.

Há duas políticas de permissões da API Protected Audience que podem ser definidas de forma independente:

  • O join-ad-interest-group ativa/desativa a funcionalidade para adicionar um navegador aos grupos de interesse.
  • O run-ad-auction ativa/desativa a funcionalidade para fazer um leilão no dispositivo.

O acesso às APIs Protected Audience pode ser desativado completamente em contextos próprios especificando o seguinte: em um cabeçalho de resposta HTTP:

Permissions-Policy: join-ad-interest-group=(), run-ad-auction=()

É possível desativar o uso das APIs em um iframe adicionando o seguinte atributo allow a um Elemento iframe:

<iframe src="https://example.com" allow="join-ad-interest-group 'none'; run-ad-auction 'none'"></iframe>

A seção Permissões propostas de permissão de teste de origem do primeiro público-alvo protegido oferece mais detalhes.

Desativação do usuário

Um usuário pode bloquear o acesso à API Protected Audience e outros recursos do Sandbox de privacidade usando qualquer um mecanismos a seguir:

  • Desative os testes do Sandbox de privacidade nas Configurações do Chrome: Configurações > Segurança e privacidade > Sandbox de privacidade. Ele também pode ser acessado em chrome://settings/adPrivacy.
  • Desative cookies de terceiros nas configurações do Chrome: Configurações > Segurança e privacidade.
  • Defina Cookies e outros dados do site como "Bloquear cookies de terceiros" ou "Bloquear todos os cookies" de chrome://settings/cookies.
  • Usar o modo de navegação anônima.

A explicação da API Protected Audience oferece mais detalhes sobre os elementos de design da API e descreve como ela busca atender às metas de privacidade.

Depurar worklets da API Protected Audience

No Chrome Canary 98.0.4718.0, é possível depurar os worklets da Protected Audience no Chrome DevTools.

A primeira etapa é definir pontos de interrupção com uma nova categoria no painel Event Listener Breakpoints no painel Origens.

Captura de tela de
   DevTools no Chrome Canary, com destaque para o painel &quot;Event Listener Breakpoints&quot; no painel &quot;Sources&quot;.
   O início da fase de lances do bidder está selecionado em &quot;Objeto de leilão de anúncios&quot;.

Quando um ponto de interrupção é acionado, a execução é pausada antes da primeira instrução no nível superior do script do worklet. Você pode usar pontos de interrupção regulares ou comandos de etapa para chegar à página de lances/pontuação/relatórios função em si.

Os scripts de worklet ativos também vão aparecer no painel Threads.

Captura de tela de
DevTools no Chrome Canary, destacando o painel &quot;Threads&quot; no painel &quot;Sources&quot;, mostrando a atual
script de worklet que foi pausado.

Como alguns worklets podem ser executados em paralelo, várias linhas de execução podem acabar na fase "pausada". estado lá; você pode usar a lista de linhas de execução para alternar entre as linhas e retomá-las ou inspecioná-las mais detalhadamente apropriados.

Observar eventos da API Protected Audience

No painel Application do Chrome DevTools, é possível observar o grupo de interesse e o leilão da Protected Audience eventos.

Acesse o site de compras de demonstração da API Protected Audience. em um navegador com a API Protected Audience ativada, o DevTools vai mostrar informações sobre o evento join.

A
   Painel Application do DevTools no Chrome Canary, mostrando informações sobre um grupo de interesse da API Protected Audience
   participar do evento.

Acesse o site do editor de demonstração da API Protected Audience em um navegador com a API Protected Audience ativada, o DevTools mostra informações sobre os eventos bid e win.

A
   Painel Application do DevTools no Chrome Canary, mostrando informações sobre o lance de leilão da API Protected Audience e
   vencem eventos.

Como a API Protected Audience funciona?

Neste exemplo, um usuário navega no site de uma montadora de bicicletas personalizada e depois visita um site de notícias e recebe um anúncio de uma bicicleta nova do fabricante.

1. Um usuário visita o site de um anunciante

Ilustração mostrando
  uma pessoa acessando o site de um fabricante de bicicletas personalizada em um navegador no laptop.

Imagine que um usuário visite o site de um fabricante de bicicletas personalizada (o anunciante do neste exemplo) e passa algum tempo na página do produto de uma bicicleta feita de aço artesanal. Com isso, fabricante de bicicletas com uma oportunidade de remarketing.

2. O navegador do usuário precisa adicionar um grupo de interesse

Ilustração que mostra uma pessoa visualizando um site em um navegador no laptop. JavaScript
  código joinAdInterestGroup() está sendo executado no navegador.

Seção de explicação:Os navegadores registram grupos de interesse

A plataforma de demanda (DSP) do anunciante (ou o anunciante chama navigator.joinAdInterestGroup() para pedir que o navegador adicione um grupo de interesse ao lista de grupos de que o navegador é membro. Neste exemplo, o grupo é chamado de custom-bikes. O proprietário é dsp.example. O proprietário do grupo de interesse (neste caso, a DSP) será um comprador no leilão de anúncios descrito na etapa 4. A associação ao grupo de interesse é armazenada pelo navegador, no dispositivo do usuário e não é compartilhada com o fornecedor do navegador ou de qualquer outra pessoa.

O app joinAdInterestGroup() precisa da permissão de:

  • o site que está sendo visitado;
  • O proprietário do grupo de interesse

Por exemplo: não deve ser possível para malicious.example chamar joinAdInterestGroup() com dsp.example como proprietário sem a permissão de dsp.example

Permissão do site que está sendo visitado

Mesma origem: por padrão, a permissão é concedida implicitamente para chamadas joinAdInterestGroup() de tenha a mesma origem do site visitado, ou seja, da mesma origem do frame de nível superior do página atual. Os sites podem usar um cabeçalho da política de permissões da API Protected Audience Diretiva join-ad-interest-group para desativar chamadas joinAdInterestGroup().

Origem cruzada: chamar joinAdInterestGroup() de origens diferentes das atuais só poderá ter êxito se o site visitado tiver definido uma política de permissões que permita chamadas para joinAdInterestGroup() de iframes de origem cruzada.

Permissão do proprietário do grupo de interesse

A permissão do proprietário do grupo de interesse é concedida implicitamente ao chamar joinAdInterestGroup() de um iframe com a mesma origem do proprietário do grupo de interesse. Por exemplo, uma dsp.example O iframe pode chamar joinAdInterestGroup() para grupos de interesse de dsp.example.

A proposta é que joinAdInterestGroup() possa ser executado em uma página ou iframe no domínio do proprietário. ser delegadas a outros domínios fornecidos usando uma lista em um URL .well-known.

Como usar o Navigator.joinAdInterestGroup()

Aqui está um exemplo de como a API pode ser usada:

const interestGroup = {
  owner: 'https://dsp.example',
  name: 'custom-bikes',
  biddingLogicUrl: ...,
  biddingWasmHelperUrl: ...,
  dailyUpdateUrl: ...,
  trustedBiddingSignalsUrl: ...,
  trustedBiddingSignalsKeys: ['key1', 'key2'],
  userBiddingSignals: {...},
  ads: [bikeAd1, bikeAd2, bikeAd3],
  adComponents: [customBike1, customBike2, bikePedal, bikeFrame1, bikeFrame2],
};

navigator.joinAdInterestGroup(interestGroup, 7 * kSecsPerDay);

O objeto interestGroup transmitido para a função não pode ter mais de 50 kiB de tamanho, caso contrário o falhará. O segundo parâmetro especifica a duração do grupo de interesse, com um limite de 30 dias. Chamadas sucessivas substituem os valores armazenados anteriormente.

Propriedades do grupo de interesse

Propriedade Obrigatório Exemplo Papel
owner Obrigatório 'https://dsp.example' Origem do proprietário do grupo de interesse.
name Obrigatório 'custom-bikes' Nome do grupo de interesse.
biddingLogicUrl** Opcional* 'https://dsp.example/bid/custom-bikes/bid.js' URL para lances em JavaScript executado no worklet.
biddingWasmHelperUrl** Opcional* 'https://dsp.example/bid/custom-bikes/bid.wasm' URL do código do WebAssembly gerado por biddingLogicUrl.
dailyUpdateUrl** Opcional 'https://dsp.example/bid/custom-bikes/update' URL que retorna JSON para atualizar os atributos do grupo de interesse. Consulte Atualizar o grupo de interesse.
trustedBiddingSignalsUrl** Opcional 'https://dsp.example/trusted/bidding-signals' URL de base para solicitações de chave-valor ao servidor confiável do bidder.
trustedBiddingSignalsKeys Opcional ['key1', 'key2' ...] Chaves para solicitações ao servidor confiável de chave-valor.
userBiddingSignals Opcional {...} Metadados adicionais que o proprietário pode usar durante os lances.
ads Opcional* [bikeAd1, bikeAd2, bikeAd3] Anúncios que podem ser renderizados para este grupo de interesse.
adComponents Opcional [customBike1, customBike2, bikePedal, bikeFrame1, bikeFrame2] Componentes de anúncios compostos por várias partes.

* Todas as propriedades são opcionais, exceto owner e name. biddingLogicUrl e ads são opcionais, mas obrigatórias para participar de um leilão. Pode haver casos de uso para criar um grupo de interesse sem essas propriedades. Por exemplo, o proprietário de um grupo de interesse desejar adicionar um navegador a um grupo de interesse para uma campanha que ainda não está em exibição ou para alguns outro uso futuro ou eles podem ter ficado temporariamente sem orçamento de publicidade.

** Os URLs biddingLogicUrl, biddingWasmHelperUrl, dailyUpdateUrl e trustedBiddingSignalsUrl precisam ter a mesma origem que o proprietário. Os URLs ads e adComponents não têm essa restrição.

Atualizar os atributos do grupo de interesse

dailyUpdateUrl especifica um servidor da Web que retorna JSON que define as propriedades do grupo de interesse. que corresponde ao objeto do grupo de interesse transmitido para navigator.joinAdInterestGroup(). Isso fornece um mecanismo para o proprietário do grupo atualizar periodicamente os atributos da grupo de interesse. Na implementação atual, os seguintes atributos podem ser alterados:

  • biddingLogicUrl
  • biddingWasmHelperUrl
  • trustedBiddingSignalsUrl
  • trustedBiddingSignalsKeys
  • ads
  • priority

Qualquer campo não especificado no JSON não será substituído. Somente os campos especificados no JSON atualizado, enquanto chamar navigator.joinAdInterestGroup() substitui qualquer grupo de interesse existente.

As atualizações são feitas da melhor maneira possível e podem falhar nas seguintes condições:

  • Tempo limite da solicitação de rede (atualmente 30 segundos).
  • Outra falha de rede.
  • Falha na análise de JSON.

As atualizações também podem ser canceladas se muito tempo contíguo tiver sido gasto atualizando, embora isso não impõe nenhuma limitação de taxa em atualizações canceladas (restantes). As atualizações têm limitação de taxa para um no máximo um por dia. As atualizações que falham devido a erros de rede são repetidas após uma hora. as atualizações que falham devido à desconexão da Internet são repetidas imediatamente após a reconexão.

Atualizações manuais

As atualizações em grupos de interesse pertencentes à origem do frame atual podem ser acionadas manualmente por navigator.updateAdInterestGroups(): A limitação de taxa impede que as atualizações aconteçam com muita frequência: Chamadas repetidas para navigator.updateAdInterestGroups() não fazem nada até que a limitação de taxa (atualmente um dia) tiver passado. O limite de taxa será redefinido se navigator.joinAdInterestGroup() é chamado novamente para o mesmo grupo de interesse owner e name.

Atualizações automáticas

Todos os grupos de interesse carregados para um leilão são atualizados automaticamente após a conclusão dele. sujeitos aos mesmos limites de taxa das atualizações manuais. Para cada proprietário com pelo menos um grupo de interesse participa de um leilão, é como se navigator.updateAdInterestGroups() fosse chamado de um iframe cuja origem corresponde ao proprietário.

Especificar anúncios para um grupo de interesse

Os objetos ads e adComponents incluem um URL para um criativo de anúncio e, opcionalmente, valores arbitrários metadados que podem ser usados no momento dos lances. Exemplo:

{
  renderUrl: 'https://cdn.example/.../bikeAd1.html',
  metadata: bikeAd1metadata // optional
}

Como os compradores dão lances?

O script em biddingLogicUrl fornecido pelo proprietário de um grupo de interesse precisa incluir um generateBid() função. Quando um vendedor de espaço publicitário chama navigator.runAdAuction(), o generatedBid() é chamada uma vez para cada um dos grupos de interesse do qual o navegador é membro, se o interesse o proprietário do grupo foi convidado a fazer um lance. Em outras palavras, generateBid() é chamado uma vez para cada candidato. anúncio. O vendedor fornece uma propriedade decisionLogicUrl no parâmetro de configuração do leilão transmitido. para navigator.runAdAuction(). O código neste URL deve incluir uma função scoreAd(), que é realizadas para cada bidder no leilão para pontuar cada um dos lances retornados por generateBid().

O script em biddingLogicUrl fornecido por um comprador de espaço publicitário precisa incluir uma função generateBid(). Essa função é chamada uma vez para cada anúncio candidato. runAdAuction() verifica individualmente cada anúncio, juntamente com seu lance e metadados associados, e atribui ao anúncio um e uma pontuação de desejabilidade numérica.

generateBid(interestGroup, auctionSignals, perBuyerSignals,
    trustedBiddingSignals, browserSignals) {
  ...
  return {
    ad: adObject,
    bid: bidValue,
    render: renderUrl,
    adComponents: [adComponentRenderUrl1, ...]
   };
}

generateBid() usa os seguintes argumentos:

  • interestGroup e
    O objeto transmitido para joinAdInterestGroup() pelo comprador de anúncios. O grupo de interesse podem ser atualizados em dailyUpdateUrl.

  • auctionSignals e
    Uma propriedade do argumento auction config transmitida para navigator.runAdAuction() pelo vendedor de espaços publicitários. Fornece informações sobre o contexto da página (como o tamanho do anúncio e o ID do editor), o tipo de leilão (primeiro ou segundo preço) e outros metadados.

  • perBuyerSignals e
    Assim como em auctionSignals, uma propriedade da configuração do leilão passado para navigator.runAdAuction() pelo vendedor. Isso pode fornecer dados contextuais sinais do servidor do comprador sobre a página, se o vendedor for uma SSP que realiza uma chamada de lances em tempo real para os servidores do comprador e canaliza a resposta de volta, ou se o editor entra em contato diretamente com o servidor do comprador. Nesse caso, o comprador pode querer verificar assinatura desses sinais em generateBid() como proteção contra adulterações.

  • trustedBiddingSignals e
    Um objeto cujas chaves são o trustedBiddingSignalsKeys do grupo de interesse e cujos valores são retornados na solicitação trustedBiddingSignals.

  • browserSignals e
    Um objeto construído pelo navegador, que pode incluir informações sobre a página contexto (como o hostname da página atual, que o vendedor poderia falsificar de outra forma) e dados para o próprio grupo de interesse (como um registro de quando o grupo venceu um leilão anteriormente, para permitir limite de frequência no dispositivo).

O objeto browserSignals tem as seguintes propriedades:

{
  topWindowHostname: 'publisher.example',
  seller: 'https://ssp.example',
  joinCount: 3,
  bidCount: 17,
  prevWins: [[time1,ad1],[time2,ad2],...],
  wasmHelper: ... /* WebAssembly.Module object based on interest group's biddingWasmHelperUrl. */
  dataVersion: 1, /* Data-Version value from the buyer's Key/Value service response(s). */
}

Para calcular um valor de bid, o código em generateBid() pode usar as propriedades do elemento parâmetros. Exemplo:

function generateBid(interestGroup, auctionSignals, perBuyerSignals,
    trustedBiddingSignals, browserSignals) {
  return {
    ...
    bid: auctionSignals.is_above_the_fold ? perBuyerSignals.atf_value : perBuyerSignals.btf_value,
    ...
  }
}

generateBid() retorna um objeto com quatro propriedades:

  • ad e
    Metadados arbitrários sobre o anúncio, como informações que o vendedor espera ter acesso a esse lance ou criativo do anúncio. O vendedor](/privacy-sandbox/resources/glossary#ssp) usa essas informações no leilão e na decisão. criativo do anúncio. O vendedor usa essas informações no leilão e na decisão. lógica.

  • bid e
    Um lance numérico que entrará no leilão. O vendedor precisa conseguir fazer comparações de diferentes compradores. Sendo assim, os lances devem estar em alguma unidade escolhida pelo vendedor (por exemplo, "USD por mil"). Se o lance for zero ou negativo, esse grupo de interesse não participará do o leilão do vendedor. Com esse mecanismo, o comprador pode implementar qualquer regra de anunciante para onde seus anúncios podem ou não ser exibidos.

  • render e
    Um URL ou uma lista de URLs que será usado para renderizar o criativo se o lance vencer o leilão. Consulte Anúncios compostos de várias peças na explicação sobre a API. O valor precisa corresponder ao renderUrl de um dos anúncios definidos para o grupo de interesse.

  • adComponents e
    Uma lista opcional de até 20 componentes para compostos por várias partes, Extraído da propriedade adComponents do argumento do grupo de interesse passado para navigator.joinAdInterestGroup().

Pedir para um navegador sair de um grupo de interesse

O proprietário do grupo de interesse pode solicitar que um navegador seja removido de um grupo de interesse. Em outras palavras, o navegador recebe uma solicitação para remover o grupo de interesse da lista de membros.

navigator.leaveAdInterestGroup({
  owner: 'https://dsp.example',
  name: 'custom-bikes'
});

Se um usuário retornar ao site que solicitou ao navegador a adição de um grupo de interesse, o proprietário do grupo de interesse pode chamar a função navigator.leaveAdInterestGroup() para solicitar que o navegador remova o grupo de interesse. O código de um anúncio também pode chamar essa função para seu grupo de interesse.

3. O usuário visita um site que vende espaço publicitário.

Ilustração que mostra uma pessoa acessando um site de notícias em um navegador no laptop. O site
  tem um espaço de anúncio vazio.

Mais tarde, o usuário visita um site que vende espaço publicitário, neste exemplo, um site de notícias. O site tem inventário de anúncios, que vende de maneira programática usando lances em tempo real.

4. Um leilão de anúncios é realizado no navegador

Ilustração que mostra uma pessoa acessando um site de notícias em um navegador no laptop. Um anúncio
  usando a API Protected Audience.

Seção explicativa: os vendedores realizam leilões no dispositivo

o leilão de anúncios provavelmente será realizado pela SSP do editor; ou pelo próprio editor. O objetivo do leilão é selecionar o anúncio mais apropriado para um único espaço de anúncio disponível na página atual. O leilão considera os grupos de interesse navegador faz parte, além de dados de compradores de espaços publicitários e vendedores dos serviços de chave-valor.

O vendedor do espaço publicitário faz uma solicitação ao navegador do usuário para iniciar um leilão de anúncios chamando navigator.runAdAuction()

Exemplo:

const auctionConfig = {
  seller: 'https://ssp.example',
  decisionLogicUrl: ...,
  trustedScoringSignalsUrl: ...,
  interestGroupBuyers: ['https://dsp.example', 'https://buyer2.example', ...],
  auctionSignals: {...},
  sellerSignals: {...},
  sellerTimeout: 100,
  perBuyerSignals: {
    'https://dsp.example': {...},
    'https://another-buyer.example': {...},
    ...
  },
  perBuyerTimeouts: {
    'https://dsp.example': 50,
    'https://another-buyer.example': 200,
    '*': 150,
    ...
  },
  componentAuctions: [
    {
      'seller': 'https://some-other-ssp.example',
      'decisionLogicUrl': ...,
      ...
    },
    ...
  ]
};

const auctionResultPromise = navigator.runAdAuction(auctionConfig);

runAdAuction() retorna uma promessa que é resolvida em um URN (urn:uuid:<something>) que representa o do leilão de anúncios. Só pode ser decodificado pelo navegador quando transmitido para um frame isolado. para renderização: a página do editor não pode inspecionar o anúncio vencedor.

O script decisionLogicUrl considera cada anúncio individual, junto com o lance associado a ele e metadados, um de cada vez, e atribui a eles uma pontuação de desejabilidade numérica.

auctionConfig propriedades

Propriedade Obrigatório Exemplo Papel
seller Obrigatório 'https://ssp.example' Origem do vendedor.
decisionLogicUrl Obrigatório 'https://ssp.example/auction-decision-logic.js' URL para JavaScript do worklet de leilão.
trustedScoringSignalsUrl Opcional 'https://ssp.example/scoring-signals' URL do servidor confiável do vendedor.
interestGroupBuyers* Obrigatório ['https://dsp.example', 'https://buyer2.example', ...] Origens de todos os proprietários de grupos de interesse que solicitaram lances no leilão.
auctionSignals Opcional {...} Informações do vendedor sobre o contexto da página, o tipo de leilão etc.
sellerSignals Opcional {...} Informações com base nas configurações do editor, como fazer uma solicitação de anúncio contextual etc.
sellerTimeout Opcional 100 Tempo de execução máximo (ms) do script scoreAd() do vendedor.
perBuyerSignals Opcional {'https://dsp.example': {...},
  'https://another-buyer.example': {...},
...}
Indicadores de contexto sobre a página de cada comprador específico do servidor.
perBuyerTimeouts Opcional 50 Tempo de execução máximo (ms) dos scripts generateBid() de um comprador específico.
componentAuctions Opcional [{'seller': 'https://www.some-other-ssp.com',
  'decisionLogicUrl': ..., ...},
  ...]
Configurações adicionais para leilões de componentes.

* O vendedor pode especificar interestGroupBuyers: '*' para permitir que todos os grupos de interesse deem lances. Os anúncios são então aceitos ou rejeitados com base em critérios diferentes da inclusão do proprietário do grupo de interesse. Por exemplo, o vendedor pode revisar criativos de anúncios para confirmar a conformidade com as políticas.

** additionalBids não é compatível com a implementação atual da API Protected Audience. Leia o leilão Participantes no explicação sobre a API Protected Audience para mais informações.

Como os anúncios são selecionados?

O código em decisionLogicUrl, uma propriedade do objeto de configuração de leilão transmitido para o runAdAuction()) precisam incluir uma função scoreAd(). É executado uma vez para cada anúncio para determinar sua atratividade.

scoreAd(adMetadata, bid, auctionConfig, trustedScoringSignals, browserSignals) {
  ...
  return desirabilityScoreForThisAd;
}

scoreAd() usa os seguintes argumentos:

  • adMetadata e
    Metadados arbitrários fornecidos pelo comprador.
  • bid e
    Um valor de lance numérico.
  • auctionConfig e
    O objeto de configuração do leilão transmitido para navigator.runAdAuction().
  • trustedScoringSignals e
    valores recuperados no momento do leilão do servidor confiável do vendedor; que representam a opinião do vendedor sobre o anúncio.
  • browserSignals e
    Um objeto construído pelo navegador, incluindo informações que o navegador sabe e qual script de leilão do vendedor pode querer verificar:
{
  topWindowHostname: 'publisher.example',
  interestGroupOwner: 'https://dsp.example',
  renderUrl: 'https://cdn.example/render',
  adComponents: ['https://cdn.com/ad-component-1', ...],
  biddingDurationMsec: 12,
  dataVersion: 1 /* Data-Version value from the seller's Key/Value service response. */
}

Antes do início de um leilão, ele encontra o melhor anúncio contextual para o espaço de anúncio disponível. Parte de A lógica scoreAd() é rejeitar qualquer anúncio que não possa vencer o vencedor contextual.

5. O vendedor e os compradores participantes recebem dados em tempo real do serviço de chave-valor.

Ilustração que mostra uma pessoa acessando um site de notícias em um navegador no laptop. Um anúncio
  usando a API Protected Audience, com um participante recebendo dados do serviço de chave-valor.

Seção de explicação:Como buscar dados em tempo real do serviço de chave-valor da API Protected Audience.

Durante um leilão de anúncios, o vendedor do espaço publicitário pode receber dados em tempo real sobre criativos de anúncios específicos fazer uma solicitação para um serviço de chave-valor usando a propriedade trustedScoringSignalsUrl de o argumento de configuração do leilão transmitido para navigator.runAdAuction(), com as chaves das propriedades renderUrl de todas as entradas nos campos ads e adComponents de todas grupos de interesse no leilão.

Da mesma forma, um comprador de espaço publicitário pode solicitar dados em tempo real do serviço de chave-valor usando o método Propriedades trustedBiddingSignalsUrl e trustedBiddingSignalsKeys do argumento do grupo de interesse. passados para navigator.joinAdInterestGroup().

Quando runAdAuction() é chamado, o navegador faz uma solicitação ao servidor confiável de cada comprador de anúncios. A O URL da solicitação pode ter esta aparência:

https://kv-service.example/getvalues?hostname=publisher.example&keys=key1,key2
  • O URL de base vem de trustedBiddingSignalsUrl.
  • O hostname é fornecido pelo navegador.
  • O valor keys é extraído de trustedBiddingSignalsKeys.

A resposta a essa solicitação é um objeto JSON que fornece valores para cada uma das chaves.

6. O anúncio vencedor é exibido

Ilustração que mostra uma pessoa acessando um site de notícias em um navegador no laptop. Um anúncio
  para uma bicicleta (20% de desconto) é exibida, com um cadeado acima para mostrar que o anúncio é exibido em um
  um quadro isolado.

Seção de explicação:Os navegadores renderizam o anúncio vencedor

Conforme descrito anteriormente: a promessa retornada por runAdAuction() é resolvida em uma URN que é passado para um frame cercado para renderização, e o site exibe o anúncio vencedor.

7. O resultado do leilão é informado

Seção explicativa: relatórios no nível do evento (por enquanto)

O vendedor informa o resultado

Seção de explicação:Relatórios do vendedor sobre renderização

O JavaScript do vendedor fornecido em decisionLogicUrl (que também forneceu scoreAd()) pode inclua uma função reportResult() para informar o resultado do leilão.

reportResult(auctionConfig, browserSignals) {
  ...
  return signalsForWinner;
}

Os argumentos passados para essa função são:

  • auctionConfig e
    O objeto de configuração do leilão transmitido para navigator.runAdAuction().


  • de browserSignals Um objeto construído pelo navegador que fornece informações sobre o leilão. Por exemplo:

    {
      'topWindowHostname': 'publisher.example',
      'interestGroupOwner': 'https://dsp.example',
      'renderUrl': 'https://cdn.example/url-of-winning-creative.wbn',
      'bid:' <bidValue>,
      'desirability': <winningAdScore>
    }
    

O valor de retorno dessa função é usado como o argumento sellerSignals para o lance função reportWin().

O bidder vencedor informa o resultado

Seção de explicação:Relatórios de compradores sobre eventos de renderização e anúncio

O JavaScript do bidder vencedor (que também forneceu generateBid()) pode incluir um reportWin() para informar o resultado do leilão.

reportWin(auctionSignals, perBuyerSignals, sellerSignals, browserSignals) {
  ...
}

Os argumentos passados para essa função são:

  • auctionSignals e perBuyerSignals
    Os mesmos valores foram transmitidos para generateBid() do bidder vencedor.
  • sellerSignals e
    O valor de retorno de reportResult(), que dá ao vendedor um de transmitir informações ao comprador.
  • browserSignals e
    Um objeto construído pelo navegador que fornece informações sobre o leilão. Por exemplo:

    {
      'topWindowHostname': 'publisher.example',
      'seller': 'https://ssp.example',
      'interestGroupOwner': 'https://dsp.example',
      'interestGroupName': 'custom-bikes',
      'renderUrl': 'https://cdn.example/winning-creative.wbn',
      'bid:' <bidValue>
    }
    

Implementação temporária de relatórios de perda/vitória

Há dois métodos disponíveis temporariamente no Chrome para relatórios de leilão:

  • forDebuggingOnly.reportAdAuctionLoss()
  • forDebuggingOnly.reportAdAuctionWin()

Cada um desses métodos usa um único argumento: um URL a ser buscado após a conclusão do leilão. Eles podem ser chamado várias vezes, em scoreAd() e generateBid(), com diferentes argumentos de URL;

O Chrome só envia relatórios de perda/vitória de depuração quando um leilão é concluído. Se um leilão for cancelado (por exemplo, devido a uma nova navegação), nenhum relatório será gerado.

Esses métodos estão disponíveis por padrão no Chrome. Para testar os métodos, ative todas as APIs de privacidade de anúncios em chrome://settings/adPrivacy. Se você estiver usando o Chrome com sinalizações de linha de comando para ativar a API Protected Audience, será necessário ativar explicitamente os métodos incluindo a sinalização BiddingAndScoringDebugReportingAPI. Se o não estiver ativada, os métodos ainda estarão disponíveis, mas não farão nada.

8. Um clique no anúncio é registrado

Ilustração mostrando
  uma pessoa clicando em um anúncio de bicicleta, dentro de um quadro cercado, em um site de notícias, com relatório
  os dados são enviados
ao vendedor e aos compradores.

Um clique em um anúncio renderizado em um frame isolado é informado. Para saber mais sobre como isso pode funcionar, consulte Relatórios de anúncios de frame isolado.



O diagrama abaixo descreve cada etapa de um leilão de anúncios da API Protected Audience:

Ilustração que apresenta uma visão geral de cada etapa de um leilão de anúncios da API Protected Audience


Qual é a diferença entre Protected Audience e TURTLEDOVE?

A API Protected Audience é o primeiro experimento implementado no Chromium na família de propostas TURTLEDOVE.

A API Protected Audience segue os princípios gerais da TURTLEDOVE. Algumas publicidades on-line têm como base a exibição de um anúncio a uma pessoa potencialmente interessada que já interagiu com o anunciante ou a rede de publicidade. Historicamente, isso tem funcionado porque o anunciante reconhece uma pessoa específica enquanto ela navega em sites, uma questão importante de privacidade na Web atual.

O objetivo da iniciativa TURTLEDOVE é oferecer uma nova API para lidar com esse caso de uso, além de oferecer alguns avanços importantes na privacidade:

  • O navegador, não o anunciante, detém as informações sobre o que o anunciante pensa que um pessoa está interessada.
  • Os anunciantes podem veicular anúncios com base em interesses, mas não podem combiná-los com outros informações sobre uma pessoa, em especial quem ela é ou qual página está visitando.

A Protected Audience surgiu com o TURTLEDOVE e uma coleção de propostas relacionadas de modificações para atender melhor aos desenvolvedores que usam a API:

  • Em SPARROW: A Criteo propôs a adição de uma Modelo de serviço ("Gatekeeper") executado em um ambiente de execução confiável (TEE). A API Protected Audience inclui um uso mais limitado de TEEs para pesquisa de dados em tempo real e geração de relatórios agregados.
  • TERN e Magnite do NextRoll PADRÃO as propostas descreviam as diferentes funções que compradores e vendedores desempenham no leilão no dispositivo. O fluxo de pontuação/lances de anúncios da API Protected Audience é baseado nesse trabalho.
  • os recursos Com base em resultados e Nível do produto TURTLEDOVE as modificações melhoraram o modelo de anonimato e os recursos de personalização do leilão no dispositivo
  • PARAKEET é A proposta da Microsoft para um serviço de anúncios do tipo TURTLEDOVE que depende de um servidor proxy em execução em um TEE entre o navegador e os provedores de adtech, para anonimizar solicitações de anúncios e reforçar a privacidade. propriedades. A API Protected Audience não adotou esse modelo de proxy. Estamos disponibilizando as APIs JavaScript a PARAKEET e a Protected Audience em alinhamento, em apoio ao trabalho futuro para combinar ainda mais as melhores dos recursos das duas propostas.

A API Protected Audience ainda não impede que a rede de publicidade de um site saiba quais anúncios uma pessoa vê. Esperamos para que a API fique mais particular ao longo do tempo.

Qual configuração de navegador está disponível?

Os usuários podem ajustar a participação em testes do Sandbox de privacidade no Chrome ativando ou desativando a configuração de nível superior em chrome://settings/adPrivacy. Durante os testes iniciais, as pessoas serão pode usar essa configuração de alto nível do Sandbox de privacidade para desativar a API Protected Audience. O Chrome planeja permitir que os usuários vejam e gerenciem a lista de grupos de interesse a que foram adicionados em toda a web sites visitados. Assim como acontece com as tecnologias do Sandbox de privacidade, as configurações do usuário podem e evoluir com o feedback de usuários, reguladores e outros.

Vamos continuar atualizando as configurações disponíveis no Chrome à medida que a proposta da API Protected Audience avança, com base sobre testes e feedback. No futuro, planejamos oferecer configurações mais granulares para gerenciar a API Protected Audience e os dados associados.

Os autores das chamadas de API não podem acessar a associação a grupos quando os usuários navegam no modo de navegação anônima, e a associação está removidos quando os usuários limpam os dados do site.



Interaja e compartilhe feedback

Receber suporte

Para fazer uma pergunta sobre sua implementação, sobre a demonstração ou sobre a documentação:

Para bugs e problemas com a implementação da API Protected Audience no Chrome: * Ver problemas existentes relatados para a API. * Informe um novo problema em crbug.com/new.

Receber atualizações

Saiba mais


Foto de Ray Hennessy no Unsplash.