{
  "info": {
    "name": "Looviin · GIG Ingest API",
    "description": "Ingesta masiva de aplicaciones del canal GIG con scoring automático.\n\n**Contrato en inglés** (request y response). El endpoint acepta los nombres en español como alias legacy, pero responde siempre en inglés.\n\n**Antes de usar:** pestaña **Variables** → `apiKey` = tu clave de **PRODUCCIÓN**, `apiKeyDev` = tu clave de **DEV/sandbox** (ambas se generan en el portal de partners). `baseUrl` ya apunta a producción.\n\n**Modelo B — la KEY decide el modo:** la **key DEV siempre SIMULA** (valida + puntúa igual que PRO, pero NO envía WhatsApp, NO persiste ni consume cuota; la respuesta trae `mode:dev`, cada result `simulated:true` con `id:null`, y `would_notify` = preview del outbound). Un request **real** exige **key PRO + ruta /PRO** (doble candado). Recomendado: probá primero en **/DEV** y, cuando todo esté ok, pasá a **/PRO**.\n\nCada request trae una **respuesta de ejemplo guardada** (la ves sin enviar) y un **test script** que valida la respuesta y loguea los campos clave en la consola de Postman (View → Show Postman Console).\n\nConsola web: https://api.looviin.com/sandbox",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://api.looviin.com",
      "type": "string"
    },
    {
      "key": "apiKey",
      "value": "TU_API_KEY",
      "type": "string"
    },
    {
      "key": "apiKeyDev",
      "value": "TU_API_KEY_DEV",
      "type": "string"
    }
  ],
  "item": [
    {
      "name": "Simular en DEV · POST /DEV (key DEV)",
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
              "const d = pm.response.json();",
              "pm.test('mode dev (simulación)', () => pm.expect(d.mode).to.eql('dev'));",
              "pm.test('simulated, sin id', () => { const r = (d.results||[])[0]||{}; pm.expect(r.simulated).to.be.true; pm.expect(r.id).to.eql(null); });",
              "const r = (d.results||[])[0];",
              "if (r) console.log('mode:', d.mode, '· score:', r.score, '· would_notify:', JSON.stringify(r.would_notify));"
            ]
          }
        }
      ],
      "request": {
        "method": "POST",
        "header": [
          { "key": "Content-Type", "value": "application/json" },
          { "key": "X-API-Key", "value": "{{apiKeyDev}}" }
        ],
        "url": {
          "raw": "{{baseUrl}}/DEV",
          "host": [ "{{baseUrl}}" ],
          "path": [ "DEV" ]
        },
        "body": {
          "mode": "raw",
          "raw": "{\n  \"applications\": [\n    {\n      \"name\": \"Ana García\",\n      \"id_number\": \"9876543210\",\n      \"city\": \"Medellín\",\n      \"phone\": \"+573109876543\",\n      \"platform\": \"inDrive\",\n      \"currency\": \"COP\",\n      \"income\": 3200000,\n      \"debt_amount\": 600000,\n      \"num_debts\": \"2\",\n      \"debt_age\": \"6a12\",\n      \"prior_history\": \"yes\",\n      \"whatsapp_optin\": false\n    }\n  ]\n}",
          "options": { "raw": { "language": "json" } }
        },
        "description": "Modo **SIMULACIÓN** (Modelo B). Mismo contrato que /PRO, pero con tu **key DEV**: valida + puntúa igual, pero NO envía, NO persiste ni consume cuota. Respuesta con `mode:dev`, cada result `simulated:true` + `id:null`, y `would_notify` (preview del WhatsApp que se enviaría en PRO). Probá acá antes de ir a /PRO."
      },
      "response": [
        {
          "name": "200 · Simulación (mode:dev)",
          "status": "OK",
          "code": 200,
          "_postman_previewlanguage": "json",
          "header": [ { "key": "Content-Type", "value": "application/json" } ],
          "cookie": [],
          "originalRequest": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" },
              { "key": "X-API-Key", "value": "{{apiKeyDev}}" }
            ],
            "url": {
              "raw": "{{baseUrl}}/DEV",
              "host": [ "{{baseUrl}}" ],
              "path": [ "DEV" ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"applications\": [\n    {\n      \"name\": \"Ana García\",\n      \"id_number\": \"9876543210\",\n      \"city\": \"Medellín\",\n      \"phone\": \"+573109876543\",\n      \"platform\": \"inDrive\",\n      \"currency\": \"COP\",\n      \"income\": 3200000,\n      \"debt_amount\": 600000,\n      \"num_debts\": \"2\",\n      \"debt_age\": \"6a12\",\n      \"prior_history\": \"yes\",\n      \"whatsapp_optin\": false\n    }\n  ]\n}",
              "options": { "raw": { "language": "json" } }
            }
          },
          "body": "{\n  \"processed\": 1,\n  \"errors\": 0,\n  \"mode\": \"dev\",\n  \"results\": [\n    {\n      \"id_number\": \"9876543210\",\n      \"name\": \"Ana García\",\n      \"id\": null,\n      \"score\": 90,\n      \"decision\": \"approved\",\n      \"status\": \"pending_signature\",\n      \"simulated\": true,\n      \"would_notify\": {\n        \"channel\": \"whatsapp\",\n        \"type\": \"approved\",\n        \"to\": \"+573109876543\",\n        \"template\": \"OTBd57f4e167a3eda86a43b11a1f49e7cfd\"\n      }\n    }\n  ]\n}"
        }
      ]
    },
    {
      "name": "Enviar lote · POST /PRO (gateway)",
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
              "const d = pm.response.json();",
              "pm.test('trae results[]', () => pm.expect(d.results).to.be.an('array'));",
              "console.log('processed:', d.processed, '· errors:', d.errors);",
              "if (d.results && d.results[0]) {",
              "  const r = d.results[0];",
              "  console.log('id:', r.id, '· score:', r.score, '· decision:', r.decision, '· status:', r.status);",
              "}"
            ]
          }
        }
      ],
      "request": {
        "method": "POST",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          },
          {
            "key": "X-API-Key",
            "value": "{{apiKey}}"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/PRO",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "PRO"
          ]
        },
        "body": {
          "mode": "raw",
          "raw": "{\n  \"applications\": [\n    {\n      \"name\": \"Ana García\",\n      \"id_number\": \"9876543210\",\n      \"city\": \"Medellín\",\n      \"phone\": \"+573109876543\",\n      \"platform\": \"inDrive\",\n      \"currency\": \"COP\",\n      \"income\": 3200000,\n      \"debt_amount\": 600000,\n      \"num_debts\": \"2\",\n      \"debt_age\": \"6a12\",\n      \"prior_history\": \"yes\",\n      \"whatsapp_optin\": false\n    }\n  ]\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        },
        "description": "Envía hasta 100 aplicaciones por request. Respuesta en inglés: `results[]` (registradas) y `errors_detail[]` (rechazadas). Credencial **gateway** → puntúa (`score`, `decision`, `status`)."
      },
      "response": [
        {
          "name": "200 · Éxito (gateway)",
          "status": "OK",
          "code": 200,
          "_postman_previewlanguage": "json",
          "header": [
            {
              "key": "Content-Type",
              "value": "application/json"
            }
          ],
          "cookie": [],
          "originalRequest": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "X-API-Key",
                "value": "{{apiKey}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/PRO",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "PRO"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"applications\": [\n    {\n      \"name\": \"Ana García\",\n      \"id_number\": \"9876543210\",\n      \"city\": \"Medellín\",\n      \"phone\": \"+573109876543\",\n      \"platform\": \"inDrive\",\n      \"currency\": \"COP\",\n      \"income\": 3200000,\n      \"debt_amount\": 600000,\n      \"num_debts\": \"2\",\n      \"debt_age\": \"6a12\",\n      \"prior_history\": \"yes\",\n      \"whatsapp_optin\": false\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Envía hasta 100 aplicaciones por request. Respuesta en inglés: `results[]` (registradas) y `errors_detail[]` (rechazadas). Credencial **gateway** → puntúa (`score`, `decision`, `status`)."
          },
          "body": "{\n  \"processed\": 1,\n  \"errors\": 0,\n  \"results\": [\n    {\n      \"id_number\": \"9876543210\",\n      \"name\": \"Ana García\",\n      \"id\": 117,\n      \"score\": 90,\n      \"decision\": \"approved\",\n      \"status\": \"pending_signature\"\n    }\n  ]\n}"
        }
      ]
    },
    {
      "name": "Lote con error de validación · POST /PRO",
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "pm.test('HTTP 200 (procesamiento parcial)', () => pm.response.to.have.status(200));",
              "const d = pm.response.json();",
              "pm.test('trae errors_detail[]', () => pm.expect(d.errors_detail).to.be.an('array'));",
              "console.log('processed:', d.processed, '· errors:', d.errors);",
              "(d.errors_detail||[]).forEach(e => console.log('rechazada', e.id_number, '→', e.error));"
            ]
          }
        }
      ],
      "request": {
        "method": "POST",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          },
          {
            "key": "X-API-Key",
            "value": "{{apiKey}}"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/PRO",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "PRO"
          ]
        },
        "body": {
          "mode": "raw",
          "raw": "{\n  \"applications\": [\n    {\n      \"name\": \"Falta ingreso\",\n      \"id_number\": \"0000000000\",\n      \"city\": \"Bogotá\",\n      \"phone\": \"+573000000000\",\n      \"platform\": \"rappi\",\n      \"currency\": \"COP\",\n      \"debt_amount\": 500000,\n      \"num_debts\": \"1\",\n      \"debt_age\": \"lt6\",\n      \"prior_history\": \"no\",\n      \"whatsapp_optin\": false\n    }\n  ]\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        },
        "description": "Una aplicación a la que le falta `income`. El lote responde **HTTP 200** igual (procesamiento parcial): la que falla cae en `errors_detail[]` con el motivo; el resto se procesa."
      },
      "response": [
        {
          "name": "200 · Con error de validación",
          "status": "OK",
          "code": 200,
          "_postman_previewlanguage": "json",
          "header": [
            {
              "key": "Content-Type",
              "value": "application/json"
            }
          ],
          "cookie": [],
          "originalRequest": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "X-API-Key",
                "value": "{{apiKey}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/PRO",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "PRO"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"applications\": [\n    {\n      \"name\": \"Falta ingreso\",\n      \"id_number\": \"0000000000\",\n      \"city\": \"Bogotá\",\n      \"phone\": \"+573000000000\",\n      \"platform\": \"rappi\",\n      \"currency\": \"COP\",\n      \"debt_amount\": 500000,\n      \"num_debts\": \"1\",\n      \"debt_age\": \"lt6\",\n      \"prior_history\": \"no\",\n      \"whatsapp_optin\": false\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Una aplicación a la que le falta `income`. El lote responde **HTTP 200** igual (procesamiento parcial): la que falla cae en `errors_detail[]` con el motivo; el resto se procesa."
          },
          "body": "{\n  \"processed\": 0,\n  \"errors\": 1,\n  \"results\": [],\n  \"errors_detail\": [\n    {\n      \"id_number\": \"0000000000\",\n      \"error\": \"income is required and must be > 0 (numeric)\"\n    }\n  ]\n}"
        }
      ]
    },
    {
      "name": "Consultar cuota · GET /PRO",
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
              "const d = pm.response.json();",
              "const p = d.partner || {};",
              "console.log('partner:', p.name, '· remaining:', p.remaining, 'de', p.daily_cap);"
            ]
          }
        }
      ],
      "request": {
        "method": "GET",
        "header": [
          {
            "key": "X-API-Key",
            "value": "{{apiKey}}"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/PRO",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "PRO"
          ]
        },
        "description": "Estado de tu credencial (ventana rolling 24h), en inglés: `partner{name,country,daily_cap,used_24h,remaining}`. `daily_cap`/`remaining` son null si tu credencial no tiene cap."
      },
      "response": [
        {
          "name": "200 · Cuota",
          "status": "OK",
          "code": 200,
          "_postman_previewlanguage": "json",
          "header": [
            {
              "key": "Content-Type",
              "value": "application/json"
            }
          ],
          "cookie": [],
          "originalRequest": {
            "method": "GET",
            "header": [
              {
                "key": "X-API-Key",
                "value": "{{apiKey}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/PRO",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "PRO"
              ]
            },
            "description": "Estado de tu credencial (ventana rolling 24h), en inglés: `partner{name,country,daily_cap,used_24h,remaining}`. `daily_cap`/`remaining` son null si tu credencial no tiene cap."
          },
          "body": "{\n  \"partner\": {\n    \"name\": \"Aliado Demo S.A.S.\",\n    \"country\": \"CO\",\n    \"daily_cap\": 300,\n    \"used_24h\": 45,\n    \"remaining\": 255\n  },\n  \"window\": \"rolling_24h\",\n  \"fetched_at\": \"2026-06-25T20:28:07.862918+00:00\"\n}"
        }
      ]
    },
    {
      "name": "Alias en español (legacy) · POST /PRO",
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
              "const d = pm.response.json();",
              "pm.test('respuesta en inglés (results)', () => pm.expect(d).to.have.property('results'));",
              "console.log('alias ES aceptado · processed:', d.processed);"
            ]
          }
        }
      ],
      "request": {
        "method": "POST",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          },
          {
            "key": "X-API-Key",
            "value": "{{apiKey}}"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/PRO",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "PRO"
          ]
        },
        "body": {
          "mode": "raw",
          "raw": "{\n  \"aplicaciones\": [\n    {\n      \"nombre\": \"Pedro ES\",\n      \"cedula\": \"5556667778\",\n      \"ciudad\": \"Bogotá\",\n      \"telefono\": \"+573005556677\",\n      \"plataforma\": \"rappi\",\n      \"moneda\": \"COP\",\n      \"ingreso\": 2500000,\n      \"monto_deuda\": 700000,\n      \"num_deudas\": \"1\",\n      \"antiguedad_mora\": \"lt6\",\n      \"historial_previo\": \"no\",\n      \"optin_whatsapp\": false\n    }\n  ]\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        },
        "description": "El endpoint acepta los nombres en **español** como alias heredado (`aplicaciones`/`nombre`/`ingreso`…). La **respuesta siempre va en inglés**. Úsalo solo si ya tenías una integración previa; para nuevas, usa los nombres en inglés."
      },
      "response": [
        {
          "name": "200 · Acepta español, responde inglés",
          "status": "OK",
          "code": 200,
          "_postman_previewlanguage": "json",
          "header": [
            {
              "key": "Content-Type",
              "value": "application/json"
            }
          ],
          "cookie": [],
          "originalRequest": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "X-API-Key",
                "value": "{{apiKey}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/PRO",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "PRO"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"aplicaciones\": [\n    {\n      \"nombre\": \"Pedro ES\",\n      \"cedula\": \"5556667778\",\n      \"ciudad\": \"Bogotá\",\n      \"telefono\": \"+573005556677\",\n      \"plataforma\": \"rappi\",\n      \"moneda\": \"COP\",\n      \"ingreso\": 2500000,\n      \"monto_deuda\": 700000,\n      \"num_deudas\": \"1\",\n      \"antiguedad_mora\": \"lt6\",\n      \"historial_previo\": \"no\",\n      \"optin_whatsapp\": false\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "El endpoint acepta los nombres en **español** como alias heredado (`aplicaciones`/`nombre`/`ingreso`…). La **respuesta siempre va en inglés**. Úsalo solo si ya tenías una integración previa; para nuevas, usa los nombres en inglés."
          },
          "body": "{\n  \"processed\": 1,\n  \"errors\": 0,\n  \"results\": [\n    {\n      \"id_number\": \"5556667778\",\n      \"name\": \"Pedro ES\",\n      \"id\": 118,\n      \"score\": 78,\n      \"decision\": \"approved\",\n      \"status\": \"pending_signature\"\n    }\n  ]\n}"
        }
      ]
    }
  ]
}