{
  "info": {
    "name": "FAYGAW — Balance (read only)",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
    "description": "Consultez vos comptes et soldes avec GET /balances et une clé possédant balance:read. La clé authentifiée sélectionne l’environnement. Configurez les IP publiques de sortie de vos serveurs avant les appels. Sans IP autorisée, HTTP 403 ip-not-allowed.\n\nLes limites SANDBOX s’appliquent indépendamment par provider et par partenaire. Par défaut, le minimum Checkout est de 10 XOF et le minimum Payout de 100 XOF. Les minimums et plafonds SANDBOX peuvent être adaptés sur demande du partenaire auprès de Faygaw, après validation. Respectez les limites indiquées dans la réponse d’erreur et contactez Faygaw si une adaptation est nécessaire.\n\nSANDBOX limits apply independently per provider and partner. The default minimum is 10 XOF for Checkout and 100 XOF for Payout. SANDBOX minimums and limits can be adjusted upon the partner’s request to Faygaw, subject to approval. Follow the limits reported in the error response and contact Faygaw if an adjustment is needed."
  },
  "variable": [
    {
      "key": "base_url",
      "value": "https://api.faygaw.org/v1"
    },
    {
      "key": "api_key",
      "value": "",
      "description": "Clé API à renseigner localement ; ne pas la partager dans un export."
    },
    {
      "key": "expected_environment",
      "value": "SANDBOX",
      "description": "Contrôle de la réponse uniquement ; l’environnement est déterminé par la clé API."
    }
  ],
  "item": [
    {
      "name": "Consulter le solde — balance:read",
      "request": {
        "method": "GET",
        "url": "{{base_url}}/balances",
        "header": [
          {
            "key": "Accept",
            "value": "application/json"
          }
        ],
        "auth": {
          "type": "bearer",
          "bearer": [
            {
              "key": "token",
              "value": "{{api_key}}",
              "type": "string"
            }
          ]
        },
        "description": "## Champs de réponse / Response fields\n\n**environment** — Environnement déterminé par la clé API.\n\nEnvironment determined by the API key.\n\n**state** — RECORDED : des comptes sont disponibles. NOT_INITIALIZED : aucun compte initialisé ; accounts est vide.\n\nRECORDED: accounts are available. NOT_INITIALIZED: no account is initialized; accounts is empty.\n\n**accounts** — Comptes du Partner, par type, provider et devise.\n\nPartner accounts, by type, provider and currency.\n\n**observed_at** — Date et heure UTC de la consultation.\n\nUTC date and time of this read.\n\n**source** — Origine des données de solde.\n\nSource of the balance data.\n\n**reservation_consistency** — Indicateur de cohérence : MATCH ou NOT_APPLICABLE en l’absence de compte.\n\nConsistency indicator: MATCH, or NOT_APPLICABLE when there are no accounts.\n\n**account_id** — Identifiant du compte.\n\nAccount identifier.\n\n**account_type** — Type du compte : PROVIDER ou FAYGAW.\n\nAccount type: PROVIDER or FAYGAW.\n\n**provider** — Provider associé au compte, ou null lorsqu’aucun provider n’est associé.\n\nAssociated provider, or null when no provider is associated.\n\n**provider.code** — Code du provider, par exemple WAVE ou ORANGE_MONEY.\n\nProvider code, such as WAVE or ORANGE_MONEY.\n\n**provider.name** — Nom d’affichage du provider.\n\nProvider display name.\n\n**status** — État du compte : ACTIVE, SUSPENDED ou CLOSED.\n\nAccount status: ACTIVE, SUSPENDED or CLOSED.\n\n**currency** — Code de devise ISO, par exemple XOF.\n\nISO currency code, such as XOF.\n\n**minor_unit** — Nombre de décimales de la devise. Pour XOF : 0 ; une unité minimale représente un franc.\n\nCurrency decimal places. For XOF: 0; one minor unit is one franc.\n\n**current_minor** — Solde courant en unités minimales, sous forme de chaîne entière. Ce montant inclut reserved_minor.\n\nCurrent balance in minor units, as an integer string. It includes reserved_minor.\n\n**reserved_minor** — Part du solde temporairement indisponible pour d’autres opérations, déjà incluse dans current_minor.\n\nBalance portion temporarily unavailable for other operations, already included in current_minor.\n\n**version** — Version du compte retourné, sous forme de chaîne entière.\n\nVersion of the returned account, as an integer string.\n\n**updated_at** — Date et heure UTC de dernière mise à jour du compte.\n\nUTC date and time of the latest account update."
      },
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "pm.test(\"Balance contract\", function () {",
              "  pm.response.to.have.status(200);",
              "  pm.expect(pm.response.headers.get(\"Cache-Control\")).to.eql(\"no-store\");",
              "  const b = pm.response.json();",
              "  pm.expect(b.environment).to.eql(pm.variables.get(\"expected_environment\"));",
              "  pm.expect(b.source).to.eql(\"PARTNER_ACCOUNT_PROJECTION\");",
              "  pm.expect(b.accounts).to.be.an(\"array\");",
              "  pm.expect(b.state).to.eql(b.accounts.length ? \"RECORDED\" : \"NOT_INITIALIZED\");",
              "  pm.expect(b.reservation_consistency).to.eql(b.accounts.length ? \"MATCH\" : \"NOT_APPLICABLE\");",
              "  pm.expect(b.observed_at).to.be.a(\"string\");",
              "  b.accounts.forEach(function (a) {",
              "    [\"current_minor\", \"reserved_minor\", \"version\"].forEach(function (k) {",
              "      pm.expect(a[k]).to.be.a(\"string\").and.match(/^-?[0-9]+$/);",
              "    });",
              "    if(a.provider !== null){pm.expect(a.provider.code).to.be.a(\"string\");pm.expect(a.provider.name).to.be.a(\"string\");}",
              "    if(a.account_type === \"FAYGAW\")pm.expect(a.provider).to.eql(null);",
              "    pm.expect(a.currency).to.match(/^[A-Z]{3}$/);",
              "    pm.expect(a.minor_unit).to.be.within(0, 9);",
              "    pm.expect(a).not.to.have.property(\"available_minor\");",
              "  });",
              "});"
            ]
          }
        }
      ],
      "response": [
        {
          "name": "Comptes avec providers — exemple fictif",
          "originalRequest": {
            "method": "GET",
            "url": "{{base_url}}/balances",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{api_key}}",
                  "type": "string"
                }
              ]
            },
            "description": "## Champs de réponse / Response fields\n\n**environment** — Environnement déterminé par la clé API.\n\nEnvironment determined by the API key.\n\n**state** — RECORDED : des comptes sont disponibles. NOT_INITIALIZED : aucun compte initialisé ; accounts est vide.\n\nRECORDED: accounts are available. NOT_INITIALIZED: no account is initialized; accounts is empty.\n\n**accounts** — Comptes du Partner, par type, provider et devise.\n\nPartner accounts, by type, provider and currency.\n\n**observed_at** — Date et heure UTC de la consultation.\n\nUTC date and time of this read.\n\n**source** — Origine des données de solde.\n\nSource of the balance data.\n\n**reservation_consistency** — Indicateur de cohérence : MATCH ou NOT_APPLICABLE en l’absence de compte.\n\nConsistency indicator: MATCH, or NOT_APPLICABLE when there are no accounts.\n\n**account_id** — Identifiant du compte.\n\nAccount identifier.\n\n**account_type** — Type du compte : PROVIDER ou FAYGAW.\n\nAccount type: PROVIDER or FAYGAW.\n\n**provider** — Provider associé au compte, ou null lorsqu’aucun provider n’est associé.\n\nAssociated provider, or null when no provider is associated.\n\n**provider.code** — Code du provider, par exemple WAVE ou ORANGE_MONEY.\n\nProvider code, such as WAVE or ORANGE_MONEY.\n\n**provider.name** — Nom d’affichage du provider.\n\nProvider display name.\n\n**status** — État du compte : ACTIVE, SUSPENDED ou CLOSED.\n\nAccount status: ACTIVE, SUSPENDED or CLOSED.\n\n**currency** — Code de devise ISO, par exemple XOF.\n\nISO currency code, such as XOF.\n\n**minor_unit** — Nombre de décimales de la devise. Pour XOF : 0 ; une unité minimale représente un franc.\n\nCurrency decimal places. For XOF: 0; one minor unit is one franc.\n\n**current_minor** — Solde courant en unités minimales, sous forme de chaîne entière. Ce montant inclut reserved_minor.\n\nCurrent balance in minor units, as an integer string. It includes reserved_minor.\n\n**reserved_minor** — Part du solde temporairement indisponible pour d’autres opérations, déjà incluse dans current_minor.\n\nBalance portion temporarily unavailable for other operations, already included in current_minor.\n\n**version** — Version du compte retourné, sous forme de chaîne entière.\n\nVersion of the returned account, as an integer string.\n\n**updated_at** — Date et heure UTC de dernière mise à jour du compte.\n\nUTC date and time of the latest account update."
          },
          "status": "OK",
          "code": 200,
          "_postman_previewlanguage": "json",
          "header": [
            {
              "key": "Content-Type",
              "value": "application/json"
            },
            {
              "key": "Cache-Control",
              "value": "no-store"
            }
          ],
          "body": "{\n  \"environment\": \"SANDBOX\",\n  \"state\": \"RECORDED\",\n  \"accounts\": [\n    {\n      \"account_id\": \"pac_11111111111111111111111111111111\",\n      \"account_type\": \"PROVIDER\",\n      \"provider\": {\n        \"code\": \"WAVE\",\n        \"name\": \"Wave\"\n      },\n      \"status\": \"ACTIVE\",\n      \"currency\": \"XOF\",\n      \"minor_unit\": 0,\n      \"current_minor\": \"10000\",\n      \"reserved_minor\": \"1500\",\n      \"version\": \"1\",\n      \"updated_at\": \"2026-10-26T12:00:00.000000Z\"\n    },\n    {\n      \"account_id\": \"pac_22222222222222222222222222222222\",\n      \"account_type\": \"PROVIDER\",\n      \"provider\": {\n        \"code\": \"ORANGE_MONEY\",\n        \"name\": \"Orange Money\"\n      },\n      \"status\": \"ACTIVE\",\n      \"currency\": \"XOF\",\n      \"minor_unit\": 0,\n      \"current_minor\": \"2500\",\n      \"reserved_minor\": \"0\",\n      \"version\": \"2\",\n      \"updated_at\": \"2026-10-26T12:00:00.000000Z\"\n    },\n    {\n      \"account_id\": \"pac_33333333333333333333333333333333\",\n      \"account_type\": \"PROVIDER\",\n      \"provider\": {\n        \"code\": \"YAS\",\n        \"name\": \"Yas\"\n      },\n      \"status\": \"ACTIVE\",\n      \"currency\": \"XOF\",\n      \"minor_unit\": 0,\n      \"current_minor\": \"0\",\n      \"reserved_minor\": \"0\",\n      \"version\": \"3\",\n      \"updated_at\": \"2026-10-26T12:00:00.000000Z\"\n    }\n  ],\n  \"observed_at\": \"2026-10-26T12:01:00.000000Z\",\n  \"source\": \"PARTNER_ACCOUNT_PROJECTION\",\n  \"reservation_consistency\": \"MATCH\"\n}"
        }
      ]
    },
    {
      "name": "Sans authentification — 401",
      "request": {
        "method": "GET",
        "url": "{{base_url}}/balances",
        "header": [
          {
            "key": "Accept",
            "value": "application/json"
          }
        ],
        "auth": {
          "type": "noauth"
        },
        "description": "## Champs de réponse / Response fields\n\n**environment** — Environnement déterminé par la clé API.\n\nEnvironment determined by the API key.\n\n**state** — RECORDED : des comptes sont disponibles. NOT_INITIALIZED : aucun compte initialisé ; accounts est vide.\n\nRECORDED: accounts are available. NOT_INITIALIZED: no account is initialized; accounts is empty.\n\n**accounts** — Comptes du Partner, par type, provider et devise.\n\nPartner accounts, by type, provider and currency.\n\n**observed_at** — Date et heure UTC de la consultation.\n\nUTC date and time of this read.\n\n**source** — Origine des données de solde.\n\nSource of the balance data.\n\n**reservation_consistency** — Indicateur de cohérence : MATCH ou NOT_APPLICABLE en l’absence de compte.\n\nConsistency indicator: MATCH, or NOT_APPLICABLE when there are no accounts.\n\n**account_id** — Identifiant du compte.\n\nAccount identifier.\n\n**account_type** — Type du compte : PROVIDER ou FAYGAW.\n\nAccount type: PROVIDER or FAYGAW.\n\n**provider** — Provider associé au compte, ou null lorsqu’aucun provider n’est associé.\n\nAssociated provider, or null when no provider is associated.\n\n**provider.code** — Code du provider, par exemple WAVE ou ORANGE_MONEY.\n\nProvider code, such as WAVE or ORANGE_MONEY.\n\n**provider.name** — Nom d’affichage du provider.\n\nProvider display name.\n\n**status** — État du compte : ACTIVE, SUSPENDED ou CLOSED.\n\nAccount status: ACTIVE, SUSPENDED or CLOSED.\n\n**currency** — Code de devise ISO, par exemple XOF.\n\nISO currency code, such as XOF.\n\n**minor_unit** — Nombre de décimales de la devise. Pour XOF : 0 ; une unité minimale représente un franc.\n\nCurrency decimal places. For XOF: 0; one minor unit is one franc.\n\n**current_minor** — Solde courant en unités minimales, sous forme de chaîne entière. Ce montant inclut reserved_minor.\n\nCurrent balance in minor units, as an integer string. It includes reserved_minor.\n\n**reserved_minor** — Part du solde temporairement indisponible pour d’autres opérations, déjà incluse dans current_minor.\n\nBalance portion temporarily unavailable for other operations, already included in current_minor.\n\n**version** — Version du compte retourné, sous forme de chaîne entière.\n\nVersion of the returned account, as an integer string.\n\n**updated_at** — Date et heure UTC de dernière mise à jour du compte.\n\nUTC date and time of the latest account update."
      },
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "pm.test(\"Missing key\", () => { pm.response.to.have.status(401); pm.expect(pm.response.headers.get(\"Cache-Control\")).to.eql(\"no-store\"); });"
            ]
          }
        }
      ]
    }
  ]
}
