Money Transfer

Payouts

Send money from your Paga business balance to more than 570 banks and financial institutions in Nigeria, or to a Paga wallet, with the same API call.

EnvironmentBase URL
Sandboxhttps://beta.mypaga.com
Livehttps://www.mypaga.com

Money transfer uses the Business API: send your keys as principal and credentials headers with a request hash, as in Authentication, from a whitelisted IP address. Payouts come from your Paga business balance, so keep it funded.

How it works

Get the bank’s UUID

Call getBanks and find your recipient’s bank. To pay a Paga wallet, use Paga’s own UUID.

Validate the account

validateDepositToBank confirms the account exists and returns the account holder’s name and the fee.

Send the money

depositToBank pays the account from your business balance. Include your statusCallbackUrl.

Get notified

Paga notifies your statusCallbackUrl once the transfer is processed. If it doesn’t arrive, check the transaction status.

570+financial institutions, with more added every month
Commercial banksEvery major bank in Nigeria
Microfinance banksMFBs across the country
Mobile money operatorsMMOs and wallets, including Paga
Merchant banksAnd other licensed institutions

1. Get the bank’s UUID

Call getBanks to list every supported institution with its UUID. UUIDs never change, but new institutions are added every month. Cache the list and refresh it weekly or monthly, rather than hard-coding it or calling it before every payout.

POST /paga-webservices/business-rest/secured/getBanks
principal: YOUR_PUBLIC_KEY
credentials: YOUR_SECRET_KEY
hash: sha512(referenceNumber + hashKey)
Content-Type: application/json
{
  "referenceNumber": "BNK-2026-1103"
}
{
  "referenceNumber": "BNK-2026-1103",
  "responseCode": 0,
  "banks": [
    {
      "uuid": "40090E2F-7446-4217-9345-7BBAB7043C4C",
      "name": "Access Bank",
      "interInstitutionCode": "000014",
      "sortCode": "044"
    },
    {
      "uuid": "8B9CCA8B-F092-4704-82FD-B82D2B9A1993",
      "name": "First Bank",
      "interInstitutionCode": "000016",
      "sortCode": "011"
    },
    {
      "uuid": "AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA",
      "name": "Paga",
      "interInstitutionCode": null,
      "sortCode": "327"
    }
  ]
}
Response fields (5)
FieldMeaning
referenceNumberYour reference from the request
banks[].uuidThe value you need. Send it as destinationBankUUID. A bank’s UUID never changes
banks[].nameThe institution’s name, to show in your bank picker
banks[].interInstitutionCodeThe NIBSS institution code. Can be null
banks[].sortCodeThe CBN sort code

Paying a Paga wallet? Use Paga’s bank UUID, AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA, the same in Sandbox and Live, with the recipient’s Paga account number.

2. Validate the account

Check the account before you send. You get the name registered at the bank and the fee, so you can show the sender who they’re paying and what it costs.

POST /paga-webservices/business-rest/secured/validateDepositToBank
principal: YOUR_PUBLIC_KEY
credentials: YOUR_SECRET_KEY
hash: sha512(referenceNumber + amount + destinationBankUUID + destinationBankAccountNumber + hashKey)
Content-Type: application/json
{
  "referenceNumber": "VAL-2026-0311",
  "amount": "5000.00",
  "currency": "NGN",
  "destinationBankUUID": "40090E2F-7446-4217-9345-7BBAB7043C4C",
  "destinationBankAccountNumber": "0000000000"
}
{
  "referenceNumber": "VAL-2026-0311",
  "responseCode": 0,
  "destinationAccountHolderNameAtBank": "Test Customer",
  "fee": 50,
  "vat": 2.5,
  "message": null
}
Validate fields (4)
FieldMeaning
destinationAccountHolderNameAtBankThe account holder’s name, as the bank has it. Show it to the sender to confirm
feeWhat the transfer will cost, taken from your business balance
vatVAT on the fee
responseCode0 means the account is valid. For any other code, see Business API error codes

3. Send the money

POST /paga-webservices/business-rest/secured/depositToBank
principal: YOUR_PUBLIC_KEY
credentials: YOUR_SECRET_KEY
hash: sha512(referenceNumber + amount + destinationBankUUID + destinationBankAccountNumber + hashKey)
Content-Type: application/json

The hash is the same as for validation. Use a new referenceNumber for the transfer, up to 50 characters. The examples show the essentials; every optional parameter is in the table below.

{
  "referenceNumber": "PAY-2026-0311",
  "amount": "5000.00",
  "currency": "NGN",
  "destinationBankUUID": "40090E2F-7446-4217-9345-7BBAB7043C4C",
  "destinationBankAccountNumber": "0000000000",
  "remarks": "Salary for June",
  "statusCallbackUrl": "https://yourstore.com/webhooks/paga-payouts"
}
Request parameters (16)
ParameterRequiredDescription
referenceNumberYesYour unique reference, up to 50 characters. Hash value 1
amountYesAmount to send. Hash value 2
destinationBankUUIDYesThe bank’s UUID from getBanks, or Paga’s UUID for a wallet. Hash value 3
destinationBankAccountNumberYesThe 10-digit account number. Hash value 4
currencyNoNGN
statusCallbackUrlNoWhere Paga notifies you once the transfer is processed. Strongly recommended
recipientNameNoRecipient’s full name
recipientPhoneNumberNoRecipient’s phone number, for the SMS notification
recipientMobileOperatorCodeNoThe recipient’s network, for reliable SMS delivery
recipientEmailNoRecipient’s email address
remarksNoA note on the transfer, such as Salary for June
transferReferenceNoA second reference of your own, for reconciliation
suppressRecipientMessageNotrue stops Paga texting the recipient. Default false
alternateSenderNameNoThe sender name shown to the recipient, up to 16 characters
miniRecipentKYCLevelNoFor Paga wallets: the lowest KYC level the recipient needs (KYC1, KYC2 or KYC3)
holdingPeriodNoDays the recipient has to reach that KYC level before the money returns to you. Default 120. Only with miniRecipentKYCLevel
International money transfer operators (IMTOs)

If you’re an IMTO, these fields are required on every transfer:

ParameterDescription
senderFormalNameSender’s full name
senderGenderMALE or FEMALE
senderOccupationFORMAL or INFORMAL
senderAgeSender’s age
senderAddressSender’s address
recipientAddressRecipient’s address
sourceCurrencyThe currency sent, such as USD or GBP
sourceAmountThe amount before conversion
effectiveExchangeRateThe rate from sourceCurrency to currency
{
  "referenceNumber": "PAY-2026-0311",
  "responseCode": 0,
  "message": "Successfully deposited N5,000.00 to bank account ******8830. Transaction Id: RP658.",
  "transactionId": "RP658",
  "destinationAccountHolderNameAtBank": "Test Customer",
  "fee": 50,
  "vat": 2.5,
  "currency": "NGN",
  "exchangeRate": null,
  "sessionId": null
}
Response fields (10)
FieldMeaning
responseCode0 means Paga accepted the transfer. Other codes can mean pending, duplicate reference or failed, so look each one up in Business API error codes before retrying
referenceNumberYour reference
transactionIdPaga’s short ID for the transfer. Share it with the recipient if they ask
messageReadable result
destinationAccountHolderNameAtBankThe recipient’s name at the bank
feeFee taken from your balance
vatVAT on the fee
currencyNGN
exchangeRateOnly for foreign-currency transfers
sessionIdThe bank transfer’s session ID, for tracing it with the recipient’s bank

4. Handle the notification

Paga sends a notification to your statusCallbackUrl once the transfer is processed. Verify the hash, decide on responseCode, then respond with HTTP 200 and {"status": "SUCCESS"}.

x-paga-request-id: bfb63229-c212-4b89-8a38-fffb87447bc0
x-paga-attempt-id: 204a702d-0f59-48f1-8467-2140055f0eef
x-paga-hash-parameters: referenceNumber,transactionDate,transactionId,amount,sessionId,hashKey
x-paga-hash: 074ff3f2dfb8488d9660104f58990be919c648f64f186f06d9e6b0702a25d623e74d15df22a567bd9f633ed0aa62a1b19e983aa2ef087108ae78252a1f49f686
{
  "responseCode": 0,
  "message": "Successfully deposited N5,000.00 to bank account ******8830. Transaction Id: RP658.",
  "referenceNumber": "PAY-2026-0311",
  "transactionId": "RP658",
  "transactionReference": "SCBS-U_20261103110225559_989465645_RP658_bfrgw",
  "transactionType": "USER_SEND_CASH_TO_BANK_ACCOUNT_SETTLED",
  "transactionDate": "2026-11-03 11:02:25.56",
  "amount": "5000.0",
  "currency": "NGN",
  "fee": 53.75,
  "vat": 3.75,
  "taxes": { "vat": 3.75 },
  "sessionId": "100002261103110226001406467019",
  "destinationAccountHolderNameAtBank": "Test Customer",
  "reversalId": null,
  "exchangeRate": null,
  "integrationStatus": null,
  "responseCategoryCode": null
}
Notification fields (17)
FieldMeaning
responseCodeThe field to decide on. 0 means success. Other codes can mean the transfer is pending, the reference was a duplicate, it failed, or something else, so look each one up in Business API error codes before acting
messageReadable result
referenceNumberYour reference from the request
transactionIdPaga’s short ID for the transfer
transactionReferencePaga’s full reference for the transfer
transactionTypeThe kind of transaction, such as USER_SEND_CASH_TO_BANK_ACCOUNT_SETTLED
transactionDateWhen the transfer was made
amountAmount sent, as a string such as 5000.0
currencyNGN
feeFee taken from your balance
vatVAT on the fee. Also in taxes.vat
sessionIdThe bank transfer’s session ID, for tracing it with the recipient’s bank
destinationAccountHolderNameAtBankThe recipient’s name at the bank
reversalIdSet if the money was returned to your balance
exchangeRateOnly for foreign-currency transfers
integrationStatusUsually null
responseCategoryCodeThe HTTP status code, if there was a problem
🚧

Don’t treat every non-zero code as a failure

Some codes mean the transfer is still pending, or that the reference was already used. Look up each responseCode in the Business API error codes before you refund a customer or send the money again.

Check the hash

Join referenceNumber + transactionDate + transactionId + amount + sessionId + hashKey, hash the result with SHA-512, and compare it with the x-paga-hash header.

The hash is sent in the x-paga-hash header, not the body. Build it from the fields named in x-paga-hash-parameters, in that order, using each value exactly as received. For the example above, the string to hash is PAY-2026-03112026-11-03 11:02:25.56RP6585000.0100002261103110226001406467019 followed by your hash key.

Retries. Until Paga gets HTTP 200 with {"status": "SUCCESS"} back, it sends the notification again, each time with a new x-paga-attempt-id. De-duplicate on referenceNumber, so a retried notification isn’t processed twice.

5. Check the transaction status

If a notification hasn’t arrived, or a request timed out, check the transfer’s status before doing anything else. transactionStatus covers operations from the last 48 hours; for older ones, use the transaction history below.

POST /paga-webservices/business-rest/secured/transactionStatus
principal: YOUR_PUBLIC_KEY
credentials: YOUR_SECRET_KEY
hash: sha512(referenceNumber + hashKey)
Content-Type: application/json
{
  "referenceNumber": "PAY-2026-0311",
  "locale": "en"
}
{
  "responseCode": 0,
  "message": null,
  "referenceNumber": "PAY-2026-0311",
  "status": "SUCCESSFUL",
  "transactionId": "RP658",
  "transactionReference": "SCBS-U_20261103110225559_989465645_RP658_bfrgw",
  "transactionType": "USER_SEND_CASH_TO_BANK_ACCOUNT_SETTLED",
  "dateUTC": 1793790145560,
  "amount": 5000.0,
  "currency": "NGN"
}
Request parameters (2)
ParameterRequiredDescription
referenceNumberYesThe referenceNumber you used for the transfer. Hash value 1
localeNoLanguage for messages, such as en
Response fields (12)
FieldMeaning
responseCodeThe field to decide on. 0 means success. Other codes can mean pending, duplicate reference, failed and more, so look each one up in Business API error codes before acting
statusA readable status, such as SUCCESSFUL. Values vary by transaction type, so don’t base decisions on it
messageWhy the transfer failed, if it did
referenceNumberYour reference
transactionIdPaga’s short ID for the transfer
transactionReferencePaga’s full reference for the transfer
transactionTypeThe kind of transaction
dateUTCWhen it happened, in milliseconds since 1970 (UTC)
amountAmount sent
currencyNGN
merchantTransactionReferenceOnly for bill payments: the biller’s confirmation code or token
additionalPropertiesOnly for bill payments: extra details from the biller
🚧

Decide on responseCode, not status

status values vary by transaction type, so they aren’t reliable for decisions. Use responseCode, and look it up in the Business API error codes. Don’t treat every non-zero code as a failure: some mean the transfer is still pending or was already sent with that reference, and retrying could pay twice.

Check your balance before a large run. Purchases come from your Paga business account. Check its balance and transaction history on Your business account.

Good to know

Always validate first

A validation costs nothing. A payout to the wrong account is hard to recover.

One reference per transfer

Store each referenceNumber before sending. On a timeout, wait for the notification or check the transaction status instead of sending again.

Fees come from your balance

Make sure your available balance covers the amount plus fee and VAT, or the transfer fails.

Test in Sandbox

Use Access Bank and account 0000000000 from the Test data page.

Need help? We’re here 24/7

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


What’s Next