API de eventos de servidor a servidor para móviles (S2S móvil)

De un vistazo: Los eventos de Servidor a Servidor (S2S) para la API móvil envían los eventos que ocurren fuera de la aplicación a AppsFlyer. Los eventos de S2S se atribuyen de manera similar a los eventos del SDK y están disponibles en toda la plataforma.  

S2S_us-en.png

API de eventos de servidor a servidor para móviles

La plataforma de AppsFlyer atribuye y registra los eventos de aplicaciones móviles enviados por el SDK de AppsFlyer y por las API. Utiliza la API de S2S para reportar eventos que tienen lugar fuera de la aplicación; por ejemplo, un usuario renueva su suscripción usando tu interfaz web. Los eventos de S2S, una vez registrados, están disponibles a través de la plataforma, incluidos los paneles de control, el raw data y el análisis. Para los eventos web de la PBA, consulta S2S web para la PBA.

AppsFlyer rellena los eventos de S2S con:

  • Los valores enviados en el mensaje S2S
  • Algunos valores de atribución de la instalación de AppsFlyer, como la fecha y hora de instalación y la fuente de medios.

Instrucciones de uso de la API

Crea tu llamada de API usando la información contenida en las secciones a continuación. 

Datos de la API de S2S

Punto de conexión API

https://api2.appsflyer.com/inappevent/app_id

  • app_id: identificador de la aplicación utilizado en el panel de control de AppsFlyer. Insértalo exactamente como aparece en el panel de control.
  • Aplicaciones iOS: asegúrate de agregar el prefijo id.  De lo contrario, se obtiene un código de retorno válido de 200 OK, pero el evento no se registra.
  • Windows: obtén el ID de aplicación en la tienda de aplicaciones de Microsoft.
  • Ejemplo de Android: https://api2.appsflyer.com/inappevent/com.appsflyer.myapp
    iOS:https://api2.appsflyer.com/inappevent/id123456789
    Windows:https://api2.appsflyer.com/inappevent/a1b2c3d4e5f6
Método HTTP POST
Tipo de contenido aceptado application/json
Autorización

--header 'authentication: dev_key'

  • dev_key es el token de autenticación en el encabezado. 
  • Para obtener la clave de desarrollador, en AppsFlyer ve a, Configuración de la aplicación > Clave de desarrollador
Agregar servidores a la lista de permitidos para obtener mensajes de respuesta

Agrega a lista de permitidos el rango de direcciones IP de AWS para obtener mensajes de respuesta si tus servidores se encuentran detrás de un firewall. 

Limitación de la carga útil de JSON 

Tamaño de la carga útil de JSON: hasta 1 KB

Limitación de velocidad

Volumen de limitación de POST: 60 000 POST por minuto. Para aumentar este límite, contacta a tu CSM.

Instrucciones de codificación
Codificar las URL

Codifica (porcentaje) los caracteres reservados para código (https://tools.ietf.org/html/rfc3986#section-2.1) antes de formar la URL del método. 

TLS

Usa TLS 1.2 o superior. Cifrados compatibles

Datos de la API de S2S

Parámetros de la carga útil

  • Los parámetros de la carga útil consisten en uno o más identificadores de dispositivo (dependiendo del sistema operativo).
  • ¿Qué sucede si no puedo enviar un identificador de dispositivo?
    • Es posible que no puedas enviar el identificador por una razón fuera de tu control, por ejemplo, porque el usuario tiene el rastreo de anuncios limitado (LAT) o porque utiliza el iOS 14 y no dio su consentimiento para ATT (no IDFA).
    • Si este es el caso, ten en cuenta que no enviar un ID de publicidad/identificador de dispositivo puede causar un fallo de atribución, lo que significa que AppsFlyer no puede atribuir el evento a la fuente de medios. Los eventos son atribuidos y sí se muestran en los reportes y paneles de control. 
Sistema operativo Nombre del identificador Descripción

iOS

iconAFios.png

 

idfa 

Donde esté disponible, rellénalo con el identificador de anunciante (IDFA) del dispositivo.

Formato: Secuencia

Ejemplo: "idfa": "9876F1SS-2983-3855-27RR-2R626772VFNB"

idfv

Donde esté disponible, rellénalo con el identificador de anunciante (IDFA) del dispositivo.

Formato: cadena
Ejemplo: "idfv": "95C9BD22-4A4C-41C8-9548-ED07C5C8C145"

Android

iconAFand.png

advertising_id

Donde esté disponible, rellénalo con el ID de publicidad de Google (GAID) del dispositivo (ID de publicidad).

Formato: Secuencia

Ejemplo: "advertising_id": "9c9a82fb-d5de-4cd1-90c3-527441c11828"

oaid

Formato: Secuencia

Ejemplo: "oaid": "1fe9a970-efbb-29e0-0bdd-f5dbbf751ab5"

amazon_aid

Formato: Secuencia

imei

Formato: Secuencia

Ejemplo: "imei": "AA-BBBBBB-CCCCCC-D"

Identificadores de dispositivo
Nombre de parámetro Obligatorio Descripción

appsflyer_id

Un identificador único generado por AppsFlyer cuando la aplicación se inicia por primera vez. 

  • Formato: Secuencia
  • Ejemplo: "appsflyer_id": "1415211453000-6513894"

customer_user_id

No

ID de usuario de cliente, un identificador de usuario único establecido por el propietario de la aplicación.

  • Formato: secuencia. 
  • Ejemplo: "customer_user_id": "my_customer_number1234" 

att

No

Estado de autorización de ATTrackingManager de iOS

  • Si la versión del sistema operativo del dispositivo es iOS 14 o posterior, completa att con ATTrackingManager.
    • Formato: número entero de un solo dígito 
    • Ejemplo: 1
  • Los valores de iOS para ATTrackingManager son:
    • 0: No determinado
    • 1: Restringido
    • 2: Denegado
    • 3: Autorizado

Nota:

  • Como parte de las políticas de privacidad de Apple, recomendamos que completes att con el valor ATTrackingManager. 
  • Puedes enviar este parámetro antes del lanzamiento oficial de iOS14; comenzaremos a procesarlo después del lanzamiento oficial. 

 

ip

No

La dirección IP del dispositivo móvil durante la ocurrencia del evento.

  • Si se envía, la dirección IP se usa para completar los campos de geolocalización.
  • Si no se envía, AppsFlyer completa la dirección IP y los campos de geolocalización utilizando los valores del evento de atribución de la instalación. 
  • Formato: secuencia que contiene la dirección IPV4 o IPV6
  • Ejemplo: "ip": "192.0.2.1
af_events_api En desuso
  • En desuso desde el 6 de julio de 2020.
  • Este parámetro no es necesario, puedes dejar de enviarlo. El hecho de hacerlo no afecta en modo alguno a la atribución. 

eventName

Especifica el nombre del evento. Asegúrate de que los nombres de los eventos estén alineados con los requisitos del marketer.

  • Formato: Secuencia
  • Ejemplo: "eventName": "af_purchase"

valor del evento

Si envías un evento sin ningún valor, entonces envía: "event_value":""

  • Los valores de eventos deben enviarse sin símbolos o formatos adicionales.
  • Para af_revenue se puede usar una coma decimal. Los valores negativos deben ir precedidos de un -.
  • Formato: secuencias en un JSON
  • Ejemplo: "eventValue": "{1}"

app_version_name

No

El identificador o la versión de tu aplicación.

  • Formato: Secuencia
  • Ejemplo: "app_version_name": "my_app_version"

app_store

No

Equivalente a AF_STORE en las aplicaciones para Android. La tienda desde la que se descargó la aplicación. 

  • Campo de raw data: Instalar la tienda de aplicaciones
  • Formato: Secuencia
  • Ejemplo: my_android_store_is_best

Hora del evento

No

La fecha y hora en que ocurrió el evento usando la zona horaria UTC.

  • Valor predeterminado: si no se envía eventTime, se establece como la fecha y hora de llegada del mensaje HTTP.
  • Formato: string yyyy-mm-dd hh:mm:ss.sss, la hora debe estar en la zona horaria UTC.
  • Ejemplo: "eventTime":"2019-05-15 12:17:01.123" significa 12:17:01 UTC. 

Cierre del día:

  • si implementas eventTime , el evento debe llegar a AppsFlyer no más tarde de las 02:00 del día siguiente. Es decir, si el evento tuvo lugar el lunes a las 17:00 UTC, debe llegar a los servidores de AppsFlyer antes del martes a las 02:00 UTC. 
  • Los eventos recibidos después del cierre del día se marcan con la fecha y hora real de llegada.
  • Los eventos que tienen una hora futura, es decir, después de la hora de llegada, se marcan con la hora de llegada. 

Ejemplo

  • Las horas están en UTC
  • Se envía un evento con eventTime = Monday 21:00.
Hora de llegada Fecha y hora registrada por AppsFlyer Observación
Martes 01:00 Lunes 21:00 Llegó antes del cierre de la actividad.
Miércoles 09:00  Miércoles 09:00 Llegó después del cierre de la actividad. La hora está fijada en la hora de llegada. 

eventCurrency

No

Código de divisa usando códigos de 3 caracteres ISO 4217 y BCN (Bitcoin)

  • Predeterminado: USD
  • Ejemplo: "eventCurrency": "ZAR"

bundleIdentifier

No

Un identificador único de la aplicación. En el raw data, el parámetro completa el ID de paquete.

  • Formato: Secuencia
  • Ejemplo: "bundleIdentifer": "com.myapp"

sharing_filter

No

El filtro de intercambio bloquea el intercambio de eventos S2S a través de postbacks/API con partners integrados y otras integraciones de terceros. 

Usa el filtro para cumplir con los requisitos normativos, como el RGPD y la CCPA, para cumplir con los mecanismos de exclusión opcional del usuario y por otros motivos comerciales lógicos. 

El filtro de intercambio sharing_filter tiene las siguientes opciones:

  • all: Todos los partners están bloqueados. No compartes el evento con nadie.  Ejemplo: "sharing_filter": "all"
  • Lista de ID de partners en una matriz. Formato ["partnerid_1", "partnerid_2", "partnerid_n"]  Ejemplo: "sharing_filter": ["googleadwords_int", "adcolony_int"]

Para obtener una lista de ID de partners, comunícate con el soporte de AppsFlyer o con tu CSM. 

Ejemplo de curl

curl --location --request POST 'https://api2.appsflyer.com/inappevent/<app_id_placeholder>' \
--header 'authentication: <dev_key_placeholder>
' \
--header 'Content-Type: application/json' \
--data-raw '{
  "appsflyer_id": "9999999999999-9999999999999999999",
	"advertising_id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
	"customer_user_id" : "example_customer_id_123",
	"ip": "199.0.2.1",
	"app_version_name" : "example_version_name",
	"eventTime" : "2020-02-25 12:00.000",
	"eventName": "af_purchase",
	"eventCurrency": "ZAR",
	"eventValue": 
	"{
		\"af_revenue\": \"1006\",
		\"af_content_type\": \"wallets\",
		\"af_content_id\": \"15854\",
		\"af_quantity\" :\"1\"
   }"
}
'

Códigos de respuesta

Código de respuesta  Mensaje Cómo manejarlo
200 OK

Al recibir un mensaje, se realiza una validación mínima de los datos. Como tal, puedes obtener una respuesta OK aunque el evento no se registre completamente en AppsFlyer. Para depurar los eventos:

  • Usando el ejemplo de CURL en este artículo:
    • Actualiza el ID de aplicación y los detalles de la clave de desarrollador.
    • Cambia los parámetros appsflyer_id y eventTime. Utiliza la fecha y hora actual y un appsflyer_id recientemente atribuido como no orgánico.
  • Envía la llamada.
    • Debería devolver un mensaje de 200 OK.
    • Comprueba si el evento se registró correctamente incluyendo los ingresos.
    • Haz cambios adicionales según sea necesario y vuelve a hacer la prueba.
400 Error de autenticación Asegúrate de que la clave de autenticación sea correcta.
400  appsflyer_id es un campo obligatorio
  •  Asegúrese de pasar el ID de AppsFlyer correcto en el JSON.
  • JSON se ha pasado a secuencia () y formateado correctamente.
401 No autorizado Cuando la clave proporcionada en el encabezado de autenticación no es la <dev_key> de esta aplicación.
400 Solicitud incorrecta

Cuando la solicitud no cumplió al menos uno de los criterios de validación.

400  Falta la carga de datos o no se la pudo analizar
  • Asegúrese de que el JSON se haya pasado a secuencia y que se le haya dado el formato correcto.
  • Si se incluye más de un evento en la carga útil de JSON. Asegúrate de enviar un evento por solicitud.
500  Error interno del servidor  Verifica que el JSON se haya pasado a secuencia () y formateado correctamente.
 

Pruebas

Ten en cuenta lo siguiente: 

  • Para las pruebas, usa el ID de AppsFlyer de una instalación no orgánica para que el evento de prueba se atribuya en tiempo real. Los eventos orgánicos se atribuyen con un retraso de unas pocas horas.
  • Algunos campos de eventos se rellenan con el evento de atribución de la instalación del usuario. Por ejemplo, la fecha y hora de instalación y la fuente de medios. 

Para atribuir el dispositivo de prueba como una instalación no orgánica:

  1. Prepara un enlace de atribución personalizado para probar los mensajes de S2S. Establece el parámetro de fuente de medios en el enlace como s2s_test. Ejemplo: &pid=s2s_test
  2. Registrar el dispositivo de prueba
  3. Desinstala la aplicación del dispositivo de prueba.
  4. Envía el enlace al dispositivo de prueba.
  5. Haz clic en el enlace.
  6. Instala y luego inicia la aplicación.
  7. En el panel de control, comprueba que la instalación se haya atribuido.
  8. Obtén el ID de AppsFlyer para usarlo en tu mensaje de S2S.

Para enviar el mensaje de prueba de S2S:

  1. Prepara un mensaje de S2S usando el ID de AppsFlyer asignado. Consulta los siguientes ejemplos de código.
  2. Envía el mensaje.
  3. Haz una de las siguientes cosas para ver cómo se registra el mensaje en AppsFlyer:
  4. Comprueba lo siguiente:
    • Los valores enviados en el mensaje de S2S rellenan correctamente el reporte. Presta especial atención a los campos Fecha del evento, Divisa del evento, Ingresos del evento y Valor del evento.
    • AppsFlyer rellena la fuente de atribución y la fecha y hora de instalación.
    • Los valores proporcionados por el propio SDK, como la versión del SDK, no están rellenados.

Código de ejemplo para enviar mensajes de S2S

JavaPythonNode JSC#PHPGo
/* using the okhttp package 
install from maven https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp */
import okhttp3.*;
import java.io.IOException;

public class SendRequest {
  public static void main(String[] args) {

    OkHttpClient client = new OkHttpClient();
    MediaType mediaType = MediaType.parse("application/json");

    RequestBody body = RequestBody.create(mediaType, "" +
        "{\r\n\t\"appsflyer_id\": \"<APPS_FLYER_ID>\"," +
        "\r\n\t\"customer_user_id\": \"123456\",\r\n\t\"eventName\": \"af_purchase\",\r\n\t\"" +
        "eventValue\": \"{\\\"af_revenue\\\":\\\"6\\\" ,\\\"af_content_id\\\":\\\"15854\\\"}\",\r\n\t\"" +
        "eventCurrency\": \"USD\",\r\n\t\"" +
        "eventTime\": \"2018-08-10 4:17:00.000\",\r\n\t\"");

    Request request = new Request.Builder()
        .url("https://api2.appsflyer.com/inappevent/<APP_ID>")
        .post(body)
        .addHeader("Content-Type", "application/json")
        .addHeader("authentication", "<YOUR_DEV_KEY>")
        .build();

    try {
      Response response = client.newCall(request).execute();
      System.out.println(response.code());
      System.out.println(response.body().string());
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

El envío del ID de publicidad/identificador del dispositivo es importante

  • El ID de publicidad/identificador del dispositivo es obligatorio para asegurar los postbacks a las SRN como Facebook y Google Ads. Si no puedes enviar el ID, ten en cuenta que los postbacks no se pueden enviar.
  • Si solo envías el ID de AppsFlyer, los eventos in-app se registrarán y atribuirán correctamente.

Rellenar parámetros

Diferencia entre orgánicos y no orgánicos

Cuando AppsFlyer procesa los eventos in-app de S2S, los campos de atribución se rellenan usando el ID de AppsFlyer para identificar el evento de instalación asociado que precedió a los eventos in-app.

Esto significa que algunos datos que AppsFlyer asocia con eventos in-app S2S no orgánicos no se asocian con eventos in-app S2S orgánicos.

 Ejemplo

Por ejemplo, si se comparan los reportes de datos sin procesar de eventos in-app S2S orgánicos y no orgánicos, se observa que los eventos no orgánicos contienen datos que no los orgánicos no.

Los eventos in-app no orgánicos incluyen datos sobre la fuente de medios, la campaña, el tipo de toque atribuido y la hora del toque atribuido.

Por otra parte, los eventos in-app orgánicos siguen una instalación orgánica. Las instalaciones orgánicas no tienen datos asociados a la campaña, la fuente de medios o el tipo de toque atribuido y la fecha y hora de instalación.

Asignación de ID de AppsFlyer con ID de usuario de cliente (CUID)

Se requiere lógica de backend para obtener valores para rellenar el parámetro. A continuación, se describe cómo se puede obtener el ID de AppsFlyer:

  • El ID de AppsFlyer es obligatorio y se usa para atribuir eventos.
  • Se genera cuando un usuario instala por primera vez la aplicación móvil.
  • Para que puedas asignar tu CUID al ID de AppsFlyer, tienes que configurar el CUID en la aplicación. 

Para que te sea más fácil saber qué usuario ejecutó qué evento, implementa el siguiente flujo:

  • Configure el ID de usuario de cliente cuando el usuario instala la aplicación.
  • Los reportes de raw data de AppsFlyer contienen el CUID y el ID de AppsFlyer. Usa una de las herramientas de entrega de datos para obtenerlo o la Push API de AppsFlyer. 
  • Usa los reportes de raw data para hacer coincidir el CUID con el ID de AppsFlyer. 
  • El ID de AppsFlyer está disponible en el SDK integrado en tu aplicación (Android/iOS).
  • Asigna el ID de AppsFlyer al ID de usuario de cliente en tus sistemas internos (importante para uso futuro).

Una vez que asignas el ID de AppsFlyer con tu CUID, puedes hacer coincidir al usuario con los eventos realizados. Así, podrás obtener los demás valores (valor del evento, divisa del evento, fecha y hora del evento, etc.) y enviar el evento in-app de servidor a servidor. 

 Ejemplo de mensaje de solicitud

{
  "appsflyer_id": "1415211453000-6513894",
	"advertising_id": "38412345-8cf0-aa78-b23e-10b96e40000d",
	"eventName": "af_purchase",
	"eventValue": 
	"{
		\"af_revenue\": \"6\",
		\"af_content_type\": \"wallets\",
		\"af_content_id\": \"15854\",
		\"af_quantity\" :\"1\"
   }",
	"eventCurrency": "USD",
	"ip": "1.2.3.4",
	"eventTime": "2014-05-15 12:17:00.000"
}


En este caso, AppsFlyer recibe un evento in-app S2S que representa un evento de compra con ingresos, así como propiedades adicionales tales como tipo de contenido, etc.

Obtener el ID de AppsFlyer

appsflyer_id es un parámetro obligatorio en los mensajes de eventos de servidor a servidor. AppsFlyer usa este parámetro para atribuir el evento al dispositivo original y a la fuente de medios atribuida. Puedes obtener el ID usando uno de los siguientes métodos:

 Consejo

Cuando pruebes mensajes S2S, si estás usando raw data, busca el registro con la fuente de medios "s2s_test". Este es tu dispositivo de prueba y su ID de dispositivo de AppsFlyer es el ID que necesitas.

Envío de ingresos negativos

Se pueden enviar los eventos que tienen un valor de ingresos negativo. Por ejemplo, si una compra se canceló. El parámetro af_revenue puede tener valores negativos para registrar esto. 

Si rellenas af_quantity, es posible que quieras rellenarlo con un valor negativo dependiendo de la lógica de tu sistema. AppsFlyer no hace uso de af_quantity.

Ejemplo con ingresos negativos

{
	"eventName": "cancel_purchase",
	"eventValue": 
	"{
		\"af_revenue\": \"-6\",
		\"af_content_type\": \"wallets\",
		\"af_content_id\": \"15854\",
		\"af_quantity\" :\"1\"
   }",
	"eventCurrency": "USD",
	
}

Envío de eventos sin valor de evento

Si quiere enviar eventos sin valor de evento, simplemente envía una string vacía al valor del evento: "eventValue":""

De esta manera, AppsFlyer puede, según la configuración del anunciante, enviar tales eventos in-app enriquecidos a fuentes de medios con fines avanzados de targeting, optimización y creación de audiencias.

Resolución de Problemas

Los eventos no se muestran en el panel de control

  • Punto de conexión: verifica que el punto de conexión utilizado sea el correcto.
  • Verifica que la carga útil contiene los parámetros obligatorios. Ver aquí.
  • Asegúrate de que el ID de AppsFlyer que estás usando para disparar el evento sea un appsflyer_id real que esté realmente instalado en la aplicación específica, y no un ID de prueba proporcionado en la documentación. Ver aquí.
  • Los eventos de S2S no admiten múltiples eventos en una solicitud de S2S. Cada evento debe ser enviado como un evento separado. 
  • En el panel de control de información general, el intervalo de fechas se refiere a la fecha de instalación de la aplicación (LTV) y no a la fecha del evento.
    • Asegúrate de seleccionar el intervalo de fechas correcto.
    • Asegúrate de que el intervalo de fechas del panel de control corresponda a la fecha de instalación del dispositivo (appsflyer_id) y no a la fecha del evento.
  • Reportes de raw data de eventos: el intervalo de fechas se refiere a la fecha del evento y no a la fecha de instalación. 

Los eventos no contienen ingresos

Si envías eventos de S2S cuyos ingresos no se registran, asegúrate de que el JSON que envíes esté en formato de secuencia. Lo más importante es el parámetro de valor del evento en el JSON. Debe estar en formato de secuencia, como se muestra en el ejemplo que sigue.

"{\"af_revenue\":\"6\" ,\"af_content_type\":\"wallets\"}"

Si no tiene formato de secuencia, el valor del evento no se procesará correctamente y no se podrán registrar los ingresos.

Los valores de los ingresos no deben ser formateados de ninguna manera. Pueden contener una coma decimal, pero no es obligatorio. No incluyas signos o códigos de divisa ni delimitadores ,. Los ingresos pueden tener un prefijo -.

  • Ejemplos de valores válidos: 123, -123.45123.456
  • Ejemplos de valores inválidos: 1,234.561,234

No se rellenan todos los campos en los eventos de S2S

Los campos de raw data se rellenan con el valor enviado en la llamada de S2S y algunos campos se rellenan con el evento de instalación.  Se observa un comportamiento similar pero no idéntico para los eventos in-app reportados usando el SDK de AppsFlyer. Hay algunas diferencias; específicamente, los siguientes campos no se rellenan para los eventos de S2S:

  • WIFI
  • Operator
  • language
  • Tipo de dispositivo
  • Categoría de dispositivo
  • Versión de la aplicación: Puedes usar app_version_name
  • Nombre de aplicación
¿Fue útil este artículo?