API REST (Desarrolladores)
Contratos

Contratos DPA

Endpoints para gestionar contratos de encargo de tratamiento de datos personales (DPA) según Art. 15 bis de la Ley 21.719.

Todos los endpoints requieren autenticación JWT y el feature flag RAT activo en el plan del tenant.

Generar contrato desde plantilla

POST /api/v1/contracts/generate

Genera un contrato prellenado a partir de una plantilla, un encargado de tratamiento y las actividades asociadas.

Body:

{
  "processorId": "proc_abc123",
  "templateId": "tpl_dpa01",
  "activityIds": ["act_001", "act_002"],
  "customFields": {
    "encargado_rut": "77654321-0",
    "encargado_email": "[email protected]",
    "encargado_representante": "María García",
    "plazo_contrato": "24 meses"
  }
}

Campos requeridos: processorId, templateId, activityIds (mínimo 1).

Respuesta (201):

{
  "success": true,
  "data": {
    "contractId": "ctr_new456",
    "type": "DPA",
    "content": "<html>Contenido renderizado del contrato...</html>"
  }
}

El campo customFields permite sobreescribir variables de la plantilla. Las variables del tenant, encargado y actividades se completan automáticamente.


Listar contratos

GET /api/v1/contracts

Query params:

ParamTipoDescripción
statusstringFiltrar por estado: DRAFT, SENT, SIGNED, EXPIRED, TERMINATED
typestringFiltrar por tipo: DPA, CCT, ADDENDUM
expiringSoonstring"true" para contratos próximos a vencer
pagenumberPágina (default: 1)
limitnumberRegistros por página (default: 20, máx: 100)
curl -X GET "https://api.dpolab.com/api/v1/contracts?status=SIGNED" \
  -H "Authorization: Bearer {token}"

Respuesta (200):

{
  "success": true,
  "data": {
    "contracts": [
      {
        "id": "ctr_abc123",
        "type": "DPA",
        "status": "SIGNED",
        "processorId": "proc_abc123",
        "signedAt": "2026-01-20T14:00:00Z",
        "expiresAt": "2027-01-20T14:00:00Z",
        "createdAt": "2026-01-15T10:00:00Z"
      }
    ],
    "pagination": {
      "page": 1,
      "limit": 20,
      "total": 8,
      "totalPages": 1
    }
  }
}

Obtener detalle del contrato

GET /api/v1/contracts/:id
curl -X GET https://api.dpolab.com/api/v1/contracts/ctr_abc123 \
  -H "Authorization: Bearer {token}"

Respuesta (200):

{
  "success": true,
  "data": {
    "id": "ctr_abc123",
    "type": "DPA",
    "status": "SIGNED",
    "processorId": "proc_abc123",
    "activityId": "act_001",
    "templateId": "tpl_dpa01",
    "content": "Contenido completo del contrato...",
    "version": 1,
    "signerName": "María García",
    "signerEmail": "[email protected]",
    "signerRut": "77654321-0",
    "signedAt": "2026-01-20T14:00:00Z",
    "expiresAt": "2027-01-20T14:00:00Z",
    "createdAt": "2026-01-15T10:00:00Z",
    "updatedAt": "2026-01-20T14:00:00Z"
  }
}

Actualizar contrato

PUT /api/v1/contracts/:id

Solo se pueden editar contratos en estado DRAFT. Campos actualizables:

{
  "content": "Contenido actualizado...",
  "expiresAt": "2027-06-01T00:00:00Z",
  "signerName": "Juan Pérez",
  "signerEmail": "[email protected]",
  "signerRut": "12345678-9"
}

Todos los campos son opcionales.

⚠️

Solo se pueden editar contratos en estado DRAFT. Contratos enviados o firmados no pueden modificarse.


Eliminar contrato

DELETE /api/v1/contracts/:id

Solo se pueden eliminar contratos en estado DRAFT.

curl -X DELETE https://api.dpolab.com/api/v1/contracts/ctr_man789 \
  -H "Authorization: Bearer {token}"

Enviar contrato para firma

POST /api/v1/contracts/:id/send

Envía el contrato al firmante por correo electrónico. El contrato debe estar en estado DRAFT.

Body:

{
  "signerName": "María García",
  "signerEmail": "[email protected]"
}

Campos requeridos: signerName, signerEmail.

curl -X POST https://api.dpolab.com/api/v1/contracts/ctr_abc123/send \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "signerName": "María García",
    "signerEmail": "[email protected]"
  }'

Respuesta (200):

{
  "success": true,
  "data": {
    "id": "ctr_abc123",
    "status": "SENT"
  }
}

Registrar firma

POST /api/v1/contracts/:id/sign

Registra la firma del contrato. El contrato debe estar en estado SENT. La fecha de firma se establece automáticamente.

Body:

{
  "signerName": "María García",
  "signerRut": "12345678-9"
}

Campos requeridos: signerName. signerRut es opcional.

Respuesta (200):

{
  "success": true,
  "data": {
    "id": "ctr_abc123",
    "status": "SIGNED",
    "signedAt": "2026-03-09T14:00:00Z"
  }
}

Al firmar un contrato, el estado DPA del encargado de tratamiento (processing_processors) se actualiza automáticamente a SIGNED.


Renovar contrato

POST /api/v1/contracts/:id/renew

Crea una nueva versión del contrato como borrador (DRAFT). Solo se pueden renovar contratos en estado SIGNED o EXPIRED. No requiere body.

curl -X POST https://api.dpolab.com/api/v1/contracts/ctr_abc123/renew \
  -H "Authorization: Bearer {token}"

Respuesta (201):

{
  "success": true,
  "data": {
    "id": "ctr_renew001",
    "version": 2,
    "previousContractId": "ctr_abc123"
  }
}

Plantillas de Contratos

Listar plantillas

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

Respuesta (200):

{
  "success": true,
  "data": {
    "templates": [
      {
        "id": "tpl_dpa01",
        "name": "Contrato de Encargo de Tratamiento (DPA)",
        "type": "DPA",
        "variables": [
          { "key": "plazo_contrato", "label": "Plazo del contrato" },
          { "key": "encargado_rut", "label": "RUT del encargado" }
        ],
        "createdAt": "2026-01-01T00:00:00Z"
      }
    ]
  }
}

Crear plantilla

POST /api/v1/contracts/templates

Body:

{
  "name": "Acuerdo de Responsables Conjuntos",
  "type": "CCT",
  "content": "Contenido de la plantilla con {{variables}} de sustitución...",
  "variables": [
    { "key": "serviceName", "label": "Nombre del servicio", "description": "Servicio contratado" },
    { "key": "dataCategories", "label": "Categorías de datos" }
  ]
}

Campos requeridos: name, type, content.

Tipos válidos: DPA, CCT, ADDENDUM.

Actualizar plantilla

PUT /api/v1/contracts/templates/:id

Acepta los mismos campos que la creación, todos opcionales.


Estados del contrato

EstadoDescripción
DRAFTBorrador, editable
SENTEnviado al firmante
SIGNEDFirmado
EXPIREDVencido (fecha expiración superada)
TERMINATEDTerminado anticipadamente

Tipos de contrato

TipoDescripción
DPAContrato de Encargo de Tratamiento
CCTCláusulas Contractuales Tipo (transferencia internacional)
ADDENDUMAdenda a contrato existente

Ver también