Referência da API do GDPR

Saiba como usar a API da Singular para dar suporte a solicitações de GDPR.

 

Para saber como as solicitações dos titulares dos dados se encaixam em uma arquitetura de consentimento mais ampla, e por que o apagamento não é o mesmo que parar o rastreamento, consulte Consent Management with the Singular SDK: A Decision Framework.

O apagamento não é uma exclusão (opt-out).

Esta API exclui os dados em nível de usuário que a Singular coletou para um identificador. Ela não impede que o SDK no dispositivo do usuário continue enviando eventos futuros. Um usuário que exerce o apagamento e que também deve deixar de ser rastreado exige que o app chame stopAllTracking() (ou controle a inicialização do SDK), além de enviar a solicitação à API. Trate ambas as ações no mesmo fluxo de usuário.

Pontos de extremidade do GDPR

Ponto de extremidade Método URL Descrição
Discovery GET https://gdpr.singular.net/gdpr/discovery Retorna todos os tipos de solicitação atualmente suportados que a Singular pode processar por meio da API do GDPR.
Requests POST https://gdpr.singular.net/gdpr/requests Use esse endpoint para enviar novas solicitações de GDPR, enviadas por meio de uma solicitação HTTP POST, especificando as IDs de dispositivo para os titulares de dados solicitados.
Status GET https://gdpr.singular.net/gdpr/requests/request_id Retorna o status atual de uma solicitação enviada anteriormente, identificada por sua ID de solicitação.
Cancellation DELETE https://gdpr.singular.net/gdpr/requests/request_id Use esse ponto de extremidade para cancelar uma solicitação anterior. Isso é possível desde que a solicitação esteja no status "pendente".

Ponto de extremidade de descoberta

GET https://gdpr.singular.net/api/gdpr/discovery

Uso

O ponto de extremidade OpenGDPR Discovery retorna todos os tipos de solicitação atualmente suportados que a Singular pode processar por meio da API do GDPR.

Exemplo de consulta

import requests
  response = requests.get("https://gdpr.singular.net/api/gdpr/discovery")
  print(response.text)

Exemplo de saída

{
    "api_version": "0.1.4",
    "supported_identities": [
      {"identity_format": "raw","identity_type": "android_advertising_id"},
      {"identity_format": "raw","identity_type": "android_id"},
      {"identity_format": "raw","identity_type": "ios_advertising_id"},
      {"identity_format": "raw","identity_type": "ios_vendor_id"},
      {"identity_format": "raw","identity_type": "user_id"}
    ],
    "supported_subject_request_types": [
        "erasure",
        "access"
    ]
  }

Ponto de extremidade Requests (Solicitações)

POST https://gdpr.singular.net/api/gdpr/requests

Uso

O endpoint OpenGDPR Requests lida com novas solicitações GDPR, enviadas por meio de uma solicitação HTTP POST, especificando as IDs de dispositivo para os titulares dos dados solicitados.

Tempo de conclusão: As solicitações de apagamento são concluídas em até 30 dias após o envio. A resposta retorna um expected_completion_time; use-o para definir seus compromissos de resposta do Artigo 12 do GDPR.

Solicitações compatíveis

O ponto de extremidade OpenGDPR Requests suporta os seguintes tipos de solicitações, correspondentes a diferentes direitos do GDPR:

  • `erasure` - suporte a solicitações de usuários para exclusão de dados como parte do Artigo 17 do GDPR, Direito de exclusão
  • `access` - suporte a solicitações de usuários para acesso a dados como parte do Artigo 15 do GDPR, Direito de acesso

IDs compatíveis

O ponto de extremidade OpenGDPR Requests é compatível com os seguintes tipos de IDs:

  • `android_advertising_id` - solicitações feitas por meio do fornecimento da ID de publicidade do Google, também conhecida como GAID ou AIFA
  • `android_id` - solicitações feitas com o fornecimento do Android ID, também conhecido como ANDI
  • `ios_advertising_id` - solicitações feitas fornecendo o IDFA, que é o ID de publicidade do iOS
  • `ios_vendor_id` - solicitações feitas com o fornecimento do IDFV, que é o ID do iOS para fornecedores
  • `user_id` - solicitações feitas com o fornecimento do ID de usuário personalizado

IDFAs zerados são ignorados silenciosamente.

Em dispositivos com limit-ad-tracking ativado ou com um ATT AuthorizationStatus igual a denied, o IDFA fica zerado ("00000000-0000-0000-0000-000000000000"). Solicitações baseadas em um IDFA zerado são ignoradas e a API não retorna erro. Em vez disso, envie o `ios_vendor_id` (IDFV) para esses usuários. Como a falha é silenciosa, seu pipeline de DSR deve carregar e enviar o IDFV para os usuários de iOS que negaram o ATT.

Exemplo de consulta

import requests
  
  url = "https://gdpr.singular.net/api/gdpr/requests"
  
  payload = {
    "subject_request_id": "1c8b23f4-12eb-4fe8-af1c-0f72807dfec2",
    "subject_request_type": "access",
    "submitted_time": "2018-05-25T10:00:00Z",
    "subject_identities": [
      {
        "identity_type": "android_advertising_id",
        "identity_value": "38400000-8cf0-11bd-b23e-10b96e40000d",
        "identity_format": "raw"
      }
    ],
    "property_id": "Android:com.myapp.xyz",
  }
  
  headers = {
    "content-type": "application/json",
    "Authorization": "[API_KEY]"
  }
  
  response = requests.post(url, json=payload, headers=headers)
  print(response.text)

Parâmetros da consulta

Parâmetro Formato Descriçãodo parâmetro Exemplo
subject_request_id String Cadeia de caracteres UUIDv4  
subject_request_type String Valor de cadeia de caracteres que representa o tipo de solicitação OpenGDPR. Atualmente, a Singular suporta os valores: "erasure" (apagamento), "access" (acesso)  
subject_identities Array Uma lista de objetos de identidade que descreve o tipo, o valor e o formato de cada ID de dispositivo para o qual a solicitação deve ser atendida. Uma solicitação pode conter até 100 IDs de dispositivos.
[
  {
    "identity_type":
"android_advertising_id", "identity_value":
"38400-8cf0-11bd-b23e-1000d", "identity_format": "raw" } ]
submitted_time   Cadeia de datas RFC 3339 que representa a hora da solicitação original pelo titular dos dados 2010-05-25T10:00:00Z
property_id String O par [platform]:[longname] para especificar o aplicativo relevante. iOS:com.myapp.xyz

Exemplo de saída

{
    "controller_id":"example_controller_id",
    "received_time":"2018-05-25T10:00:01Z",
    "expected_completion_time": "2018-06-24T10:00:01Z",
    "encoded_request":"<BASE64 ENCODED REQUEST>",
    "subject_request_id":"1c8b23f4-12eb-4fe8-af1c-0f72807dfec2",
    "results_url": "https://url-to-results-in-json-format",
    "api_version": "0.1.4"
  }

Escopo da exclusão

O apagamento remove os registros em nível de usuário (logs e detalhes de atribuição) que a Singular mantém para o identificador. Os dados agregados (por exemplo, agregações de cohort) não são endereçáveis por dispositivo depois de agregados e não são afetados pelo apagamento. Descreva essa distinção na sua própria documentação de privacidade.

Ponto de extremidade de status

GET https://gdpr.singular.net/api/gdpr/requests/<REQUEST_ID>

Uso

Retorna o status atual de uma solicitação enviada anteriormente, identificada por sua ID de solicitação.

Exemplo de consulta

import requests
  url = "https://gdpr.singular.net/api/gdpr/requests/"
  subject_request_id = "1c8b23f4-12eb-4fe8-af1c-0f72807dfec2"
  headers = {"Authorization": "<API KEY>"}
  response = requests.get(url+subject_request_id, headers=headers)
  print(response.text)

Exemplo de saída

{
      "controller_id": "example_controller_id",
      "request_status": "completed",
      "expected_completion_time": "2018-06-24T10:00:01Z",
      "subject_request_id": "1c8b23f4-12eb-4fe8-af1c-0f72807dfec2",
      "api_version": "0.1.4"
  }

Ponto de extremidade de cancelamento

DELETE https://gdpr.singular.net/gdpr/requests/<REQUEST_ID>

Utilização

Use esse ponto de extremidade para cancelar uma solicitação anterior. Isso é possível desde que a solicitação esteja no status "pendente".

Consulta de amostra

import requests
  url = "https://gdpr.singular.net/api/gdpr/requests/"
  subject_request_id = "1c8b23f4-12eb-4fe8-af1c-0f72807dfec2"
  headers = {"Authorization": "<API KEY>"}
  response = requests.delete(url+subject_request_id, headers=headers)
  print(response.text)

Exemplo de saída

{
    "controller_id":"example_controller_id",
    "subject_request_id":"1c8b23f4-12eb-4fe8-af1c-0f72807dfec2",
    "received_time":"2018-05-25T10:00:01Z",
    "api_version":"0.1"
  }