Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.mavapay.co/llms.txt

Use this file to discover all available pages before exploring further.

Kenyan Shilling (KES) Payouts

This guide explains how to integrate Mavapay’s payout functionality for sending money to Kenyan recipients through various M-Pesa payment modes.

Overview

The KES payout process involves the following steps:
  1. Choose the appropriate M-Pesa payment mode
  2. Create a quote with the required beneficiary details
  3. Pay the generated lightning invoice
  4. Receive webhook notifications for payment status
Note: All KES payments are processed through M-Pesa, Kenya’s leading mobile money service.

Prerequisites

Before you begin, ensure you have:
  1. Created a Mavapay account
  2. Obtained your API key
  3. Set up your webhook endpoint
  4. Verified your business account

Authentication

All API requests must include your API key in the header:
X-API-KEY: your_api_key_here
Important Notes:
  • All amounts are in cents (1 KES = 100 cents)
  • The minimum amount for KES payouts is $2
  • Phone numbers must be in international format (e.g., +254…)
  • Account numbers for paybill payments can be text (usually business name or identifier)
  • All payments are processed through M-Pesa’s payment infrastructure

Payment Modes

All KES payments are processed through M-Pesa using one of the following modes:

1. Pay to Phone Number (M-Pesa Mobile Money)

Send money directly to a recipient’s M-Pesa account:
curl --request POST \
  --url https://staging.api.mavapay.co/api/v1/quote \
  --header 'Content-Type: application/json' \
  --header 'X-API-KEY: your_api_key_here' \
  --data '{
  "amount": 500000,
  "sourceCurrency": "BTCSAT",
  "targetCurrency": "KESCENT",
  "paymentMethod": "LIGHTNING",
  "paymentCurrency": "KESCENT",
  "autopayout": true,
  "beneficiary": {
    "identifierType": "paytophone",
    "identifiers": {
      "phoneNumber": "+254796980788"
    }
  }
}'

2. Pay to Bill (M-Pesa Paybill)

Pay to a business using their M-Pesa paybill number:
curl --request POST \
  --url https://staging.api.mavapay.co/api/v1/quote \
  --header 'Content-Type: application/json' \
  --header 'X-API-KEY: your_api_key_here' \
  --data '{
  "amount": 500000,
  "sourceCurrency": "BTCSAT",
  "targetCurrency": "KESCENT",
  "paymentMethod": "LIGHTNING",
  "paymentCurrency": "KESCENT",
  "autopayout": true,
  "beneficiary": {
    "identifierType": "paytobill",
    "identifiers": {
      "paybillNumber": "4141031",
      "accountNumber": "business_name"
    }
  }
}'

3. Pay to Account/Till (M-Pesa Till)

Pay to a business M-Pesa till number:
curl --request POST \
  --url https://staging.api.mavapay.co/api/v1/quote \
  --header 'Content-Type: application/json' \
  --header 'X-API-KEY: your_api_key_here' \
  --data '{
  "amount": 500000,
  "sourceCurrency": "BTCSAT",
  "targetCurrency": "KESCENT",
  "paymentMethod": "LIGHTNING",
  "paymentCurrency": "KESCENT",
  "autopayout": true,
  "beneficiary": {
    "identifierType": "paytotill",
    "identifiers": {
      "accountNumber": "till_number"
    }
  }
}'

Understanding the Quote Response

Sample response:
{
  "status": "ok",
  "data": {
    "id": "d1614a76-9c7f-4111-98a7-43199f307e5b",
    "exchangeRate": 4874805.75,
    "usdToTargetCurrencyRate": 145.977,
    "sourceCurrency": "BTCSAT",
    "targetCurrency": "KESCENT",
    "transactionFeesInSourceCurrency": 13.23,
    "transactionFeesInTargetCurrency": "3750.00",
    "amountInSourceCurrency": 1499,
    "amountInTargetCurrency": "50000.00",
    "paymentMethod": "LIGHTNING",
    "expiry": "2021-07-01T12:00:00Z",
    "isValid": true,
    "invoice": "lntbs36020n1pnehfzcpp...",
    "hash": "189727ef2e0f35921af7858b96e27cbad960b0ec2bb2a4ab73b6a231f9ce8727",
    "totalAmountInSourceCurrency": 1499,
    "customerInternalFee": 0
  }
}
Key fields:
  • usdToTargetCurrencyRate: Price of 1 USD in KES
  • exchangeRate: Price of 1 BTC in KES
  • amountInSourceCurrency: Total amount in SATS to be paid (including fees)
  • amountInTargetCurrency: Total amount in cents to be sent to recipient
  • transactionFeesInSourceCurrency: Fees in SATS
  • transactionFeesInTargetCurrency: Fees in cents
  • expiry: Invoice validity (5 minutes)

Webhook Events

You’ll receive two webhook events:
  1. payment.received - When the lightning payment is received
  2. payment.sent - When the money is sent to the recipient

payment.received Event

{
  "event": "payment.received",
  "data": {
    "id": "tx_123456789",
    "amount": 500000,
    "currency": "KES",
    "status": "SUCCESS",
    "metadata": {
      "hash": "189727ef2e0f35921af7858b96e27cbad960b0ec2bb2a4ab73b6a231f9ce8727",
      "reference": "MP123456789"
    }
  }
}

payment.sent Event

{
  "event": "payment.sent",
  "data": {
    "id": "tx_123456789",
    "amount": 500000,
    "currency": "KES",
    "status": "SUCCESS",
    "metadata": {
      "identifierType": "paytophone",
      "phoneNumber": "+254796980788",
      "reference": "MP123456789"
    }
  }
}

Checking Transaction Status

You can query transactions using the payment hash, orderId, or transaction ID:
# Using hash
curl --location 'https://staging.api.mavapay.co/api/v1/transaction?hash=08f7198fd7dd73c087b4754a20d6f63f5b87bb8fcdc10e4d5cacd27650fce2ba' \
--header 'x-api-key: your_api_key_here'

# Using transaction ID
curl --location 'https://staging.api.mavapay.co/api/v1/transaction?id=7bac35f1-2efc-448b-8a71-0d071da43315' \
--header 'x-api-key: your_api_key_here'

Getting Price Rates

To get current KES rates:
curl --location 'https://staging.api.mavapay.co/api/v1/price?currency=KES'
Sample response:
{
  "status": "ok",
  "data": {
    "currency": "KES",
    "timestamp": 1738258609,
    "btcPriceInUnitCurrency": 4874805.75,
    "unitPricePerSat": {
      "amount": 0.04874805,
      "currencyUnit": "KESSAT"
    },
    "unitPricePerUsd": {
      "amount": 145.977,
      "currencyUnit": "KESUSD"
    }
  }
}

Testing

Use our staging environment for testing:
https://staging.api.mavapay.co/api/v1
Test details:
  • Phone Number: +254790000000
  • Paybill Number: 4141031
  • Account Number: test_account
  • Till Number: 000000
Note: All test environment invoices are signet invoices.

Support

If you need help with integration: