¿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.
La API de Protected Audience es una descripción general menos técnica de la propuesta y también tiene un glosario.
En la demostración de Protected Audience, se proporciona una explicación de una implementación básica de FLEDGE.
En el video de demostración de Protected Audience, 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.
¿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ñados 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 elija 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](https://developers.google.cn/static/privacy-sandbox/assets/images/blog/fledgeblog1.png?authuser=5&hl=es)
¿Cómo puedo probar Protected Audience?
Demostración de Protected Audience
En secure-audience-demo.web.app, encontrarás una explicación sobre una implementación básica de Protected Audience en sitios de anunciantes y publicadores.
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
Hay una prueba de origen de relevancia y medición de Privacy Sandbox disponible en Chrome Beta 101.0.4951.26 y versiones posteriores en computadoras para las APIs de Protected Audience, Topics y Attribution Reporting.
Si quieres participar, regístrate para obtener un token de prueba de origen.
Una vez que te hayas inscrito 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 interés 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 la etiqueta <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 código de Protected Audience, como una llamada a navigator.joinAdInterestGroup()
de un propietario de un grupo de interés, deberá proporcionar un token que coincida con su origen.
En los Detalles propuestos de la primera prueba de origen de Protected Audience, se proporcionan más detalles sobre los objetivos de la primera prueba y se explican las funciones compatibles.
Probar esta API
Puedes probar Protected Audience para un solo usuario en Chrome Beta 101.0.4951.26 y versiones posteriores en una computadora de escritorio:
- Habilitando todas las APIs de privacidad en los anuncios de
chrome://settings/adPrivacy
- Estableciendo marcas desde la línea de comandos
Renderiza anuncios en iframes o marcos vallados
Los anuncios se pueden renderizar en <iframe>
o <fencedframe>
, según las marcas que se establezcan.
Si quieres usar <fencedframe>
para renderizar anuncios, haz lo siguiente:
--enable-features=InterestGroupStorage,AdInterestGroupAPI,Fledge,FencedFrames
Si quieres 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 generación de informes de pérdida/adquisición de la depuración.
En Cómo ejecutar Chromium con marcas, se explica cómo configurar marcas cuando se ejecuta 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: Almacenados por el navegador, con metadatos asociados para configurar las ofertas de anuncios y la renderización
- Ofertas en el dispositivo por parte de compradores (DSP o anunciante): Se basan en los grupos de intereses almacenados y los indicadores 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 flexible de los 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 es permitir llamar a joinAdInterestGroup()
desde cualquier parte de una página, incluso desde iframes multidominio. En el futuro, una vez que los propietarios de sitios hayan tenido tiempo de ajustar sus políticas de permisos de iframe multidominio, el plan es inhabilitar las llamadas desde 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 manda que este servidor "no realice registros a nivel de evento ni tenga otros efectos secundarios basados en estas solicitudes".
El código de servicio de 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. Consulta la entrada de blog del anuncio para ver 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 en la explicación 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 de 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 exigir el uso de servicios de par clave-valor de código abierto o TEE hasta algún tiempo después de la baja de las cookies de terceros. Enviaremos una notificación importante a los desarrolladores para que comiencen a realizar pruebas y adopción antes de que se lleve a cabo esta transición.
Cómo detectar la compatibilidad con 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.
¿Cómo pueden los sitios controlar el acceso?
Con el tiempo, Protected Audience requerirá 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 no se aplica 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 relevante para bloquear el acceso.
Existen dos políticas de permisos de Protected Audience que se pueden establecer de forma independiente:
join-ad-interest-group
habilita o inhabilita la funcionalidad para agregar un navegador a los grupos de interésrun-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 si especificas 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 en un iframe, agrega el siguiente atributo allow
a un elemento 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 Protected Audience Propuestos, se proporcionan más detalles.
Rechazo de parte del usuario
Un usuario puede bloquear el acceso a la API de Protected Audience y a 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
. - Para inhabilitar las cookies de terceros en la configuración de Chrome, ve a Configuración > Seguridad y privacidad.
- Configura Cookies y otros datos de sitios en "Bloquear cookies de terceros" o "Bloquear todas las cookies" de
chrome://settings/cookies
. - Usa el modo Incógnito.
En la explicación de Protected Audience, se proporcionan más detalles sobre los elementos de diseño de la API y se describe cómo la API busca cumplir los objetivos de privacidad.
Depura los worklets de Protected Audience
A partir de Chrome Canary 98.0.4718.0, es posible depurar los worklets de Protected Audience en las Herramientas para desarrolladores de Chrome.
El primer paso es establecer los 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 Worklet de subasta de anuncios.](https://developers.google.cn/static/privacy-sandbox/assets/images/blog/screenshot-devtools-f272e7a201571.png?authuser=5&hl=es)
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 habituales o comandos de pasos para acceder a la función de ofertas, puntuación o informes en sí.
Las secuencias de comandos del worklet en vivo 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. Se muestra la secuencia de comandos del trabajo en curso actual que se pausó.](https://developers.google.cn/static/privacy-sandbox/assets/images/blog/screenshot-devtools-chr-49c6b80c72f4a.png?authuser=5&hl=es)
Dado que algunos worklets pueden ejecutarse en paralelo, varios subprocesos pueden terminar en el estado "pausado". Puedes usar la lista de subprocesos para alternar entre subprocesos y reanudarlos o inspeccionarlos con más detalle según corresponda.
Observa los eventos de Protected Audience
En el panel Application de las Herramientas para desarrolladores de Chrome, puedes observar eventos de subasta y grupos de interés de Protected Audience.
Si visitas el sitio de compras de demostración de Protected Audience en un navegador con Protected Audience habilitado, las Herramientas para desarrolladores mostrarán información sobre el evento join
.
![El panel Application 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.](https://developers.google.cn/static/privacy-sandbox/assets/images/blog/the-devtools-applicati-c7168a6021513.png?authuser=5&hl=es)
Ahora, si visitas el sitio del publicador de demostración de Protected Audience en un navegador con Protected Audience habilitado, las Herramientas para desarrolladores mostrará información sobre los eventos bid
y win
.
![El panel Application de las Herramientas para desarrolladores en Chrome Canary, que muestra información sobre los eventos de oferta y ganancia de Protected Audience.](https://developers.google.cn/static/privacy-sandbox/assets/images/blog/the-devtools-applicati-33f68c41ad519.png?authuser=5&hl=es)
¿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 visitando el sitio de un fabricante de bicicletas personalizadas en un navegador con su laptop.](https://developers.google.cn/static/privacy-sandbox/assets/images/blog/illustration-showing-p-7cef347843604.png?authuser=5&hl=es)
Imagina que un usuario visita el sitio web de un fabricante de bicicletas personalizada (en este ejemplo, el anunciante) y pasa algún tiempo en la página del producto de una bicicleta de acero hecha a mano. Esto le brinda al fabricante de bicicletas una oportunidad de remarketing.
2. Se le solicita al navegador del usuario que agregue un grupo de interés
![Ilustración que muestra a una persona mirando un sitio en un navegador con su laptop. El código JavaScript joinAdInterestGroup() se ejecuta en el navegador.](https://developers.google.cn/static/privacy-sandbox/assets/images/blog/illustration-showing-per-8856a700d6569.png?authuser=5&hl=es)
Sección de explicación: Los navegadores registran los grupos de interés
La plataforma orientada a la demanda (DSP) del anunciante (o el propio anunciante) llama a navigator.joinAdInterestGroup()
para pedirle al navegador que agregue un grupo de interés a la lista de grupos a los que pertenece el navegador. 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.
La pertenencia al grupo de interés se almacena en el navegador y en el dispositivo del usuario, y no se comparte con el proveedor del navegador ni ninguna otra persona.
joinAdInterestGroup()
requiere el permiso de:
- El sitio que se está visitando
- El propietario del grupo de interés
Por ejemplo, no debe ser posible que malicious.example
llame a joinAdInterestGroup()
con dsp.example
como propietario sin el permiso de dsp.example
.
Permiso del sitio que se está visitando
Mismo origen: De forma predeterminada, el permiso se otorga de forma implícita para las llamadas joinAdInterestGroup()
que provengan del mismo origen que el sitio visitado, 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()
.
Multiorigen: Llamar a joinAdInterestGroup()
desde orígenes diferentes a los de la página actual
solo puede tener éxito si el sitio que se está visitando estableció una política de permisos que permita 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 de forma implícita cuando se llama a joinAdInterestGroup()
desde un iframe con el mismo origen que el del propietario del grupo de interés. Por ejemplo, un iframe de dsp.example
puede llamar a joinAdInterestGroup()
para los grupos de intereses que son propiedad de dsp.example
.
La propuesta es que joinAdInterestGroup()
pueda ejecutarse en una página o iframe en el dominio del propietario, o bien 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 se podría usar 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 superar los 50 kiB de tamaño; 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 con anterioridad.
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' |
URL para las ofertas de JavaScript ejecutada en worklet. |
biddingWasmHelperUrl ** |
Opcional* | 'https://dsp.example/bid/custom-bikes/bid.wasm' |
URL del código de WebAssembly generado desde biddingLogicUrl . |
dailyUpdateUrl ** |
Opcional | 'https://dsp.example/bid/custom-bikes/update' |
URL que muestra JSON para actualizar los atributos del grupo de interés. (Consulta Actualizar el grupo de interés). |
trustedBiddingSignalsUrl ** |
Opcional | 'https://dsp.example/trusted/bidding-signals' |
URL base para las solicitudes de pares 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 el propietario puede usar durante la licitación |
ads |
Opcional* | [bikeAd1, bikeAd2, bikeAd3] |
Anuncios que se podrían renderizar para este grupo de interés. |
adComponents |
Opcional | [customBike1, customBike2, bikePedal, bikeFrame1, bikeFrame2] |
Componentes para anuncios compuestos por varios elementos. |
* Todas las propiedades son opcionales, excepto owner
y name
. Las propiedades biddingLogicUrl
y ads
son opcionales, pero se requieren para participar en una subasta. Puede haber casos de uso 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 aún no se publica o para algún otro uso futuro, o es posible que se quedó temporalmente sin presupuesto publicitario.
** 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 los atributos del grupo de interés
dailyUpdateUrl
especifica un servidor web que muestra JSON que define las propiedades del grupo de interés, según el objeto del grupo de interés que se pasa a navigator.joinAdInterestGroup()
. Esto proporciona un mecanismo para que el propietario del grupo actualice periódicamente los atributos del grupo de interés. En la implementación actual, se pueden cambiar los siguientes atributos:
biddingLogicUrl
biddingWasmHelperUrl
trustedBiddingSignalsUrl
trustedBiddingSignalsKeys
ads
priority
Cualquier campo no especificado en el JSON no se reemplazará (solo se actualizarán los campos especificados en el JSON), mientras que llamar a navigator.joinAdInterestGroup()
reemplaza cualquier grupo de interés existente.
Las actualizaciones se realizan mediante el mejor esfuerzo y pueden fallar en las siguientes condiciones:
- Tiempo de espera de la solicitud de red (actualmente, 30 segundos).
- Otra falla de la red.
- Error de análisis de JSON.
Las actualizaciones también se pueden cancelar si se dedicó demasiado tiempo contiguo a la actualización, 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. 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 tras una reconexión.
Actualizaciones manuales
Las actualizaciones de los grupos de intereses que pertenecen al origen del fotograma 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 finalice el período de límite de frecuencia (actualmente, un día). El límite de frecuencia 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 intereses cargados para una subasta se actualizan automáticamente después de que esta finaliza, sujetos 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 una creatividad de anuncio y, de manera 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 ofertan 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 espacios publicitarios llama a navigator.runAdAuction()
, se llama a la función generatedBid()
una vez para cada uno de los grupos de intereses a los que pertenece el navegador, si se invita al propietario del grupo de interés a ofertar. En otras palabras, se llama a generateBid()
una vez para 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 de esta URL debe incluir una función scoreAd()
, que se ejecuta para cada ofertante en la subasta, a fin de 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 para cada anuncio candidato. runAdAuction()
verifica de forma individual cada anuncio, junto con su oferta y metadatos asociados, y, luego, le asigna una puntuación de deseabilidad numérica.
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ó ajoinAdInterestGroup()
. (El grupo de interés se puede actualizar a través dedailyUpdateUrl
).auctionSignals
Es una propiedad del argumento auction config que el vendedor del espacio publicitario pasa alnavigator.runAdAuction()
. 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 conauctionSignals
, es una propiedad del argumento de la configuración de subasta que el vendedor pasa anavigator.runAdAuction()
. Esto puede proporcionar indicadores contextuales sobre la página del 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
Objeto cuyas claves son lastrustedBiddingSignalsKeys
del grupo de interés y cuyos valores se muestran en la solicitudtrustedBiddingSignals
.browserSignals
Un objeto construido por el navegador, que puede incluir información sobre el contexto de la página (como elhostname
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 anteriormente 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 la creatividad del 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á en la subasta. El vendedor debe estar en posición de comparar las ofertas de diferentes compradores; por lo tanto, las ofertas deben tener alguna unidad elegida por el vendedor (p.ej., "USD por cada mil"). Si la oferta es cero o negativa, este grupo de interés no participará en la subasta del vendedor. Con este mecanismo, el comprador puede implementar cualquier regla del anunciante que indique dónde pueden aparecer o no sus anuncios.render
Es una URL o una 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 elrenderUrl
de uno de los anuncios definidos para el grupo de interés.adComponents
Una lista opcional de hasta 20 componentes para anuncios compuestos por varias partes, tomada de la propiedadadComponents
del argumento del grupo de interés que se pasa anavigator.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 solicita al navegador que quite el grupo de interés de la lista de aquellos a los que pertenece.
navigator.leaveAdInterestGroup({
owner: 'https://dsp.example',
name: 'custom-bikes'
});
Si un usuario regresa al sitio que le pidió al navegador que agregara un grupo de interés, el propietario del grupo de interés puede llamar a la función navigator.leaveAdInterestGroup()
para solicitar al navegador que quite el grupo de interés.
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 que muestra a una persona visitando un sitio web de noticias en un navegador con su laptop. El sitio
tiene un espacio publicitario vacío.](https://developers.google.cn/static/privacy-sandbox/assets/images/blog/illustration-showing-per-113f3bd8c69da.png?authuser=5&hl=es)
Más tarde, el usuario visita un sitio que vende espacio publicitario; en este ejemplo, un sitio web de noticias. El sitio tiene inventario de anuncios, que se vende de manera programática con ofertas en tiempo real.
4. Se ejecuta una subasta de anuncios en el navegador.
![Ilustración que muestra a una persona mirando un sitio web de noticias en un navegador con su laptop. Se está realizando una subasta de anuncios con la API de Protected Audience.](https://developers.google.cn/static/privacy-sandbox/assets/images/blog/illustration-showing-per-43194d760936b.png?authuser=5&hl=es)
Sección de explicación: Los vendedores ejecutan 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 a los que pertenece el navegador, junto con los datos de los compradores de espacios publicitarios y los vendedores de los servicios de par clave-valor.
El vendedor del espacio publicitario llama a navigator.runAdAuction()
para realizar una solicitud al navegador del usuario para iniciar una subasta de anuncios.
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 un URN (urn:uuid:<something>
) que representa el resultado de la subasta de anuncios. El navegador solo puede decodificarlo cuando se pasa a un marco vallado para su 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 worklet de subasta en JavaScript. |
trustedScoringSignalsUrl |
Opcional | 'https://ssp.example/scoring-signals' |
URL del servidor de confianza del vendedor. |
interestGroupBuyers* |
Obligatorio | ['https://dsp.example', 'https://buyer2.example', ...] |
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': {...}, |
Indicadores contextuales sobre la página de 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', |
Configuraciones adicionales para las subastas de componentes. |
* El vendedor puede especificar interestGroupBuyers: '*'
para permitir que todos los grupos de interés oferten.
Los anuncios se aceptan o rechazan según criterios distintos de la inclusión del propietario del grupo de interés.
Por ejemplo, el vendedor puede revisar las creatividades de los anuncios para confirmar el cumplimiento de sus políticas.
** No se admite additionalBids
en la implementación actual de Protected Audience. Para obtener más información, lee la sección Participantes de la subasta en la explicación de Protected Audience.
¿Cómo se seleccionan los anuncios?
El código en decisionLogicUrl
(una propiedad del objeto de configuración de subasta que se pasa a runAdAuction()
) debe incluir una función scoreAd()
. Se publica una vez por cada anuncio
para determinar su conveniencia.
scoreAd(adMetadata, bid, auctionConfig, trustedScoringSignals, browserSignals) {
...
return desirabilityScoreForThisAd;
}
scoreAd()
toma los siguientes argumentos:
adMetadata
Metadatos arbitrarios que proporciona el comprador.bid
Es un valor numérico de la oferta.auctionConfig
El objeto de configuración de la subasta que se pasa anavigator.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 este conoce y que la secuencia de comandos de subasta del vendedor podría 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()
consiste en 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 que muestra a una persona mirando un sitio web de noticias en un navegador con su laptop. Se está llevando a cabo una subasta de anuncios con la API de Protected Audience, y un participante obtiene datos del servicio de par clave-valor.](https://developers.google.cn/static/privacy-sandbox/assets/images/blog/illustration-showing-per-d80920d3014fe.png?authuser=5&hl=es)
Sección de explicación: Recupera datos en tiempo real del servicio de par clave-valor de Protected Audience.
Durante una subasta de anuncios, el vendedor del espacio publicitario puede obtener datos en tiempo real sobre creatividades de anuncios específicas. Para ello, realiza 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 del espacio publicitario puede solicitar datos en tiempo real del servicio de par clave-valor mediante las propiedades trustedBiddingSignalsUrl
y trustedBiddingSignalsKeys
del argumento del grupo de interés que se pasa a navigator.joinAdInterestGroup()
.
Cuando se llama a runAdAuction()
, el navegador realiza una solicitud al servidor de confianza de cada comprador de anuncios. Es posible que la URL de la solicitud se vea de la siguiente manera:
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 obtiene detrustedBiddingSignalsKeys
.
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 que muestra a una persona mirando un sitio web de noticias en un navegador con su laptop. Se muestra un anuncio de bicicleta (20% de descuento), con un candado arriba para indicar que el anuncio aparece en un marco vallado.](https://developers.google.cn/static/privacy-sandbox/assets/images/blog/illustration-showing-per-54028ccec709f.png?authuser=5&hl=es)
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 informa 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 de vendedores sobre el procesamiento
El 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 anavigator.runAdAuction()
.browserSignals
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 sellerSignals
de la función reportWin()
del ofertante ganador.
Resultado de los informes del ofertante ganador
Sección de explicación: Informes de compradores sobre el procesamiento y los eventos de anuncios
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
yperBuyerSignals
Se pasan los mismos valores agenerateBid()
para el ofertante ganador.sellerSignals
El valor que se muestra dereportResult()
, que le da al vendedor la oportunidad de pasar información al comprador.browserSignals
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 de informes de pérdida/adquisición temporales
Hay dos métodos disponibles temporalmente en Chrome para los informes de subastas:
forDebuggingOnly.reportAdAuctionLoss()
forDebuggingOnly.reportAdAuctionWin()
Cada uno de estos métodos tiene un solo argumento: una URL para recuperar después de que se complete la subasta. Se pueden llamar varias veces, en scoreAd()
y generateBid()
, con diferentes argumentos de URL.
Chrome solo envía informes de pérdida/adquisición de depuración cuando se completa una subasta. Si se cancela una subasta (por ejemplo, debido a una navegación nueva), no se generarán informes.
Estos métodos están disponibles de forma predeterminada en Chrome. Para poder probar los métodos, habilita todas las APIs de privacidad en los anuncios que se encuentran en chrome://settings/adPrivacy
. Si ejecutas Chrome con marcas de línea de comandos para habilitar Protected Audience, deberás habilitar explícitamente los métodos incluyendo la marca BiddingAndScoringDebugReportingAPI
. Si la marca no está habilitada, los métodos seguirán estando disponibles, pero no harán nada.
8. Se registra un clic en el anuncio
![Ilustración que muestra a una persona que hace clic en el anuncio de una bicicleta, dentro de un marco cercado, en un sitio web de noticias. Los datos del informe se envían al vendedor y a los compradores.](https://developers.google.cn/static/privacy-sandbox/assets/images/blog/illustration-showing-p-0332a635e2724.png?authuser=5&hl=es)
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](https://developers.google.cn/static/privacy-sandbox/assets/images/blog/illustration-providing-fda431ab192ee.png?authuser=5&hl=es)
¿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 de alto nivel de TURTLEDOVE. Parte de la publicidad en línea se basa en mostrar un anuncio a un usuario potencialmente interesado que ya interactuó con el anunciante o la red de publicidad. Históricamente, el anunciante reconoce a una persona específica mientras navega por los sitios web, una preocupación de privacidad principal en la Web actual.
El objetivo de TURTLEDOVE es 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, conserva 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 combinar ese interés con otro tipo de información sobre una persona, en particular, quién es o qué página visita.
Protected Audience surgió de TURTLEDOVE y una colección de propuestas relacionadas de modificaciones para brindar un mejor servicio a los desarrolladores que usarían la API:
- En SPARROW, Criteo propuso agregar un modelo de servicio (“Gatekeeper”) que se ejecuta en un entorno de ejecución confiable (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 TERN de NextRoll y PARRROT de Magnite describieron los diferentes roles que tenían los compradores y vendedores en la subasta integrada en el dispositivo. El flujo de ofertas y puntuación de anuncios de Protected Audience se basa en este trabajo.
- Las modificaciones TURTLEDOVE basadas en resultados y a nivel del producto de RTB House mejoraron el modelo de anonimato y las capacidades de personalización de la subasta integrada en el dispositivo
- PARAKEET es la propuesta de Microsoft para 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 AdTech para anonimizar solicitudes de anuncios y aplicar propiedades de privacidad. Protected Audience no adoptó este modelo de proxy. Alineamos las APIs de JavaScript para PARAKEET y Protected Audience, a fin de colaborar con futuros trabajos 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 sepa qué anuncios ve una persona. Esperamos modificar la API para que sea más privada con el paso del tiempo.
¿Qué configuración del navegador está disponible?
Para ajustar su participación en las pruebas de Privacy Sandbox en Chrome, los usuarios pueden habilitar o inhabilitar 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 a los usuarios ver y administrar 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 de los usuarios 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 parámetros de configuración más detallados para administrar Protected Audience y los datos asociados.
Los llamadores de la API no pueden acceder a la membresía de un grupo cuando los usuarios navegan en el modo Incógnito y la membresía se quita cuando los usuarios borran los datos de su sitio.
Interactúa y comparte tus comentarios
- GitHub: Lee la propuesta, genera preguntas y sigue el debate.
- W3C: Analiza los casos de uso del sector en el Improving Web Advertising Business Group.
- Asistencia para desarrolladores: Haz preguntas y únete a debates en el repositorio de asistencia para desarrolladores de Privacy Sandbox.
- Lista de distribución de FLEDGE: fledge-api-announce proporciona anuncios y actualizaciones sobre la API.
- Únete a las llamadas programadas de Protected Audience (cada dos semanas). Todos son bienvenidos. Si quieres participar, primero asegúrate de unirte al WICG. Puedes participar activamente o simplemente escuchar.
- Usa el formulario de comentarios de Privacy Sandbox para compartir comentarios de forma privada con el equipo de Chrome fuera de los foros públicos.
Obtenga asistencia
Para hacer preguntas sobre tu implementación, sobre la demostración o la documentación, haz lo siguiente:
- Abre un problema nuevo en el repositorio privacy-sandbox-dev-support. Asegúrate de seleccionar la plantilla de problemas de Protected Audience.
- Informa un problema en el repositorio del 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, haz lo siguiente: * Consulta los problemas existentes informados para la API. * Informa un problema nuevo en crbug.com/new.
Mantente al día
- Para recibir notificaciones sobre los cambios de estado en la API, únete a la lista de distribución para desarrolladores.
- Para seguir de cerca todos los debates en curso de la API, haz clic en el botón Mirar en la página de propuestas en GitHub. Para ello, debes tener o crear una cuenta de GitHub.
- Para obtener actualizaciones generales sobre Privacy Sandbox, suscríbete al feed RSS [Progreso en Privacy Sandbox].
Más información
- API de Protected Audience: Descripción general menos técnica de la propuesta.
- Demostración de Protected Audience: Explicación de una implementación básica de Protected Audience.
- Video de demostración de Protected Audience: Se explica 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.
- Explicación técnica de la API de Protected Audience
- Profundización en Privacy Sandbox
- Intención de crear un prototipo
Foto de Ray Hennessy en Unsplash.