Skip to main content
When you call the Direct Charge API, the initial response tells you how the customer should continue or what your backend should wait for. Most Direct Charge flows follow one of these response types:
  • processing (USSD/STK prompt flow)
  • redirect (provider-hosted completion flow)
  • bankTransfer (customer must transfer to returned account details)
  • pre-otp (customer code required before request)
  • otp (customer must enter an OTP returned after request initiation)

1) Processing Flow (USSD/STK Prompt)

Customer receives authorization prompt on mobile device and confirms with PIN.

What happens

  1. You initiate direct charge.
  2. Provider sends STK push/USSD prompt to customer.
  3. Customer authorizes on device.
  4. Transaction remains pending until provider final response.

How to detect

data.action is processing.

Merchant handling

  • Show pending state to customer.
  • Do not fulfill on initial response.
  • Wait for webhook or verify by reference.

2) Redirect Flow

Provider returns a link; customer must complete payment on provider page/app.

What happens

  1. You initiate direct charge.
  2. API responds with redirect URL.
  3. Customer completes payment on provider channel.
  4. Customer may return to your app/site afterward.

How to detect

data.action is redirect and URL is typically in data.data.link.

Merchant handling

  • Redirect user to data.data.link.
  • On return, still verify final status server-side.
  • Do not mark success from redirect alone.

3) Bank Transfer Flow

Payfonte returns bank account details; the customer must make a bank transfer to complete payment.

What happens

  1. You initiate direct charge with a bank transfer provider.
  2. API responds with account details for the customer payment.
  3. You display the account details to the customer.
  4. Customer sends the transfer from their banking app or bank channel.
  5. Transaction remains pending until provider confirmation.

How to detect

data.action is bankTransfer. Account details are returned in data.data.

Merchant handling

  • Display the returned account details clearly to the customer.
  • Include bank name, account number, account name, amount, reference, and expiry when present.
  • Keep the payment pending until webhook or verification confirms final status.
  • Do not fulfill on proof of transfer alone.

4) Pre-OTP Flow

Some providers require customer to generate a provider code/OTP before you send the charge request.

What happens

  1. Customer generates code via provider USSD.
  2. Customer shares code with merchant.
  3. Merchant sends customerInput.customerCode.
  4. Provider processes charge.

Common USSD codes

  • Orange Ivory Coast: #144*82#
  • Orange Senegal: #144#391#
  • Orange Burkina Faso: *144*4*6*Amount*PIN#
  • Orange Mali: #144#37#

Sample request

Merchant handling

  • Collect OTP/customer code explicitly.
  • Validate format before API call.
  • Continue with normal webhook/verification completion flow.

5) OTP Flow

Some providers send an OTP to the customer after you initiate the Direct Charge request. Your application must collect that OTP from the customer and submit it to the confirmation API.

What happens

  1. You initiate direct charge.
  2. API responds with action as otp.
  3. Customer receives an OTP by SMS or provider channel.
  4. You display an interface where the customer can enter the OTP.
  5. Your backend submits the OTP with the transaction reference.
  6. Transaction remains pending until provider final response.

How to detect

data.action is otp. OTP instructions are returned in data.data.message, and data.data.numberOfDigits may tell you the expected OTP length.

Submit customer OTP

Confirmation response

Merchant handling

  • Build a customer-facing OTP entry interface when data.action is otp.
  • Use data.data.numberOfDigits to guide validation when it is present.
  • Submit the OTP from your backend to POST /payments/v1/payments/confirm.
  • Keep the payment pending until webhook or verification confirms final status.

Flow Decision Summary

Important Rules

Amount values must be integers in minor units. Decimals are not supported.
See Amount Specification.

Direct Charge API

Endpoint usage and request field definitions.

Example Payloads

Provider-specific payload templates.

Webhooks

Confirm final transaction outcome asynchronously.