🔧 SANDBOX (DEV) · entorno interno — no es producción

Acceso al Sandbox

Ingresa una API Key válida generada en el LMS (Sistema → API Keys). El acceso se valida en tiempo real: si la clave está revocada, no podrás entrar.
¿Sin credenciales? Solicítalas a tu administrador en el panel de Lirium.
Solicitud de prueba
Completa los datos y las variables de scoring, luego pulsa Probar para enviar la aplicación al motor real de Looviin.
SANDBOX
Datos del solicitante

Variables de scoring
JSON del request
📊
Sin resultados todavía
Completa la solicitud y pulsa Probar para ver aquí la decisión, el score y la respuesta del motor.
Entorno
Modo simulación (DEV). Valida y puntúa igual que producción, pero no persiste la solicitud, no envía WhatsApp y no consume cuota. Podés re-enviar los mismos datos las veces que quieras. La respuesta trae "mode":"dev", cada resultado "simulated":true y, si correspondería un mensaje, un "would_notify" con el outbound que se dispararía en PRO (tipo · destino · plantilla) — preview, no se envía.
Uso de la credencial · 24h
Cargando uso de la credencial…
Actividad del sandbox · 24h
hace 24 hahora
Envíos hechos desde este sandbox con tu credencial (se guardan localmente en este navegador).

GIG Ingest API

Ingesta masiva de aplicaciones del canal GIG (plataformas de socios y/o usuarios masivos) con evaluación automática de scoring crediticio. Hasta 100 aplicaciones por request.

Autenticación

Cada request debe incluir tu API Key en el header:

X-API-Key: <tu-api-key>

Las credenciales las entrega tu contacto en Looviin. Trátalas como secretas; si se compromete una, solicita su revocación.

Endpoint

El API expone dos entornos con la misma interfaz — misma ruta, mismo formato de request y de response. Solo cambia el segmento final de la URL:

EntornoEndpointEstado
ProducciónPOST https://api.looviin.com/PRO● Disponible
Sandbox / DEVPOST https://api.looviin.com/DEV● Disponible (simulación)

Content-Type: application/json en ambos entornos.

Entorno DEV (sandbox de simulación): /DEV usa el mismo contrato que /PRO (mismos campos, mismo scoring, mismos códigos de respuesta), pero corre en modo simulación: valida y puntúa tu lote sin persistir la solicitud, sin enviar WhatsApp y sin consumir cuota — podés re-probar los mismos datos cuantas veces quieras. La respuesta incluye "mode":"dev" y cada resultado lleva "simulated":true (con id:null, porque no se crea ninguna solicitud real). Para que veas el mensaje que recibiría el usuario sin enviar nada, cada resultado que dispararía un outbound incluye "would_notify" (preview: tipo de notificación — approved/rejected/offer —, destino y plantilla). Usalo para validar tu integración de punta a punta antes de pasar a /PRO.

Request — body

Los nombres de los campos van en inglés (convención de la industria). Por compatibilidad, el endpoint /PRO aún acepta los nombres en español como alias heredado, pero documentamos y recomendamos los de inglés.

{
  "applications": [
    {
      "name":           "Juan Pérez",
      "id_number":      "1234567890",
      "city":           "Bogotá",
      "phone":          "+573001234567",
      "platform":       "rappi",
      "currency":       "COP",
      "income":         2500000,
      "debt_amount":    800000,
      "num_debts":      "1",
      "debt_age":       "lt6",
      "prior_history":  "no",
      "whatsapp_optin": true
    }
  ]
}

Campos

CampoTipoReq.Descripción
namestringNombre completo del solicitante. Alias ES: nombre
id_numberstringCédula de ciudadanía. Alias ES: cedula
citystringCiudad de residencia. Alias ES: ciudad
phonestringNoNúmero con código de país. Alias ES: telefono
platformstringNorappi | inDrive | uber | texto libre (nombre de la plataforma). Alias ES: plataforma
currencystringNoCódigo de 3 letras de la moneda de los montos: COP | USD | MXN | PEN | ARS | CLP | BRL … Si se omite, se infiere por el código de país del teléfono. Alias ES: moneda
incomenumberIngresos mensuales generados en tu plataforma, en la moneda declarada (> 0). Alias ES: ingreso / ingreso_cop
debt_amountnumberMonto de la deuda a consolidar, en la moneda declarada (> 0). Alias ES: monto_deuda / monto_deuda_cop
num_debtsstring"1" | "2" | "3". Alias ES: num_deudas
debt_agestringVer tabla abajo. Alias ES: antiguedad_mora
prior_historystring"yes" | "no". Alias ES: historial_previo ("si"/"no")
whatsapp_optinbooleanConsentimiento del usuario para ser contactado por Looviin vía WhatsApp. Debe ser true para que el cliente reciba el flujo de WhatsApp y firma del contrato. Sin consentimiento la solicitud se registra y evalúa igual, pero no se le contactará por WhatsApp. Alias ES: optin_whatsapp

Wrapper: el array raíz es applications (alias ES heredado: aplicaciones). Máximo 100 por request.

Consentimiento WhatsApp (opt-in): antes de enviar la solicitud, el socio debe haber obtenido el consentimiento explícito del usuario para que Looviin lo contacte por WhatsApp, y enviarlo en whatsapp_optin. Es un requisito de la plataforma de WhatsApp/Meta para mensajes iniciados por la empresa: solo se contactará a los usuarios que dieron whatsapp_optin: true.

Valores de debt_age

ValorSignificado
lt6Menos de 6 meses en mora
6a12Entre 6 y 12 meses en mora
1a2Entre 1 y 2 años en mora
gt2Más de 2 años en mora

Response

La respuesta va en inglés (mismo estándar que el request).

Éxito 200

{
  "processed": 1,
  "errors": 0,
  "results": [
    {
      "id_number": "1234567890",
      "name":      "Juan Pérez",
      "id":        42,
      "score":     75,
      "decision":  "approved",
      "status":    "pending_signature"
    }
  ]
}

Si alguna aplicación falla validación, se incluye errors_detail (el resto del lote se procesa igual):

{
  "processed": 1,
  "errors": 1,
  "results": [ ... ],
  "errors_detail": [
    { "id_number": "0000000000", "error": "income is required and must be > 0 (numeric)" }
  ]
}

¿Quedó registrada o no?

Cómo interpretar la respuesta por cada aplicación del lote:

✓ Registrada
Aparece en results[] (con id, score, decision, status) y cuenta dentro de processed. La aplicación quedó creada en Looviin. Cada entrada trae el id_number como identificador para emparejarla con tu envío.
✗ No registrada
No está en results[]: aparece en errors_detail[] con el motivo (suma a errors), o el request falló (HTTP ≠ 200). No se creó — corrige y reenvíala.

Unicidad por WhatsApp: el requisito que evita duplicados es el número de phone (WhatsApp), no el id_number. Si ya existe una aplicación abierta (no rechazada ni desembolsada) con ese número, la nueva se rechaza con el motivo “A request already exists for this WhatsApp number”. El id_number es obligatorio y se devuelve igual en cada resultado para emparejarlo con tu envío.

El resto del lote se procesa igual aunque algunas fallen: revisa results[] vs errors_detail[] aplicación por aplicación, no solo el código HTTP.

Qué recibe el cliente por WhatsApp

Cuando una aplicación entra con whatsapp_optin: true y queda registrada, Looviin dispara un outbound de WhatsApp al número de phone: una oferta co-branded (tu marca + Looviin) con el saldo de la deuda y un botón “Me interesa”. Si el cliente acepta, el resto del flujo (extractos, validación de ingreso, firma) ocurre dentro del mismo chat. Así se ve la respuesta esperada del lado del cliente:

Este es un ejemplo ilustrativo del mensaje co-branded. El texto exacto, el nombre del aliado y los botones se configuran en tu credencial; “Aliado Demo” es un nombre ficticio.

Tabla de decisiones

Scoredecisionstatus
≥ 70approvedpending_signature
50 – 69in_reviewin_review
30 – 49in_reviewin_review
< 30rejectedrejected
Monto > límiterejectedrejected

Errores HTTP

CódigoDescripción
400JSON inválido o campos requeridos faltantes
401API Key inválida o ausente
405Método no permitido (solo POST/GET)
500Error interno temporal — reintentar

Cuota diaria por partner

Tu credencial tiene un cap diario negociado con Looviin (ventana rolling 24h). Si un lote excede el restante disponible, las aplicaciones que sobran se rechazan individualmente con el código quota_partner_exceeded dentro de errors_detail[]; el resto del lote se procesa normal (modo procesamiento parcial, HTTP 200):

{
  "processed": 280,
  "errors": 20,
  "results": [ ... 280 items ... ],
  "errors_detail": [
    {
      "id_number": "1234567890",
      "error":     "quota_partner_exceeded",
      "remaining": 0,
      "daily_cap": 300
    }
  ]
}

Si tu credencial fue creada sin cap (campo daily_cap nulo en el LMS), no hay límite por partner — los lotes solo están sujetos al máximo de 100 apps por request.

Consultar cuota antes de enviar (GET)

Para no enviar un lote que vas a exceder, podés consultar tu estado actual con un GET al mismo endpoint:

GET https://api.looviin.com/PRO
X-API-Key: <tu-api-key>

Respuesta:

{
  "partner": {
    "name":      "Aliado Demo S.A.S.",
    "country":   "CO",
    "daily_cap": 300,
    "used_24h":  45,
    "remaining": 255
  },
  "window":     "rolling_24h",
  "fetched_at": "2026-05-23T20:28:07.862918+00:00"
}

El sandbox tiene la pestaña Conexión & cuota con un botón “Consultar cuota” debajo del campo X-API-Key que llama a este endpoint y muestra el resultado en cards. daily_cap y remaining son null si tu credencial no tiene cap.

Lotes

Máximo 100 aplicaciones por request. Las que fallen validación se omiten individualmente; el resto se procesa. Si además el lote excede tu cap diario, se procesan las primeras N apps que entren en el restante y las demás responden con quota_partner_exceeded (ver arriba).

Normalización tolerante

El endpoint normaliza la entrada antes de validar. No necesitas adaptar tu formato a estos casos:

CampoAceptaSe normaliza a
income, debt_amountnúmero o string numérico (2500000 o "2500000"); también los alias heredados ingreso/ingreso_cop · monto_deuda/monto_deuda_copnúmero (> 0)
currencycódigo de 3 letras en cualquier capitalización (cop, Usd…)mayúsculas; si no es válida se infiere por el teléfono
num_debtsstring o entero ("1" o 1)string "1"/"2"/"3"
debt_agecualquier capitalizaciónminúsculas
prior_historyyes/no (o el alias ES si/no), cualquier capitalizaciónminúsculas (si/no interno)
platformtexto libre o ausenteminúsculas, gig si vacío
name, id_number, city, phonecon espacios sobrantestrim()
Un elemento del array que no sea un objeto (null, string, número) se rechaza individualmente sin abortar el resto del lote.

Motor de scoring

CriterioPuntos máx
Capacidad de pago (ingreso / cuota de referencia)25
Canal de origen (GIG = 20 fijo)20
Antigüedad de mora20
Número de deudas en mora20
Historial de pago previo15
Total100

Ejemplos (cURL)

POST · enviar lote

curl -X POST https://api.looviin.com/PRO \
  -H "Content-Type: application/json" \
  -H "X-API-Key: TU_API_KEY" \
  -d '{
    "applications": [
      {
        "name":           "Ana García",
        "id_number":      "9876543210",
        "city":           "Medellín",
        "phone":          "+573109876543",
        "platform":       "inDrive",
        "currency":       "COP",
        "income":         3200000,
        "debt_amount":    600000,
        "num_debts":      "2",
        "debt_age":       "6a12",
        "prior_history":  "yes",
        "whatsapp_optin": true
      }
    ]
  }'

GET · consultar cuota

curl https://api.looviin.com/PRO \
  -H "X-API-Key: TU_API_KEY"
Looviin Colombia · GIG API · Documentación para integradores. Para soporte o gestión de credenciales, contacta a tu enlace en Looviin.
Colección Postman
Postman Collection v2.1 · 5 requests con respuestas de ejemplo y test scripts · variables baseUrl + apiKey + apiKeyDev
Descargar (.json)
1 · Importar y configurar
  1. En Postman: Import → arrastra looviin-gig-api.postman_collection.json.
  2. Abre la colección → pestaña Variables → pega tu clave de producción en apiKey y la de DEV en apiKeyDev (columna Current value) y guarda.
Colección importada en Postman
Colección importada en Postman
Pestaña Variables · pega tu apiKey
Postman · pestaña Variables con apiKey
2 · Enviar y ver la respuesta

Abre Enviar lote · POST /PRO, revisa el body y dale Send. Cada request trae una respuesta de ejemplo guardada (la ves sin enviar, en el selector de Examples) y un test script que valida la respuesta y loguea los campos clave en la consola (View → Show Postman Console).

POST · Enviar lote → éxito (200)
Postman · POST enviar lote con respuesta 200
POST → error por aplicación (HTTP 200 + errors_detail)
Postman · POST con error (errors_detail)
Si el teléfono ya tiene una solicitud abierta, esa app cae en errors_detail[] con el motivo. El request responde 200 y el resto del lote se procesa igual.
Error general del request (envelope { error })
Postman · error general del request (401 Unauthorized)
No es por aplicación: el request entero falla con su HTTP — 401 (clave inválida o ausente), 400 (JSON inválido o lote vacío), 405 (método no permitido), 500 (reintentar).
GET · Consultar cuota (200)
Postman · GET cuota con respuesta 200
Consola de Postman (logs del test script)
Postman Console con el log del test script
Requests incluidos
POST/PROEnviar lote (gateway) — éxito con score/decision/status
POST/PROLote con error de validación — HTTP 200 + errors_detail[]
GET/PROConsultar cuota de la credencial
POST/PROAlias en español (legacy) — acepta ES, responde EN
Variables
baseUrlhttps://api.looviin.com
apiKeytu clave (reemplazar)
Autenticación

Cada request lleva el header X-API-Key: {{apiKey}}, ya configurado en la colección. La respuesta va en inglés (mismo endpoint que el sandbox, api.looviin.com).