Endpoints Privacy Portal
Endpoints del Portal de Privacidad unificado por tenant. Permite a los titulares verificar su identidad, consultar todos sus consentimientos (web y multi-canal) y gestionar sus solicitudes ARCO.
Estos endpoints son públicos (no requieren JWT). La autenticación se realiza mediante magic link (verificación por email) y session token almacenado en Redis (TTL 1 hora).
Endpoints sin autenticación
Obtener configuración del portal
GET /api/v1/public/privacy-portal/{tenantSlug}/configRetorna la configuración pública del portal para renderizar la página de verificación.
curl -X GET https://api.dpolab.com/api/v1/public/privacy-portal/mi-empresa/configRespuesta (200):
{
"success": true,
"data": {
"tenantName": "Mi Empresa SpA",
"tenantSlug": "mi-empresa",
"dpoName": "Maria Garcia",
"dpoEmail": "[email protected]",
"arcoEmail": "[email protected]",
"entities": [
{ "id": "ent_001", "name": "Mi Empresa SpA" },
{ "id": "ent_002", "name": "Mi Empresa Servicios Ltda" }
]
}
}Enviar magic link de verificación
POST /api/v1/public/privacy-portal/{tenantSlug}/verify-emailEnvía un enlace de verificación al email del titular. El enlace expira en 1 hora.
curl -X POST https://api.dpolab.com/api/v1/public/privacy-portal/mi-empresa/verify-email \
-H "Content-Type: application/json" \
-d '{ "email": "[email protected]" }'Respuesta (200):
{
"success": true,
"data": {
"message": "Enlace de verificación enviado a su correo"
}
}Verificar token (magic link)
GET /api/v1/public/privacy-portal/{tenantSlug}/verify/{token}Valida el token de verificación y retorna un session token para acceder a los endpoints protegidos. El token de verificación se consume (un solo uso).
curl -X GET https://api.dpolab.com/api/v1/public/privacy-portal/mi-empresa/verify/abc123...Respuesta (200):
{
"success": true,
"data": {
"sessionToken": "def456...",
"email": "[email protected]"
}
}El sessionToken tiene un TTL de 1 hora. Después de expirar, el titular debe verificar su email nuevamente.
Endpoints con autenticación (Session Token)
Los siguientes endpoints requieren el header:
Authorization: Bearer {sessionToken}Obtener todos los consentimientos
GET /api/v1/public/privacy-portal/{tenantSlug}/consentsRetorna los consentimientos más recientes del titular, agrupados por avisos web y plantillas multi-canal.
curl -X GET https://api.dpolab.com/api/v1/public/privacy-portal/mi-empresa/consents \
-H "Authorization: Bearer {sessionToken}"Respuesta (200):
{
"success": true,
"data": {
"webConsents": [
{
"noticeId": "ntc_001",
"noticeName": "Cookies www.mi-empresa.cl",
"choices": { "analytics": true, "marketing": false },
"action": "GIVEN",
"updatedAt": "2026-03-15T10:00:00Z"
}
],
"templateConsents": [
{
"templateId": "tpl_001",
"templateName": "Videovigilancia oficina Santiago",
"category": "SURVEILLANCE",
"choices": { "cctv_recording": true },
"action": "GIVEN",
"channel": "MANUAL",
"updatedAt": "2026-03-20T14:00:00Z"
},
{
"templateId": "tpl_002",
"templateName": "Newsletter marketing",
"category": "CUSTOM",
"choices": { "email_marketing": true, "sms_marketing": false },
"action": "UPDATED",
"channel": "FORM_LINK",
"updatedAt": "2026-04-01T09:00:00Z"
}
]
}
}La consulta usa DISTINCT ON para obtener el último registro por aviso/plantilla. Los consentimientos web (webConsents) provienen de consent_notices y los multi-canal (templateConsents) de consent_templates.
Actualizar consentimiento de una plantilla
POST /api/v1/public/privacy-portal/{tenantSlug}/consent/{templateId}/updateCrea un nuevo registro de consentimiento con las preferencias actualizadas. No sobreescribe registros anteriores (audit trail inmutable).
curl -X POST https://api.dpolab.com/api/v1/public/privacy-portal/mi-empresa/consent/tpl_002/update \
-H "Authorization: Bearer {sessionToken}" \
-H "Content-Type: application/json" \
-d '{
"choices": {
"email_marketing": false,
"sms_marketing": false
}
}'Respuesta (200):
{
"success": true,
"data": { "id": "rec_new123" }
}El registro se crea con action = UPDATED, channel = PRIVACY_CENTER y source = PRIVACY_CENTER.
Retirar consentimiento de una plantilla
POST /api/v1/public/privacy-portal/{tenantSlug}/consent/{templateId}/withdrawRetira todos los consentimientos de la plantilla. Los propósitos marcados como esenciales (is_essential = true) se mantienen activos.
curl -X POST https://api.dpolab.com/api/v1/public/privacy-portal/mi-empresa/consent/tpl_001/withdraw \
-H "Authorization: Bearer {sessionToken}"Respuesta (200):
{
"success": true,
"data": { "message": "Consentimiento retirado" }
}El registro se crea con action = WITHDRAWN y todos los propósitos en false excepto los esenciales.
Listar solicitudes ARCO del titular
GET /api/v1/public/privacy-portal/{tenantSlug}/requestsLista las solicitudes ARCO creadas por el titular en este tenant.
curl -X GET https://api.dpolab.com/api/v1/public/privacy-portal/mi-empresa/requests \
-H "Authorization: Bearer {sessionToken}"Respuesta (200):
{
"success": true,
"data": [
{
"id": "req_001",
"folioNumber": "ARCO-2026-00001",
"rightType": "ACCESS",
"status": "IN_PROGRESS",
"receivedAt": "2026-03-20T10:00:00Z",
"deadlineAt": "2026-04-19T10:00:00Z"
}
]
}Códigos de error
| HTTP | Código | Descripción |
|---|---|---|
| 401 | UNAUTHORIZED | Session token no proporcionado |
| 401 | SESSION_EXPIRED | Session token expirado (1 hora) |
| 401 | INVALID_TOKEN | Token de verificación inválido o ya consumido |
| 404 | NOT_FOUND | Tenant o plantilla no encontrado |
Ver también
- Centro de Privacidad — Guía funcional del portal
- Endpoints CMP — Referencia API de consentimiento
- SDK — Centro de Privacidad — Integración técnica del portal por widgetKey