// Descripción general
Score Express
El endpoint Express devuelve en tiempo real el score crediticio de una persona a partir de su CUIT/CUIL. Cubre la población completa del registro CENDEU/BCRA — el mercado formal de crédito argentino.
Endpoint
🧪
Ambiente de testing (QA)
Para pruebas e integración, usá el endpoint de QA:
https://qa.api.score.findo.com.ar/v1/express
Autenticación
🔐
OAuth 2.0 · Client Credentials
Antes de llamar al endpoint Express, debés obtener un access token usando tus credenciales de cliente. El token se incluye luego en cada request como
Authorization: Bearer <token>. Expira a las 24h.Paso 1 — Obtener el token
POST · Token endpoint
curl --location \ 'https://api.score.findo.com.ar/v1/oauth/token' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'grant_type=client_credentials' \ --data-urlencode 'client_id=<tu_client_id>' \ --data-urlencode 'client_secret=<tu_client_secret>'
| Parámetro | Valor | Descripción |
|---|---|---|
| grant_type | client_credentials | Flujo OAuth 2.0 para integración server-to-server. |
| client_id | string | Identificador de cliente provisto por Findo. |
| client_secret | string | Secret de cliente provisto por Findo. Nunca exponerlo en el frontend. |
Respuesta
JSON
{
"access_token": "eyJhbGciOiAiUlMyNTYi...",
"token_type": "Bearer",
"expires_in": 86400 // 24 horas en segundos
}
Paso 2 — Usar el token en cada request
JWT Payload (referencia)
isshttps://oauth.findo.com/
audhttps://score.findo.com/
expiat + 86400 s (+24h)
azptu client_id
algRS256
Parámetros de Query
| Nombre | Tipo | Req. | Descripción |
|---|---|---|---|
| legal_id | string | SÍ | CUIT o CUIL sin guiones ni espacios. Ej: 20340102034 |
Headers de Request
| Header | Descripción | Req. |
|---|---|---|
| Content-Type | application/json | SÍ |
| Authorization | Token JWT firmado RS256. Formato: Bearer <token>. Expira cada 24h. |
SÍ |
| CLIENT_ID | Identificador del cliente. Coincide con azp del JWT.<tu_client_id> |
SÍ |
Ejemplo de Request
cURL
curl --location \ 'https://api.score.findo.com.ar/v1/express?legal_id=20340102034' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --header 'CLIENT_ID: <tu_client_id>'
JavaScript · fetch
const res = await fetch( `https://api.score.findo.com.ar/v1/express?legal_id=${legalId}`, { method: 'GET', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${jwtToken}`, 'CLIENT_ID': '<tu_client_id>', }, } ); const data = await res.json();
Respuestas
200 OK
400 Bad Request
401 Unauthorized
403 Forbidden
404 Not Found
500 Server Error
Esquema de la Respuesta 200
| Campo | Tipo | Descripción |
|---|---|---|
| request_id | string | Identificador único de la request para trazabilidad. |
| findo_score | integer | Score de 0 a 100. Mayor valor → mayor capacidad de pago. |
| estimated_income | float | Ingreso estimado en escala relativa (no en pesos). |
| individual_data_report | object | Historial financiero por ventanas de 1–24 meses: entidades, montos y variaciones. |
| positive_report | object | Deudas en situación 1 (al día): entidades, montos, situación máxima. |
| negative_report | object | Deudas en situación 3–5 (mora). Vacío {} si no hay mora. |
Convención de nombres de campos
_ent_N
Cantidad de entidades informantes en los últimos N meses
_amount_total_due_N
Monto total adeudado acumulado en los últimos N meses
_variation_…_between_A_B
Variación % entre períodos A y B. Puede ser
null sin datos previos_max_sit_N
Situación máxima en N meses (1 = al día · 5 = incobrable)
Ejemplos simulados ilustrativos de respuesta
{
"request_id": "e3b40b61-2616-42ad-8970-8a4c04d9cbd2",
"findo_score": 82,
"estimated_income": 8.0,
"individual_data_report": {
"finantial_history_number_ent_1": 1.0,
"finantial_history_amount_total_due_3": 1410.0,
"finantial_history_amount_total_due_6": 1899.0,
"finantial_history_amount_total_due_12": 2650.0,
"finantial_history_variation_amount_total_due_between_3_1": -10.49
// ... demás variaciones por período
},
"positive_report": {
"finantial_history_number_ent_sit1_1": 1.0,
"finantial_history_amount_sit1_1": 1262.0,
"finantial_history_max_sit_1": 1.0 // al día en todos los períodos
},
"negative_report": {} // sin mora
}
// Quick start
Integrá en minutos
Este script de Python cubre el flujo completo: obtiene el token OAuth 2.0 con tus credenciales y consulta el score Express de un CUIL/CUIT. Podés usarlo como punto de partida para tu integración.
Requisitos
| Requisito | Detalle |
|---|---|
| Python | 3.8 o superior |
| requests | pip install requests |
| FINDO_CLIENT_ID | Variable de entorno con tu Client ID |
| PROD_CLIENT_SECRET | Variable de entorno con tu Client Secret. Nunca hardcodear. |
Variables de entorno
bash
export FINDO_BASE_URL="https://api.score.findo.com.ar" export FINDO_CLIENT_ID="tu_client_id" export PROD_CLIENT_SECRET="tu_client_secret"
example.py
Python
import os import sys import requests BASE_URL = os.getenv("FINDO_BASE_URL", "https://api.score.findo.com.ar") CLIENT_ID = os.getenv("FINDO_CLIENT_ID") CLIENT_SECRET = os.getenv("PROD_CLIENT_SECRET") def validate_cuil(cuil): if not cuil.isdigit() or len(cuil) not in (10, 11): raise SystemExit("Invalid CUIL. Use digits only and a length of 10 or 11.") def get_access_token(): if not CLIENT_SECRET: raise SystemExit("Missing env var: PROD_CLIENT_SECRET") response = requests.post( f"{BASE_URL}/v1/oauth/token", headers={"Content-Type": "application/x-www-form-urlencoded"}, data={"client_id": CLIENT_ID, "client_secret": CLIENT_SECRET}, ) print("Token status:", response.status_code) print("Token body:", response.text) response.raise_for_status() access_token = response.json().get("access_token") if not access_token: raise SystemExit("No access_token in response") return access_token def get_express_score(access_token, cuil, phone_number=None): headers = { "Content-Type": "application/json", "Authorization": access_token, "CLIENT_ID": CLIENT_ID, } params = {"legal_id": cuil} if phone_number: params["phone_number"] = phone_number response = requests.get( f"{BASE_URL}/v1/express", headers=headers, params=params ) print("Express status:", response.status_code) print("Express body:", response.text) return response if __name__ == "__main__": if len(sys.argv) < 2: raise SystemExit("Usage: python example.py <cuil> [phone_number]") cuil = sys.argv[1] phone_number = sys.argv[2] if len(sys.argv) > 2 else None validate_cuil(cuil) print("Getting access token...") token = get_access_token() print("Getting express score...") get_express_score(token, cuil, phone_number) print("Express score obtained successfully")
Ejecución
bash
# Solo con CUIL python example.py 20340102034 # Con CUIL y teléfono (opcional) python example.py 20340102034 543413155042