Subsidiary Accounts
Paga accounts for your customers, fully managed by you. Issue, hold, and move money on behalf of your end users – all from your Paga business account.
The subsidiary account is a real, ledger‑backed account that holds actual funds on behalf of the merchant’s customer. It is not a virtual account; it is a fully functional account in the Paga system with its own balance, transaction history, and unique NUBAN. The merchant remains the legal owner of the account and all funds within it.
Prerequisites
Before you begin integrating the Subsidiary Account API, ensure the following are in place:
-
Paga Business Account
You must have a registered Paga business account. If you do not yet have one, create an account at pagaengine.com. -
API Credentials
Once your business account is active, log in to the Paga portal and navigate to Developer tools → API keys.
Here you will find:- Public Key – used as the username for HTTP Basic Authentication.
- Secret Key – used as the password for HTTP Basic Authentication.
- hashKey – a pre‑shared secret used to compute the SHA‑512 hash header and to verify webhook callbacks.
Keep these credentials secure. If you cannot access the API keys section, contact Paga support.
-
Funded Merchant Balance
To top up a subsidiary account (move funds from your main balance into the customer’s account), your Paga business account must hold sufficient funds. -
Bank Identifiers (optional)
If you intend to use the auto‑sweep feature with a bank destination, you will need the recipient bank’sbankPublicId. Use the Get Banks endpoint to retrieve this value.
Base URLs
| Environment | Base URL |
|---|---|
| Test | https://beta-collect.paga.com |
| Live | https://collect.paga.com |
All endpoints are relative to the base URL. Requests and responses use JSON with Content-Type: application/json.
Authentication
Every request must include two authentication mechanisms.
1. HTTP Basic Authentication
Use your Public Key as the username and your Secret Key as the password.
These are obtained from your Paga dashboard under Developer tools → API keys.
The standard Authorization header is required:
Authorization: Basic base64(PublicKey:SecretKey)2. SHA‑512 Hash Header
A hash header is required for all POST, PUT, and some GET requests.
The hash is computed as:
SHA‑512( concatenated_parameters + hashKey )The exact concatenation depends on the endpoint (documented in each operation).
For any optional parameter not included in the request, use an empty string "" in the concatenation.
The hashKey is the secret displayed alongside your keys in the API keys page.
Example (Create Account):
Concatenate: referenceNumber + accountReference + iifiNumber + autoSweep.bankPublicId + autoSweep.destination + autoSweep.accountNumber + callbackUrl + hashKey
If you are not providing iifiNumber, its placeholder becomes "".
Terminology
- Subsidiary Account – A real, ledger‑backed account owned by the merchant and operated on behalf of an end customer. It holds actual funds, has a unique NUBAN, and supports the full range of transaction operations.
- accountNumber – The system‑generated NUBAN (10‑digit account number). Returned after creation.
- accountReference – A merchant‑defined unique identifier for the account (12–30 characters). You supply this at creation; it cannot be changed later.
- accountIdentifier – When a path parameter or field requires an identifier, you may use either the
accountNumber(NUBAN) or theaccountReference. - Currency – Only
NGNis supported at this time. - BVN – Bank Verification Number. In request bodies this is named
iifiNumber; in callback payloads it appears asfinancialIdentificationNumber.
API Reference
1. Create a Subsidiary Account
POST /subsidiary-accountsCreates a new, real subsidiary account for a customer. The account is immediately able to receive funds.
Idempotency: The referenceNumber uniquely identifies the request. Submitting the same referenceNumber again will return the existing account rather than creating a duplicate.
Request Headers
Authorization: Basic ...hash: <SHA‑512 hash>
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
referenceNumber | string | Yes | Unique reference for this request (returned in the response). |
accountReference | string | Yes | Your unique identifier for the account (12–30 characters). |
accountName | string | Yes | Display name for the account. |
firstName | string | Yes | Customer’s first name. |
lastName | string | Yes | Customer’s last name. |
phoneNumber | string | No* | Customer’s phone number. Required if email is not provided. |
email | string | No* | Customer’s email. Required if phoneNumber is not provided. |
iifiNumber | string | No | Customer’s Bank Verification Number (BVN). |
callbackUrl | string | No | Custom webhook URL for this account. If set, notifications are sent here exactly as provided. |
fundingDailyLimit | number | No | Maximum total deposits allowed in one day. Exceeding this limit declines the transfer at the sender’s bank. |
fundingTransactionLimit | number | No | Maximum amount per single deposit. |
status | string | No | Account state: "ACTIVE" (default) or "DISABLED". Disabled accounts cannot receive funds or perform operations. |
autoSweep | object | No | Automatic settlement configuration. If omitted, incoming funds remain in the subsidiary account. |
autoSweep.destination | string | No | Settlement destination: "VIRTUAL_ACCOUNT" (auto‑sweep to your Paga business account) or "BANK" (auto‑sweep to a bank account). |
autoSweep.bankPublicId | string | No | The public ID of the bank (obtained from the Get Banks endpoint). Required if destination is "BANK". |
autoSweep.accountNumber | string | No | The bank account number for the sweep. Required if destination is "BANK". |
* At least one of phoneNumber or email is required.
Hash Computation
Concatenate the following values in order, using an empty string "" for any missing optional field:
referenceNumber + accountReference + iifiNumber + autoSweep.bankPublicId + autoSweep.destination + autoSweep.accountNumber + callbackUrl + hashKeyExample Requests
Scenario 1: No auto‑sweep – funds stay in subsidiary account
POST /subsidiary-accounts HTTP/1.1
Content-Type: application/json
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
hash: ...
{
"referenceNumber": "REF-100005550002",
"accountReference": "PAGA-255026-NO-AUTOSWEEP",
"accountName": "Test Subsidiary Account",
"phoneNumber": "08012345678",
"firstName": "Test",
"lastName": "Customer",
"email": "[email protected]",
"iifiNumber": "22222132329",
"fundingTransactionLimit": 500000.00,
"fundingDailyLimit": 2000000.00,
"status": "ACTIVE"
}Scenario 2: Auto‑sweep to merchant’s business account (VIRTUAL_ACCOUNT)
POST /subsidiary-accounts HTTP/1.1
Content-Type: application/json
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
hash: ...
{
"referenceNumber": "REF-100005550003",
"accountReference": "PAGA-255026-VIRTUAL-SWEEP",
"accountName": "Test Virtual Sweep",
"phoneNumber": "08012345679",
"firstName": "Jane",
"lastName": "Doe",
"email": "[email protected]",
"status": "ACTIVE",
"autoSweep": {
"destination": "VIRTUAL_ACCOUNT"
}
}Scenario 3: Auto‑sweep to a bank account (BANK)
POST /subsidiary-accounts HTTP/1.1
Content-Type: application/json
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
hash: ...
{
"referenceNumber": "REF-100005550004",
"accountReference": "PAGA-255026-BANK-SWEEP",
"accountName": "Test Bank Sweep",
"phoneNumber": "08012345670",
"firstName": "Alice",
"lastName": "Smith",
"email": "[email protected]",
"status": "ACTIVE",
"autoSweep": {
"destination": "BANK",
"bankPublicId": "7131F94B-C0AC-43FB-BF6A-3407D27F1806",
"accountNumber": "0073141524"
}
}Response 200 OK
200 OK| Field | Type | Description |
|---|---|---|
referenceNumber | string | Echo of the request reference. |
statusCode | string | "0" indicates success. |
statusMessage | string | Human‑readable status, e.g. "success". |
accountNumber | string | The generated NUBAN (10‑digit account number). |
accountReference | string | Your supplied account reference. |
status | string | Account state: "ACTIVE" or "DISABLED". |
balance | number | Current balance (always 0.0 at creation). |
currency | string | "NGN". |
{
"referenceNumber": "REF-100005550002",
"statusCode": "0",
"statusMessage": "success",
"accountNumber": "0750529406",
"accountReference": "PAGA-255026-NO-AUTOSWEEP",
"status": "ACTIVE",
"balance": 0.0,
"currency": "NGN"
}2. Retrieve a Subsidiary Account
GET /subsidiary-accounts/{accountIdentifier}?referenceNumber={referenceNumber}Fetches all properties of an existing subsidiary account.
Path Parameters
accountIdentifier(string, required) – The NUBAN oraccountReferenceof the account.
Query Parameters
referenceNumber(string, required) – Unique reference for this request.
Hash Computation
referenceNumber + accountIdentifier + hashKeyExample Request
GET /subsidiary-accounts/0750529406?referenceNumber=REF-GET-001 HTTP/1.1
Authorization: Basic ...
hash: ...Response 200 OK
200 OK| Field | Type | Description |
|---|---|---|
referenceNumber | string | Echo of request reference. |
statusCode | string | "0" for success. |
statusMessage | string | "success". |
accountNumber | string | NUBAN. |
accountReference | string | Your account reference. |
status | string | "ACTIVE" or "DISABLED". |
balance | number | Current balance. |
currency | string | "NGN". |
accountName | string | Account display name. |
phoneNumber | string | Customer’s phone number. |
firstName | string | Customer’s first name. |
lastName | string | Customer’s last name. |
email | string | Customer’s email. |
iifiNumber | string | Customer’s BVN. |
fundingDailyLimit | number | Daily deposit limit. |
fundingTransactionLimit | number | Per‑transaction deposit limit. |
callbackUrl | string | Custom webhook URL (null if not set). |
{
"referenceNumber": "REF-GET-001",
"statusCode": "0",
"statusMessage": "success",
"accountNumber": "0750529406",
"accountReference": "PAGA-255026-NO-AUTOSWEEP",
"status": "ACTIVE",
"balance": 194900.0,
"currency": "NGN",
"accountName": "Test Subsidiary Account",
"phoneNumber": "08012345678",
"firstName": "Test",
"lastName": "Customer",
"email": "[email protected]",
"iifiNumber": "22222132329",
"fundingDailyLimit": 2000000.0,
"fundingTransactionLimit": 500000.0,
"callbackUrl": "https://example.com/webhook"
}3. Update a Subsidiary Account
PUT /subsidiary-accounts/{accountIdentifier}Modifies properties of an existing subsidiary account.
Immutable fields: accountNumber (NUBAN) and accountReference cannot be changed.
Only the fields you supply are updated; omitted fields keep their current values.
Path Parameters
accountIdentifier(string, required) – NUBAN oraccountReference.
Request Body
The same fields as Create are available, except accountReference and accountNumber. The autoSweep object can be added, modified, or removed entirely (by setting it to null) to change the sweep behaviour.
| Parameter | Type | Required | Notes |
|---|---|---|---|
referenceNumber | string | Yes | Unique reference for this request. |
| (all other fields) | No | Update only what you need. |
Hash Computation
referenceNumber + accountIdentifier + iifiNumber + autoSweep.destination + autoSweep.bankPublicId + autoSweep.accountNumber + callbackUrl + hashKey(use "" for any omitted optional field)
Example Request
PUT /subsidiary-accounts/0750529406 HTTP/1.1
Authorization: Basic ...
hash: ...
{
"referenceNumber": "REF-UPDATE-001",
"accountName": "St Jones School",
"status": "DISABLED"
}Response 200 OK
200 OKReturns the full updated account object, identical to the Retrieve response.
4. Charge a Subsidiary Account (Withdraw)
POST /subsidiary-accounts/{accountIdentifier}/chargeMoves funds from the subsidiary account to the merchant’s main Paga balance.
Idempotency: The referenceNumber is the idempotency key. Retrying with the same reference number will not result in a duplicate charge; the original result will be returned.
Path Parameters
accountIdentifier(string, required) – NUBAN oraccountReference.
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
referenceNumber | string | Yes | Unique reference for this charge request. |
amount | number | Yes | Amount to debit from the subsidiary account. |
currency | string | Yes | "NGN". |
narration | string | No | Description for the transaction. |
Hash Computation
referenceNumber + amount + currency + narration + hashKeyExample Request
POST /subsidiary-accounts/0750529406/charge HTTP/1.1
Authorization: Basic ...
hash: ...
{
"referenceNumber": "REF-CHARGE-001",
"amount": 1000.00,
"currency": "NGN",
"narration": "Service fee"
}Response 200 OK
200 OK| Field | Type | Description |
|---|---|---|
referenceNumber | string | Echo of request reference. |
statusCode | string | "0" for success. |
statusMessage | string | "success". |
transactionId | string | Unique transaction identifier. |
newBalance | number | Subsidiary account balance after the charge. |
{
"referenceNumber": "REF-CHARGE-001",
"statusCode": "0",
"statusMessage": "success",
"transactionId": "MPVAT-P_20260610214236118_4577638_JX438_qznml",
"newBalance": 98000.0
}5. Top Up a Subsidiary Account
POST /subsidiary-accounts/{accountIdentifier}/topupMoves funds from the merchant’s main Paga balance into the subsidiary account.
Idempotency: The referenceNumber serves as the idempotency key. Retries with the same reference number are safe and will return the original result.
Path Parameters
accountIdentifier(string, required) – NUBAN oraccountReference.
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
referenceNumber | string | Yes | Unique reference for this top‑up request. |
amount | number | Yes | Amount to credit. |
currency | string | Yes | "NGN". |
narration | string | No | Transaction description. |
Hash Computation
referenceNumber + amount + currency + narration + hashKeyExample Request
POST /subsidiary-accounts/0750529406/topup HTTP/1.1
Authorization: Basic ...
hash: ...
{
"referenceNumber": "REF-TOPUP-001",
"amount": 500.00,
"currency": "NGN",
"narration": "Bonus credit"
}Response 200 OK
200 OKSame structure as Charge:
| Field | Type | Description |
|---|---|---|
referenceNumber | string | Echo. |
statusCode | string | "0" for success. |
statusMessage | string | "success". |
transactionId | string | Unique transaction ID. |
newBalance | number | Balance after the top‑up. |
{
"referenceNumber": "REF-TOPUP-001",
"statusCode": "0",
"statusMessage": "success",
"transactionId": "MPVAT-P_20260610220000000_4577650_SMQDM_qznml",
"newBalance": 50500.0
}6. Transfer Between Subsidiary Accounts
POST /subsidiary-accounts/transfer
Transfers funds from one subsidiary account to another, both owned by the same merchant.
Idempotency: The referenceNumber uniquely identifies the transfer. Duplicate submissions with the same reference will return the original transaction details.
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
referenceNumber | string | Yes | Unique reference for the transfer. |
sourceAccountIdentifier | string | Yes | NUBAN or accountReference of the sender account. |
destinationAccountIdentifier | string | Yes | NUBAN or accountReference of the receiver account. |
amount | number | Yes | Transfer amount. |
currency | string | Yes | "NGN". |
narration | string | No | Description. |
Hash Computation
referenceNumber + sourceAccountIdentifier + destinationAccountIdentifier + amount + currency + narration + hashKeyExample Request
POST /subsidiary-accounts/transfer HTTP/1.1
Authorization: Basic ...
hash: ...
{
"referenceNumber": "REF-TRANSFER-001",
"sourceAccountIdentifier": "0750529406",
"destinationAccountIdentifier": "3859568112",
"amount": 1500.00,
"currency": "NGN",
"narration": "Payment for goods"
}Response 200 OK
200 OK| Field | Type | Description |
|---|---|---|
referenceNumber | string | Echo. |
statusCode | string | "0" for success. |
statusMessage | string | "success". |
transactionId | string | Unique transaction ID. |
source.accountIdentifier | string | Sender’s identifier. |
source.amount | number | Amount debited. |
source.newBalance | number | Sender’s balance after debit. |
destination.accountIdentifier | string | Receiver’s identifier. |
destination.amount | number | Amount credited. |
destination.newBalance | number | Receiver’s balance after credit. |
{
"referenceNumber": "REF-TRANSFER-001",
"statusCode": "0",
"statusMessage": "success",
"transactionId": "MPVAT-P_20260610230032541_4577650_SMQDM_qznml",
"source": {
"accountIdentifier": "0750529406",
"amount": 1500.0,
"newBalance": 96500.0
},
"destination": {
"accountIdentifier": "3859568112",
"amount": 1500.0,
"newBalance": 3000.0
}
}7. Get Subsidiary Account Balance
GET /subsidiary-accounts/{accountIdentifier}/balance?referenceNumber={referenceNumber}Returns the current balance of a subsidiary account.
Path Parameters
accountIdentifier– NUBAN oraccountReference.
Query Parameters
referenceNumber(string, required) – Request reference.
Hash Computation
referenceNumber + accountIdentifier + hashKeyResponse 200 OK
200 OK| Field | Type | Description |
|---|---|---|
referenceNumber | string | Echo. |
statusCode | string | "0". |
statusMessage | string | "success". |
accountNumber | string | NUBAN. |
accountReference | string | Your account reference. |
balance | number | Current balance. |
currency | string | "NGN". |
timeStamp | string | UTC timestamp of the balance snapshot. |
{
"referenceNumber": "REF-BAL-001",
"statusCode": "0",
"statusMessage": "success",
"accountNumber": "0750529406",
"accountReference": "PAGA-255026-NO-AUTOSWEEP",
"balance": 98000.0,
"currency": "NGN",
"timeStamp": "2026-06-10T22:50:16"
}8. Get Subsidiary Account History
GET /subsidiary-accounts/{accountIdentifier}/history?startDateTimeUTC={start}&endDateTimeUTC={end}&pageSize={size}&pageNumber={page}Returns a paginated list of transactions for a given account within a date range.
The date range must not exceed 3 months.
Path Parameters
accountIdentifier– NUBAN oraccountReference.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
startDateTimeUTC | string | Yes | Start timestamp (ISO‑8601, e.g., 2026-06-08T00:00:00). |
endDateTimeUTC | string | Yes | End timestamp. |
pageSize | integer | No | Number of records per page (default 20). |
pageNumber | integer | No | Page index (0‑based). |
referenceNumber | string | Yes | Request reference (passed as query param). |
Note: This is a GET request. No request body is required. The referenceNumber should be included as a query parameter (?referenceNumber=...).
Hash Computation
accountIdentifier + startDateTimeUTC + endDateTimeUTC + hashKeyResponse 200 OK
200 OK| Field | Type | Description |
|---|---|---|
referenceNumber | string | Echo of referenceNumber query param. |
statusCode | string | "0" for success. |
statusMessage | string | "success". |
itemCount | integer | Number of items on this page. |
totalItems | integer | Total number of matching transactions. |
totalPages | integer | Total pages. |
currentPage | integer | Current page index. |
transactions | array | List of transactions. |
transactions[].transactionType | string | "CREDIT" or "DEBIT". |
transactions[].amount | number | Transaction amount. |
transactions[].transactionDate | string | UTC timestamp of the transaction. |
transactions[].status | string | Transaction status (e.g., "SUCCESSFUL"). |
{
"referenceNumber": "REF-HIST-001",
"statusCode": "0",
"statusMessage": "success",
"itemCount": 3,
"totalItems": 27,
"totalPages": 3,
"currentPage": 0,
"transactions": [
{
"transactionType": "CREDIT",
"amount": 1500.00,
"transactionDate": "2026-06-11T10:22:16.920",
"status": "SUCCESSFUL"
}
// ...
]
}Callback (Webhook) Notifications
Paga sends HTTP POST notifications to your server for important events.
You can set a global webhook URL in your Paga dashboard, or override it per account using the callbackUrl field when creating/updating an account.
Verifying Callback Authenticity
Every callback payload contains a hash field.
Compute the expected hash and compare it with the received value to ensure the notification is genuine.
General formula (varies slightly per notification type):
SHA-512( field1 + field2 + ... + hashKey )Always use the raw values from the payload, concatenated as a single string.
For missing fields, use an empty string "".
9. Funding Notification
Sent when an external payer deposits money into a subsidiary account (e.g., via bank transfer).
Callback Payload
| Parameter | Type | Description |
|---|---|---|
statusCode | string | "0" for success. |
statusMessage | string | "success". |
transactionReference | string | May be null. |
fundingTransactionReference | string | Unique reference of the funding transaction. |
fundingPaymentReference | string | The original payment reference from the sender. |
accountNumber | string | Subsidiary account NUBAN. |
accountName | string | Account display name. |
financialIdentificationNumber | string | Customer’s BVN (called iifiNumber in requests). |
amount | number | Amount credited. |
clearingFeeAmount | number | Fee deducted (may be null). |
payerDetails | object | Payer information. |
payerDetails.paymentReferenceNumber | string | Payment reference. |
payerDetails.narration | string | Payment narration. |
payerDetails.paymentMethod | string | e.g., "BANK_TRANSFER". |
payerDetails.payerName | string | Name of the payer (if available). |
payerDetails.payerBankName | string | Payer’s bank name. |
payerDetails.payerBankAccountNumber | string | Payer’s bank account number. |
narration | string | Payment narration (duplicate for convenience). |
hash | string | SHA‑512 hash for verification. |
transactionDate | string | UTC timestamp of the transaction. |
Hash Verification (Funding)
Concatenate:
transactionReference + fundingTransactionReference + transactionDate + amount + accountNumber + hashKey(If transactionReference is null, use an empty string "".)
Expected Response
Return 200 OK with body:
{"status": "SUCCESS"}10. Charge Notification
Sent when a charge (withdrawal) is completed (event: SUBSIDIARY_ACCOUNT_CHARGE_COMPLETE).
Callback Payload
| Parameter | Type | Description |
|---|---|---|
event | string | "SUBSIDIARY_ACCOUNT_CHARGE_COMPLETE". |
notificationId | string | Unique ID for this notification. |
statusCode | string | "0". |
statusMessage | string | "SUCCESS". |
externalReferenceNumber | string | The referenceNumber from your charge request. |
transactionType | string | "DEBIT". |
transactionDate | string | UTC timestamp. |
accountReference | string | Account reference (or NUBAN) of the account. |
totalDebitAmount | number | amount + fee. |
fee | number | Processing fee (0 if none). |
amount | number | Net amount credited to the merchant. |
accountNumber | string | Subsidiary account NUBAN. |
hash | string | SHA‑512 hash. |
Hash Verification (Charge)
Concatenate:
externalReferenceNumber + transactionDate + amount + accountNumber + hashKeyjso(Note: there is no transactionReference in this callback.)
Expected Response
{"status": "SUCCESS"}11. Top‑Up Notification
Sent when a top‑up is completed (event: SUBSIDIARY_ACCOUNT_TOP_UP_COMPLETE).
Callback Payload
| Parameter | Type | Description |
|---|---|---|
event | string | "SUBSIDIARY_ACCOUNT_TOP_UP_COMPLETE". |
notificationId | string | Unique notification ID. |
statusCode | string | "0". |
statusMessage | string | "SUCCESS". |
externalReferenceNumber | string | Your top‑up request referenceNumber. |
transactionType | string | "CREDIT". |
transactionDate | string | UTC timestamp. |
accountReference | string | Account reference. |
totalDebitAmount | number | Amount deducted from merchant’s position (amount + fee). |
fee | number | Fee. |
amount | number | Net amount credited to the subsidiary account. |
accountNumber | string | NUBAN. |
hash | string | SHA‑512 hash. |
Hash Verification (Top‑Up)
Same as charge:
externalReferenceNumber + transactionDate + amount + accountNumber + hashKeyExpected Response
{"status": "SUCCESS"}Error Handling
Paga uses standard HTTP status codes and a consistent JSON error body.
HTTP Status Codes
| Code | Meaning |
|---|---|
| 200 | Success. |
| 400 | Bad request – invalid parameters. |
| 401 | Authentication failed. |
| 404 | Resource not found (e.g., unknown account). |
| 422 | Unprocessable – business rule violation (e.g., insufficient funds). |
| 500 | Internal server error. |
Error Response Format
{
"statusCode": "1001",
"statusMessage": "Account not found",
"referenceNumber": "..."
}statusCodeis a non‑zero string (see Paga Collect Status Codes for the full list).referenceNumberechoes the request reference if provided.
Handling Timeouts and Server Errors
Network timeouts or 500 Internal Server Error responses can leave the state of a transaction uncertain. To avoid accidental double‑processing or incorrect rollbacks:
- Do not assume failure. If a request times out or receives a
500error, the transaction may have already succeeded on Paga’s side. - Do not reverse or rollback the transaction in your system until you have confirmed the final outcome.
- Wait for the webhook notification. All successful transactions (charges, top‑ups, transfers, fundings) will eventually produce a callback event with the definitive status. Use this to update your local state.
- If you must retry, use the same
referenceNumber– Paga’s API is idempotent, so retrying will return the original result (success or failure) without creating a duplicate transaction.
Idempotency
Every financial operation (create account, charge, top‑up, transfer) uses the referenceNumber as an idempotency key.
Submitting the same referenceNumber more than once will not create duplicate transactions or accounts; the API will return the result of the original operation.
This allows you to safely retry a request in case of network failure without risk of double‑charging or double‑crediting. Always generate a unique referenceNumber for each new operation, and reuse the same value only for retries.
Appendix
Get Banks
To obtain the bankPublicId needed for auto‑sweep configuration, use the Get Banks endpoint.
GET /banksIt returns a list of supported banks with their IDs and names.
Refer to the full Paga Collect API reference for details.
Updated about 4 hours ago
