Paga wallet

Paga Wallet

Request payment from any of Paga’s millions of wallet holders. They approve it in the Paga app, and the money moves from their wallet to you.

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

Create a payment request

With your customer’s phone number or email, and paymentMethods set to ["REQUEST_MONEY"].

Paga notifies your customer

If the phone number or email belongs to a Paga wallet, your customer gets a notification in the Paga app automatically.

Send them to pay

On mobile, open AppPaymentLink so the Paga app launches straight to the payment. Elsewhere, share WebPaymentLink.

Your customer approves

They approve in the app or on the web page, then return to your redirectUrl.

Paga notifies you

A callback reaches your callback URL once the payment is approved. Verify it, then fulfil.

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 ["REQUEST_MONEY"]. Use an empty string for payer.email in the hash if you don’t send it.

{
  "referenceNumber": "ORD-2026-0189",
  "amount": 50,
  "currency": "NGN",
  "payer": {
    "name": "Bello Ramon",
    "phoneNumber": "08064343187"
  },
  "payee": { "name": "Your business name" },
  "expiryDateTimeUTC": "2026-11-10T15:35:00",
  "isSuppressMessages": true,
  "payerCollectionFeeShare": 1,
  "payeeCollectionFeeShare": 0,
  "redirectUrl": "https://yourstore.com/payment/complete",
  "callBackUrl": "https://yourstore.com/webhooks/paga",
  "paymentMethods": ["REQUEST_MONEY"]
}
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.phoneNumberYesPhone number on your customer’s Paga wallet. Hash value 4
payer.emailNoEmail on your customer’s Paga wallet. Hash value 5
payee.nameYesYour business name, shown in the payment request
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
redirectUrlNoWhere to send your customer after they approve the payment. Also added to the app link
callBackUrlYesWhere Paga sends the callback
paymentMethodsYes["REQUEST_MONEY"]
{
  "referenceNumber": "ORD-2026-0189",
  "statusCode": "0",
  "statusMessage": "success",
  "requestAmount": 50,
  "totalPaymentAmount": 50.41,
  "paymentMethods": [
    {
      "name": "REQUEST_MONEY",
      "properties": {
        "WebPaymentLink": "https://justpaga.me/79A73E1A-C2D7-F111-AEAE-8EE7991AAE9D",
        "AppPaymentLink": "https://smart.link/w6hy5vgnh50t6?deeplink=mypagaapp%3A%2F%2Fads%3Fid%3Drequest_money_fulfil%26externalReference%3D79A73E1A-C2D7-F111-AEAE-8EE7991AAE9D%26redirectUrl%3Dhttps%253A%252F%252Fyourstore.com%252Fpayment%252Fcomplete"
      }
    }
  ],
  "expiryDateTimeUTC": "2026-11-10T15:35:00",
  "isPayerPagaAccountHolder": false,
  "bankName": "Paga",
  "redirectUrl": "https://yourstore.com/payment/complete"
}
Response fields (12)
FieldWhat it’s for
referenceNumberYour reference from the request
statusCode0 means the payment request was created
statusMessageReadable status
requestAmountThe amount you asked for
totalPaymentAmountThe amount your customer pays, including any fee you pass on. Show this one
paymentMethods[].nameREQUEST_MONEY, the method you requested
paymentMethods[].properties.AppPaymentLinkA deep link that opens the Paga app straight to the payment. Use it on mobile
paymentMethods[].properties.WebPaymentLinkA web page where your customer can pay. Use it on desktop or if they don’t have the app
expiryDateTimeUTCWhen the request expires, in UTC
isPayerPagaAccountHoldertrue if the phone number or email belongs to a Paga wallet, so the app notification was sent
bankNamePaga
redirectUrlWhere your customer returns after paying, as you sent it

No app notification? If isPayerPagaAccountHolder is false, the phone number or email isn’t on a Paga wallet, so no notification was sent. Your customer can still pay with AppPaymentLink or WebPaymentLink, or you can ask for the details on their Paga account.

2. Send your customer to pay

There are three ways your customer can reach the payment. Use the one that fits where they are:

Automatic

App notification

Sent by Paga when the phone number or email belongs to a Paga wallet. Your customer approves it in the app.

Mobile

App link

Open AppPaymentLink from a “Pay with Paga” button. The app launches straight to the payment.

Anywhere

Web link

Share WebPaymentLink by SMS or email, or open it on desktop.

Show totalPaymentAmount, not your requested amount, if your customer pays the fee.

3. Handle the callback

Paga sends a PAYMENT_COMPLETE callback to your callback URL when the customer approves. 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 your customer declines or the request expires, you get a final callback so you can close the order.

4. Check payment status

Use the status endpoint to confirm a payment if a callback hasn’t arrived, or to double-check before you fulfil a large order.

POST /status
Authorization: Basic base64(publicKey:secretKey)
hash: sha512(referenceNumber + hashKey)
Content-Type: application/json
{
  "referenceNumber": "ORD-2026-0189"
}
Request parameters (1)
ParameterRequiredDescription
referenceNumberYesThe referenceNumber you used when you created the payment request. Hash value 1
{
  "referenceNumber": "ORD-2026-0189",
  "statusCode": "0",
  "statusMessage": "success",
  "data": {
    "referenceNumber": "ORD-2026-0189",
    "statusCode": "0",
    "statusMessage": "success",
    "requestAmount": 50.0,
    "totalPaymentAmount": 50.0,
    "expiryDateTimeUTC": "2026-11-10T15:35:00",
    "additionalData": {}
  }
}
Response fields (10)
FieldMeaning
referenceNumberThe payment request you asked about
statusCode0 means your status request worked. It doesn’t tell you whether the payment was made
statusMessageReadable status of your status request
data.referenceNumberThe payment request you asked about
data.statusCodeThe payment’s own status. 0 means paid. See Collect API status codes for the others
data.statusMessageReadable status of the payment
data.requestAmountThe amount you asked for
data.totalPaymentAmountThe amount your customer pays, including any fee you pass on
data.expiryDateTimeUTCWhen the payment request expires, in UTC
data.additionalDataExtra details for some payment methods. Often empty

Read data.statusCode, not the outer statusCode. The outer statusCode only says whether your status request worked. Fulfil the order only when data.statusCode is 0.

Don’t poll on a timer. Wait for the callback, and only check status if it hasn’t arrived. If you do check, wait a few seconds and double the wait each time, as in Best practices.

Good to know

Use the app link on mobile

Open AppPaymentLink from a button in your mobile app or site. It launches the Paga app straight to the payment, so customers don’t have to find the notification.

Share the web link as a backup

Send WebPaymentLink by SMS or email, or show it on desktop, in case the notification is missed.

Set a redirect URL

With redirectUrl, customers come back to your app or site after approving. Still confirm payment from the callback, not the redirect.

Cancel or refund

Cancel a request your customer hasn’t paid, or refund one they have. See Refunds.

Need help? We’re here 24/7

Talk to our support team any time, or ask questions in the developer community.




What’s Next