Business Sub-Wallets
A sub-wallet (also called a business-issued wallet) is an additional wallet you can create under your own business — for example, to separate funds by purpose (payroll, vendor payments, project budgets) while still operating under the same business ID. Sub-wallets are funded from your main business wallet and can themselves be used as the source of a payout.
Related guides: Fund a Sub-Wallet · Bulk Fund Sub-Wallets · Pay Out From a Sub-Wallet
Create a Sub-Wallet
Request
POST {BASE_URL}/api/v1/business-sub-wallets
Required Parameters
| Parameter |
Type |
Description |
| businessId |
string |
Your business ID |
| walletName |
string |
A label for the sub-wallet (e.g. "Payroll Wallet") |
| currency |
string |
Currency code, e.g. NGN |
| reference |
string |
Your own unique reference for this sub-wallet. This is what you'll use later to fund it (see Bulk Fund Sub-Wallets), so choose something you can reliably look up |
| customer |
object |
Details of the sub-wallet's beneficial owner — see below |
| customer.name |
string |
Full name of the wallet's beneficial owner |
| customer.bvn |
string |
Bank Verification Number |
| customer.email |
string |
Valid email address |
| dob |
string |
Date of birth, format YYYY-MM-DD |
Other customer fields (optional):
| Field |
Type |
Description |
| customer.phone |
string |
International format, e.g. +2348012345678 |
| customer.externalId |
string |
Your own reference for this customer |
| customer.address |
object |
line1, line2, city, state, postalCode, countryCode |
| customer.nin |
string |
National Identification Number |
Optional Parameters
| Parameter |
Type |
Description |
| includeFundingAccount |
boolean |
Set to true to also provision a dedicated virtual bank account for this sub-wallet, using the customer details above. Defaults to false |
| notificationUrl |
string |
Callback URL for funding notifications on the account. Only used when includeFundingAccount=true |
- Path:
/api/v1/business-sub-wallets
- Method: POST
- Request Body:
{
"businessId": "your_business_id",
"walletName": "Payroll Wallet",
"reference": "PAYROLL-WALLET-001",
"currency": "NGN",
"customer": {
"name": "Jane Doe",
"bvn": "12345678901",
"email": "jane.doe@example.com",
"phone": "+2348012345678"
},
"dob": "1990-05-14",
"includeFundingAccount": false
}
Response
| Field |
Type |
Description |
| id |
string |
Sub-wallet record ID |
| businessId |
string |
Your business ID |
| walletId |
string |
The underlying wallet ID — use this wherever a wallet ID is expected (e.g. beneficiaryWalletId, walletId on transfer endpoints) |
| walletName |
string |
The label you gave the sub-wallet |
| customerName |
string |
The beneficial owner's name, as supplied in customer.name |
| email |
string |
The beneficial owner's email, as supplied in customer.email |
| reference |
string |
Your reference |
| currency |
string |
Currency of the sub-wallet |
| availableBalance |
double |
Current available balance |
| lienAmount |
double |
Amount currently on lien/hold |
| walletLimit |
object |
isPayoutAllowed, maxSinglePayout, minSinglePayout, maxDailyPayout |
| deleted |
boolean |
Whether the sub-wallet has been deleted |
| createdDate |
datetime |
Creation timestamp |
| lastUpdatedDate |
datetime |
Last update timestamp |
| fundingAccounts |
array |
accountName, accountNumber, bankName for each funding account provisioned (empty if none) |
{
"status": 200,
"message": "Success",
"data": {
"id": "sub-wallet-id",
"businessId": "your_business_id",
"walletId": "wallet_uuid",
"walletName": "Payroll Wallet",
"customerName": "Jane Doe",
"email": "jane.doe@example.com",
"reference": "PAYROLL-WALLET-001",
"currency": "NGN",
"availableBalance": 0.00,
"lienAmount": 0.00,
"walletLimit": {
"isPayoutAllowed": true,
"maxSinglePayout": 1000000.00,
"minSinglePayout": 100.00,
"maxDailyPayout": 5000000.00
},
"deleted": false,
"createdDate": "2026-01-01 01:01:01",
"lastUpdatedDate": "2026-01-01 01:01:01",
"fundingAccounts": []
}
}
Notes
- Your business must have sub-wallet creation enabled. If it isn't, this request is rejected — contact support to have it turned on.
customer.bvn and customer.email must both be non-blank — this is required for every sub-wallet, whether or not you request a funding account.
- Requesting
includeFundingAccount=true additionally requires funding-account provisioning to be enabled on your business.
(businessId, reference) must be unique — creating a second sub-wallet with a reference you've already used returns a 409 Conflict.
- A newly created sub-wallet always starts with a zero balance.
customer.bvn and dob are captured but not returned in any response — only customerName and email are echoed back.
Search / List Sub-Wallets
Request
GET {BASE_URL}/api/v1/business-sub-wallets?merchantId={merchantId}
Query Parameters
| Parameter |
Type |
Description |
| merchantId |
string |
Required |
| id |
string |
Filter by sub-wallet record ID |
| walletId |
string |
Filter by underlying wallet ID |
| walletName |
string |
Filter by exact wallet name |
| reference |
string |
Filter by exact reference |
| currency |
string |
Filter by currency |
| deleted |
boolean |
Filter by deleted status |
| businessIds |
string (array) |
Filter by business IDs |
| createdFrom |
date |
Filter by creation date (format: YYYY-MM-DD) |
| createdTo |
date |
Filter by creation date (format: YYYY-MM-DD) |
| lastUpdatedFrom |
date |
Filter by last-updated date (format: YYYY-MM-DD) |
| lastUpdatedTo |
date |
Filter by last-updated date (format: YYYY-MM-DD) |
| pageNo |
number |
Page number (default 1) |
| pageSize |
number |
Page size (default 30) |
Response
A paginated list — same shape as Fetch List of Transfer Requests (pageNo, pageSize, lastPage, totalNumberOfItems, content), where each item in content has the same shape as the Create a Sub-Wallet response, with availableBalance/lienAmount/walletLimit reflecting live values.
Search Sub-Wallet Transactions
Request
GET {BASE_URL}/api/v1/business-sub-wallets/transactions?merchantId={merchantId}
Query Parameters
| Parameter |
Type |
Description |
| merchantId |
string |
Required |
| id |
string |
Filter by transaction ID |
| transactionType |
string |
Filter by type (CREDIT, DEBIT, LIEN, REVERSAL, UNLIEN) |
| onusReference |
string |
Filter by system-generated reference |
| referenceId |
string |
Filter by the underlying transfer/payment ID |
| walletIds |
string (array) |
Filter by sub-wallet's underlying wallet IDs |
| businessIds |
string (array) |
Filter by business IDs |
| currency |
string |
Filter by currency |
| createdFrom |
date |
Filter by creation date (format: YYYY-MM-DD) |
| createdTo |
date |
Filter by creation date (format: YYYY-MM-DD) |
| pageNo |
number |
Page number (default 1) |
| pageSize |
number |
Page size (default 30) |
Response
A paginated list of transactions, same shape as Fetch Wallet Transactions.
Download Sub-Wallet Transactions
Request
GET {BASE_URL}/api/v1/business-sub-wallets/transactions/download?merchantId={merchantId}&recipientEmail={email}&recipientName={name}
Query Parameters
| Parameter |
Type |
Description |
| merchantId |
string |
Required |
| recipientEmail |
string |
Required. The generated report is emailed here — it is not returned in the response body |
| recipientName |
string |
Required |
| transactionType |
string |
Filter by type (CREDIT, DEBIT, LIEN, REVERSAL, UNLIEN) |
| walletId |
string |
Filter to a single sub-wallet's underlying wallet ID. Required if accountStatement=true |
| businessIds |
string (array) |
Filter by business IDs |
| currency |
string |
Filter by currency |
| createdFrom |
date |
Filter by creation date (format: YYYY-MM-DD) |
| createdTo |
date |
Filter by creation date (format: YYYY-MM-DD) |
| accountStatement |
boolean |
If true, generates a PDF statement for a single sub-wallet (requires walletId). If false (default), generates a CSV of matching transactions |
| address |
string |
Address to print on a PDF statement |
Response
This endpoint triggers report generation asynchronously — it returns immediately and the file is delivered by email to recipientEmail, not returned in the response body.
{
"status": 200,
"message": "Success",
"data": null
}
Notes
- If you supply
walletId, it must reference a sub-wallet you own (via a business under merchantId) — otherwise the request returns 404 Not Found.