By Muhammad Samu 8th Apr, 2026
The good news is that Pay with Transfer works across every integration path Monnify supports: the frontend One-Time Payment SDK, a server-side API transaction, and even a fully custom UI where you surface just the account number yourself.
This guide covers all three paths, explains how to get a specific virtual account number for a chosen bank, and shows you how to use the Monnify Bank Simulator to complete test transfers in sandbox without touching a real bank account.
Regardless of how a transaction is started, the core flow is the same:
In sandbox, step 3 is handled by the Monnify Bank Simulator instead of a real bank app. It works for every integration path described below.
If you are already using the Monnify One-Time Payment SDK to open the checkout modal, enabling Pay with Transfer requires no extra API calls. Just include ACCOUNT_TRANSFER in the paymentMethods array when you call MonnifySDK.initialize(). Monnify handles everything else, and the virtual account is displayed inside the modal.
When the modal opens, switch to the Pay with Transfer tab. You will see a bank name and account number. Use these in the Monnify Bank Simulator (Step 3) to complete the test transfer.
When you initiate the transaction from your server using the Initialize Transaction API, Monnify returns a checkoutUrl and a transactionReference. The checkout URL leads to the same hosted page as the SDK modal, and opening it is the simplest way to show the customer their virtual account. You can also skip the checkout URL entirely and build your own account display, which is covered in Path 3.
Redirect or link the customer to the checkoutUrl and they will see the virtual account details on the Monnify-hosted page. From there you follow the same simulator steps in Step 3.
Some businesses want full control over the payment UI and only need the raw virtual account number so they can render it themselves. Monnify supports this through the Bank Transfer Init Payment endpoint.
After calling Initialize Transaction (Path 2) and obtaining the transactionReference, make a second call to:
POST /api/v1/merchant/bank-transfer/init-payment
Pass the transactionReference and the bankCode of the bank you want to issue the virtual account from. Monnify returns the account number, account name, and bank name you can display directly in your own UI, with no Monnify-hosted page required.
Once you have a virtual account number, whether from the SDK modal, the Monnify checkout page, or your own custom UI, use the Monnify Bank Simulator to act as the customer and complete the transfer. This works for all three paths above.
/api/v1/merchant/bank-transfer/init-payment.PAID and dispatches the webhook.After the simulator posts the transfer, verify the payment server-side. There are two complementary approaches; use both for a robust integration.
Monnify POSTs a notification to your configured webhook URL when the payment is confirmed. Always validate the monnify-signature header before acting on the payload.
Use the Get Transaction Status endpoint to query payment status on demand, useful for confirming on a callback page or reconciling missed webhooks.
/success page. Always verify payment status server-side via webhook or the status API before fulfilling any order./api/v1/merchant/bank-transfer/init-payment. Each sandbox contract is assigned specific test banks.200; Monnify retries on any other status./api/v1/merchant/bank-transfer/init-payment returns an error: Make sure the transactionReference is from a valid, unexpired transaction and that the bankCode you supplied is one of the banks available in your sandbox contract.https://sandbox.monnify.com during development. Switch to https://api.monnify.com in production.paymentMethods: ["ACCOUNT_TRANSFER"] to restrict checkout to transfer only (applies to both SDK and API paths)./api/v1/merchant/bank-transfer/init-payment with your chosen bankCode and transactionReference to get the account details.monnify-signature header on every incoming webhook.Ready to go further? Read about securing and handling Monnify webhooks or explore the full Monnify API reference.