API REST (Desarrolladores)
Endpoints CMP

Endpoints CMP

Endpoints para gestionar la Plataforma de Gestion de Consentimiento (Consent Management Platform) de DPOLab.

Los endpoints de gestion requieren autenticacion JWT. Los endpoints publicos son consumidos por el widget de consentimiento embebido (SDK).

Listar avisos de consentimiento

GET /api/v1/consent/notices

Query params:

ParamTipoDescripcion
isActivebooleanFiltrar por avisos activos/inactivos
pagenumberPagina (default: 1)
limitnumberRegistros por pagina (default: 20)

Ejemplo:

curl -X GET "https://api.dpolab.com/api/v1/consent/notices?isActive=true" \
  -H "Authorization: Bearer {token}"

Respuesta (200):

{
  "success": true,
  "data": {
    "items": [
      {
        "id": "ntc_abc123",
        "name": "Politica de cookies",
        "domain": "www.ejemplo.cl",
        "position": "bottom",
        "theme": "light",
        "isActive": true,
        "widgetKey": "wk_xyz789",
        "regulation": "ley_21719",
        "createdAt": "2026-01-10T09:00:00Z",
        "updatedAt": "2026-02-15T14:30:00Z"
      }
    ],
    "pagination": {
      "page": 1,
      "limit": 20,
      "total": 5,
      "totalPages": 1
    }
  }
}

Crear aviso de consentimiento

POST /api/v1/consent/notices

Body:

{
  "name": "Consentimiento de marketing",
  "domain": "www.ejemplo.cl",
  "position": "bottom",
  "theme": "light",
  "logoUrl": "https://ejemplo.cl/logo.png",
  "titleEs": "Politica de cookies",
  "descriptionEs": "Utilizamos cookies para mejorar tu experiencia en nuestro sitio",
  "regulation": "ley_21719",
  "purposes": [
    {
      "name": "Email marketing",
      "description": "Envio de ofertas y novedades por correo electronico",
      "isRequired": false,
      "retentionDays": 365
    },
    {
      "name": "Analitica web",
      "description": "Recopilacion de datos de navegacion para mejorar el sitio",
      "isRequired": false,
      "retentionDays": 180
    }
  ]
}

Campos requeridos: name, domain, position, theme, titleEs, descriptionEs, regulation, purposes (al menos uno).

Respuesta (201):

{
  "success": true,
  "data": {
    "id": "ntc_new456",
    "name": "Consentimiento de marketing",
    "isActive": false,
    "widgetKey": null,
    "createdAt": "2026-03-09T10:00:00Z"
  }
}

Obtener detalle de aviso

GET /api/v1/consent/notices/:id

Retorna el aviso con sus propositos asociados.

curl -X GET https://api.dpolab.com/api/v1/consent/notices/ntc_abc123 \
  -H "Authorization: Bearer {token}"

Respuesta (200):

{
  "success": true,
  "data": {
    "id": "ntc_abc123",
    "name": "Politica de cookies",
    "domain": "www.ejemplo.cl",
    "position": "bottom",
    "theme": "light",
    "logoUrl": "https://ejemplo.cl/logo.png",
    "titleEs": "Politica de cookies",
    "descriptionEs": "Utilizamos cookies para mejorar tu experiencia en nuestro sitio",
    "regulation": "ley_21719",
    "isActive": true,
    "widgetKey": "wk_xyz789",
    "purposes": [
      {
        "id": "prp_001",
        "name": "Cookies esenciales",
        "description": "Necesarias para el funcionamiento del sitio",
        "isRequired": true,
        "retentionDays": null
      },
      {
        "id": "prp_002",
        "name": "Cookies de analitica",
        "description": "Medir el uso del sitio con fines de mejora",
        "isRequired": false,
        "retentionDays": 180
      },
      {
        "id": "prp_003",
        "name": "Cookies de marketing",
        "description": "Publicidad personalizada y remarketing",
        "isRequired": false,
        "retentionDays": 365
      }
    ],
    "createdAt": "2026-01-10T09:00:00Z",
    "updatedAt": "2026-02-15T14:30:00Z"
  }
}

Actualizar aviso

PUT /api/v1/consent/notices/:id

Acepta actualizacion parcial de los campos del aviso. Opcionalmente puede incluir un array purposes[] para reemplazar los propositos existentes.

curl -X PUT https://api.dpolab.com/api/v1/consent/notices/ntc_abc123 \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Politica de cookies actualizada",
    "descriptionEs": "Descripcion actualizada del aviso",
    "purposes": [
      {
        "name": "Cookies esenciales",
        "description": "Necesarias para el funcionamiento del sitio",
        "isRequired": true
      }
    ]
  }'
⚠️

Si el aviso ya esta publicado, los cambios se reflejan inmediatamente en el widget. Se recomienda despublicar antes de hacer cambios significativos.

Publicar aviso

POST /api/v1/consent/notices/:id/publish

Publica el aviso, lo marca como activo (isActive: true) y genera un widgetKey unico si no existe. El widgetKey se usa para integrar el widget en sitios web.

curl -X POST https://api.dpolab.com/api/v1/consent/notices/ntc_new456/publish \
  -H "Authorization: Bearer {token}"

Respuesta (200):

{
  "success": true,
  "data": {
    "id": "ntc_new456",
    "isActive": true,
    "widgetKey": "wk_a1b2c3d4"
  }
}

El widgetKey generado se usa en el SDK de consentimiento de DPOLab para cargar la configuracion del aviso en el sitio web del cliente.

Listar registros de consentimiento

GET /api/v1/consent/notices/:id/records

Lista todos los registros de consentimiento asociados a un aviso (paginado).

Query params:

ParamTipoDescripcion
pagenumberPagina (default: 1)
limitnumberRegistros por pagina (default: 20)
curl -X GET "https://api.dpolab.com/api/v1/consent/notices/ntc_abc123/records?page=1&limit=10" \
  -H "Authorization: Bearer {token}"

Respuesta (200):

{
  "success": true,
  "data": {
    "items": [
      {
        "id": "rec_001",
        "userRef": "[email protected]",
        "sessionId": "sess_abc123",
        "choices": {
          "prp_001": true,
          "prp_002": true,
          "prp_003": false
        },
        "action": "partial",
        "source": "widget",
        "createdAt": "2026-03-01T12:30:00Z"
      }
    ],
    "pagination": {
      "page": 1,
      "limit": 10,
      "total": 1250,
      "totalPages": 125
    }
  }
}

Estadisticas de consentimiento

GET /api/v1/consent/notices/:id/stats

Obtiene estadisticas agregadas de consentimiento para un aviso: total de registros, estadisticas por proposito y linea de tiempo.

curl -X GET https://api.dpolab.com/api/v1/consent/notices/ntc_abc123/stats \
  -H "Authorization: Bearer {token}"

Respuesta (200):

{
  "success": true,
  "data": {
    "total": 1250,
    "purposeStats": [
      {
        "purposeId": "prp_001",
        "name": "Cookies esenciales",
        "accepted": 1250,
        "rejected": 0,
        "rate": 100
      },
      {
        "purposeId": "prp_002",
        "name": "Cookies de analitica",
        "accepted": 980,
        "rejected": 270,
        "rate": 78.4
      },
      {
        "purposeId": "prp_003",
        "name": "Cookies de marketing",
        "accepted": 620,
        "rejected": 630,
        "rate": 49.6
      }
    ],
    "timeline": [
      {
        "date": "2026-03-01",
        "count": 45
      },
      {
        "date": "2026-03-02",
        "count": 52
      }
    ]
  }
}

Endpoints Publicos

Los siguientes endpoints son consumidos por el widget de consentimiento embebido en sitios web. No requieren autenticacion JWT.

Obtener configuracion del widget

GET /api/v1/public/consent/:widgetKey/config

Retorna la configuracion del aviso de consentimiento para renderizar el widget (posicion, tema, logo, propositos, etc.).

curl -X GET https://api.dpolab.com/api/v1/public/consent/wk_a1b2c3d4/config

Respuesta (200):

{
  "success": true,
  "data": {
    "position": "bottom",
    "theme": "light",
    "logoUrl": "https://ejemplo.cl/logo.png",
    "titleEs": "Politica de cookies",
    "descriptionEs": "Utilizamos cookies para mejorar tu experiencia en nuestro sitio",
    "purposes": [
      {
        "id": "prp_001",
        "name": "Cookies esenciales",
        "description": "Necesarias para el funcionamiento del sitio",
        "isRequired": true
      },
      {
        "id": "prp_002",
        "name": "Cookies de analitica",
        "description": "Medir el uso del sitio con fines de mejora",
        "isRequired": false
      }
    ]
  }
}

Registrar decision de consentimiento

POST /api/v1/public/consent/:widgetKey/record

Registra la decision del visitante respecto a cada proposito de consentimiento.

curl -X POST https://api.dpolab.com/api/v1/public/consent/wk_a1b2c3d4/record \
  -H "Content-Type: application/json" \
  -d '{
    "userRef": "[email protected]",
    "sessionId": "sess_abc123",
    "choices": {
      "prp_001": true,
      "prp_002": true,
      "prp_003": false
    },
    "action": "partial",
    "source": "widget"
  }'

Campos requeridos: userRef, sessionId, choices, action, source.

Respuesta (201):

{
  "success": true,
  "data": {
    "id": "rec_new789",
    "createdAt": "2026-03-09T15:00:00Z"
  }
}

El campo userRef identifica al usuario (puede ser email u otro identificador). El sessionId permite agrupar decisiones por sesion de navegacion.


Consent Templates

Los templates permiten gestionar consentimiento multi-canal (web, formulario, API, manual, webhook).

Listar templates

GET /api/v1/consent/templates

Query params:

ParamTipoDescripcion
legalEntityIdstringFiltrar por entidad legal
domainIdstringFiltrar por dominio
categorystringFiltrar por categoria
isActivebooleanFiltrar por estado
pagenumberPagina (default: 1)
limitnumberRegistros por pagina (default: 20)

Crear template

POST /api/v1/consent/templates

Obtener template

GET /api/v1/consent/templates/:id

Actualizar template

PUT /api/v1/consent/templates/:id

Eliminar template

DELETE /api/v1/consent/templates/:id

Registros de un template

GET /api/v1/consent/templates/:id/records

Estadisticas de un template

GET /api/v1/consent/templates/:id/stats

Registro manual de consentimiento

POST /api/v1/consent/templates/:id/manual

Registra un consentimiento dado por canal no digital (telefono, presencial, etc.).


Webhooks de Consentimiento

Crear webhook

POST /api/v1/consent/templates/:id/webhooks

Body:

{
  "name": "Webhook CRM",
  "purposeMapping": {
    "marketing_consent": "prp_001",
    "analytics_consent": "prp_002"
  }
}

Respuesta (201):

{
  "success": true,
  "data": {
    "id": "wh_abc123",
    "endpointKey": "ek_xyz789",
    "webhookUrl": "https://api.dpolab.com/api/v1/consent/webhooks/inbound/ek_xyz789",
    "signingSecret": "whsec_a1b2c3..."
  }
}

Listar webhooks

GET /api/v1/consent/templates/:id/webhooks

Actualizar webhook

PUT /api/v1/consent/templates/:id/webhooks/:webhookId

Eliminar webhook

DELETE /api/v1/consent/templates/:id/webhooks/:webhookId

Ver logs de un webhook

GET /api/v1/consent/templates/:id/webhooks/:webhookId/logs

Rotar secreto de webhook

POST /api/v1/consent/templates/:id/webhooks/:webhookId/rotate-secret

Formulario Publico

Obtener configuracion del formulario

GET /api/v1/public/consent-form/:formKey/config

Endpoint publico que retorna la configuracion del formulario de consentimiento para renderizarlo.

Enviar respuesta del formulario

POST /api/v1/public/consent-form/:formKey/submit

Registra las respuestas del titular desde el formulario hosteado.


API Externa (Server-to-Server)

Endpoints autenticados con API Key para integraciones programaticas. Ver Configuracion y API Keys para detalles completos.

Ver tambien