Bank Transfer allows you to move funds from your business balance to a bank account. You pay the transfer amount plus a charge; the recipient receives the transfer amount.

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. Pass wallet_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 recipient bank_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 with GET /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. Endpoint GET 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 with bank_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 list
  • VALIDATION_FAILED (400) - provider rejected the account
  • SERVICE_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. Endpoint GET https://wallet.wearemarz.com/api/v1/bank-transfer/banks Response (success)
Stanbic Bank (code 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 code field 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/banks to 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 = main or card.
  • Account must not be frozen. Only one transfer can be processing or pending at 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. Check storage/logs/laravel.log and storage/logs/bank-YYYY-MM-DD.log for request/response entries.