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 como Content-Type: multipart/form-data con el archivo en el campo consent_file. Sólo aplica si tu institución está configurada en modo FLOID_STORAGE.


Parámetros de entrada

Campos obligatorios (todos los consentimientos)

CampoTipoDescripciónEjemplo
codigo_institucionstringCódigo de 9 dígitos de la institución (CMF)"123456789"
codigo_interno_consentimientostringCó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_personastringNATURAL o JURIDICA"NATURAL"
person_rutstringRUT que otorga el consentimiento (formato chileno con guión y dígito verificador)"12345678-9"
mediointeger1=Electrónico, 2=Verbal, 3=Físico1
finalidadinteger1=Riesgo comercial, 2=Riesgo crediticio2
objetivostringCódigo del objetivo ("01" a "07"). Debe llevar el cero a la izquierda."02"

id_cliente es derivado del Bearer token. Si lo enviás en el body, el servidor lo ignora. No lo incluyas.

Evidencia (siempre requerida)

CampoTipoRequeridoDescripción
evidence.urlstringURL HTTPS del archivo de evidencia
evidence.hashstringCondicional¹Hash SHA-256 del archivo (64 caracteres hexadecimales mayúsculas o minúsculas)
evidence.file_formatstringPDF_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":

CampoTipoRequeridoDescripción
person_emailstringEmail válido de la persona
person_cellphonestringNoTeléfono celular (8–15 dígitos, opcionalmente con prefijo +. Ej: "+56912345678")
person_namestringNoNombre 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:

CampoTipoRequeridoDescripción
persona_juridica.razon_socialstringRazón social de la empresa
persona_juridica.rut_empresastringRUT de la empresa (debe coincidir con person_rut del top-level)
persona_juridica.representantes_legalesarrayMínimo 1 representante legal
persona_juridica.representantes_legales[].nombrestringNombre del representante
persona_juridica.representantes_legales[].rutstringRUT del representante
persona_juridica.representantes_legales[].cargostringNoCargo del representante
persona_juridica.apoderadosarrayNoLista de apoderados
persona_juridica.apoderados[].nombrestringNombre del apoderado
persona_juridica.apoderados[].rutstringRUT del apoderado
persona_juridica.apoderados[].cargostringNoCargo del apoderado
persona_juridica.otorganteobjectPersona que efectivamente otorgó el consentimiento
persona_juridica.otorgante.tipostringREPRESENTANTE_LEGAL o APODERADO
persona_juridica.otorgante.nombrestringNombre del otorgante
persona_juridica.otorgante.rutstringRUT del otorgante (debe existir en representantes_legales o apoderados)
persona_juridica.otorgante.cargostringNoCargo del otorgante

Campos opcionales

CampoTipoDescripción
rut_ejecutivostringRUT del ejecutivo. Si no se envía, usa el default de configuración de la institución.
custom_id o id_externostringID externo para referencia (varchar(100)). Sirve después como identificador en get_consent/revoke_consent.
metadata_jsonstringJSON string con metadata adicional.
origen_batchbooleanSi 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 flag sandbox: true en 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

CampoDescripción
consent_tokenUUID del sistema. Úsalo para get_consent, revoke_consent, get_auditoria_by_consent.
codigo_interno_consentimientoEl que enviaste; sirve también como identificador alternativo.
codigo_encriptado_consentimientoHash SHA-256 de la evidencia (cuando aplica).
evidence.statusPENDING, SUCCESS, FAILED, EXTERNAL. En FLOID_STORAGE puede tardar hasta unos segundos en pasar de PENDING a SUCCESS/FAILED.
data.sandbox_modeAparece 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_codeHTTPCuándo se dispara
INVALID_REQUEST400Falta cualquier campo obligatorio (mensaje específico en display_message)
INVALID_REQUEST400"Duplicate codigo_interno_consentimiento for this institution"
INVALID_REQUEST400"Institution not configured or inactive. Contact administrator."
INVALID_REQUEST400"Invalid codigo_institucion: must be exactly 9 digits"
INVALID_REQUEST400"Invalid finalidad: must be 1 (commercial risk) or 2 (credit risk)"
INVALID_REQUEST400"Invalid medio: must be 1 (electronic), 2 (verbal), or 3 (written)"
INVALID_REQUEST400"Invalid objetivo: must be between 01 and 07"
INVALID_REQUEST400"person_email is required for NATURAL personas"
INVALID_REQUEST400"Invalid persona_juridica: ..." (otorgante no en listas, RUTs no coinciden, etc.)
INVALID_REQUEST400"Invalid evidence: ..." (URL no HTTPS, hash mal formado, archivo demasiado grande, etc.)
INVALID_REQUEST400"File too large: maximum 8MB allowed"
RUT_NO_VALIDO400RUT con formato o checksum inválido (person_rut, rut_ejecutivo, rut_empresa o cualquier RUT en persona_juridica.*)
INTERNAL_ERROR500Error de DB / excepción no controlada

Tip para detectar duplicados: parseá el display_message ("Duplicate codigo_interno_consentimiento"); el error_code siempre es INVALID_REQUEST.


Tablas de referencia

Códigos de objetivo

CódigoDescripció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ódigoDescripción
1Evaluación de riesgo comercial
2Evaluación de riesgo crediticio

Códigos de medio

CódigoDescripción
1Electrónico
2Verbal (registro de audio)
3Fí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_rut y todos los RUT: formato chileno (12345678-9) con validación módulo-11.
  • person_name: formato RDC30 APELLIDO_PATERNO/APELLIDO_MATERNO/NOMBRES en 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_rut debe ser igual a persona_juridica.rut_empresa.
  • Representantes legales (JURIDICA): mínimo 1.
  • Otorgante (JURIDICA): el rut del otorgante debe existir en representantes_legales o apoderados.
  • Contacto (NATURAL): person_email requerido. person_cellphone opcional.
  • Hash de evidencia: obligatorio para EXTERNAL_URL_ONLY, opcional para FLOID_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 medio 1 (Electrónico) o 3 (Físico).
    • MP3 para medio 2 (Verbal) — bitrate 192 kbps, sample rate 16–48 kHz.

Modos de almacenamiento de evidencia

Configurado por institución (no en el request).

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.hash es opcional.

EXTERNAL_URL_ONLY

  • Floid no descarga el archivo.
  • El cliente almacena el archivo.
  • Floid sólo guarda la URL y el hash.
  • evidence.hash es obligatorio.

Cambios desde v2.1

  1. codigo_interno_consentimiento ahora es estrictamente obligatorio (antes se auto-generaba desde custom_id).
  2. tipo_persona es ahora obligatorio (campo nuevo).
  3. rut_ejecutivo es ahora opcional (antes obligatorio).
  4. person_email ya no es obligatorio para JURIDICA.
  5. Nuevo objeto persona_juridica para empresas.
  6. Nuevo objeto evidence para gestión de evidencias.

Cambios desde v3.0

  1. Sandbox host-aware: el dominio determina el ambiente (ver Notas Importantes).
  2. Operaciones de listado/exportación ahora reportan sandbox_mode en 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.