Skip to content

Airtel Money API Request Builder

Copy-paste code for the Airtel Money collections flow in four languages, with the phone number converted to Airtel's format automatically. Everything runs in your browser; your credentials never leave this page.

Request

Step

Code

    Expected response
    Save for later
    Your .env file

    PHP output reads config('services.airtel.client_id'), client_secret and access_token. Map them to these variables in config/services.php.

    How the Airtel Money collections flow works

    1. Get a token. POST your client ID and secret as JSON to /auth/oauth2/token with grant_type: client_credentials. Cache the token until shortly before expires_in runs out.
    2. Request the payment. POST to /merchant/v1/payments/ with the X-Country and X-Currency headers. Airtel sends a USSD prompt to the customer's phone. The response only confirms Airtel received the request.
    3. Get the result. Airtel posts the outcome to the callback URL registered for your app in the developer portal. If no callback arrives within a few minutes, call GET /standard/v1/payments/{id}.

    Base URLs

    UAT (sandbox): https://openapiuat.airtel.africa. Production: https://openapi.airtel.africa. UAT and production have separate credentials, and production access needs Airtel to approve your business.

    The request body

    FieldWhat to send
    referenceA short description, e.g. "Order 1001".
    subscriber.msisdnThe customer's number without the country code or leading 0: 752123456.
    subscriber.country, .currencySame values as the X-Country and X-Currency headers.
    transaction.amountThe amount. Whole numbers for currencies like UGX and RWF.
    transaction.idYour own unique ID for this payment. Never reuse it. You'll use it to check the status.

    Published examples differ on whether msisdn and amount are sent as strings or numbers. This builder sends msisdn as a string and amount as a number. If Airtel rejects either, try the other form.

    Transaction statuses

    StatusMeaningWhat to do
    TSSuccessfulCheck the amount, then fulfil the order once.
    TFFailedMark unpaid; let the customer retry with a new transaction ID.
    TIPIn progressWait for the callback or poll with backoff.
    TAAmbiguousKeep checking. Don't let the customer pay again yet.

    For response codes like DP00800001006 and ESB000039, see the Airtel Money error code reference.

    Countries and currencies

    CountryX-CountryX-Currency
    UgandaUGUGX
    KenyaKEKES
    TanzaniaTZTZS
    ZambiaZMZMW
    RwandaRWRWF
    MalawiMWMWK
    DR CongoCDCDF or USD
    Congo (Brazzaville)CGXAF
    GabonGAXAF
    ChadTDXAF
    NigerNEXOF
    MadagascarMGMGA
    SeychellesSCSCR
    NigeriaNGNGN

    Airtel Money markets as of October 2026. Your app is enabled per country, so check which ones in the developer portal.

    Frequently asked questions

    What phone number format does the Airtel Money API expect?

    subscriber.msisdn is the customer's number without the country code and without the leading 0, for example 752123456 for the Ugandan number 0752 123 456. The country is given separately in subscriber.country and the X-Country header.

    Does a successful collection response mean the customer paid?

    No. The response (often with code ESB000010) only means Airtel received the request and sent a USSD prompt. The customer still has to enter their PIN. Wait for the callback, or check GET /standard/v1/payments/{id} until the status is TS (paid) or TF (failed).

    What is the difference between Airtel Money v1 and v2 payments?

    v1 (/merchant/v1/payments/) takes a plain JSON body and is what this builder generates. v2 (/merchant/v2/payments/) adds payload encryption using keys from the developer portal. Check which version your Airtel app is enabled for in the portal.

    Why do I get "Credentials are not generated yet"?

    Your Airtel developer app hasn't been approved yet. UAT credentials appear once the app is set up in the portal, and production access needs Airtel to approve your business (KYC).

    Where do I set the Airtel Money callback URL?

    Unlike MTN MoMo, Airtel doesn't take a callback URL in each request. You register it for your app in the Airtel developer portal. Airtel then sends the result to that URL, with the transaction ID and a status code such as TS or TF.

    Related

    Endpoints and fields checked October 2026 against published Airtel Money integrations. Airtel's own documentation is in its developer portal at developers.airtel.africa and needs a login.

    Need this built for you?

    I integrate MTN MoMo, M-Pesa and Airtel Money into Laravel / PHP, Python / Django, Node.js / Next.js apps: payments, callbacks, payouts and go-live, with tests.