Payouts
Create Payout

Payout API

The Payout API allows users to create and process payouts to recipients using different payment channels. This guide explains how to use the API effectively, including request parameters, responses, and error handling.

Endpoint

POST {{baseURL}}/v1/payout

Description

This endpoint processes a payout transaction by transferring funds to a specified beneficiary. The request must include recipient details, bank information, and payout amounts.

Sample cURL Request (NGN to NGN via BANK_TRANSFER)

ℹ️

Payout Request body uses form data multipart/form-data.

curl --location '{{baseURL}}/v1/payout' \
--header 'x-api-key: API_KEY:YOUR_API_KEY' \
--header 'Content-Type: multipart/form-data' \
--form 'transaction={
  "recipient": {
    "name": "CHRIS TIANA",
    "account": {
      "bankName": "Guaranty Trust Bank",
      "sortCode": "05x",
      "accountNumber": "0712617XXX"
    },
    "paymentChannel": "BANK_TRANSFER",
    "country": "NG",
    "stored": false
  },
  "quoteId": "453eeu-567j-6tr3d-xxxxxxxxxxxxx",
  "reason": "Bills",
  "remark": ""
}'
 

Request Details

Headers

Include these headers in your request:

HeaderValueRequiredDescription
x-api-keyAPI_KEY:YOUR_API_KEY✅ YesAPI key for authenticating the request
Content-Typemultipart/form-data✅ YesSpecifies that the body contains form data

Recipient Object

FieldTypeRequiredDescription
nameString✅ YesFull name of the recipient
paymentChannelString✅ YesPayment method, e.g. BANK_TRANSFER
countryString✅ YesRecipient's 2-letter country code (e.g., NG)
storedBoolean✅ YesIndicates if recipient info is stored for future use (true/false)

Recipient Account Object

FieldTypeRequiredDescription
bankNameString✅ YesName of the recipient’s bank
sortCodeString✅ YesBank sort code (e.g., 058)
accountNumberString✅ YesRecipient's bank account number

Other Fields

FieldTypeRequiredDescription
quoteIdString✅ YesID of the quote related to the payout
reasonString✅ YesReason for payout (e.g. "Bills")
remarkString❌ NoOptional remark or note for the payout

Responses

Success Response

response.json
{
    "message": "transaction created successfully",
    "status": "success",
    "data": {
        "id": "453eeu-567j-6tr3d-xxxxxxxxxxxxx",
        "remark": "",
        "reason": "Bills",
        "referenceNumber": "O0XUZKKXXXXXX",
        "type": "SEND",
        "state": "COMPLETED",
        "quote": {
            "id": "456babd4-2951-48ff-89c9-xxxxxxxxxxxxx",
            "source": {
                "currency": "NGN",
                "country": "NG",
                "amount": 150000.00
            },
            "target": {
                "currency": "NGN",
                "country": "NG",
                "amount": 150000.00
            },
            "rate": 1.00000000,
            "fee": {
                "amount": 100.00
            },
            "summary": {
                "total": 150100.00
            },
            "expiresInSeconds": 0
        },
        "recipient": {
            "name": "CHRIS TIANA",
            "account": {
                "bankName": "Guaranty Trust Bank",
                "sortCode": "05x",
                "accountNumber": "0712617XXX"
            },
            "paymentChannel": "BANK_TRANSFER",
            "country": "NG"
        },
        "created": "2025-05-12T12:28:12.971714504",
        "processed": "2025-05-12T12:28:12.971714504"
    }
}

Response Breakdown

General Information

FieldTypeDescription
messageStringTransaction status message
statusStringOperation status (success/error)

Transaction Data

FieldTypeDescription
idStringUnique transaction ID
remarkStringOptional remarks/notes
reasonStringTransaction purpose (Bills)
referenceNumberStringUnique tracking reference
typeStringTransaction type (SEND)
stateStringCurrent status (COMPLETED)
createdStringISO 8601 creation timestamp
processedStringISO 8601 processing timestamp

Quote Details

FieldTypeDescription
quote.idStringUnique quote identifier
quote.rateNumberFX rate used
quote.expiresInSecondsNumberQuote validity

Source Funds

FieldTypeDescription
quote.source.currencyStringNGN
quote.source.countryStringNG
quote.source.amountNumberOriginal amount

Target Funds

FieldTypeDescription
quote.target.currencyStringNGN
quote.target.countryStringNG
quote.target.amountNumberReceived amount

Fees & Summary

FieldTypeDescription
quote.fee.amountNumberTransaction fee
quote.summary.totalNumberTotal deducted

Recipient Details

FieldTypeDescription
recipient.nameStringAccount holder name
recipient.paymentChannelStringBANK_TRANSFER
recipient.countryStringRecipient country (NG)

Bank Account Details

FieldTypeDescription
recipient.account.bankNameStringBank name
recipient.account.sortCodeStringBank branch code
recipient.account.accountNumberStringBank account number

Error Handling

Status CodeMeaningExample ResponseHow to Handle
400Bad RequestInvalid parametersCheck request payload for missing or malformed fields
401UnauthorizedInvalid API keyEnsure the API key is correct and authorized
403Forbidden (Non-whitelisted IP)Your IP address is not allowed to access this serviceWhitelist your IP address in the API Management settings on the dashboard
422Unprocessable EntityInvalid quote IDConfirm quoteId is valid and hasn't expired
500Internal Server ErrorAn internal error occurredRetry later or contact support if error persists

Best Practices

✅ Include a valid x-api-key in the request headers for authentication.
✅ Ensure that all recipient information is accurate and properly formatted.
✅ Validate that the quoteId is correctly provided and linked to an existing quote.
✅ Handle errors appropriately to ensure robust API usage.