API REST (Desarrolladores)
Privacy Portal Unificado

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}/config

Retorna 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/config

Respuesta (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-email

Enví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}/consents

Retorna 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}/update

Crea 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}/withdraw

Retira 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}/requests

Lista 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

HTTPCódigoDescripción
401UNAUTHORIZEDSession token no proporcionado
401SESSION_EXPIREDSession token expirado (1 hora)
401INVALID_TOKENToken de verificación inválido o ya consumido
404NOT_FOUNDTenant o plantilla no encontrado

Ver también