Developers

Flujo: REDEC

Del consentimiento del titular hasta la consulta a la CMF y su confirmación.

El flujo REDEC es el flujo general más un gate regulatorio. La frontera es permanente y conviene tenerla clara desde el principio:

Consensa                          │  Tu organización (reportante)
──────────────────────────────────┼────────────────────────────────────
captura el consentimiento         │
registra la Evidence              │
autoriza o deniega el acceso  ────┼──→  consulta la CMF directamente
registra el resultado         ←───┼──   confirma qué pasó

Consensa no consulta /consultarDeudas, no recibe ni almacena deuda CMF, y no custodia tus credenciales CMF. La consulta la haces tú, con tu propia conectividad.

Para integrar REDEC tu tenant necesita el producto REDEC habilitado y su configuración REDEC completa. Si no, las operaciones responden 403 REDEC_NOT_ENABLED o 422 REDEC_NOT_CONFIGURED.

1. Lee el Flow REDEC

curl "$CONSENSA_API_URL/v1/embed/flows/redec-onboarding" \
  --header "Authorization: Bearer $CONSENSA_API_KEY" \
  --header "Origin: https://banco.ejemplo.cl"
{
  "configKey": "redec-onboarding",
  "version": 2,
  "consents": [{ "templateKey": "redec-credit-information", "title": "Consentimiento REDEC", "kind": "redec" }],
  "containsRedec": true,
  "authentication": {
    "policyCode": "redec_consensa_auth_v1",
    "source": "consensa",
    "profile": "redec_consensa_identity_v1",
    "mechanisms": ["cedula", "knowledge_questions"]
  },
  "requiredIdentifiers": ["rut", "email"],
  "redecConfiguration": {
    "finality": { "code": "1", "label": "Evaluación de riesgo comercial" },
    "objectives": [{ "code": "01", "label": "Crédito comercial" }],
    "notificationPolicy": { "deliveryResponsibility": "consensa", "channelPolicy": "email" }
  },
  "origin": { "value": "https://banco.ejemplo.cl", "allowed": true }
}

Tres cosas importan aquí:

  • redecConfiguration viene entera del Flow. Finalidad y objetivos se congelaron al publicar esa versión. Tu backend no los envía ni los puede sobrescribir.
  • requiredIdentifiers incluye email porque notificationPolicy.deliveryResponsibility es consensa: Consensa avisará al titular por correo en nombre de tu organización. Si la política fuera tenant, el aviso lo envías tú (ver paso 7).
  • authentication.source: "consensa" significa que el runtime verifica la identidad con cédula y preguntas de conocimiento. Con source: "client" el titular debe tener su RUT ya verificado por tu organización, o la sesión falla con 422 verified_customer_rut_required_for_redec.

2. Crea la sesión

curl --request POST "$CONSENSA_API_URL/v1/embed/sessions" \
  --header "Authorization: Bearer $CONSENSA_API_KEY" \
  --header "Content-Type: application/json" \
  --header "Idempotency-Key: redec-embed-customer-4821-01" \
  --data '{
    "configKey": "redec-onboarding",
    "userReference": "customer-4821",
    "identifiers": [
      { "system": "cl",    "type": "rut",   "value": "12.345.678-5" },
      { "system": "email", "type": "email", "value": "cliente@ejemplo.cl" }
    ],
    "origin": "https://banco.ejemplo.cl",
    "authentication": { "source": "consensa" }
  }'

Sólo existen dos combinaciones válidas de identifier: {"system":"cl","type":"rut"} y {"system":"email","type":"email"}. Cualquier otra responde 400 unsupported_identifier.

Con notificación a cargo de Consensa hace falta exactamente un email: ninguno responde redec_notification_email_required y más de uno, redec_notification_email_ambiguous. En el Embed el titular ve ese email enmascarado y lo confirma, o indica otro que se usa sólo para esa notificación.

La respuesta es idéntica a la del flujo general: sessionId, interactionId y launchTicket.

3. Monta el componente y escucha

Igual que en el flujo general:

<script type="module" src="https://embed.consensa.example/host.js"></script>
<div id="consent-slot"></div>

<script type="module">
  const consent = document.createElement('consensa-consent');
  consent.setAttribute('title', 'Consentimiento para consultar tu deuda consolidada');
  consent.setAttribute('src', 'https://embed.consensa.example/runtime.html');
  consent.setAttribute('session', sessionId);
  document.querySelector('#consent-slot').replaceChildren(consent);
  consent.launch(launchTicket);

  consent.addEventListener('consensa:granted', () => continuarEvaluacion());
  consent.addEventListener('consensa:denied',  () => cerrarSolicitud());
</script>

Aquí el runtime ejecuta además la verificación de identidad que exige el perfil. Para tu página el flujo es el mismo: montar, lanzar, escuchar.

4. Obtén el redecConsentId

curl "$CONSENSA_API_URL/v1/consent-interactions/int_9a3f" \
  --header "Authorization: Bearer $CONSENSA_API_KEY"
{
  "interactionId": "int_9a3f",
  "status": "completed",
  "consents": [{
    "templateKey": "redec-credit-information",
    "kind": "redec",
    "decision": "grant",
    "status": "granted",
    "redecConsentId": "redec-consent-9c2",
    "artifactStatus": "pending"
  }]
}

Guarda el redecConsentId: es la llave de todo lo que sigue.

artifactStatus: "pending" no te bloquea. El consentimiento vale desde que se otorga; el artifact es el respaldo documental y se genera aparte. NCG 576 no exige hash para autorizar.

5. Autoriza el acceso, consulta la CMF, confirma

Estos tres pasos van juntos y en ese orden, inmediatamente antes de cada consulta.

5a. Pide la autorización

curl --request POST "$CONSENSA_API_URL/v1/redec/accesses/authorize" \
  --header "Authorization: Bearer $CONSENSA_API_KEY" \
  --header "Content-Type: application/json" \
  --header "Idempotency-Key: redec-access-882" \
  --data '{
    "authorizationBasis": "consent",
    "consentAuthorizationMode": "initial_window",
    "redecConsentId": "redec-consent-9c2",
    "dataCategoryCode": "redec.consolidated_debt_record",
    "scopeId": "scope-credit-information",
    "objectiveCode": "01",
    "reportingObligation": {
      "status": "none",
      "sourceSystem": "core-banking",
      "sourceReference": "obligation-check-4821",
      "assertedAt": 1787702460000
    },
    "sourceSystem": "bank-channel",
    "sourceReference": "access-request-882"
  }'

dataCategoryCode y scopeId son estables por template y los defines al configurar el consentimiento REDEC en el Portal. objectiveCode debe ser uno de los objetivos que el Flow congeló (redecConfiguration.objectives).

{
  "decision": {
    "redecAccessId": "redec-access-5f1",
    "status": "authorized",
    "authorizedUntil": 1787703061000,
    "denyReasonCode": null
  },
  "replayed": false
}

Sólo "status": "authorized" habilita a continuar. Un "denied" trae denyReasonCode y es una decisión de negocio durable, no un error. Un timeout o un 5xx nunca equivalen a una autorización: no consultes la CMF.

La autorización es de un solo uso y está acotada por authorizedUntil.

5b. Consulta la CMF

Este paso ocurre enteramente en tus sistemas, con tus credenciales. Consensa no participa.

5c. Confirma qué pasó

curl --request POST "$CONSENSA_API_URL/v1/redec/accesses/redec-access-5f1/confirm" \
  --header "Authorization: Bearer $CONSENSA_API_KEY" \
  --header "Content-Type: application/json" \
  --header "Idempotency-Key: redec-confirm-5f1" \
  --data '{ "outcome": { "kind": "accessed", "accessedAt": 1787702475000 } }'

Exactamente uno de tres resultados: accessed (con accessedAt), failed o cancelled. No envíes a Consensa el payload de deuda ni las credenciales que usaste.

6. Si otorgas el crédito

Cuando el crédito se otorga efectivamente, informa dos hechos.

El binding para RDC01/RDC02. Congela qué consentimiento corresponde a esa obligación exacta. No nace al evaluar: una evaluación puede terminar sin crédito.

curl --request POST "$CONSENSA_API_URL/v1/redec/reportable-obligations/bindings" \
  --header "Authorization: Bearer $CONSENSA_API_KEY" \
  --header "Content-Type: application/json" \
  --header "Idempotency-Key: binding-OP-2026-000981" \
  --data '{
    "sourceSystem": "core-banking",
    "obligationReference": "OP-2026-000981",
    "obligationGrantedAt": 1787702460000,
    "redecConsentId": "redec-consent-9c2",
    "provenanceSource": "core-banking",
    "provenanceReference": "ledger-9"
  }'

Al generar el archivo MSI, resuelve el campo con la obligación exacta:

curl --get "$CONSENSA_API_URL/v1/redec/reportable-obligations/consent-code" \
  --data-urlencode "sourceSystem=core-banking" \
  --data-urlencode "obligationReference=OP-2026-000981" \
  --header "Authorization: Bearer $CONSENSA_API_KEY"

serializedValue es el valor exacto del campo X(20). Si resolution es unresolved o ambiguous, detén la generación del archivo y reconcilia el dato: no inventes un relleno.

La extensión por crédito. El consentimiento sigue vigente más allá de la ventana inicial mientras exista la obligación.

curl --request POST "$CONSENSA_API_URL/v1/redec/consents/redec-consent-9c2/credit-extensions" \
  --header "Authorization: Bearer $CONSENSA_API_KEY" \
  --header "Content-Type: application/json" \
  --header "Idempotency-Key: ext-OP-2026-000981" \
  --data '{
    "customerTenantId": "customer-tenant-4f1",
    "objectiveCode": "01",
    "creditOperationReference": "OP-2026-000981",
    "creditGrantedAt": 1787702460000,
    "sourceSystem": "core-banking",
    "sourceReference": "ledger-9"
  }'

Con una extensión activa, los accesos posteriores usan consentAuthorizationMode: "credit_lifecycle_extension" y exigen accessPurpose: "manage_existing_obligation". Evaluar un crédito nuevo del mismo cliente no se apoya en esta extensión: necesita su propio consentimiento. Ver REDEC para el detalle del ciclo de vida y su término.

7. El aviso al titular

Apenas se registra un otorgamiento o una revocación, Consensa emite el evento redec.notification.required. Quién envía el aviso lo decide la política congelada del Flow:

deliveryResponsibilityQué haces
consensaNada. Consensa envía el correo en nombre de tu organización y conserva la evidencia. El evento te sirve de trazabilidad.
tenantEnvías el aviso y después registras su evidencia con POST /v1/redec/consents/{id}/notification-evidence.

Configura el endpoint y verifica la firma como se describe en Webhooks. El detalle de la evidencia está en REDEC.

8. Revocación

curl --request POST "$CONSENSA_API_URL/v1/redec/consents/redec-consent-9c2/revoke" \
  --header "Authorization: Bearer $CONSENSA_API_KEY" \
  --header "Content-Type: application/json" \
  --header "Idempotency-Key: redec-revoke-9c2-01" \
  --data '{
    "channel": "digital",
    "occurredAt": 1787702460000,
    "sourceType": "direct",
    "identityAssurance": "client_authenticated"
  }'

El titular también puede revocar por su cuenta desde el Centro de Privacidad.

Si ya existía un crédito otorgado antes de la revocación, Consensa conserva la revocación como hecho pero la marca effective: false al registrarse la extensión correspondiente: la obligación vigente no desaparece porque el titular revoque después.

Resumen de operaciones

PasoOperación
Leer el FlowGET /v1/embed/flows/{configKey}
Crear sesiónPOST /v1/embed/sessions
Confirmar decisiónGET /v1/consent-interactions/{interactionId}
Autorizar accesoPOST /v1/redec/accesses/authorize
Confirmar accesoPOST /v1/redec/accesses/{redecAccessId}/confirm
Binding MSIPOST /v1/redec/reportable-obligations/bindings
Campo RDC01/RDC02GET /v1/redec/reportable-obligations/consent-code
Extensión por créditoPOST /v1/redec/consents/{id}/credit-extensions
RevocarPOST /v1/redec/consents/{id}/revoke

En esta página