[Beta] API Server-to-Server (S2S) para atribución web

En resumen: La API S2S para atribución web te permite enviar visitas web y eventos a AppsFlyer directamente desde tu servidor, evitando las limitaciones del navegador, como los bloqueadores de anuncios y las restricciones de las cookies. Utilízalo junto con el SDK web o de forma independiente para obtener datos de atribución más completos y de mayor calidad.

Sobre la API S2S para la atribución web

AppsFlyer admite dos formas de enviar datos web para la atribución: el SDK web (del lado del cliente) y la API S2S (server-to-server, o S2S). Puedes utilizar cualquiera de los dos métodos de forma independiente, o combinarlos según tu configuración y necesidades.

El SDK web se ejecuta en el navegador. La API S2S te permite enviar los mismos datos desde tu propio backend. Por qué es importante: los navegadores centrados en la privacidad y los bloqueadores de anuncios, incluidos Safari ITP, Firefox ETP y Brave, pueden bloquear o limitar la medición del lado del cliente. Según estimaciones del sector, entre el 25% y el 40% de los usuarios de internet utilizan bloqueos a nivel de navegador. Dado que las llamadas S2S se originan en tu servidor y nunca pasan por el navegador, no se ven afectadas en absoluto por estas restricciones.

Cómo funciona

  1. Un usuario visita tu sitio web o activa un evento en el navegador.
  2. Tu servidor recibe el evento.
  3. Tu servidor envía el evento directamente al servidor de AppsFlyer para su atribución.

¿Por qué usar S2S?

Aquí te explicamos qué significa para ti usar la API S2S, desglosado por beneficio:

  • Medir eventos del lado del servidor: Algunas conversiones nunca pasan por el navegador, por ejemplo, las renovaciones de suscripciones procesadas en el backend o los eventos que se originan en un sistema CRM. S2S es la única forma de incorporarlos a AppsFlyer y vincularlos a la campaña correcta.
  • Mayor cobertura de medición: Las llamadas S2S provienen de tu servidor, no del navegador, por lo que los bloqueadores de anuncios, los límites de cookies de Safari ITP y otras restricciones a nivel del navegador no se aplican. Puedes registrar visitas y conversiones que la medición del lado del cliente por sí sola no detectaría.
  • Enriquecimiento de datos desde el backend: Con S2S, tu servidor puede agregar datos adicionales a los eventos antes de enviarlos, incluidos los Customer User IDs, el correo electrónico o el teléfono cifrados, los atributos de CRM, el estado de la suscripción o cualquier identificador interno. Esto mejora la resolución de identidades y fortalece la calidad de la señal.
  • Seguridad: Las claves de desarrollador, los identificadores de usuario y cualquier dato adicional permanecen en tu servidor y se envían a través de una conexión segura, lo que te brinda un control total sobre lo que sale de tu infraestructura.

Especificación de la API

URL base: https://events.appsflyer.com

Autenticación

Todas las solicitudes deben incluir un token de API S2S válido y el tipo de contenido correcto en los encabezados de la solicitud.

Encabezado Tipo Descripción
Authorization Token API

Tu token de API S2S se incluye en el encabezado con el siguiente formato:

Authorization: Bearer {s2s-token}
Content-Type string Debe ser application/json. Obligatorio en todas las solicitudes.

Nota

Para crear un token de API S2S, consulta las instrucciones en Gestión de tokens de AppsFlyer .

Medir un evento

POST /v2.0/s2s/inapps/app/web/{appId}

Mide un evento web (por ejemplo, una compra, un registro o una acción personalizado) para una aplicación determinada.

Parámetros de ruta

Parámetro Requerido Descripción
appId Requerido El unified_app_id según se define en AppsFlyer. Por ejemplo: website-www.example.com

Cuerpo de la solicitud

Campo Tipo Requerido Descripción
user_id object Requerido Identificador de usuario. Debe contener al menos uno de los siguientes: customer_user_id o appsflyer_id.
event_name string Requerido Nombre del evento. Entre 1 y 64 caracteres. No puede contener @ = + -. Ejemplo: af_purchase
event_revenue number (double) Opcional Importe de los ingresos por eventos de compra o monetización.
event_revenue_currency string (ISO-4217) Opcional Código de moneda para el valor de los ingresos. Por ejemplo, USD o EUR.
event_value object Opcional Parámetros de evento de formato libre. Admite un subobjeto custom_parameters.
event_url string Opcional URL de la página donde ocurrió el evento. URL HTTP válida, máximo 4.096 caracteres.
timestamp integer (int64) Opcional Hora Unix en ms (UTC). Si se omite, AppsFlyer utiliza la hora de recepción. Período de aceptación tardía: los eventos deben llegar como máximo a las 00:30 del siguiente día natural según la zona horaria de la app.
ip string Opcional Dirección IP del dispositivo (IPv4 o IPv6). Máximo 46 caracteres.
user_agent string Opcional Cadena completa del agente de usuario del navegador. Máximo 1.024 caracteres.
http_referrer string Opcional URL de referencia de la página actual.
customer_dedup_id string Opcional Identificador de deduplicación proporcionado por el cliente.
email_hashed string Opcional SHA256 del correo electrónico normalizado (en minúsculas, recortado). Debe ser una cadena hexadecimal de 64 caracteres.
phone_number_hashed string Opcional SHA256 del número de teléfono. Debe ser una cadena hexadecimal de 64 caracteres.
phone_number_e164_hashed string Opcional SHA256 del número de teléfono E.164 (por ejemplo, +14155552671). Debe ser una cadena hexadecimal de 64 caracteres.
first_name_hashed string Opcional SHA256 del nombre de pila normalizado. Debe ser una cadena hexadecimal de 64 caracteres.
last_name_hashed string Opcional SHA256 del apellido normalizado. Debe ser una cadena hexadecimal de 64 caracteres.

Ejemplo de solicitud

{"user_id":{"customer_user_id":"15667737-366d-4994-ac8b-653fe6b2be4a"},"event_name":"af_purchase","event_revenue":49.99,"event_revenue_currency":"USD","event_value":{"af_content_id":"SKU-001","af_quantity":2,"custom_parameters":{"promo_code":"SUMMER10"}},"event_url":"https://example.com/checkout/success","timestamp":1712000000000,"ip":"35.244.183.10","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) ...","email_hashed":"a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2"}

Respuestas

Estado Descripción
202 Aceptado Solicitud aceptada. Devuelve el estado, el mensaje y de forma opcional, messageId.
Solicitud incorrecta Campos no válidos o faltantes.
401 No autorizado La aplicación no existe o la autenticación falló.
403 Prohibido Todo el tráfico está bloqueado.
415 Tipo de medio no compatible. Content-Type debe ser application/json.

Medir una visita

POST /v2.0/s2s/visits/app/web/{appId}

Mide la frecuencia de las visitas a una página web en una aplicación web determinada. Este punto final comparte todos los campos base con el endpoint del evento, con dos diferencias clave: event_url es obligatorio, y los campos de nombre del evento e ingresos no se aplican.

Parámetros de ruta

Parámetro Requerido Descripción
appId Requerido El unified_app_id según se define en AppsFlyer. Por ejemplo: website-www.example.com

Cuerpo de la solicitud

Campo Tipo Requerido Descripción
user_id object Requerido Identificador de usuario. Debe contener al menos uno de los siguientes: customer_user_id o appsflyer_id.
event_url string Requerido La URL de la página visitada. URL HTTP válida, máximo 4.096 caracteres.
timestamp integer (int64) Opcional Hora Unix en ms (UTC). Si se omite, AppsFlyer utiliza la hora de recepción. Período de aceptación tardía: los eventos deben llegar como máximo a las 00:30 del siguiente día natural según la zona horaria de la aplicación.
ip string Opcional Dirección IP del dispositivo (IPv4 o IPv6). Máximo 46 caracteres.
user_agent string Opcional Cadena completa del agente de usuario del navegador. Máximo 1.024 caracteres.
http_referrer string Opcional URL de referencia de la página actual.
event_value object Opcional Parámetros de evento de formato libre, incluyendo un subobjeto custom_parameters.
customer_dedup_id string Opcional Identificador de deduplicación proporcionado por el cliente.
email_hashed string Opcional SHA256 del correo electrónico normalizado. Debe ser una cadena hexadecimal de 64 caracteres.
phone_number_hashed string Opcional SHA256 del número de teléfono. Debe ser una cadena hexadecimal de 64 caracteres.
phone_number_e164_hashed string Opcional SHA256 del número de teléfono E.164. Debe ser una cadena hexadecimal de 64 caracteres.
first_name_hashed string Opcional SHA256 del nombre de pila normalizado. Debe ser una cadena hexadecimal de 64 caracteres.
last_name_hashed string Opcional SHA256 del apellido normalizado. Debe ser una cadena hexadecimal de 64 caracteres.

Ejemplo de solicitud

{"user_id":{"appsflyer_id":"1234567890abcdef","customer_user_id":"15667737-366d-4994-ac8b-653fe6b2be4a"},"event_url":"https://example.com/products/sneakers","timestamp":1712000000000,"ip":"35.244.183.10","user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...","http_referrer":"https://www.google.com/","email_hashed":"a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2"}

Respuestas

Estado Descripción
202 Aceptado Solicitud aceptada. Devuelve el estado, el mensaje y de forma opcional, messageId.
Solicitud incorrecta Campos no válidos o faltantes.
401 No autorizado La aplicación no existe o la autenticación falló.
403 Prohibido Todo el tráfico está bloqueado.
415 Tipo de medio no compatible. Content-Type debe ser application/json.

Configurar una integración completamente del lado del servidor.

Si está en funcionamiento el SDK web junto con S2S, utiliza la opción Extraer el afUserID del SDK web en su lugar. Esta sección es solo para integraciones sin ningún SDK.

Si no estás ejecutando el SDK web en tu sitio, eres responsable de todo lo que normalmente gestionarías: asignar la cookie del usuario, enviar los identificadores correctos y mantener completa la carga útil de cada evento. Si se hace correctamente, esta configuración te brinda todos los beneficios descritos en por qué usar S2S, pero depende de que estos detalles se aclaren.

Envía visitas, no solo eventos.

Una visita conlleva los parámetros de atribución en los que se basa cada evento posterior, y el sistema espera una visita antes de cualquier evento por parte de un usuario. Si envías un evento antes de una visita, el sistema lo clasifica como orgánico.

Asignar una cookie de origen a través de HTTP

Como no hay un Web SDK que establezca la cookie afUserId por ti, debes asignarla y gestionarla tú mismo como una cookie HTTP configurada en el encabezado de respuesta Set-Cookie, no como una cookie del lado del cliente creada con JavaScript.

Por qué es importante: una cookie del lado del cliente (establecida a través de document.cookie) caduca rápidamente, en tan solo 7 días en Safari o en 24 horas en dominios bajo ITP. Una vez que caduca, el identificador se restablece y un visitante recurrente aparece como nuevo. Una cookie que establece su servidor no está sujeta a ese límite y puede persistir hasta el máximo permitido por el navegador (Chrome permite hasta 400 días). También se puede marcar HttpOnly, por lo que los scripts de la página y los bloqueadores de anuncios no pueden leerlo ni eliminarlo, y no depende de ningún script en la página.

Para configurarlo y leerlo:

  1. Ante la primera solicitud de un visitante sin cookies, genere un ID único y estable en su servidor (por ejemplo, un UUID).
  2. Devuélvelo en una cookie de first-party:

    Set-Cookie: af_web_id=<generated-id>; Max-Age=34128000; Path=/; Secure; HttpOnly; SameSite=Lax
  3. En todas las solicitudes posteriores, lee el valor del encabezado Cookie entrante y reutilízalo. No lo regeneres.
  4. Envía ese valor a AppsFlyer en cada llamada como appsflyer_id dentro de la solicitud objeto user_id.

Puedes nombrar la cookie como quieras; AppsFlyer lee el valor que envías, no el nombre de la cookie. Asegúrate de configurarlo desde tu propio dominio de first-party.

Envía los identificadores correctos en cada llamada.

Cada llamada requiere un objeto user_id con al menos uno de estos identificadores: appsflyer_id (el valor de la cookie) o customer_user_id (tu ID de usuario interno). Enviar ambos documentos, cuando se tienen, mejora la resolución de identidades.

Ten en cuenta: las visitas son mayoritariamente anónimas, así que envía siempre el valor de la cookie. En el caso de los eventos on-site, añade customer_user_id una vez que se identifique al usuario y sigue enviando la cookie junto con ese identificador. Para los eventos que no se originan en el navegador, basta con customer_user_id, siempre que AppsFlyer ya conozca a ese usuario gracias a una sesión identificada anterior.

Debes tener en cuenta:

Identificación de usuario

El objeto user_id es obligatorio en cada solicitud. Se debe proporcionar al menos uno de los siguientes identificadores.

Campo Tipo Descripción
customer_user_id string (1–64 caracteres) Tu identificador de usuario interno, tal como está configurado en tu sistema.
appsflyer_id string (mínimo 1 carácter) Identificador interno de AppsFlyer para el usuario web. Si utilizas el SDK web de AppsFlyer , el valor appsflyer_id se obtiene de la cookie del SDK web. Extraerlo de afUserId. Consulta Extraer el afUserID del SDK web

Ventanas de aceptación tardía

Los eventos y las visitas deben recibirse a más tardar a las 00:30 del siguiente día calendario, según la zona horaria de la aplicación. Los eventos tardíos se rigen por el tiempo de recepción del servidor.

Campos PII cifrados

Todos los campos de datos personales deben ser sometidos a un hash SHA256 antes de su envío. Normaliza el texto (minúsculas, recortado) antes de aplicar el cifrado (hash). Cada hash debe tener exactamente 64 caracteres hexadecimales (sin distinción entre mayúsculas y minúsculas).

  • Patrón para todos los campos hash: ^[a-fA-F0-9]{64}$
  • Números de teléfono que utilizan el campo phone_number_e164_hashed debe ajustarse al formato E.164 (por ejemplo,+14155552671 ) antes del hash.

Extraer el afUserID del SDK web

  • El parámetro afUserId es un identificador único que el SDK web establece cuando un usuario visita tu sitio por primera vez.
  • Si necesitas afUserId, utiliza uno de los métodos que se indican a continuación.

Obtener afUserId del encabezado de la cookie HTTP

  • El navegador del visitante envía afUserId en las solicitudes a tu sitio.
  • Si es necesario, extráelo del encabezado de la cookie HTTP.

Ver afUserId en el navegador del visitante

  • Consulta afUserId en el navegador del visitante para solucionar problemas y realizar tareas de depuración.
  • Para que esté disponible, el visitante debe haber visitado al menos una vez una página que utilice el SDK web.
  • La cookie que contiene afUserId es una cookie propia de tu dominio.
  • El siguiente procedimiento se preparó con Chrome 81. Puede haber diferencias entre navegadores y sistemas operativos.

Para obtener el afUserId del navegador del visitante:

  1. En el navegador, ve a tu sitio web.
  2. Haz clic con el botón derecho y selecciona Inspeccionar. Se abre la ventana de herramientas para desarrolladores del navegador.
  3. Ve a la pestaña (A) Aplicación.
  4. En el menú lateral, (B) expande Cookies.
  5. Selecciona tu sitio web. Si no aparece, actualiza el navegador.
  6. En el (C) filtro, introduce afUserId. Se muestra el valor de afUserID.