SZNDSZND

Bank transfer collection

Collect from customers via bank transfer in supported currencies. The customer transfers the exact total from any bank app; you integrate using the same hosted checkout pattern as card collection.

For payment instructions returned directly in API responses (no hosted UI), use a deposit quote flow via Quotes.

How it works

Unlike card or mobile money, there is no customer approval step with us — the transfer happens entirely in the customer's own bank app. On method selection we issue a virtual account: a timed account number, bank name, and account name created for that payment. The customer transfers the exact total before it expires; the provider notifies us and the payment completes.

No bank selection is needed from the client. The account details come back in the payment instructions — the customer can pay from any bank.

Initialize payment

POST /api/v1/client/checkout/initialize. Set currency to the corridor you intend (NGN, GBP, EUR).

Authentication

Use Authentication for signing.

Request body (example)

json
{  "email": "customer@example.com",  "first_name": "Ada",  "last_name": "Obi",  "amount": "50000.00",  "currency": "NGN",  "reference": "ORDER-12345",  "redirectUrl": "https://your-website.com/payment-success",  "description": "Wallet top-up",  "checkout_display_name": "Your Business"}

Success response (shape)

json
{  "success": true,  "message": "Transaction Initialized Successfully",  "data": {    "access_code": "…",    "checkout_link": "https://…",    "transactionRef": "…",    "reference": "ORDER-12345",    "redirectUrl": "https://your-website.com/payment-success"  }}

Select the method

POST /api/v1/checkout/:access_code/select-method with {"method": "BANK_TRANSFER"}. The response carries the virtual account:

json
{  "account_number": "1234567890",  "account_name": "SZND-Ada Obi",  "bank_name": "Example Microfinance Bank",  "payment_instructions": "Please transfer NGN 50000.00 to account 1234567890 (Example Microfinance Bank, SZND-Ada Obi) before it expires."}

Show the account number, bank name, account name, exact total, and expiry to the customer. They complete the transfer from any bank app. Expired accounts cannot receive funds — the customer must start over for a fresh account.

Quotes flow (no hosted UI)

To receive payment instructions directly in API responses, use a deposit quote instead of hosted checkout.

Create — POST /api/v1/client/quotes (API key required):

json
{  "source_currency": "NGN",  "target_currency": "NGN",  "source_amount": "50000.00",  "quote_type": "DEPOSIT",  "tz": "Africa/Lagos",  "narration": "Wallet top-up"}

No bank_code or phone_number — bank transfer needs neither. The response returns a quote_id with status CREATED.

Accept — POST /api/v1/client/quotes/:id/accept (no body). The response carries the virtual account in payment_details.ngn_payment_info:

json
{  "quote_id": "…",  "transaction_id": "…",  "transaction_reference": "…",  "payment_details": {    "type": "ngn_payment_info",    "ngn_payment_info": {      "account_number": "1234567890",      "account_name": "SZND-Ada Obi",      "bank_name": "Example Microfinance Bank",      "payment_instructions": "Please transfer NGN 50000.00 to account 1234567890 (Example Microfinance Bank, SZND-Ada Obi) before it expires."    }  },  "total_payable": "50000.00",  "status": "AWAITING_PAYMENT"}

Confirm

Receive the final result via webhooks (source of truth) and store your reference with the returned transactionRef for reconciliation.