Bank USSD

One-time use Bank USSD for payment

EnvironmentBase URL
Sandboxhttps://beta-collect.paga.com
Livehttps://collect.paga.com

Authenticate with HTTP Basic and a hash header, as in Authentication.

How it works

1. Create a payment request

POST /paymentRequest
Authorization: Basic base64(publicKey:secretKey)
hash: sha512(referenceNumber + amount + currency + payer.phoneNumber + payer.email + hashKey)
Content-Type: application/json

Set paymentMethods to ["FUNDING_USSD"]. Use an empty string for payer.email in the hash if you don’t send it.

{
  "referenceNumber": "ORD-2026-0188",
  "amount": 200,
  "currency": "NGN",
  "payer": {
    "name": "Bello Ramon",
    "phoneNumber": "08064343187",
    "bankId": "43F4DED6-78EC-4047-AD34-BAB75E679EB7"
  },
  "payee": { "name": "Your business name" },
  "expiryDateTimeUTC": "2026-11-10T16:35:00",
  "isSuppressMessages": true,
  "payerCollectionFeeShare": 1,
  "payeeCollectionFeeShare": 0,
  "callBackUrl": "https://yourstore.com/webhooks/paga",
  "paymentMethods": ["FUNDING_USSD"]
}
All request parameters (14)
ParameterRequiredDescription
referenceNumberYesYour unique reference. Use it to match callbacks and check status. Hash value 1
amountYesAmount to request, in naira. Hash value 2
currencyYesNGN. Hash value 3
payer.nameYesCustomer’s name
payer.phoneNumberYesCustomer’s phone number. Hash value 4
payer.emailNoCustomer’s email address. Hash value 5
payer.bankIdYesYour customer’s bank, from Get Banks
payee.nameYesYour business name
payerCollectionFeeShareYesShare of the fee your customer pays, from 0.0 to 1.0
payeeCollectionFeeShareYesShare of the fee you pay. Both shares must add up to 1.0
expiryDateTimeUTCNoWhen the request expires, in UTC, up to one week ahead
isSuppressMessagesNotrue stops Paga emailing or texting your customer. Default false
callBackUrlYesWhere Paga sends the callback
paymentMethodsYes["FUNDING_USSD"]
{
  "referenceNumber": "ORD-2026-0188",
  "statusCode": "0",
  "statusMessage": "success",
  "requestAmount": 200.0,
  "totalPaymentAmount": 200.0,
  "currency": "NGN",
  "paymentMethods": [
    {
      "name": "FUNDING_USSD",
      "properties": {
        "USSDShortCode": "*894*000*724+40554208#",
        "PaymentReference": "40554208"
      }
    }
  ],
  "expiryDateTimeUTC": "2026-11-10T16:35:00",
  "isPayerPagaAccountHolder": true
}
Response fields you’ll use most (3)
FieldWhat it’s for
paymentMethods[].properties.USSDShortCodeThe code your customer dials
paymentMethods[].properties.PaymentReferencePaga’s reference for the USSD payment
totalPaymentAmountThe amount your customer pays, including any fee you pass on

2. Show your customer the USSD code

Display the code with the bank name and amount, and tell your customer to dial it from the phone number registered with that bank:

Dial*894*000*724+40554208#
BankFirst Bank
Amount₦200.00

3. Handle the callback

Paga sends a PAYMENT_COMPLETE callback to your callback URL when the customer approves the payment. The callback, its fields and the hash check are the same as for Dynamic virtual accounts.

  • Hash: notificationId + statusCode + externalReferenceNumber + state + outstandingBalance + hashKey, with SHA-512.
  • Respond with HTTP 200. Paga retries up to three times with the same notificationId.
  • If the code expires unused, you get a final callback so you can close the order.

4. Check payment status

Call POST /status with your referenceNumber. The hash is sha512(referenceNumber + hashKey), and the payment’s status is in data.statusCode.

Good to know


What’s Next