API vs dashboard
How bank transfers work
1
Create a transfer
Create a transfer with amount, description, recipient bank details, and optionally
wallet_source. The account is validated before sending.2
Charge applied
A charge is applied. Total deducted = amount + charge.
3
Balance deducted
Balance is deducted from the selected wallet (main or card) immediately before the provider call.
4
Transfer sent
Transfer is sent to the destination account.
5
Status set
Status is set to
pending, processing, completed, or failed.6
Get the result
Poll
GET /bank-transfer/{reference} or use webhooks for the final result.API endpoints
Authentication
All bank transfer API requests require authentication using your API key. Include your API key in the request headers:Authorization: Basic base64(api_key:api_secret)
Wallet selection
Every business has two wallets. Passwallet_source to choose which wallet to debit:
If omitted,
wallet_source defaults to main. If a transfer fails, the refund goes back to the same wallet that was debited. Use card to withdraw card payment collections. See Card Payments for how card wallet funds accumulate.
Create a bank transfer
Create a new bank transfer to any valid bank account. Send recipientbank_name and bank_account_number (and optionally bank_account_name, bank_branch). The recipient account is validated before the transfer; you do not need verified business bank details. The balance (transfer amount + charge) is deducted immediately and the transfer is sent. Status is processing or completed on success, or failed on error (balance is refunded on failure).
Endpoint
POST https://wallet.wearemarz.com/api/v1/bank-transfer
Request body
bank_account_name, bank_branch, and wallet_source are optional. If bank_account_name is omitted, it is fetched from the validate-account step. If wallet_source is omitted, it defaults to main. Use card to withdraw from the card wallet. Use bank names from /bank-transfer/banks (e.g. Equity Bank, Stanbic Bank).
Request parameters
Response (success) - HTTP 201
The reference is a UUID; use it withGET /bank-transfer/{reference} to check status. Possible status: processing, completed.
Get bank transfer availability
Check if bank transfer is available for your business. Subscription details are handled internally and are not exposed. EndpointGET https://wallet.wearemarz.com/api/v1/bank-transfer/services
Response (success)
Get transfer details
Retrieve a specific bank transfer by the reference returned from the create endpoint (UUID format). Use this to poll status. Possible status values:pending, processing, completed, failed.
Endpoint
GET https://wallet.wearemarz.com/api/v1/bank-transfer/{reference}
Replace {reference} with the UUID from the create response (e.g. b0faa118-3e00-40ee-9513-67e371f9a32f).
Validate bank account
Validate the recipient account before creating a transfer to ensure it is valid and working. Call this endpoint withbank_name and account_number to get the account holder name and confirm the account exists. Use it when building UIs (e.g. dashboard “Send to a different bank account”) or in your flow before calling create transfer. The create-transfer API also validates internally, but validating first gives you early confirmation and avoids failed transfers. No verified business bank is required.
Endpoint
POST https://wallet.wearemarz.com/api/v1/bank-transfer/validate
Request body
Request parameters
Response (success)
Response fields
Validation errors
BANK_NOT_SUPPORTED(400) - bank name not in supported listVALIDATION_FAILED(400) - provider rejected the accountSERVICE_NOT_AVAILABLE(400) - no active bank transfer subscription
Get supported banks
Retrieve a list of all supported banks for bank transfers and account validation. This endpoint returns bank codes, display names, and common aliases. EndpointGET https://wallet.wearemarz.com/api/v1/bank-transfer/banks
Response (success)
STANBIC) and Stanchart Bank / Standard Chartered (code STAN) are different banks. Use the exact bank name from this list when validating or transferring to avoid provider errors.
Usage tips
- Use any of the bank names from the aliases array when calling
/bank-transfer/validate - The
codefield is a unique identifier for each bank - Bank names are case-insensitive, so “Equity Bank”, “equity bank”, or “EQUITY BANK” all work
- Always use
/bank-transfer/banksto get the current list; bank codes must match exactly for the provider to accept the transfer
Transfer statuses
When you create or query a transfer, status can be:Prerequisites
- For the API: provide recipient bank details (
bank_name,bank_account_number) in each request. The account is validated before the transfer; no verified business bank account is required. - An active bank transfer service (subscription is handled internally)
- Sufficient balance in the selected wallet (transfer amount + charge). Use
wallet_source = mainorcard. - Account must not be frozen. Only one transfer can be
processingorpendingat a time.
Best practices
Check availability
Use
GET /bank-transfer/services to see if bank transfer is available for your business.Verify balance
Ensure you have sufficient balance in the selected wallet: you pay transfer amount plus charge; the recipient receives the transfer amount. Check
available_balance (main wallet) or card_balance (card wallet) from GET /balance.Handle webhooks
Set up webhooks to receive real-time notifications when your bank transfers are processed, completed, or failed.
Store references
Save the reference number returned in the response. Use it to check the status of your transfer later.
Check status
Transfers can have statuses:
processing, completed, or failed. Use the reference to check status via the GET endpoint.Validate first
Validate before sending: call
POST /bank-transfer/validate with bank_name and account_number before creating a transfer.Error responses
Error responses include an
error_code and data with details. On provider failure your balance is refunded.Debugging & logging
Bank transfer requests and responses are logged for troubleshooting. Checkstorage/logs/laravel.log and storage/logs/bank-YYYY-MM-DD.log for request/response entries.
