Skip to main content
Pay with transfer issues a one-time virtual account for this payment. The customer transfers the exact amount from their bank app. Credit happens when the inbound transfer is confirmed. Email on initialize is required for this channel.

Request an account

After initialize, from checkout (access code, not the secret key):
There is no request body. The account is on data:
Show bank name, account number, account name, and a countdown from expiresInSeconds. Repeating the call while the account is valid returns the same account.

Confirm the transfer

The customer pays at their bank.
  1. Subscribe to payment.completed and payment.failed.
  2. Optionally listen to checkout.awaiting_transfer, then checkout.completed.
  3. Verify before fulfilling.
Wrong amount: checkout can emit amount_mismatch while the window is open. Keep the same account on screen and ask them to send the exact total.

Test mode

On test, POST /v1/payment/checkout/charge/bank-transfer/simulate with the access code:
Allowed scenarios: success, failed, abandoned. Rejected on live. When GTBank sandbox is the active transfer rail, success creates a sandbox virtual account and funds it so the payment completes through the same webhook path as production.