Una API. Una decisión. En milisegundos.
Conecta tu originación a M.A.T.I.A.S. con una API REST documentada en OpenAPI 3.1: sandbox con datos sintéticos, llaves por ambiente, webhooks por evento y respuestas explicadas.
M.A.T.I.A.S. Credit Decision Engine API
La API REST con la que tu sistema de originación pide la decisión de crédito. Envías la solicitud tal como la tienes y recibes approved, review o denied, con tasa, monto, plazo, garantías y documentos sugeridos, el resumen del buró y el score.
La política de crédito de tu entidad (identidad, buró, listas, score, capacidad de pago, condiciones por perfil, aprobaciones humanas) se configura en Matías Flows, sin cambiar la API.
- 01 Diccionario una vez
- 02 Solicitud tal cual la tienes
- 03 Decisión approved · review · denied
- 04 Resultado final webhook o consulta
curl -X POST https://sandbox-api.matias-score.ai/v1/decision \
-H "X-API-Key: TU_API_KEY" -H "Content-Type: application/json" \
-d '{"applicant_name": "MARTA LUCIA FICTICIA SINTETICA", "id_type": "CC",
"id_number": "900003121", "first_lastname": "FICTICIA",
"loan_amount": 25000000, "loan_term": 48}'
Inicio rápido
Tu primera decisión en sandbox, en 3 llamadas: publica el diccionario, envía la solicitud y pide la decisión.
Usa siempre TU_API_KEY en los ejemplos: las llaves se entregan por canal seguro y se muestran una sola vez.
# 1 · Publica tu diccionario (una vez por ambiente)
curl -X PUT https://sandbox-api.matias-score.ai/v1/data/mapping \
-H "X-API-Key: TU_API_KEY" -H "Content-Type: application/json" \
-d '{"version": 1, "fields": {
"doc_type": {"aliases": ["documento.tipoDocumento"], "type": "string"},
"doc_number": {"aliases": ["documento.numeroDocumento"], "type": "string"},
"full_name": {"aliases": ["documento.nombreCompleto"], "type": "string"},
"loan_amount":{"aliases": ["solicitud.monto"], "type": "number"},
"loan_term": {"aliases": ["solicitud.plazoMeses"], "type": "integer"}}}'
# 2 · Envía la solicitud tal cual la tiene tu sistema
curl -X POST https://sandbox-api.matias-score.ai/v1/data/ingest \
-H "X-API-Key: TU_API_KEY" -H "Content-Type: application/json" \
-d '{"documento": {"tipoDocumento": "CC", "numeroDocumento": "900003121",
"nombreCompleto": "MARTA LUCIA FICTICIA SINTETICA"},
"solicitud": {"monto": 25000000, "plazoMeses": 48}}'
# 3 · Pide la decisión
curl -X POST https://sandbox-api.matias-score.ai/v1/decision \
-H "X-API-Key: TU_API_KEY" -H "Content-Type: application/json" \
-d '{"applicant_name": "MARTA LUCIA FICTICIA SINTETICA", "id_type": "CC",
"id_number": "900003121", "first_lastname": "FICTICIA",
"loan_amount": 25000000, "loan_term": 48}'
Autenticación
Cada petición lleva la cabecera X-API-Key. El ambiente lo define la llave: una llave de sandbox solo funciona en sandbox y una de producción solo en producción; en cualquier otro caso la API responde 401.
curl https://sandbox-api.matias-score.ai/v1/providers \
-H "X-API-Key: TU_API_KEY"
# Llave de otro ambiente o ausente → 401
{ "detail": "Invalid or missing API key" }
Ambientes
- AMBIENTE | URL BASE | LLAVE | USO
- Sandbox | https://sandbox-api.matias-score.ai | mts_sbx_… | Pruebas con datos sintéticos; burós simulados
- Producción | https://prod-api.matias-score.ai | mts_prod_… | Solicitudes reales
Diccionario de datos
Declara una vez cómo se llaman tus campos (aliases) y M.A.T.I.A.S. los entiende en cada solicitud. Cada publicación sube la version.
curl -X GET https://sandbox-api.matias-score.ai/v1/data/mapping \
-H "X-API-Key: TU_API_KEY"
# 200
{
"version": 1,
"fields": {
"doc_number": {
"aliases": [
"documento",
"numero_documento",
"documento.numeroDocumento"
],
"type": "string"
},
"loan_amount": {
"aliases": [
"monto",
"solicitud.simulacion.monto"
],
"type": "number"
}
}
}
- GET /v1/data/mapping
- PUT /v1/data/mapping
Solicitudes
Envía la solicitud tal como la tiene tu sistema y, si hace falta, sus documentos adjuntos: PDF, JPEG, PNG o TIFF, hasta 4 MB por archivo y 10 por petición.
curl -X POST https://sandbox-api.matias-score.ai/v1/data/ingest \
-H "X-API-Key: TU_API_KEY" -H "Content-Type: application/json" \
-d '{
"referencia": "b25e417e-200f-5a3a-8a97-185d3ecdd12d",
"documento": {
"tipoDocumento": "CC",
"numeroDocumento": "900003121",
"nombreCompleto": "MARTA LUCIA FICTICIA SINTETICA",
"primerApellido": "FICTICIA",
"fechaNacimiento": "1958-03-14"
},
"solicitud": {
"simulacion": {
"monto": 25000000,
"plazoMeses": 48
}
}
}'
# 201
{
"record_id": "9fdca1e525104808e42e03ab4a4ce52e",
"dictionary_version": 1,
"mapped_fields": [
"doc_number",
"doc_type",
"fecha_nacimiento",
"first_lastname",
"full_name",
"loan_amount",
"loan_term",
"referencia"
],
"extra_fields": [
"documento",
"solicitud"
],
"applicant_id": 107,
"message": "Record ingested successfully"
}
- POST /v1/data/ingest
- GET /v1/data/ingest/{record_id}/attachments
- PUT /v1/data/ingest/{record_id}/attachments/{field}
- DELETE /v1/data/ingest/{record_id}/attachments/{attachment_id}
Buró
Consulta los proveedores disponibles para tu cuenta y pide el reporte de buró del solicitante.
curl -X GET https://sandbox-api.matias-score.ai/v1/providers \
-H "X-API-Key: TU_API_KEY"
# 200
{
"timestamp": "2026-10-02T13:05:11.204118",
"total_providers": 4,
"registered_providers": [
"mock",
"datacredito",
"datacredito_hcpn",
"datacredito_hcpj"
],
"providers": [
{
"name": "mock",
"type": "mock",
"configured": true,
"available": true
},
{
"name": "datacredito",
"type": "datacredito",
"configured": false,
"available": false
},
{
"name": "datacredito_hcpn",
"type": "datacredito",
"configured": false,
"available": false
},
{
"name": "datacredito_hcpj",
"type": "datacredito",
"configured": false,
"available": false
}
]
}
- GET /v1/providers
- POST /v1/bureau/report
Score
Calcula el score de M.A.T.I.A.S. y el perfil de riesgo PR-1 a PR-5 del solicitante.
curl -X POST https://sandbox-api.matias-score.ai/v1/scorecard \
-H "X-API-Key: TU_API_KEY" -H "Content-Type: application/json" \
-d '{
"doc_type": "CC",
"doc_number": "900003121",
"data": {
"ingresos_mensuales_cop": 4200000
}
}'
# 200
{
"result_id": "e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b",
"config_version": 3,
"score": 817,
"risk_profile": "PR-1",
"strategy": "Bajo Riesgo",
"bureau_data_available": true,
"bureau_report_id": "4c0d7e9a-1b2f-4e8a-9c3d-5f6a7b8c9d0e",
"ingested_record_id": "132ec2c1c2387b0f24a2723f073d1f09",
"missing_optional_inputs": {}
}
Decisión
- DECISION | CUÁNDO | QUÉ HACER
- approved | La política aprueba | Usa suggested_rate, suggested_amount, suggested_term, garantías y documentos
- denied | La política rechaza (p. ej. perfil PR-5, bajo el cut-off) | reasons.policy_reason dice el motivo
- review | Requiere revisión | Si policy_reason es pending_human_approval o pending_external_validation, no reenvíes: el resultado final llega a tu webhook o con GET /v1/decision/{analysis_id}
La respuesta nunca expone la configuración interna de la política.
{
"decision": "approved",
"suggested_rate": "1.29% MV",
"suggested_amount": "25000000",
"suggested_term": "48",
"suggested_guarantees": {},
"suggested_docs": {},
"reasons": {
"risk_profile": "PR-1",
"strategy": "Bajo Riesgo",
"score": 817,
"bureau_score": 817,
"policy_reason": "risk_profile_PR-1"
},
"analysis_id": "d622eb31-8ba9-430e-9ffd-abace28c54b6",
"bureau_info": {
"status": "ok",
"error_code": null,
"provider": "datacredito",
"provider_type": "hdc-acierta",
"timestamp": "2026-10-02T00:42:30",
"mock": true,
"risk_level": "low",
"currency": "COP",
"credit_details": {
"total_balance": 6131000,
"total_balance_in_mora": 0,
"balance_90d_late": null,
"max_mora_days": 0,
"quotas_in_mora": 0,
"active_credits": 1,
"closed_credits": 2,
"negative_credits": 0,
"has_negative_history_12m": false,
"inquiries_last_6m": 0,
"oldest_account_date": "2013-03-02"
}
},
"scorecard": {
"score": 817,
"risk_profile": "PR-1",
"strategy": "Bajo Riesgo",
"bureau_data_available": true
}
}
- POST /v1/decision
- GET /v1/decision/{analysis_id}
Solicitantes
Consulta el historial y el último análisis de un solicitante por su documento.
curl -X GET https://sandbox-api.matias-score.ai/v1/applicant \
-H "X-API-Key: TU_API_KEY"
# 200
{
"total": 1,
"page": 1,
"page_size": 50,
"applicants": [
{
"applicant_id": 107,
"doc_type": "CC",
"doc_number": "900003121",
"full_name": "MARTA LUCIA FICTICIA SINTETICA",
"city": null,
"department": null,
"record_count": 2,
"last_ingested_at": "2026-10-02T00:42:30Z"
}
]
}
- GET /v1/applicant
- GET /v1/applicant/{doc_type}/{doc_number}
Webhooks · decision.updated
Cuando una decisión en review se cierra, M.A.T.I.A.S. hace POST a tu URL con el mismo cuerpo de GET /v1/decision/{analysis_id}.
Responde 2xx. Ante 408, 425, 429, 5xx o falla de red se reintenta a los 10 s, 30 s, 1, 2 y 5 min. Usa X-Matias-Delivery para no procesar dos veces el mismo envío. La autenticación del receptor la defines tú (API key, bearer o basic).
POST /tu/receptor HTTP/1.1
Content-Type: application/json
X-Matias-Event: decision.updated
X-Matias-Delivery: 856d2b27-5372-4de7-8f41-7860ab41acab
x-api-key: <la llave de tu receptor>
{ "decision": "approved", "analysis_id": "d622eb31-8ba9-430e-9ffd-abace28c54b6", "…": "…" }
Errores y límites
Todos los errores tienen la forma {"detail": "…"}.
- CÓDIGO | SIGNIFICADO
- 400 | Cuerpo inválido (p. ej. diccionario mal formado o archivo no permitido)
- 401 | Invalid or missing API key (o llave de otro ambiente)
- 403 | Cuota de almacenamiento de documentos superada
- 404 | El recurso no existe para tu cuenta y ambiente
- 409 | Versión del diccionario no mayor que la vigente, o llave sin flujo de decisión activo
- 422 | Faltan datos obligatorios (p. ej. id_number is required)
- 429 | Más de 120 peticiones por minuto por llave (Retry-After: 60)
Convenciones: JSON UTF-8; fechas ISO 8601; montos en COP como número; plazos en meses; documentos sin puntos ni espacios; tipos de documento CC, CE, PAS, PPT. Configura un tiempo de espera de 30 s para /v1/decision.
Escenarios de prueba del sandbox
En sandbox los burós son simulados y responden según la terminación del documento. La decisión final depende de la política configurada para tu cuenta de sandbox.
- TERMINA EN | RESULTADO DEL BURÓ SIMULADO
- …999 | Perfil impecable (puntaje alto, sin moras)
- …222 | Muchas huellas de consulta
- …333 | Mora actual de 30 días
- …444 | Cartera castigada
- …666 | Alerta de suplantación
- …000 | Sin historial
- …777 | El documento no existe
Referencia completa
Generada desde la especificación OpenAPI 3.1 de la API: cada ruta con sus parámetros, cuerpo, respuestas y ejemplos.
GET /health Estado del servicio Estado
Sin llave. Útil para monitoreo.
{
"status": "ok",
"service": "M.A.T.I.A.S. Credit Decision Engine",
"version": "1.0.0",
"db": "up"
}
GET /v1/providers Proveedores de buró disponibles Buró
Proveedores habilitados para su cuenta y ambiente (en sandbox, solo el simulador).
{
"timestamp": "2026-10-02T13:05:11.204118",
"total_providers": 4,
"registered_providers": [
"mock",
"datacredito",
"datacredito_hcpn",
"datacredito_hcpj"
],
"providers": [
{
"name": "mock",
"type": "mock",
"configured": true,
"available": true
},
{
"name": "datacredito",
"type": "datacredito",
"configured": false,
"available": false
},
{
"name": "datacredito_hcpn",
"type": "datacredito",
"configured": false,
"available": false
},
{
"name": "datacredito_hcpj",
"type": "datacredito",
"configured": false,
"available": false
}
]
}
GET /v1/data/mapping Ver el diccionario vigente Diccionario de datos
Cómo se traducen los nombres de campo de su sistema a los campos de M.A.T.I.A.S.
{
"version": 1,
"fields": {
"doc_number": {
"aliases": [
"documento",
"numero_documento",
"documento.numeroDocumento"
],
"type": "string"
},
"loan_amount": {
"aliases": [
"monto",
"solicitud.simulacion.monto"
],
"type": "number"
}
}
}
PUT /v1/data/mapping Publicar una versión del diccionario Diccionario de datos
Reemplazo completo. Un alias con puntos es una ruta dentro de su JSON (documento.numeroDocumento). version debe ser mayor que todas las anteriores. Al publicar, los registros anteriores se reprocesan.
{
"version": 2,
"records_scanned": 1240,
"records_updated": 1240,
"promotion_failures": 0,
"message": "Mapping updated successfully"
}
POST /v1/data/ingest Enviar una solicitud Solicitudes
Envíe el JSON de su sistema tal cual: M.A.T.I.A.S. lo traduce con el diccionario. También acepta multipart/form-data (campo payload + un archivo por cada campo file: PDF, JPEG, PNG o TIFF de hasta 4 MB, máximo 10). Cada envío crea un registro; la decisión usa el último del solicitante.
{
"record_id": "9fdca1e525104808e42e03ab4a4ce52e",
"dictionary_version": 1,
"mapped_fields": [
"doc_number",
"doc_type",
"fecha_nacimiento",
"first_lastname",
"full_name",
"loan_amount",
"loan_term",
"referencia"
],
"extra_fields": [
"documento",
"solicitud"
],
"applicant_id": 107,
"message": "Record ingested successfully"
}
GET /v1/data/ingest/{record_id}/attachments Listar documentos de un registro Solicitudes
URLs de descarga firmadas que vencen a los 15 minutos.
[
{
"attachment_id": "bee943fb00d0a0c3f6b6d5cf2b0a6032",
"field_name": "cedula_foto",
"filename": "cedula.jpg",
"content_type": "image/jpeg",
"size_bytes": 182340,
"uploaded_at": "2026-10-02T00:42:30Z",
"download_url": "https://sandbox-api.matias-score.ai/v1/data/attachments/download/eyJrIjoi…"
}
]
PUT /v1/data/ingest/{record_id}/attachments/{field} Subir o reemplazar un documento Solicitudes
Cuerpo = el archivo en binario, con Content-Type y X-Filename.
{
"attachment_id": "bee943fb00d0a0c3f6b6d5cf2b0a6032",
"field_name": "cedula_foto",
"filename": "cedula.jpg",
"content_type": "image/jpeg",
"size_bytes": 182340,
"uploaded_at": "2026-10-02T00:42:30Z",
"download_url": "https://sandbox-api.matias-score.ai/v1/data/attachments/download/eyJrIjoi…"
}
DELETE /v1/data/ingest/{record_id}/attachments/{attachment_id} Borrar un documento Solicitudes
Borra el archivo y su referencia en el registro.
{
"message": "Attachment deleted"
}
POST /v1/bureau/report Cargar un reporte de buró Buró
Si su sistema ya consultó DataCrédito (HDC+ JSON), envíelo y M.A.T.I.A.S. lo usa sin volver a consultar (vigencia de 72 h).
{
"report_id": "4c0d7e9a-1b2f-4e8a-9c3d-5f6a7b8c9d0e",
"applicant_id": 107,
"provider": "datacredito",
"score": 776,
"risk_level": "low",
"expires_at": "2026-10-05T00:42:30Z",
"message": "Report ingested successfully"
}
POST /v1/scorecard Calcular el score M.A.T.I.A.S. Score
Score 0–1000 con el modelo de su entidad y su perfil de riesgo (PR-1 a PR-5). Nunca falla por datos faltantes: los reporta en missing_optional_inputs.
{
"result_id": "e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b",
"config_version": 3,
"score": 817,
"risk_profile": "PR-1",
"strategy": "Bajo Riesgo",
"bureau_data_available": true,
"bureau_report_id": "4c0d7e9a-1b2f-4e8a-9c3d-5f6a7b8c9d0e",
"ingested_record_id": "132ec2c1c2387b0f24a2723f073d1f09",
"missing_optional_inputs": {}
}
POST /v1/decision Pedir la decisión de crédito Decisión
Ejecuta la política de crédito de su entidad (configurada en Matías Flows) sobre el último registro del solicitante: identidad, buró, score, capacidad de pago, listas, condiciones por perfil y aprobaciones humanas. Configure un tiempo de espera de 30 s.
{
"decision": "approved",
"suggested_rate": "1.29% MV",
"suggested_amount": "25000000",
"suggested_term": "48",
"suggested_guarantees": {},
"suggested_docs": {},
"reasons": {
"risk_profile": "PR-1",
"strategy": "Bajo Riesgo",
"score": 817,
"bureau_score": 817,
"policy_reason": "risk_profile_PR-1"
},
"analysis_id": "d622eb31-8ba9-430e-9ffd-abace28c54b6",
"bureau_info": {
"status": "ok",
"error_code": null,
"provider": "datacredito",
"provider_type": "hdc-acierta",
"timestamp": "2026-10-02T00:42:30",
"mock": true,
"risk_level": "low",
"currency": "COP",
"credit_details": {
"total_balance": 6131000,
"total_balance_in_mora": 0,
"balance_90d_late": null,
"max_mora_days": 0,
"quotas_in_mora": 0,
"active_credits": 1,
"closed_credits": 2,
"negative_credits": 0,
"has_negative_history_12m": false,
"inquiries_last_6m": 0,
"oldest_account_date": "2013-03-02"
}
},
"scorecard": {
"score": 817,
"risk_profile": "PR-1",
"strategy": "Bajo Riesgo",
"bureau_data_available": true
}
}
GET /v1/decision/{analysis_id} Consultar una decisión Decisión
La decisión registrada. Si quedó en review pendiente, aquí aparece la final cuando se cierra.
GET /v1/applicant Listar solicitantes Solicitantes
Paginado, de la actividad más reciente a la más antigua.
{
"total": 1,
"page": 1,
"page_size": 50,
"applicants": [
{
"applicant_id": 107,
"doc_type": "CC",
"doc_number": "900003121",
"full_name": "MARTA LUCIA FICTICIA SINTETICA",
"city": null,
"department": null,
"record_count": 2,
"last_ingested_at": "2026-10-02T00:42:30Z"
}
]
}
GET /v1/applicant/{doc_type}/{doc_number} Ver un solicitante Solicitantes
Registros, reportes de buró y scores del solicitante en este ambiente.
{
"applicant": {
"id": 107,
"doc_type": "CC",
"doc_number": "900003121",
"full_name": "MARTA LUCIA FICTICIA SINTETICA"
},
"ingested_records": [
"…"
],
"bureau_reports": [
"…"
],
"score_results": [
"…"
]
}
Estado del servicio
GET https://sandbox-api.matias-score.ai/health