Become a biller

Merchant Notification API

Put your products in front of Paga’s 20 million+ users. List as a biller, and customers can pay you from the Paga app, at Paga agents and POS terminals, and through the partner platforms that use Paga, with the money in your Paga business account in real time.

This API works the other way round. You build a small set of endpoints on your server, and Paga calls them. Paga uses them to check your customers and tell you about each payment.

Where your customers can pay

20M+Paga users who can pay you, plus every partner platform built on Paga
Paga appCustomers pay from their wallet or bank
Paga agentsCash payments across Nigeria
POS terminalsIn-person payments
Partner platformsApps and businesses that pay billers through Paga

How it works

Build your endpoints

Implement submitTransaction, and validateCustomer if you want Paga to check customers before they pay.

Get enabled

Save your base URL, username and password in the business portal, then contact the support team. Once they’ve confirmed your use case, they enable you on Paga’s channels.

Your customer pays

On any Paga channel. Paga checks the customer with you first, if you support validation.

You’re paid and notified

The money is credited to your Paga business account in real time. Paga calls submitTransaction, and you record the payment and reply with a confirmation code for your customer.

Endpoints you build

You build two endpoints on your server. Paga calls them; you don’t call Paga.

EndpointNeeded?What Paga uses it for
submitTransactionRequiredTo tell you about each payment and get your confirmation
validateCustomerOptionalTo check a customer exists and is in good standing before they pay
Rules for every endpoint
RuleDetail
AddressEach endpoint lives at your base URL plus its name, such as https://your-api.example.com/submitTransaction
MethodPOST, with a JSON body, and JSON in your response
AuthenticationHTTP Basic, with a username and password you choose and save in the business portal
Response timeReply within 1 second. If you don’t, Paga retries up to 3 times within 5 seconds
isTestEvery request includes isTest. When it’s true, treat the call as a test: don’t affect live customers or records
statusEvery response includes a status. See Status values

Status values

Every response you send must include one of these in status

Paga reads it to decide what happened. Send the value exactly as shown: uppercase, with the underscore.

SUCCESS

It worked

You processed the request: you recorded the payment, or checked the customer.

CLIENT_ERROR

The request was wrong

Something in Paga’s request was invalid or missing, such as an unknown account number format.

SERVER_ERROR

Your system failed

Something went wrong on your side. Add your own code in merchantStatus or a message to explain.

ValueMeaningAdd to the response
SUCCESSThe request was processed successfullyFor submitTransaction, your confirmationCode
CLIENT_ERRORThe request failed because of invalid parameters or other information in itA message saying what was wrong
SERVER_ERRORThe request failed because of an error on your systemYour merchantStatus code and a message

Return SUCCESS only once the payment is safely recorded. For a repeat of a payment you’ve already processed, return SUCCESS again with your original response.

1. validateCustomer

Optional. Before a customer pays, Paga asks you whether they’re a real customer in good standing. Return their name so they can confirm it’s their account.

POST https://your-api.example.com/validateCustomer
Authorization: Basic base64(username:password)
Content-Type: application/json
Accept: application/json
{
  "isTest": true,
  "customerAccountNumber": "1234567",
  "customerFirstName": "",
  "customerLastName": ""
}
{
  "status": "SUCCESS",
  "message": "Customer found",
  "isValid": true,
  "firstName": "John",
  "lastName": "Doe",
  "accountStatus": "ACTIVE",
  "lastPaymentDate": "2026-10-01T00:00:00Z",
  "paymentDueDate": "2026-11-30T00:00:00Z",
  "isDisplayed": true
}
Request and response fields
FieldMeaning
customerAccountNumberRequest. The customer’s account or reference number with you
customerFirstName, customerLastNameRequest. The customer’s name, if the channel collected it
statusSUCCESS, CLIENT_ERROR or SERVER_ERROR
isValidThe answer Paga needs. true if this is a valid customer
firstName, lastNameThe customer’s name, shown to them to confirm
accountStatusACTIVE or INACTIVE
lastPaymentDate, paymentDueDateOptional dates, as ISO 8601
isDisplayedtrue lets Paga show these details to the customer
messageOptional message

2. submitTransaction

Required. Paga calls this for every payment to you. Record the payment, deliver the product or credit the customer’s account, and reply with the result.

POST https://your-api.example.com/submitTransaction
Authorization: Basic base64(username:password)
Content-Type: application/json
Accept: application/json
{
  "isTest": true,
  "transaction": {
    "pagaTransactionId": "XBFJX",
    "merchantTransactionId": "BP-C_2018061315273249_1448479_XBFJX",
    "utcTransactionDateTime": "2026-11-06T15:27:32",
    "transactionType": "BILL_PAY",
    "totalAmount": 500,
    "merchantAmount": 492.5,
    "currency": "NGN",
    "isCredit": true,
    "customerReference": "70000587",
    "customerFirstName": "Bello",
    "customerLastName": "Ramon",
    "customerPhoneNumber": "+2348177777087",
    "channel": "ONLINE",
    "description": "Gold plan renewal",
    "services": [
      { "name": "GOLD PLAN", "price": 500, "shortCode": "GP", "isPublic": true }
    ]
  }
}
Transaction fields (14)
FieldMeaning
merchantTransactionIdThe idempotency key. Paga’s unique reference for the payment. Use it to recognise a payment you’ve already processed
pagaTransactionIdPaga’s short ID for the payment, shared with everyone involved
utcTransactionDateTimeWhen the customer paid, in UTC
transactionTypeBILL_PAY
totalAmountWhat the customer paid
merchantAmountWhat you receive after fees
currencyNGN
isCredittrue for payments
customerReferenceThe customer’s account or reference number with you
customerFirstName, customerLastNameThe customer’s name
customerPhoneNumberThe customer’s phone number
channelWhere they paid: ONLINE, USSD, SMS, VOICE, EMAIL or E_WIDGET
descriptionA description of the payment
servicesThe products the customer paid for
{
  "status": "SUCCESS",
  "uniqueTransactionId": "172a56a0-3dde-4837-986b-bc8965b1d35f",
  "customerReference": "70000587",
  "merchantStatus": "1000",
  "message": "Successfully executed payment",
  "confirmationCode": "XHSUR-23724-FSR4"
}
Response fields (6)
FieldMeaning
statusRequired. SUCCESS if you recorded the payment, CLIENT_ERROR if the request was invalid, or SERVER_ERROR if your system failed
confirmationCodeA code Paga gives your customer as proof of payment, such as a token or receipt number
uniqueTransactionIdYour ID for the payment
customerReferenceThe customer you credited
merchantStatusYour own status code, if you have one
messageA result message
🚧

Reply within 1 second, and handle repeats

Paga expects your reply within 1 second. If it doesn’t get one, it retries up to 3 times within 5 seconds, so the same payment can reach you more than once. Use merchantTransactionId as your idempotency key: if you’ve seen it before, return your original response without crediting the customer again.

When you get the money. Payments are credited to your Paga business account in real time, as the customer pays. You don’t need to wait for a settlement run.

Going live

Build and test your endpoints

Make sure every endpoint honours isTest.

Save your settings

Save your base URL, username and password in the business portal.

Contact the support team

Once your integration is done, email [email protected] with your use case and the products customers will pay for. The team reviews your use case and tests your endpoints with you.

Get enabled on Paga’s channels

Once your use case is confirmed, support enables you as a biller, and customers can start paying you.

Good to know

Use merchantTransactionId to avoid duplicates

Paga may call you up to 4 times for one payment. Return the original result for a repeat instead of crediting the customer twice.

Return a useful confirmation code

Your confirmationCode is what the customer gets as proof of payment. Make it something your support team can look up.

Changing your products?

Contact the support team to add, change or remove the products customers can pay you for.

Treat test calls as tests

Calls with isTest set to true must never change live customer records.

Need help? We’re here 24/7

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