You can move funds between any two wallets on your account using an intra-transfer. This is useful when you want to top up a working wallet from your settlement wallet — for example, loading your payroll wallet before sending disbursements.
Both wallets must belong to your business and must be in the same currency. Intra-transfers are not for cross-currency movements; for that, use forex exchange.
The source wallet must have sufficient available_balance to cover the
transfer amount. Funds that are still clearing do not count toward your
available balance.
Transfer funds
Send a POST request to /api/v1/wallets/{source-wallet-id}/intra_transfer/ where {source-wallet-id} is the wallet_id of the wallet you want to debit.
{
"wallet_id": "<destination-wallet-id>",
"amount": "10000",
"narrative": "Moving funds to payroll wallet"
}
| Field | Type | Required | Description |
|---|
wallet_id | string | Yes | The wallet_id of the destination wallet. |
amount | string | Yes | The amount to transfer. Must be greater than zero. |
narrative | string | Yes | A description for this transfer. Appears in both wallet statements. |
curl --request POST \
--url https://app.kulmipay.com/api/v1/wallets/wlt_abc123/intra_transfer/ \
--header "Authorization: Bearer <your-token>" \
--header "Content-Type: application/json" \
--data '{
"wallet_id": "wlt_def456",
"amount": "10000",
"narrative": "Moving funds to payroll wallet"
}'
A successful response returns the updated state of both wallets:
{
"origin": {
"wallet_id": "wlt_abc123",
"label": "default",
"can_disburse": true,
"currency": "KES",
"wallet_type": "SETTLEMENT",
"current_balance": "110000.00",
"available_balance": "110000.00",
"updated_at": "2024-11-01T10:00:00Z"
},
"destination": {
"wallet_id": "wlt_def456",
"label": "Payroll Wallet",
"can_disburse": true,
"currency": "KES",
"wallet_type": "WORKING",
"current_balance": "60000.00",
"available_balance": "60000.00",
"updated_at": "2024-11-01T10:00:00Z"
}
}
View a wallet statement
To retrieve transactions for a specific wallet, send a GET request to /api/v1/wallets/{wallet_id}/transactions/.
GET /api/v1/wallets/wlt_abc123/transactions/
Each transaction in the response includes:
| Field | Description |
|---|
transaction_id | Unique identifier for the transaction. |
value | The amount. Negative values are debits. |
running_balance | The wallet balance immediately after this transaction. |
narrative | A description of the transaction. |
trans_type | The type: SALE, PAYOUT, EXCHANGE, CHARGE, ADJUSTMENT, or DEPOSIT. |
status | One of AVAILABLE, CLEARING, ON-HOLD, CANCELLED, REFUNDED, or ADJUSTMENT. |
created_at | When the transaction was created. |
Filter by date range or transaction type
Append query parameters to narrow your results:
# Transactions from November 2024
GET /api/v1/wallets/wlt_abc123/transactions/?created_at__gte=2024-11-01&created_at__lte=2024-11-30
# Only payouts
GET /api/v1/wallets/wlt_abc123/transactions/?trans_type=PAYOUT
To retrieve transactions across all your wallets at once, use GET /api/v1/wallets/transactions/ instead.