Skip to main content
POST
Initiate B2C payout
Disburse funds to any M-Pesa number. Reversals are automatic on failure — no manual action needed.
B2C payouts require KYC approval on your account. Requests before approval return 403 KYC_NOT_VERIFIED. See Going Live for the KYC process.

Key notes

  • Minimum amount: KES 10.
  • The B2C wallet must have sufficient balance — insufficient funds return 409 INSUFFICIENT_FUNDS.
  • The wallet balance is debited immediately when the request is accepted.
  • On failure, the debited balance is automatically reversed to your B2C wallet.
  • The service fee (from your service wallet) is deducted on initiation and is not refunded on failure.
  • transactionFee in the response shows the service wallet amount reserved for this payout. It is 0 if no pricing rule is configured or the transaction fails.
  • Payouts settle asynchronously. Expect 30 seconds to 5 minutes for completion.

Receiving the result (callbackUrl)

Supply a callbackUrl in the request body. PalPluss will POST the transaction result to that URL when the payout reaches a terminal state (SUCCESS or FAILED).
The callback payload sent to your URL:
See Webhooks for retry policy, idempotency handling, and full field reference.

Wallet requirements

Before initiating a payout, verify:
  • Your B2C wallet has enough balance for the payout amount
  • Your service wallet has enough balance for the transaction fee
Both balances are visible in the console under Finance → Wallets.

Failure and reversal

If M-Pesa declines or times out:
  • PalPluss automatically credits your B2C wallet back
  • Your webhook receives status: "FAILED" with result_code and result_desc from M-Pesa
  • The reversed transaction shows status: "REVERSED"
  • Retry safely — the original transaction is not retried automatically

Authorizations

Authorization
string
header
required

Paste your PalPluss API key in the username field and leave the password field empty — it is ignored.

Get your key from console → Settings → API Keys (starts with pk_live_ or pk_test_).

In your own code, send the key directly: Authorization: Basic YOUR_API_KEY

Body

application/json
amount
number
required

Payout amount in KES. Minimum KES 10.

Required range: x >= 10
Example:

500

phone
string
required

Recipient M-Pesa phone number.

Example:

"0712345678"

reference
string
required

Your reference for this payout (e.g. withdrawal ID).

Example:

"WD-2024-001"

currency
string
default:KES

Currency code. Currently only KES is supported.

description
string

Short description of the payout purpose.

Example:

"Commission payout"

channelId
string<uuid> | null

Optional channel to use for this payout.

callbackUrl
string<uri>

HTTPS URL to receive the payout result. PalPluss POSTs the terminal transaction payload here when the status reaches SUCCESS or FAILED.

Example:

"https://yourserver.com/webhooks/b2c"

Response

Payout queued successfully. Transaction is in PENDING state.

success
boolean
required
Example:

true

data
object
required

Response payload. Shape varies by endpoint.

requestId
string<uuid>
required

Unique identifier for this API request. Include in support tickets.

Example:

"c1b2a3d4-e5f6-7890-abcd-ef1234567890"