Phoenix Pay
API Reference

Payouts

API reference for creating and managing payouts.

Payouts

Send money to bank accounts and mobile money wallets via Chapa. Before creating a payout, query the available destinations to get the correct destination_id and required fields.


List Destinations

GET /api/payouts/destinations

Returns the available payout destinations (banks, mobile money providers) for a given currency. Use the returned id values as the destination_id when creating payouts.

Query Parameters

ParameterTypeDefaultDescription
currencystringETBCurrency code to get destinations for
List payout destinations
curl "https://pay.phoenixverse.io/api/payouts/destinations?currency=ETB" \
  -H "Authorization: Bearer <token>"

Response

200 OK
{
  "data": [
    {
      "id": "cbe_abyssinia",
      "name": "Abyssinia Bank",
      "currency": "ETB",
      "fields": [
        {
          "name": "account_number",
          "label": "Account Number",
          "type": "string",
          "required": true
        },
        {
          "name": "account_name",
          "label": "Account Holder Name",
          "type": "string",
          "required": true
        }
      ]
    },
    {
      "id": "telebirr",
      "name": "Telebirr",
      "currency": "ETB",
      "fields": [
        {
          "name": "account_number",
          "label": "Phone Number",
          "type": "string",
          "required": true
        },
        {
          "name": "account_name",
          "label": "Account Holder Name",
          "type": "string",
          "required": true
        }
      ]
    },
    {
      "id": "mpesa",
      "name": "M-Pesa",
      "currency": "ETB",
      "fields": [
        {
          "name": "account_number",
          "label": "Phone Number",
          "type": "string",
          "required": true
        },
        {
          "name": "account_name",
          "label": "Account Holder Name",
          "type": "string",
          "required": true
        }
      ]
    }
  ]
}

Response Fields

FieldTypeDescription
idstringDestination identifier. Use this as destination_id when creating a payout.
namestringHuman-readable name of the bank or provider
currencystringCurrency code
fieldsarrayList of required input fields for this destination

Each item in fields describes an input your user must provide:

FieldTypeDescription
namestringField key to use in the payout fields object
labelstringHuman-readable label for the field
typestringData type (always "string")
requiredbooleanWhether the field is required

The list of destinations and their required fields are determined by the PSP. They may change when the PSP updates their supported banks or providers. Always fetch destinations dynamically rather than hard-coding them.


Create Payout

POST /api/payouts

Creates a new outbound payout to a bank account or mobile money wallet.

Request Body

FieldTypeRequiredDescription
reference_idstringYesYour unique identifier for this payout. Must be unique within your tenant.
amountstringYesPayout amount as a decimal string (e.g., "5000.00").
currencystringYesCurrency code (e.g., ETB).
destination_idstringYesThe destination identifier from List Destinations (e.g., "cbe_abyssinia", "telebirr").
fieldsobjectNoAccount details required by the destination. See the fields array from List Destinations for required keys.

Examples

Payout to bank account
curl -X POST https://pay.phoenixverse.io/api/payouts \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "reference_id": "payout-78901",
    "amount": "5000.00",
    "currency": "ETB",
    "destination_id": "cbe_abyssinia",
    "fields": {
      "account_number": "1000123456789",
      "account_name": "Abebe Kebede"
    }
  }'
Payout to mobile money
curl -X POST https://pay.phoenixverse.io/api/payouts \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "reference_id": "payout-78902",
    "amount": "2500.00",
    "currency": "ETB",
    "destination_id": "telebirr",
    "fields": {
      "account_number": "+251911234567",
      "account_name": "Abebe Kebede"
    }
  }'

Response

201 Created
{
  "id": "01912e4c-9d5e-7def-ac12-3456789012cd",
  "reference_id": "payout-78901",
  "type": "payout",
  "status": "pending",
  "psp": "chapa",
  "requested_amount": "5000.00",
  "received_amount": null,
  "currency": "ETB",
  "destination_id": "cbe_abyssinia",
  "inserted_at": "2026-03-11T12:30:00Z",
  "updated_at": "2026-03-11T12:30:00Z"
}

Response Fields

FieldTypeDescription
idstring (UUID v7)Unique payment identifier
reference_idstringYour reference ID from the request
typestringAlways "payout" for payouts
statusstringInitial status, typically "pending"
pspstringThe PSP handling this payout
requested_amountstringThe payout amount you requested
received_amountstring or nullThe actual amount transferred (populated when settled)
currencystringThe currency code
destination_idstringThe destination used for this payout
inserted_atstring (ISO 8601)When the record was created
updated_atstring (ISO 8601)When the record was last updated

Errors

StatusErrorCause
400"missing required parameter: destination_id"A required field is missing or empty
422"no_psp_configured"No PSP is configured for the requested currency
422"has already been taken"The reference_id already exists for your tenant

Get Payout

GET /api/payouts/:id

Retrieve a single payout by its Phoenix Pay UUID.

Get payout by ID
curl https://pay.phoenixverse.io/api/payouts/01912e4c-9d5e-7def-ac12-3456789012cd \
  -H "Authorization: Bearer <token>"
200 OK
{
  "id": "01912e4c-9d5e-7def-ac12-3456789012cd",
  "reference_id": "payout-78901",
  "type": "payout",
  "status": "settled",
  "psp": "chapa",
  "requested_amount": "5000.00",
  "received_amount": "5000.00",
  "currency": "ETB",
  "destination_id": "cbe_abyssinia",
  "inserted_at": "2026-03-11T12:30:00Z",
  "updated_at": "2026-03-11T12:45:00Z"
}

Errors

StatusErrorCause
404"not_found"No payout with this ID exists for your tenant

Get Payout by Reference

GET /api/payouts/ref/:reference_id

Retrieve a payout using your original reference_id.

Get payout by reference ID
curl https://pay.phoenixverse.io/api/payouts/ref/payout-78901 \
  -H "Authorization: Bearer <token>"

The response format is identical to Get Payout.

Errors

StatusErrorCause
404"not_found"No payout with this reference ID exists for your tenant

List Payouts

GET /api/payouts

Retrieve a paginated list of payouts for your tenant. Supports the same filtering options as deposits.

Query Parameters

ParameterTypeDefaultDescription
pageinteger1Page number
limitinteger25Results per page (max 100)
statusstring-Filter by status (e.g., settled, pending, failed)
currencystring-Filter by currency code
fromstring (date)-Filter payouts created on or after this date (ISO 8601 date)
tostring (date)-Filter payouts created on or before this date (ISO 8601 date)
searchstring-Search by reference ID (partial match)
List all payouts
curl "https://pay.phoenixverse.io/api/payouts?page=1&limit=10" \
  -H "Authorization: Bearer <token>"

Response

200 OK
{
  "data": [
    {
      "id": "01912e4c-9d5e-7def-ac12-3456789012cd",
      "reference_id": "payout-78901",
      "type": "payout",
      "status": "settled",
      "psp": "chapa",
      "requested_amount": "5000.00",
      "received_amount": "5000.00",
      "currency": "ETB",
      "destination_id": "cbe_abyssinia",
      "inserted_at": "2026-03-11T12:30:00Z",
      "updated_at": "2026-03-11T12:45:00Z"
    }
  ],
  "meta": {
    "page": 1,
    "limit": 25,
    "total": 1,
    "total_pages": 1,
    "has_next": false,
    "has_prev": false
  }
}

Results are sorted by creation date, newest first.

Both from and to date parameters must be provided together for date filtering to take effect. Providing only one will be ignored.

On this page