{
  "info": {
    "_postman_id": "bog-bonline-api-en-v2",
    "name": "BOG Business Online API [EN] v1.0.5",
    "version": "1.0.5",
    "description": "Bank of Georgia - Business Online API Collection.\n\n📦 Version: v1.0.5 (2026-10-05)\n📌 Documentation: https://api.bog.ge/docs/bonline/introduction\n📌 BASE URL: https://api.businessonline.ge/api\n📌 App Registration: https://bonline.bog.ge/admin/api/\n\n━━━━━━━━━━━━━━━━━━━━━━━━━\n🔐 3 Authentication Methods:\n\n1. Client Credentials Flow\n   → Server-to-server integration\n   → Requires: client_id + client_secret\n\n2. Implicit Flow (Desktop apps)\n   → User logs in via browser\n   → Token returned directly in redirect URL fragment\n\n3. Authorization Code Flow (Web apps)\n   → Most secure OAuth 2.0 Flow\n   → 2 steps: obtain code → exchange for token\n━━━━━━━━━━━━━━━━━━━━━━━━━\n\n⚠️ Every response includes an x-correlationid header.\nIn case of issues, send it to: customerservice@bog.ge\n\n━━━━━━━━━━━━━━━━━━━━━━━━━\n📋 Changelog\n\nv1.0.5 — 2026-10-05\nExchange rates (3.7):\n• Added GET api/v2/crossrates/{sellCurrency}/{buyCurrency} — digital-channel cross rate with base currency (baseCcy), requires auth\n\nv1.0.4 — 2026-09-26\nForeign payments (4.2, 4.2a, 5.2):\n• \"Nomination\" → \"PaymentDetail\" — the foreign payment model has no Nomination field, so the value was silently dropped\n• added \"CommissionAccountNumber\" and the COMMISSION_IBAN variable\n• 5.2: \"DispatchType\" → \"Charges\" (\"SHA\" or \"OUR\")\n• 5.2: added the missing \"Currency\"\n\nv1.0.3 and earlier — no changelog was kept",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "item": [
    {
      "name": "1. Authentication",
      "item": [
        {
          "name": "── Method 1: Client Credentials Flow ──",
          "item": [
            {
              "name": "1.1.1 [CC] Get Access Token",
              "event": [
                {
                  "listen": "test",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "if (pm.response.code === 200) {",
                      "    const json = pm.response.json();",
                      "    pm.collectionVariables.set('ACCESS_TOKEN', json.access_token);",
                      "    pm.collectionVariables.set('TOKEN_EXPIRES_IN', json.expires_in);",
                      "    console.log('✅ Token saved! Expires in:', json.expires_in, 'seconds');",
                      "    console.log('Token type:', json.token_type);",
                      "} else {",
                      "    console.log('❌ Token request failed:', pm.response.code);",
                      "    console.log(pm.response.text());",
                      "}"
                    ]
                  }
                }
              ],
              "request": {
                "auth": {
                  "type": "basic",
                  "basic": [
                    {
                      "key": "username",
                      "value": "{{CLIENT_ID}}",
                      "type": "string"
                    },
                    {
                      "key": "password",
                      "value": "{{CLIENT_SECRET}}",
                      "type": "string"
                    }
                  ]
                },
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/x-www-form-urlencoded"
                  }
                ],
                "body": {
                  "mode": "urlencoded",
                  "urlencoded": [
                    {
                      "key": "grant_type",
                      "value": "client_credentials",
                      "description": "OAuth 2.0 grant type"
                    },
                    {
                      "key": "client_id",
                      "value": "{{CLIENT_ID}}",
                      "description": "Your application's Client ID"
                    },
                    {
                      "key": "client_secret",
                      "value": "{{CLIENT_SECRET}}",
                      "description": "Your application's Client Secret"
                    }
                  ]
                },
                "url": {
                  "raw": "https://account.bog.ge/auth/realms/bog/protocol/openid-connect/token",
                  "protocol": "https",
                  "host": [
                    "account",
                    "bog",
                    "ge"
                  ],
                  "path": [
                    "auth",
                    "realms",
                    "bog",
                    "protocol",
                    "openid-connect",
                    "token"
                  ]
                },
                "description": "🔐 Client Credentials Flow - for server-to-server integration.\n\nUse when: automated systems, backend services, daemon processes.\n\nTest script automatically saves ACCESS_TOKEN - all other requests use this token.\n\n📌 Basic Auth: username = client_id, password = client_secret\n\n📤 Response fields:\n- access_token - Bearer token for API calls\n- expires_in - validity in seconds\n- token_type - 'bearer'"
              },
              "response": []
            },
            {
              "name": "1.1.2 [CC] Invalid Credentials (401)",
              "request": {
                "auth": {
                  "type": "basic",
                  "basic": [
                    {
                      "key": "username",
                      "value": "invalid_client_id",
                      "type": "string"
                    },
                    {
                      "key": "password",
                      "value": "invalid_secret",
                      "type": "string"
                    }
                  ]
                },
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/x-www-form-urlencoded"
                  }
                ],
                "body": {
                  "mode": "urlencoded",
                  "urlencoded": [
                    {
                      "key": "grant_type",
                      "value": "client_credentials"
                    },
                    {
                      "key": "client_id",
                      "value": "invalid_client_id"
                    },
                    {
                      "key": "client_secret",
                      "value": "invalid_secret"
                    }
                  ]
                },
                "url": {
                  "raw": "https://account.bog.ge/auth/realms/bog/protocol/openid-connect/token",
                  "protocol": "https",
                  "host": [
                    "account",
                    "bog",
                    "ge"
                  ],
                  "path": [
                    "auth",
                    "realms",
                    "bog",
                    "protocol",
                    "openid-connect",
                    "token"
                  ]
                },
                "description": "Intentionally invalid credentials - observe error response structure.\n\n🔍 Watch for:\n- 401 HTTP status code\n- Error JSON response structure"
              },
              "response": []
            }
          ],
          "description": "Client Credentials Flow (grant_type=client_credentials)\n\nUse for: server-to-server integrations, backend systems.\nRequires: client_id + client_secret (no redirect_uri needed)."
        },
        {
          "name": "── Method 2: Implicit Flow (Desktop) ──",
          "item": [
            {
              "name": "1.2.1 [Implicit] Open Authorization URL",
              "request": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "https://account.bog.ge/auth/realms/bog/protocol/openid-connect/auth?client_id={{CLIENT_ID}}&response_type=token&scope=corp&redirect_uri={{REDIRECT_URI}}&nonce={{$guid}}&kc_locale=ka",
                  "protocol": "https",
                  "host": [
                    "account",
                    "bog",
                    "ge"
                  ],
                  "path": [
                    "auth",
                    "realms",
                    "bog",
                    "protocol",
                    "openid-connect",
                    "auth"
                  ],
                  "query": [
                    {
                      "key": "client_id",
                      "value": "{{CLIENT_ID}}",
                      "description": "Your Client ID"
                    },
                    {
                      "key": "response_type",
                      "value": "token",
                      "description": "Implicit Flow: token (not code)"
                    },
                    {
                      "key": "scope",
                      "value": "corp",
                      "description": "Fixed value: corp"
                    },
                    {
                      "key": "redirect_uri",
                      "value": "{{REDIRECT_URI}}",
                      "description": "Your redirect URI (URL-encoded)"
                    },
                    {
                      "key": "nonce",
                      "value": "{{$guid}}",
                      "description": "Unique value to prevent replay attacks"
                    },
                    {
                      "key": "kc_locale",
                      "value": "ka",
                      "description": "UI language: ka=Georgian, omit for English"
                    }
                  ]
                },
                "description": "🔐 Implicit Flow - for Desktop/Native applications.\n\n📋 Flow:\n1. Open this URL in a browser → user logs into BOG\n2. Browser redirects to redirect_uri\n3. access_token is returned directly in the URL fragment (#)\n\n⚠️ In Postman this request follows the redirect - token appears in URL.\n   In real usage, your app reads the URL fragment.\n\n📌 response_type=token → token returned directly (no code step)\n\n🔍 Watch the redirect URL:\nhttps://your-redirect-uri#access_token=eyJ...&token_type=bearer&expires_in=300"
              },
              "response": []
            }
          ],
          "description": "Implicit Flow (response_type=token)\n\nUse for: Desktop/Native applications.\nUser logs in via browser; token returned in URL fragment.\n\n⚠️ Note: Implicit Flow is less secure than Authorization Code Flow."
        },
        {
          "name": "── Method 3: Authorization Code Flow (Web) ──",
          "item": [
            {
              "name": "1.3.1 [AuthCode] Step 1 - Open Authorization URL",
              "request": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "https://account.bog.ge/auth/realms/bog/protocol/openid-connect/auth?client_id={{CLIENT_ID}}&response_type=code&scope=corp&redirect_uri={{REDIRECT_URI}}&kc_locale=ka",
                  "protocol": "https",
                  "host": [
                    "account",
                    "bog",
                    "ge"
                  ],
                  "path": [
                    "auth",
                    "realms",
                    "bog",
                    "protocol",
                    "openid-connect",
                    "auth"
                  ],
                  "query": [
                    {
                      "key": "client_id",
                      "value": "{{CLIENT_ID}}",
                      "description": "Your Client ID"
                    },
                    {
                      "key": "response_type",
                      "value": "code",
                      "description": "Authorization Code Flow: code"
                    },
                    {
                      "key": "scope",
                      "value": "corp",
                      "description": "Fixed value: corp"
                    },
                    {
                      "key": "redirect_uri",
                      "value": "{{REDIRECT_URI}}",
                      "description": "Your redirect URI (URL-encoded)"
                    },
                    {
                      "key": "kc_locale",
                      "value": "ka",
                      "description": "UI language"
                    }
                  ]
                },
                "description": "🔐 Authorization Code Flow - for Web applications (most secure).\n\n📋 Flow:\n1️⃣  Open this URL in a browser → user logs into BOG\n2️⃣  BOG redirects to redirect_uri with ?code=XXXX query parameter\n3️⃣  Use that code in request 1.3.2 → receive access_token\n\n📌 response_type=code → only a temporary code is returned first\n\n🔍 Example redirect URL:\nhttps://your-redirect-uri?code=eyJhbGc...&session_state=abc123\n\nCopy the code value → paste into {{AUTHORIZATION_CODE}} variable → run 1.3.2!"
              },
              "response": []
            },
            {
              "name": "1.3.2 [AuthCode] Step 2 - Exchange Code for Token",
              "event": [
                {
                  "listen": "test",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "if (pm.response.code === 200) {",
                      "    const json = pm.response.json();",
                      "    pm.collectionVariables.set('ACCESS_TOKEN', json.access_token);",
                      "    if (json.refresh_token) {",
                      "        pm.collectionVariables.set('REFRESH_TOKEN', json.refresh_token);",
                      "        console.log('✅ Refresh token saved!');",
                      "    }",
                      "    console.log('✅ Access Token saved! Expires in:', json.expires_in, 'seconds');",
                      "    console.log('Session max age:', json.refresh_expires_in, 'seconds');",
                      "} else {",
                      "    console.log('❌ Token exchange failed:', pm.response.code);",
                      "    console.log(pm.response.text());",
                      "}"
                    ]
                  }
                }
              ],
              "request": {
                "auth": {
                  "type": "basic",
                  "basic": [
                    {
                      "key": "username",
                      "value": "{{CLIENT_ID}}",
                      "type": "string"
                    },
                    {
                      "key": "password",
                      "value": "{{CLIENT_SECRET}}",
                      "type": "string"
                    }
                  ]
                },
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/x-www-form-urlencoded"
                  }
                ],
                "body": {
                  "mode": "urlencoded",
                  "urlencoded": [
                    {
                      "key": "grant_type",
                      "value": "authorization_code",
                      "description": "Authorization Code grant type"
                    },
                    {
                      "key": "code",
                      "value": "{{AUTHORIZATION_CODE}}",
                      "description": "The code received from step 1.3.1 (from redirect URL)"
                    },
                    {
                      "key": "redirect_uri",
                      "value": "{{REDIRECT_URI}}",
                      "description": "Same redirect_uri used in step 1.3.1"
                    }
                  ]
                },
                "url": {
                  "raw": "https://account.bog.ge/auth/realms/bog/protocol/openid-connect/token",
                  "protocol": "https",
                  "host": [
                    "account",
                    "bog",
                    "ge"
                  ],
                  "path": [
                    "auth",
                    "realms",
                    "bog",
                    "protocol",
                    "openid-connect",
                    "token"
                  ]
                },
                "description": "🔐 Authorization Code Flow - Step 2: exchange code → access_token.\n\n📋 How to use:\n1. Copy the code from step 1.3.1's redirect URL\n2. Paste into {{AUTHORIZATION_CODE}} collection variable\n3. Run this request\n4. Test script automatically saves ACCESS_TOKEN + REFRESH_TOKEN\n\n📤 Response fields:\n- access_token - use for all API calls\n- refresh_token - use to renew access without re-login\n- expires_in - access token validity in seconds\n- refresh_expires_in - session max age\n- not-before-policy - security policy timestamp\n- scope - corp\n\n⚠️ The code is single-use - it cannot be exchanged again!"
              },
              "response": []
            },
            {
              "name": "1.3.3 [AuthCode] Refresh Token",
              "event": [
                {
                  "listen": "test",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "if (pm.response.code === 200) {",
                      "    const json = pm.response.json();",
                      "    pm.collectionVariables.set('ACCESS_TOKEN', json.access_token);",
                      "    if (json.refresh_token) {",
                      "        pm.collectionVariables.set('REFRESH_TOKEN', json.refresh_token);",
                      "    }",
                      "    console.log('✅ Token refreshed! Expires in:', json.expires_in, 'seconds');",
                      "} else {",
                      "    console.log('❌ Refresh failed:', pm.response.code, pm.response.text());",
                      "}"
                    ]
                  }
                }
              ],
              "request": {
                "auth": {
                  "type": "basic",
                  "basic": [
                    {
                      "key": "username",
                      "value": "{{CLIENT_ID}}",
                      "type": "string"
                    },
                    {
                      "key": "password",
                      "value": "{{CLIENT_SECRET}}",
                      "type": "string"
                    }
                  ]
                },
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/x-www-form-urlencoded"
                  }
                ],
                "body": {
                  "mode": "urlencoded",
                  "urlencoded": [
                    {
                      "key": "grant_type",
                      "value": "refresh_token",
                      "description": "Refresh Token grant"
                    },
                    {
                      "key": "refresh_token",
                      "value": "{{REFRESH_TOKEN}}",
                      "description": "Refresh token saved from step 1.3.2"
                    }
                  ]
                },
                "url": {
                  "raw": "https://account.bog.ge/auth/realms/bog/protocol/openid-connect/token",
                  "protocol": "https",
                  "host": [
                    "account",
                    "bog",
                    "ge"
                  ],
                  "path": [
                    "auth",
                    "realms",
                    "bog",
                    "protocol",
                    "openid-connect",
                    "token"
                  ]
                },
                "description": "Renew access_token using the refresh_token - without requiring the user to log in again.\n\nTest script automatically saves the updated ACCESS_TOKEN."
              },
              "response": []
            }
          ],
          "description": "Authorization Code Flow (response_type=code)\n\nUse for: Web applications. Most secure OAuth 2.0 flow.\nRequires: client_id, client_secret, redirect_uri.\n\n2-step process:\n1. Authorization URL → receive code\n2. code + Basic Auth → access_token + refresh_token"
        }
      ],
      "description": "BOG Business Online API - 3 authentication methods:\n\n1. Client Credentials - server-to-server (client_id + secret)\n2. Implicit Flow - Desktop apps (token directly in URL)\n3. Authorization Code - Web apps (code → token, most secure)"
    },
    {
      "name": "2. Accounts",
      "item": [
        {
          "name": "2.1 Get Account Balance - GEL",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{BASE_URL}}/accounts/{{ACCOUNT_IBAN}}/GEL",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "accounts",
                "{{ACCOUNT_IBAN}}",
                "GEL"
              ]
            },
            "description": "Current and available balance in GEL.\n\n📤 Response:\n- AvailableBalance - available balance (accounts for blocked operations)\n- CurrentBalance - current balance (excludes blocked operations)"
          },
          "response": []
        },
        {
          "name": "2.2 Get Account Balance - USD",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{BASE_URL}}/accounts/{{ACCOUNT_IBAN}}/USD",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "accounts",
                "{{ACCOUNT_IBAN}}",
                "USD"
              ]
            },
            "description": "Account balance in USD."
          },
          "response": []
        },
        {
          "name": "2.3 Get Account Balance - EUR",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{BASE_URL}}/accounts/{{ACCOUNT_IBAN}}/EUR",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "accounts",
                "{{ACCOUNT_IBAN}}",
                "EUR"
              ]
            },
            "description": "Account balance in EUR."
          },
          "response": []
        }
      ],
      "description": "GET api/accounts/{accountNumber}/{currency}\n\nCurrency in ISO 4217 format: GEL, USD, EUR..."
    },
    {
      "name": "3. Currency Rates",
      "item": [
        {
          "name": "3.1 NBG Rate - USD",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{BASE_URL}}/rates/nbg/USD",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "rates",
                "nbg",
                "USD"
              ]
            },
            "description": "Current National Bank of Georgia (NBG) rate for USD against GEL."
          },
          "response": []
        },
        {
          "name": "3.2 NBG Rate - EUR",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{BASE_URL}}/rates/nbg/EUR",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "rates",
                "nbg",
                "EUR"
              ]
            },
            "description": "Current NBG rate for EUR against GEL."
          },
          "response": []
        },
        {
          "name": "3.3 NBG Rate History - USD",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{BASE_URL}}/rates/nbg/USD/2026-01-01/{{TODAY_DATE}}",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "rates",
                "nbg",
                "USD",
                "2026-01-01",
                "{{TODAY_DATE}}"
              ]
            },
            "description": "Historical NBG exchange rates for USD."
          },
          "response": []
        },
        {
          "name": "3.4 Commercial Rate - USD",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{BASE_URL}}/rates/commercial/USD",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "rates",
                "commercial",
                "USD"
              ]
            },
            "description": "BOG commercial rate for USD."
          },
          "response": []
        },
        {
          "name": "3.5 Cross Rate - USD → EUR",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{BASE_URL}}/rates/commercial/USD/EUR",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "rates",
                "commercial",
                "USD",
                "EUR"
              ]
            },
            "description": "Cross rate: USD to EUR.\nGET api/rates/commercial/{sellCurrency}/{buyCurrency}"
          },
          "response": []
        },
        {
          "name": "3.6 Rate Details (v2) - USD",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{BASE_URL}}/v2/rates/USD",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "v2",
                "rates",
                "USD"
              ]
            },
            "description": "🔐 Requires authorization (Bearer token).\n\nGET api/v2/rates/{currency}\n\nReturns the full set of rates for the given currency against GEL in a single response:\n- nbgRate - National Bank of Georgia official rate\n- standardBuyRate / standardSellRate - standard commercial buy/sell rate\n- digitalBuyRate / digitalSellRate - digital-channel buy/sell rate\n\nThe digital rate is client-specific: if the authenticated client has a special rate, their special rate is returned; otherwise the regular digital-channel rate is returned."
          },
          "response": []
        },
        {
          "name": "3.7 Cross Rate (v2) - USD → EUR",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{BASE_URL}}/v2/crossrates/USD/EUR",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "v2",
                "crossrates",
                "USD",
                "EUR"
              ]
            },
            "description": "🔐 Requires authorization (Bearer token).\n\nGET api/v2/crossrates/{sellCurrency}/{buyCurrency}\n\nReturns the digital-channel cross rate of the sell currency against the buy currency:\n- rate - cross rate\n- baseCcy - base currency against which the rate is expressed"
          },
          "response": []
        }
      ],
      "description": "Exchange rates:\n- GET api/rates/nbg/{currency} - NBG official rate\n- GET api/rates/nbg/{currency}/hist - NBG rate history\n- GET api/rates/commercial/{currency} - BOG commercial rate\n- GET api/rates/commercial/{sell}/{buy} - Cross rate\n- GET api/v2/rates/{currency} - Rate details (NBG + standard + digital), requires auth\n- GET api/v2/crossrates/{sell}/{buy} - Digital-channel cross rate with base currency, requires auth\n\n⚠️ Rate limit: 1 request per minute per method. Exceeding it returns 429 Too Many Requests with a Retry-After header (in seconds)."
    },
    {
      "name": "4. Individual Documents",
      "item": [
        {
          "name": "4.1 Create Domestic Payment (GEL)",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (pm.response.code === 200) {",
                  "    const json = pm.response.json();",
                  "    if (json && json.length > 0) {",
                  "        pm.collectionVariables.set('LAST_DOCUMENT_KEY', json[0].UniqueKey);",
                  "        pm.collectionVariables.set('LAST_UNIQUE_ID', json[0].UniqueId);",
                  "        console.log('✅ Document created!');",
                  "        console.log('UniqueKey (BOG ID):', json[0].UniqueKey);",
                  "        console.log('ResultCode:', json[0].ResultCode);",
                  "        console.log('Name match %:', json[0].Match);",
                  "    }",
                  "} else {",
                  "    console.log('❌ Error:', pm.response.code, pm.response.text());",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "[\n  {\n    \"Nomination\": \"Test transfer - BOG API\",\n    \"UniqueId\": \"{{$guid}}\",\n    \"Amount\": 1.0,\n    \"DocumentNo\": \"TEST-001\",\n    \"ValueDate\": \"{{TODAY_DATE}}\",\n    \"SourceAccountNumber\": \"{{ACCOUNT_IBAN}}\",\n    \"BeneficiaryAccountNumber\": \"{{BENEFICIARY_IBAN}}\",\n    \"BeneficiaryBankCode\": \"{{BENEFICIARY_BANK_CODE}}\",\n    \"BeneficiaryInn\": \"{{BENEFICIARY_INN}}\",\n    \"BeneficiaryName\": \"Test Beneficiary\",\n    \"CheckInn\": false,\n    \"IsSalary\": false,\n    \"DispatchType\": \"MT103\"\n  }\n]",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{BASE_URL}}/documents/domestic",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "documents",
                "domestic"
              ]
            },
            "description": "POST api/documents/domestic\n\nSend as an array - one or more documents per request.\n\n⭐ Required fields:\n- Nomination - transfer purpose (max 250 chars)\n- UniqueId - your system's GUID ({{$guid}} = auto-generated)\n- Amount, Currency, DocumentNo, ValueDate\n- SourceAccountNumber - IBAN format\n- BeneficiaryAccountNumber - IBAN format\n- BeneficiaryBankCode - RTGS code (BOG: BAGAGE22)\n- BeneficiaryInn - personal ID or tax code\n\nDispatchType:\n- MT103 - individual transfer\n- BULK - standard (only for ≤10,000 GEL)\n\n📤 Response: UniqueKey, ResultCode, Match%\nTest script auto-saves UniqueKey for status checks."
          },
          "response": []
        },
        {
          "name": "4.1a Create Domestic Payment with Attachment (GEL)",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (pm.response.code === 200) {",
                  "    const json = pm.response.json();",
                  "    if (json && json.length > 0) {",
                  "        pm.collectionVariables.set('LAST_DOCUMENT_KEY', json[0].UniqueKey);",
                  "        pm.collectionVariables.set('LAST_UNIQUE_ID', json[0].UniqueId);",
                  "        console.log('✅ Document created (with attachment)!');",
                  "        console.log('UniqueKey (BOG ID):', json[0].UniqueKey);",
                  "        console.log('ResultCode:', json[0].ResultCode);",
                  "        console.log('Name match %:', json[0].Match);",
                  "    }",
                  "} else {",
                  "    console.log('❌ Error:', pm.response.code, pm.response.text());",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "[\n  {\n    \"Nomination\": \"Test transfer with attachment - BOG API\",\n    \"UniqueId\": \"{{$guid}}\",\n    \"Amount\": 1.0,\n    \"DocumentNo\": \"TEST-ATT-001\",\n    \"ValueDate\": \"{{TODAY_DATE}}\",\n    \"SourceAccountNumber\": \"{{ACCOUNT_IBAN}}\",\n    \"BeneficiaryAccountNumber\": \"{{BENEFICIARY_IBAN}}\",\n    \"BeneficiaryBankCode\": \"{{BENEFICIARY_BANK_CODE}}\",\n    \"BeneficiaryInn\": \"{{BENEFICIARY_INN}}\",\n    \"BeneficiaryName\": \"Test Beneficiary\",\n    \"CheckInn\": false,\n    \"IsSalary\": false,\n    \"DispatchType\": \"MT103\",\n    \"AttachmentIds\": [\"{{LAST_FILE_HASH}}\"]\n  }\n]",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{BASE_URL}}/documents/domestic",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "documents",
                "domestic"
              ]
            },
            "description": "POST api/documents/domestic — with attachment.\n\nSame as 4.1 but with the AttachmentIds field.\n\n📎 AttachmentIds - list of attachment hashes. Each hash comes from the item 10 (File Upload) endpoint response and is stored in the LAST_FILE_HASH variable.\n\n▶️ Run order: first item 10.1 (File Upload), then this request."
          },
          "response": []
        },
        {
          "name": "4.2 Create Foreign Currency Payment (USD)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "[\n  {\n    \"PaymentDetail\": \"Foreign currency test transfer\",\n    \"UniqueId\": \"{{$guid}}\",\n    \"Amount\": 100.00,\n    \"Currency\": \"USD\",\n    \"DocumentNo\": \"FTEST-001\",\n    \"ValueDate\": \"{{TODAY_DATE}}\",\n    \"SourceAccountNumber\": \"{{ACCOUNT_IBAN}}\",\n    \"CommissionAccountNumber\": \"{{COMMISSION_IBAN}}\",\n    \"BeneficiaryAccountNumber\": \"{{BENEFICIARY_IBAN}}\",\n    \"BeneficiaryBankCode\": \"{{BENEFICIARY_BANK_CODE}}\",\n    \"BeneficiaryInn\": \"{{BENEFICIARY_INN}}\",\n    \"BeneficiaryName\": \"Test Beneficiary\"\n  }\n]",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{BASE_URL}}/documents/foreign",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "documents",
                "foreign"
              ]
            },
            "description": "POST api/documents/foreign\n\nIndividual transfer in USD/EUR/..."
          },
          "response": []
        },
        {
          "name": "4.2a Create Foreign Currency Payment with Attachment (USD)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "[\n  {\n    \"PaymentDetail\": \"Foreign currency transfer with attachment\",\n    \"UniqueId\": \"{{$guid}}\",\n    \"Amount\": 100.00,\n    \"Currency\": \"USD\",\n    \"DocumentNo\": \"FTEST-ATT-001\",\n    \"ValueDate\": \"{{TODAY_DATE}}\",\n    \"SourceAccountNumber\": \"{{ACCOUNT_IBAN}}\",\n    \"CommissionAccountNumber\": \"{{COMMISSION_IBAN}}\",\n    \"BeneficiaryAccountNumber\": \"{{BENEFICIARY_IBAN}}\",\n    \"BeneficiaryBankCode\": \"{{BENEFICIARY_BANK_CODE}}\",\n    \"BeneficiaryInn\": \"{{BENEFICIARY_INN}}\",\n    \"BeneficiaryName\": \"Test Beneficiary\",\n    \"AttachmentIds\": [\"{{LAST_FILE_HASH}}\"]\n  }\n]",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{BASE_URL}}/documents/foreign",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "documents",
                "foreign"
              ]
            },
            "description": "POST api/documents/foreign — with attachment.\n\nSame as 4.2 but with the AttachmentIds field.\n\n📎 AttachmentIds - list of attachment hashes. Each hash comes from the item 10 (File Upload) endpoint response and is stored in the LAST_FILE_HASH variable.\n\n▶️ Run order: first item 10.1 (File Upload), then this request."
          },
          "response": []
        },
        {
          "name": "4.3 Create Conversion",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "[\n  {\n    \"UniqueId\": \"{{$guid}}\",\n    \"DocumentNo\": \"CONV-001\",\n    \"SourceAccountNumber\": \"{{ACCOUNT_IBAN}}\",\n    \"SourceCurrency\": \"USD\",\n    \"DestinationAccountNumber\": \"{{ACCOUNT_IBAN}}\",\n    \"DestinationCurrency\": \"GEL\",\n    \"Amount\": 100.0,\n    \"Rate\": 0.0,\n    \"AdditionalInfo\": \"\",\n    \"CheckUniqueId\": true\n  }\n]",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{BASE_URL}}/documents/conversion",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "documents",
                "conversion"
              ]
            },
            "description": "POST api/documents/conversion\n\nCurrency conversion between accounts.\nSellCurrency → BuyCurrency."
          },
          "response": []
        },
        {
          "name": "4.4 Get Document Status (by UniqueKey)",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{BASE_URL}}/documents/status/{{LAST_DOCUMENT_KEY}}",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "documents",
                "status",
                "{{LAST_DOCUMENT_KEY}}"
              ]
            },
            "description": "GET api/documents/status/{key}\n\n{{LAST_DOCUMENT_KEY}} is auto-populated after request 4.1.\n\n📤 Response:\n- Status - document status\n- RejectCode - rejection code (if applicable)\n- ResultCode - operation result code\n- Match - beneficiary name match percentage %"
          },
          "response": []
        },
        {
          "name": "4.5 Get Multiple Document Statuses",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{BASE_URL}}/documents/statuses/{{LAST_DOCUMENT_KEY}}",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "documents",
                "statuses",
                "{{LAST_DOCUMENT_KEY}}"
              ]
            },
            "description": "GET api/documents/statuses\n\nCheck status of multiple documents in one request.\nSeparate UniqueKeys with commas in the keys parameter."
          },
          "response": []
        },
        {
          "name": "4.6 Delete Individual Document",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{BASE_URL}}/documents/{{LAST_DOCUMENT_KEY}}",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "documents",
                "{{LAST_DOCUMENT_KEY}}"
              ]
            },
            "description": "DELETE api/documents/{key}\n\nCancel an individual document.\n\n⚠️ Only documents in a cancellable status can be deleted."
          },
          "response": []
        },
        {
          "name": "4.7 Get Today's Activities",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{BASE_URL}}/documents/todayactivities/{{ACCOUNT_IBAN}}/{{STATEMENT_CURRENCY}}",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "documents",
                "todayactivities",
                "{{ACCOUNT_IBAN}}",
                "{{STATEMENT_CURRENCY}}"
              ]
            },
            "description": "GET api/documents/todayactivities\n\nAll operations for the current day.\n\n⚠️ Rate limit: 800 requests per day per account+currency. Exceeding it returns 429 Too Many Requests with a Retry-After header (in seconds)."
          },
          "response": []
        }
      ],
      "description": "Individual payment documents:\n- POST api/documents/domestic - GEL\n- POST api/documents/foreign - USD/EUR/...\n- POST api/documents/conversion\n- GET api/documents/status/{key}\n- GET api/documents/statuses\n- DELETE api/documents/{key}"
    },
    {
      "name": "5. Bulk Payments",
      "item": [
        {
          "name": "5.1 Create Bulk Domestic Payment (GEL)",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (pm.response.code === 200) {",
                  "    const bulkKey = pm.response.json();",
                  "    if (bulkKey) {",
                  "        pm.collectionVariables.set('LAST_BULK_KEY', bulkKey);",
                  "        console.log('✅ Bulk document created! UniqueKey:', bulkKey);",
                  "    }",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "[\n  {\n    \"Nomination\": \"Salary - Employee 1\",\n    \"UniqueId\": \"{{$guid}}\",\n    \"Amount\": 500.00,\n    \"DocumentNo\": \"BULK-001\",\n    \"ValueDate\": \"{{TODAY_DATE}}\",\n    \"SourceAccountNumber\": \"{{ACCOUNT_IBAN}}\",\n    \"BeneficiaryAccountNumber\": \"{{BENEFICIARY_IBAN}}\",\n    \"BeneficiaryBankCode\": \"{{BENEFICIARY_BANK_CODE}}\",\n    \"BeneficiaryInn\": \"{{BENEFICIARY_INN}}\",\n    \"BeneficiaryName\": \"First Last\",\n    \"IsSalary\": true,\n    \"DispatchType\": \"MT103\"\n  },\n  {\n    \"Nomination\": \"Salary - Employee 2\",\n    \"UniqueId\": \"{{$guid}}\",\n    \"Amount\": 700.00,\n    \"DocumentNo\": \"BULK-002\",\n    \"ValueDate\": \"{{TODAY_DATE}}\",\n    \"SourceAccountNumber\": \"{{ACCOUNT_IBAN}}\",\n    \"BeneficiaryAccountNumber\": \"GE00BG0000000000000002\",\n    \"BeneficiaryBankCode\": \"BAGAGE22\",\n    \"BeneficiaryInn\": \"99999999999\",\n    \"BeneficiaryName\": \"Another Employee\",\n    \"IsSalary\": true,\n    \"DispatchType\": \"MT103\"\n  }\n]",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{BASE_URL}}/documents/bulk/domestic?fileName=BULK-GEL-001",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "documents",
                "bulk",
                "domestic"
              ],
              "query": [
                {
                  "key": "fileName",
                  "value": "BULK-GEL-001",
                  "description": "Package name"
                }
              ]
            },
            "description": "POST api/documents/bulk/domestic?fileName={fileName}\n\n⚠️ Structure: flat array - no wrapper object, no nested Payments[]!\nEach item has its own UniqueId, DocumentNo, ValueDate, SourceAccountNumber.\n\n📤 Response: plain integer - the package UniqueKey (e.g. 12345)\nTest script auto-saves it."
          },
          "response": []
        },
        {
          "name": "5.2 Create Bulk Foreign Currency Payment",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "[\n  {\n    \"PaymentDetail\": \"Foreign bulk payment 1\",\n    \"UniqueId\": \"{{$guid}}\",\n    \"Amount\": 200.00,\n    \"Currency\": \"USD\",\n    \"DocumentNo\": \"BULKF-001\",\n    \"ValueDate\": \"{{TODAY_DATE}}\",\n    \"SourceAccountNumber\": \"{{ACCOUNT_IBAN}}\",\n    \"CommissionAccountNumber\": \"{{COMMISSION_IBAN}}\",\n    \"BeneficiaryAccountNumber\": \"{{BENEFICIARY_IBAN}}\",\n    \"BeneficiaryBankCode\": \"{{BENEFICIARY_BANK_CODE}}\",\n    \"BeneficiaryInn\": \"{{BENEFICIARY_INN}}\",\n    \"BeneficiaryName\": \"Beneficiary Name\",\n    \"Charges\": \"SHA\"\n  }\n]",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{BASE_URL}}/documents/bulk/foreign?fileName=BULK-USD-001",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "documents",
                "bulk",
                "foreign"
              ],
              "query": [
                {
                  "key": "fileName",
                  "value": "BULK-USD-001"
                }
              ]
            },
            "description": "POST api/documents/bulk/foreign?fileName={fileName}\n\nFlat array structure - same as bulk/domestic."
          },
          "response": []
        },
        {
          "name": "5.3 Get Bulk Payment Status",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{BASE_URL}}/documents/bulk/status/{{LAST_BULK_KEY}}",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "documents",
                "bulk",
                "status",
                "{{LAST_BULK_KEY}}"
              ]
            },
            "description": "GET api/documents/bulk-status/{key}\n\n{{LAST_BULK_KEY}} is auto-populated after request 5.1.\n\nBulkLineStatus field contains status of individual lines within the package."
          },
          "response": []
        },
        {
          "name": "5.4 Cancel Bulk Payment",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{BASE_URL}}/documents/bulk/{{LAST_BULK_KEY}}",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "documents",
                "bulk",
                "{{LAST_BULK_KEY}}"
              ]
            },
            "description": "DELETE api/documents/bulk/{key}\n\n⚠️ Only bulk documents in a cancellable status can be deleted."
          },
          "response": []
        }
      ],
      "description": "Bulk/Mass payments:\n- POST api/documents/bulk-domestic\n- POST api/documents/bulk-foreign\n- GET api/documents/bulk-status/{key}\n- DELETE api/documents/bulk/{key}"
    },
    {
      "name": "6. Statement",
      "item": [
        {
          "name": "6.1 [V1 - DEPRECATED] Get Statement",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{BASE_URL}}/statement/{{STATEMENT_ACCOUNT}}/{{STATEMENT_CURRENCY}}/2026-01-01/2026-03-13",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "statement",
                "{{STATEMENT_ACCOUNT}}",
                "{{STATEMENT_CURRENCY}}",
                "2026-01-01",
                "2026-03-13"
              ]
            },
            "description": "⛔ DEPRECATED - this endpoint is no longer supported!\nUse request 6.4 [V2] instead.\n\nGET api/statement/{accountNumber}/{currency}/{startDate}/{endDate}\n\n⚠️ Parameters are path segments (not query string):\n- accountNumber - IBAN (e.g. GE03BG0000000584759824)\n- currency - separate field (GEL, USD, EUR - must NOT be embedded in the IBAN)\n- startDate / endDate - YYYY-MM-DD"
          },
          "response": []
        },
        {
          "name": "6.2 Get Today's Activities (New)",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{BASE_URL}}/documents/todayactivities/{{STATEMENT_ACCOUNT}}/{{STATEMENT_CURRENCY}}",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "documents",
                "todayactivities",
                "{{STATEMENT_ACCOUNT}}",
                "{{STATEMENT_CURRENCY}}"
              ]
            },
            "description": "GET api/statement/todayactivities\n\nCurrent day's statement (Statement New endpoint).\n\n⚠️ Rate limit: 800 requests per day per account+currency. Exceeding it returns 429 Too Many Requests with a Retry-After header (in seconds)."
          },
          "response": []
        },
        {
          "name": "6.3 [V1 - DEPRECATED] Get Statement Summary",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{BASE_URL}}/statement/summary/{{STATEMENT_ACCOUNT}}/{{STATEMENT_CURRENCY}}/{{STATEMENT_V2_ID}}",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "statement",
                "summary",
                "{{STATEMENT_ACCOUNT}}",
                "{{STATEMENT_CURRENCY}}",
                "{{STATEMENT_V2_ID}}"
              ]
            },
            "description": "⛔ DEPRECATED - use request 6.6 [V2] Summary instead.\n\nGET api/statement/summary/{accountNumber}/{currency}/{startDate}/{endDate}"
          },
          "response": []
        },
        {
          "name": "── Statement V2 ──",
          "item": [
            {
              "name": "6.4 [V2] Get Statement by Period",
              "event": [
                {
                  "listen": "test",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "if (pm.response.code === 200) {",
                      "    const json = pm.response.json();",
                      "    if (json && json.Id) {",
                      "        pm.collectionVariables.set('STATEMENT_V2_ID', json.Id);",
                      "        console.log('✅ Statement V2 received!');",
                      "        console.log('Id (for pagination):', json.Id);",
                      "        console.log('Total record count:', json.Count);",
                      "        if (json.Count > 1000) {",
                      "            console.log('⚠️ Over 1000 records! Use request 6.5 for pagination.');",
                      "        }",
                      "    }",
                      "}"
                    ]
                  }
                }
              ],
              "request": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{BASE_URL}}/v2/statement/{{ACCOUNT_IBAN}}/{{STATEMENT_CURRENCY}}/2026-01-01/2026-03-13",
                  "host": [
                    "{{BASE_URL}}"
                  ],
                  "path": [
                    "v2",
                    "statement",
                    "{{ACCOUNT_IBAN}}",
                    "{{STATEMENT_CURRENCY}}",
                    "2026-01-01",
                    "2026-03-13"
                  ]
                },
                "description": "GET api/v2/statement/{accountNumber}/{currency}/{startDate}/{endDate}\n\nRicher response than V1 - includes full SenderDetails and BeneficiaryDetails objects.\n\n⭐ Required parameters:\n- accountNumber - IBAN\n- currency - ISO 4217 (GEL, USD, EUR)\n- startDate - YYYY-MM-DD format\n- endDate - YYYY-MM-DD format\n\n📤 Response:\n- Id - statement ID (required for pagination!)\n- Count - total number of records\n- Records[] - transaction list\n  ├ EntryDate, EntryAmount, EntryAmountDebit/Credit\n  ├ SenderDetails: Name, Inn, AccountNumber, BankCode, BankName\n  ├ BeneficiaryDetails: Name, Inn, AccountNumber, BankCode, BankName\n  ├ DocumentNomination, DocumentRate\n  └ DocumentKey, EntryId\n\n⚠️ Max 1000 records per request.\nIf Count > 1000 → use request 6.5 with pagination!\n\nTest script auto-saves Id for use in the pagination request."
              },
              "response": []
            },
            {
              "name": "6.5 [V2] Pagination - Get Next Page",
              "request": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{BASE_URL}}/v2/statement/{{ACCOUNT_IBAN}}/{{STATEMENT_CURRENCY}}/{{STATEMENT_V2_ID}}/2",
                  "host": [
                    "{{BASE_URL}}"
                  ],
                  "path": [
                    "v2",
                    "statement",
                    "{{ACCOUNT_IBAN}}",
                    "{{STATEMENT_CURRENCY}}",
                    "{{STATEMENT_V2_ID}}",
                    "2"
                  ]
                },
                "description": "GET api/v2/statement/{accountNumber}/{currency}/{id}/{page}\n\nUsed when a period contains more than 1,000 records.\n\n{{STATEMENT_V2_ID}} is auto-populated after request 6.4.\n\n⭐ Required parameters:\n- id - the Id returned from request 6.4\n- page - page number (starts at 2; page 1 is the 6.4 response itself)\n\n⚠️ Important: pages must be fetched sequentially!\nYou cannot skip pages - after page 3 you must fetch page 4, not page 6.\n\n📤 Response: array of transaction records (same structure as Records[] in 6.4)"
              },
              "response": []
            },
            {
              "name": "6.6 [V2] Summary - Global and Daily Balances",
              "request": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{BASE_URL}}/v2/statement/summary/{{ACCOUNT_IBAN}}/{{STATEMENT_CURRENCY}}/2026-01-01/2026-03-13",
                  "host": [
                    "{{BASE_URL}}"
                  ],
                  "path": [
                    "v2",
                    "statement",
                    "summary",
                    "{{ACCOUNT_IBAN}}",
                    "{{STATEMENT_CURRENCY}}",
                    "2026-01-01",
                    "2026-03-13"
                  ]
                },
                "description": "GET api/v2/statement/summary/{accountNumber}/{currency}/{startDate}/{endDate}\n\nV2 global and daily balance summary.\nMore detailed than the V1 summary endpoint."
              },
              "response": []
            },
            {
              "name": "6.7 [V2] Get Statement with Revaluation",
              "event": [
                {
                  "listen": "test",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "if (pm.response.code === 200) {",
                      "    const json = pm.response.json();",
                      "    if (json && json.Id) {",
                      "        pm.collectionVariables.set('STATEMENT_V2_ID', json.Id);",
                      "        console.log('✅ Statement with revaluation received!');",
                      "        console.log('Id (for pagination):', json.Id);",
                      "        console.log('Total record count:', json.Count);",
                      "    }",
                      "}"
                    ]
                  }
                }
              ],
              "request": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{BASE_URL}}/v2/statement/{{ACCOUNT_IBAN}}/{{STATEMENT_CURRENCY}}/2026-01-01/2026-03-13/false/true?take=1000&revaluation=true",
                  "host": [
                    "{{BASE_URL}}"
                  ],
                  "path": [
                    "v2",
                    "statement",
                    "{{ACCOUNT_IBAN}}",
                    "{{STATEMENT_CURRENCY}}",
                    "2026-01-01",
                    "2026-03-13",
                    "false",
                    "true"
                  ],
                  "query": [
                    {
                      "key": "take",
                      "value": "1000",
                      "description": "Record limit (int, optional)"
                    },
                    {
                      "key": "revaluation",
                      "value": "true",
                      "description": "Include revaluation records (bool, optional)"
                    }
                  ]
                },
                "description": "GET api/v2/statement/{accountNumber}/{currency}/{startDate}/{endDate}/{includeToday}/{orderByDate}?take={take}&revaluation={revaluation}\n\nStatement including revaluation records — revaluation=true.\n\n✅ take and revaluation are now query string parameters (no longer positional path parameters). They can be supplied independently, without the preceding optional path parameters.\n- includeToday (bool, path) — include today's operations (here: false)\n- orderByDate (bool, path) — order by date (here: true)\n- take (int, query) — record limit (here: 1000)\n- revaluation (bool, query) — include revaluation records (here: true)\n\n⭐ Required parameters:\n- accountNumber - IBAN\n- currency - ISO 4217 (GEL, USD, EUR)\n- startDate / endDate - YYYY-MM-DD\n\n📤 Response: identical structure to 6.4 (Id, Count, Records[]), additionally including revaluation records.\n\nTest script saves Id for the pagination request."
              },
              "response": []
            }
          ],
          "description": "Statement V2 (part of 'Statement New' section):\n\n- GET api/v2/statement/{account}/{currency}/{startDate}/{endDate}\n- GET api/v2/statement/{account}/{currency}/{id}/{page} - Pagination\n- GET api/v2/statement/summary/{account}/{currency}/{startDate}/{endDate}\n\nAdvantages over V1:\n✅ Full SenderDetails + BeneficiaryDetails objects\n✅ Pagination support (Id-based)\n✅ Richer transaction detail fields"
        }
      ],
      "description": "Account statement:\n- GET api/statement (V1)\n- GET api/statement/todayactivities\n- GET api/statement/summary\n- GET api/v2/statement/... (V2 - with pagination support)"
    },
    {
      "name": "7. Money Request",
      "item": [
        {
          "name": "7.1 Create Money Request - Individual (by Phone)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"AccountNumber\": \"{{ACCOUNT_IBAN}}\",\n  \"Currency\": \"{{STATEMENT_CURRENCY}}\",\n  \"Amount\": 10.00,\n  \"IsPhysical\": true,\n  \"PhoneNumber\": \"{{RECIPIENT_PHONE}}\",\n  \"Description\": \"Money request - test\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{BASE_URL}}/moneyrequest/create",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "moneyrequest",
                "create"
              ]
            },
            "description": "POST api/moneyrequest/create\n\nCreate a money request from an individual using their phone number.\n\n⭐ Required fields:\n- AccountNumber - your IBAN (where the funds will be credited)\n- Currency - currency ISO 4217 (GEL, USD, EUR)\n- Amount - requested amount\n- IsPhysical - true (individual)\n- Description - request purpose\n\n📌 Recipient identification (individual):\nExactly one must be provided — PhoneNumber or Pin (personal ID number).\nRecipientIdentifier must be empty.\n\n📤 Response: 201 Created (success)\n⚠️ 400 - validation error or user not found\n⚠️ 403 - you do not have access to the account\n⚠️ 404 - account not found"
          },
          "response": []
        },
        {
          "name": "7.2 Create Money Request - Individual (by Personal ID)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"AccountNumber\": \"{{ACCOUNT_IBAN}}\",\n  \"Currency\": \"{{STATEMENT_CURRENCY}}\",\n  \"Amount\": 25.50,\n  \"IsPhysical\": true,\n  \"Pin\": \"{{RECIPIENT_PIN}}\",\n  \"Description\": \"Money request - test\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{BASE_URL}}/moneyrequest/create",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "moneyrequest",
                "create"
              ]
            },
            "description": "POST api/moneyrequest/create\n\nCreate a money request from an individual using their personal ID number (Pin).\n\n📌 For an individual, exactly one field is filled — Pin or PhoneNumber.\nHere Pin is used; PhoneNumber and RecipientIdentifier are empty."
          },
          "response": []
        },
        {
          "name": "7.3 Create Money Request - Legal Entity",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"AccountNumber\": \"{{ACCOUNT_IBAN}}\",\n  \"Currency\": \"{{STATEMENT_CURRENCY}}\",\n  \"Amount\": 1000.00,\n  \"IsPhysical\": false,\n  \"RecipientIdentifier\": \"{{RECIPIENT_IDENTIFIER}}\",\n  \"Description\": \"Money request - test\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{BASE_URL}}/moneyrequest/create",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "moneyrequest",
                "create"
              ]
            },
            "description": "POST api/moneyrequest/create\n\nCreate a money request from a legal entity.\n\n📌 For a legal entity (IsPhysical=false):\nRecipientIdentifier is required (identification code).\nPin and PhoneNumber must be empty."
          },
          "response": []
        }
      ],
      "description": "Money request:\n- POST api/moneyrequest/create\n\nThe request is sent to the recipient, who confirms the transfer.\n\n📌 By recipient type:\n- Individual (IsPhysical=true): exactly one — Pin or PhoneNumber\n- Legal entity (IsPhysical=false): RecipientIdentifier"
    },
    {
      "name": "8. Deposits",
      "item": [
        {
          "name": "8.1 Agreements",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{BASE_URL}}/deposits/agreements",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "deposits",
                "agreements"
              ]
            },
            "description": "GET api/deposits/agreements\n\nList of all of the customer's deposit agreements.\n\n📤 Response: AgreementDto[]\n- Name - deposit name\n- AccountNo - account number\n- Balance - balance\n- Rate - interest rate\n- AgreeNo - agreement number\n- MaturityDate - maturity date\n- StartDate - start date\n- InterestAccrued - accrued interest\n- Ccy - currency\n- DepositType - deposit type\n- NextWithdrawalDate - next withdrawal date\n- InterestWithPeriodType - interest period type\n- AccrualBalance - accrual balance\n- Agreements[] - ranges (Irr, Rate, Balance)"
          },
          "response": []
        },
        {
          "name": "8.2 Available Amount by Currency",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{BASE_URL}}/deposits/available-amount",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "deposits",
                "available-amount"
              ]
            },
            "description": "GET api/deposits/available-amount\n\nAvailable deposit amount grouped by currency.\n\n📤 Response: DepositBalanceByCurrencyDto[]\n- Ccy - currency\n- TotalAvailableAmount - total available amount"
          },
          "response": []
        }
      ],
      "description": "Deposits:\n- GET api/deposits/agreements - list of deposit agreements\n- GET api/deposits/available-amount - available amount by currency"
    },
    {
      "name": "9. Error Handling",
      "item": [
        {
          "name": "7.1 Expired / Invalid Token (401)",
          "request": {
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "invalid.token.here",
                  "type": "string"
                }
              ]
            },
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{BASE_URL}}/accounts/{{ACCOUNT_IBAN}}/GEL",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "accounts",
                "{{ACCOUNT_IBAN}}",
                "GEL"
              ]
            },
            "description": "🔍 401 Unauthorized - invalid or expired token.\n\nOccurs when: token has expired or is malformed.\nFix: run request 1.1.1 to get a new token.\n\nNote: x-correlationid header is still returned!"
          },
          "response": []
        },
        {
          "name": "7.2 Non-existent Document (404)",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{BASE_URL}}/documents/status/9999999",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "documents",
                "status",
                "9999999"
              ]
            },
            "description": "🔍 404 Not Found - non-existent UniqueKey.\n\nWatch for: x-correlationid header is still returned even on 404!"
          },
          "response": []
        },
        {
          "name": "7.3 Invalid IBAN Format (400)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "[\n  {\n    \"Nomination\": \"Test\",\n    \"UniqueId\": \"{{$guid}}\",\n    \"Amount\": 1.0,\n    \"DocumentNo\": \"ERR-001\",\n    \"ValueDate\": \"{{TODAY_DATE}}\",\n    \"SourceAccountNumber\": \"INVALID_IBAN_FORMAT\",\n    \"BeneficiaryAccountNumber\": \"{{BENEFICIARY_IBAN}}\",\n    \"BeneficiaryBankCode\": \"{{BENEFICIARY_BANK_CODE}}\",\n    \"BeneficiaryInn\": \"{{BENEFICIARY_INN}}\"\n  }\n]",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{BASE_URL}}/documents/domestic",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "documents",
                "domestic"
              ]
            },
            "description": "🔍 400 Bad Request - invalid IBAN format.\n\nValid IBAN format: GE11BG1111111111111111GEL\n\nWatch for: ResultCode value and error message detail."
          },
          "response": []
        },
        {
          "name": "7.4 Missing Required Fields (400)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "[\n  {\n    \"Amount\": 1.0\n  }\n]",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{BASE_URL}}/documents/domestic",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "documents",
                "domestic"
              ]
            },
            "description": "🔍 400 Bad Request - missing required fields.\n\nThe error message will specify which fields are missing."
          },
          "response": []
        }
      ],
      "description": "Intentional errors to understand the API's error response format.\n\n⭐ Every response includes x-correlationid - always save this for support tickets!"
    },
    {
      "name": "10. File Upload",
      "item": [
        {
          "name": "10.1 Upload File",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (pm.response.code === 200) {",
                  "    const hash = pm.response.text().replace(/^\"|\"$/g, '');",
                  "    if (hash) {",
                  "        pm.collectionVariables.set('LAST_FILE_HASH', hash);",
                  "        console.log('✅ File uploaded! externalFileHash:', hash);",
                  "    }",
                  "} else {",
                  "    console.log('❌ Upload failed:', pm.response.code, pm.response.text());",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [],
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "file",
                  "type": "file",
                  "src": "",
                  "description": "File to upload (select a file in Postman). Allowed extensions: docx, docm, dotx, dotm, docb, xls, xlsb, xlsm, xlsx, jpg, jpeg, png, ppt, gif, txt, pdf, zip, rar, tar, gzip, ico, dat, csv, xml, enc, svg"
                }
              ]
            },
            "url": {
              "raw": "{{BASE_URL}}/files/upload",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "files",
                "upload"
              ]
            },
            "description": "POST api/files/upload\n\nUpload a file to object storage and save attachment metadata.\n\n⭐ Request:\n- Content-Type: multipart/form-data\n- form-data field: file (select a file)\n\n📌 Allowed extensions:\ndocx, docm, dotx, dotm, docb, xls, xlsb, xlsm, xlsx, jpg, jpeg, png, ppt, gif, txt, pdf, zip, rar, tar, gzip, ico, dat, csv, xml, enc, svg\n\n📤 Response: string — externalFileHash (hash of the uploaded file)\nTest script automatically saves it to the LAST_FILE_HASH variable.\n\n⚠️ 400 - no file provided or extension not allowed\n⚠️ 401 - invalid/expired token\n⚠️ 403 - you do not have file upload permission"
          },
          "response": []
        },
        {
          "name": "10.2 Disallowed Extension (400)",
          "request": {
            "method": "POST",
            "header": [],
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "file",
                  "type": "file",
                  "src": "",
                  "description": "Select a file with a disallowed extension (e.g. .exe) — to see the error response"
                }
              ]
            },
            "url": {
              "raw": "{{BASE_URL}}/files/upload",
              "host": [
                "{{BASE_URL}}"
              ],
              "path": [
                "files",
                "upload"
              ]
            },
            "description": "🔍 400 Bad Request - disallowed file extension.\n\nSelect a file whose extension is not in the allowed list (e.g. .exe).\n\n📤 Response: \"File extension is not allowed\""
          },
          "response": []
        }
      ],
      "description": "File upload:\n- POST api/files/upload\n\nThe file is sent as multipart/form-data (form-data field: file).\nResponse — externalFileHash (string)."
    }
  ],
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{ACCESS_TOKEN}}",
        "type": "string"
      }
    ]
  },
  "event": [
    {
      "listen": "prerequest",
      "script": {
        "type": "text/javascript",
        "exec": [
          "// Auto-set today's date for ValueDate fields",
          "const today = new Date().toISOString().split('T')[0];",
          "pm.collectionVariables.set('TODAY_DATE', today);",
          "console.log('➡️', pm.request.method, pm.request.url.toString());"
        ]
      }
    },
    {
      "listen": "test",
      "script": {
        "type": "text/javascript",
        "exec": [
          "// ===== BOG API - Global Response Logger =====",
          "",
          "// x-correlationid - save this for all support tickets!",
          "const corrId = pm.response.headers.get('x-correlationid');",
          "if (corrId) {",
          "    pm.collectionVariables.set('LAST_CORRELATION_ID', corrId);",
          "    console.log('📋 x-correlationid:', corrId);",
          "}",
          "",
          "const code = pm.response.code;",
          "if (code >= 200 && code < 300) {",
          "    console.log('✅ Status:', code);",
          "} else if (code === 401) {",
          "    console.log('🔑 401 Unauthorized - refresh token via request 1.1.1');",
          "} else if (code === 404) {",
          "    console.log('🔍 404 Not Found');",
          "} else if (code === 429) {",
          "    console.log('⚠️ 429 Rate Limited!');",
          "    const retry = pm.response.headers.get('Retry-After');",
          "    if (retry) console.log('Retry-After:', retry, 'seconds');",
          "} else if (code >= 400) {",
          "    console.log('❌ Error:', code);",
          "    try {",
          "        const json = pm.response.json();",
          "        if (json.ResultCode) console.log('ResultCode:', json.ResultCode);",
          "        if (json.message) console.log('Message:', json.message);",
          "    } catch(e) {}",
          "}",
          "",
          "console.log('⏱️', pm.response.responseTime, 'ms');",
          "console.log('════════════════════════════');"
        ]
      }
    }
  ],
  "variable": [
    {
      "key": "BASE_URL",
      "value": "https://api.businessonline.ge/api",
      "type": "string",
      "description": "BOG Business Online API Base URL"
    },
    {
      "key": "CLIENT_ID",
      "value": "your_client_id_here",
      "type": "string",
      "description": "Client ID from bonline.bog.ge/admin/api/"
    },
    {
      "key": "CLIENT_SECRET",
      "value": "your_client_secret_here",
      "type": "string",
      "description": "Client Secret from bonline.bog.ge/admin/api/ (keep secret!)"
    },
    {
      "key": "REDIRECT_URI",
      "value": "https://your-app.com/callback",
      "type": "string",
      "description": "Your redirect URI (for Implicit & AuthCode flows)"
    },
    {
      "key": "AUTHORIZATION_CODE",
      "value": "",
      "type": "string",
      "description": "Code received from step 1.3.1 (AuthCode Flow)"
    },
    {
      "key": "ACCESS_TOKEN",
      "value": "",
      "type": "string",
      "description": "Auto-saved after requests 1.1.1 or 1.3.2"
    },
    {
      "key": "REFRESH_TOKEN",
      "value": "",
      "type": "string",
      "description": "Auto-saved after request 1.3.2 (AuthCode Flow only)"
    },
    {
      "key": "ACCOUNT_IBAN",
      "value": "GE00BG0000000000000000",
      "type": "string",
      "description": "Your account IBAN (e.g. GE11BG1111111111111111GEL)"
    },
    {
      "key": "COMMISSION_IBAN",
      "value": "GE00BG0000000000000000",
      "type": "string",
      "description": "Account the commission is charged to (optional; defaults to the source account)"
    },
    {
      "key": "BENEFICIARY_IBAN",
      "value": "GE00BG0000000000000001",
      "type": "string",
      "description": "Beneficiary IBAN"
    },
    {
      "key": "BENEFICIARY_BANK_CODE",
      "value": "BAGAGE22",
      "type": "string",
      "description": "Beneficiary bank RTGS code (BOG: BAGAGE22)"
    },
    {
      "key": "BENEFICIARY_INN",
      "value": "00000000000",
      "type": "string",
      "description": "Beneficiary personal ID or tax code"
    },
    {
      "key": "TODAY_DATE",
      "value": "2026-03-20",
      "type": "string",
      "description": "Auto-populated by pre-request script"
    },
    {
      "key": "LAST_DOCUMENT_KEY",
      "value": "",
      "type": "string",
      "description": "UniqueKey of last created document"
    },
    {
      "key": "LAST_BULK_KEY",
      "value": "",
      "type": "string",
      "description": "UniqueKey of last bulk payment"
    },
    {
      "key": "LAST_CORRELATION_ID",
      "value": "",
      "type": "string",
      "description": "Last x-correlationid value (for support)"
    },
    {
      "key": "TOKEN_EXPIRES_IN",
      "value": "",
      "type": "string",
      "description": "Token validity in seconds"
    },
    {
      "key": "STATEMENT_V2_ID",
      "value": "",
      "type": "string",
      "description": "Statement V2 Id from request 6.4 (used for pagination)"
    },
    {
      "key": "STATEMENT_CURRENCY",
      "value": "GEL",
      "type": "string",
      "description": "Statement currency (GEL, USD, EUR) - must NOT be embedded in the IBAN"
    },
    {
      "key": "STATEMENT_ACCOUNT",
      "value": "GE00BG0000000000000000",
      "type": "string",
      "description": "Statement account IBAN (separate from transfer ACCOUNT_IBAN)"
    },
    {
      "key": "RECIPIENT_PHONE",
      "value": "995500000000",
      "type": "string",
      "description": "Phone number of the individual receiving the money request"
    },
    {
      "key": "RECIPIENT_PIN",
      "value": "00000000000",
      "type": "string",
      "description": "Personal ID number of the individual receiving the money request"
    },
    {
      "key": "RECIPIENT_IDENTIFIER",
      "value": "000000000",
      "type": "string",
      "description": "Identification code of the legal entity receiving the money request"
    },
    {
      "key": "LAST_FILE_HASH",
      "value": "",
      "type": "string",
      "description": "externalFileHash of the last uploaded file (from 10.1)"
    }
  ]
}
