Propósito
Registra una decisión de contacto para una organización. Crea o actualiza la fila única definida por organización, identificador normalizado y canal, emite un recibo inmutable encadenado al registro de evidencia con la versión del aviso vigente y, si el identificador es un correo, envía el recibo al titular con el enlace a su centro de preferencias. Requiere el permiso consents:write.
Método y ruta
POST /api/v1/organizations/:organization/consents
Body JSON
| Campo | Tipo | Obligatorio | Reglas |
|---|---|---|---|
subjectType |
string enum | Sí | email, rut, phone, custom |
subjectValue |
string | Sí | Trim, longitud 1..512 y normalización según subjectType. |
channel |
string enum | Sí | email, whatsapp |
given |
boolean | Sí | true otorga; false registra revocación o no consentimiento. |
purposeId |
integer | No | ID de una finalidad del inventario de la organización, por ejemplo marketing. |
curl
curl --fail-with-body \
-X POST \
-H "Authorization: Bearer $TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
"$BASE_URL/api/v1/organizations/$ORGANIZATION/consents" \
--data '{
"subjectType": "email",
"subjectValue": " Ada@Example.COM ",
"channel": "email",
"given": true,
"purposeId": 12
}'
Respuesta 201
{
"id": 91,
"subjectType": "email",
"subjectValue": "ada@example.com",
"channel": "email",
"given": true,
"source": "api",
"consentedAt": "2026-08-23T04:05:00.000+00:00",
"revokedAt": null,
"updatedAt": "2026-08-23T04:05:00.000+00:00",
"receipt": {
"id": 310,
"subjectDisplay": "a***@example.com",
"purposeId": 12,
"channel": "email",
"given": true,
"noticeVersion": "2026-09",
"parentReceiptId": null,
"createdAt": "2026-08-23T04:05:00.000+00:00",
"consentTextSnapshot": "Acepto recibir ofertas, promociones y publicidad por correo electrónico.",
"context": null
},
"preferenceUrl": "https://app.lpdatos.cl/preferencias/acme?token=..."
}
Errores relevantes
401: credencial ausente o inválida.403: la credencial no tieneconsents:write.404::organizationno es la organización de la credencial.422: body, identificador opurposeIdinválido.
Semántica y límites
- No es un alta estricta. Repetir el
POSTpara la misma clave actualiza la fila existente y responde201con un recibo nuevo enlazado al anterior (parentReceiptId). - Con
given: true, la API actualizaconsentedAty limpiarevokedAt. Congiven: false, fijarevokedAt. noticeVersiones la versión del aviso de privacidad publicada al momento del registro. Sin aviso publicado, el recibo sale consin-version-publicada.contextincluye IP y agente de usuario solo si la organización activó esa captura en su configuración.preferenceUrlesnullcuando el identificador no es un correo.
Los IDs y fechas son ilustrativos; los campos y la semántica corresponden al contrato publicado.