API REST (Desarrolladores)
Introducción

Introducción a la API REST

Esta es la referencia técnica para desarrolladores. Si buscas la documentación de uso de la plataforma (módulos, configuración, guías), está en la documentación de usuario.

La API REST de DPOLab permite integrar los módulos de cumplimiento de privacidad en tus sistemas internos. Todos los endpoints siguen convenciones coherentes de autenticación, paginación y manejo de errores.

Esta API es para integración de tenants. No incluye endpoints de administración interna de la plataforma.

Base URL

https://api.dpolab.com/api/v1

Todos los ejemplos de esta documentación usan esta URL base. En entornos de desarrollo local, reemplázala por http://localhost:3001/api/v1.

Autenticación

La API utiliza JWT Bearer Token para todos los endpoints autenticados. El token se envía en el encabezado Authorization:

Authorization: Bearer {token}

El token JWT se obtiene al iniciar sesión mediante POST /auth/login. Tiene una vigencia limitada; cuando expira, el cliente debe renovarlo usando el refresh token (enviado automáticamente como cookie httpOnly).

⚠️

El tenant se resuelve automáticamente desde el JWT. Nunca envíes el tenant como parámetro de URL ni en el cuerpo de la solicitud. Hacerlo no tendrá efecto — el sistema siempre usa el tenant del token.

Algunos endpoints admiten autenticación mediante API Key para integraciones server-to-server. En ese caso, envía la clave en el encabezado X-API-Key. Consulta la documentación de autenticación para más detalle.

Los endpoints públicos (formulario de consentimiento, portal ARSOP, cuestionarios compartidos) no requieren autenticación; se identifican con un token de acceso único en la URL.

Multi-tenancy

DPOLab es una plataforma multi-tenant. Cada organización opera en un tenant aislado. El aislamiento es automático: toda solicitud autenticada opera exclusivamente sobre los datos del tenant del token.

No existe forma de acceder a datos de otro tenant mediante la API de tenant. Los endpoints de administración de plataforma son independientes y no están documentados aquí.

Formato de respuesta

Todas las respuestas tienen la misma estructura:

Éxito:

{
  "success": true,
  "data": { ... }
}

Error:

{
  "success": false,
  "error": {
    "code": "RESOURCE_NOT_FOUND",
    "message": "Actividad no encontrada"
  }
}

El campo code es una constante en mayúsculas que puedes usar en tu código para manejar errores específicos. El campo message es un texto legible para humanos (en español).

Paginación

Los endpoints de listado usan paginación offset con los parámetros page y limit:

ParámetroTipoDefaultMáximoDescripción
pageinteger1Número de página
limitinteger20100Registros por página

La respuesta incluye un objeto pagination:

{
  "success": true,
  "data": {
    "items": [ ... ],
    "pagination": {
      "page": 1,
      "limit": 20,
      "total": 87,
      "totalPages": 5
    }
  }
}

Rate limiting

El límite de solicitudes depende de tu plan:

PlanLímiteEncabezado
Starter100 req/minX-RateLimit-Remaining
Professional500 req/minX-RateLimit-Remaining
Enterprise2.000 req/minX-RateLimit-Remaining

El plan Business tiene un límite intermedio, superior al de Professional. Cuando superas el límite, la API responde con HTTP 429 y el código RATE_LIMIT_EXCEEDED. El encabezado X-RateLimit-Remaining indica cuántas solicitudes te quedan en el período actual.

Códigos de error

Código HTTPCódigo de errorDescripción
400VALIDATION_ERRORCampos faltantes o con formato incorrecto
401UNAUTHORIZEDToken ausente, inválido o expirado
403FORBIDDENSin permiso para realizar esta acción
403FEATURE_DISABLEDFunción no disponible en tu plan actual
404RESOURCE_NOT_FOUNDEl recurso solicitado no existe
409CONFLICTEstado incompatible con la operación (p. ej., recurso ya publicado)
422VALIDATION_ERRORDatos válidos en formato pero semánticamente incorrectos
429RATE_LIMIT_EXCEEDEDDemasiadas solicitudes
500INTERNAL_ERRORError interno del servidor

Referencia completa

La Referencia Completa documenta todos los endpoints disponibles agrupados por módulo, incluyendo parámetros, cuerpos de solicitud y ejemplos de respuesta.