Perform Internal Transfer
The Internal Transfer API allows you to move funds between accounts within your institution in the same currency. Internal transfers can be made between main accounts and sub-accounts and vice versa. The destination account must not have a settlement account configured
Endpoint
POST banking/v2/transfers/internal
Authentication
Requires a valid API key provided in the header: x-waza-api-key
.
Request Body
Property | Type | Required | Description |
---|---|---|---|
source_account_id | string (UUID) | ✅ | Unique identifier of the source account |
destination_account_id | string (UUID) | ✅ | Unique identifier of the destination account |
amount | integer | ✅ | Amount to transfer in minor units (cents/pence) |
client_reference | string | ❌ | Client-defined unique reference for idempotency or reconciliation |
memo | string | ❌ | Internal note about the transfer (not visible to recipient) |
client_metadata | object | ❌ | Custom metadata to associate with this transfer |
Response
A successful request returns an HTTP 200 status code and a Transfer object.
The response includes all transfer details including:
- Transfer ID and status
- Source and destination account information
- Amount details (source amount, billing amount, destination amount)
- Timestamps and processing information
- Any fees applied (typically none for internal transfers)
-
Examples
Example 1: Basic Internal Transfer
{
"source_account_id": "abcdef12-3456-7890-abcd-ef1234567890",
"destination_account_id": "98765432-9876-9876-9876-987654321098",
"amount": 250000
}
Example 2: Internal Transfer with Reference and Memo
{
"source_account_id": "abcdef12-3456-7890-abcd-ef1234567890",
"destination_account_id": "98765432-9876-9876-9876-987654321098",
"amount": 150000,
"client_reference": "INT-TRF-20230514-001",
"memo": "Quarterly budget allocation to marketing department"
}
Example 3: Internal Transfer with Metadata
{
"source_account_id": "abcdef12-3456-7890-abcd-ef1234567890",
"destination_account_id": "98765432-9876-9876-9876-987654321098",
"amount": 500000,
"client_reference": "PAYROLL-2023-05-001",
"memo": "Employee salary payment",
"client_metadata": {
"department": "finance",
"payroll_batch_id": "BATCH-2023-05",
"employee_count": 25
}
}
Sample CURL Request
curl -X POST "https://api.waza.co/banking/v2/transfers/internal" \
-H "x-waza-api-key: your-api-key" \
-H "Content-Type: application/json" \
-d '{
"source_account_id": "abcdef12-3456-7890-abcd-ef1234567890",
"destination_account_id": "98765432-9876-9876-9876-987654321098",
"amount": 250000,
"client_reference": "INT-TRF-20230514-001",
"memo": "Internal department transfer"
}'
Important Considerations
Account Requirements
- Account Type: Both accounts must be of type
VIRTUAL_EXTERNAL
- Settlement Account: Destination account must not have a settlement account configured
Transfer Characteristics
- Instant Processing: Internal transfers are processed immediately
- No Fees: No fees are charged for internal transfers
- Same Currency: Transfers occur in the same currency as the accounts
- Real-time Balance Updates: Account balances are updated instant
Idempotency
- Use the
client_reference
field to ensure idempotency
Error Scenarios
Common error scenarios include:
- Insufficient Balance: Source account doesn't have enough funds
- Invalid Account Type: Accounts are not of the supported type
- Settlement Account Conflict: Destination account has a settlement account configured
- Duplicate Reference: Client reference already used for another transfer
Each error will return an appropriate HTTP status code and error message detailing the specific issue.
Updated 17 days ago