API de Segmentación de Escoreabilidad para Vivienda Social
Este servicio permite a FonVivienda/MIVHED transmitir a los burós de crédito el registro de un solicitante de vivienda social validado, y recibir de vuelta su segmentación de escoreabilidad (A/B/C), en tiempo real y con trazabilidad completa.
Qué es un «API contract» y qué no es
A lo largo de este documento se habla del API contract. Es un término técnico: designa la especificación que describe cómo dos sistemas se comunican —qué campos se envían, con qué formato, qué responde el otro extremo y qué errores pueden ocurrir. Su función es que ambos equipos de desarrollo programen contra la misma definición y todo encaje a la primera.
No es un contrato legal. No crea obligaciones jurídicas, no sustituye al convenio entre las instituciones ni al acuerdo de tratamiento de datos. Esos instrumentos se firman aparte y son los que amparan el intercambio; este documento solo dice cómo se ejecuta técnicamente.
Por qué el servicio se llama así
El nombre evita una confusión que apareció en la revisión: este API no devuelve un score. Devuelve una etiqueta de segmento que indica si el solicitante es evaluable y por qué vía. Llamarlo «API de score» daría a entender que el Estado recibe el puntaje de cada ciudadano, que es exactamente lo que el proceso acordado prohíbe.
| Lo que el buró devuelve aquí | Lo que el buró NO devuelve aquí |
|---|---|
Segmento A, B o C; indicador escoreable; códigos de razón; identificación del modelo y su certificación. |
Score, banda de riesgo homologada, probabilidad de incumplimiento, variables del modelo o cualquier valor numérico de solvencia. |
Objeto del servicio
La banca privada no ha estado financiando la vivienda social porque una porción mayoritaria de los solicitantes carece de historial crediticio tradicional y, sin historial, no existe un perfil de riesgo que sustente la decisión ni la provisión exigida por el Reglamento de Evaluación de Activos (REA).
Este API materializa el Paso 4 y el Paso 5 del proceso acordado: la consulta de evaluación desde FonVivienda hacia los burós y el retorno de la segmentación, de forma programática y sin intervención manual.
Posición en el proceso end-to-end
Recepción de la solicitud → Validación social y financiera → Preparación del registro → Consulta de evaluación (este API) → Segmentación por el buró (este API) → Enrutamiento del expediente → Decisión bancaria → Bancarización → Reporte y monitoreo.
Regla de oro: qué NO retorna el buró
El único dato que este API devuelve al Estado es la etiqueta de segmento (A, B o C) y sus códigos de razón. El valor del score y la banda de riesgo homologada permanecen en el buró y se entregan exclusivamente a la entidad bancaria que los consulta por su propio canal comercial.
Cualquier implementación que incluya score, banda_riesgo, probabilidad_incumplimiento o equivalentes en la respuesta a FonVivienda incumple el API contract y será rechazada por el validador de esquema con 422 · FV-422-011. Esta restricción protege el principio de no constituir una base de scores individuales de acceso general.
Modo de intercambio
El intercambio es uno a uno: una consulta por solicitante, resuelta en línea. Es el flujo que la operación diaria necesita, porque los expedientes llegan de forma continua e incluyen reenvíos por subsanación que deben reevaluarse al momento.
| Modo | Invocación | Respuesta | Cuándo usarlo |
|---|---|---|---|
| Síncrono Predeterminado | POST /evaluaciones | 200 con el segmento · p95 < 2 s | Caso normal. El buró resuelve identidad y segmenta en línea. |
| Asíncrono | POST /evaluacionescon Prefer: respond-async | 202 + callback firmado | Cuando el buró necesita consultar fuentes externas de data alternativa y no puede resolver dentro del tiempo de respuesta. |
Alcance y límites
Dentro del alcance
- Transmisión del registro del solicitante validado, incluido el consentimiento informado.
- Retorno de la segmentación A/B/C con códigos de razón normalizados.
- Trazabilidad completa: identificador de evaluación, de registro y de petición, con firma verificable.
- Catálogos compartidos y esquemas versionados.
Fuera del alcance
- Entrega del score o de la banda de riesgo a FonVivienda (ver regla de oro).
- El canal buró ↔ banco, que se rige por los contratos comerciales vigentes de cada entidad.
- El API de monitoreo anonimizado FonVivienda ↔ Superintendencia, que se especifica por separado.
- La consulta a fuentes de data alternativa (Unipago/TSS, servicios), que cada buró resuelve internamente.
Ruta de implementación
- Confirmar el rol de su institución en A quién está dirigido.
- Leer Antes de empezar y solicitar credenciales de sandbox.
- Revisar el diccionario de datos y confirmar la disponibilidad de cada campo.
- Implementar autenticación, firma e idempotencia.
- Validar el payload contra los JSON Schema publicados.
- Ejercitar el API contract en el entorno de pruebas con datos ficticios.
A quién está dirigido
Este documento se dirige a quienes deben implementar o revisar el API contract, es decir, la especificación técnica que describe cómo se comunican los sistemas. Todos los demás participantes del convenio aparecen aquí como contexto: intervienen en el proceso, pero no consumen este API.
Destinatarios de este documento
Burós de crédito Destinatario principal
Equifax/DataCrédito, Kalifika/Califica y TransUnion. Son quienes implementan el lado receptor del API contract: exponen el endpoint de evaluación, resuelven identidad, aplican su motor tradicional y su modelo de data alternativa, y devuelven la etiqueta de segmento.
Qué necesita de este documento
- Datos que se envían — para confirmar que los campos disponibles alimentan su modelo, y qué falta capturar.
- JSON Schema y Referencia de endpoints — para construir el receptor.
- Autenticación y firma — para validar las peticiones y firmar los callbacks.
- Entorno de pruebas — para ejercitar el API contract antes de escribir código.
ABA Coordinador y revisor
Asociación de Bancos Múltiples de la República Dominicana. Convoca el convenio y articula al sector bancario. No consume este API, pero revisa el contrato en representación de la banca que después consumirá el resultado por su propio canal con el buró.
Qué necesita de este documento
- Descripción general y la regla de oro — para verificar que el Estado no recibe scores individuales.
- Consentimiento y datos personales — para validar la base legal del tratamiento.
FonVivienda / MIVHED
Publica y mantiene esta especificación, construye el cliente que envía cada solicitante y el receptor que recibe los callbacks. Es el owner del proceso de punta a punta.
Otros actores
Participan en el proceso general de financiamiento de vivienda social, pero no intervienen en este API contract. Se enumeran para ubicar el API dentro del ecosistema.
| Actor | Rol en el proceso | Relación con este API |
|---|---|---|
| Entidades bancarias | Decisor final del crédito | Consumen la banda de riesgo y el score directamente de su buró contratado, por su canal comercial existente. Ese intercambio es ajeno a esta especificación. |
| Superintendencia de Bancos | Supervisor | Certifica estadísticamente los modelos de data alternativa y custodia la central de riesgo. El monitoreo anonimizado de la cartera se especifica por separado. |
| Junta Monetaria | Órgano normativo | Aprueba la incorporación de la data alternativa al REA. Sin relación operativa con el API. |
| BID y BANDEX | Fondo de Garantía | Aportan y operan la cobertura que mitiga el riesgo del financiamiento. Se activa después de la decisión bancaria. |
| Banco Central | Liquidez dirigida | Provee el fondo revolvente para vivienda social. |
| Unipago / TSS | Fuente de data alternativa | Suministra la trazabilidad de aportes a la seguridad social. Cada buró la consulta por su cuenta; no viaja por este API. |
| Solicitante (ciudadano) | Titular de los datos | Otorga el consentimiento que habilita toda consulta. Sus derechos se describen en Consentimiento y datos personales. |
Quién hace qué
| Responsabilidad | FonVivienda | Buró | ABA |
|---|---|---|---|
| Definir y publicar el API contract | Responsable | Consultado | Consultado |
| Capturar y validar los datos del solicitante | Responsable | — | — |
| Recabar y custodiar el consentimiento | Responsable | Verifica | — |
| Exponer el endpoint de evaluación | — | Responsable | — |
| Resolver identidad y segmentar | — | Responsable | — |
| Certificar el modelo ante el regulador | Informado | Responsable | Consultado |
| Enrutar el expediente a la banca | Responsable | — | Facilita |
| Homologar bandas para la banca | Informado | Responsable | Coordina |
Arquitectura y flujo de mensajes
Quién llama a quién, en qué orden y con qué mecanismo de transporte. El diagrama refleja la colaboración BPMN acordada, reducida a los intercambios que este API cubre.
Mapa de participantes
Las líneas punteadas indican intercambios fuera del alcance de este API contract. El trazo rojo señala el único canal por el que circula el score.
Secuencia del intercambio
| # | Actor | Acción | Mensaje |
|---|---|---|---|
| 1 | FonVivienda | Prepara el registro del solicitante validado | POST /evaluaciones · cuerpo firmado HMAC + Idempotency-Key |
| 2 | Buró | Valida esquema y firma | — |
| 3 | Buró | Resuelve identidad y segmenta A/B/C | — |
| 4 | Buró | Responde en línea | 200 OK · {segmento, escoreable, motivos} |
| 5 | FonVivienda | Enruta a banca (A, B) o a educación financiera (C) | — |
Direcciones y responsabilidades
| Dirección | Quién expone el endpoint | Quién lo implementa | Endpoints |
|---|---|---|---|
| FonVivienda → Buró | El buró | Cada buró, conforme a este API contract | /evaluaciones, /evaluaciones/{id}, /consentimientos/revocaciones, /catalogos, /esquemas, /salud |
| Buró → FonVivienda | FonVivienda | FonVivienda | POST {callback_url} declarada en la petición asíncrona |
FonVivienda es el publicador y custodio del API contract: define los esquemas, los catálogos y las reglas de validación. Cada buró implementa el lado receptor y declara su base_url durante el registro (ver Antes de empezar).
Máquina de estados de la evaluación
En el flujo habitual la evaluación nace y termina dentro de la misma petición, en estado COMPLETADA. Los demás estados solo aparecen en la variante de respuesta diferida descrita en la referencia de endpoints.
| Estado | Significado | Transiciones válidas | Terminal |
|---|---|---|---|
RECIBIDA | Acuse emitido; la evaluación está encolada. | → EN_PROCESO, RECHAZADA | No |
EN_PROCESO | El buró está resolviendo identidad y segmentando. | → COMPLETADA, ERROR | No |
COMPLETADA | Segmento asignado y notificado. | — | Sí |
RECHAZADA | Falló la validación de esquema, firma o consentimiento. | — | Sí |
ERROR | Fallo interno del buró; puede reenviarse con nueva Idempotency-Key. | — | Sí |
EXPIRADA | Han transcurrido 30 días desde COMPLETADA; el resultado ya no se sirve. | — | Sí |
Antes de empezar
Requisitos de habilitación, entornos disponibles y datos que cada parte debe entregar para completar el registro técnico.
Entornos
La integración recorre tres entornos independientes. Cada uno tiene su propio juego de credenciales, sus propias claves de firma y su propia base de datos: nada se comparte entre ellos. Avanzar de uno al siguiente exige superar la lista de verificación del entorno anterior.
Las URL base aún no están definidas. Se publicarán al habilitar cada entorno y pueden variar respecto de los ejemplos que aparecen en esta documentación. Hasta entonces figuran como TBD.
1 · Sandbox — construir y equivocarse sin consecuencias
Primer entorno al que se conecta un buró. Existe para que el equipo de desarrollo pruebe el API contract sin ningún riesgo: si algo se rompe, no afecta a nadie.
| URL base | TBD |
| Datos | Exclusivamente sintéticos. Cédulas generadas, nombres ficticios, direcciones inventadas. |
| Autenticación | OAuth 2.0 con credenciales de prueba. Sin mTLS, para bajar la fricción inicial. |
| Disponibilidad | Sin compromiso de servicio. Puede reiniciarse o vaciarse sin aviso. |
| Datos persistentes | Se purgan periódicamente. No usarlo como repositorio de pruebas. |
| Quién otorga acceso | Dirección de Tecnología de FonVivienda, a solicitud del buró. |
Prohibido enviar datos personales reales al sandbox. El entorno no cuenta con los controles de retención ni de cifrado en reposo exigidos para información personal, y su contenido puede ser visible para el equipo técnico de ambas partes durante la depuración.
2 · Certificación — demostrar que la integración funciona
Réplica fiel de producción en configuración y controles de seguridad, pero sin datos reales de ciudadanos. Aquí se ejecuta y se firma la lista de verificación que habilita el paso a producción. Es también el entorno donde se prueban las versiones nuevas del API contract antes de liberarlas.
| URL base | TBD |
| Datos | Sintéticos de volumen realista, más una muestra anonimizada acordada entre las partes. |
| Autenticación | OAuth 2.0 + mTLS, con los mismos certificados y el mismo rigor que producción. |
| Disponibilidad | Horario hábil, con aviso previo de mantenimientos. |
| Datos persistentes | Se conservan durante la ventana de certificación como evidencia de las pruebas. |
| Quién otorga acceso | FonVivienda, tras completar el registro técnico del participante. |
3 · Producción — ciudadanos reales
Único entorno donde circulan datos de solicitantes reales, con consentimiento vigente. Todo lo que ocurre aquí queda registrado en la bitácora de auditoría y es exigible ante el regulador.
| URL base | TBD |
| Datos | Reales, sujetos a consentimiento informado y a las reglas de retención de la sección de datos personales. |
| Autenticación | OAuth 2.0 + mTLS + lista blanca de direcciones IP de salida. |
| Disponibilidad | Continua, con ventana de mantenimiento anunciada. |
| Datos persistentes | Sí, con las políticas de retención y borrado acordadas. |
| Quién otorga acceso | FonVivienda, previa certificación aprobada y firma del acuerdo de tratamiento de datos. |
Cómo distinguir el entorno desde el código
Toda petición declara su entorno en la cabecera X-FV-Ambiente. El receptor rechaza con 403 cualquier petición cuyo valor no coincida con el entorno en el que está desplegado. Es una salvaguarda deliberada: evita que una configuración mal apuntada envíe datos reales al sandbox, o datos de prueba a producción.
Registro del participante
Cada buró entrega a la Dirección de Tecnología de FonVivienda:
| Dato | Formato | Ejemplo |
|---|---|---|
buro_id asignado | Enum | EQUIFAX · KALIFIKA · TRANSUNION |
| URL base del receptor | HTTPS | https://api.buro.com.do/fonvivienda/v1 |
| Certificado cliente mTLS | X.509 PEM | CN del certificado y huella SHA-256 |
| Clave secreta de firma | 32 bytes, base64 | Intercambio fuera de banda; rotación semestral |
| Rango de IP de salida | CIDR | 200.88.x.0/24 |
| Buzón técnico de incidencias | Correo | Con acuse en menos de 4 horas hábiles |
| Contacto de seguridad | Nombre y teléfono | Escalamiento 24/7 para incidentes de datos |
FonVivienda entrega a cada buró: client_id, client_secret, la clave HMAC de firma, su certificado de servidor y la callback_url por entorno.
Requisitos técnicos mínimos
- TLS 1.2 o superior, con preferencia por TLS 1.3. Se rechazan suites sin forward secrecy.
- Content-Type
application/json; charset=utf-8. Codificación UTF-8 obligatoria — los campos de dirección y nombre contienen tildes y la letra ñ. - Compresión
gzipaceptada en petición y respuesta. - Tamaño máximo de cuerpo: 256 KB. Un registro de solicitante bien formado pesa alrededor de 2 KB; superar el límite devuelve
413. - Reloj sincronizado por NTP con desviación menor a 60 segundos: la firma incorpora marca de tiempo con ventana antirreplay de 300 segundos.
- Soporte de idempotencia con retención de 24 horas por clave.
Cabeceras obligatorias
| Cabecera | Obligatoria | Descripción |
|---|---|---|
Authorization | Sí | Bearer <access_token> obtenido por client credentials. |
Content-Type | Sí | application/json; charset=utf-8. |
X-FV-Emisor | Sí | Identificador del emisor: FONVIVIENDA. |
X-FV-Destinatario | Sí | buro_id del receptor. |
X-FV-Ambiente | Sí | SANDBOX · CERTIFICACION · PRODUCCION. Debe coincidir con el entorno del host. |
X-FV-Version-Contrato | Sí | Versión semántica del API contract, p. ej. 1.0.0. |
X-Request-Id | Sí | UUID v4 único por intento. Se refleja en la respuesta y en los registros de auditoría. |
Idempotency-Key | En POST | UUID v4 estable entre reintentos del mismo envío lógico. |
X-FV-Signature | Sí | Firma HMAC-SHA256 del cuerpo. Ver Autenticación y firma. |
Accept-Encoding | Recomendada | gzip. |
Lista de verificación de certificación
Para promover una integración a producción, el buró debe demostrar en el entorno de certificación:
- Resolución síncrona correcta de 1 000 evaluaciones sintéticas consecutivas, dentro del objetivo de latencia.
- Rechazo con
422de registros inválidos, con el detalle por campo y el código de negocio correspondiente. - Comportamiento idempotente ante un reenvío con la misma
Idempotency-Key. - Rechazo con
401ante firma inválida y ante marca de tiempo fuera de la ventana antirreplay. - Ejecución del modo asíncrono:
202, callback firmado y reintento correcto ante un500simulado del receptor. - Ausencia total de
score,banda_riesgoo campos equivalentes en la respuesta. - Respeto de los límites de tasa con cabeceras
RateLimit-*yRetry-After.
Datos que se envían
Diccionario completo del registro del solicitante: las 33 columnas del archivo de muestra del piloto, su equivalente en el modelo JSON, sus reglas de validación y su clasificación de sensibilidad.
Origen de la especificación
El modelo de datos se deriva literalmente del archivo data de ejemplo.xlsx entregado como muestra del piloto: 14 registros del programa Familia Feliz, con nombres y cédulas enmascarados, y 33 columnas (A a AG). Nada se ha inventado: cada campo del JSON tiene una columna de origen trazable, y los campos nuevos se identifican explícitamente.
Las diez variables solicitadas por Kalifika ya existen en el archivo
Las columnas W a AF corresponden exactamente a las variables pedidas en el correo del 3 de agosto de 2026. El problema no es de modelo de datos sino de captura: en la muestra vienen en cero o sin dato.
Diccionario de datos
| Col. | Campo en el archivo | Ruta JSON | Tipo | Obligatorio | PII | Reglas y observaciones |
|---|
Clasificación de sensibilidad
| Nivel | Campos | Tratamiento exigido |
|---|---|---|
| Crítico | Identificación (cédula/RNC) | Llave de cruce. Viaja en claro solo dentro del canal cifrado; nunca en URL, en registros de aplicación ni en el callback (allí se usa identificacion_hash). |
| Nombres, apellidos, fecha de nacimiento, dirección, teléfonos, correos | Minimización: se envían únicamente para resolución de identidad. Prohibido su uso para fines comerciales o de mercadeo. | |
| Medio | Ingresos, composición del hogar, tipo de vivienda, renta | Insumo del modelo. Retención limitada a la vigencia del consentimiento. |
| Bajo | Programa, provincia, fecha de solicitud, correlativo | Sin restricción adicional. Utilizable en reportes agregados. |
Campos que añade el API contract
No existen en el Excel y son obligatorios en el API:
| Ruta JSON | Tipo | Por qué se añade |
|---|---|---|
registro_id | string | Identificador estable y opaco del expediente, asignado por FonVivienda. Es la llave de correlación en el callback, y evita usar la cédula como identificador de mensaje. Patrón FV-AAAA-#######. |
consentimiento.* | object | Sin consentimiento verificable no puede consultarse información crediticia. El objeto porta fecha, canal, versión de términos y huella de la evidencia. |
expediente.estado | enum | Distingue un expediente VALIDADO de uno en SUBSANACION reenviado, lo que permite al buró tratar reprocesos sin duplicar consultas. |
hogar.rol_en_hogar | enum | Junto a hogar.hogar_id permite reconstruir el núcleo familiar sin exponer la cédula del jefe de hogar. |
ingresos.moneda | enum | Elimina la ambigüedad de los montos. Valor fijo DOP en esta versión. |
*_disponibilidad | enum | Distingue explícitamente «no aplica», «no capturado» y «valor cero». Ver la nota siguiente. |
Cero no es lo mismo que «no sé»
En la muestra, Ingresos informales y Nivel de estudios traen el literal "No disponible en base consultada", mientras que Remesas o Ingreso del cónyuge traen 0. Un modelo de riesgo que interprete ambos como «cero ingresos» sesga el resultado.
El API contract resuelve esto enviando el valor como null y acompañándolo de un campo hermano <campo>_disponibilidad con valores DISPONIBLE, NO_CAPTURADO, NO_APLICA o NO_DECLARA.
Muestra de datos
Los 14 registros del archivo, con la identificación, los nombres, apellidos y correos ya enmascarados en el origen, y el identificador de hogar sustituido por su forma seudonimizada.
Registro completo en JSON
El registro 1 de la muestra, transformado al modelo del API contract. Obsérvese la normalización de los campos multivalor (Profesión y Contrato laboral vienen separados por ; en el archivo) y el uso de null con campo de disponibilidad.
Catálogos y códigos
Valores admitidos en los campos enumerados. Los catálogos se sirven además por GET /catalogos/{id} con ETag, de modo que la integración no tenga que codificarlos de forma rígida.
Todos los valores de enumeración viajan en mayúsculas, sin tildes y con guion bajo. El literal en español para presentación se obtiene del catálogo, no se transmite en el mensaje.
Segmentación de escoreabilidad
| Segmento | Definición | Vía de evaluación | Enrutamiento por FonVivienda |
|---|---|---|---|
| A | Tiene información en buró suficiente para un score convencional. | Score tradicional | Entidad bancaria con apetito, con los incentivos aplicables. |
| B | Sin historial tradicional, pero la data alternativa permite estimar su perfil de riesgo. | Modelo de data alternativa | Entidad bancaria, señalando el sustento en modelo certificado. |
| No dispone de historial tradicional ni de data alternativa suficiente. | No escoreable por el momento | Educación financiera y apertura de cuenta básica para comenzar a generar data. |
Códigos de razón de la segmentación
Se devuelven en resultados[].motivos[]. Explican por qué el solicitante quedó en ese segmento, sin revelar el peso ni la fórmula del modelo propietario.
| Código | Segmento | Descripción |
|---|---|---|
SEG-A-01 | A | Historial crediticio tradicional suficiente y vigente. |
SEG-A-02 | A | Historial tradicional con antigüedad limitada, complementado con data alternativa. |
SEG-B-01 | B | Trazabilidad de aportes a la seguridad social (Unipago/TSS). |
SEG-B-02 | B | Historial de pagos de servicios: energía, agua o telefonía. |
SEG-B-03 | B | Señales de permanencia y estabilidad domiciliaria. |
SEG-B-04 | B | Vínculo con núcleo familiar con historial verificable. |
SEG-C-01 | C | Identidad no resuelta: la cédula no arroja coincidencia en las fuentes consultadas. |
SEG-C-02 | C | Señales de data alternativa por debajo del umbral mínimo del modelo. |
SEG-C-03 | C | Antigüedad de las señales insuficiente (menos de 6 meses observables). |
SEG-C-04 | C | Consentimiento no verificable o revocado al momento de la consulta. |
JSON Schema
Esquemas normativos en JSON Schema draft 2020-12. Son la fuente de verdad del API contract: ante cualquier discrepancia entre esta documentación y el esquema, prevalece el esquema.
Descarga y resolución de referencias
Los esquemas se publican en GET /esquemas/{nombre} y se identifican con un $id absoluto y versionado. Se recomienda cachearlos por ETag y validar en tiempo de compilación, no de ejecución.
Esquema del solicitante
Objeto que describe al solicitante. Es la carga útil de POST /evaluaciones en sus dos modos.
Esquema de la petición de evaluación
Sobre que envuelve al solicitante con los metadatos del intercambio.
Esquema del acuse asíncrono
Respuesta 202 cuando la petición se envía con Prefer: respond-async.
Esquema del resultado y del callback
Mismo objeto resultado para la respuesta 200 del modo síncrono, para GET /evaluaciones/{id} y para el evento evaluacion.completada entregado a la callback_url. Nótese la ausencia deliberada de cualquier campo de score.
additionalProperties: false en el objeto resultado no es un detalle estilístico: es el mecanismo que impide técnicamente que un buró añada un campo de score a la respuesta hacia FonVivienda.
Esquema de error
Todos los errores siguen RFC 9457 (Problem Details for HTTP APIs) con extensiones propias del API contract.
Documento OpenAPI
Especificación OpenAPI 3.1 del servicio, apta para generar clientes y servidores. Se muestra abreviada; la descarga contiene el documento completo.
Referencia de endpoints
Nueve operaciones cubren el ciclo completo: obtención de token, evaluación síncrona y asíncrona, consulta de una evaluación, callback de retorno, revocación de consentimiento, catálogos, esquemas y sonda de salud.
| Método | Ruta | Dirección | Alcance OAuth | Operación |
|---|
Códigos HTTP y errores
Semántica exacta de cada código de estado, si debe reintentarse y qué acción corresponde. Un cliente correctamente implementado se comporta de forma distinta ante un 429 y ante un 422: el primero se reintenta, el segundo nunca.
Respuestas de éxito
| Código | Nombre | Cuándo se emite | Cuerpo y cabeceras |
|---|
Errores del cliente (4xx)
Salvo 408, 425 y 429, ningún 4xx debe reintentarse sin modificar la petición.
| Código | Nombre | Cuándo se emite | ¿Reintentar? | Acción del cliente |
|---|
Errores del servidor (5xx)
| Código | Nombre | Cuándo se emite | ¿Reintentar? | Acción del cliente |
|---|
Formato del cuerpo de error
Content-Type application/problem+json conforme a RFC 9457.
Catálogo de códigos de negocio
El campo codigo del cuerpo de error es estable entre versiones y es el que deben usar los clientes para bifurcar su lógica; el texto de title y detail puede cambiar.
| Código | HTTP | Título | Cuándo ocurre y cómo resolverlo |
|---|
Política de reintentos
Regla general
Reintentar solo ante 408, 425, 429, 500, 502, 503, 504 y errores de red, con retroceso exponencial y fluctuación aleatoria, conservando la misma Idempotency-Key y generando un nuevo X-Request-Id.
Máximo 6 intentos. Si el servidor envía Retry-After, ese valor manda sobre el cálculo local.
| Intento | Espera base | Fluctuación aplicada |
|---|---|---|
| 1 | 1 s | ± 250 ms |
| 2 | 2 s | ± 500 ms |
| 3 | 4 s | ± 1 s |
| 4 | 8 s | ± 2 s |
| 5 | 16 s | ± 4 s |
| 6 | 32 s | ± 8 s |
Superados los 6 intentos, el envío se marca como fallido, se registra el X-Request-Id del último intento y se notifica al buzón técnico. No se reintenta indefinidamente: una evaluación atascada bloquea el enrutamiento de ese expediente.
Autenticación y firma
Tres controles se aplican de forma acumulativa: identidad del canal por mTLS, autorización por OAuth 2.0 y autenticidad e integridad del mensaje por firma HMAC-SHA256.
Las tres capas
| Capa | Mecanismo | Qué garantiza | Fallo devuelve |
|---|---|---|---|
| Canal | TLS mutuo (mTLS), certificado X.509 cliente | Que el sistema que llama es efectivamente el registrado. | Cierre de conexión TLS |
| Autorización | OAuth 2.0 client credentials, JWT de vida corta | Que el cliente tiene permiso para esa operación. | 401 · 403 |
| Mensaje | HMAC-SHA256 sobre marca de tiempo y cuerpo | Que el cuerpo no fue alterado ni reenviado. | 401 · FV-401-004 |
Obtención del token
- Vigencia del token: 900 segundos. Debe renovarse de forma proactiva al 80 % de su vida.
- No se emiten refresh tokens: el flujo es de máquina a máquina.
- El token es un JWT firmado con
RS256; las llaves públicas se publican en/.well-known/jwks.json. - Nunca debe registrarse el token completo en bitácoras. Registrar únicamente su
jti.
Alcances
| Alcance | Concedido a | Permite |
|---|---|---|
evaluaciones:write | FonVivienda | Enviar evaluaciones y notificar revocaciones de consentimiento. |
evaluaciones:read | FonVivienda | Consultar el estado y el resultado de una evaluación. |
catalogos:read | Ambas partes | Leer catálogos y esquemas. |
callback:write | Buró | Entregar resultados a la callback_url de FonVivienda. |
Firma del mensaje
La cabecera X-FV-Signature transporta la marca de tiempo y la firma:
Construcción de la cadena a firmar
- Obtener
t= segundos Unix del momento del envío. - Serializar el cuerpo JSON exactamente como se transmitirá, byte a byte. No se aplica canonicalización: se firma lo que viaja.
- Concatenar
t, un punto y el cuerpo:"{t}.{cuerpo}". - Calcular
HMAC-SHA256con la clave secreta compartida y codificar el resultado en hexadecimal minúsculo.
Verificación en el receptor
- Rechazar si
|ahora − t| > 300segundos →401 · FV-401-005. - Comparar en tiempo constante (
crypto.timingSafeEqual) para evitar ataques de temporización. - Rechazar si el par
(t, v1)ya se procesó dentro de la ventana →409 · FV-409-002. - Durante la rotación de claves se aceptan simultáneamente la clave vigente y la anterior, por 7 días.
El callback del buró hacia FonVivienda se firma con la misma construcción pero con la clave del buró, en la cabecera X-FV-Signature. FonVivienda rechaza con 401 cualquier callback sin firma válida: es la única defensa contra la inyección de resultados falsos.
Idempotencia
Todo POST exige Idempotency-Key con un UUID v4. El receptor guarda, por clave, la huella SHA-256 del cuerpo y la respuesta emitida durante 24 horas.
| Situación | Respuesta | Comportamiento |
|---|---|---|
| Clave nueva | 202 | Se procesa normalmente y se almacena el resultado. |
| Clave repetida, mismo cuerpo | 202 | Se devuelve la respuesta original con la cabecera Idempotent-Replay: true. No se reprocesa. |
| Clave repetida, cuerpo distinto | 409 | FV-409-001. Indica un error del cliente: debe generarse una clave nueva. |
Clave ausente en POST | 428 | FV-428-001 · Precondición requerida. |
Límites de uso
| Operación | Límite | Ventana y notas |
|---|---|---|
POST /evaluaciones | 120 peticiones/minuto | Por client_id. Ráfagas de hasta 40 en 5 segundos y un máximo de 20 peticiones concurrentes. |
GET /evaluaciones/{id} | 600 peticiones/minuto | Sondeo recomendado: no más de 1 consulta cada 30 segundos por evaluación. |
POST /consentimientos/revocaciones | 60 peticiones/minuto | Sin límite de concurrencia adicional. |
GET /catalogos | 60 peticiones/minuto | Usar ETag e If-None-Match; un 304 no consume cuota. |
Toda respuesta incluye RateLimit-Limit, RateLimit-Remaining y RateLimit-Reset. Al agotarse la cuota se devuelve 429 con Retry-After en segundos.
Rotación de credenciales
- Clave HMAC: rotación semestral programada, con solapamiento de 7 días.
- Certificado mTLS: vigencia máxima de 12 meses; aviso a los 60, 30 y 7 días.
- client_secret: rotación anual o inmediata ante sospecha de compromiso.
- Ante un incidente, la revocación es efectiva en menos de 15 minutos y se notifica por el canal de seguridad registrado.
Consentimiento y datos personales
El consentimiento informado del potencial deudor es condición habilitante de todo el intercambio. Sin él, la consulta de información crediticia —tradicional o alternativa— carece de base legal.
El objeto de consentimiento
| Campo | Tipo | Descripción |
|---|---|---|
otorgado | boolean | Debe ser true. Un registro con false no debe enviarse; se rechaza con 422 · FV-422-106. |
fecha_hora | date-time | ISO 8601 con desplazamiento horario explícito (-04:00). |
canal | enum | PRESENCIAL · WEB · APP · TELEFONICO. |
version_terminos | string | Identificador de la versión del texto aceptado, p. ej. CONS-2026-01. |
referencia_evidencia | string | Huella sha256: del documento o del asiento de aceptación. No se transmite el documento. |
vigencia_hasta | date | Vencimiento del consentimiento. Máximo 12 meses desde su otorgamiento. |
alcance | array | BURO_TRADICIONAL, DATA_ALTERNATIVA, SEGURIDAD_SOCIAL, SERVICIOS_BASICOS. |
Evidencia y verificabilidad
FonVivienda conserva la evidencia original (formulario firmado, asiento de aceptación digital con sello de tiempo o grabación) y transmite únicamente su huella criptográfica. Ante un requerimiento del titular o del regulador, la huella permite demostrar que la evidencia no ha sido alterada.
El buró no debe almacenar los datos personales de un solicitante más allá de lo necesario para producir la segmentación y para sustentar la auditoría del modelo. El contrato no habilita el enriquecimiento de bases comerciales con esta población.
Revocación
Cuando un ciudadano revoca su consentimiento, FonVivienda notifica al buró por POST /consentimientos/revocaciones con el registro_id y la identificacion. El buró debe:
- Detener toda consulta futura asociada a ese titular en un plazo máximo de 24 horas.
- Marcar los resultados previos como derivados de un consentimiento revocado.
- Confirmar la ejecución con
202y un identificador de tratamiento.
Si la revocación llega mientras una evaluación está EN_PROCESO, esta se resuelve como segmento C con motivo SEG-C-04.
Minimización y retención
| Dato | Retención máxima | Justificación |
|---|---|---|
| Cuerpo completo del mensaje | 90 días | Resolución de incidencias y conciliación operativa. |
| Nombres, apellidos, dirección, contacto | Vigencia del consentimiento | Solo para resolución de identidad. |
| Variables del modelo y resultado | 5 años | Validación y backtesting del modelo ante la Superintendencia. |
| Bitácoras de auditoría (sin PII) | 7 años | Trazabilidad regulatoria. |
| Huella de consentimiento | 10 años | Prueba de base legal del tratamiento. |
Trazabilidad y auditoría
Cada consulta genera un asiento inmutable con: X-Request-Id, registro_id, buro_id, marca de tiempo, resultado de segmento y referencia del consentimiento. Nunca se registra el cuerpo completo con datos personales en bitácoras de aplicación; los campos de nivel Alto y Crítico se enmascaran antes de escribir.
Entorno de pruebas
Genere una petición con datos ficticios, fírmela y envíela al endpoint que usted indique —el receptor de su buró o un servicio de captura de peticiones— para verificar el contrato de extremo a extremo sin escribir una sola línea de código.
Use exclusivamente datos ficticios. Este simulador envía el contenido del editor a la URL que usted escriba. No pegue aquí registros de solicitantes reales.
Paso 1 · Destino
Indique dónde debe recibirse la petición. Si aún no tiene un receptor, cree un endpoint temporal en un servicio de captura de peticiones y pegue aquí la URL.
Debe ser https://. El receptor tiene que responder con las cabeceras CORS Access-Control-Allow-Origin para que el navegador exponga la respuesta; si no lo hace, use el modo opaco o el comando cURL equivalente.
Solo se usa en su navegador para calcular X-FV-Signature. No se transmite.
Se envía como Authorization: Bearer ….
Paso 2 · Generar la petición
Se construye a partir de un registro de la muestra del piloto, con cédula sintética de dígito verificador válido e identificador de hogar seudonimizado.
Paso 3 · Validar contra el esquema
Validación local contra el subconjunto normativo del JSON Schema: tipos, obligatoriedad, patrones, enumeraciones, rangos y las reglas cruzadas FV-422-1xx.
Paso 4 · Firmar y enviar
Al enviar se calcula la firma HMAC-SHA256 sobre {timestamp}.{cuerpo} y se arma el juego completo de cabeceras del API contract.
«Enviar en serie» ejecuta 14 peticiones consecutivas, una por solicitante, como haría el cliente real: el API contract no admite agrupar registros en una sola llamada.
Cabeceras que se enviarán
Paso 5 · Respuesta
Consola
Cuerpo de la respuesta
Simulador del callback del buró
Genera el evento evaluacion.completada que el buró enviaría de vuelta a la callback_url de FonVivienda. Sirve para que el equipo de FonVivienda construya y pruebe su receptor antes de que el buró esté listo.
Equivalente en cURL
Copie y ejecute desde una terminal si su receptor no admite peticiones desde el navegador.
Ejemplos de código
Implementaciones de referencia del envío firmado y de la recepción del callback, en las tecnologías de uso más frecuente en el sector.
cURL
Python
Con requests y la biblioteca estándar. Incluye reintentos con retroceso exponencial e idempotencia estable.
C# / .NET
Node.js — receptor del callback
Lado FonVivienda: verificación de firma en tiempo constante y ventana antirreplay antes de aceptar el resultado.