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

amount

Number

True

The amount of money to be debited. Minimum is NGN 200.00.

bank_code

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.

redirect_url

String

False

The URL redirected to after transaction is completed.

currency

String

True

The currency of the transaction.

reference

String

True

A unique reference for the payment. This reference must be at least 8 characters long.

customer.name

String

True

The name of your customer.

customer.email

String

True

The email of your customer.

merchant_bears_cost

Boolean

False

This sets who bears the fees of the transaction. If it is set to true, the merchant will bear the fee. If it is set to false, the customer will bear the fee. By default, it is set to false.

narration

String

False

Information/narration about the transaction.

notification_url

String

False

The webhook URL to be called when the transaction is complete.

metadata

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: A-Z, a-z, 0-9, and -.

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:

BankBank Code
Opay100004
PalmPay100033

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.