{
  "info": {
    "name": "AnyBanQ Pay API",
    "description": "Remittance quotes and orders, payout batches, bills and payment links, verification sessions, and the webhooks they send.\n\nThis document is written by hand and covers only these endpoints. It is not the full API reference.\n\n**Authentication.** Send your API key as `Authorization: Bearer divp_test_…` or `divp_live_…`, from your server only.\n\n**Money.** Remittance amounts are strings of minor units (`\"10000\"` is 100.00). Bills, payment links and payout batches use major units: JSON numbers in responses, and for payout rows a decimal string such as `\"85000.00\"`.\n\n**What is live.** Collection from a Sri Lankan bank account is live on HNB JustPay. Card collection and real payouts are not live, and remittance runs in test mode: orders carry `sandbox: true` and payouts are recorded as `DRY_RUN`.\n\n**A test key makes test records.** A bill, payment link, subscription plan or payout batch made with a `divp_test_` key carries `test: true`. It is sent to nobody, it cannot be paid or funded for real, a test key lists test records only, and a live key or the console lists live ones only. Its webhooks still fire and carry `test: true` in `data`. A remittance order made with a test key is always a sandbox order (`sandbox: true`), or is refused where the sandbox rail is off. A test key works before your account is approved.\n\n**Verification works the same way.** A check run with a test key, or a step of a hosted verification started with one, is a test record marked `test: true`: no provider is contacted, nobody is messaged and nothing is metered. A one-time code comes back in the response as `devCode`, a bank account step accepts `123456`, and the last four digits of the NIC or account number choose the outcome. A test check tells you nothing about a real person.\n\n**Scopes.** A key restricted to scopes can reach only what they cover: `bills` for bills, payment links and subscription plans, `remittance` for remittance, `payouts` for payout batches, `verifications` for verification. A key with no scopes is not narrowed. No key can manage keys, webhooks, the team or settings: that is done in the console.\n\nGuide: https://verifia.anybanq.lk/developers/pay\n\nVersion 0.1.0. Set the collection variable apiKey to your own key; it is empty here on purpose.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{apiKey}}",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://verifia.anybanq.lk",
      "type": "string"
    },
    {
      "key": "apiKey",
      "value": "",
      "type": "string"
    },
    {
      "key": "webhookUrl",
      "value": "http://localhost:3000/hooks/anybanq",
      "type": "string"
    },
    {
      "key": "webhookSecret",
      "value": "",
      "type": "string"
    }
  ],
  "item": [
    {
      "name": "Remittance",
      "description": "Needs the Remittance orders service switched on, and the `remittance` scope on a scoped key (the `verifications` scope no longer covers it). A test key makes sandbox orders only.",
      "item": [
        {
          "name": "Price a transfer",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"sourceCurrency\": \"USD\",\n  \"sendAmountMinor\": \"10000\",\n  \"displayCurrency\": \"GBP\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/remittance/quotes",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "remittance",
                "quotes"
              ]
            },
            "description": "The rate is held until `rateExpiresAt` (five minutes by default). Give `sendAmountMinor` or `receiveAmountMinor`, not both. `sourceCurrency` must be your organisation's charge currency.\n\nOpenAPI operation: createRemittanceQuote"
          },
          "response": [
            {
              "name": "201 The quote.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"sourceCurrency\": \"USD\",\n  \"sendAmountMinor\": \"10000\",\n  \"displayCurrency\": \"GBP\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/remittance/quotes",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "remittance",
                    "quotes"
                  ]
                },
                "description": "The rate is held until `rateExpiresAt` (five minutes by default). Give `sendAmountMinor` or `receiveAmountMinor`, not both. `sourceCurrency` must be your organisation's charge currency.\n\nOpenAPI operation: createRemittanceQuote"
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"7a1e2c54-0b6d-4f1a-9c1e-2f5b8d3a6e10\",\n  \"fixedSide\": \"SEND\",\n  \"send\": {\n    \"amountMinor\": \"10000\",\n    \"currency\": \"USD\"\n  },\n  \"fee\": {\n    \"amountMinor\": \"250\",\n    \"currency\": \"USD\"\n  },\n  \"total\": {\n    \"amountMinor\": \"10250\",\n    \"currency\": \"USD\"\n  },\n  \"receive\": {\n    \"amountMinor\": \"2987500\",\n    \"currency\": \"LKR\"\n  },\n  \"rate\": \"298.75\",\n  \"midRate\": \"301.00\",\n  \"marginBps\": 75,\n  \"feeBps\": 150,\n  \"feeFixedMinor\": \"100\",\n  \"rateSource\": \"ENV\",\n  \"rateDate\": null,\n  \"rateExpiresAt\": \"2026-10-10T08:05:00.000Z\",\n  \"chargeCurrency\": \"USD\",\n  \"indicative\": {\n    \"amountMinor\": \"7810\",\n    \"currency\": \"GBP\",\n    \"estimate\": true\n  },\n  \"payoutTiming\": \"AFTER_SETTLEMENT\",\n  \"createdAt\": \"2026-10-10T08:00:00.000Z\"\n}"
            },
            {
              "name": "400 The request was refused: a field failed validation or a rule was broken.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"sourceCurrency\": \"USD\",\n  \"sendAmountMinor\": \"10000\",\n  \"displayCurrency\": \"GBP\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/remittance/quotes",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "remittance",
                    "quotes"
                  ]
                },
                "description": "The rate is held until `rateExpiresAt` (five minutes by default). Give `sendAmountMinor` or `receiveAmountMinor`, not both. `sourceCurrency` must be your organisation's charge currency.\n\nOpenAPI operation: createRemittanceQuote"
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 400,\n  \"message\": [\n    \"sourceCurrency must be a 3-letter ISO code\"\n  ],\n  \"error\": \"Bad Request\"\n}"
            },
            {
              "name": "401 The API key is missing, wrong, revoked or expired.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"sourceCurrency\": \"USD\",\n  \"sendAmountMinor\": \"10000\",\n  \"displayCurrency\": \"GBP\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/remittance/quotes",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "remittance",
                    "quotes"
                  ]
                },
                "description": "The rate is held until `rateExpiresAt` (five minutes by default). Give `sendAmountMinor` or `receiveAmountMinor`, not both. `sourceCurrency` must be your organisation's charge currency.\n\nOpenAPI operation: createRemittanceQuote"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 401,\n  \"message\": \"Invalid API key\",\n  \"error\": \"Unauthorized\"\n}"
            },
            {
              "name": "403 The key lacks the scope, the service is not enabled for your organisation, or the address is not on your IP whitelist.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"sourceCurrency\": \"USD\",\n  \"sendAmountMinor\": \"10000\",\n  \"displayCurrency\": \"GBP\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/remittance/quotes",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "remittance",
                    "quotes"
                  ]
                },
                "description": "The rate is held until `rateExpiresAt` (five minutes by default). Give `sendAmountMinor` or `receiveAmountMinor`, not both. `sourceCurrency` must be your organisation's charge currency.\n\nOpenAPI operation: createRemittanceQuote"
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 403,\n  \"message\": \"The Remittance orders service is not enabled for your account\",\n  \"error\": \"Forbidden\"\n}"
            }
          ]
        },
        {
          "name": "Make an order from a live quote",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"quoteId\": \"7a1e2c54-0b6d-4f1a-9c1e-2f5b8d3a6e10\",\n  \"externalRef\": \"transfer-1001\",\n  \"payee\": {\n    \"kind\": \"ACCOUNT\",\n    \"bankCode\": \"7083\",\n    \"accountNumber\": \"0000123456789\",\n    \"name\": \"Sample Payee\"\n  },\n  \"sender\": {\n    \"name\": \"Sample Sender\",\n    \"country\": \"GB\",\n    \"dob\": \"1990-04-12\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/remittance/orders",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "remittance",
                "orders"
              ]
            },
            "description": "Idempotent on `externalRef`: a repeat with the same `externalRef` and `quoteId` returns the order made the first time, again with 201. The same `externalRef` with a different quote answers 409. Hand `checkoutToken` to the browser, never the API key.\n\nOpenAPI operation: createRemittanceOrder"
          },
          "response": [
            {
              "name": "201 The order, with its checkout token.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quoteId\": \"7a1e2c54-0b6d-4f1a-9c1e-2f5b8d3a6e10\",\n  \"externalRef\": \"transfer-1001\",\n  \"payee\": {\n    \"kind\": \"ACCOUNT\",\n    \"bankCode\": \"7083\",\n    \"accountNumber\": \"0000123456789\",\n    \"name\": \"Sample Payee\"\n  },\n  \"sender\": {\n    \"name\": \"Sample Sender\",\n    \"country\": \"GB\",\n    \"dob\": \"1990-04-12\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/remittance/orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "remittance",
                    "orders"
                  ]
                },
                "description": "Idempotent on `externalRef`: a repeat with the same `externalRef` and `quoteId` returns the order made the first time, again with 201. The same `externalRef` with a different quote answers 409. Hand `checkoutToken` to the browser, never the API key.\n\nOpenAPI operation: createRemittanceOrder"
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"3f2b8c1e-5d44-4a7e-9a36-0b1c2d3e4f50\",\n  \"externalRef\": \"transfer-1001\",\n  \"quoteId\": \"7a1e2c54-0b6d-4f1a-9c1e-2f5b8d3a6e10\",\n  \"status\": \"AWAITING_PAYMENT\",\n  \"sandbox\": true,\n  \"send\": {\n    \"amountMinor\": \"10000\",\n    \"currency\": \"USD\"\n  },\n  \"fee\": {\n    \"amountMinor\": \"250\",\n    \"currency\": \"USD\"\n  },\n  \"total\": {\n    \"amountMinor\": \"10250\",\n    \"currency\": \"USD\"\n  },\n  \"receive\": {\n    \"amountMinor\": \"2987500\",\n    \"currency\": \"LKR\"\n  },\n  \"rate\": \"298.75\",\n  \"rateExpiresAt\": \"2026-10-10T08:05:00.000Z\",\n  \"indicative\": {\n    \"amountMinor\": \"7810\",\n    \"currency\": \"GBP\",\n    \"estimate\": true\n  },\n  \"payee\": {\n    \"kind\": \"ACCOUNT\",\n    \"displayName\": \"Sample Payee\",\n    \"bankName\": \"Seylan Bank PLC\",\n    \"accountMasked\": \"****6789\",\n    \"bankCode\": \"7083\",\n    \"handle\": null\n  },\n  \"sender\": {\n    \"name\": \"Sample Sender\",\n    \"country\": \"GB\",\n    \"verificationSessionId\": null\n  },\n  \"screening\": {\n    \"status\": \"CLEAR\",\n    \"reviewDecision\": null,\n    \"reviewedAt\": null\n  },\n  \"collection\": {\n    \"rail\": \"MOCK_CARD\",\n    \"mode\": \"redirect\",\n    \"reference\": null\n  },\n  \"payout\": {\n    \"status\": null,\n    \"reference\": null,\n    \"providerRef\": null,\n    \"message\": null,\n    \"timing\": \"AFTER_SETTLEMENT\",\n    \"awaitingSettlement\": false\n  },\n  \"settlement\": {\n    \"state\": \"NOT_DUE\",\n    \"settledAt\": null,\n    \"amount\": null,\n    \"reference\": null,\n    \"importId\": null\n  },\n  \"failureReason\": null,\n  \"createdAt\": \"2026-10-10T08:00:30.000Z\",\n  \"payingAt\": null,\n  \"collectedAt\": null,\n  \"settledAt\": null,\n  \"payoutInstructedAt\": null,\n  \"completedAt\": null,\n  \"failedAt\": null,\n  \"expiredAt\": null,\n  \"cancelledAt\": null,\n  \"checkoutToken\": \"EXAMPLE_CHECKOUT_TOKEN_not_a_real_one\",\n  \"checkoutUrl\": \"https://verifia.anybanq.lk/remit/EXAMPLE_CHECKOUT_TOKEN_not_a_real_one\"\n}"
            },
            {
              "name": "400 The request was refused: a field failed validation or a rule was broken.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quoteId\": \"7a1e2c54-0b6d-4f1a-9c1e-2f5b8d3a6e10\",\n  \"externalRef\": \"transfer-1001\",\n  \"payee\": {\n    \"kind\": \"ACCOUNT\",\n    \"bankCode\": \"7083\",\n    \"accountNumber\": \"0000123456789\",\n    \"name\": \"Sample Payee\"\n  },\n  \"sender\": {\n    \"name\": \"Sample Sender\",\n    \"country\": \"GB\",\n    \"dob\": \"1990-04-12\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/remittance/orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "remittance",
                    "orders"
                  ]
                },
                "description": "Idempotent on `externalRef`: a repeat with the same `externalRef` and `quoteId` returns the order made the first time, again with 201. The same `externalRef` with a different quote answers 409. Hand `checkoutToken` to the browser, never the API key.\n\nOpenAPI operation: createRemittanceOrder"
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 400,\n  \"message\": [\n    \"sourceCurrency must be a 3-letter ISO code\"\n  ],\n  \"error\": \"Bad Request\"\n}"
            },
            {
              "name": "401 The API key is missing, wrong, revoked or expired.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quoteId\": \"7a1e2c54-0b6d-4f1a-9c1e-2f5b8d3a6e10\",\n  \"externalRef\": \"transfer-1001\",\n  \"payee\": {\n    \"kind\": \"ACCOUNT\",\n    \"bankCode\": \"7083\",\n    \"accountNumber\": \"0000123456789\",\n    \"name\": \"Sample Payee\"\n  },\n  \"sender\": {\n    \"name\": \"Sample Sender\",\n    \"country\": \"GB\",\n    \"dob\": \"1990-04-12\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/remittance/orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "remittance",
                    "orders"
                  ]
                },
                "description": "Idempotent on `externalRef`: a repeat with the same `externalRef` and `quoteId` returns the order made the first time, again with 201. The same `externalRef` with a different quote answers 409. Hand `checkoutToken` to the browser, never the API key.\n\nOpenAPI operation: createRemittanceOrder"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 401,\n  \"message\": \"Invalid API key\",\n  \"error\": \"Unauthorized\"\n}"
            },
            {
              "name": "403 The key lacks the scope, the service is not enabled for your organisation, or the address is not on your IP whitelist.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quoteId\": \"7a1e2c54-0b6d-4f1a-9c1e-2f5b8d3a6e10\",\n  \"externalRef\": \"transfer-1001\",\n  \"payee\": {\n    \"kind\": \"ACCOUNT\",\n    \"bankCode\": \"7083\",\n    \"accountNumber\": \"0000123456789\",\n    \"name\": \"Sample Payee\"\n  },\n  \"sender\": {\n    \"name\": \"Sample Sender\",\n    \"country\": \"GB\",\n    \"dob\": \"1990-04-12\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/remittance/orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "remittance",
                    "orders"
                  ]
                },
                "description": "Idempotent on `externalRef`: a repeat with the same `externalRef` and `quoteId` returns the order made the first time, again with 201. The same `externalRef` with a different quote answers 409. Hand `checkoutToken` to the browser, never the API key.\n\nOpenAPI operation: createRemittanceOrder"
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 403,\n  \"message\": \"The Remittance orders service is not enabled for your account\",\n  \"error\": \"Forbidden\"\n}"
            },
            {
              "name": "404 No such record in your organisation.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quoteId\": \"7a1e2c54-0b6d-4f1a-9c1e-2f5b8d3a6e10\",\n  \"externalRef\": \"transfer-1001\",\n  \"payee\": {\n    \"kind\": \"ACCOUNT\",\n    \"bankCode\": \"7083\",\n    \"accountNumber\": \"0000123456789\",\n    \"name\": \"Sample Payee\"\n  },\n  \"sender\": {\n    \"name\": \"Sample Sender\",\n    \"country\": \"GB\",\n    \"dob\": \"1990-04-12\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/remittance/orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "remittance",
                    "orders"
                  ]
                },
                "description": "Idempotent on `externalRef`: a repeat with the same `externalRef` and `quoteId` returns the order made the first time, again with 201. The same `externalRef` with a different quote answers 409. Hand `checkoutToken` to the browser, never the API key.\n\nOpenAPI operation: createRemittanceOrder"
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 404,\n  \"message\": \"Order not found\",\n  \"error\": \"Not Found\"\n}"
            },
            {
              "name": "409 The request conflicts with the record's current state.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quoteId\": \"7a1e2c54-0b6d-4f1a-9c1e-2f5b8d3a6e10\",\n  \"externalRef\": \"transfer-1001\",\n  \"payee\": {\n    \"kind\": \"ACCOUNT\",\n    \"bankCode\": \"7083\",\n    \"accountNumber\": \"0000123456789\",\n    \"name\": \"Sample Payee\"\n  },\n  \"sender\": {\n    \"name\": \"Sample Sender\",\n    \"country\": \"GB\",\n    \"dob\": \"1990-04-12\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/remittance/orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "remittance",
                    "orders"
                  ]
                },
                "description": "Idempotent on `externalRef`: a repeat with the same `externalRef` and `quoteId` returns the order made the first time, again with 201. The same `externalRef` with a different quote answers 409. Hand `checkoutToken` to the browser, never the API key.\n\nOpenAPI operation: createRemittanceOrder"
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 409,\n  \"message\": \"externalRef was already used for a different order\",\n  \"error\": \"Conflict\"\n}"
            },
            {
              "name": "503 The service cannot take this request right now.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quoteId\": \"7a1e2c54-0b6d-4f1a-9c1e-2f5b8d3a6e10\",\n  \"externalRef\": \"transfer-1001\",\n  \"payee\": {\n    \"kind\": \"ACCOUNT\",\n    \"bankCode\": \"7083\",\n    \"accountNumber\": \"0000123456789\",\n    \"name\": \"Sample Payee\"\n  },\n  \"sender\": {\n    \"name\": \"Sample Sender\",\n    \"country\": \"GB\",\n    \"dob\": \"1990-04-12\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/remittance/orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "remittance",
                    "orders"
                  ]
                },
                "description": "Idempotent on `externalRef`: a repeat with the same `externalRef` and `quoteId` returns the order made the first time, again with 201. The same `externalRef` with a different quote answers 409. Hand `checkoutToken` to the browser, never the API key.\n\nOpenAPI operation: createRemittanceOrder"
              },
              "status": "Service Unavailable",
              "code": 503,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 503,\n  \"message\": \"No collection rail is available for remittance orders\",\n  \"error\": \"Service Unavailable\"\n}"
            }
          ]
        },
        {
          "name": "List orders",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/remittance/orders",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "remittance",
                "orders"
              ],
              "query": [
                {
                  "key": "status",
                  "value": "",
                  "description": "",
                  "disabled": true
                },
                {
                  "key": "settlement",
                  "value": "",
                  "description": "AWAITING: authorised by the bank and not yet settled. PAID_OUT_UNSETTLED: of those, the ones whose recipient was already paid. Either lists the longest-waiting first.",
                  "disabled": true
                },
                {
                  "key": "page",
                  "value": "",
                  "description": "1-based. Defaults to 1.",
                  "disabled": true
                },
                {
                  "key": "pageSize",
                  "value": "",
                  "description": "Defaults to 25.",
                  "disabled": true
                }
              ]
            },
            "description": "Newest first, without checkout tokens.\n\nOpenAPI operation: listRemittanceOrders"
          },
          "response": [
            {
              "name": "200 A page of orders.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/remittance/orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "remittance",
                    "orders"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "description": "",
                      "disabled": true
                    },
                    {
                      "key": "settlement",
                      "value": "",
                      "description": "AWAITING: authorised by the bank and not yet settled. PAID_OUT_UNSETTLED: of those, the ones whose recipient was already paid. Either lists the longest-waiting first.",
                      "disabled": true
                    },
                    {
                      "key": "page",
                      "value": "",
                      "description": "1-based. Defaults to 1.",
                      "disabled": true
                    },
                    {
                      "key": "pageSize",
                      "value": "",
                      "description": "Defaults to 25.",
                      "disabled": true
                    }
                  ]
                },
                "description": "Newest first, without checkout tokens.\n\nOpenAPI operation: listRemittanceOrders"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"items\": [\n    {\n      \"id\": \"3f2b8c1e-5d44-4a7e-9a36-0b1c2d3e4f50\",\n      \"externalRef\": \"transfer-1001\",\n      \"quoteId\": \"7a1e2c54-0b6d-4f1a-9c1e-2f5b8d3a6e10\",\n      \"status\": \"AWAITING_PAYMENT\",\n      \"sandbox\": true,\n      \"send\": {\n        \"amountMinor\": \"10000\",\n        \"currency\": \"USD\"\n      },\n      \"fee\": {\n        \"amountMinor\": \"250\",\n        \"currency\": \"USD\"\n      },\n      \"total\": {\n        \"amountMinor\": \"10250\",\n        \"currency\": \"USD\"\n      },\n      \"receive\": {\n        \"amountMinor\": \"2987500\",\n        \"currency\": \"LKR\"\n      },\n      \"rate\": \"298.75\",\n      \"rateExpiresAt\": \"2026-10-10T08:05:00.000Z\",\n      \"indicative\": {\n        \"amountMinor\": \"7810\",\n        \"currency\": \"GBP\",\n        \"estimate\": true\n      },\n      \"payee\": {\n        \"kind\": \"ACCOUNT\",\n        \"displayName\": \"Sample Payee\",\n        \"bankName\": \"Seylan Bank PLC\",\n        \"accountMasked\": \"****6789\",\n        \"bankCode\": \"7083\",\n        \"handle\": null\n      },\n      \"sender\": {\n        \"name\": \"Sample Sender\",\n        \"country\": \"GB\",\n        \"verificationSessionId\": null\n      },\n      \"screening\": {\n        \"status\": \"CLEAR\",\n        \"reviewDecision\": null,\n        \"reviewedAt\": null\n      },\n      \"collection\": {\n        \"rail\": \"MOCK_CARD\",\n        \"mode\": \"redirect\",\n        \"reference\": null\n      },\n      \"payout\": {\n        \"status\": null,\n        \"reference\": null,\n        \"providerRef\": null,\n        \"message\": null,\n        \"timing\": \"AFTER_SETTLEMENT\",\n        \"awaitingSettlement\": false\n      },\n      \"settlement\": {\n        \"state\": \"NOT_DUE\",\n        \"settledAt\": null,\n        \"amount\": null,\n        \"reference\": null,\n        \"importId\": null\n      },\n      \"failureReason\": null,\n      \"createdAt\": \"2026-10-10T08:00:30.000Z\",\n      \"payingAt\": null,\n      \"collectedAt\": null,\n      \"settledAt\": null,\n      \"payoutInstructedAt\": null,\n      \"completedAt\": null,\n      \"failedAt\": null,\n      \"expiredAt\": null,\n      \"cancelledAt\": null\n    }\n  ],\n  \"total\": 1,\n  \"page\": 1,\n  \"pageSize\": 25\n}"
            },
            {
              "name": "400 The request was refused: a field failed validation or a rule was broken.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/remittance/orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "remittance",
                    "orders"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "description": "",
                      "disabled": true
                    },
                    {
                      "key": "settlement",
                      "value": "",
                      "description": "AWAITING: authorised by the bank and not yet settled. PAID_OUT_UNSETTLED: of those, the ones whose recipient was already paid. Either lists the longest-waiting first.",
                      "disabled": true
                    },
                    {
                      "key": "page",
                      "value": "",
                      "description": "1-based. Defaults to 1.",
                      "disabled": true
                    },
                    {
                      "key": "pageSize",
                      "value": "",
                      "description": "Defaults to 25.",
                      "disabled": true
                    }
                  ]
                },
                "description": "Newest first, without checkout tokens.\n\nOpenAPI operation: listRemittanceOrders"
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 400,\n  \"message\": [\n    \"sourceCurrency must be a 3-letter ISO code\"\n  ],\n  \"error\": \"Bad Request\"\n}"
            },
            {
              "name": "401 The API key is missing, wrong, revoked or expired.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/remittance/orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "remittance",
                    "orders"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "description": "",
                      "disabled": true
                    },
                    {
                      "key": "settlement",
                      "value": "",
                      "description": "AWAITING: authorised by the bank and not yet settled. PAID_OUT_UNSETTLED: of those, the ones whose recipient was already paid. Either lists the longest-waiting first.",
                      "disabled": true
                    },
                    {
                      "key": "page",
                      "value": "",
                      "description": "1-based. Defaults to 1.",
                      "disabled": true
                    },
                    {
                      "key": "pageSize",
                      "value": "",
                      "description": "Defaults to 25.",
                      "disabled": true
                    }
                  ]
                },
                "description": "Newest first, without checkout tokens.\n\nOpenAPI operation: listRemittanceOrders"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 401,\n  \"message\": \"Invalid API key\",\n  \"error\": \"Unauthorized\"\n}"
            },
            {
              "name": "403 The key lacks the scope, the service is not enabled for your organisation, or the address is not on your IP whitelist.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/remittance/orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "remittance",
                    "orders"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "description": "",
                      "disabled": true
                    },
                    {
                      "key": "settlement",
                      "value": "",
                      "description": "AWAITING: authorised by the bank and not yet settled. PAID_OUT_UNSETTLED: of those, the ones whose recipient was already paid. Either lists the longest-waiting first.",
                      "disabled": true
                    },
                    {
                      "key": "page",
                      "value": "",
                      "description": "1-based. Defaults to 1.",
                      "disabled": true
                    },
                    {
                      "key": "pageSize",
                      "value": "",
                      "description": "Defaults to 25.",
                      "disabled": true
                    }
                  ]
                },
                "description": "Newest first, without checkout tokens.\n\nOpenAPI operation: listRemittanceOrders"
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 403,\n  \"message\": \"The Remittance orders service is not enabled for your account\",\n  \"error\": \"Forbidden\"\n}"
            }
          ]
        },
        {
          "name": "Read one order",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/remittance/orders/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "remittance",
                "orders",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "The order id."
                }
              ]
            },
            "description": "OpenAPI operation: getRemittanceOrder"
          },
          "response": [
            {
              "name": "200 The order, with its checkout token.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/remittance/orders/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "remittance",
                    "orders",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The order id."
                    }
                  ]
                },
                "description": "OpenAPI operation: getRemittanceOrder"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"3f2b8c1e-5d44-4a7e-9a36-0b1c2d3e4f50\",\n  \"externalRef\": \"transfer-1001\",\n  \"quoteId\": \"7a1e2c54-0b6d-4f1a-9c1e-2f5b8d3a6e10\",\n  \"status\": \"AWAITING_PAYMENT\",\n  \"sandbox\": true,\n  \"send\": {\n    \"amountMinor\": \"10000\",\n    \"currency\": \"USD\"\n  },\n  \"fee\": {\n    \"amountMinor\": \"250\",\n    \"currency\": \"USD\"\n  },\n  \"total\": {\n    \"amountMinor\": \"10250\",\n    \"currency\": \"USD\"\n  },\n  \"receive\": {\n    \"amountMinor\": \"2987500\",\n    \"currency\": \"LKR\"\n  },\n  \"rate\": \"298.75\",\n  \"rateExpiresAt\": \"2026-10-10T08:05:00.000Z\",\n  \"indicative\": {\n    \"amountMinor\": \"7810\",\n    \"currency\": \"GBP\",\n    \"estimate\": true\n  },\n  \"payee\": {\n    \"kind\": \"ACCOUNT\",\n    \"displayName\": \"Sample Payee\",\n    \"bankName\": \"Seylan Bank PLC\",\n    \"accountMasked\": \"****6789\",\n    \"bankCode\": \"7083\",\n    \"handle\": null\n  },\n  \"sender\": {\n    \"name\": \"Sample Sender\",\n    \"country\": \"GB\",\n    \"verificationSessionId\": null\n  },\n  \"screening\": {\n    \"status\": \"CLEAR\",\n    \"reviewDecision\": null,\n    \"reviewedAt\": null\n  },\n  \"collection\": {\n    \"rail\": \"MOCK_CARD\",\n    \"mode\": \"redirect\",\n    \"reference\": null\n  },\n  \"payout\": {\n    \"status\": null,\n    \"reference\": null,\n    \"providerRef\": null,\n    \"message\": null,\n    \"timing\": \"AFTER_SETTLEMENT\",\n    \"awaitingSettlement\": false\n  },\n  \"settlement\": {\n    \"state\": \"NOT_DUE\",\n    \"settledAt\": null,\n    \"amount\": null,\n    \"reference\": null,\n    \"importId\": null\n  },\n  \"failureReason\": null,\n  \"createdAt\": \"2026-10-10T08:00:30.000Z\",\n  \"payingAt\": null,\n  \"collectedAt\": null,\n  \"settledAt\": null,\n  \"payoutInstructedAt\": null,\n  \"completedAt\": null,\n  \"failedAt\": null,\n  \"expiredAt\": null,\n  \"cancelledAt\": null,\n  \"checkoutToken\": \"EXAMPLE_CHECKOUT_TOKEN_not_a_real_one\",\n  \"checkoutUrl\": \"https://verifia.anybanq.lk/remit/EXAMPLE_CHECKOUT_TOKEN_not_a_real_one\"\n}"
            },
            {
              "name": "400 The request was refused: a field failed validation or a rule was broken.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/remittance/orders/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "remittance",
                    "orders",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The order id."
                    }
                  ]
                },
                "description": "OpenAPI operation: getRemittanceOrder"
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 400,\n  \"message\": [\n    \"sourceCurrency must be a 3-letter ISO code\"\n  ],\n  \"error\": \"Bad Request\"\n}"
            },
            {
              "name": "401 The API key is missing, wrong, revoked or expired.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/remittance/orders/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "remittance",
                    "orders",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The order id."
                    }
                  ]
                },
                "description": "OpenAPI operation: getRemittanceOrder"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 401,\n  \"message\": \"Invalid API key\",\n  \"error\": \"Unauthorized\"\n}"
            },
            {
              "name": "403 The key lacks the scope, the service is not enabled for your organisation, or the address is not on your IP whitelist.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/remittance/orders/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "remittance",
                    "orders",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The order id."
                    }
                  ]
                },
                "description": "OpenAPI operation: getRemittanceOrder"
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 403,\n  \"message\": \"The Remittance orders service is not enabled for your account\",\n  \"error\": \"Forbidden\"\n}"
            },
            {
              "name": "404 No such record in your organisation.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/remittance/orders/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "remittance",
                    "orders",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The order id."
                    }
                  ]
                },
                "description": "OpenAPI operation: getRemittanceOrder"
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 404,\n  \"message\": \"Order not found\",\n  \"error\": \"Not Found\"\n}"
            }
          ]
        },
        {
          "name": "Cancel an order the sender has not started paying",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/remittance/orders/:id/cancel",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "remittance",
                "orders",
                ":id",
                "cancel"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "The order id."
                }
              ]
            },
            "description": "Cancelling twice is harmless. An order that is PAYING or later answers 409.\n\nOpenAPI operation: cancelRemittanceOrder"
          },
          "response": [
            {
              "name": "200 The cancelled order.",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/remittance/orders/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "remittance",
                    "orders",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The order id."
                    }
                  ]
                },
                "description": "Cancelling twice is harmless. An order that is PAYING or later answers 409.\n\nOpenAPI operation: cancelRemittanceOrder"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"3f2b8c1e-5d44-4a7e-9a36-0b1c2d3e4f50\",\n  \"externalRef\": \"transfer-1001\",\n  \"quoteId\": \"7a1e2c54-0b6d-4f1a-9c1e-2f5b8d3a6e10\",\n  \"status\": \"CANCELLED\",\n  \"sandbox\": true,\n  \"send\": {\n    \"amountMinor\": \"10000\",\n    \"currency\": \"USD\"\n  },\n  \"fee\": {\n    \"amountMinor\": \"250\",\n    \"currency\": \"USD\"\n  },\n  \"total\": {\n    \"amountMinor\": \"10250\",\n    \"currency\": \"USD\"\n  },\n  \"receive\": {\n    \"amountMinor\": \"2987500\",\n    \"currency\": \"LKR\"\n  },\n  \"rate\": \"298.75\",\n  \"rateExpiresAt\": \"2026-10-10T08:05:00.000Z\",\n  \"indicative\": {\n    \"amountMinor\": \"7810\",\n    \"currency\": \"GBP\",\n    \"estimate\": true\n  },\n  \"payee\": {\n    \"kind\": \"ACCOUNT\",\n    \"displayName\": \"Sample Payee\",\n    \"bankName\": \"Seylan Bank PLC\",\n    \"accountMasked\": \"****6789\",\n    \"bankCode\": \"7083\",\n    \"handle\": null\n  },\n  \"sender\": {\n    \"name\": \"Sample Sender\",\n    \"country\": \"GB\",\n    \"verificationSessionId\": null\n  },\n  \"screening\": {\n    \"status\": \"CLEAR\",\n    \"reviewDecision\": null,\n    \"reviewedAt\": null\n  },\n  \"collection\": {\n    \"rail\": \"MOCK_CARD\",\n    \"mode\": \"redirect\",\n    \"reference\": null\n  },\n  \"payout\": {\n    \"status\": null,\n    \"reference\": null,\n    \"providerRef\": null,\n    \"message\": null,\n    \"timing\": \"AFTER_SETTLEMENT\",\n    \"awaitingSettlement\": false\n  },\n  \"settlement\": {\n    \"state\": \"NOT_DUE\",\n    \"settledAt\": null,\n    \"amount\": null,\n    \"reference\": null,\n    \"importId\": null\n  },\n  \"failureReason\": null,\n  \"createdAt\": \"2026-10-10T08:00:30.000Z\",\n  \"payingAt\": null,\n  \"collectedAt\": null,\n  \"settledAt\": null,\n  \"payoutInstructedAt\": null,\n  \"completedAt\": null,\n  \"failedAt\": null,\n  \"expiredAt\": null,\n  \"cancelledAt\": \"2026-10-10T08:02:00.000Z\"\n}"
            },
            {
              "name": "400 The request was refused: a field failed validation or a rule was broken.",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/remittance/orders/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "remittance",
                    "orders",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The order id."
                    }
                  ]
                },
                "description": "Cancelling twice is harmless. An order that is PAYING or later answers 409.\n\nOpenAPI operation: cancelRemittanceOrder"
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 400,\n  \"message\": [\n    \"sourceCurrency must be a 3-letter ISO code\"\n  ],\n  \"error\": \"Bad Request\"\n}"
            },
            {
              "name": "401 The API key is missing, wrong, revoked or expired.",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/remittance/orders/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "remittance",
                    "orders",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The order id."
                    }
                  ]
                },
                "description": "Cancelling twice is harmless. An order that is PAYING or later answers 409.\n\nOpenAPI operation: cancelRemittanceOrder"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 401,\n  \"message\": \"Invalid API key\",\n  \"error\": \"Unauthorized\"\n}"
            },
            {
              "name": "403 The key lacks the scope, the service is not enabled for your organisation, or the address is not on your IP whitelist.",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/remittance/orders/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "remittance",
                    "orders",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The order id."
                    }
                  ]
                },
                "description": "Cancelling twice is harmless. An order that is PAYING or later answers 409.\n\nOpenAPI operation: cancelRemittanceOrder"
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 403,\n  \"message\": \"The Remittance orders service is not enabled for your account\",\n  \"error\": \"Forbidden\"\n}"
            },
            {
              "name": "404 No such record in your organisation.",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/remittance/orders/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "remittance",
                    "orders",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The order id."
                    }
                  ]
                },
                "description": "Cancelling twice is harmless. An order that is PAYING or later answers 409.\n\nOpenAPI operation: cancelRemittanceOrder"
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 404,\n  \"message\": \"Order not found\",\n  \"error\": \"Not Found\"\n}"
            },
            {
              "name": "409 The request conflicts with the record's current state.",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/remittance/orders/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "remittance",
                    "orders",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The order id."
                    }
                  ]
                },
                "description": "Cancelling twice is harmless. An order that is PAYING or later answers 409.\n\nOpenAPI operation: cancelRemittanceOrder"
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 409,\n  \"message\": \"externalRef was already used for a different order\",\n  \"error\": \"Conflict\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Bulk payouts",
      "description": "Needs the Bulk payouts service switched on, and the `payouts` scope on a scoped key. A key can create and read a batch; it can never approve one. A batch made with a test key is a test batch: it is only ever simulated.",
      "item": [
        {
          "name": "Create a payout batch from JSON rows",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"October redemptions\",\n  \"rows\": [\n    {\n      \"payeeName\": \"Sample Payee One\",\n      \"bankCode\": \"7010\",\n      \"accountNumber\": \"0000123456\",\n      \"amount\": \"85000.00\",\n      \"reference\": \"RED-1\"\n    },\n    {\n      \"payeeName\": \"Sample Payee Two\",\n      \"bankCode\": \"7083\",\n      \"accountNumber\": \"0000654321\",\n      \"amount\": \"120000.00\",\n      \"reference\": \"RED-2\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/payout-batches",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "payout-batches"
              ]
            },
            "description": "Up to 500 rows; five calls a minute. A bad row is reported on its own (status INVALID, with `issues`) and left out of the total. Nothing is paid until a person approves the batch in the console and the bank confirms the funds. **An API key cannot approve a batch.** There is no idempotency key: a repeat is accepted and flagged with `repeatOf`.\n\nOpenAPI operation: createPayoutBatch"
          },
          "response": [
            {
              "name": "201 The batch with every row.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"name\": \"October redemptions\",\n  \"rows\": [\n    {\n      \"payeeName\": \"Sample Payee One\",\n      \"bankCode\": \"7010\",\n      \"accountNumber\": \"0000123456\",\n      \"amount\": \"85000.00\",\n      \"reference\": \"RED-1\"\n    },\n    {\n      \"payeeName\": \"Sample Payee Two\",\n      \"bankCode\": \"7083\",\n      \"accountNumber\": \"0000654321\",\n      \"amount\": \"120000.00\",\n      \"reference\": \"RED-2\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/payout-batches",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payout-batches"
                  ]
                },
                "description": "Up to 500 rows; five calls a minute. A bad row is reported on its own (status INVALID, with `issues`) and left out of the total. Nothing is paid until a person approves the batch in the console and the bank confirms the funds. **An API key cannot approve a batch.** There is no idempotency key: a repeat is accepted and flagged with `repeatOf`.\n\nOpenAPI operation: createPayoutBatch"
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"b4c9d7e2-1a3f-4b6c-8d9e-0f1a2b3c4d5e\",\n  \"name\": \"October redemptions\",\n  \"status\": \"AWAITING_APPROVAL\",\n  \"amountMode\": \"LKR\",\n  \"currency\": \"LKR\",\n  \"payerCurrency\": null,\n  \"fundingReference\": \"VPB0A1B2C3D4E5F\",\n  \"rowCount\": 2,\n  \"validCount\": 2,\n  \"invalidCount\": 0,\n  \"totalAmount\": 205000,\n  \"totalAmountLkr\": 205000,\n  \"quote\": null,\n  \"bankRate\": null,\n  \"approvedAt\": null,\n  \"fundedAt\": null,\n  \"fundedAmountLkr\": null,\n  \"executedAt\": null,\n  \"completedAt\": null,\n  \"createdById\": null,\n  \"payeeListId\": null,\n  \"repeatOfBatchId\": null,\n  \"paymentsLive\": false,\n  \"createdAt\": \"2026-10-10T08:00:00.000Z\",\n  \"createdBy\": null,\n  \"createdByApiKey\": true,\n  \"approvedBy\": null,\n  \"rejectedBy\": null,\n  \"rejectionReason\": null,\n  \"repeatOf\": null,\n  \"rows\": [\n    {\n      \"id\": \"c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e51\",\n      \"rowNumber\": 1,\n      \"payeeName\": \"Sample Payee One\",\n      \"bankCode\": \"7010\",\n      \"bankName\": \"Bank of Ceylon\",\n      \"accountNumber\": \"0000123456\",\n      \"amount\": 85000,\n      \"currency\": \"LKR\",\n      \"amountLkr\": 85000,\n      \"reference\": \"RED-1\",\n      \"status\": \"READY\",\n      \"issues\": [],\n      \"nameCheck\": \"UNCHECKED\",\n      \"screening\": \"CLEAR\",\n      \"payoutReference\": \"VPB0A1B2C3D4E5FR0001\",\n      \"providerRef\": null,\n      \"message\": null,\n      \"paidAt\": null,\n      \"returnedAt\": null\n    },\n    {\n      \"id\": \"c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e52\",\n      \"rowNumber\": 2,\n      \"payeeName\": \"Sample Payee Two\",\n      \"bankCode\": \"7083\",\n      \"bankName\": \"Seylan Bank PLC\",\n      \"accountNumber\": \"0000654321\",\n      \"amount\": 120000,\n      \"currency\": \"LKR\",\n      \"amountLkr\": 120000,\n      \"reference\": \"RED-2\",\n      \"status\": \"READY\",\n      \"issues\": [],\n      \"nameCheck\": \"UNCHECKED\",\n      \"screening\": \"CLEAR\",\n      \"payoutReference\": \"VPB0A1B2C3D4E5FR0002\",\n      \"providerRef\": null,\n      \"message\": null,\n      \"paidAt\": null,\n      \"returnedAt\": null\n    }\n  ]\n}"
            },
            {
              "name": "400 The request was refused: a field failed validation or a rule was broken.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"name\": \"October redemptions\",\n  \"rows\": [\n    {\n      \"payeeName\": \"Sample Payee One\",\n      \"bankCode\": \"7010\",\n      \"accountNumber\": \"0000123456\",\n      \"amount\": \"85000.00\",\n      \"reference\": \"RED-1\"\n    },\n    {\n      \"payeeName\": \"Sample Payee Two\",\n      \"bankCode\": \"7083\",\n      \"accountNumber\": \"0000654321\",\n      \"amount\": \"120000.00\",\n      \"reference\": \"RED-2\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/payout-batches",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payout-batches"
                  ]
                },
                "description": "Up to 500 rows; five calls a minute. A bad row is reported on its own (status INVALID, with `issues`) and left out of the total. Nothing is paid until a person approves the batch in the console and the bank confirms the funds. **An API key cannot approve a batch.** There is no idempotency key: a repeat is accepted and flagged with `repeatOf`.\n\nOpenAPI operation: createPayoutBatch"
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 400,\n  \"message\": [\n    \"sourceCurrency must be a 3-letter ISO code\"\n  ],\n  \"error\": \"Bad Request\"\n}"
            },
            {
              "name": "401 The API key is missing, wrong, revoked or expired.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"name\": \"October redemptions\",\n  \"rows\": [\n    {\n      \"payeeName\": \"Sample Payee One\",\n      \"bankCode\": \"7010\",\n      \"accountNumber\": \"0000123456\",\n      \"amount\": \"85000.00\",\n      \"reference\": \"RED-1\"\n    },\n    {\n      \"payeeName\": \"Sample Payee Two\",\n      \"bankCode\": \"7083\",\n      \"accountNumber\": \"0000654321\",\n      \"amount\": \"120000.00\",\n      \"reference\": \"RED-2\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/payout-batches",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payout-batches"
                  ]
                },
                "description": "Up to 500 rows; five calls a minute. A bad row is reported on its own (status INVALID, with `issues`) and left out of the total. Nothing is paid until a person approves the batch in the console and the bank confirms the funds. **An API key cannot approve a batch.** There is no idempotency key: a repeat is accepted and flagged with `repeatOf`.\n\nOpenAPI operation: createPayoutBatch"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 401,\n  \"message\": \"Invalid API key\",\n  \"error\": \"Unauthorized\"\n}"
            },
            {
              "name": "403 The key lacks the scope, the service is not enabled for your organisation, or the address is not on your IP whitelist.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"name\": \"October redemptions\",\n  \"rows\": [\n    {\n      \"payeeName\": \"Sample Payee One\",\n      \"bankCode\": \"7010\",\n      \"accountNumber\": \"0000123456\",\n      \"amount\": \"85000.00\",\n      \"reference\": \"RED-1\"\n    },\n    {\n      \"payeeName\": \"Sample Payee Two\",\n      \"bankCode\": \"7083\",\n      \"accountNumber\": \"0000654321\",\n      \"amount\": \"120000.00\",\n      \"reference\": \"RED-2\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/payout-batches",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payout-batches"
                  ]
                },
                "description": "Up to 500 rows; five calls a minute. A bad row is reported on its own (status INVALID, with `issues`) and left out of the total. Nothing is paid until a person approves the batch in the console and the bank confirms the funds. **An API key cannot approve a batch.** There is no idempotency key: a repeat is accepted and flagged with `repeatOf`.\n\nOpenAPI operation: createPayoutBatch"
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 403,\n  \"message\": \"The Remittance orders service is not enabled for your account\",\n  \"error\": \"Forbidden\"\n}"
            },
            {
              "name": "429 Too many requests.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"name\": \"October redemptions\",\n  \"rows\": [\n    {\n      \"payeeName\": \"Sample Payee One\",\n      \"bankCode\": \"7010\",\n      \"accountNumber\": \"0000123456\",\n      \"amount\": \"85000.00\",\n      \"reference\": \"RED-1\"\n    },\n    {\n      \"payeeName\": \"Sample Payee Two\",\n      \"bankCode\": \"7083\",\n      \"accountNumber\": \"0000654321\",\n      \"amount\": \"120000.00\",\n      \"reference\": \"RED-2\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/payout-batches",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payout-batches"
                  ]
                },
                "description": "Up to 500 rows; five calls a minute. A bad row is reported on its own (status INVALID, with `issues`) and left out of the total. Nothing is paid until a person approves the batch in the console and the bank confirms the funds. **An API key cannot approve a batch.** There is no idempotency key: a repeat is accepted and flagged with `repeatOf`.\n\nOpenAPI operation: createPayoutBatch"
              },
              "status": "Too Many Requests",
              "code": 429,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 429,\n  \"message\": \"ThrottlerException: Too Many Requests\"\n}"
            }
          ]
        },
        {
          "name": "List the latest 100 batches",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/payout-batches",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "payout-batches"
              ]
            },
            "description": "Newest first, without rows. Takes no parameters.\n\nOpenAPI operation: listPayoutBatches"
          },
          "response": [
            {
              "name": "200 Batch summaries.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/payout-batches",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payout-batches"
                  ]
                },
                "description": "Newest first, without rows. Takes no parameters.\n\nOpenAPI operation: listPayoutBatches"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "[\n  {\n    \"id\": \"b4c9d7e2-1a3f-4b6c-8d9e-0f1a2b3c4d5e\",\n    \"name\": \"October redemptions\",\n    \"status\": \"AWAITING_APPROVAL\",\n    \"amountMode\": \"LKR\",\n    \"currency\": \"LKR\",\n    \"payerCurrency\": null,\n    \"fundingReference\": \"VPB0A1B2C3D4E5F\",\n    \"rowCount\": 2,\n    \"validCount\": 2,\n    \"invalidCount\": 0,\n    \"totalAmount\": 205000,\n    \"totalAmountLkr\": 205000,\n    \"quote\": null,\n    \"bankRate\": null,\n    \"approvedAt\": null,\n    \"fundedAt\": null,\n    \"fundedAmountLkr\": null,\n    \"executedAt\": null,\n    \"completedAt\": null,\n    \"createdById\": null,\n    \"payeeListId\": null,\n    \"repeatOfBatchId\": null,\n    \"paymentsLive\": false,\n    \"createdAt\": \"2026-10-10T08:00:00.000Z\"\n  }\n]"
            },
            {
              "name": "401 The API key is missing, wrong, revoked or expired.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/payout-batches",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payout-batches"
                  ]
                },
                "description": "Newest first, without rows. Takes no parameters.\n\nOpenAPI operation: listPayoutBatches"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 401,\n  \"message\": \"Invalid API key\",\n  \"error\": \"Unauthorized\"\n}"
            },
            {
              "name": "403 The key lacks the scope, the service is not enabled for your organisation, or the address is not on your IP whitelist.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/payout-batches",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payout-batches"
                  ]
                },
                "description": "Newest first, without rows. Takes no parameters.\n\nOpenAPI operation: listPayoutBatches"
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 403,\n  \"message\": \"The Remittance orders service is not enabled for your account\",\n  \"error\": \"Forbidden\"\n}"
            }
          ]
        },
        {
          "name": "Read one batch with every row",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/payout-batches/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "payout-batches",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "The batch id."
                }
              ]
            },
            "description": "OpenAPI operation: getPayoutBatch"
          },
          "response": [
            {
              "name": "200 The batch.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/payout-batches/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payout-batches",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The batch id."
                    }
                  ]
                },
                "description": "OpenAPI operation: getPayoutBatch"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"b4c9d7e2-1a3f-4b6c-8d9e-0f1a2b3c4d5e\",\n  \"name\": \"October redemptions\",\n  \"status\": \"AWAITING_APPROVAL\",\n  \"amountMode\": \"LKR\",\n  \"currency\": \"LKR\",\n  \"payerCurrency\": null,\n  \"fundingReference\": \"VPB0A1B2C3D4E5F\",\n  \"rowCount\": 2,\n  \"validCount\": 2,\n  \"invalidCount\": 0,\n  \"totalAmount\": 205000,\n  \"totalAmountLkr\": 205000,\n  \"quote\": null,\n  \"bankRate\": null,\n  \"approvedAt\": null,\n  \"fundedAt\": null,\n  \"fundedAmountLkr\": null,\n  \"executedAt\": null,\n  \"completedAt\": null,\n  \"createdById\": null,\n  \"payeeListId\": null,\n  \"repeatOfBatchId\": null,\n  \"paymentsLive\": false,\n  \"createdAt\": \"2026-10-10T08:00:00.000Z\",\n  \"createdBy\": null,\n  \"createdByApiKey\": true,\n  \"approvedBy\": null,\n  \"rejectedBy\": null,\n  \"rejectionReason\": null,\n  \"repeatOf\": null,\n  \"rows\": [\n    {\n      \"id\": \"c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e51\",\n      \"rowNumber\": 1,\n      \"payeeName\": \"Sample Payee One\",\n      \"bankCode\": \"7010\",\n      \"bankName\": \"Bank of Ceylon\",\n      \"accountNumber\": \"0000123456\",\n      \"amount\": 85000,\n      \"currency\": \"LKR\",\n      \"amountLkr\": 85000,\n      \"reference\": \"RED-1\",\n      \"status\": \"READY\",\n      \"issues\": [],\n      \"nameCheck\": \"UNCHECKED\",\n      \"screening\": \"CLEAR\",\n      \"payoutReference\": \"VPB0A1B2C3D4E5FR0001\",\n      \"providerRef\": null,\n      \"message\": null,\n      \"paidAt\": null,\n      \"returnedAt\": null\n    },\n    {\n      \"id\": \"c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e52\",\n      \"rowNumber\": 2,\n      \"payeeName\": \"Sample Payee Two\",\n      \"bankCode\": \"7083\",\n      \"bankName\": \"Seylan Bank PLC\",\n      \"accountNumber\": \"0000654321\",\n      \"amount\": 120000,\n      \"currency\": \"LKR\",\n      \"amountLkr\": 120000,\n      \"reference\": \"RED-2\",\n      \"status\": \"READY\",\n      \"issues\": [],\n      \"nameCheck\": \"UNCHECKED\",\n      \"screening\": \"CLEAR\",\n      \"payoutReference\": \"VPB0A1B2C3D4E5FR0002\",\n      \"providerRef\": null,\n      \"message\": null,\n      \"paidAt\": null,\n      \"returnedAt\": null\n    }\n  ]\n}"
            },
            {
              "name": "400 The request was refused: a field failed validation or a rule was broken.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/payout-batches/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payout-batches",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The batch id."
                    }
                  ]
                },
                "description": "OpenAPI operation: getPayoutBatch"
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 400,\n  \"message\": [\n    \"sourceCurrency must be a 3-letter ISO code\"\n  ],\n  \"error\": \"Bad Request\"\n}"
            },
            {
              "name": "401 The API key is missing, wrong, revoked or expired.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/payout-batches/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payout-batches",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The batch id."
                    }
                  ]
                },
                "description": "OpenAPI operation: getPayoutBatch"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 401,\n  \"message\": \"Invalid API key\",\n  \"error\": \"Unauthorized\"\n}"
            },
            {
              "name": "403 The key lacks the scope, the service is not enabled for your organisation, or the address is not on your IP whitelist.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/payout-batches/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payout-batches",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The batch id."
                    }
                  ]
                },
                "description": "OpenAPI operation: getPayoutBatch"
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 403,\n  \"message\": \"The Remittance orders service is not enabled for your account\",\n  \"error\": \"Forbidden\"\n}"
            },
            {
              "name": "404 No such record in your organisation.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/payout-batches/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payout-batches",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The batch id."
                    }
                  ]
                },
                "description": "OpenAPI operation: getPayoutBatch"
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 404,\n  \"message\": \"Order not found\",\n  \"error\": \"Not Found\"\n}"
            }
          ]
        },
        {
          "name": "Run a test batch to its end, with no bank involved",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/payout-batches/:id/simulate",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "payout-batches",
                ":id",
                "simulate"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "The batch id."
                }
              ]
            },
            "description": "Test keys only, and only for a batch made with one. Every valid row becomes `DRY_RUN`, the batch completes as `DRY_RUN`, and `payout_batch.completed` is sent with `test: true`. It stands in for the approval, the funding and the send and does none of them: nothing is approved, nothing is marked funded and no bank is instructed. A live key answers 400; a batch that is not a test batch answers 404.\n\nOpenAPI operation: simulatePayoutBatch"
          },
          "response": [
            {
              "name": "200 The completed test batch.",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/payout-batches/:id/simulate",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payout-batches",
                    ":id",
                    "simulate"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The batch id."
                    }
                  ]
                },
                "description": "Test keys only, and only for a batch made with one. Every valid row becomes `DRY_RUN`, the batch completes as `DRY_RUN`, and `payout_batch.completed` is sent with `test: true`. It stands in for the approval, the funding and the send and does none of them: nothing is approved, nothing is marked funded and no bank is instructed. A live key answers 400; a batch that is not a test batch answers 404.\n\nOpenAPI operation: simulatePayoutBatch"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"b4c9d7e2-1a3f-4b6c-8d9e-0f1a2b3c4d5e\",\n  \"name\": \"October redemptions\",\n  \"status\": \"DRY_RUN\",\n  \"amountMode\": \"LKR\",\n  \"currency\": \"LKR\",\n  \"payerCurrency\": null,\n  \"fundingReference\": \"VPB0A1B2C3D4E5F\",\n  \"rowCount\": 2,\n  \"validCount\": 2,\n  \"invalidCount\": 0,\n  \"totalAmount\": 205000,\n  \"totalAmountLkr\": 205000,\n  \"quote\": null,\n  \"bankRate\": null,\n  \"approvedAt\": null,\n  \"fundedAt\": null,\n  \"fundedAmountLkr\": null,\n  \"executedAt\": \"2026-10-10T08:05:00.000Z\",\n  \"completedAt\": \"2026-10-10T08:05:00.000Z\",\n  \"createdById\": null,\n  \"payeeListId\": null,\n  \"repeatOfBatchId\": null,\n  \"paymentsLive\": false,\n  \"createdAt\": \"2026-10-10T08:00:00.000Z\",\n  \"createdBy\": null,\n  \"createdByApiKey\": true,\n  \"approvedBy\": null,\n  \"rejectedBy\": null,\n  \"rejectionReason\": null,\n  \"repeatOf\": null,\n  \"rows\": [\n    {\n      \"id\": \"c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e51\",\n      \"rowNumber\": 1,\n      \"payeeName\": \"Sample Payee One\",\n      \"bankCode\": \"7010\",\n      \"bankName\": \"Bank of Ceylon\",\n      \"accountNumber\": \"0000123456\",\n      \"amount\": 85000,\n      \"currency\": \"LKR\",\n      \"amountLkr\": 85000,\n      \"reference\": \"RED-1\",\n      \"status\": \"DRY_RUN\",\n      \"issues\": [],\n      \"nameCheck\": \"UNCHECKED\",\n      \"screening\": \"CLEAR\",\n      \"payoutReference\": \"VPB0A1B2C3D4E5FR0001\",\n      \"providerRef\": null,\n      \"message\": \"Test batch: simulated, no money was sent\",\n      \"paidAt\": null,\n      \"returnedAt\": null\n    },\n    {\n      \"id\": \"c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e52\",\n      \"rowNumber\": 2,\n      \"payeeName\": \"Sample Payee Two\",\n      \"bankCode\": \"7083\",\n      \"bankName\": \"Seylan Bank PLC\",\n      \"accountNumber\": \"0000654321\",\n      \"amount\": 120000,\n      \"currency\": \"LKR\",\n      \"amountLkr\": 120000,\n      \"reference\": \"RED-2\",\n      \"status\": \"DRY_RUN\",\n      \"issues\": [],\n      \"nameCheck\": \"UNCHECKED\",\n      \"screening\": \"CLEAR\",\n      \"payoutReference\": \"VPB0A1B2C3D4E5FR0002\",\n      \"providerRef\": null,\n      \"message\": \"Test batch: simulated, no money was sent\",\n      \"paidAt\": null,\n      \"returnedAt\": null\n    }\n  ],\n  \"test\": true\n}"
            },
            {
              "name": "400 The request was refused: a field failed validation or a rule was broken.",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/payout-batches/:id/simulate",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payout-batches",
                    ":id",
                    "simulate"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The batch id."
                    }
                  ]
                },
                "description": "Test keys only, and only for a batch made with one. Every valid row becomes `DRY_RUN`, the batch completes as `DRY_RUN`, and `payout_batch.completed` is sent with `test: true`. It stands in for the approval, the funding and the send and does none of them: nothing is approved, nothing is marked funded and no bank is instructed. A live key answers 400; a batch that is not a test batch answers 404.\n\nOpenAPI operation: simulatePayoutBatch"
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 400,\n  \"message\": [\n    \"sourceCurrency must be a 3-letter ISO code\"\n  ],\n  \"error\": \"Bad Request\"\n}"
            },
            {
              "name": "401 The API key is missing, wrong, revoked or expired.",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/payout-batches/:id/simulate",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payout-batches",
                    ":id",
                    "simulate"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The batch id."
                    }
                  ]
                },
                "description": "Test keys only, and only for a batch made with one. Every valid row becomes `DRY_RUN`, the batch completes as `DRY_RUN`, and `payout_batch.completed` is sent with `test: true`. It stands in for the approval, the funding and the send and does none of them: nothing is approved, nothing is marked funded and no bank is instructed. A live key answers 400; a batch that is not a test batch answers 404.\n\nOpenAPI operation: simulatePayoutBatch"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 401,\n  \"message\": \"Invalid API key\",\n  \"error\": \"Unauthorized\"\n}"
            },
            {
              "name": "403 The key lacks the scope, the service is not enabled for your organisation, or the address is not on your IP whitelist.",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/payout-batches/:id/simulate",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payout-batches",
                    ":id",
                    "simulate"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The batch id."
                    }
                  ]
                },
                "description": "Test keys only, and only for a batch made with one. Every valid row becomes `DRY_RUN`, the batch completes as `DRY_RUN`, and `payout_batch.completed` is sent with `test: true`. It stands in for the approval, the funding and the send and does none of them: nothing is approved, nothing is marked funded and no bank is instructed. A live key answers 400; a batch that is not a test batch answers 404.\n\nOpenAPI operation: simulatePayoutBatch"
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 403,\n  \"message\": \"The Remittance orders service is not enabled for your account\",\n  \"error\": \"Forbidden\"\n}"
            },
            {
              "name": "404 No such record in your organisation.",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/payout-batches/:id/simulate",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payout-batches",
                    ":id",
                    "simulate"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The batch id."
                    }
                  ]
                },
                "description": "Test keys only, and only for a batch made with one. Every valid row becomes `DRY_RUN`, the batch completes as `DRY_RUN`, and `payout_batch.completed` is sent with `test: true`. It stands in for the approval, the funding and the send and does none of them: nothing is approved, nothing is marked funded and no bank is instructed. A live key answers 400; a batch that is not a test batch answers 404.\n\nOpenAPI operation: simulatePayoutBatch"
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 404,\n  \"message\": \"Order not found\",\n  \"error\": \"Not Found\"\n}"
            },
            {
              "name": "409 The request conflicts with the record's current state.",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/payout-batches/:id/simulate",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payout-batches",
                    ":id",
                    "simulate"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The batch id."
                    }
                  ]
                },
                "description": "Test keys only, and only for a batch made with one. Every valid row becomes `DRY_RUN`, the batch completes as `DRY_RUN`, and `payout_batch.completed` is sent with `test: true`. It stands in for the approval, the funding and the send and does none of them: nothing is approved, nothing is marked funded and no bank is instructed. A live key answers 400; a batch that is not a test batch answers 404.\n\nOpenAPI operation: simulatePayoutBatch"
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 409,\n  \"message\": \"externalRef was already used for a different order\",\n  \"error\": \"Conflict\"\n}"
            },
            {
              "name": "429 Too many requests.",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/payout-batches/:id/simulate",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payout-batches",
                    ":id",
                    "simulate"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The batch id."
                    }
                  ]
                },
                "description": "Test keys only, and only for a batch made with one. Every valid row becomes `DRY_RUN`, the batch completes as `DRY_RUN`, and `payout_batch.completed` is sent with `test: true`. It stands in for the approval, the funding and the send and does none of them: nothing is approved, nothing is marked funded and no bank is instructed. A live key answers 400; a batch that is not a test batch answers 404.\n\nOpenAPI operation: simulatePayoutBatch"
              },
              "status": "Too Many Requests",
              "code": 429,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 429,\n  \"message\": \"ThrottlerException: Too Many Requests\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Collection",
      "description": "Bills and payment links, paid on the hosted pay page. Needs the Bill issued service, and the `bills` scope on a scoped key. Made with a test key they are test records, paid by simulation only.",
      "item": [
        {
          "name": "Issue a bill",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"description\": \"Advisory fee, October\",\n  \"amount\": 15000,\n  \"dueDate\": \"2026-11-01\",\n  \"payerNic\": \"199000000000\",\n  \"payerName\": \"Sample Payer\",\n  \"payerPhone\": \"0770000000\",\n  \"channels\": [\n    \"sms\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/bills",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "bills"
              ]
            },
            "description": "The payer pays it on the hosted pay page from a Sri Lankan bank account. Amounts are JSON numbers in major units. Not idempotent. **With a test key the bill is a test record** (`test: true`): nobody is texted (see `smsDelivery`), no bank account can be linked or debited, and its pay page offers a simulated payment only, which settles it with `settledVia: \"TEST\"` and sends `bill.paid` with `test: true`. To pay it without a browser: `POST /v1/public/bills/{payToken}/test-pay`, no key; it answers 404 for a live bill.\n\nOpenAPI operation: createBill"
          },
          "response": [
            {
              "name": "201 The bill.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"description\": \"Advisory fee, October\",\n  \"amount\": 15000,\n  \"dueDate\": \"2026-11-01\",\n  \"payerNic\": \"199000000000\",\n  \"payerName\": \"Sample Payer\",\n  \"payerPhone\": \"0770000000\",\n  \"channels\": [\n    \"sms\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/bills",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "bills"
                  ]
                },
                "description": "The payer pays it on the hosted pay page from a Sri Lankan bank account. Amounts are JSON numbers in major units. Not idempotent. **With a test key the bill is a test record** (`test: true`): nobody is texted (see `smsDelivery`), no bank account can be linked or debited, and its pay page offers a simulated payment only, which settles it with `settledVia: \"TEST\"` and sends `bill.paid` with `test: true`. To pay it without a browser: `POST /v1/public/bills/{payToken}/test-pay`, no key; it answers 404 for a live bill.\n\nOpenAPI operation: createBill"
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b\",\n  \"ocr\": \"100000000018\",\n  \"payToken\": \"EXAMPLE_PAY_TOKEN_not_a_real_one\",\n  \"payLink\": \"/pay/EXAMPLE_PAY_TOKEN_not_a_real_one\",\n  \"payerNic\": \"199000000000\",\n  \"payerName\": \"Sample Payer\",\n  \"payerEmail\": null,\n  \"payerPhone\": \"0770000000\",\n  \"hasAttachment\": false,\n  \"attachmentName\": null,\n  \"billerName\": \"Example Wealth (Pvt) Ltd\",\n  \"description\": \"Advisory fee, October\",\n  \"amount\": 15000,\n  \"currency\": \"LKR\",\n  \"issuedAt\": \"2026-10-10T08:00:00.000Z\",\n  \"dueDate\": \"2026-11-01T00:00:00.000Z\",\n  \"status\": \"UNPAID\",\n  \"overdue\": false,\n  \"paidAt\": null,\n  \"paidAmount\": null,\n  \"paymentRef\": null,\n  \"settledVia\": null,\n  \"remindersSent\": 0,\n  \"lastReminderAt\": null,\n  \"proofStatus\": null,\n  \"proofRef\": null,\n  \"proofAmount\": null,\n  \"proofAt\": null,\n  \"proofNote\": null,\n  \"hasProofSlip\": false,\n  \"subscriptionId\": null,\n  \"proofName\": null,\n  \"scheduledFor\": null,\n  \"scheduled\": false,\n  \"allowInstallments\": false,\n  \"installmentOptions\": [],\n  \"installmentOf\": null,\n  \"installmentNo\": null,\n  \"installmentCount\": null,\n  \"createdAt\": \"2026-10-10T08:00:00.000Z\",\n  \"smsDelivery\": {\n    \"sent\": true,\n    \"destination\": \"*******000\"\n  }\n}"
            },
            {
              "name": "400 The request was refused: a field failed validation or a rule was broken.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"description\": \"Advisory fee, October\",\n  \"amount\": 15000,\n  \"dueDate\": \"2026-11-01\",\n  \"payerNic\": \"199000000000\",\n  \"payerName\": \"Sample Payer\",\n  \"payerPhone\": \"0770000000\",\n  \"channels\": [\n    \"sms\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/bills",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "bills"
                  ]
                },
                "description": "The payer pays it on the hosted pay page from a Sri Lankan bank account. Amounts are JSON numbers in major units. Not idempotent. **With a test key the bill is a test record** (`test: true`): nobody is texted (see `smsDelivery`), no bank account can be linked or debited, and its pay page offers a simulated payment only, which settles it with `settledVia: \"TEST\"` and sends `bill.paid` with `test: true`. To pay it without a browser: `POST /v1/public/bills/{payToken}/test-pay`, no key; it answers 404 for a live bill.\n\nOpenAPI operation: createBill"
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 400,\n  \"message\": [\n    \"sourceCurrency must be a 3-letter ISO code\"\n  ],\n  \"error\": \"Bad Request\"\n}"
            },
            {
              "name": "401 The API key is missing, wrong, revoked or expired.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"description\": \"Advisory fee, October\",\n  \"amount\": 15000,\n  \"dueDate\": \"2026-11-01\",\n  \"payerNic\": \"199000000000\",\n  \"payerName\": \"Sample Payer\",\n  \"payerPhone\": \"0770000000\",\n  \"channels\": [\n    \"sms\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/bills",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "bills"
                  ]
                },
                "description": "The payer pays it on the hosted pay page from a Sri Lankan bank account. Amounts are JSON numbers in major units. Not idempotent. **With a test key the bill is a test record** (`test: true`): nobody is texted (see `smsDelivery`), no bank account can be linked or debited, and its pay page offers a simulated payment only, which settles it with `settledVia: \"TEST\"` and sends `bill.paid` with `test: true`. To pay it without a browser: `POST /v1/public/bills/{payToken}/test-pay`, no key; it answers 404 for a live bill.\n\nOpenAPI operation: createBill"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 401,\n  \"message\": \"Invalid API key\",\n  \"error\": \"Unauthorized\"\n}"
            },
            {
              "name": "403 The key lacks the scope, the service is not enabled for your organisation, or the address is not on your IP whitelist.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"description\": \"Advisory fee, October\",\n  \"amount\": 15000,\n  \"dueDate\": \"2026-11-01\",\n  \"payerNic\": \"199000000000\",\n  \"payerName\": \"Sample Payer\",\n  \"payerPhone\": \"0770000000\",\n  \"channels\": [\n    \"sms\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/bills",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "bills"
                  ]
                },
                "description": "The payer pays it on the hosted pay page from a Sri Lankan bank account. Amounts are JSON numbers in major units. Not idempotent. **With a test key the bill is a test record** (`test: true`): nobody is texted (see `smsDelivery`), no bank account can be linked or debited, and its pay page offers a simulated payment only, which settles it with `settledVia: \"TEST\"` and sends `bill.paid` with `test: true`. To pay it without a browser: `POST /v1/public/bills/{payToken}/test-pay`, no key; it answers 404 for a live bill.\n\nOpenAPI operation: createBill"
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 403,\n  \"message\": \"The Remittance orders service is not enabled for your account\",\n  \"error\": \"Forbidden\"\n}"
            }
          ]
        },
        {
          "name": "List bills",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/bills",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "bills"
              ],
              "query": [
                {
                  "key": "status",
                  "value": "",
                  "description": "",
                  "disabled": true
                },
                {
                  "key": "payerNic",
                  "value": "",
                  "description": "",
                  "disabled": true
                },
                {
                  "key": "search",
                  "value": "",
                  "description": "An exact payer NIC or part of an OCR reference.",
                  "disabled": true
                },
                {
                  "key": "sort",
                  "value": "",
                  "description": "Defaults to created.",
                  "disabled": true
                },
                {
                  "key": "page",
                  "value": "",
                  "description": "1-based. Defaults to 1.",
                  "disabled": true
                },
                {
                  "key": "pageSize",
                  "value": "",
                  "description": "Defaults to 20.",
                  "disabled": true
                }
              ]
            },
            "description": "OpenAPI operation: listBills"
          },
          "response": [
            {
              "name": "200 A page of bills.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/bills",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "bills"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "description": "",
                      "disabled": true
                    },
                    {
                      "key": "payerNic",
                      "value": "",
                      "description": "",
                      "disabled": true
                    },
                    {
                      "key": "search",
                      "value": "",
                      "description": "An exact payer NIC or part of an OCR reference.",
                      "disabled": true
                    },
                    {
                      "key": "sort",
                      "value": "",
                      "description": "Defaults to created.",
                      "disabled": true
                    },
                    {
                      "key": "page",
                      "value": "",
                      "description": "1-based. Defaults to 1.",
                      "disabled": true
                    },
                    {
                      "key": "pageSize",
                      "value": "",
                      "description": "Defaults to 20.",
                      "disabled": true
                    }
                  ]
                },
                "description": "OpenAPI operation: listBills"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"items\": [\n    {\n      \"id\": \"9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b\",\n      \"ocr\": \"100000000018\",\n      \"payToken\": \"EXAMPLE_PAY_TOKEN_not_a_real_one\",\n      \"payLink\": \"/pay/EXAMPLE_PAY_TOKEN_not_a_real_one\",\n      \"payerNic\": \"199000000000\",\n      \"payerName\": \"Sample Payer\",\n      \"payerEmail\": null,\n      \"payerPhone\": \"0770000000\",\n      \"hasAttachment\": false,\n      \"attachmentName\": null,\n      \"billerName\": \"Example Wealth (Pvt) Ltd\",\n      \"description\": \"Advisory fee, October\",\n      \"amount\": 15000,\n      \"currency\": \"LKR\",\n      \"issuedAt\": \"2026-10-10T08:00:00.000Z\",\n      \"dueDate\": \"2026-11-01T00:00:00.000Z\",\n      \"status\": \"UNPAID\",\n      \"overdue\": false,\n      \"paidAt\": null,\n      \"paidAmount\": null,\n      \"paymentRef\": null,\n      \"settledVia\": null,\n      \"remindersSent\": 0,\n      \"lastReminderAt\": null,\n      \"proofStatus\": null,\n      \"proofRef\": null,\n      \"proofAmount\": null,\n      \"proofAt\": null,\n      \"proofNote\": null,\n      \"hasProofSlip\": false,\n      \"subscriptionId\": null,\n      \"proofName\": null,\n      \"scheduledFor\": null,\n      \"scheduled\": false,\n      \"allowInstallments\": false,\n      \"installmentOptions\": [],\n      \"installmentOf\": null,\n      \"installmentNo\": null,\n      \"installmentCount\": null,\n      \"createdAt\": \"2026-10-10T08:00:00.000Z\"\n    }\n  ],\n  \"total\": 1,\n  \"page\": 1,\n  \"pageSize\": 20\n}"
            },
            {
              "name": "401 The API key is missing, wrong, revoked or expired.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/bills",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "bills"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "description": "",
                      "disabled": true
                    },
                    {
                      "key": "payerNic",
                      "value": "",
                      "description": "",
                      "disabled": true
                    },
                    {
                      "key": "search",
                      "value": "",
                      "description": "An exact payer NIC or part of an OCR reference.",
                      "disabled": true
                    },
                    {
                      "key": "sort",
                      "value": "",
                      "description": "Defaults to created.",
                      "disabled": true
                    },
                    {
                      "key": "page",
                      "value": "",
                      "description": "1-based. Defaults to 1.",
                      "disabled": true
                    },
                    {
                      "key": "pageSize",
                      "value": "",
                      "description": "Defaults to 20.",
                      "disabled": true
                    }
                  ]
                },
                "description": "OpenAPI operation: listBills"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 401,\n  \"message\": \"Invalid API key\",\n  \"error\": \"Unauthorized\"\n}"
            },
            {
              "name": "403 The key lacks the scope, the service is not enabled for your organisation, or the address is not on your IP whitelist.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/bills",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "bills"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "description": "",
                      "disabled": true
                    },
                    {
                      "key": "payerNic",
                      "value": "",
                      "description": "",
                      "disabled": true
                    },
                    {
                      "key": "search",
                      "value": "",
                      "description": "An exact payer NIC or part of an OCR reference.",
                      "disabled": true
                    },
                    {
                      "key": "sort",
                      "value": "",
                      "description": "Defaults to created.",
                      "disabled": true
                    },
                    {
                      "key": "page",
                      "value": "",
                      "description": "1-based. Defaults to 1.",
                      "disabled": true
                    },
                    {
                      "key": "pageSize",
                      "value": "",
                      "description": "Defaults to 20.",
                      "disabled": true
                    }
                  ]
                },
                "description": "OpenAPI operation: listBills"
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 403,\n  \"message\": \"The Remittance orders service is not enabled for your account\",\n  \"error\": \"Forbidden\"\n}"
            }
          ]
        },
        {
          "name": "Read one bill",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/bills/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "bills",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "The bill id, or a payment link's id."
                }
              ]
            },
            "description": "Also reads the bill behind a payment link, whose id is the same.\n\nOpenAPI operation: getBill"
          },
          "response": [
            {
              "name": "200 The bill.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/bills/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "bills",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The bill id, or a payment link's id."
                    }
                  ]
                },
                "description": "Also reads the bill behind a payment link, whose id is the same.\n\nOpenAPI operation: getBill"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b\",\n  \"ocr\": \"100000000018\",\n  \"payToken\": \"EXAMPLE_PAY_TOKEN_not_a_real_one\",\n  \"payLink\": \"/pay/EXAMPLE_PAY_TOKEN_not_a_real_one\",\n  \"payerNic\": \"199000000000\",\n  \"payerName\": \"Sample Payer\",\n  \"payerEmail\": null,\n  \"payerPhone\": \"0770000000\",\n  \"hasAttachment\": false,\n  \"attachmentName\": null,\n  \"billerName\": \"Example Wealth (Pvt) Ltd\",\n  \"description\": \"Advisory fee, October\",\n  \"amount\": 15000,\n  \"currency\": \"LKR\",\n  \"issuedAt\": \"2026-10-10T08:00:00.000Z\",\n  \"dueDate\": \"2026-11-01T00:00:00.000Z\",\n  \"status\": \"UNPAID\",\n  \"overdue\": false,\n  \"paidAt\": null,\n  \"paidAmount\": null,\n  \"paymentRef\": null,\n  \"settledVia\": null,\n  \"remindersSent\": 0,\n  \"lastReminderAt\": null,\n  \"proofStatus\": null,\n  \"proofRef\": null,\n  \"proofAmount\": null,\n  \"proofAt\": null,\n  \"proofNote\": null,\n  \"hasProofSlip\": false,\n  \"subscriptionId\": null,\n  \"proofName\": null,\n  \"scheduledFor\": null,\n  \"scheduled\": false,\n  \"allowInstallments\": false,\n  \"installmentOptions\": [],\n  \"installmentOf\": null,\n  \"installmentNo\": null,\n  \"installmentCount\": null,\n  \"createdAt\": \"2026-10-10T08:00:00.000Z\"\n}"
            },
            {
              "name": "400 The request was refused: a field failed validation or a rule was broken.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/bills/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "bills",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The bill id, or a payment link's id."
                    }
                  ]
                },
                "description": "Also reads the bill behind a payment link, whose id is the same.\n\nOpenAPI operation: getBill"
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 400,\n  \"message\": [\n    \"sourceCurrency must be a 3-letter ISO code\"\n  ],\n  \"error\": \"Bad Request\"\n}"
            },
            {
              "name": "401 The API key is missing, wrong, revoked or expired.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/bills/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "bills",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The bill id, or a payment link's id."
                    }
                  ]
                },
                "description": "Also reads the bill behind a payment link, whose id is the same.\n\nOpenAPI operation: getBill"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 401,\n  \"message\": \"Invalid API key\",\n  \"error\": \"Unauthorized\"\n}"
            },
            {
              "name": "403 The key lacks the scope, the service is not enabled for your organisation, or the address is not on your IP whitelist.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/bills/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "bills",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The bill id, or a payment link's id."
                    }
                  ]
                },
                "description": "Also reads the bill behind a payment link, whose id is the same.\n\nOpenAPI operation: getBill"
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 403,\n  \"message\": \"The Remittance orders service is not enabled for your account\",\n  \"error\": \"Forbidden\"\n}"
            },
            {
              "name": "404 No such record in your organisation.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/bills/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "bills",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The bill id, or a payment link's id."
                    }
                  ]
                },
                "description": "Also reads the bill behind a payment link, whose id is the same.\n\nOpenAPI operation: getBill"
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 404,\n  \"message\": \"Order not found\",\n  \"error\": \"Not Found\"\n}"
            }
          ]
        },
        {
          "name": "Cancel a bill",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/bills/:id/cancel",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "bills",
                ":id",
                "cancel"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "The bill id."
                }
              ]
            },
            "description": "A paid bill cannot be cancelled.\n\nOpenAPI operation: cancelBill"
          },
          "response": [
            {
              "name": "201 The cancelled bill.",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/bills/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "bills",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The bill id."
                    }
                  ]
                },
                "description": "A paid bill cannot be cancelled.\n\nOpenAPI operation: cancelBill"
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b\",\n  \"ocr\": \"100000000018\",\n  \"payToken\": \"EXAMPLE_PAY_TOKEN_not_a_real_one\",\n  \"payLink\": \"/pay/EXAMPLE_PAY_TOKEN_not_a_real_one\",\n  \"payerNic\": \"199000000000\",\n  \"payerName\": \"Sample Payer\",\n  \"payerEmail\": null,\n  \"payerPhone\": \"0770000000\",\n  \"hasAttachment\": false,\n  \"attachmentName\": null,\n  \"billerName\": \"Example Wealth (Pvt) Ltd\",\n  \"description\": \"Advisory fee, October\",\n  \"amount\": 15000,\n  \"currency\": \"LKR\",\n  \"issuedAt\": \"2026-10-10T08:00:00.000Z\",\n  \"dueDate\": \"2026-11-01T00:00:00.000Z\",\n  \"status\": \"CANCELLED\",\n  \"overdue\": false,\n  \"paidAt\": null,\n  \"paidAmount\": null,\n  \"paymentRef\": null,\n  \"settledVia\": null,\n  \"remindersSent\": 0,\n  \"lastReminderAt\": null,\n  \"proofStatus\": null,\n  \"proofRef\": null,\n  \"proofAmount\": null,\n  \"proofAt\": null,\n  \"proofNote\": null,\n  \"hasProofSlip\": false,\n  \"subscriptionId\": null,\n  \"proofName\": null,\n  \"scheduledFor\": null,\n  \"scheduled\": false,\n  \"allowInstallments\": false,\n  \"installmentOptions\": [],\n  \"installmentOf\": null,\n  \"installmentNo\": null,\n  \"installmentCount\": null,\n  \"createdAt\": \"2026-10-10T08:00:00.000Z\"\n}"
            },
            {
              "name": "400 The request was refused: a field failed validation or a rule was broken.",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/bills/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "bills",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The bill id."
                    }
                  ]
                },
                "description": "A paid bill cannot be cancelled.\n\nOpenAPI operation: cancelBill"
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 400,\n  \"message\": [\n    \"sourceCurrency must be a 3-letter ISO code\"\n  ],\n  \"error\": \"Bad Request\"\n}"
            },
            {
              "name": "401 The API key is missing, wrong, revoked or expired.",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/bills/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "bills",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The bill id."
                    }
                  ]
                },
                "description": "A paid bill cannot be cancelled.\n\nOpenAPI operation: cancelBill"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 401,\n  \"message\": \"Invalid API key\",\n  \"error\": \"Unauthorized\"\n}"
            },
            {
              "name": "403 The key lacks the scope, the service is not enabled for your organisation, or the address is not on your IP whitelist.",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/bills/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "bills",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The bill id."
                    }
                  ]
                },
                "description": "A paid bill cannot be cancelled.\n\nOpenAPI operation: cancelBill"
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 403,\n  \"message\": \"The Remittance orders service is not enabled for your account\",\n  \"error\": \"Forbidden\"\n}"
            },
            {
              "name": "404 No such record in your organisation.",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/bills/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "bills",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The bill id."
                    }
                  ]
                },
                "description": "A paid bill cannot be cancelled.\n\nOpenAPI operation: cancelBill"
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 404,\n  \"message\": \"Order not found\",\n  \"error\": \"Not Found\"\n}"
            }
          ]
        },
        {
          "name": "Create a payment link",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"description\": \"Portfolio top-up\",\n  \"amount\": 25000,\n  \"customerName\": \"Sample Payer\",\n  \"customerPhone\": \"0770000000\",\n  \"expiresInDays\": 7\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/payment-links",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "payment-links"
              ]
            },
            "description": "A link is a bill with no payer named. Send the customer `url`. Not idempotent.\n\nOpenAPI operation: createPaymentLink"
          },
          "response": [
            {
              "name": "201 The link.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"description\": \"Portfolio top-up\",\n  \"amount\": 25000,\n  \"customerName\": \"Sample Payer\",\n  \"customerPhone\": \"0770000000\",\n  \"expiresInDays\": 7\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/payment-links",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payment-links"
                  ]
                },
                "description": "A link is a bill with no payer named. Send the customer `url`. Not idempotent.\n\nOpenAPI operation: createPaymentLink"
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b\",\n  \"ocr\": \"100000000018\",\n  \"payToken\": \"EXAMPLE_PAY_TOKEN_not_a_real_one\",\n  \"url\": \"https://pay.anybanq.lk/pay/EXAMPLE_PAY_TOKEN_not_a_real_one\",\n  \"description\": \"Portfolio top-up\",\n  \"amount\": 25000,\n  \"currency\": \"LKR\",\n  \"status\": \"unpaid\",\n  \"customerName\": \"Sample Payer\",\n  \"customerPhone\": \"0770000000\",\n  \"createdAt\": \"2026-10-10T08:00:00.000Z\",\n  \"expiresAt\": \"2026-10-17T08:00:00.000Z\",\n  \"paidAt\": null\n}"
            },
            {
              "name": "400 The request was refused: a field failed validation or a rule was broken.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"description\": \"Portfolio top-up\",\n  \"amount\": 25000,\n  \"customerName\": \"Sample Payer\",\n  \"customerPhone\": \"0770000000\",\n  \"expiresInDays\": 7\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/payment-links",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payment-links"
                  ]
                },
                "description": "A link is a bill with no payer named. Send the customer `url`. Not idempotent.\n\nOpenAPI operation: createPaymentLink"
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 400,\n  \"message\": [\n    \"sourceCurrency must be a 3-letter ISO code\"\n  ],\n  \"error\": \"Bad Request\"\n}"
            },
            {
              "name": "401 The API key is missing, wrong, revoked or expired.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"description\": \"Portfolio top-up\",\n  \"amount\": 25000,\n  \"customerName\": \"Sample Payer\",\n  \"customerPhone\": \"0770000000\",\n  \"expiresInDays\": 7\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/payment-links",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payment-links"
                  ]
                },
                "description": "A link is a bill with no payer named. Send the customer `url`. Not idempotent.\n\nOpenAPI operation: createPaymentLink"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 401,\n  \"message\": \"Invalid API key\",\n  \"error\": \"Unauthorized\"\n}"
            },
            {
              "name": "403 The key lacks the scope, the service is not enabled for your organisation, or the address is not on your IP whitelist.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"description\": \"Portfolio top-up\",\n  \"amount\": 25000,\n  \"customerName\": \"Sample Payer\",\n  \"customerPhone\": \"0770000000\",\n  \"expiresInDays\": 7\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/payment-links",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payment-links"
                  ]
                },
                "description": "A link is a bill with no payer named. Send the customer `url`. Not idempotent.\n\nOpenAPI operation: createPaymentLink"
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 403,\n  \"message\": \"The Remittance orders service is not enabled for your account\",\n  \"error\": \"Forbidden\"\n}"
            }
          ]
        },
        {
          "name": "List payment links",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/payment-links",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "payment-links"
              ],
              "query": [
                {
                  "key": "status",
                  "value": "",
                  "description": "",
                  "disabled": true
                },
                {
                  "key": "page",
                  "value": "",
                  "description": "1-based. Defaults to 1.",
                  "disabled": true
                },
                {
                  "key": "pageSize",
                  "value": "",
                  "description": "Defaults to 20.",
                  "disabled": true
                }
              ]
            },
            "description": "There is no route for a single link; read one with GET /v1/bills/{id}.\n\nOpenAPI operation: listPaymentLinks"
          },
          "response": [
            {
              "name": "200 A page of links.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/payment-links",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payment-links"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "description": "",
                      "disabled": true
                    },
                    {
                      "key": "page",
                      "value": "",
                      "description": "1-based. Defaults to 1.",
                      "disabled": true
                    },
                    {
                      "key": "pageSize",
                      "value": "",
                      "description": "Defaults to 20.",
                      "disabled": true
                    }
                  ]
                },
                "description": "There is no route for a single link; read one with GET /v1/bills/{id}.\n\nOpenAPI operation: listPaymentLinks"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"items\": [\n    {\n      \"id\": \"9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b\",\n      \"ocr\": \"100000000018\",\n      \"payToken\": \"EXAMPLE_PAY_TOKEN_not_a_real_one\",\n      \"url\": \"https://pay.anybanq.lk/pay/EXAMPLE_PAY_TOKEN_not_a_real_one\",\n      \"description\": \"Portfolio top-up\",\n      \"amount\": 25000,\n      \"currency\": \"LKR\",\n      \"status\": \"unpaid\",\n      \"customerName\": \"Sample Payer\",\n      \"customerPhone\": \"0770000000\",\n      \"createdAt\": \"2026-10-10T08:00:00.000Z\",\n      \"expiresAt\": \"2026-10-17T08:00:00.000Z\",\n      \"paidAt\": null\n    }\n  ],\n  \"total\": 1,\n  \"page\": 1,\n  \"pageSize\": 20\n}"
            },
            {
              "name": "401 The API key is missing, wrong, revoked or expired.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/payment-links",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payment-links"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "description": "",
                      "disabled": true
                    },
                    {
                      "key": "page",
                      "value": "",
                      "description": "1-based. Defaults to 1.",
                      "disabled": true
                    },
                    {
                      "key": "pageSize",
                      "value": "",
                      "description": "Defaults to 20.",
                      "disabled": true
                    }
                  ]
                },
                "description": "There is no route for a single link; read one with GET /v1/bills/{id}.\n\nOpenAPI operation: listPaymentLinks"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 401,\n  \"message\": \"Invalid API key\",\n  \"error\": \"Unauthorized\"\n}"
            },
            {
              "name": "403 The key lacks the scope, the service is not enabled for your organisation, or the address is not on your IP whitelist.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/payment-links",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payment-links"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "description": "",
                      "disabled": true
                    },
                    {
                      "key": "page",
                      "value": "",
                      "description": "1-based. Defaults to 1.",
                      "disabled": true
                    },
                    {
                      "key": "pageSize",
                      "value": "",
                      "description": "Defaults to 20.",
                      "disabled": true
                    }
                  ]
                },
                "description": "There is no route for a single link; read one with GET /v1/bills/{id}.\n\nOpenAPI operation: listPaymentLinks"
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 403,\n  \"message\": \"The Remittance orders service is not enabled for your account\",\n  \"error\": \"Forbidden\"\n}"
            }
          ]
        },
        {
          "name": "Take a link out of circulation",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/payment-links/:id/cancel",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "payment-links",
                ":id",
                "cancel"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "The link id."
                }
              ]
            },
            "description": "OpenAPI operation: cancelPaymentLink"
          },
          "response": [
            {
              "name": "201 The cancelled link.",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/payment-links/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payment-links",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The link id."
                    }
                  ]
                },
                "description": "OpenAPI operation: cancelPaymentLink"
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b\",\n  \"ocr\": \"100000000018\",\n  \"payToken\": \"EXAMPLE_PAY_TOKEN_not_a_real_one\",\n  \"url\": \"https://pay.anybanq.lk/pay/EXAMPLE_PAY_TOKEN_not_a_real_one\",\n  \"description\": \"Portfolio top-up\",\n  \"amount\": 25000,\n  \"currency\": \"LKR\",\n  \"status\": \"cancelled\",\n  \"customerName\": \"Sample Payer\",\n  \"customerPhone\": \"0770000000\",\n  \"createdAt\": \"2026-10-10T08:00:00.000Z\",\n  \"expiresAt\": \"2026-10-17T08:00:00.000Z\",\n  \"paidAt\": null\n}"
            },
            {
              "name": "400 The request was refused: a field failed validation or a rule was broken.",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/payment-links/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payment-links",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The link id."
                    }
                  ]
                },
                "description": "OpenAPI operation: cancelPaymentLink"
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 400,\n  \"message\": [\n    \"sourceCurrency must be a 3-letter ISO code\"\n  ],\n  \"error\": \"Bad Request\"\n}"
            },
            {
              "name": "401 The API key is missing, wrong, revoked or expired.",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/payment-links/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payment-links",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The link id."
                    }
                  ]
                },
                "description": "OpenAPI operation: cancelPaymentLink"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 401,\n  \"message\": \"Invalid API key\",\n  \"error\": \"Unauthorized\"\n}"
            },
            {
              "name": "403 The key lacks the scope, the service is not enabled for your organisation, or the address is not on your IP whitelist.",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/payment-links/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payment-links",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The link id."
                    }
                  ]
                },
                "description": "OpenAPI operation: cancelPaymentLink"
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 403,\n  \"message\": \"The Remittance orders service is not enabled for your account\",\n  \"error\": \"Forbidden\"\n}"
            },
            {
              "name": "404 No such record in your organisation.",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/payment-links/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payment-links",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The link id."
                    }
                  ]
                },
                "description": "OpenAPI operation: cancelPaymentLink"
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 404,\n  \"message\": \"Order not found\",\n  \"error\": \"Not Found\"\n}"
            }
          ]
        },
        {
          "name": "Sign a product into a pay-button code",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"description\": \"Portfolio top-up\",\n  \"amount\": 25000\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/payment-links/button",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "payment-links",
                "button"
              ]
            },
            "description": "Nothing is stored. The code is safe to publish: the price is signed into it, so a page cannot change what it charges.\n\nOpenAPI operation: createPayButtonCode"
          },
          "response": [
            {
              "name": "200 The code.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"description\": \"Portfolio top-up\",\n  \"amount\": 25000\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/payment-links/button",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payment-links",
                    "button"
                  ]
                },
                "description": "Nothing is stored. The code is safe to publish: the price is signed into it, so a page cannot change what it charges.\n\nOpenAPI operation: createPayButtonCode"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"code\": \"EXAMPLE_PAY_BUTTON_CODE.not_a_real_signature\",\n  \"product\": {\n    \"v\": 1,\n    \"o\": \"00000000-0000-4000-8000-000000000000\",\n    \"a\": 25000,\n    \"c\": \"LKR\",\n    \"d\": \"Portfolio top-up\",\n    \"x\": 30\n  }\n}"
            },
            {
              "name": "400 The request was refused: a field failed validation or a rule was broken.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"description\": \"Portfolio top-up\",\n  \"amount\": 25000\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/payment-links/button",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payment-links",
                    "button"
                  ]
                },
                "description": "Nothing is stored. The code is safe to publish: the price is signed into it, so a page cannot change what it charges.\n\nOpenAPI operation: createPayButtonCode"
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 400,\n  \"message\": [\n    \"sourceCurrency must be a 3-letter ISO code\"\n  ],\n  \"error\": \"Bad Request\"\n}"
            },
            {
              "name": "401 The API key is missing, wrong, revoked or expired.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"description\": \"Portfolio top-up\",\n  \"amount\": 25000\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/payment-links/button",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payment-links",
                    "button"
                  ]
                },
                "description": "Nothing is stored. The code is safe to publish: the price is signed into it, so a page cannot change what it charges.\n\nOpenAPI operation: createPayButtonCode"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 401,\n  \"message\": \"Invalid API key\",\n  \"error\": \"Unauthorized\"\n}"
            },
            {
              "name": "403 The key lacks the scope, the service is not enabled for your organisation, or the address is not on your IP whitelist.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"description\": \"Portfolio top-up\",\n  \"amount\": 25000\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/payment-links/button",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "payment-links",
                    "button"
                  ]
                },
                "description": "Nothing is stored. The code is safe to publish: the price is signed into it, so a page cannot change what it charges.\n\nOpenAPI operation: createPayButtonCode"
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 403,\n  \"message\": \"The Remittance orders service is not enabled for your account\",\n  \"error\": \"Forbidden\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Verification",
      "description": "Hosted identity verification from a published workflow. Needs the `verifications` scope on a scoped key.",
      "item": [
        {
          "name": "Start a hosted verification for one person",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"subjectRef\": \"customer-42\",\n  \"ttlHours\": 2\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/workflows/:id/sessions",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "workflows",
                ":id",
                "sessions"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "The workflow id."
                }
              ]
            },
            "description": "The workflow must be PUBLISHED. Give the browser `token`, or send the person to `hostedUrl`.\n\nOpenAPI operation: createVerificationSession"
          },
          "response": [
            {
              "name": "201 The session.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"subjectRef\": \"customer-42\",\n  \"ttlHours\": 2\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/workflows/:id/sessions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "workflows",
                    ":id",
                    "sessions"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The workflow id."
                    }
                  ]
                },
                "description": "The workflow must be PUBLISHED. Give the browser `token`, or send the person to `hostedUrl`.\n\nOpenAPI operation: createVerificationSession"
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"d0e1f2a3-b4c5-4d6e-8f7a-8b9c0d1e2f3a\",\n  \"token\": \"vs_EXAMPLE_not_a_real_session_token\",\n  \"status\": \"PENDING\",\n  \"subjectRef\": \"customer-42\",\n  \"runId\": null,\n  \"reusable\": false,\n  \"expiresAt\": \"2026-10-10T10:00:00.000Z\",\n  \"createdAt\": \"2026-10-10T08:00:00.000Z\",\n  \"hostedUrl\": \"https://verifia.anybanq.lk/s/vs_EXAMPLE_not_a_real_session_token\",\n  \"embedUrl\": \"https://verifia.anybanq.lk/embed/vs_EXAMPLE_not_a_real_session_token\",\n  \"embedSnippet\": \"<iframe src=\\\"https://verifia.anybanq.lk/embed/vs_EXAMPLE_not_a_real_session_token\\\" width=\\\"420\\\" height=\\\"640\\\" style=\\\"border:0\\\" allow=\\\"camera\\\"></iframe>\",\n  \"sdkSnippet\": \"<script src=\\\"https://verifia.anybanq.lk/sdk/v1/verifia.js\\\"></script>\\n<script>\\n  Verifia.open({ … });\\n</script>\"\n}"
            },
            {
              "name": "400 The request was refused: a field failed validation or a rule was broken.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"subjectRef\": \"customer-42\",\n  \"ttlHours\": 2\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/workflows/:id/sessions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "workflows",
                    ":id",
                    "sessions"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The workflow id."
                    }
                  ]
                },
                "description": "The workflow must be PUBLISHED. Give the browser `token`, or send the person to `hostedUrl`.\n\nOpenAPI operation: createVerificationSession"
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 400,\n  \"message\": [\n    \"sourceCurrency must be a 3-letter ISO code\"\n  ],\n  \"error\": \"Bad Request\"\n}"
            },
            {
              "name": "401 The API key is missing, wrong, revoked or expired.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"subjectRef\": \"customer-42\",\n  \"ttlHours\": 2\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/workflows/:id/sessions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "workflows",
                    ":id",
                    "sessions"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The workflow id."
                    }
                  ]
                },
                "description": "The workflow must be PUBLISHED. Give the browser `token`, or send the person to `hostedUrl`.\n\nOpenAPI operation: createVerificationSession"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 401,\n  \"message\": \"Invalid API key\",\n  \"error\": \"Unauthorized\"\n}"
            },
            {
              "name": "403 The key lacks the scope, the service is not enabled for your organisation, or the address is not on your IP whitelist.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"subjectRef\": \"customer-42\",\n  \"ttlHours\": 2\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/workflows/:id/sessions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "workflows",
                    ":id",
                    "sessions"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The workflow id."
                    }
                  ]
                },
                "description": "The workflow must be PUBLISHED. Give the browser `token`, or send the person to `hostedUrl`.\n\nOpenAPI operation: createVerificationSession"
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 403,\n  \"message\": \"The Remittance orders service is not enabled for your account\",\n  \"error\": \"Forbidden\"\n}"
            },
            {
              "name": "404 No such record in your organisation.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"subjectRef\": \"customer-42\",\n  \"ttlHours\": 2\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/workflows/:id/sessions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "workflows",
                    ":id",
                    "sessions"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The workflow id."
                    }
                  ]
                },
                "description": "The workflow must be PUBLISHED. Give the browser `token`, or send the person to `hostedUrl`.\n\nOpenAPI operation: createVerificationSession"
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 404,\n  \"message\": \"Order not found\",\n  \"error\": \"Not Found\"\n}"
            }
          ]
        },
        {
          "name": "List the latest 50 sessions of a workflow",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/workflows/:id/sessions",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "workflows",
                ":id",
                "sessions"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "The workflow id."
                }
              ]
            },
            "description": "OpenAPI operation: listVerificationSessions"
          },
          "response": [
            {
              "name": "200 Sessions, newest first.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/workflows/:id/sessions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "workflows",
                    ":id",
                    "sessions"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The workflow id."
                    }
                  ]
                },
                "description": "OpenAPI operation: listVerificationSessions"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "[\n  {\n    \"id\": \"d0e1f2a3-b4c5-4d6e-8f7a-8b9c0d1e2f3a\",\n    \"token\": \"vs_EXAMPLE_not_a_real_session_token\",\n    \"status\": \"PENDING\",\n    \"subjectRef\": \"customer-42\",\n    \"runId\": null,\n    \"reusable\": false,\n    \"expiresAt\": \"2026-10-10T10:00:00.000Z\",\n    \"createdAt\": \"2026-10-10T08:00:00.000Z\",\n    \"hostedUrl\": \"https://verifia.anybanq.lk/s/vs_EXAMPLE_not_a_real_session_token\",\n    \"embedUrl\": \"https://verifia.anybanq.lk/embed/vs_EXAMPLE_not_a_real_session_token\",\n    \"embedSnippet\": \"<iframe src=\\\"https://verifia.anybanq.lk/embed/vs_EXAMPLE_not_a_real_session_token\\\" width=\\\"420\\\" height=\\\"640\\\" style=\\\"border:0\\\" allow=\\\"camera\\\"></iframe>\",\n    \"sdkSnippet\": \"<script src=\\\"https://verifia.anybanq.lk/sdk/v1/verifia.js\\\"></script>\\n<script>\\n  Verifia.open({ … });\\n</script>\"\n  }\n]"
            },
            {
              "name": "400 The request was refused: a field failed validation or a rule was broken.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/workflows/:id/sessions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "workflows",
                    ":id",
                    "sessions"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The workflow id."
                    }
                  ]
                },
                "description": "OpenAPI operation: listVerificationSessions"
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 400,\n  \"message\": [\n    \"sourceCurrency must be a 3-letter ISO code\"\n  ],\n  \"error\": \"Bad Request\"\n}"
            },
            {
              "name": "401 The API key is missing, wrong, revoked or expired.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/workflows/:id/sessions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "workflows",
                    ":id",
                    "sessions"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The workflow id."
                    }
                  ]
                },
                "description": "OpenAPI operation: listVerificationSessions"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 401,\n  \"message\": \"Invalid API key\",\n  \"error\": \"Unauthorized\"\n}"
            },
            {
              "name": "403 The key lacks the scope, the service is not enabled for your organisation, or the address is not on your IP whitelist.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/workflows/:id/sessions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "workflows",
                    ":id",
                    "sessions"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The workflow id."
                    }
                  ]
                },
                "description": "OpenAPI operation: listVerificationSessions"
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 403,\n  \"message\": \"The Remittance orders service is not enabled for your account\",\n  \"error\": \"Forbidden\"\n}"
            },
            {
              "name": "404 No such record in your organisation.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/workflows/:id/sessions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "workflows",
                    ":id",
                    "sessions"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "",
                      "description": "The workflow id."
                    }
                  ]
                },
                "description": "OpenAPI operation: listVerificationSessions"
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"statusCode\": 404,\n  \"message\": \"Order not found\",\n  \"error\": \"Not Found\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Webhooks (sent to your endpoint)",
      "description": "Example deliveries for testing your own webhook handler. Set {{webhookUrl}} to your endpoint and {{webhookSecret}} to any test secret your handler is using. Each request is signed before it is sent. The sentAt in the examples is fixed, so a handler that refuses old deliveries will refuse these unless you update it.",
      "item": [
        {
          "name": "remittance.order.created",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// Sign the body exactly as the API does: hex HMAC-SHA256 of the raw bytes,",
                  "// keyed with the webhook secret, sent as x-divp-signature: sha256=<hex>.",
                  "const secret = pm.collectionVariables.get('webhookSecret');",
                  "const body = pm.request.body.raw;",
                  "const hex = CryptoJS.HmacSHA256(body, secret).toString(CryptoJS.enc.Hex);",
                  "pm.request.headers.upsert({ key: 'x-divp-signature', value: 'sha256=' + hex });"
                ]
              }
            }
          ],
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "x-divp-event",
                "value": "remittance.order.created"
              },
              {
                "key": "x-divp-delivery-id",
                "value": "0f2c6f0e-8a52-4a0e-9d3c-5a4b3c2d1e0f"
              },
              {
                "key": "x-divp-attempt",
                "value": "1"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\"event\":\"remittance.order.created\",\"data\":{\"orderId\":\"3f2b8c1e-5d44-4a7e-9a36-0b1c2d3e4f50\",\"externalRef\":\"transfer-1001\",\"status\":\"AWAITING_PAYMENT\",\"sandbox\":true,\"send\":{\"amountMinor\":\"10000\",\"currency\":\"USD\"},\"receive\":{\"amountMinor\":\"2987500\",\"currency\":\"LKR\"},\"payoutStatus\":null,\"payoutRule\":null,\"settledAt\":null,\"failureReason\":null,\"occurredAt\":\"2026-10-10T08:00:00.000Z\"},\"sentAt\":\"2026-10-10T08:00:00.000Z\"}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{webhookUrl}}",
              "host": [
                "{{webhookUrl}}"
              ]
            },
            "description": "An order was made.\n\nSends this example to {{webhookUrl}} signed with {{webhookSecret}}. It never goes to AnyBanQ."
          },
          "response": []
        },
        {
          "name": "remittance.order.in_review",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// Sign the body exactly as the API does: hex HMAC-SHA256 of the raw bytes,",
                  "// keyed with the webhook secret, sent as x-divp-signature: sha256=<hex>.",
                  "const secret = pm.collectionVariables.get('webhookSecret');",
                  "const body = pm.request.body.raw;",
                  "const hex = CryptoJS.HmacSHA256(body, secret).toString(CryptoJS.enc.Hex);",
                  "pm.request.headers.upsert({ key: 'x-divp-signature', value: 'sha256=' + hex });"
                ]
              }
            }
          ],
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "x-divp-event",
                "value": "remittance.order.in_review"
              },
              {
                "key": "x-divp-delivery-id",
                "value": "0f2c6f0e-8a52-4a0e-9d3c-5a4b3c2d1e0f"
              },
              {
                "key": "x-divp-attempt",
                "value": "1"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\"event\":\"remittance.order.in_review\",\"data\":{\"orderId\":\"3f2b8c1e-5d44-4a7e-9a36-0b1c2d3e4f50\",\"externalRef\":\"transfer-1001\",\"status\":\"IN_REVIEW\",\"sandbox\":true,\"send\":{\"amountMinor\":\"10000\",\"currency\":\"USD\"},\"receive\":{\"amountMinor\":\"2987500\",\"currency\":\"LKR\"},\"payoutStatus\":null,\"payoutRule\":null,\"settledAt\":null,\"failureReason\":null,\"occurredAt\":\"2026-10-10T08:00:00.000Z\"},\"sentAt\":\"2026-10-10T08:00:00.000Z\"}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{webhookUrl}}",
              "host": [
                "{{webhookUrl}}"
              ]
            },
            "description": "Screening held the order for a person to decide.\n\nSends this example to {{webhookUrl}} signed with {{webhookSecret}}. It never goes to AnyBanQ."
          },
          "response": []
        },
        {
          "name": "remittance.order.awaiting_payment",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// Sign the body exactly as the API does: hex HMAC-SHA256 of the raw bytes,",
                  "// keyed with the webhook secret, sent as x-divp-signature: sha256=<hex>.",
                  "const secret = pm.collectionVariables.get('webhookSecret');",
                  "const body = pm.request.body.raw;",
                  "const hex = CryptoJS.HmacSHA256(body, secret).toString(CryptoJS.enc.Hex);",
                  "pm.request.headers.upsert({ key: 'x-divp-signature', value: 'sha256=' + hex });"
                ]
              }
            }
          ],
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "x-divp-event",
                "value": "remittance.order.awaiting_payment"
              },
              {
                "key": "x-divp-delivery-id",
                "value": "0f2c6f0e-8a52-4a0e-9d3c-5a4b3c2d1e0f"
              },
              {
                "key": "x-divp-attempt",
                "value": "1"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\"event\":\"remittance.order.awaiting_payment\",\"data\":{\"orderId\":\"3f2b8c1e-5d44-4a7e-9a36-0b1c2d3e4f50\",\"externalRef\":\"transfer-1001\",\"status\":\"AWAITING_PAYMENT\",\"sandbox\":true,\"send\":{\"amountMinor\":\"10000\",\"currency\":\"USD\"},\"receive\":{\"amountMinor\":\"2987500\",\"currency\":\"LKR\"},\"payoutStatus\":null,\"payoutRule\":null,\"settledAt\":null,\"failureReason\":null,\"occurredAt\":\"2026-10-10T08:00:00.000Z\"},\"sentAt\":\"2026-10-10T08:00:00.000Z\"}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{webhookUrl}}",
              "host": [
                "{{webhookUrl}}"
              ]
            },
            "description": "A held order was released and can be paid.\n\nSends this example to {{webhookUrl}} signed with {{webhookSecret}}. It never goes to AnyBanQ."
          },
          "response": []
        },
        {
          "name": "remittance.order.paying",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// Sign the body exactly as the API does: hex HMAC-SHA256 of the raw bytes,",
                  "// keyed with the webhook secret, sent as x-divp-signature: sha256=<hex>.",
                  "const secret = pm.collectionVariables.get('webhookSecret');",
                  "const body = pm.request.body.raw;",
                  "const hex = CryptoJS.HmacSHA256(body, secret).toString(CryptoJS.enc.Hex);",
                  "pm.request.headers.upsert({ key: 'x-divp-signature', value: 'sha256=' + hex });"
                ]
              }
            }
          ],
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "x-divp-event",
                "value": "remittance.order.paying"
              },
              {
                "key": "x-divp-delivery-id",
                "value": "0f2c6f0e-8a52-4a0e-9d3c-5a4b3c2d1e0f"
              },
              {
                "key": "x-divp-attempt",
                "value": "1"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\"event\":\"remittance.order.paying\",\"data\":{\"orderId\":\"3f2b8c1e-5d44-4a7e-9a36-0b1c2d3e4f50\",\"externalRef\":\"transfer-1001\",\"status\":\"PAYING\",\"sandbox\":true,\"send\":{\"amountMinor\":\"10000\",\"currency\":\"USD\"},\"receive\":{\"amountMinor\":\"2987500\",\"currency\":\"LKR\"},\"payoutStatus\":null,\"payoutRule\":null,\"settledAt\":null,\"failureReason\":null,\"occurredAt\":\"2026-10-10T08:00:00.000Z\"},\"sentAt\":\"2026-10-10T08:00:00.000Z\"}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{webhookUrl}}",
              "host": [
                "{{webhookUrl}}"
              ]
            },
            "description": "The sender is on the card page.\n\nSends this example to {{webhookUrl}} signed with {{webhookSecret}}. It never goes to AnyBanQ."
          },
          "response": []
        },
        {
          "name": "remittance.order.collected",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// Sign the body exactly as the API does: hex HMAC-SHA256 of the raw bytes,",
                  "// keyed with the webhook secret, sent as x-divp-signature: sha256=<hex>.",
                  "const secret = pm.collectionVariables.get('webhookSecret');",
                  "const body = pm.request.body.raw;",
                  "const hex = CryptoJS.HmacSHA256(body, secret).toString(CryptoJS.enc.Hex);",
                  "pm.request.headers.upsert({ key: 'x-divp-signature', value: 'sha256=' + hex });"
                ]
              }
            }
          ],
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "x-divp-event",
                "value": "remittance.order.collected"
              },
              {
                "key": "x-divp-delivery-id",
                "value": "0f2c6f0e-8a52-4a0e-9d3c-5a4b3c2d1e0f"
              },
              {
                "key": "x-divp-attempt",
                "value": "1"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\"event\":\"remittance.order.collected\",\"data\":{\"orderId\":\"3f2b8c1e-5d44-4a7e-9a36-0b1c2d3e4f50\",\"externalRef\":\"transfer-1001\",\"status\":\"COLLECTED\",\"sandbox\":true,\"send\":{\"amountMinor\":\"10000\",\"currency\":\"USD\"},\"receive\":{\"amountMinor\":\"2987500\",\"currency\":\"LKR\"},\"payoutStatus\":null,\"payoutRule\":\"AFTER_SETTLEMENT\",\"settledAt\":null,\"failureReason\":null,\"occurredAt\":\"2026-10-10T08:00:00.000Z\"},\"sentAt\":\"2026-10-10T08:00:00.000Z\"}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{webhookUrl}}",
              "host": [
                "{{webhookUrl}}"
              ]
            },
            "description": "The bank authorised the card payment.\n\nSends this example to {{webhookUrl}} signed with {{webhookSecret}}. It never goes to AnyBanQ."
          },
          "response": []
        },
        {
          "name": "remittance.order.settled",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// Sign the body exactly as the API does: hex HMAC-SHA256 of the raw bytes,",
                  "// keyed with the webhook secret, sent as x-divp-signature: sha256=<hex>.",
                  "const secret = pm.collectionVariables.get('webhookSecret');",
                  "const body = pm.request.body.raw;",
                  "const hex = CryptoJS.HmacSHA256(body, secret).toString(CryptoJS.enc.Hex);",
                  "pm.request.headers.upsert({ key: 'x-divp-signature', value: 'sha256=' + hex });"
                ]
              }
            }
          ],
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "x-divp-event",
                "value": "remittance.order.settled"
              },
              {
                "key": "x-divp-delivery-id",
                "value": "0f2c6f0e-8a52-4a0e-9d3c-5a4b3c2d1e0f"
              },
              {
                "key": "x-divp-attempt",
                "value": "1"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\"event\":\"remittance.order.settled\",\"data\":{\"orderId\":\"3f2b8c1e-5d44-4a7e-9a36-0b1c2d3e4f50\",\"externalRef\":\"transfer-1001\",\"status\":\"SETTLED\",\"sandbox\":true,\"send\":{\"amountMinor\":\"10000\",\"currency\":\"USD\"},\"receive\":{\"amountMinor\":\"2987500\",\"currency\":\"LKR\"},\"payoutStatus\":null,\"payoutRule\":\"AFTER_SETTLEMENT\",\"settledAt\":\"2026-10-10T08:00:00.000Z\",\"failureReason\":null,\"occurredAt\":\"2026-10-10T08:00:00.000Z\"},\"sentAt\":\"2026-10-10T08:00:00.000Z\"}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{webhookUrl}}",
              "host": [
                "{{webhookUrl}}"
              ]
            },
            "description": "The bank's settlement file shows the sender's money arrived.\n\nSends this example to {{webhookUrl}} signed with {{webhookSecret}}. It never goes to AnyBanQ."
          },
          "response": []
        },
        {
          "name": "remittance.order.payout_instructed",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// Sign the body exactly as the API does: hex HMAC-SHA256 of the raw bytes,",
                  "// keyed with the webhook secret, sent as x-divp-signature: sha256=<hex>.",
                  "const secret = pm.collectionVariables.get('webhookSecret');",
                  "const body = pm.request.body.raw;",
                  "const hex = CryptoJS.HmacSHA256(body, secret).toString(CryptoJS.enc.Hex);",
                  "pm.request.headers.upsert({ key: 'x-divp-signature', value: 'sha256=' + hex });"
                ]
              }
            }
          ],
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "x-divp-event",
                "value": "remittance.order.payout_instructed"
              },
              {
                "key": "x-divp-delivery-id",
                "value": "0f2c6f0e-8a52-4a0e-9d3c-5a4b3c2d1e0f"
              },
              {
                "key": "x-divp-attempt",
                "value": "1"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\"event\":\"remittance.order.payout_instructed\",\"data\":{\"orderId\":\"3f2b8c1e-5d44-4a7e-9a36-0b1c2d3e4f50\",\"externalRef\":\"transfer-1001\",\"status\":\"PAYOUT_INSTRUCTED\",\"sandbox\":true,\"send\":{\"amountMinor\":\"10000\",\"currency\":\"USD\"},\"receive\":{\"amountMinor\":\"2987500\",\"currency\":\"LKR\"},\"payoutStatus\":null,\"payoutRule\":\"AFTER_SETTLEMENT\",\"settledAt\":\"2026-10-10T08:00:00.000Z\",\"failureReason\":null,\"occurredAt\":\"2026-10-10T08:00:00.000Z\"},\"sentAt\":\"2026-10-10T08:00:00.000Z\"}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{webhookUrl}}",
              "host": [
                "{{webhookUrl}}"
              ]
            },
            "description": "The instruction to pay the recipient was made.\n\nSends this example to {{webhookUrl}} signed with {{webhookSecret}}. It never goes to AnyBanQ."
          },
          "response": []
        },
        {
          "name": "remittance.order.completed",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// Sign the body exactly as the API does: hex HMAC-SHA256 of the raw bytes,",
                  "// keyed with the webhook secret, sent as x-divp-signature: sha256=<hex>.",
                  "const secret = pm.collectionVariables.get('webhookSecret');",
                  "const body = pm.request.body.raw;",
                  "const hex = CryptoJS.HmacSHA256(body, secret).toString(CryptoJS.enc.Hex);",
                  "pm.request.headers.upsert({ key: 'x-divp-signature', value: 'sha256=' + hex });"
                ]
              }
            }
          ],
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "x-divp-event",
                "value": "remittance.order.completed"
              },
              {
                "key": "x-divp-delivery-id",
                "value": "0f2c6f0e-8a52-4a0e-9d3c-5a4b3c2d1e0f"
              },
              {
                "key": "x-divp-attempt",
                "value": "1"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\"event\":\"remittance.order.completed\",\"data\":{\"orderId\":\"3f2b8c1e-5d44-4a7e-9a36-0b1c2d3e4f50\",\"externalRef\":\"transfer-1001\",\"status\":\"COMPLETED\",\"sandbox\":true,\"send\":{\"amountMinor\":\"10000\",\"currency\":\"USD\"},\"receive\":{\"amountMinor\":\"2987500\",\"currency\":\"LKR\"},\"payoutStatus\":\"DRY_RUN\",\"payoutRule\":\"AFTER_SETTLEMENT\",\"settledAt\":\"2026-10-10T08:00:00.000Z\",\"failureReason\":null,\"occurredAt\":\"2026-10-10T08:00:00.000Z\"},\"sentAt\":\"2026-10-10T08:00:00.000Z\"}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{webhookUrl}}",
              "host": [
                "{{webhookUrl}}"
              ]
            },
            "description": "Final. Read payoutStatus: DRY_RUN means no bank was instructed.\n\nSends this example to {{webhookUrl}} signed with {{webhookSecret}}. It never goes to AnyBanQ."
          },
          "response": []
        },
        {
          "name": "remittance.order.failed",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// Sign the body exactly as the API does: hex HMAC-SHA256 of the raw bytes,",
                  "// keyed with the webhook secret, sent as x-divp-signature: sha256=<hex>.",
                  "const secret = pm.collectionVariables.get('webhookSecret');",
                  "const body = pm.request.body.raw;",
                  "const hex = CryptoJS.HmacSHA256(body, secret).toString(CryptoJS.enc.Hex);",
                  "pm.request.headers.upsert({ key: 'x-divp-signature', value: 'sha256=' + hex });"
                ]
              }
            }
          ],
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "x-divp-event",
                "value": "remittance.order.failed"
              },
              {
                "key": "x-divp-delivery-id",
                "value": "0f2c6f0e-8a52-4a0e-9d3c-5a4b3c2d1e0f"
              },
              {
                "key": "x-divp-attempt",
                "value": "1"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\"event\":\"remittance.order.failed\",\"data\":{\"orderId\":\"3f2b8c1e-5d44-4a7e-9a36-0b1c2d3e4f50\",\"externalRef\":\"transfer-1001\",\"status\":\"FAILED\",\"sandbox\":true,\"send\":{\"amountMinor\":\"10000\",\"currency\":\"USD\"},\"receive\":{\"amountMinor\":\"2987500\",\"currency\":\"LKR\"},\"payoutStatus\":null,\"payoutRule\":null,\"settledAt\":null,\"failureReason\":\"COLLECTION_DECLINED\",\"occurredAt\":\"2026-10-10T08:00:00.000Z\"},\"sentAt\":\"2026-10-10T08:00:00.000Z\"}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{webhookUrl}}",
              "host": [
                "{{webhookUrl}}"
              ]
            },
            "description": "Final. failureReason says why.\n\nSends this example to {{webhookUrl}} signed with {{webhookSecret}}. It never goes to AnyBanQ."
          },
          "response": []
        },
        {
          "name": "remittance.order.expired",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// Sign the body exactly as the API does: hex HMAC-SHA256 of the raw bytes,",
                  "// keyed with the webhook secret, sent as x-divp-signature: sha256=<hex>.",
                  "const secret = pm.collectionVariables.get('webhookSecret');",
                  "const body = pm.request.body.raw;",
                  "const hex = CryptoJS.HmacSHA256(body, secret).toString(CryptoJS.enc.Hex);",
                  "pm.request.headers.upsert({ key: 'x-divp-signature', value: 'sha256=' + hex });"
                ]
              }
            }
          ],
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "x-divp-event",
                "value": "remittance.order.expired"
              },
              {
                "key": "x-divp-delivery-id",
                "value": "0f2c6f0e-8a52-4a0e-9d3c-5a4b3c2d1e0f"
              },
              {
                "key": "x-divp-attempt",
                "value": "1"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\"event\":\"remittance.order.expired\",\"data\":{\"orderId\":\"3f2b8c1e-5d44-4a7e-9a36-0b1c2d3e4f50\",\"externalRef\":\"transfer-1001\",\"status\":\"EXPIRED\",\"sandbox\":true,\"send\":{\"amountMinor\":\"10000\",\"currency\":\"USD\"},\"receive\":{\"amountMinor\":\"2987500\",\"currency\":\"LKR\"},\"payoutStatus\":null,\"payoutRule\":null,\"settledAt\":null,\"failureReason\":null,\"occurredAt\":\"2026-10-10T08:00:00.000Z\"},\"sentAt\":\"2026-10-10T08:00:00.000Z\"}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{webhookUrl}}",
              "host": [
                "{{webhookUrl}}"
              ]
            },
            "description": "Final. The quoted rate lapsed before the order was paid.\n\nSends this example to {{webhookUrl}} signed with {{webhookSecret}}. It never goes to AnyBanQ."
          },
          "response": []
        },
        {
          "name": "remittance.order.cancelled",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// Sign the body exactly as the API does: hex HMAC-SHA256 of the raw bytes,",
                  "// keyed with the webhook secret, sent as x-divp-signature: sha256=<hex>.",
                  "const secret = pm.collectionVariables.get('webhookSecret');",
                  "const body = pm.request.body.raw;",
                  "const hex = CryptoJS.HmacSHA256(body, secret).toString(CryptoJS.enc.Hex);",
                  "pm.request.headers.upsert({ key: 'x-divp-signature', value: 'sha256=' + hex });"
                ]
              }
            }
          ],
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "x-divp-event",
                "value": "remittance.order.cancelled"
              },
              {
                "key": "x-divp-delivery-id",
                "value": "0f2c6f0e-8a52-4a0e-9d3c-5a4b3c2d1e0f"
              },
              {
                "key": "x-divp-attempt",
                "value": "1"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\"event\":\"remittance.order.cancelled\",\"data\":{\"orderId\":\"3f2b8c1e-5d44-4a7e-9a36-0b1c2d3e4f50\",\"externalRef\":\"transfer-1001\",\"status\":\"CANCELLED\",\"sandbox\":true,\"send\":{\"amountMinor\":\"10000\",\"currency\":\"USD\"},\"receive\":{\"amountMinor\":\"2987500\",\"currency\":\"LKR\"},\"payoutStatus\":null,\"payoutRule\":null,\"settledAt\":null,\"failureReason\":null,\"occurredAt\":\"2026-10-10T08:00:00.000Z\"},\"sentAt\":\"2026-10-10T08:00:00.000Z\"}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{webhookUrl}}",
              "host": [
                "{{webhookUrl}}"
              ]
            },
            "description": "Final. Cancelled, or a held order was rejected.\n\nSends this example to {{webhookUrl}} signed with {{webhookSecret}}. It never goes to AnyBanQ."
          },
          "response": []
        },
        {
          "name": "payout_batch.created",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// Sign the body exactly as the API does: hex HMAC-SHA256 of the raw bytes,",
                  "// keyed with the webhook secret, sent as x-divp-signature: sha256=<hex>.",
                  "const secret = pm.collectionVariables.get('webhookSecret');",
                  "const body = pm.request.body.raw;",
                  "const hex = CryptoJS.HmacSHA256(body, secret).toString(CryptoJS.enc.Hex);",
                  "pm.request.headers.upsert({ key: 'x-divp-signature', value: 'sha256=' + hex });"
                ]
              }
            }
          ],
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "x-divp-event",
                "value": "payout_batch.created"
              },
              {
                "key": "x-divp-delivery-id",
                "value": "0f2c6f0e-8a52-4a0e-9d3c-5a4b3c2d1e0f"
              },
              {
                "key": "x-divp-attempt",
                "value": "1"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\"event\":\"payout_batch.created\",\"data\":{\"batchId\":\"b4c9d7e2-1a3f-4b6c-8d9e-0f1a2b3c4d5e\",\"fundingReference\":\"VPB0A1B2C3D4E5F\",\"rows\":2,\"validRows\":2,\"invalidRows\":0,\"total\":205000,\"currency\":\"LKR\"},\"sentAt\":\"2026-10-10T08:00:00.000Z\"}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{webhookUrl}}",
              "host": [
                "{{webhookUrl}}"
              ]
            },
            "description": "A batch was created.\n\nSends this example to {{webhookUrl}} signed with {{webhookSecret}}. It never goes to AnyBanQ."
          },
          "response": []
        },
        {
          "name": "payout_batch.approved",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// Sign the body exactly as the API does: hex HMAC-SHA256 of the raw bytes,",
                  "// keyed with the webhook secret, sent as x-divp-signature: sha256=<hex>.",
                  "const secret = pm.collectionVariables.get('webhookSecret');",
                  "const body = pm.request.body.raw;",
                  "const hex = CryptoJS.HmacSHA256(body, secret).toString(CryptoJS.enc.Hex);",
                  "pm.request.headers.upsert({ key: 'x-divp-signature', value: 'sha256=' + hex });"
                ]
              }
            }
          ],
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "x-divp-event",
                "value": "payout_batch.approved"
              },
              {
                "key": "x-divp-delivery-id",
                "value": "0f2c6f0e-8a52-4a0e-9d3c-5a4b3c2d1e0f"
              },
              {
                "key": "x-divp-attempt",
                "value": "1"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\"event\":\"payout_batch.approved\",\"data\":{\"batchId\":\"b4c9d7e2-1a3f-4b6c-8d9e-0f1a2b3c4d5e\",\"fundingReference\":\"VPB0A1B2C3D4E5F\"},\"sentAt\":\"2026-10-10T08:00:00.000Z\"}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{webhookUrl}}",
              "host": [
                "{{webhookUrl}}"
              ]
            },
            "description": "A second person approved the batch.\n\nSends this example to {{webhookUrl}} signed with {{webhookSecret}}. It never goes to AnyBanQ."
          },
          "response": []
        },
        {
          "name": "payout_batch.rejected",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// Sign the body exactly as the API does: hex HMAC-SHA256 of the raw bytes,",
                  "// keyed with the webhook secret, sent as x-divp-signature: sha256=<hex>.",
                  "const secret = pm.collectionVariables.get('webhookSecret');",
                  "const body = pm.request.body.raw;",
                  "const hex = CryptoJS.HmacSHA256(body, secret).toString(CryptoJS.enc.Hex);",
                  "pm.request.headers.upsert({ key: 'x-divp-signature', value: 'sha256=' + hex });"
                ]
              }
            }
          ],
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "x-divp-event",
                "value": "payout_batch.rejected"
              },
              {
                "key": "x-divp-delivery-id",
                "value": "0f2c6f0e-8a52-4a0e-9d3c-5a4b3c2d1e0f"
              },
              {
                "key": "x-divp-attempt",
                "value": "1"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\"event\":\"payout_batch.rejected\",\"data\":{\"batchId\":\"b4c9d7e2-1a3f-4b6c-8d9e-0f1a2b3c4d5e\",\"fundingReference\":\"VPB0A1B2C3D4E5F\",\"reason\":\"Two rows are for last month\"},\"sentAt\":\"2026-10-10T08:00:00.000Z\"}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{webhookUrl}}",
              "host": [
                "{{webhookUrl}}"
              ]
            },
            "description": "The batch was rejected.\n\nSends this example to {{webhookUrl}} signed with {{webhookSecret}}. It never goes to AnyBanQ."
          },
          "response": []
        },
        {
          "name": "payout_batch.cancelled",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// Sign the body exactly as the API does: hex HMAC-SHA256 of the raw bytes,",
                  "// keyed with the webhook secret, sent as x-divp-signature: sha256=<hex>.",
                  "const secret = pm.collectionVariables.get('webhookSecret');",
                  "const body = pm.request.body.raw;",
                  "const hex = CryptoJS.HmacSHA256(body, secret).toString(CryptoJS.enc.Hex);",
                  "pm.request.headers.upsert({ key: 'x-divp-signature', value: 'sha256=' + hex });"
                ]
              }
            }
          ],
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "x-divp-event",
                "value": "payout_batch.cancelled"
              },
              {
                "key": "x-divp-delivery-id",
                "value": "0f2c6f0e-8a52-4a0e-9d3c-5a4b3c2d1e0f"
              },
              {
                "key": "x-divp-attempt",
                "value": "1"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\"event\":\"payout_batch.cancelled\",\"data\":{\"batchId\":\"b4c9d7e2-1a3f-4b6c-8d9e-0f1a2b3c4d5e\",\"fundingReference\":\"VPB0A1B2C3D4E5F\",\"wasFunded\":false},\"sentAt\":\"2026-10-10T08:00:00.000Z\"}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{webhookUrl}}",
              "host": [
                "{{webhookUrl}}"
              ]
            },
            "description": "The batch was withdrawn.\n\nSends this example to {{webhookUrl}} signed with {{webhookSecret}}. It never goes to AnyBanQ."
          },
          "response": []
        },
        {
          "name": "payout_batch.funded",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// Sign the body exactly as the API does: hex HMAC-SHA256 of the raw bytes,",
                  "// keyed with the webhook secret, sent as x-divp-signature: sha256=<hex>.",
                  "const secret = pm.collectionVariables.get('webhookSecret');",
                  "const body = pm.request.body.raw;",
                  "const hex = CryptoJS.HmacSHA256(body, secret).toString(CryptoJS.enc.Hex);",
                  "pm.request.headers.upsert({ key: 'x-divp-signature', value: 'sha256=' + hex });"
                ]
              }
            }
          ],
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "x-divp-event",
                "value": "payout_batch.funded"
              },
              {
                "key": "x-divp-delivery-id",
                "value": "0f2c6f0e-8a52-4a0e-9d3c-5a4b3c2d1e0f"
              },
              {
                "key": "x-divp-attempt",
                "value": "1"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\"event\":\"payout_batch.funded\",\"data\":{\"batchId\":\"b4c9d7e2-1a3f-4b6c-8d9e-0f1a2b3c4d5e\",\"fundingReference\":\"VPB0A1B2C3D4E5F\",\"amountLkr\":205000},\"sentAt\":\"2026-10-10T08:00:00.000Z\"}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{webhookUrl}}",
              "host": [
                "{{webhookUrl}}"
              ]
            },
            "description": "The bank confirmed the funds.\n\nSends this example to {{webhookUrl}} signed with {{webhookSecret}}. It never goes to AnyBanQ."
          },
          "response": []
        },
        {
          "name": "payout_batch.completed",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// Sign the body exactly as the API does: hex HMAC-SHA256 of the raw bytes,",
                  "// keyed with the webhook secret, sent as x-divp-signature: sha256=<hex>.",
                  "const secret = pm.collectionVariables.get('webhookSecret');",
                  "const body = pm.request.body.raw;",
                  "const hex = CryptoJS.HmacSHA256(body, secret).toString(CryptoJS.enc.Hex);",
                  "pm.request.headers.upsert({ key: 'x-divp-signature', value: 'sha256=' + hex });"
                ]
              }
            }
          ],
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "x-divp-event",
                "value": "payout_batch.completed"
              },
              {
                "key": "x-divp-delivery-id",
                "value": "0f2c6f0e-8a52-4a0e-9d3c-5a4b3c2d1e0f"
              },
              {
                "key": "x-divp-attempt",
                "value": "1"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\"event\":\"payout_batch.completed\",\"data\":{\"batchId\":\"b4c9d7e2-1a3f-4b6c-8d9e-0f1a2b3c4d5e\",\"fundingReference\":\"VPB0A1B2C3D4E5F\",\"status\":\"DRY_RUN\",\"paid\":0,\"failed\":0,\"returned\":0,\"notSent\":2,\"paidAmountLkr\":0},\"sentAt\":\"2026-10-10T08:00:00.000Z\"}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{webhookUrl}}",
              "host": [
                "{{webhookUrl}}"
              ]
            },
            "description": "No row is left pending.\n\nSends this example to {{webhookUrl}} signed with {{webhookSecret}}. It never goes to AnyBanQ."
          },
          "response": []
        },
        {
          "name": "payout_batch.row.returned",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// Sign the body exactly as the API does: hex HMAC-SHA256 of the raw bytes,",
                  "// keyed with the webhook secret, sent as x-divp-signature: sha256=<hex>.",
                  "const secret = pm.collectionVariables.get('webhookSecret');",
                  "const body = pm.request.body.raw;",
                  "const hex = CryptoJS.HmacSHA256(body, secret).toString(CryptoJS.enc.Hex);",
                  "pm.request.headers.upsert({ key: 'x-divp-signature', value: 'sha256=' + hex });"
                ]
              }
            }
          ],
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "x-divp-event",
                "value": "payout_batch.row.returned"
              },
              {
                "key": "x-divp-delivery-id",
                "value": "0f2c6f0e-8a52-4a0e-9d3c-5a4b3c2d1e0f"
              },
              {
                "key": "x-divp-attempt",
                "value": "1"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\"event\":\"payout_batch.row.returned\",\"data\":{\"batchId\":\"b4c9d7e2-1a3f-4b6c-8d9e-0f1a2b3c4d5e\",\"rowNumber\":1,\"payoutReference\":\"VPB0A1B2C3D4E5FR0001\",\"amountLkr\":85000,\"reason\":\"Account closed\"},\"sentAt\":\"2026-10-10T08:00:00.000Z\"}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{webhookUrl}}",
              "host": [
                "{{webhookUrl}}"
              ]
            },
            "description": "The bank sent a paid row back.\n\nSends this example to {{webhookUrl}} signed with {{webhookSecret}}. It never goes to AnyBanQ."
          },
          "response": []
        },
        {
          "name": "bill.created",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// Sign the body exactly as the API does: hex HMAC-SHA256 of the raw bytes,",
                  "// keyed with the webhook secret, sent as x-divp-signature: sha256=<hex>.",
                  "const secret = pm.collectionVariables.get('webhookSecret');",
                  "const body = pm.request.body.raw;",
                  "const hex = CryptoJS.HmacSHA256(body, secret).toString(CryptoJS.enc.Hex);",
                  "pm.request.headers.upsert({ key: 'x-divp-signature', value: 'sha256=' + hex });"
                ]
              }
            }
          ],
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "x-divp-event",
                "value": "bill.created"
              },
              {
                "key": "x-divp-delivery-id",
                "value": "0f2c6f0e-8a52-4a0e-9d3c-5a4b3c2d1e0f"
              },
              {
                "key": "x-divp-attempt",
                "value": "1"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\"event\":\"bill.created\",\"data\":{\"billId\":\"9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b\",\"ocr\":\"100000000018\",\"payerNic\":null,\"amount\":25000,\"currency\":\"LKR\",\"dueDate\":\"2026-10-17T08:00:00.000Z\"},\"sentAt\":\"2026-10-10T08:00:00.000Z\"}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{webhookUrl}}",
              "host": [
                "{{webhookUrl}}"
              ]
            },
            "description": "A bill or a payment link was created.\n\nSends this example to {{webhookUrl}} signed with {{webhookSecret}}. It never goes to AnyBanQ."
          },
          "response": []
        },
        {
          "name": "bill.paid",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// Sign the body exactly as the API does: hex HMAC-SHA256 of the raw bytes,",
                  "// keyed with the webhook secret, sent as x-divp-signature: sha256=<hex>.",
                  "const secret = pm.collectionVariables.get('webhookSecret');",
                  "const body = pm.request.body.raw;",
                  "const hex = CryptoJS.HmacSHA256(body, secret).toString(CryptoJS.enc.Hex);",
                  "pm.request.headers.upsert({ key: 'x-divp-signature', value: 'sha256=' + hex });"
                ]
              }
            }
          ],
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "x-divp-event",
                "value": "bill.paid"
              },
              {
                "key": "x-divp-delivery-id",
                "value": "0f2c6f0e-8a52-4a0e-9d3c-5a4b3c2d1e0f"
              },
              {
                "key": "x-divp-attempt",
                "value": "1"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\"event\":\"bill.paid\",\"data\":{\"billId\":\"9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b\",\"ocr\":\"100000000018\",\"payerNic\":null,\"amount\":25000,\"currency\":\"LKR\",\"settledVia\":\"HNB_JUSTPAY\",\"paymentRef\":\"EXAMPLE-REF-0001\",\"paidAt\":\"2026-10-10T08:00:00.000Z\"},\"sentAt\":\"2026-10-10T08:00:00.000Z\"}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{webhookUrl}}",
              "host": [
                "{{webhookUrl}}"
              ]
            },
            "description": "A bill or a payment link was paid.\n\nSends this example to {{webhookUrl}} signed with {{webhookSecret}}. It never goes to AnyBanQ."
          },
          "response": []
        },
        {
          "name": "verification.completed",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// Sign the body exactly as the API does: hex HMAC-SHA256 of the raw bytes,",
                  "// keyed with the webhook secret, sent as x-divp-signature: sha256=<hex>.",
                  "const secret = pm.collectionVariables.get('webhookSecret');",
                  "const body = pm.request.body.raw;",
                  "const hex = CryptoJS.HmacSHA256(body, secret).toString(CryptoJS.enc.Hex);",
                  "pm.request.headers.upsert({ key: 'x-divp-signature', value: 'sha256=' + hex });"
                ]
              }
            }
          ],
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "x-divp-event",
                "value": "verification.completed"
              },
              {
                "key": "x-divp-delivery-id",
                "value": "0f2c6f0e-8a52-4a0e-9d3c-5a4b3c2d1e0f"
              },
              {
                "key": "x-divp-attempt",
                "value": "1"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\"event\":\"verification.completed\",\"data\":{\"verificationId\":\"a9b8c7d6-e5f4-4a3b-8c2d-1e0f9a8b7c6d\",\"type\":\"NIC\",\"status\":\"APPROVED\",\"outcome\":\"PASS\",\"score\":100},\"sentAt\":\"2026-10-10T08:00:00.000Z\"}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{webhookUrl}}",
              "host": [
                "{{webhookUrl}}"
              ]
            },
            "description": "One check inside a workflow finished. Sent once per check.\n\nSends this example to {{webhookUrl}} signed with {{webhookSecret}}. It never goes to AnyBanQ."
          },
          "response": []
        }
      ]
    }
  ]
}
