Guía para desarrolladores sobre la API de FLEDGE

¿A quién está dirigido este artículo?

Esta publicación es una referencia técnica a la iteración actual de la API experimental de Protected Audience.

¿Qué es Protected Audience?

La API de Protected Audience es una propuesta de Privacy Sandbox para publicar casos de uso de remarketing y públicos personalizados, diseñada de modo que terceros no puedan usarla para hacer un seguimiento del comportamiento de navegación de los usuarios en diferentes sitios. La API permite que el navegador use las subastas integradas en el dispositivo para elegir anuncios relevantes para los sitios web que el usuario visitó anteriormente.

Protected Audience es el primer experimento que se implementa en Chromium dentro de la familia de propuestas TURTLEDOVE.

En el siguiente diagrama, se proporciona una descripción general del ciclo de vida de FLEDGE:

Ilustración que proporciona una descripción general de cada etapa del ciclo de vida de FLEDGE
Ciclo de vida de FLEDGE.

¿Cómo puedo probar Protected Audience?

Demostración de Protected Audience

Puedes encontrar una explicación de una implementación básica de Protected Audience en sitios de anunciantes y publicadores en protection-audience-demo.web.app.

En el video de demostración, se explica cómo funciona el código de demostración y se muestra cómo usar las Herramientas para desarrolladores de Chrome para la depuración de Protected Audience.

Participa en una prueba de origen de Protected Audience

Se lanzó una prueba de origen de relevancia y medición de Privacy Sandbox en Chrome beta 101.0.4951.26 y versiones posteriores en computadoras de escritorio para las APIs de Protected Audience, Topics y Attribution Reporting.

Para participar, regístrate para obtener un token de prueba de origen.

Una vez que te inscribas correctamente en la prueba, puedes probar la API de JavaScript de Protected Audience en páginas que proporcionan un token de prueba válido: por ejemplo, para pedirle al navegador que se una a uno o más grupos de intereses y, luego, ejecutar una subasta de anuncios para seleccionar y mostrar un anuncio.

La demostración de Protected Audience proporciona un ejemplo básico de una implementación de Protected Audience de extremo a extremo.

Proporciona un token de prueba para cada página en la que desees ejecutar el código de la API de Protected Audience:

  • Como metaetiqueta en el encabezado <head>:

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

  • Como encabezado HTTP:

    Origin-Trial: TOKEN_GOES_HERE

  • Cuando proporcionas un token de manera programática, sucede lo siguiente:

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

Un iframe que ejecute el código de Protected Audience, como una llamada navigator.joinAdInterestGroup() de un propietario de grupo de interés, deberá proporcionar un token que coincida con su origen.

Los Detalles de la prueba propuesta de origen de Protected Audience proporcionan más detalles sobre los objetivos de la primera prueba y explican qué funciones son compatibles.

Prueba con chrome://flags o marcas de función

Puedes probar Protected Audience para un solo usuario en Chrome Beta 101.0.4951.26 y versiones posteriores en computadoras de escritorio: * Habilita chrome://flags/#privacy-sandbox-ads-apis. * Configurando marcas desde la línea de comandos

Renderiza anuncios en iframes o marcos vallados

Los anuncios se pueden renderizar en un <iframe> o un <fencedframe>, según las marcas que se configuren.

Si deseas usar <fencedframe> para renderizar anuncios, haz lo siguiente:

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

Si deseas usar <iframe> para renderizar anuncios, haz lo siguiente:

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

Incluye la marca BiddingAndScoringDebugReportingAPI para habilitar los métodos temporales de informes de pérdida/gana de la depuración.

En Cómo ejecutar Chromium con marcas, se explica cómo configurar marcas cuando se ejecutan Chrome y otros navegadores basados en Chromium desde la línea de comandos. La lista completa de marcas de Protected Audience está disponible en la Búsqueda de código de Chromium.

¿Qué funciones son compatibles con la versión más reciente de Chrome?

Protected Audience estará disponible detrás de las marcas de función en Chromium como un primer experimento para probar las siguientes funciones de la propuesta de Protected Audience:

  • Grupos de interés: El navegador los almacena, con metadatos asociados para configurar la renderización y la oferta de anuncios.
  • Ofertas en el dispositivo por compradores (DSP o anunciante): Se basan en indicadores y grupos de intereses almacenados del vendedor.
  • Selección de anuncios en el dispositivo por parte del vendedor (SSP o publicador): Se basa en las ofertas de subasta y los metadatos de los compradores.
  • Renderización de anuncios en una versión temporalmente relajada de Marcos vallados: Se permite el acceso a la red y el registro para la renderización de anuncios.

La explicación de la API proporciona más detalles sobre la compatibilidad y las restricciones de las funciones.

Permisos del grupo de interés

La configuración predeterminada en la implementación actual de Protected Audience consiste en permitir llamar a joinAdInterestGroup() desde cualquier parte de la página, incluso desde iframes multidominio. En el futuro, una vez que los propietarios de los sitios hayan tenido tiempo de ajustar sus políticas de permisos de iframe multidominio, el plan es inhabilitar las llamadas de iframes multidominio, como se describe en la explicación.

Servicio de par clave-valor

Como parte de una subasta de anuncios de Protected Audience, el navegador puede acceder a un servicio de par clave-valor que muestra pares clave-valor simples para proporcionar información a un comprador de anuncios, como el presupuesto restante de la campaña. La propuesta de Protected Audience exige que este servidor "no realice registros a nivel de evento y no tenga otros efectos secundarios basados en estas solicitudes".

El código de servicio del par clave-valor de Protected Audience ahora está disponible en un repositorio de GitHub de Privacy Sandbox. Los desarrolladores de Chrome y Android pueden usar este servicio. Consulte la entrada de blog sobre el anuncio para conocer la actualización del estado. Obtén más información sobre el servicio de par clave-valor de Protected Audience en la explicación de la API y del modelo de confianza.

Para las pruebas iniciales, se usa el modelo “Trae tu propio servidor”. A largo plazo, las AdTech deberán usar los servicios clave-valor de Protected Audience de código abierto que se ejecuten en entornos de ejecución de confianza para recuperar datos en tiempo real.

Para garantizar que el ecosistema tenga tiempo suficiente para realizar pruebas, no esperamos requerir el uso de servicios de par clave-valor o TEE de código abierto hasta un tiempo después de que las cookies de terceros dejen de estar disponibles. Antes de esta transición, les avisaremos a los desarrolladores que comienzan las pruebas y la adopción.

Detecta la compatibilidad de funciones

Antes de usar la API, comprueba si es compatible con el navegador y si está disponible en el 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');

¿Cómo puedo inhabilitar Protected Audience?

Puedes bloquear el acceso a la API de Protected Audience como propietario del sitio o como usuario individual.

¿De qué manera los sitios pueden controlar el acceso?

En algún momento, Protected Audience exigirá que los sitios establezcan una Política de Permisos para permitir que la funcionalidad de Protected Audience esté disponible. Esto ayudará a garantizar que terceros arbitrarios no puedan usar la API sin el conocimiento de un sitio. Sin embargo, para facilitar las pruebas durante la primera prueba de origen, este requisito se renuncia de forma predeterminada. Los sitios que deseen inhabilitar explícitamente la funcionalidad de Protected Audience durante el período de prueba pueden usar la Política de Permisos correspondiente para bloquear el acceso.

Existen dos políticas de permisos de Protected Audience que se pueden configurar de forma independiente: * join-ad-interest-group habilita o inhabilita la funcionalidad para agregar un navegador a los grupos de intereses * run-ad-auction habilita o inhabilita la funcionalidad para ejecutar una subasta integrada en el dispositivo

El acceso a las APIs de Protected Audience se puede inhabilitar por completo en contextos propios. Para ello, especifica la siguiente política de permisos en un encabezado de respuesta HTTP:

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

Para inhabilitar el uso de las APIs de un iframe, agrega el siguiente atributo allow a un elemento de iframe:

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

En la sección Política de Permisos de la Prueba de Origen de Primera Protegida de Protected Audience se proporcionan más detalles.

Inhabilitación de usuarios

Un usuario puede bloquear el acceso a la API de Protected Audience y otras funciones de Privacy Sandbox mediante cualquiera de los siguientes mecanismos:

  • Inhabilita las pruebas de Privacy Sandbox en la configuración de Chrome: Configuración > Seguridad y privacidad > Privacy Sandbox. También se puede acceder a ella en chrome://settings/adPrivacy.
  • Inhabilita las cookies de terceros en la configuración de Chrome: Configuración > Seguridad y privacidad.
  • Configura Cookies y otros datos de sitios como "Bloquear cookies de terceros" o "Bloquear todas las cookies" de chrome://settings/cookies.
  • Usa el modo Incógnito.

La explicación de Protected Audience proporciona más detalles sobre los elementos de diseño de la API y describe cómo la API busca cumplir con los objetivos de privacidad.

Cómo depurar worklets de Protected Audience

A partir de Chrome Canary 98.0.4718.0, es posible depurar worklets de Protected Audience dentro de las Herramientas para desarrolladores de Chrome.

El primer paso es establecer puntos de interrupción mediante una categoría nueva en el panel Event Listener Breakpoints del panel Sources.

Captura de pantalla de Herramientas para desarrolladores en Chrome Canary, en la que se destaca el panel Event Listener Breakpoints en el panel Sources.
   El inicio de la fase de oferta del ofertante se selecciona en el Worklet de la subasta de anuncios.

Cuando se activa un punto de interrupción, la ejecución se pausa antes de la primera declaración en el nivel superior de la secuencia de comandos del worklet. Puedes usar puntos de interrupción regulares o comandos de pasos para llegar a la función de ofertas/puntuación/informes.

Las secuencias de comandos del worklet activo también se mostrarán en el panel Threads.

Captura de pantalla de Herramientas para desarrolladores en Chrome Canary, en la que se destaca el panel Threads en el panel Sources y se muestra la secuencia de comandos del Worklet actual que se pausó.

Dado que algunos worklets pueden ejecutarse en paralelo, varios subprocesos pueden terminar en el estado "detenido". Puedes usar la lista de subprocesos para alternar entre subprocesos, y reanudarlos o inspeccionarlos con mayor precisión.

Observa los eventos de Protected Audience

En el panel Application de las Herramientas para desarrolladores de Chrome, puedes observar el grupo de interés y los eventos de subasta de Protected Audience.

Si visitas el sitio de compra de demostración de Protected Audience en un navegador con Protected Audience habilitado, Herramientas para desarrolladores mostrará información sobre el evento join.

El panel de la app de Herramientas para desarrolladores en Chrome Canary, que muestra información sobre un evento de unión a un grupo de interés de Protected Audience.

Ahora, si visitas el sitio del publicador de demostración de Protected Audience en un navegador con Protected Audience habilitado, Herramientas para desarrolladores mostrará información sobre los eventos bid y win.

El panel de la app de Herramientas para desarrolladores en Chrome Canary, que muestra información sobre las ofertas y los eventos de éxito de las subastas de Protected Audience.

¿Cómo funciona la API de Protected Audience?

En este ejemplo, un usuario explora el sitio web de un fabricante de bicicletas personalizada y, luego, visita un sitio web de noticias, y se le muestra un anuncio de una bicicleta nueva del fabricante.

1. Un usuario visita el sitio de un anunciante.

Ilustración que muestra a una persona que visita el sitio de un fabricante de bicicletas personalizadas en el navegador de su laptop.

Imagina que un usuario visita el sitio web de un fabricante de bicicletas personalizado (el anunciante en este ejemplo) y pasa un tiempo en la página del producto de una bicicleta de acero hecha a mano. Esto le brinda al fabricante de la bicicleta una oportunidad de remarketing.

2. Se le solicita al navegador del usuario que agregue un grupo de interés

Ilustración de una persona viendo un sitio en un navegador en su laptop. El código JavaScript JoinAdInterestGroup() se ejecuta en el navegador.

Sección de explicación: Grupos de intereses de registros de navegadores

La plataforma orientada a la demanda (DSP) (o el anunciante mismo) llama a navigator.joinAdInterestGroup() para pedirle al navegador que agregue un grupo de interés a la lista de grupos de los que es miembro. En este ejemplo, el grupo se llama custom-bikes, y el propietario es dsp.example. El propietario del grupo de interés (en este caso, la DSP) será un comprador en la subasta de anuncios descrita en el paso 4. El navegador, el dispositivo del usuario, almacena la membresía del grupo de interés, y no se comparte con el proveedor del navegador ni con nadie más.

joinAdInterestGroup() requiere permiso de: * El sitio que se visita * El propietario del grupo de interés

Por ejemplo, malicious.example no debe poder llamar a joinAdInterestGroup() con dsp.example como propietario sin el permiso de dsp.example.

Permiso del sitio que se visita

Mismo origen: De forma predeterminada, se otorga permiso de manera implícita para las llamadas a joinAdInterestGroup() desde el mismo origen que el sitio que se visita, es decir, desde el mismo origen que el marco de nivel superior de la página actual. Los sitios pueden usar una directiva join-ad-interest-group de encabezado de política de permisos de Protected Audience para inhabilitar las llamadas joinAdInterestGroup().

Origen cruzado: Llamar a joinAdInterestGroup() desde orígenes diferentes a los de la página actual solo puede realizarse correctamente si el sitio que se visita estableció una política de permisos que permite llamadas a joinAdInterestGroup() desde iframes de origen cruzado.

Permiso del propietario del grupo de interés

El permiso de propietario del grupo de interés se otorga implícitamente llamando a joinAdInterestGroup() desde un iframe con el mismo origen que el del propietario del grupo de interés. Por ejemplo, un iframe dsp.example puede llamar a joinAdInterestGroup() para grupos de interés que son propiedad de dsp.example.

La propuesta es que joinAdInterestGroup() se pueda ejecutar en una página o iframe en el dominio del propietario, o delegarse a otros dominios proporcionados mediante una lista en una URL .well-known.

Cómo usar navigator.joinAdInterestGroup()

Este es un ejemplo de cómo podría usarse la API:

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

El objeto interestGroup que se pasa a la función no debe tener más de 50 kiB; de lo contrario, la llamada fallará. El segundo parámetro especifica la duración del grupo de interés, con un límite de 30 días. Las llamadas sucesivas reemplazan los valores almacenados previamente.

Propiedades del grupo de interés

Propiedad Obligatorio Ejemplo Rol
owner Obligatorio 'https://dsp.example' Origen del propietario del grupo de interés.
name Obligatorio 'custom-bikes' Es el nombre del grupo de interés.
biddingLogicUrl** Opcional* 'https://dsp.example/bid/custom-bikes/bid.js' La URL para la licitación de JavaScript se ejecuta en el worklet.
biddingWasmHelperUrl** Opcional* 'https://dsp.example/bid/custom-bikes/bid.wasm' URL del código de WebAssembly proveniente de biddingLogicUrl.
dailyUpdateUrl** Opcional 'https://dsp.example/bid/custom-bikes/update' URL que muestra JSON para actualizar los atributos del grupo de interés. (Consulta Actualiza el grupo de interés).
trustedBiddingSignalsUrl** Opcional 'https://dsp.example/trusted/bidding-signals' URL base para las solicitudes de par clave-valor al servidor de confianza del ofertante.
trustedBiddingSignalsKeys Opcional ['key1', 'key2' ...] Claves para solicitudes al servidor de confianza de par clave-valor.
userBiddingSignals Opcional {...} Metadatos adicionales que puede usar el propietario durante la licitación
ads Opcional* [bikeAd1, bikeAd2, bikeAd3] Anuncios que podrían procesarse para este grupo de interés.
adComponents Opcional [customBike1, customBike2, bikePedal, bikeFrame1, bikeFrame2] Componentes de anuncios compuestos por varios elementos.

* Todas las propiedades son opcionales, excepto owner y name. Las propiedades biddingLogicUrl y ads son opcionales, pero obligatorias para participar en una subasta. Puede haber casos prácticos para crear un grupo de interés sin estas propiedades: por ejemplo, el propietario de un grupo de interés podría agregar un navegador a un grupo de interés para una campaña que todavía no se está publicando, para algún otro uso en el futuro, o que se haya quedado sin presupuesto publicitario de forma temporal.

** Las URLs biddingLogicUrl, biddingWasmHelperUrl, dailyUpdateUrl y trustedBiddingSignalsUrl deben tener el mismo origen que el propietario. Las URLs ads y adComponents no tienen esa restricción.

Actualizar atributos de grupos de interés

dailyUpdateUrl especifica un servidor web que muestra JSON que define las propiedades del grupo de interés, que corresponden al objeto del grupo de interés que se pasó a navigator.joinAdInterestGroup(). Esto proporciona un mecanismo para que el propietario del grupo actualice de forma periódica los atributos del grupo de interés. En la implementación actual, se pueden cambiar los siguientes atributos:

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

Los campos no especificados en el archivo JSON no se reemplazarán (solo se actualizarán los campos especificados en el archivo JSON), mientras que la llamada a navigator.joinAdInterestGroup() reemplaza cualquier grupo de interés existente.

Las actualizaciones se basan en el mejor esfuerzo posible y pueden fallar en las siguientes condiciones: * Se agotó el tiempo de espera de la solicitud de red (actualmente de 30 segundos). * Otra falla de red. * Error de análisis de JSON.

Las actualizaciones también pueden cancelarse si se dedicó demasiado tiempo contiguo a estas actualizaciones, aunque esto no impone ningún límite de frecuencia a las actualizaciones canceladas (restantes). Las actualizaciones tienen un límite de frecuencia de una por día como máximo. Las actualizaciones que fallan debido a errores de red se reintentan después de una hora y las actualizaciones que fallan debido a la desconexión de Internet se reintentan de inmediato cuando se vuelve a conectar.

Actualizaciones manuales

Las actualizaciones de los grupos de interés que pertenecen al origen del marco actual se pueden activar manualmente mediante navigator.updateAdInterestGroups(). El límite de frecuencia evita que las actualizaciones se realicen con demasiada frecuencia: las llamadas repetidas a navigator.updateAdInterestGroups() no realizan ninguna acción hasta que haya transcurrido el período de límite de frecuencia (actualmente un día). El límite de tasa se restablece si se vuelve a llamar a navigator.joinAdInterestGroup() para el mismo grupo de interés owner y name.

Actualizaciones automáticas

Todos los grupos de interés que se cargan para una subasta se actualizan automáticamente después de que se completa una, sujeto a los mismos límites de frecuencia que las actualizaciones manuales. Para cada propietario con al menos un grupo de interés que participa en una subasta, es como si se llamara a navigator.updateAdInterestGroups() desde un iframe cuyo origen coincida con ese propietario.

Cómo especificar anuncios para un grupo de interés

Los objetos ads y adComponents incluyen una URL para la creatividad de un anuncio y, de forma opcional, metadatos arbitrarios que se pueden usar en el momento de la oferta. Por ejemplo:

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

¿Cómo realizan ofertas los compradores?

La secuencia de comandos en biddingLogicUrl que proporciona el propietario de un grupo de interés debe incluir una función generateBid(). Cuando un vendedor de espacio publicitario llama a navigator.runAdAuction(), se llama a la función generatedBid() una vez por cada uno de los grupos de intereses del que forma parte el navegador, si se invita al propietario del grupo de interés a ofertar. En otras palabras, se llama a generateBid() una vez por cada anuncio candidato. El vendedor proporciona una propiedad decisionLogicUrl en el parámetro de configuración de la subasta que se pasa a navigator.runAdAuction(). El código en esta URL debe incluir una función scoreAd(), que se ejecuta para cada ofertante en la subasta, para calificar cada una de las ofertas que muestra generateBid().

La secuencia de comandos en biddingLogicUrl que proporciona un comprador de espacio publicitario debe incluir una función generateBid(). Esta función se llama una vez por cada anuncio candidato. runAdAuction() verifica de forma individual cada anuncio, junto con su oferta y sus metadatos asociados y, luego, le asigna una puntuación numérica de deseabilidad al anuncio.

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

generateBid() toma los siguientes argumentos:

  • interestGroup
    Es el objeto que el comprador del anuncio pasó a joinAdInterestGroup(). (el grupo de interés se puede actualizar a través de dailyUpdateUrl).

  • auctionSignals
    Es una propiedad del argumento auction config que pasa a navigator.runAdAuction() por el vendedor del espacio publicitario. Esto proporciona información sobre el contexto de la página (como el tamaño del anuncio y el ID de publicador), el tipo de subasta (primer precio o segundo precio) y otros metadatos.

  • perBuyerSignals
    Al igual que con auctionSignals, es una propiedad del argumento de configuración de subasta que el vendedor pasa a navigator.runAdAuction(). Esto puede proporcionar indicadores contextuales sobre la página desde el servidor del comprador si el vendedor es una SSP que realiza una llamada de ofertas en tiempo real a los servidores del comprador y canaliza la respuesta, o si la página del publicador se comunica directamente con el servidor del comprador. Si es así, es posible que el comprador desee verificar una firma criptográfica de esos indicadores dentro de generateBid() como protección contra la manipulación.

  • trustedBiddingSignals
    Un objeto cuyas claves son la trustedBiddingSignalsKeys del grupo de interés y cuyos valores se muestran en la solicitud trustedBiddingSignals.

  • browserSignals
    Objeto construido por el navegador, que puede incluir información sobre el contexto de la página (como el hostname de la página actual, que el vendedor podría falsificar) y datos para el grupo de interés (como un registro de cuándo el grupo ganó una subasta antes para permitir la limitación de frecuencia en el dispositivo).

El objeto browserSignals tiene las siguientes propiedades:

{
  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 un valor de bid, el código en generateBid() puede usar las propiedades de los parámetros de la función. Por ejemplo:

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

generateBid() muestra un objeto con cuatro propiedades:

  • ad
    Metadatos arbitrarios sobre el anuncio, como la información que el vendedor espera obtener sobre esta oferta o la creatividad del anuncio. El vendedor](/privacy-sandbox/resources/glossary#ssp) usa esta información en su creatividad de anuncio de subasta y decisión. El vendedor usa esta información en su lógica de subasta y decisión.

  • bid
    Es una oferta numérica que ingresará a la subasta. El vendedor debe estar en una posición que le permita comparar ofertas de diferentes compradores, por lo que las ofertas deben ser en alguna unidad que elija el vendedor (p.ej., "USD por cada mil"). Si la oferta es cero o negativa, este grupo de interés no participará en absoluto en la subasta del vendedor. Con este mecanismo, el comprador puede implementar cualquier regla del anunciante sobre dónde pueden aparecer o no sus anuncios.

  • render
    Es una URL o lista de URLs que se usará para renderizar la creatividad si esta oferta gana la subasta. (Consulta Anuncios compuestos por varias partes en la explicación de la API). El valor debe coincidir con el valor renderUrl de uno de los anuncios definidos para el grupo de interés.

  • adComponents
    Es una lista opcional de hasta 20 componentes para anuncios compuestos por varios elementos, tomada de la propiedad adComponents del argumento de grupo de interés que se pasa a navigator.joinAdInterestGroup().

Solicitar a un navegador que abandone un grupo de interés

El propietario del grupo de interés puede solicitar que se quite un navegador de un grupo de interés. En otras palabras, se le solicita al navegador que quite el grupo de interés de la lista de los miembros de los que es miembro.

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

Si un usuario vuelve al sitio que le solicitó al navegador que agregara un grupo de interés, el propietario del grupo puede llamar a la función navigator.leaveAdInterestGroup() para solicitar al navegador que lo quite. El código de un anuncio también puede llamar a esta función para su grupo de interés.

3. El usuario visita un sitio que vende espacio publicitario

Ilustración de una persona que visita un sitio web de noticias en un navegador en su laptop. El sitio tiene un espacio publicitario vacío.

Luego, el usuario visita un sitio que vende espacios publicitarios; en este ejemplo, un sitio web de noticias. El sitio tiene un inventario de anuncios, que vende de manera programática con ofertas en tiempo real.

4. Se ejecuta una subasta de anuncios en el navegador

Ilustración de una persona viendo un sitio web de noticias en el navegador de su laptop. Se está realizando una subasta de anuncios con la API de Protected Audience.

Sección de explicación: Los vendedores realizan subastas integradas en el dispositivo

Es probable que la SSP del publicador o el propio publicador ejecuten la subasta de anuncios. El propósito de la subasta es seleccionar el anuncio más adecuado para un solo espacio publicitario disponible en la página actual. La subasta tiene en cuenta los grupos de intereses de los que es miembro el navegador, junto con los datos de los compradores de espacios publicitarios y los vendedores de los servicios de par clave-valor.

El vendedor de espacios publicitarios realiza una solicitud al navegador del usuario para iniciar una subasta de anuncios con una llamada a navigator.runAdAuction().

Por ejemplo:

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() muestra una promesa que se resuelve en una URN (urn:uuid:<something>) que representa el resultado de la subasta de anuncios. El navegador solo puede decodificar esto cuando se pasa a un marco vallado para la renderización: la página del publicador no puede inspeccionar el anuncio ganador.

La secuencia de comandos decisionLogicUrl considera cada anuncio individual, junto con su oferta y sus metadatos asociados, uno a la vez, y, luego, le asigna una puntuación de deseabilidad numérica.

auctionConfig propiedades

Propiedad Obligatorio Ejemplo Rol
seller Obligatorio 'https://ssp.example' Origen del vendedor.
decisionLogicUrl Obligatorio 'https://ssp.example/auction-decision-logic.js' URL del archivo JavaScript de la subasta.
trustedScoringSignalsUrl Opcional 'https://ssp.example/scoring-signals' URL del servidor de confianza del vendedor.
interestGroupBuyers* Obligatorio ['https://dsp.example', 'https://buyer2.example', ...] Los orígenes de todos los propietarios de grupos de interés a los que se les pidió ofertar en la subasta.
auctionSignals Opcional {...} Información del vendedor sobre el contexto de la página, el tipo de subasta, etcétera
sellerSignals Opcional {...} Información basada en la configuración del publicador, la realización de una solicitud de anuncio contextual, etcétera.
sellerTimeout Opcional 100 Tiempo de ejecución máximo (ms) de la secuencia de comandos scoreAd() del vendedor.
perBuyerSignals Opcional {'https://dsp.example': {...},
  'https://another-buyer.example': {...},
...}
Indicadores contextuales sobre la página para cada comprador específico, desde su servidor.
perBuyerTimeouts Opcional 50 Tiempo de ejecución máximo (ms) de las secuencias de comandos generateBid() de un comprador específico.
componentAuctions Opcional [{'seller': 'https://www.some-other-ssp.com',
  'decisionLogicUrl': ..., ...},
  ...]
Parámetros de configuración adicionales para subastas de componentes.

* El vendedor puede especificar interestGroupBuyers: '*' para permitir que todos los grupos de intereses oferten. Luego, los anuncios se aceptan o rechazan en función de criterios que no sean la inclusión del propietario del grupo de interés. Por ejemplo, el vendedor puede revisar las creatividades de anuncios para confirmar el cumplimiento de sus políticas.

** additionalBids no es compatible con la implementación actual de Protected Audience. Lee la sección Participantes de la subasta en la explicación de Protected Audience para obtener más información.

¿Cómo se seleccionan los anuncios?

El código en decisionLogicUrl (una propiedad del objeto de configuración de la subasta que se pasa a runAdAuction()) debe incluir una función scoreAd(). Esto se ejecuta una vez por cada anuncio para determinar su conveniencia.

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

scoreAd() acepta los siguientes argumentos: * adMetadata
Metadatos arbitrarios que proporciona el comprador. * bid
Un valor numérico de la oferta. * auctionConfig
El objeto de configuración de la subasta que se pasa a navigator.runAdAuction(). * trustedScoringSignals
Valores recuperados en el momento de la subasta del servidor de confianza del vendedor, que representan la opinión del vendedor sobre el anuncio. * browserSignals
Objeto construido por el navegador, incluida la información que el navegador conoce y que la secuencia de comandos de subasta del vendedor podría 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 de que comience una subasta, el vendedor encuentra el mejor anuncio contextual para el espacio publicitario disponible. Parte de su lógica de scoreAd() es rechazar cualquier anuncio que no pueda superar al ganador contextual.

5. El vendedor y los compradores participantes reciben datos en tiempo real del servicio de par clave-valor.

Ilustración de una persona viendo un sitio web de noticias en el navegador de su laptop. Se lleva a cabo una subasta de anuncios con la API de Protected Audience, en la que un participante obtiene datos del servicio de par clave-valor.

Sección de explicación: Cómo recuperar datos en tiempo real del servicio de par clave-valor de Protected Audience.

Durante una subasta de anuncios, el vendedor de espacio publicitario puede obtener datos en tiempo real sobre creatividades de anuncios específicas si envía una solicitud a un servicio de par clave-valor con la propiedad trustedScoringSignalsUrl del argumento de configuración de subasta pasado a navigator.runAdAuction(), junto con las claves de las propiedades renderUrl de todas las entradas en los campos ads y adComponents de todos los grupos de interés en la subasta.

Del mismo modo, un comprador de espacio publicitario puede solicitar datos en tiempo real del servicio de par clave-valor usando las propiedades trustedBiddingSignalsUrl y trustedBiddingSignalsKeys del argumento del grupo de interés pasado a navigator.joinAdInterestGroup().

Cuando se llama a runAdAuction(), el navegador realiza una solicitud al servidor de confianza de cada comprador de anuncios. La URL de la solicitud podría tener el siguiente aspecto:

https://kv-service.example/getvalues?hostname=publisher.example&keys=key1,key2
  • La URL base proviene de trustedBiddingSignalsUrl.
  • El navegador proporciona el hostname.
  • El valor keys se toma de trustedBiddingSignalsKeys.

La respuesta a esta solicitud es un objeto JSON que proporciona valores para cada una de las claves.

6. Se muestra el anuncio ganador

Ilustración de una persona viendo un sitio web de noticias en el navegador de su laptop. Se muestra un anuncio de una bicicleta (20% de descuento), con un candado en la parte superior para indicar que el anuncio se muestra en un marco vallado.

Sección de explicación: Los navegadores renderizan el anuncio ganador

Como se describió anteriormente, la promesa que muestra runAdAuction() se resuelve en una URN que se pasa a un marco vallado para su renderización, y el sitio muestra el anuncio ganador.

7. Se registra el resultado de la subasta

Sección de explicación: Informes a nivel del evento (por ahora)

El vendedor informa el resultado

Sección de explicación: Informes del vendedor en Render

El código JavaScript del vendedor que se proporciona en decisionLogicUrl (que también proporcionó scoreAd()) puede incluir una función reportResult() para informar el resultado de la subasta.

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

Los argumentos que se pasan a esta función son los siguientes:

  • auctionConfig
    El objeto de configuración de la subasta que se pasa a navigator.runAdAuction().

  • browserSignals
    Es un objeto construido por el navegador que proporciona información sobre la subasta. Por ejemplo:

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

El valor que se muestra de esta función se usa como el argumento de sellerSignals para la función reportWin() del ofertante ganador.

El ofertante ganador informa el resultado

Sección explicativa: Informes de compradores sobre eventos de anuncios y renderizaciones

El JavaScript del ofertante ganador (que también proporcionó generateBid()) puede incluir una función reportWin() para informar el resultado de la subasta.

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

Los argumentos que se pasan a esta función son los siguientes:

  • auctionSignals y perBuyerSignals
    Se pasan los mismos valores a generateBid() para el ofertante ganador.
  • sellerSignals
    Es el valor que se muestra de reportResult(), que le da al vendedor la oportunidad de pasar información al comprador.
  • browserSignals
    Es un objeto construido por el navegador que proporciona información sobre la subasta. Por ejemplo:

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

Implementación temporal de informes de pérdidas o ganancias

Hay dos métodos disponibles temporalmente en Chrome para los informes de subastas:

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

Cada uno de estos métodos toma un solo argumento: una URL para recuperar una vez que se completa la subasta. Se pueden llamar varias veces, tanto en scoreAd() como en generateBid(), con diferentes argumentos de URL.

Chrome solo envía informes de pérdida o victoria de depuración cuando se completa una subasta. Si se cancela una subasta (por ejemplo, debido a una nueva navegación), no se generarán informes.

Estos métodos están disponibles de forma predeterminada en Chrome si chrome://flags/#privacy-sandbox-ads-apis está habilitado. Sin embargo, si ejecutas Chrome con marcas de línea de comandos para habilitar Protected Audience, deberás incluir la marca BiddingAndScoringDebugReportingAPI para habilitar explícitamente los métodos. Si la marca no está habilitada, los métodos seguirán estando disponibles, pero no harán nada.

8. Se informa un clic en el anuncio

Ilustración que muestra a una persona haciendo clic en un anuncio de una bicicleta, dentro de un marco vallado, en un sitio web de noticias, con datos de informes dirigidos a vendedores y compradores.

Se registra un clic en un anuncio renderizado en un marco vallado. Para obtener más información sobre cómo podría funcionar esto, consulta Informes de anuncios de marcos vallados.



En el siguiente diagrama, se describe cada etapa de una subasta de anuncios de Protected Audience:

Ilustración que proporciona una descripción general de cada etapa de una subasta de anuncios de Protected Audience


¿Cuál es la diferencia entre Protected Audience y TURTLEDOVE?

Protected Audience es el primer experimento que se implementa en Chromium dentro de la familia de propuestas TURTLEDOVE.

Protected Audience sigue los principios generales de TURTLEDOVE. Parte de la publicidad en línea se basa en mostrar un anuncio a una persona potencialmente interesada que ya interactuó con el anunciante o la red de publicidad. Históricamente, esto ha funcionado el anunciante reconociendo a una persona específica mientras navega por los sitios web, una preocupación central de privacidad en la web actual.

El esfuerzo de TURTLEDOVE consiste en ofrecer una nueva API para abordar este caso de uso y, al mismo tiempo, ofrecer algunos avances clave en materia de privacidad:

  • El navegador, no el anunciante, contiene la información sobre lo que el anunciante cree que le interesa a una persona.
  • Los anunciantes pueden publicar anuncios en función de un interés, pero no pueden combinarlo con otra información sobre una persona, en particular, quiénes son o qué página visitan.

Protected Audience surgió de TURTLEDOVE y una colección de propuestas de modificaciones relacionadas para ofrecer mejores servicios a los desarrolladores que usarían la API:

  • En SPARROW: Criteo propuso agregar un modelo de servicio (“Gatekeeper”) que se ejecutaba en un entorno de ejecución de confianza (TEE). Protected Audience incluye un uso más limitado de los TEE para la búsqueda de datos en tiempo real y los informes agregados.
  • Las propuestas de TERN de NextRoll y PARRROT de Magnite describieron las diferentes funciones que tenían los compradores y vendedores en la subasta integrada en el dispositivo. El flujo de puntuación/oferta de anuncios de Protected Audience se basa en este trabajo.
  • Las modificaciones de TURTLEDOVE basadas en resultados y a nivel del producto de RTB House mejoraron el modelo de anonimato y las capacidades de personalización de las subastas integradas en el dispositivo.
  • PARAKEET es la propuesta de Microsoft de un servicio de anuncios similar a TURTLEDOVE que se basa en un servidor proxy que se ejecuta en un TEE entre el navegador y los proveedores de tecnología publicitaria para anonimizar las solicitudes de anuncios y aplicar propiedades de privacidad. Protected Audience no adoptó este modelo de proxy. Estamos alineando las APIs de JavaScript para PARAKEET y Protected Audience a fin de respaldar trabajos futuros para combinar aún más las mejores funciones de ambas propuestas.

Protected Audience aún no impide que la red de publicidad de un sitio web aprenda qué anuncios ve una persona. Esperamos modificar la API para que sea más privada con el tiempo.

¿Qué configuración de navegador está disponible?

Los usuarios pueden ajustar su participación en las pruebas de Privacy Sandbox en Chrome habilitando o inhabilitando la configuración de nivel superior en chrome://settings/adPrivacy. Durante las pruebas iniciales, las personas podrán usar este parámetro de configuración de Privacy Sandbox de alto nivel para inhabilitar Protected Audience. Chrome planea permitir que los usuarios vean y administren la lista de grupos de intereses a los que se agregaron en los sitios web que visitaron. Al igual que con las tecnologías de Privacy Sandbox, la configuración del usuario puede evolucionar con los comentarios de los usuarios, los reguladores y otras personas.

Seguiremos actualizando los parámetros de configuración disponibles en Chrome a medida que avance la propuesta de Protected Audience, en función de las pruebas y los comentarios. En el futuro, planeamos ofrecer una configuración más detallada para administrar Protected Audience y los datos asociados.

Los llamadores de la API no pueden acceder a la membresía de grupo cuando los usuarios navegan en modo Incógnito, y la membresía se quita cuando los usuarios borran los datos de su sitio.



Interactúa y comparte comentarios

Cómo obtener asistencia

Para hacer una pregunta sobre tu implementación, sobre la demostración o sobre la documentación: * Abre un problema nuevo en el repositorio de privacy-sandbox-dev-support. Asegúrate de seleccionar la plantilla de problemas para Protected Audience. * Informa un problema en el repositorio de código de demostración en GitHub. * Si tienes preguntas más generales sobre cómo abordar tus casos de uso con la API, informa un problema en el repositorio de propuestas.

Para errores y problemas con la implementación de la API de Protected Audience en Chrome: * Consulta los problemas existentes informados para la API. * Informa un nuevo problema en crbug.com/new.

Mantente al día

Más información


Foto de Ray Hennessy en Unsplash.