Pay with Bank (Direct Debit)
Kora lets you accept payments by setting up direct debit mandates on your customers’ bank accounts. The Pay with Bank (or direct debit) method on Kora is available via Checkout and API.
Pay with Bank on Checkout
The Pay with Bank method on the Checkout allows customers to complete their transactions quickly and securely in four (4) easy steps.
1 - Select a bank
After choosing the ‘Pay with Bank’ option on the Checkout, the customer selects their bank from the list of available banks for this payment method. If the customer’s preferred bank is not one of the options on the list, they can recommend the bank to Kora to make it available in a future update. We are continuously updating the list of banks for this payment method.

2 - Enter bank details
Depending on the bank, the customer would need to enter either their account number, phone number or a unique ID as required by their bank. This information is used to validate that the customer is an account holder with the bank.
3 - Authorization
The customer’s bank usually requires the customer to authenticate the transaction before it can be completed. This authentication may be done using a one-time pin (OTP) sent to the customer, a payID generated through their banking app, or any other form of authentication set by the customer’s bank. With a successful authorization, authentication checks and sufficient balance a successful charge is made on the customer’s account.
4 - Verify payment
Once the customer has been charged successfully, the transaction would show on your Kora dashboard as successful.
Please note that customers who choose to use Pay with Bank on Checkout should have online/internet banking enabled on their accounts.
Pay with Bank via API
With the Pay with Bank API, you can:
- Provide your customers with a direct option to pay with their bank.
- Maintain control over the payment journey.
- Receive real-time transaction updates via webhooks.
The Pay with Bank API currently supports direct debit collections from Opay and Palmpay bank accounts.
To initiate a payment, make a POST request to the endpoint below:
{{base_url}}/api/v1/charge/pay-with-bank
The request body should have the following parameters:
Field | Data Type | Required? | Description |
---|---|---|---|
| Number | True | The amount of money to be debited. Minimum is NGN 200.00. |
| String | True | The unique code for each supported bank. Please refer to the bank codes table below. You can only pass bank codes for the banks that have been enabled for your account. |
| String | False | The URL redirected to after transaction is completed. |
| String | True | The currency of the transaction. |
| String | True | A unique reference for the payment. This reference must be at least 8 characters long. |
| String | True | The name of your customer. |
| String | True | The email of your customer. |
| Boolean | False | This sets who bears the fees of the transaction. If it is set to |
| String | False | Information/narration about the transaction. |
| String | False | The webhook URL to be called when the transaction is complete. |
| Object | False | It takes a JSON object with a maximum of 5 fields/keys. Empty JSON objects are not allowed.
Each field name has a maximum length of 20 characters. Allowed characters: |
Here’s an example of what the request should look like:
{
"amount": 600,
"currency": "NGN",
"reference": "CPY-GB-h2223320000024hhh",
"bank_code": "100004",
"redirect_url": "https://www.example.com",
"customer": {
"name": "John Doe",
"email": "[email protected]"
},
"narration": "Payment for Cloth",
"merchant_bears_cost": true,
"notification_url": "https://webhook.site/b97227be-3cc0-4572-9a45-0cf944b976d3"
}
The response to this request could look like this:
{
"status": true,
"message": "Pay With Bank initiated successfully",
"data": {
"currency": "NGN",
"amount": 600,
"fee": 25,
"vat": 1.88,
"transaction_reference": "KPY-CA-qVa4wceXkwEpMPw",
"payment_reference": "CPY-GB-h2223320000024hhh",
"status": "processing",
"merchant_bears_cost": true,
"customer": {
"name": "John Doe",
"email": "[email protected]"
},
"narration": "Payment for Cloth",
"authorization": {
"redirect_url": "https://redirect.example.com/redirect/payment/KPY-CA-qVa4wceXkwEpMPw"
},
"bank_account": {
"bank_name": "Opay"
}
}
}
After this, you should expect to receive a webhook notification.
You can set your application to receive a confirmation via webhooks when a payment is successful. Please visit Webhooks to see more information about the webhook request body and how to verify and handle the webhook request.
Bank Codes (NGN)
These are the list of supported NGN banks and their codes:
Bank | Bank Code |
---|---|
Opay | 100004 |
PalmPay | 100033 |
Testing Pay with Bank on the Sandbox environment
To test this payment method (without using real money), a sandbox implementation has also been provided, with appropriate test instructions. Simply switch to test mode on your dashboard to use test Checkouts.
Updated 12 days ago