Crear Consentimiento
Crear Consentimiento
POST /cl/consent_manager/create_consent
Registra un nuevo consentimiento de consulta de información comercial o crediticia según normativa RDC30 (NCG 540).
- URL completa (prod):
https://api.floid.app/cl/consent_manager/create_consent - URL sandbox:
https://sandbox.floid.app/cl/consent_manager/create_consent - Versión API: 3.1.0 (RDC30 Compliance)
Headers requeridos
Authorization: Bearer {{TOKEN}}
Content-Type: application/json
Para subir el archivo de evidencia directamente (en lugar de pasar
evidence.url), enviá la request comoContent-Type: multipart/form-datacon el archivo en el campoconsent_file. Sólo aplica si tu institución está configurada en modoFLOID_STORAGE.
Parámetros de entrada
Campos obligatorios (todos los consentimientos)
| Campo | Tipo | Descripción | Ejemplo |
|---|---|---|---|
codigo_institucion | string | Código de 9 dígitos de la institución (CMF) | "123456789" |
codigo_interno_consentimiento | string | Código único por institución (máx 20 caracteres). A partir de v3.0 es estrictamente requerido: no se auto-genera. | "BCH-2026-001" |
tipo_persona | string | NATURAL o JURIDICA | "NATURAL" |
person_rut | string | RUT que otorga el consentimiento (formato chileno con guión y dígito verificador) | "12345678-9" |
medio | integer | 1=Electrónico, 2=Verbal, 3=Físico | 1 |
finalidad | integer | 1=Riesgo comercial, 2=Riesgo crediticio | 2 |
objetivo | string | Código del objetivo ("01" a "07"). Debe llevar el cero a la izquierda. | "02" |
id_clientees derivado del Bearer token. Si lo enviás en el body, el servidor lo ignora. No lo incluyas.
Evidencia (siempre requerida)
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
evidence.url | string | Sí | URL HTTPS del archivo de evidencia |
evidence.hash | string | Condicional¹ | Hash SHA-256 del archivo (64 caracteres hexadecimales mayúsculas o minúsculas) |
evidence.file_format | string | Sí | PDF_A o MP3 |
¹ EXTERNAL_URL_ONLY (configurado por institución): hash obligatorio.
¹ FLOID_STORAGE (configurado por institución): Floid descarga el archivo, calcula el hash y lo guarda en GCS. Hash opcional.
Campos condicionales — Persona Natural
Si tipo_persona = "NATURAL":
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
person_email | string | Sí | Email válido de la persona |
person_cellphone | string | No | Teléfono celular (8–15 dígitos, opcionalmente con prefijo +. Ej: "+56912345678") |
person_name | string | No | Nombre completo en formato RDC30: APELLIDO_PATERNO/APELLIDO_MATERNO/NOMBRES (mayúsculas) |
Campos condicionales — Persona Jurídica
Si tipo_persona = "JURIDICA", requiere el objeto persona_juridica:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
persona_juridica.razon_social | string | Sí | Razón social de la empresa |
persona_juridica.rut_empresa | string | Sí | RUT de la empresa (debe coincidir con person_rut del top-level) |
persona_juridica.representantes_legales | array | Sí | Mínimo 1 representante legal |
persona_juridica.representantes_legales[].nombre | string | Sí | Nombre del representante |
persona_juridica.representantes_legales[].rut | string | Sí | RUT del representante |
persona_juridica.representantes_legales[].cargo | string | No | Cargo del representante |
persona_juridica.apoderados | array | No | Lista de apoderados |
persona_juridica.apoderados[].nombre | string | Sí | Nombre del apoderado |
persona_juridica.apoderados[].rut | string | Sí | RUT del apoderado |
persona_juridica.apoderados[].cargo | string | No | Cargo del apoderado |
persona_juridica.otorgante | object | Sí | Persona que efectivamente otorgó el consentimiento |
persona_juridica.otorgante.tipo | string | Sí | REPRESENTANTE_LEGAL o APODERADO |
persona_juridica.otorgante.nombre | string | Sí | Nombre del otorgante |
persona_juridica.otorgante.rut | string | Sí | RUT del otorgante (debe existir en representantes_legales o apoderados) |
persona_juridica.otorgante.cargo | string | No | Cargo del otorgante |
Campos opcionales
| Campo | Tipo | Descripción |
|---|---|---|
rut_ejecutivo | string | RUT del ejecutivo. Si no se envía, usa el default de configuración de la institución. |
custom_id o id_externo | string | ID externo para referencia (varchar(100)). Sirve después como identificador en get_consent/revoke_consent. |
metadata_json | string | JSON string con metadata adicional. |
origen_batch | boolean | Si es true, marca el consentimiento como de carga masiva (origen = "BATCH"). |
Sandbox. Para crear consentimientos de prueba, usá
https://sandbox.floid.app/...con tus credenciales de sandbox. La respuesta incluirádata.sandbox_mode: true. La flagsandbox: trueen el body sigue funcionando por compatibilidad pero ya no es la forma recomendada — usá el host.
Ejemplo 1: Persona Natural
curl --location 'https://api.floid.app/cl/consent_manager/create_consent' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {{TOKEN}}' \
--data '{
"codigo_institucion": "123456789",
"codigo_interno_consentimiento": "BCH-NAT-001",
"tipo_persona": "NATURAL",
"person_rut": "12345678-9",
"person_name": "GARCIA/PEREZ/JUAN CARLOS",
"person_email": "[email protected]",
"person_cellphone": "+56912345678",
"medio": 1,
"finalidad": 2,
"objetivo": "02",
"rut_ejecutivo": "98765432-1",
"evidence": {
"url": "https://institution.com/evidence/consent-001.pdf",
"hash": "A1B2C3D4E5F67890A1B2C3D4E5F67890A1B2C3D4E5F67890A1B2C3D4E5F67890",
"file_format": "PDF_A"
}
}'
Ejemplo 2: Persona Jurídica
curl --location 'https://api.floid.app/cl/consent_manager/create_consent' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {{TOKEN}}' \
--data '{
"codigo_institucion": "123456789",
"codigo_interno_consentimiento": "BCH-JUR-001",
"tipo_persona": "JURIDICA",
"person_rut": "76543210-K",
"person_email": "[email protected]",
"persona_juridica": {
"razon_social": "EMPRESA EJEMPLO S.A.",
"rut_empresa": "76543210-K",
"representantes_legales": [
{ "nombre": "GONZALEZ/SILVA/MARIA TERESA", "rut": "11111111-1", "cargo": "GERENTE GENERAL" }
],
"apoderados": [
{ "nombre": "FERNANDEZ/LOPEZ/CARLOS ANDRES", "rut": "33333333-3", "cargo": "APODERADO FINANCIERO" }
],
"otorgante": {
"tipo": "REPRESENTANTE_LEGAL",
"nombre": "GONZALEZ/SILVA/MARIA TERESA",
"rut": "11111111-1",
"cargo": "GERENTE GENERAL"
}
},
"medio": 1,
"finalidad": 2,
"objetivo": "01",
"rut_ejecutivo": "98765432-1",
"evidence": {
"url": "https://institution.com/evidence/consent-001.pdf",
"hash": "A1B2C3D4E5F67890A1B2C3D4E5F67890A1B2C3D4E5F67890A1B2C3D4E5F67890",
"file_format": "PDF_A"
}
}'
Respuesta exitosa (200) — Persona Natural
{
"code": "200",
"msg": "OK",
"caseid": "550e8400-e29b-41d4-a716-446655440000",
"data": {
"consent_id": 12345,
"consent_token": "550e8400-e29b-41d4-a716-446655440000",
"custom_id": null,
"codigo_interno_consentimiento": "BCH-NAT-001",
"codigo_encriptado_consentimiento": "A1B2C3D4E5F67890A1B2C3D4E5F67890A1B2C3D4E5F67890A1B2C3D4E5F67890",
"tipo_persona": "NATURAL",
"timestamp_otorgamiento": "20260512 143022",
"timestamp_expiracion": "20270512 143022",
"estado": "ACTIVE",
"origen": "API",
"fingerprint_processed": false,
"fingerprint_hash": null,
"ip_captured": "172.19.0.7",
"user_agent_captured": true,
"file_uploaded": false,
"file_url": null,
"gcs_path": null,
"evidence": {
"url": "https://institution.com/evidence/consent-001.pdf",
"hash": "A1B2C3D4E5F67890A1B2C3D4E5F67890A1B2C3D4E5F67890A1B2C3D4E5F67890",
"format": "PDF_A",
"storage_mode": "FLOID_STORAGE",
"status": "SUCCESS"
}
}
}
Respuesta exitosa (200) — Persona Jurídica
{
"code": "200",
"msg": "OK",
"caseid": "660f9511-f5bd-5bc3-c5e1-065g02340e71",
"data": {
"consent_id": 12346,
"consent_token": "660f9511-f5bd-5bc3-c5e1-065g02340e71",
"codigo_interno_consentimiento": "BCH-JUR-001",
"codigo_encriptado_consentimiento": null,
"tipo_persona": "JURIDICA",
"persona_juridica": { /* mismo bloque que enviaste */ },
"timestamp_otorgamiento": "20260512 143022",
"timestamp_expiracion": "20270512 143022",
"estado": "ACTIVE",
"origen": "API",
"evidence": {
"url": "https://institution.com/evidence/consent-001.pdf",
"hash": "A1B2C3D4E5F67890A1B2C3D4E5F67890A1B2C3D4E5F67890A1B2C3D4E5F67890",
"format": "PDF_A",
"storage_mode": "FLOID_STORAGE",
"status": "SUCCESS"
}
}
}
Campos importantes en la respuesta
| Campo | Descripción |
|---|---|
consent_token | UUID del sistema. Úsalo para get_consent, revoke_consent, get_auditoria_by_consent. |
codigo_interno_consentimiento | El que enviaste; sirve también como identificador alternativo. |
codigo_encriptado_consentimiento | Hash SHA-256 de la evidencia (cuando aplica). |
evidence.status | PENDING, SUCCESS, FAILED, EXTERNAL. En FLOID_STORAGE puede tardar hasta unos segundos en pasar de PENDING a SUCCESS/FAILED. |
data.sandbox_mode | Aparece sólo si la respuesta fue creada en sandbox (true). |
Posibles errores
Todos los errores siguen el envelope estándar:
{
"code": 400,
"error_type": "API_ERROR",
"error_code": "INVALID_REQUEST",
"error_message": "The request is not valid. Check the body and headers and try again.",
"display_message": "La request no es válida. Revisa el body y headers e intenta nuevamente. Missing required field: tipo_persona",
"caseid": ""
}
error_code | HTTP | Cuándo se dispara |
|---|---|---|
INVALID_REQUEST | 400 | Falta cualquier campo obligatorio (mensaje específico en display_message) |
INVALID_REQUEST | 400 | "Duplicate codigo_interno_consentimiento for this institution" |
INVALID_REQUEST | 400 | "Institution not configured or inactive. Contact administrator." |
INVALID_REQUEST | 400 | "Invalid codigo_institucion: must be exactly 9 digits" |
INVALID_REQUEST | 400 | "Invalid finalidad: must be 1 (commercial risk) or 2 (credit risk)" |
INVALID_REQUEST | 400 | "Invalid medio: must be 1 (electronic), 2 (verbal), or 3 (written)" |
INVALID_REQUEST | 400 | "Invalid objetivo: must be between 01 and 07" |
INVALID_REQUEST | 400 | "person_email is required for NATURAL personas" |
INVALID_REQUEST | 400 | "Invalid persona_juridica: ..." (otorgante no en listas, RUTs no coinciden, etc.) |
INVALID_REQUEST | 400 | "Invalid evidence: ..." (URL no HTTPS, hash mal formado, archivo demasiado grande, etc.) |
INVALID_REQUEST | 400 | "File too large: maximum 8MB allowed" |
RUT_NO_VALIDO | 400 | RUT con formato o checksum inválido (person_rut, rut_ejecutivo, rut_empresa o cualquier RUT en persona_juridica.*) |
INTERNAL_ERROR | 500 | Error de DB / excepción no controlada |
Tip para detectar duplicados: parseá el
display_message("Duplicate codigo_interno_consentimiento"); elerror_codesiempre esINVALID_REQUEST.
Tablas de referencia
Códigos de objetivo
| Código | Descripción |
|---|---|
"01" | Créditos comerciales |
"02" | Créditos de consumo |
"03" | Créditos para vivienda |
"04" | Operaciones financieras |
"05" | Instrumentos de deuda adquiridos |
"06" | Créditos contingentes |
"07" | Cupos de líneas de crédito de libre disposición |
Si aplica más de un objetivo, se crea un consentimiento separado por cada uno.
Códigos de finalidad
| Código | Descripción |
|---|---|
1 | Evaluación de riesgo comercial |
2 | Evaluación de riesgo crediticio |
Códigos de medio
| Código | Descripción |
|---|---|
1 | Electrónico |
2 | Verbal (registro de audio) |
3 | Físico (respaldo documental) |
Reglas de validación
Formato de campos
codigo_institucion: exactamente 9 dígitos numéricos.codigo_interno_consentimiento: máximo 20 caracteres. Permitidos:A-Z,0-9,&,',/,_,-.person_ruty todos los RUT: formato chileno (12345678-9) con validación módulo-11.person_name: formato RDC30APELLIDO_PATERNO/APELLIDO_MATERNO/NOMBRESen mayúsculas.person_email: email válido estándar.person_cellphone: 8–15 dígitos, opcionalmente con prefijo+.objetivo: siempre 2 dígitos con cero a la izquierda ("01"–"07").evidence.hash: exactamente 64 caracteres hexadecimales (0-9,A-F/a-f).
Reglas de negocio
- Unicidad:
codigo_interno_consentimientoúnico por institución. - Consistencia RUT (JURIDICA):
person_rutdebe ser igual apersona_juridica.rut_empresa. - Representantes legales (JURIDICA): mínimo 1.
- Otorgante (JURIDICA): el
rutdel otorgante debe existir enrepresentantes_legalesoapoderados. - Contacto (NATURAL):
person_emailrequerido.person_cellphoneopcional. - Hash de evidencia: obligatorio para
EXTERNAL_URL_ONLY, opcional paraFLOID_STORAGE.
Validaciones de evidencia
- URL debe usar HTTPS.
- Hash SHA-256 exactamente 64 caracteres hexadecimales.
- Tamaño máximo del archivo: 8 MB.
- Formatos aceptados:
- PDF/A para
medio1 (Electrónico) o 3 (Físico). - MP3 para
medio2 (Verbal) — bitrate 192 kbps, sample rate 16–48 kHz.
- PDF/A para
Modos de almacenamiento de evidencia
Configurado por institución (no en el request).
FLOID_STORAGE
FLOID_STORAGE- Floid descarga el archivo desde
evidence.url. - Floid calcula el hash SHA-256 si no se envía.
- Floid almacena el archivo en Google Cloud Storage.
evidence.hashes opcional.
EXTERNAL_URL_ONLY
EXTERNAL_URL_ONLY- Floid no descarga el archivo.
- El cliente almacena el archivo.
- Floid sólo guarda la URL y el hash.
evidence.hashes obligatorio.
Cambios desde v2.1
codigo_interno_consentimientoahora es estrictamente obligatorio (antes se auto-generaba desdecustom_id).tipo_personaes ahora obligatorio (campo nuevo).rut_ejecutivoes ahora opcional (antes obligatorio).person_emailya no es obligatorio para JURIDICA.- Nuevo objeto
persona_juridicapara empresas. - Nuevo objeto
evidencepara gestión de evidencias.
Cambios desde v3.0
- Sandbox host-aware: el dominio determina el ambiente (ver Notas Importantes).
- Operaciones de listado/exportación ahora reportan
sandbox_modeen la respuesta.
Versionamiento
- v2.1: hasta enero 2026.
- v3.0: febrero 2026 — RDC30 Compliance.
- v3.1: mayo 2026 — sandbox host-aware, JSON envelope para exports/reportes con archivo.
- Fecha efectiva obligatoria CMF: 1 de abril de 2026.
Última actualización: 12 de mayo de 2026.
Updated 1 day ago
