Compliance com GDPR e CCPA usando APIs

Visão geral: este artigo é para clientes (proprietários de aplicativos) que usam a plataforma da AppsFlyer para atribuir dados de usuários de aplicativos. Proprietários de aplicativos implementam a API OpenGDPR para cumprir com as leis de proteção de dados aplicáveis, como CCPA e GDPR.

Observação dos nossos advogados: O conteúdo aqui mencionado não é um aconselhamento jurídico. Ele serve apenas para sua informação e conveniência. Trabalhe diretamente com consultores jurídicos e outros profissionais para determinar exatamente como  GDPR, CCPA ou quaisquer outras leis podem ou não se aplicar a você.O relacionamento de privacidade entre você e a AppsFlyer é regido pela Política de Privacidade dos Serviços AppsFlyer   

Regulamentos de privacidade

Neste artigo, as referências aos regulamentos de privacidade incluem:

  • Regulamento Geral de Proteção de Dados (GDPR na sigla em inglês): é o regulamento da UE relativo à proteção e privacidade de dados para os cidadãos da União Europeia.
  • CCPA: Lei de Privacidade do Consumidor da Califórnia 

Os termos regulamentos de privacidade, GDPR e CCPA são usados de forma intercambiável neste artigo. 

A iniciativa OpenGDPR

Para atender e gerenciar solicitações dos titulares dos dados conforme os regulamentos de privacidade, a AppsFlyer, juntamente com mParticle, Amplitude e Braze, iniciou o protocolo OpenGDPR.

OpenGDPR é uma estrutura unificada e livre, que facilita a cooperação entre empresas de tecnologia para o uso justo e transparente de dados do cliente. Ela possibilita aos fornecedores tomar ações sobre a privacidade de dados com facilidade em vários sistemas para processar e armazenar dados do cliente.

Leia mais sobre a iniciativa aqui.

Definições

Termo GDPR Termo AppsFlyer Descrição
Pessoa em causa Usuário do aplicativo ou Usuário final O usuário do aplicativo sobre quem os dados são coletados
Controlador de dados Proprietário do aplicativo ou anunciante O proprietário do aplicativo determina o propósito e os meios pelos quais os dados pessoais são processados. 
Processador de dados AppsFlyer e seus parceiros A AppsFlyer e seus parceiros processam dados pessoais em nome do controlador de dados

Requisitos do GDPR

O GDPR detalha os direitos obrigatórios do titular dos dados, com os quais o controlador dos dados deve cumprir. Para fins de API, esses direitos são traduzidos em tipos de solicitação. Veja a seguir como a AppsFlyer processa os diferentes tipos de solicitação. 

Tipo de solicitação

(Direito)

Definição do GDPR

Processamento da solicitação pela AppsFlyer 

Acesso

  • Se solicitado, os usuários do aplicativo têm o direito de saber se, por que e por quanto tempo o proprietário do aplicativo processará seus dados.
  • Se os dados forem compartilhados com terceiros, como a AppsFlyer, os usuários do aplicativo terão o direito de saber quem são esses terceiros.
  • O direito de saber quais categorias de dados estão sendo processadas.
  • Se houver processamento automatizado, isso tem um efeito significativo sobre eles.
Os proprietários do aplicativo recebem uma cópia dos dados pessoais processados dos usuários do aplicativo.

 Portabilidade

O usuário do aplicativo precisa receber todos os seus dados pessoais em um formato estruturado, comumente usado e legível pela máquina, como um arquivo CSV.

O proprietário do aplicativo recebe umacópia dos dados pessoais processados pelo usuário do aplicativo.

Retificação

Permite que os usuários do aplicativo corrijam seus dados caso percebam que estão imprecisos ou inverídicos. Os proprietários precisam apagar ou corrigir dados imprecisos ou incompletos.

  • A AppsFlyer exclui os dados do usuário do aplicativo gravados antes da data do pedido de retificação.
  • Os dados recebidos depois disso são gravados pela AppsFlyer.

Exclusão

O direito de exclusão força os proprietários do aplicativo a remover dados pessoais até um mês após o recebimento da solicitação.

Os dados são excluídos

API de solicitações do GDPR da AppsFlyer

A compliance com os requisitos GDPR descritos neste documento é obtida com a API de solicitações do GDPR da AppsFlyer.

  1. Solicitação do GDPR:  executar um dos tipos de solicitação acima: "acesso", "portabilidade", "exclusão" ou "retificação".
  2. Solicitação de status – consultar o status atual de uma solicitação do GDPR
  3. Solicitação de descoberta: questionar a versão da API e o formato de dados compatíveis
  4. Cancelamento: cancelar uma solicitação do GDPR durante sua fase pendente.

Os proprietários do aplicativo precisam implementar alterações de UI em seus aplicativos, para que os usuários possam enviar solicitações. Observe que as solicitações do GDPR são para um usuário por vez.

1. Solicitação do GDPR

Fluxo da solicitação do GDPR

Todos os tipos de solicitação do GDPR, acesso, portabilidade, exclusão e retificação possuem o mesmo fluxo:

  1. O usuário do aplicativo envia uma solicitação.
  2. O proprietário do aplicativo cria a solicitação GDPR (veja abaixo) e a envia para a AppsFlyer.
  3. A AppsFlyer recebe a solicitação e responde com "201 OK" para solicitações válidas.
  4. Durante as 48 horas seguintes, a solicitação fica na fila com o status  pendente. O usuário do aplicativo pode cancelar a solicitação. 
  5. Após 48 horas, o status da solicitação muda para in_progress.  A AppsFlyer envia um postback 'alteração de status'. A solicitação não pode ser cancelada. 
  6. a) Dentro de 28 dias, a AppsFlyer atende à solicitação.
    No caso de apagamento ou retificação, os dados do usuário do aplicativo são excluídos.
    No caso de portabilidade ou acesso,  os dados do usuário do aplicativo podem ser acessados no painel da AppsFlyer sob GDPR ou através da API de solicitação (veja abaixo).
    b) O status da solicitação é atualizado para concluído.   A AppsFlyer envia um postback dealteração de status .

Formato da solicitação do GDPR

Uma API de solicitação do GDPR pode ser enviada por meio de HTTP POST ao seguinte endpoint – 

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

O token de API é o mesmo token de API usado para a Pull API. O Administrador recupera o token da Pull API da página de token de API no painel.  

Parâmetros
Nome da propriedade Obrigatório Descrição
subject_request_id Sim String UUID v4. Gerado pelo controlador no momento do envio da solicitação a um Processador. Em seguida, pode ser usado para verificar o status da solicitação, atualizá-la ou cancelá-la.
subject_request_type Sim

Valor de string que representa o tipo de solicitação do GDPR.  Valores suportados:

  • erasure
  • portability
  • access
  • rectification
subject_identities Sim
  • Uma matriz de objetos de identidade que define a identidade do solicitante (veja abaixo).
  • Cada solicitação pode conter apenas uma identidade de titular dos dados.
submitted_time Sim
  • String de data RFC 3339 da hora da solicitação original pelo titular dos dados.
  • Carimbos de data/hora em UTC
property_id Sim

String que representa o aplicativo móvel para o qual essa solicitação está direcionado

Exemplos:

  • iOS: id123456789
  • Android: com.exemplo, com.editores.nome
  • Android fora da loja: com.editor.nome-canal
    Observação Em alguns casos, os proprietários de aplicativos registram atribuição fora da loja usando o nome do Google Play para Android. Nesses casos, use o nome regular do aplicativo, conforme exibido no Painel.
api_version Não String de versão que representa a versão desejada da API de solicitação do GDPR
status_callback_urls Sim
  • Matriz de endpoints para que callbacks de status sejam enviados para as seguintes alterações de status da solicitação.
  • Apenas  pontos finais https são suportados.
Objetos Subject_identities
Tipo de objeto Obrigatório Descrição
identity_type Sim
  • O tipo de identidade no formato de sequência:
    • ios_advertising_id
    • android_advertising_id
    • fire_advertising_id
    • microsoft_advertising_id
    • appsflyer_id
  • Exemplo: "android_advertising_id"
identity_value Sim
  • Formato: sequência
  • Exemplo: "a7551968-d5d6-44b2-9831-815ac9017798"
identity_format Sim
  • O método usado para codificar identity_value: bruto é o único suportado:
  • Exemplo: "bruto"

Exemplo de solicitação de cancelamento do GDPR 

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

 

Exemplo de código da solicitação de apagamento do 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. Solicitação de status

Toda solicitação do GDPR enviada pode ter seu status consultado posteriormente, especificando o subject_request_id. Existem quatro tipos de status compatíveis:

  1. pending - uma solicitação correta foi recebida e está atualmente na fila
  2. in_progress - uma solicitação está sendo executada no momento
  3. completed - uma solicitação foi atendida
  4. cancelled - uma solicitação foi cancelada

Formato da solicitação de status

Uma solicitação de status pode ser enviada por meio de HTTP GET ao seguinte endpoint:

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

Exemplo da resposta de status

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 status

Conforme descrito no Fluxo da solicitação do GDPR acima, quando o status de uma solicitação do GDPR é alterado, de pending para in_progress para completed, a AppsFlyer envia um postback do GDPR aos endpoints solicitantes, especificados com a propriedade status_callback_urls.

Exemplo de postback de status:

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. Solicitação de relatório

Assim que uma Solicitação de acesso ou Solicitação de portabilidade for concluída, você pode fazer download do relatório por meio de HTTP GET para o seguinte endpoint:

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

O relatório gerado está disponível durante sete dias a partir do momento da conclusão.

4. Solicitação de descoberta

Para conhecer os formatos compatíveis com a AppsFlyer, uma solicitação de descoberta pode ser enviada por meio de HTTP GET ao seguinte endpoint:

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

Exemplo da resposta de descoberta

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. Solicitação de cancelamento

É possível cancelar uma solicitação do GDPR, com base em seu subject_request_id, mas somente durante a fase pending.

Para fazer isso envie um HTTP DELETE com subject_request_id para:

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

Resposta de cancelamento

Quando uma solicitação de cancelamento do GDPR é recebida, a AppsFlyer retorna uma resposta HTTP com código de status 202 e diversos outros parâmetros. Para obter mais detalhes verifique o capítulo "Propriedades da resposta de cancelamento" do GDPR.

Assim que o cancelamento da solicitação acontecer, a AppsFlyer envia um postback com o status cancelled

6. API de teste das solicitações do GDPR

Essa API da AppsFlyer é uma API de teste para a API de solicitações do GDPR. 

Como ela funciona?

Essa API de teste funciona da seguinte forma:

1. Assim que uma solicitação do GDPR for feita, a solicitação é colocada imediatamente no status "Pending". Para fins de teste, o status é alterado a cada 30 segundos.

2. Se um endpoint para um postback de status foi inserido na solicitação do GDPR, um primeiro postback é enviado logo após a solicitação e dois outros postbacks de status são enviados em intervalos de 30 segundos.

Endpoint de teste da solicitação do GDPR:

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

Endpoint de teste da solicitação de status:

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

Endpoint de teste da solicitação de descoberta:

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

Endpoint de teste da solicitação de cancelamento:

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

 Notas

  • Um token da API válido deve ser inserido com a solicitação.
  • Na propriedade "property_id", o ID do aplicativo deve pertencer ao proprietário da conta (de acordo com o token da API).

Registros de solicitações

Todas as solicitações do GDPR enviadas estão disponíveis para visualização no Painel de registros somente pelos proprietários da conta.

Para solicitações de acesso e portabilidade completas, também é possível fazer download do relatório a partir deste painel.

Para acessar o Painel de Registros:

  1. Acesse o painel principal e clique no seu nome de usuário.
  2. Clique em Registros e a seguinte janela abrirá:

GDPR_Table.png

Limitações

  • As contas de clientes podem enviar até 80 solicitações de GDPR a cada 2 minutos.

 

Este artigo foi útil?