RGPD

  • Annonceurs
  • Agences
  • Réseaux publicitaires
  • Développeurs

Respect du RGPD

The General Data Protection Regulation (GDPR) is a regulation in EU law regarding data protection and privacy for European Union citizens. It states that brands in control of personal data, must be able to honor, within one month, requests for access, portability, rectification and erasure.

En ce qui concerne l'attribution mobile, puisqu'il est impossible de savoir à l'avance quels utilisateurs sont citoyens européens, le RGPD s'applique à tous les utilisateurs mobiles, européens ou non.

L'initiative RGPD

To address and manage requests from data subjects, as required for GDPR compliancy, AppsFlyer, along with mParticle, Amplitude and Braze, have initiated the OpenGDPR protocol.

OpenGDPR is a unified, open-source framework, facilitating cooperation between technology companies for the fair and transparent use of consumer data. It enables vendors to easily take data privacy actions across multiple systems to process and store customer data.

You can read more about the initiative here.

Entités du RGPD

Personne concernée L'utilisateur final de l'app mobile pour laquelle les données sont collectées
Responsable du traitement des données L'annonceur détermine le but et les moyens par lesquels les données personnelles sont traitées.
Processeur de données AppsFlyer et ses partenaires traitent les données personnelles au nom du responsable du traitement des données

Exigences du RGPD

Le RGPD détaille les droits obligatoires de la personne concernée, que l'annonceur doit respecter.

Droits

Définition du RGPD

Comment AppsFlyer aide le responsable du traitement des données

Droit d'accès

  1. Si nécessaire, les personnes concernées ont le droit de savoir si, pourquoi et pendant combien de temps le responsable du traitement des données traitera leurs données.
  2. Si les données sont partagées avec des tiers (comme AppsFlyer), les personnes concernées ont le droit de savoir qui sont ces tiers.
  3. Le droit de savoir quelles catégories de données sont traitées.
  4. En cas de traitement automatisé, si ce dernier a un effet significatif sur celles-ci.
Lors de l'envoi d'une demande « d'accès », les responsable du traitement des données reçoivent une copie des données personnelles traitées.

Droit à la portabilité des données

La personne concernée doit recevoir toutes ses données personnelles dans un format structuré, communément utilisé et lisible par une machine tel qu'un fichier CSV.

Lors de l'envoi d'une demande de « portabilité », le responsable du traitement des données reçoit une copie des données personnelles traitées des personnes concernées.

Droit à la rectification

Permet aux personnes concernées de corriger leurs données s'ils voient que ces dernières sont inexactes ou fausses. Les responsables du traitement des données doivent alors effacer ou corriger les données inexactes ou incomplètes.

When the data controller submits a ‘rectification’ request, AppsFlyer deletes the data subject's past data up to that moment, but data received afterwards is updated by AppsFlyer.

Droit à l'effacement

Le droit d'effacement oblige les responsables du traitement des données à supprimer les données personnelles dans un délai d'un mois.

Les annonceurs peuvent supprimer les données collectées des personnes concernées avec une demande « d'effacement ».

GDPR_logo2.png

API de demande RGPD d'AppsFlyer

AppsFlyer supports the above requirements via its GDPR Requests API (starting May 25th 2018 - requests received prior to this date are not handled):

  1. Demande RGPD - Effectuer l'un des types de demande ci-dessus : « accès », « portabilité », « effacement » ou « rectification ».
  2. Demande d'état - Interroger l'état actuel d'une demande RGPD
  3. Demande de découverte - Se renseigner sur la version de l'API et le format de données pris en charge
  4. Annulation - Annuler une demande RGPD pendant sa phase pending

Il appartient au responsable du traitement des données d'implémenter les modifications de l'interface graphique, afin que ses utilisateurs finaux puissent soumettre ces demandes. Notez que les demandes RGPD concernent un utilisateur à la fois.

1. Demande RGPD

Flux de demande RGPD

Tous les types de demande RGPD, « accès », « portabilité », « effacement » et « rectification » ont le même flux commun :

  1. Data subject (end user) submits a request.
  2. Data Controller (advertiser) constructs the GDPR request (see below) and sends it to AppsFlyer.
  3. Le processeur des données (AppsFlyer) reçoit la demande et répond aux demandes valides par « 201 OK ».
  4. In the next 48 hours the request is queued in pending status, and may still be cancelled.
  5. Par la suite, la demande passe à l'état in_progress, et AppsFlyer envoie un postback de « changement d'état ». La demande ne peut désormais PLUS être annulée.
  6. a) AppsFlyer fulfills the request during the next 28 days.
    In the case of ‘erasure’ / 'rectification' - the end user's data is deleted.
    In the case of ‘portability’ / ‘access’ - the end user's data can be accessed in AppsFlyer’s dashboard under GDPR section, or via the Request API (see below).
    b) The request changes status to completed, and AppsFlyer sends a ‘status change’ postback.

Format de la demande RGPD

A GDPR Request API can be submitted via HTTP POST to the following endpoint -

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

with the following properties:

Nom de la propriété Obligatoire/Optionnelle Description
subject_request_id OBLIGATOIRE UUID v4 string. This must be generated by the controller at the time of request submission to a Processor.
subject_request_type OBLIGATOIRE String value representing the type of GDPR Request. Supported values: "erasure", "portability", "access" and "rectification"
subject_identities OBLIGATOIRE Array of Identity Objects covering the type, value and format of the device ID (see below). Each request can only have one device ID.
submitted_time OBLIGATOIRE RFC 3339 date string representing the time of the original request by the data subject. Note that all timestamps are sent in UTC
property_id OBLIGATOIRE String representing the mobile app to which this request is scoped, e.g., com.example for Android, id123456789 for iOS
api_version OPTIONNELLE Chaîne de version représentant la version souhaitée de l'API de demandes RGPD
status_callback_urls OPTIONNELLE Array of endpoints for status callbacks to be sent to following request status changes. Note that ONLY https endpoints are supported.

A GDPR request MUST contain one or more Identity Objects used to fulfill the request.

  1. identity_type - REQUIRED string value representing the form of identity. The supported Identity Types by AppsFlyer are ios_advertising_id, android_advertising_id, fire_advertising_id and microsoft_advertising_id.
  2. identity_value - Valeur de chaîne OBLIGATOIRE représentant l'identité.
  3. identity_format - REQUIRED string value representing the encoding of the identity. Currently raw is the only supported Identity Format by AppsFlyer.

Exemple de demande RGPD d'effacement

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"
  ]
}
 

Exemple de code de demande RGPD d'effacement

Java Python Node.js C#
/* 
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. État de la demande

Every submitted GDPR request can be later queried for its status, by specifying the subject_request_id. There are four supported status types:

  1. pending - Une demande correcte a été reçue et est actuellement en file d'attente
  2. in_progress - Une demande est actuellement en cours d'exécution
  3. completed - Une demande a été satisfaite
  4. cancelled - Une demande a été annulée

Format de l'état de la demande

Une demande d'état peut être envoyée via HTTP GET au point de terminaison suivant :

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

Exemple de réponse concernant l'état

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 l'état

As described in the GDPR Request Flow above, when the status of a GDPR request changes, from pending to in_progress to completed, AppsFlyer sends a GDPR postback to the requesting endpoints, specified with the status_callback_urls property.

Exemple de postback d'état :

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. Demande de rapport

Une fois qu'une demande d'accès ou une demande de portabilité a été effectuée, vous pouvez télécharger le rapport via HTTP GET au point de terminaison suivant :

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

Le rapport généré est disponible pendant sept jours à compter de la date d'achèvement.

4. Demande de découverte

Pour en savoir plus sur les formats pris en charge par AppsFlyer, une demande de découverte peut être soumise via HTTP GET au point de terminaison suivant :

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

Exemple de réponse à une demande de découverte

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. Demande d'annulation

It is possible to cancel a GDPR request, based on its subject_request_id, but only during the pending phase.

To so submit an HTTP DELETE with subject_request_id to:

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

Réponse à une demande d'annulation

Lors de la réception d'une demande d'annulation RGPD, AppsFlyer renvoie une réponse HTTP avec le code d'état 202 et plusieurs autres paramètres. Pour plus de détails, réferez-vous au chapitre « Propriétés d'une réponse à une demande d'annulation » du RGPD.

Once the cancellation of the request takes place AppsFlyer sends a postback with the cancelled status.

6. API de test des demandes RGPD

This AppsFlyer’s API is a test API for the AppsFlyer’s GDPR Requests API.

Comment fonctionne l'API de test ?

L'API de test fonctionne comme suit :

1. Une fois qu'une demande RGPD a été effectuée, celle-ci passe immédiatement à l'état « Pending ». À des fins de test, l'état change toutes les 30 secondes.

2. Si un point de terminaison pour un postback d'état a été inséré dans la demande RGPD, un premier postback est envoyé directement après la demande, et deux autres postbacks d'état sont envoyées par intervalles de 30 secondes.

Point de terminaison du test de demande RGPD :

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

Point de terminaison du test de demande d'état :

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

Point de terminaison du test de demande de découverte :

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

Point de terminaison du test de demande d'annulation :

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

 Remarques

  • Un token d'API valide doit être inséré avec la demande.
  • Dans la propriété « property_id », l'ID de l'app doit appartenir au propriétaire du compte (en fonction du token de l'API).

Demande de Logs

Toutes les demandes RGPD soumises peuvent être consultées uniquement par les propriétaires du compte dans le tableau de bord Logs.

Pour les demandes d'accès et de portabilité terminées, il est également possible de télécharger le rapport depuis ce tableau de bord.

Pour accéder au tableau de bord Logs :

1. Go to the main dashboard and click your user name.

2. Click Logs and the following window opens:

GDPR_Table.png

Cet article vous a-t-il été utile ?
Utilisateurs qui ont trouvé cela utile : 2 sur 4

Contenu de la page: