{
  "info": {
    "name": "Advanta API",
    "description": "Importable Postman collection for Advanta APIs.\n\n**Setup**: paste your sandbox key (sk_test_...) into the `api_key` collection variable.\n\n**Pattern**: every request points at the sandbox base by default. Switch to production by changing `base_url` to `https://api.advanta.pt/v1`.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [{ "key": "token", "value": "{{api_key}}", "type": "string" }]
  },
  "variable": [
    { "key": "base_url", "value": "https://sandbox.advanta.pt/v1" },
    { "key": "api_key", "value": "sk_test_paste_your_sandbox_key_here" },
    { "key": "test_nif", "value": "509123456" },
    { "key": "test_session_id", "value": "" },
    { "key": "test_connection_id", "value": "" }
  ],
  "item": [
    {
      "name": "1. Connect — create session",
      "request": {
        "method": "POST",
        "header": [{ "key": "Content-Type", "value": "application/json" }],
        "url": "{{base_url}}/connect/sessions",
        "body": {
          "mode": "raw",
          "raw": "{\n  \"customer\": {\n    \"nif\": \"{{test_nif}}\",\n    \"name\": \"Construções Ibéricas, Lda.\",\n    \"email\": \"joao@construcoes.pt\"\n  },\n  \"branding\": \"co-branded\",\n  \"scopes\": [\"invoices:read\", \"receivables:read\", \"saft:read\"],\n  \"redirect_url\": \"https://factoring.banco.pt/connect/done\",\n  \"metadata\": {\n    \"bank_customer_id\": \"BANCO-CUST-12345\"\n  }\n}"
        }
      },
      "event": [{
        "listen": "test",
        "script": {
          "exec": [
            "if (pm.response.code === 201) {",
            "  const j = pm.response.json();",
            "  pm.collectionVariables.set('test_session_id', j.session_id);",
            "  pm.test('returns connect_url', () => pm.expect(j.connect_url).to.include('connect.advanta.pt'));",
            "}"
          ],
          "type": "text/javascript"
        }
      }]
    },
    {
      "name": "2. Connect — inspect session",
      "request": {
        "method": "GET",
        "url": "{{base_url}}/connect/sessions/{{test_session_id}}"
      }
    },
    {
      "name": "3. Score — generate (by NIF)",
      "request": {
        "method": "POST",
        "header": [{ "key": "Content-Type", "value": "application/json" }],
        "url": "{{base_url}}/score",
        "body": {
          "mode": "raw",
          "raw": "{\n  \"nif\": \"{{test_nif}}\",\n  \"product\": \"factoring\",\n  \"horizon_days\": 90\n}"
        }
      },
      "event": [{
        "listen": "test",
        "script": {
          "exec": [
            "pm.test('returns 200', () => pm.response.to.have.status(200));",
            "const j = pm.response.json();",
            "pm.test('score 0-100', () => pm.expect(j.score).to.be.within(0, 100));",
            "pm.test('has recommended limit', () => pm.expect(j.recommended_limit_eur).to.be.a('number'));"
          ],
          "type": "text/javascript"
        }
      }]
    },
    {
      "name": "4. ERP — list invoices",
      "request": {
        "method": "GET",
        "url": {
          "raw": "{{base_url}}/erp/{{test_connection_id}}/invoices?status=open&limit=50",
          "host": ["{{base_url}}"],
          "path": ["erp", "{{test_connection_id}}", "invoices"],
          "query": [
            { "key": "status", "value": "open" },
            { "key": "limit", "value": "50" }
          ]
        }
      }
    },
    {
      "name": "5. ERP — list receivables",
      "request": {
        "method": "GET",
        "url": "{{base_url}}/erp/{{test_connection_id}}/receivables"
      }
    },
    {
      "name": "6. ERP — trigger SAFT-PT pull",
      "request": {
        "method": "POST",
        "url": "{{base_url}}/erp/{{test_connection_id}}/saft/refresh"
      }
    },
    {
      "name": "7. ERP — disconnect (revoke OAuth)",
      "request": {
        "method": "DELETE",
        "url": "{{base_url}}/erp/{{test_connection_id}}"
      }
    },
    {
      "name": "8. Edge case — invalid NIF",
      "request": {
        "method": "POST",
        "header": [{ "key": "Content-Type", "value": "application/json" }],
        "url": "{{base_url}}/score",
        "body": {
          "mode": "raw",
          "raw": "{\n  \"nif\": \"999999990\",\n  \"product\": \"factoring\"\n}"
        }
      },
      "event": [{
        "listen": "test",
        "script": {
          "exec": [
            "pm.test('returns 400', () => pm.response.to.have.status(400));",
            "pm.test('error type', () => pm.expect(pm.response.json().error.type).to.eql('validation_error'));"
          ],
          "type": "text/javascript"
        }
      }]
    },
    {
      "name": "9. Edge case — Tier C declined SME",
      "request": {
        "method": "POST",
        "header": [{ "key": "Content-Type", "value": "application/json" }],
        "url": "{{base_url}}/score",
        "body": {
          "mode": "raw",
          "raw": "{\n  \"nif\": \"505333444\",\n  \"product\": \"factoring\"\n}"
        }
      }
    },
    {
      "name": "10. Edge case — sustainability-linked candidate",
      "request": {
        "method": "POST",
        "header": [{ "key": "Content-Type", "value": "application/json" }],
        "url": "{{base_url}}/score",
        "body": {
          "mode": "raw",
          "raw": "{\n  \"nif\": \"507444555\",\n  \"product\": \"factoring\"\n}"
        }
      },
      "event": [{
        "listen": "test",
        "script": {
          "exec": [
            "const j = pm.response.json();",
            "pm.test('ESG score above 80 → sustainability-linked eligible', () => pm.expect(j.esg_score).to.be.above(80));"
          ],
          "type": "text/javascript"
        }
      }]
    }
  ]
}
