Saltar al contenido
Desarrolladores

API de Avalio

Integrá el análisis de riesgo de cheques a tu sistema. La API es determinística (el mismo motor que usa la app, con datos oficiales del BCRA) y responde en segundos. Sumá webhooks firmados para que tu sistema se entere solo cuando un emisor que monitoreás se deteriora, sin consultar en loop.

Todo es self-service: generás la clave, probás gratis en el sandbox y empezás a integrar hoy, sin llamar a ventas ni firmar nada. A diferencia de los burós tradicionales —que te atienden por teléfono y no publican ni precios ni documentación—, acá tenés OpenAPI, Postman, precios públicos y una decisión explicable desde la primera llamada.

Cómo funciona, en 3 pasos

1
Credenciales

Tu sistema envía su clave de API en el header, para demostrar identidad y permisos.

Authorization: Bearer avk_live_…
2
Consulta

Le pedís un dato puntual a un endpoint: el riesgo de un CUIT, o el CUIT de una empresa por su nombre.

POST /api/v1/riesgo {"cuit":"30…"}
3
Respuesta

Avalio cruza las fuentes oficiales y te devuelve un JSON ordenado con el score, la decisión y las fuentes.

{"score":82,"decision":"aprobar"}

En criollo: tu sistema se identifica con su clave, hace una pregunta a un endpoint y recibe la respuesta lista para usar en JSON. Nada de pantallas ni teléfono: todo máquina a máquina.

Autenticación

Todas las llamadas usan una clave de API de tu empresa. La generás desde la app, en Integraciones → API (solo el administrador). Se muestra una sola vez: guardala en un lugar seguro. Enviala en el header Authorization: Bearer o en x-api-key.

Header de autenticación
Authorization: Bearer avk_live_xxxxxxxxxxxxxxxxxxxxxxxx

Claves de prueba y de producción

Hay dos tipos de clave, y las dos son self-service (alta inmediata, sin hablar con ventas y sin contrato):

avk_test_…

Clave de prueba, gratis. Responde únicamente los CUIT de sandbox de forma determinística, sin consultar el BCRA ni consumir crédito. Para integrar y escribir tus tests antes de pagar.

avk_live_…

Clave de producción: datos reales de fuentes oficiales. Consume créditos por consulta (ver precios). No necesitás un plan: pagás por consulta.

Riesgo de cliente por CUIT

POST /api/v1/riesgo. Evaluá a un cliente o proveedor al que le vendés a crédito sin un cheque de por medio. Enviás el CUIT y, opcionalmente, un monto y plazo para simular el límite. Recibís la identidad (nombre, DNI derivado del CUIT, estado en ARCA), una decisión explícita y el porqué.

Solicitud (sandbox, con clave de prueba)
curl -X POST https://avalio.com.ar/api/v1/riesgo \
  -H "Authorization: Bearer avk_test_..." \
  -H "Content-Type: application/json" \
  -d '{ "cuit": "30700000040" }'
Respuesta
{
  "ok": true,
  "version": "v1",
  "modo": "sandbox",
  "cuit": "30700000040",
  "identidad": {
    "cuit": "30700000040",
    "tipo_persona": "juridica",
    "dni": null,
    "nombre": "SANDBOX APOC SA",
    "estado_arca": "activo"
  },
  "decision": "rechazar",
  "score": 5,
  "nivel": "Alto",
  "probabilidad_cobro": 5,
  "reasons": [
    { "code": "EN_APOC", "severidad": "critica",
      "mensaje": "El CUIT figura en la base APOC de ARCA (facturas apócrifas)." }
  ],
  "fuentes": [
    { "clave": "bcra", "etiqueta": "BCRA · Central de Deudores...", "estado": "ok",
      "as_of": "2026-01-02T12:00:00.000Z" },
    { "clave": "apoc", "etiqueta": "ARCA · Base APOC...", "estado": "alerta",
      "as_of": "2026-01-02T12:00:00.000Z" }
  ],
  "datos_desactualizados": false,
  "generado": "2026-01-02T12:00:00.000Z"
}

La respuesta es explicable: decision es una de aprobar/revisar/rechazar; cada item de reasons trae un code estable (ruteá tu lógica por el código, no por el texto); y cada fuentes[] incluye as_of (la fecha del dato). Si el BCRA está caído, datos_desactualizados es true y no se cobra.

Buscar empresa por nombre → CUIT

¿Tenés el nombre pero no el CUIT? Resolvelo con los avisos del Boletín Oficial. Es un paso previo al análisis: no consume crédito. Devuelve las coincidencias con su CUIT, listas para pasar a /riesgo. Alcance: sociedades (S.A., S.R.L., S.A.S.) con avisos recientes; no resuelve monotributistas ni personas físicas. Ningún buró self-service argentino expone esto por API.

Solicitud
curl "https://avalio.com.ar/api/v1/empresas/buscar?nombre=Molinos%20Rio%20de%20la%20Plata" \
  -H "Authorization: Bearer avk_live_..."
Respuesta
{
  "resultados": [
    { "cuit": "30500010912", "denominacion": "MOLINOS RIO DE LA PLATA S.A." }
  ],
  "request_id": "req_2f8c..."
}

Sandbox

Con una clave avk_test_ estos CUIT ficticios devuelven cada caso canónico, siempre igual, sin consumir crédito. Ideal para tus tests automatizados.

30700000016AprobarEmisor sin antecedentes negativos.
30700000024RevisarSituación 3 en la Central de Deudores del BCRA.
30700000032RevisarCon cheques rechazados impagos.
30700000040RechazarFigura en la base APOC de ARCA.
30700000059RechazarEdicto concursal en el Boletín Oficial.
30700000067RechazarCUIT dado de baja en el padrón de ARCA.
30700000075RevisarBCRA caído: datos de respaldo (datos_desactualizados=true, no cobra).

Precios

100 consultas reales gratis. Al generar tu primera clave te regalamos 100 créditos para evaluar CUITs con datos de verdad —sin tarjeta—, además del sandbox ilimitado. Probás a fondo antes de pagar un solo peso.

Pagás por consulta, no por plan: comprás un pack de créditos que no vence y cada consulta a producción descuenta uno. Sin contrato, sin mínimos. El pago es con Mercado Pago (tarjeta, débito o dinero en cuenta); también hay tarjeta internacional. El sandbox y las consultas servidas con datos de respaldo por caída del BCRA no cobran.

Comprá un pack desde tu cuenta (Comprar análisis) o mirá los planes y precios. Para volumen alto, escribinos.

Especificación y herramientas

La spec OpenAPI 3.1 está publicada en /api/v1/openapi: importala en Postman o Insomnia, o generá un SDK con openapi-generator. También podés bajar la colección de Postman.

O usá los clientes oficiales, sin dependencias (bajalos y listo): avalio.js para Node 18+ (usa fetch nativo) y avalio.py para Python 3.8+ (solo la librería estándar). Cubren todos los endpoints —riesgo, evaluate, análisis, lote, monitoreo, verificación— con Idempotency-Key y errores tipados por code.

Node.js (fetch)
const res = await fetch("https://avalio.com.ar/api/v1/riesgo", {
  method: "POST",
  headers: {
    "Authorization": "Bearer " + process.env.AVALIO_API_KEY,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ cuit: "30700000016" }),
});
const data = await res.json();
if (data.decision === "rechazar") { /* frenar la operación */ }
Python (requests)
import os, requests

res = requests.post(
    "https://avalio.com.ar/api/v1/riesgo",
    headers={"Authorization": f"Bearer {os.environ['AVALIO_API_KEY']}"},
    json={"cuit": "30700000016"},
    timeout=30,
)
data = res.json()
if data["decision"] == "rechazar":
    ...  # frenar la operación

Evaluar un cheque

POST /api/v1/evaluate. Enviás el CUIT del librador y, opcionalmente, el monto y el plazo (en días). Recibís el score, la recomendación y el detalle.

Solicitud
curl -X POST https://avalio.com.ar/api/v1/evaluate \
  -H "Authorization: Bearer avk_live_..." \
  -H "Content-Type: application/json" \
  -d '{ "cuit": "30711044567", "monto": 1500000, "plazo": 30 }'
Respuesta
{
  "ok": true,
  "version": "v1",
  "cuit": "30711044567",
  "denominacion": "EMPRESA EJEMPLO S.A.",
  "score": 82,
  "nivel": "Bajo",
  "recomendacion": "Aprobar",
  "probabilidad_cobro": 88,
  "cheques_rechazados": 0,
  "sin_registros": false,
  "confianza": 90,
  "datos_parciales": false,
  "datos_desactualizados": false,
  "generado": "2026-07-28T14:30:00.000Z"
}

Importante: datos_parciales o datos_desactualizados en truesignifican que una fuente estaba caída o se sirvió una copia de respaldo. En ese caso el resultado es orientativo: conviene reintentar antes de decidir. Avalio nunca asume que una fuente caída está «limpia».

¿Qué pesa en el score? Mirá la metodología del score. Y si querés ver el mismo análisis paso a paso sin código, mirá cómo analizar un cheque.

Límites de uso

60 solicitudes por minuto y 2.000 por hora, por clave. Si los superás, la API responde 429.

Manejo de errores e idempotencia

Ante un error, la API responde con un cuerpo uniforme: un code estable (no cambia aunque reescribamos el texto), el error legible y el request_id (también en el header X-Request-Id) para soporte. Ruteá tu lógica por el code, no por el texto ni por el status solo.

Cuerpo de error
{
  "ok": false,
  "error": "Sin créditos disponibles. Cargá un pack para seguir consultando.",
  "code": "insufficient_credits",
  "request_id": "req_2f8c..."
}
invalid_request400Faltan campos o están mal (p. ej. CUIT inválido). Corregí el pedido; no reintentes igual.
missing_api_key401No mandaste la clave. Revisá el header Authorization: Bearer o x-api-key.
invalid_api_key401Clave inválida o revocada. Generá una nueva en Integraciones → API.
insufficient_credits402Sin créditos. Cargá un pack. NO se cobró esta llamada; no reintentes en loop.
forbidden_scope403La clave no tiene el permiso (scope) para esa operación.
plan_required403La operación requiere un plan vigente que la incluya.
not_found404El recurso no existe.
rate_limited429Superaste el límite. Esperá los segundos de Retry-After y reintentá.
idempotency_conflict409Reusaste una Idempotency-Key con otro cuerpo. Usá una clave nueva para un pedido distinto.
internal_error500Error nuestro. Reintentá con backoff; si persiste, pasanos el request_id.
source_unavailable503Fuente oficial caída. NO se cobró. Reintentá con backoff.

Dos casos no se cobran: insufficient_credits (402) y source_unavailable (503, una fuente oficial caída). Ante un 429, respetá el header Retry-After (segundos). Un patrón robusto:

Manejo robusto (Node.js)
const res = await fetch(url, opts);
const data = await res.json();

if (!data.ok) {
  switch (data.code) {
    case "rate_limited": {               // 429: respetá Retry-After y reintentá
      const espera = Number(res.headers.get("Retry-After") || 1);
      await new Promise((r) => setTimeout(r, espera * 1000));
      return reintentar();
    }
    case "source_unavailable":           // 503: fuente caída, NO se cobró
    case "internal_error":               // 500: reintentá con backoff
      return reintentarConBackoff();
    case "insufficient_credits":         // 402: cargá un pack; NO reintentes en loop
    case "invalid_request":              // 400: corregí el pedido antes de reintentar
    default:
      // registrá data.code y data.request_id para soporte
      throw new Error(data.code + " / " + data.request_id);
  }
}

Idempotencia (reintentar sin re-cobrar)

Si tu red se corta y no sabés si el POST llegó, reintentalo con el mismo header Idempotency-Key: Avalio devuelve la misma respuesta (con X-Idempotent-Replayed: true), sin volver a consultar ni a cobrar. La clave vale 24 h. Usar la misma clave con un cuerpo distinto corta con 409 (idempotency_conflict): para un pedido diferente, usá una clave nueva. Mismo comportamiento que Stripe.

Solicitud idempotente
curl -X POST https://avalio.com.ar/api/v1/riesgo \
  -H "Authorization: Bearer avk_live_..." \
  -H "Idempotency-Key: pedido-7f3a9c" \
  -H "Content-Type: application/json" \
  -d '{ "cuit": "30711044567" }'

Webhooks

En vez de consultar la API en loop, registrá una URL y Avalio te avisa cuando pasa algo relevante sobre tus emisores monitoreados. La configurás en Integraciones → Webhooks (solo el administrador); podés probar la conexión al instante con el botón Probar.

cheque.cuenta_cerrada

A un cheque de tu cartera le cerraron la cuenta bancaria después de que lo analizaste.

cheque.denunciado

Un cheque de tu cartera figura denunciado en el BCRA (robo/extravío).

emisor.deterioro

El score de un emisor que monitoreás bajó de forma significativa o pasó a riesgo alto.

Cada entrega es un POST con este cuerpo:

Cuerpo de la entrega
{
  "event": "emisor.deterioro",
  "created": "2026-07-28T14:30:00.000Z",
  "data": {
    "cuit": "30711044567",
    "denominacion": "EMPRESA EJEMPLO S.A.",
    "score": 58,
    "score_anterior": 74,
    "nivel": "Medio"
  }
}

Verificar la firma

Cada entrega viaja firmada en el header X-Avalio-Signature con el formato t=<timestamp>,v1=<hmac>. El HMAC es SHA-256 sobre el texto <timestamp>.<cuerpo> usando el secret del webhook. Verificalo antes de confiar en el evento, y rechazá timestamps viejos (evita reenvíos).

Verificación (Node.js)
const crypto = require('crypto');

function verificarAvalio(secret, rawBody, header) {
  const partes = Object.fromEntries(header.split(',').map(kv => kv.split('=')));
  const t = Number(partes.t);
  if (Math.abs(Date.now() / 1000 - t) > 300) return false; // > 5 min: posible reenvío
  const esperado = crypto.createHmac('sha256', secret)
    .update(t + '.' + rawBody).digest('hex');
  return crypto.timingSafeEqual(Buffer.from(esperado), Buffer.from(partes.v1));
}

Respondé 2xx para confirmar la recepción. Si tu endpoint no responde, Avalio registra el fallo y lo vas a ver en el panel.

Disponibilidad y estado

El estado en vivo de la API y de cada fuente oficial está publicado en /estado. El diseño es fail-safe: si una fuente (BCRA, ARCA) está caída, la API responde con datos_desactualizados: true y no cobra esa consulta, en vez de darte un resultado como si la fuente estuviera bien. Para integraciones de alto volumen ofrecemos un SLA formal por contrato (disponibilidad y soporte dedicado): escribinos.

Versionado y registro de cambios

La API es estable y versionada por ruta (/api/v1). Política de compatibilidad: los cambios retrocompatibles (campos y headers nuevos, endpoints nuevos, valores nuevos en un enum) se publican sin aviso y no te rompen —programá tolerando campos desconocidos—. Un cambio incompatible nunca se aplica sobre /api/v1: saldría como una versión nueva (/api/v2), con la v1 funcionando en paralelo y un preaviso de al menos 6 meses antes de cualquier baja, avisado por mail a los integradores y acá en el changelog.

  • 22/10/2026100 consultas reales gratis al generar tu primera clave (free tier, sin tarjeta). Respuestas de riesgo FIRMADAS (HMAC): cada respuesta trae un bloque firma verificable por un tercero en POST /v1/verificar (sin API key) — probá que una decisión la emitió Avalio y no fue alterada. Clientes oficiales sin dependencias (Node y Python) y colección de Postman completa. El contrato uniforme (code estable, request_id, headers de rate-limit) ahora cubre TODOS los endpoints.
  • 21/10/2026Nuevo GET /v1/empresas/buscar: resolvé el CUIT de una empresa por su nombre (razón social) desde el Boletín Oficial, como paso previo al análisis. No consume crédito; con clave de prueba responde en sandbox.
  • 20/10/2026Headers de clase mundial en todas las respuestas: X-Request-Id, X-RateLimit-Limit/Remaining/Reset, Retry-After y X-Avalio-Credits-Charged/Remaining. Códigos de error estables (code). Soporte de Idempotency-Key (reintento sin re-cobrar). Campo opcional resumen_ia (explicá el resultado en lenguaje natural con explicar:true).
  • 18/10/2026Nuevo POST /v1/riesgo (riesgo de cliente por CUIT, con identidad y decisión explicable). Análisis por lote (/v1/riesgo/lote) y monitoreo con webhooks firmados (emisor.deterioro, lote.completado).
  • 24/08/2026Claves de prueba (avk_test_) y sandbox determinístico de CUIT: integrá y escribí tus tests antes de pagar.
  • 21/07/2026Lanzamiento de la API v1: POST /v1/evaluate (riesgo de un cheque por CUIT) y OpenAPI 3.1 público.

Empezá a integrar

Creá tu cuenta gratis, generá una clave de API y probá el primer análisis. Sin tarjeta.

Crear cuenta gratis

¿Dudas de integración? Escribinos.