Aprenda a utilizar la API Singular para dar soporte a las solicitudes GDPR.
Para saber cómo encajan las solicitudes de los titulares de los datos en una arquitectura de consentimiento más amplia, y por qué el borrado no es lo mismo que detener el seguimiento, consulta Consent Management with the Singular SDK: A Decision Framework.
El borrado no es una exclusión (opt-out).
Esta API elimina los datos a nivel de usuario que Singular ha recopilado para un identificador. No impide que el SDK del dispositivo del usuario siga enviando eventos futuros. Un usuario que ejerce el borrado y que además debe dejar de ser rastreado requiere que la app llame a stopAllTracking() (o controle la inicialización del SDK) además de enviar la solicitud a la API. Gestiona ambas acciones en el mismo flujo de usuario.
Puntos finales GDPR
| Punto final | Método | URL | Descripción |
| Discovery | GET | https://gdpr.singular.net/gdpr/discovery | Devuelve todos los tipos de solicitud admitidos actualmente que Singular puede procesar a través de la API GDPR. |
| Requests | POST | https://gdpr.singular.net/gdpr/requests | Utilice este punto final para enviar nuevas solicitudes GDPR, enviadas a través de una solicitud HTTP POST especificando los ID de dispositivo de los sujetos de datos solicitados. |
| Status | GET | https://gdpr.singular.net/gdpr/requests/request_id | Devuelve el estado actual de una solicitud enviada previamente, identificada por su ID de solicitud. |
| Cancellation | DELETE | https://gdpr.singular.net/gdpr/requests/request_id | Utilice este punto final para cancelar una solicitud anterior. Esto es posible siempre que la solicitud se encuentre en estado "pendiente". |
Punto final de descubrimiento
| GET | https://gdpr.singular.net/api/gdpr/discovery |
Uso
El punto final OpenGDPR Discovery devuelve todos los tipos de solicitud admitidos actualmente que Singular puede procesar a través de la API GDPR.
Ejemplo de consulta
import requests
response = requests.get("https://gdpr.singular.net/api/gdpr/discovery")
print(response.text)
Ejemplo de salida
{
"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"
]
}
Punto final de solicitudes
| POST | https://gdpr.singular.net/api/gdpr/requests |
Uso
El punto final OpenGDPR Requests gestiona nuevas solicitudes GDPR, enviadas a través de una solicitud HTTP POST mientras se especifican los ID de dispositivo para los sujetos de datos solicitados.
Tiempo de finalización: Las solicitudes de borrado se completan en un plazo máximo de 30 días desde su envío. La respuesta devuelve un expected_completion_time; úsalo para establecer tus compromisos de respuesta del Artículo 12 del GDPR.
Solicitudes admitidas
El endpoint OpenGDPR Requests admite los siguientes tipos de solicitudes, correspondientes a diferentes derechos GDPR:
- `erasure` - solicitudes de eliminación de datos como parte del artículo 17 del GDPR, Derecho a la eliminación
- `access` - solicitudes de acceso a los datos en virtud del artículo 15 del RGPD, Derecho de acceso.
ID compatibles
El punto final OpenGDPR Requests admite los siguientes tipos de ID:
- `android_advertising_id` - solicitudes realizadas proporcionando el ID de publicidad de Google, también conocido como GAID o AIFA
- `android_id` - solicitudes realizadas proporcionando el ID de Android, también conocido como ANDI
- `ios_advertising_id` - solicitudes realizadas proporcionando el IDFA, que es el ID de publicidad de iOS
- `ios_vendor_id` - solicitudes realizadas proporcionando IDFV, que es el ID de iOS para proveedores
- `user_id` - solicitudes realizadas proporcionando el ID de usuario personalizado
Los IDFA en cero se ignoran de forma silenciosa.
En dispositivos con limit-ad-tracking activado o con un ATT AuthorizationStatus igual a denied, el IDFA queda en cero ("00000000-0000-0000-0000-000000000000"). Las solicitudes basadas en un IDFA en cero se ignoran y la API no devuelve ningún error. En su lugar, envía el `ios_vendor_id` (IDFV) para estos usuarios. Como el fallo es silencioso, tu pipeline de DSR debe llevar y enviar el IDFV para los usuarios de iOS que denegaron el ATT.
Ejemplo 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 de consulta
| Parámetro | Formato | Descripción | Ejemplo |
| subject_request_id | String | UUIDv4 cadena | |
| subject_request_type | String | Valor de cadena que representa el tipo de solicitud OpenGDPR. Singular admite actualmente los valores "borrado", "portabilidad", "acceso" | |
| subject_identities | Array | Una lista de objetos de identidad que describen el tipo, valor y formato de cada ID de dispositivo para el que se realiza la solicitud. Una solicitud puede contener hasta 100 identificadores de dispositivo. |
|
| submitted_time | RFC 3339 cadena de fecha que representa la hora de la solicitud original por parte del interesado | 2010-05-25T10:00:00Z | |
| property_id | String | El par [platform]:[longname] para especificar la aplicación pertinente. | iOS:com.myapp.xyz |
Ejemplo de salida
{
"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"
}
Alcance de la eliminación
El borrado elimina los registros a nivel de usuario (logs y detalle de atribución) que Singular conserva para el identificador. Los datos agregados (por ejemplo, los resúmenes de cohortes) no son direccionables por dispositivo una vez agregados y no se ven afectados por el borrado. Describe esta distinción en tu propia documentación de privacidad.
Estado del punto final
| GET | https://gdpr.singular.net/api/gdpr/requests/<REQUEST_ID> |
Uso
Devuelve el estado actual de una solicitud enviada previamente, identificada por su ID de solicitud.
Ejemplo 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)
Ejemplo de salida
{
"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"
}
Punto final de cancelación
| DELETE | https://gdpr.singular.net/gdpr/requests/<REQUEST_ID> |
Uso
Utilice este punto final para cancelar una solicitud anterior. Esto es posible siempre que la solicitud se encuentre en estado "pendiente".
Ejemplo 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.delete(url+subject_request_id, headers=headers)
print(response.text)
Ejemplo de salida
{
"controller_id":"example_controller_id",
"subject_request_id":"1c8b23f4-12eb-4fe8-af1c-0f72807dfec2",
"received_time":"2018-05-25T10:00:01Z",
"api_version":"0.1"
}