Cumplimiento normativo del RGPD y CCPA mediante API

Regulaciones de privacidad

Esta guía contiene información sobre la implementación de las API OpenGDPR de AppsFlyer. Las API permiten a los propietarios de aplicaciones cumplir con las leyes de protección de datos aplicables como el CCPA y RGPD. 

Unas palabras de nuestros abogados: Nada de lo que se dice aquí es asesoramiento legal. Se proporciona solo para tu información y conveniencia. Debes trabajar en estrecha colaboración con asesores legales y otros asesores profesionales para determinar exactamente cómo  el RGPD, CCPA o cualquier otra ley puede o no aplicarse a ti.  La relación de privacidad entre tú y AppsFlyer se rige por la Política de privacidad de servicios de AppsFlyer   

En este artículo, las referencias a las regulaciones de privacidad incluyen, entre otros:

  • RGPD: el Reglamento General de Protección de Datos es el conjunto de normas de la UE en materia de protección de datos y privacidad de los ciudadanos de la Unión Europea.
  • CCPA: Ley de Privacidad del Consumidor de California 

Los términos "regulaciones de privacidad", "RGPD" y "CCPA" se usan indistintamente en este artículo. 

La iniciativa OpenGDPR

A fin de abordar y gestionar las solicitudes de los sujetos de datos enviadas de acuerdo con las regulaciones de privacidad, AppsFlyer, junto con mParticle, Amplitude y Braze, inició el protocolo OpenGDPR.

OpenGDPR es un marco de código abierto y unificado que facilita la cooperación entre empresas de tecnología para el uso justo y transparente de los datos de consumidores. Les permite a los proveedores tomar medidas relativas a la privacidad de los datos en varios sistemas para procesar y almacenar datos de clientes.

Puede leer más sobre la iniciativa aquí.

Definiciones

Término del RGPD Término de AppsFlyer Descripción
Sujeto de datos Usuario de la aplicación o usuario final El usuario de la aplicación sobre el que se recopilan los datos
Controlador de datos Propietario de la aplicación o anunciante El propietario de la aplicación determina el propósito y los medios por los cuales se procesan los datos personales. 
Procesador de datos AppsFlyer y sus partners AppsFlyer y sus socios procesan datos personales en nombre del controlador de datos.

Requisitos del GDPR

En el RGPD se detallan los derechos obligatorios del sujeto de datos, que el controlador de datos debe cumplir. Para fines de API, estos derechos se traducen en tipos de solicitud. A continuación se detalla cómo AppsFlyer procesa los diferentes tipos de solicitud. 

Tipo de solicitud

(Derecho)

Definición según el GDPR

Procesamiento de la solicitud por parte de AppsFlyer 

Acceso

  • Si lo solicitan, los usuarios de la aplicación tienen derecho a saber si, por qué y durante cuánto tiempo el propietario de la aplicación procesará sus datos.
  • Si los datos se comparten con terceros, como AppsFlyer, los usuarios de la aplicación tienen derecho a saber quiénes son esos terceros.
  • También tienen derecho a saber qué categorías de datos se procesan.
  • Si hay procesamiento automatizado que pudiera afectarlos significativamente.
Los propietarios de la aplicación reciben una copia de los datos personales procesados de los usuarios de la aplicación.

 Portabilidad

El usuario de la aplicación debe recibir todos sus datos personales en un formato estructurado, comúnmente utilizado y legible por máquina, como un archivo CSV.

El propietario de la aplicación recibe una copia de los datos personales procesados del usuario de la aplicación.

Rectificación

Permite a los usuarios de la aplicación corregir sus datos si ven que son inexactos o falsos. Los propietarios de aplicaciones deben eliminar o corregir los datos inexactos o incompletos.

  • AppsFlyer elimina los datos del usuario de la aplicación registrados antes de la fecha de la solicitud de rectificación.
  • Los datos recibidos a partir de entonces son registrados por AppsFlyer.

Supresión

El derecho de supresión obliga a los propietarios de aplicaciones a eliminar los datos personales dentro del mes siguiente a la recepción de la solicitud.

Los datos se eliminan

API de solicitudes GDPR de AppsFlyer

El cumplimiento normativo de los requisitos del RGPD que se describen en este documento se logra mediante la API de solicitudes de RGPD de AppsFlyer.

  1. Solicitud de RGPD: Realizar uno de los tipos de solicitud anteriores: acceso, portabilidad, supresión, rectificación.
  2. Solicitud de estado: Consultar el estado actual de una solicitud GDPR.
  3. Solicitud de descubrimiento: Preguntar por la versión de la API compatible y el formato de datos.
  4. Cancelación: Cancelar una solicitud GDPR durante la fase pendiente.

Los propietarios de aplicaciones deben implementar cambios en la interfaz de usuario de su aplicación, de modo que los usuarios de la aplicación puedan enviar solicitudes. Debe tenerse en cuenta que las solicitudes de RGPD se envían de a un usuario por vez.

1. Solicitud GDPR

Flujo de solicitudes GDPR

Los tipos de solicitud de RGPD, de acceso, portabilidad, supresión y rectificación, tienen el mismo flujo:

  1. El usuario de la aplicación envía una solicitud.
  2. El propietario de la aplicación genera la solicitud de RGPD (ver más abajo) y la envía a AppsFlyer.
  3. AppsFlyer  recibe la solicitud y responde con un "201 OK" para las solicitudes válidas.
  4. Durante las siguientes 48 horas, la solicitud se pone en cola y su estado es pending (pendiente). El usuario de la aplicación puede cancelar la solicitud. 
  5. Después de 48 horas, el estado de la solicitud cambia a in_progress (en curso). AppsFlyer envía un postback ‘status change’ (cambio de estado). La solicitud no se puede cancelar. 
  6. a) Dentro de un período de 28 días, AppsFlyer completa la solicitud.
    En el caso de una solicitud de supresión o rectificación, los datos del usuario de la aplicación se eliminan.
    En el caso de una solicitud de portabilidad o acceso,  se puede acceder a los datos del usuario de la aplicación en el panel de control de AppsFlyer bajo RGPD, o mediante la API de solicitud (ver más abajo).
    b) El estado de la solicitud se actualiza a completed (completada).  AppsFlyer envía un postback status change (cambio de estado).

Formato de solicitudes GDPR

Se puede presentar una API de solicitudes GDPR por medio de HTTP POST al punto de conexión 

https://hq1.appsflyer.com/gdpr/opengdpr_requests?api_token=[api token]

El token de la API es el mismo token de API que se utiliza para Pull API. Puede recuperarlo desde su panel de control en Acceso a la API.

Parámetros
Nombre de la propiedad Obligatorio Descripción
subject_request_id Secuencia UUID v4. Generada por el controlador al momento del envío de la solicitud al procesador. Luego puede utilizarse para controlar el estado de la solicitud, actualizarla o cancelarla.
subject_request_type

Valor de la secuencia que representa el tipo de solicitud de RGPD. Valores admitidos:

  • erasure
  • portability
  • access
  • rectification
subject_identities
  • Una matriz de objetos de identidad que definen la identidad del solicitante (ver más abajo).
  • Cada solicitud puede contener solo una identidad de sujeto.
submitted_time
  • Secuencia de fecha RFC 3339 del momento de la solicitud original enviada por el sujeto de datos
  • Marcas de tiempo en UTC
property_id

Cadena que representa la aplicación móvil con la cual está relacionada esta solicitud.

Ejemplos:

  • iOS: id123456789
  • Android: com.ejemplo, com.nombre.publisher 
  • Android fuera de la tienda: com.nombre.publisher-canal
    Nota En algunos casos, los propietarios de aplicaciones registran la atribución fuera de la tienda mediante el nombre de Android Google Play. En estos casos, usa el nombre normal de la aplicación tal como se muestra en el panel de control.
api_version No Secuencia de versión que representa la versión deseada de la API de solicitudes GDPR.
status_callback_urls
  • Matriz de puntos de conexión para que las devoluciones de llamadas de estado se envíen a los siguientes cambios de estado de solicitud.
  • Solo se admiten puntos de conexión https.
Objetos subject_identities
Tipo de objeto Obligatorio Descripción
identity_type
  • El tipo de identidad en formato de secuencia:
    • ios_advertising_id
    • android_advertising_id
    • fire_advertising_id
    • microsoft_advertising_id
  • Ejemplo: "android_advertising_id"
identity_value
  • Formato: Secuencia
  • Ejemplo: "a7551968-d5d6-44b2-9831-815ac9017798"
identity_format
  • El método utilizado para codificar el identity_value: raw es el único admitido:
  • Ejemplo: "raw"

Ejemplo de solicitud de supresión de RGPD 

HTTP POST 
https://hq1.appsflyer.com/gdpr/opengdpr_requests?api_token={api token] 
HTTP/1.1Host: example.processo.com
Accept: application/json
Content-Type: application/json
{ 
  "subject_request_id":"a7551968-d5d6-44b2-9831-815ac9017798",
  "subject_request_type":"erasure",
  "submitted_time":"2018-10-02T15:00:00Z",
  "subject_identities":[ 
   { 
     "identity_type":"android_advertising_id",
     "identity_value":"a55684fd-j661-46df-9149-f7bfd652egge",
     "identity_format":"raw"
   }
  ],
  "api_version":"0.1",
  "property_id":"com.example",
  "status_callback_urls":[ 
   "https://examplecontroller.com/opengdpr_callbacks"
  ]
}
 

 

Ejemplo de código de solicitud de borrado GDPR

JavaPythonNode.jsC#
/* 
using the okhttp package install from maven
https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp
 */

import okhttp3.*;
import java.io.IOException;

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

    OkHttpClient client = new OkHttpClient();
    RequestBody body = RequestBody.create(null, "" +
    "{\r\n\"subject_request_id\": \"<SUBJECT_ID>\"," +
    "\r\n\"subject_request_type\": \"erasure\"," +
    "\r\n\"submitted_time\": \"2018-11-02T15:00:00Z\"," +
    "\r\n\"subject_identities\": [\r\n" +
    "{\r\n\"identity_type\": \"android_advertising_id\"," +
    "\r\n\"identity_value\": \"<ADVERTISING_ID>\"," +
    "\r\n\"identity_format\": \"raw\"\r\n}" +
     "\r\n]," +
     "\r\n\"property_id\": \"com.example.application\"}");

    Request request = new Request.Builder()
    .url("https://hq1.appsflyer.com/gdpr/opengdpr_requests?api_token=<API_TOKEN>")
    .post(body)
    .addHeader("Content-Type", "application/json")
     .addHeader("Accept", "application/json")
    .build();

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

2. Solicitud de estado

Cada solicitud GDPR que se presente puede consultarse posteriormente para saber su estado. Para esto, se debe especificar el subject_request_id. Existen cuatro tipos de estado admitidos:

  1. pending (Pendiente): Se recibió una solicitud correcta y en este momento se encuentra en la cola.
  2. in_progress (En curso): En este momento se está procesando una solicitud.
  3. completed (Finalizada): Se cumplió con una solicitud.
  4. canceled (Cancelada): Se canceló una solicitud.

Formato de solicitud de estado

Se puede presentar una solicitud de estado por medio de HTTP GET al punto de conexión

https://hq1.appsflyer.com/gdpr/opengdpr_requests/[subject_request_id]?api_token=[api token]

Ejemplo de respuesta de estado

HTTP/1.1 200 OK
Content-Type: application/json
X-OpenGDPR-Processor Domain: example processor.com
X-OpenGDPR-Signature:
kiGlog3PdQx+FQmB8wYwFC1fekbJG7Dm9WdqgmXc9uKkFRSM4uPzylLi7j083461xLZ+mUloo3tpsmyIZpt5eMfgo7ejXPh6lqB4ZgCnN6+1b6Q3NoNcn/+11UOrvmDj772wvg6uIAFzsSVSjMQxRs8LAmHqFO4cF2pbuoPuK2diHOixxLj6+t97q0nZM7u3wmgkwF9EHIo3C6G1SI04/odvyY/VdMZgj3H1fLnz+X5rc42/wU4974u3iBrKgUnv0fcB4YB+L6Q3GsMbmYzuAbe0HpVA17ud/bVoyQZAkrW2yoSy1x4Ts6XKba6pLifIHf446Bubsf5r7x1kg6Eo7B8zur666NyWOYrglkOzU4IYO8ifJFRZZXazOgk7ggn9obEd78GBc3kjKKZdwaCrLx7WV5y9TMDCf+2FILOJM/MwTUy1dLZiaFHhGdzld2AjbjK1CfVzyPssch0iQYYtbR49GhumvkYl11S4oDfu0c3t/xUCZWg0hoR3XL3B7NjcrlrQinB1KbyTNZccKR0F4Lk9fDgwTVkrAg152UqPyzXxpdzXjfkDkSEgAevXQwVJWBNf18bMIEgdH2usF/XauQoyrne7rcMIWBISPgtBPj3mhcrwscjGVsxqJva8KCVCKD/4Axmo9DISib5/7A6uczJxQG2Bcrdj++vQqK2succ=
{
 "controller_id":"example_controller_id",
 "expected_completion_time":"2018-11-01T15:00:01Z",
 "subject_request_id":"a7551968-d5d6-44b2-9831-815ac9017798",
 "request_status":"pending",
 "api_version":"0.1"
}

Postbacks de estado

Tal como se describiera anteriormente en la sección Flujo de solicitudes GDPR, cuando cambia el estado de una solicitud GDPR, de pending (pendiente) a in_progress (en curso) y a completed (finalizada), AppsFlyer envía un postback GDPR a los puntos de conexión de la solicitud, especificados con la propiedad status_callback_urls.

Ejemplo de postback de estado:

POST /opengdpr_callbacks HTTP/1.1
Host: examplecontroller.com
Content-Type: application/json
X-OpenGDPR-Processor Domain: appsflyer.com
X-OpenGDPR-Signature: kiGlog3PdQx+FQmB8wYwFC1fekbJG7Dm9WdqgmXc9uKkFRSM4uPzylLi7j083461xLZ+mUloo3tpsmyIZpt5eMfgo7ejXPh6lqB4ZgCnN6+1b6Q3NoNcn/+11UOrvmDj772wvg6uIAFzsSVSjMQxRs8LAmHqFO4cF2pbuoPuK2diHOixxLj6+t97q0nZM7u3wmgkwF9EHIo3C6G1SI04/odvyY/VdMZgj3H1fLnz+X5rc42/wU4974u3iBrKgUnv0fcB4YB+L6Q3GsMbmYzuAbe0HpVA17ud/bVoyQZAkrW2yoSy1x4Ts6XKba6pLifIHf446Bubsf5r7x1kg6Eo7B8zur666NyWOYrglkOzU4IYO8ifJFRZZXazOgk7ggn9obEd78GBc3kjKKZdwaCrLx7WV5y9TMDCf+2FILOJM/MwTUy1dLZiaFHhGdzld2AjbjK1CfVzyPssch0iQYYtbR49GhumvkYl11S4oDfu0c3t/xUCZWg0hoR3XL3B7NjcrlrQinB1KbyTNZccKR0F4Lk9fDgwTVkrAg152UqPyzXxpdzXjfkDkSEgAevXQwVJWBNf18bMIEgdH2usF/XauQoyrne7rcMIWBISPgtBPj3mhcrwscjGVsxqJva8KCVCKD/4Axmo9DISib5/7A6uczJxQG2Bcrdj++vQqK2succ=

{
"controller_id":"example controller id at the processor",
"expected_completion_time":"2018-11-01T15:00:01Z",
"status_callback_url":"https://examplecontroller.com/opengdpr_callbacks",
"Subject_request_id":"a7551968-d5d6-44b2-9831-815ac9017798",
"Request_status":"pending"
}

3. Solicitud de reporte

Una vez finalizada una solicitud de acceso o portabilidad, puede descargar el reporte por medio de HTTP GET al punto de conexión

https://hq1.appsflyer.com/gdpr/download/[REQUEST_ID]?api_token=[TOKEN]

El reporte generado estará disponible durante 7 días a partir de la finalización.

4. Solicitud de descubrimiento

Para conocer los formatos admitidos por AppsFlyer, se puede enviar una solicitud de descubrimiento por medio de HTTP GET al punto de conexión

https://hq1.appsflyer.com/gdpr/discovery?api_token=[api token]

Ejemplo de respuesta de descubrimiento

HTTP/1.1 200 OK
Content-Type: application/json
{
 "api_version": "0.1",
 "supported_identities": [
  {
   "identity_type": "android_advertising_id",
   "identity_format": "raw"
  },
 ],
 "supported_subject_request_types": [
  "erasure", "access", "portability", "rectification"
 ],
 "processor_certificate": "https://exampleprocessor.com/cert.pem"
}

5. Solicitud de cancelación

Es posible cancelar una solicitud GDPR, según su subject_request_id, pero solo durante la fase pending (pendiente). 

Para esto, se debe enviar un HTTP DELETE con el subject_request_id a

https://hq1.appsflyer.com/gdpr/opengdpr_requests/[subject_request_id]?api_token=[api token]

Respuesta de cancelación

Cuando se recibe una solicitud de cancelación GDPR, AppsFlyer devuelve una respuesta de HTTP con código de estado 202 y varios parámetros más. Para conocer más detalles, consulte el capítulo "Propiedades de respuestas de cancelación" del GDPR.

Una vez que se cancela la solicitud, AppsFlyer envía un postback con el estado cancelled (cancelada). 

6. API de prueba de solicitudes GDPR

Se trata de una API de prueba de AppsFlyer correspondiente a la API de solicitudes GDPR de AppsFlyer. 

¿Cómo Funciona?

La API de prueba funciona de la siguiente manera:

1. Una vez presentada una solicitud GDPR, inmediatamente se le asigna el estado "Pending" (pendiente). A los fines de la prueba, el estado cambia cada 30 segundos.

2. Si se insertó un punto de conexión para un postback de estado en la solicitud GDPR, se envía un primer postback inmediatamente después de la solicitud, y dos postbacks de estado más con intervalos de 30 segundos.

Punto de conexión de prueba de solicitud GDPR:

https://hq1.appsflyer.com/gdpr/stub?api_token=[api token]

Punto de conexión de prueba de solicitud de estado:

https://hq1.appsflyer.com/gdpr/stub/[request id]?api_token=[api token]

Punto de conexión de prueba de solicitud de descubrimiento:

https://hq1.appsflyer.com/gdpr/stub/discovery?api_token=[api token]

Punto de conexión de prueba de solicitud de cancelación:

https://hq1.appsflyer.com/gdpr/stub/[request id]?api_token=[api token]

 Notas

  • Se debe insertar un token de API válido con la solicitud.
  • En la propiedad "property_id", el ID de la aplicación debe corresponder al propietario de la cuenta (de acuerdo con el token de la API).

Registros de solicitudes

Solo los propietarios de cuentas pueden ver todas las solicitudes GDPR presentadas en el panel de control de registros.

En el caso de las solicitudes de acceso y portabilidad finalizadas, también es posible descargar el reporte desde este panel de control.

Para acceder al panel de control de registros:

1.  Acceda al panel de control principal y haga clic en su nombre de usuario.

2.  Haga clic en Registros, y se abrirá la siguiente ventana:

GDPR_Table.png

 

¿Fue útil este artículo?