My OneApp M-PESA and wallet Data API
My OneApp is Safaricom PLC's Android super-app for Kenya, the successor front for the country's M-PESA wallet and GSM line on one home screen (Play package com.safaricom.mpesa.lifestyle). Subscribers send and receive Kenyan shillings, pay Lipa na M-PESA tills and paybills, settle saved bill accounts, draw Fuliza overdraft when the wallet is short, redeem Bonga loyalty points, park cash in Ziidi unit trusts, share Family Connect airtime with relatives, and read GSM airtime, data and M-PESA balances together. PIN, OTP and SIM header-enrichment sign-in sit beside biometric unlock. It is the default consumer client for Safaricom's M-PESA Kenya franchise, competing with Airtel Money Kenya, Equitel and standalone Fuliza-style credit apps for the same shilling wallets.
M-PESA ledger lines stamp each transfer with transID, money_in, money_out and runningBalance, while the home GSM snapshot hangs airtimeBalance, dataBalance and mpesaBalance next to usage counters (remaining, cumulative, units). Fuliza credit sits on overdraftBalance, useOdAmount, accessFee and interestRate; Bonga loyalty reports bongaPointsBalance and bongaPointsAccumulated; Ziidi money-market rows carry fundName, marketValue and dailyInterestPercentage.
Paybill confirmations resolve shortcode to publicName and customerType before debit, saved bills keep paybillNo, accountNo and dueDate, and Family Connect members expose sponsorBalance with per-line beneficiaryMsisdn and usageAmount. Treasury bots reconcile shilling cash books, household apps watch Fuliza Principal, and savings dashboards chart Ziidi next to the wallet. openData Studio turns those records into callable open data.
Screenshots
API surface
The endpoints and request/response examples below are reconstructed from the app's interface — illustrative, not a live capture.
Subscriber GSM and wallet balances
POST
/v1/subscribers/me/balancesopenbankingLoads the home snapshot of GSM airtimeBalance, creditLimit and dataBalance plus per-bundle usage counters (displayName, remaining, cumulative, units) that the airtime and share-data screens show next to mpesaBalance.
Auth: Bearer session token issued at sign-in. No PIN is required for the home balance read.
- airtimeBalance
- creditLimit
- dataBalance
- mpesaBalance
- displayName
- displayOrder
- remaining
- cumulative
- status
- type
- units
- balanceDetails
- balanceCode
- expiry
POST /v1/subscribers/me/balances HTTP/1.1 Authorization: Bearer <session-token> Content-Type: application/json { "msisdn": "254712345678" }{ "airtimeBalance": "125.50", "creditLimit": "0.00", "dataBalance": "2048", "mpesaBalance": "4320.00", "usage": [ { "displayName": "Data", "displayOrder": 1, "remaining": "1536", "cumulative": "2048", "status": "ACTIVE", "type": "DATA", "units": "MB", "balanceDetails": [ { "active": true, "remaining": "1536", "balanceCode": "DATA_MAIN", "expiry": "2026-11-01", "displayName": "Anytime data", "units": "MB" } ] } ] }M-PESA statement lines
POST
/v1/wallet/statements/queryopenbankingReturns M-PESA statement rows (transID, money_in, money_out, runningBalance, primaryParty, receiverParty) for a date range, feeding the in-app mini-statement and PDF export screens.
Auth: Bearer session token issued at sign-in.
- startDate
- endDate
- accountRef
- accountType
- accountTypeID
- currency
- details
- endTime
- funds_type
- id
- money_in
- money_out
- transID
- transactionFee
- runningBalance
- transactionType
- transactionTypeID
- reasonType
- reversible
- primaryParty
- receiverParty
POST /v1/wallet/statements/query HTTP/1.1 Authorization: Bearer <session-token> Content-Type: application/json { "startDate": "2026-10-01", "endDate": "2026-10-17" }{ "result": { "statements": [ { "id": "st-88921", "transID": "QJH7X2K9L0", "accountRef": "254712345678", "accountType": "MSISDN", "accountTypeID": "1", "currency": "KES", "details": "Send money to Jane", "endTime": "2026-10-17T08:41:12+03:00", "funds_type": "Pesa", "money_in": "0.00", "money_out": "500.00", "transactionFee": "7.00", "runningBalance": "4320.00", "transactionType": "SendMoney", "transactionTypeID": "SM", "reasonType": "P2P", "reasonTypeID": "12", "reversible": "Y", "primaryParty": {"id": "254712345678", "name": "JOHN DOE", "type": "MSISDN"}, "receiverParty": {"id": "254798765432", "name": "JANE W.", "type": "MSISDN"} } ] } }Fuliza overdraft customer info
POST
/v1/credit/overdraft/profileopenfinanceReads the Fuliza overdraft envelope (accessFee, useOdAmount, okoaAmount, interestRate, channelSessionId) and the overdraftBalance shown on the home and Fuliza screens; history rows carry Principal, Interest and AccessFee.
Auth: Bearer session token issued at sign-in. Called from both the home screen and the Fuliza management screen.
- channelSessionId
- accessFee
- useOdAmount
- okoaAmount
- currency
- interestRate
- overdraftBalance
- Currency
- TransactionTime
- BusinessScope
- TransactionType
- AccessFee
- Principal
- Interest
- TransactionAmount
POST /v1/credit/overdraft/profile HTTP/1.1 Authorization: Bearer <session-token> Content-Type: application/json { "header": {"msisdn": "254712345678"}, "body": {} }{ "channelSessionId": "ch-4412", "accessFee": "1.00", "useOdAmount": "350.00", "okoaAmount": "0.00", "currency": "KES", "interestRate": "1.083", "overdraftBalance": "2650.00", "entries": [ { "Currency": "KES", "TransactionTime": "2026-10-16T19:02:11+03:00", "BusinessScope": "P2P", "TransactionType": "FULIZA", "AccessFee": "1.00", "Principal": "350.00", "Interest": "3.79", "TransactionAmount": "354.79" } ] }Shiriki send-money payment
POST
/v1/transfers/sendopenbankingExecutes a Lipa / send-money transfer from originatorConversationID, amount, receiverParty and an encrypted pin, and returns transactionId, responseCode and responseDesc.
Auth: Bearer session token plus an RSA-encrypted PIN submitted from the send-money confirmation screen.
- originatorConversationID
- amount
- remark
- cardID
- cardType
- accountNumber
- receiverParty
- initiator
- pin
- transactionId
- responseDesc
- responseCode
- responseType
POST /v1/transfers/send HTTP/1.1 Authorization: Bearer <session-token> Content-Type: application/json { "originatorConversationID": "oc-9f21c0ab", "amount": "500", "remark": "rent", "cardID": "", "cardType": "MPESA", "accountNumber": "254798765432", "receiverParty": {"id": "254798765432", "type": "MSISDN"}, "initiator": {"id": "254712345678", "type": "MSISDN"}, "pin": "RSA-CIPHERTEXT" }{ "transactionId": "QJH7X2K9L0", "responseDesc": "Success", "responseCode": "0", "responseType": 0 }C2B Hakikisha paybill lookup
POST
/v1/merchants/lookuposintResolves a Lipa na M-PESA shortcode plus accountNumber to publicName, shortCode, customerType and msisdn so the paybill / till confirmation screen can show the organisation before debit.
Auth: Bearer session token issued at sign-in.
- shortcode
- accountNumber
- publicName
- shortCode
- customerType
- msisdn
- avatar
- businessType
POST /v1/merchants/lookup HTTP/1.1 Authorization: Bearer <session-token> Content-Type: application/json { "shortcode": "888888", "accountNumber": "INV-10482" }{ "verifyNumberResp": { "publicName": "Nairobi Water", "shortCode": "888888", "customerType": "ORGANIZATION", "msisdn": "254700000000", "avatar": "https://cdn.example/org.png" }, "businessType": "PAYBILL" }Bonga points accumulated history
POST
/v1/loyalty/points/historyopendataPulls a msisdn and date range into bongaPointsAccumulated, bongaPointsBalance and accumulationDate for the loyalty history screen.
Auth: Bearer session token issued at sign-in.
- msisdn
- startDate
- endDate
- bongaPointsAccumulated
- bongaPointsBalance
- accumulationDate
POST /v1/loyalty/points/history HTTP/1.1 Authorization: Bearer <session-token> Content-Type: application/json { "msisdn": "254712345678", "startDate": "2026-01-01", "endDate": "2026-10-17" }{ "bongaPointsAccumulated": "1250", "bongaPointsBalance": "880", "accumulationDate": "2026-10-17" }Ziidi unit-trust balance
POST
/v1/investments/funds/holdingsopenfinanceChecks the Ziidi money-market holding through unitTrustFundDetails (investorNames, fundName, marketValue, contributions, balance, dailyInterestPercentage) keyed by clientIdentifier.
Auth: Bearer session token issued at sign-in. The same route also serves invest, opt-in, withdraw and auto-invest operations, selected by an operation key in the body.
- serviceRequest
- key
- value
- unitTrustFundDetails
- clientIdentifier
- isSuccess
- message
- responseCode
- responseRefId
- investorNames
- fundShareClassCode
- fundName
- marketValue
- contributions
- balance
- dailyInterestPercentage
POST /v1/investments/funds/holdings HTTP/1.1 Authorization: Bearer <session-token> Content-Type: application/json { "serviceRequest": { "header": {"msisdn": "254712345678"}, "body": { "data": [ {"key": "operation", "value": "checkBalance"} ] } } }{ "isSuccess": true, "message": "OK", "responseCode": 200, "responseRefId": "zi-44190", "clientIdentifier": "ZIIDI-254712345678", "unitTrustFundDetails": { "clientIdentifier": "ZIIDI-254712345678", "investorNames": "JOHN DOE", "fundShareClassCode": "MMF-A", "fundName": "Ziidi Money Market", "marketValue": 12500.0, "contributions": 12000.0, "balance": 12500.0, "dailyInterestPercentage": "0.032" } }Saved bill accounts
POST
/v1/bills/accounts/listopenbankingLists saved bill accounts (accountName, accountNo, amount, billId, dueDate, paybillNo, reminderDate) for the bill-manager dashboard; frequent payees reuse debitPartyName, debitPartyNo and frequency.
Auth: Bearer session token issued at sign-in.
- bIllAccountsDto
- accountName
- accountNo
- amount
- billId
- dueDate
- imageUrl
- msisdn
- paybillNo
- reminderDate
- debitPartyName
- debitPartyNo
- frequency
POST /v1/bills/accounts/list HTTP/1.1 Authorization: Bearer <session-token> Content-Type: application/json { "msisdn": "254712345678" }{ "bIllAccountsDto": [ { "billId": 4412, "accountName": "Nairobi Water", "accountNo": "NW-8821", "amount": "1850.00", "dueDate": "2026-10-31", "imageUrl": "https://cdn.example/water.png", "msisdn": "254712345678", "paybillNo": 888888, "reminderDate": "2026-10-28" } ], "header": {"responseCode": "0"} }M-PESA e-receipt generate
POST
/v1/receipts/renderopenbankingTurns a transaction reference (trxnID, accountRef, moneyIN, moneyOUT, participantName) into base64Data, the PDF the receipt screen renders.
Auth: Bearer session token issued at sign-in.
- accountRef
- creditDebit
- moneyIN
- moneyOUT
- msisdn
- name
- participantName
- participantNumber
- trxnDate
- trxnID
- trxnType
- trxnTypeName
- base64Data
POST /v1/receipts/render HTTP/1.1 Authorization: Bearer <session-token> Content-Type: application/json { "accountRef": "QJH7X2K9L0", "creditDebit": "DEBIT", "moneyIN": 0, "moneyOUT": 500, "msisdn": "254712345678", "name": "JOHN DOE", "participantName": "JANE W.", "participantNumber": "254798765432", "trxnDate": "2026-10-17T08:41:12+03:00", "trxnID": "QJH7X2K9L0", "trxnType": "SendMoney", "trxnTypeName": "Send Money" }{ "base64Data": "JVBERi0xLjQKJeLjz9MKMSAwIG9iago8PC9UeXBlL0NhdGFsb2c+PgplbmRvYmoK" }Header-enrichment plain token
GET
/v1/identity/session-tokenosintIssues the short-lived plain token the login flow attaches so it can decrypt the SIM-header MSISDN without the subscriber typing the number.
Auth: HTTP Basic (app client credentials, Base64) plus a source-system header identifying the Android client. No user Bearer. The token is then used to decrypt the carrier-enriched MSISDN.
- token
- msisdn
GET /v1/identity/session-token HTTP/1.1 Authorization: Basic <base64-client-credentials> X-Source-System: <android-client-id>{ "token": "pt_8f21c0ab", "msisdn": "254712345678" }Family Connect shared balance
POST
/v1/family/shared-balanceopendataReads a sponsor's shared airtime balance for a sponsorMsisdn: sponsorBalance, initialAmount, offerPrice, expirationDate and per-member beneficiaryMsisdn, beneficiaryNickname and usageAmount.
Auth: Bearer session token issued at sign-in.
- sponsorMsisdn
- sponsorBalance
- initialAmount
- offerPrice
- expirationDate
- beneficiaryBalances
- beneficiaryMsisdn
- beneficiaryNickname
- amount
- beneficiaryBalance
- usageAmount
- createdAt
POST /v1/family/shared-balance HTTP/1.1 Authorization: Bearer <session-token> Content-Type: application/json { "sponsorMsisdn": "254712345678" }{ "sponsorMsisdn": "254712345678", "sponsorBalance": 800.0, "initialAmount": 1000.0, "offerPrice": 1000, "expirationDate": "2026-11-01", "beneficiaryBalances": [ { "beneficiaryMsisdn": "254711111111", "beneficiaryNickname": "Mama", "amount": 200.0, "beneficiaryBalance": 150.0, "usageAmount": 50.0, "createdAt": "2026-10-01T09:00:00+03:00" } ] }
Data categories
- balances
- transactions
- overdraft
- loyalty
- unit-trusts
- bills
- merchant-lookup
- receipts
- family-share
Where teams use this data
M-PESA ledger reconciliation
A bookkeeping bot stores each Statement row by transID, money_in, money_out and runningBalance, then matches receiverParty.id to saved paybill accountNo so Kenyan SMEs can close the daily shilling cash book without exporting a PDF.
Fuliza credit-line monitor
A household-finance product watches overdraftBalance, useOdAmount, accessFee and interestRate and alerts when a new TransactionEntryResp Principal appears after the wallet hits zero.
Paybill identity check
An accounts-payable tool looks up shortcode plus accountNumber and records publicName, customerType and businessType before staff confirm a Lipa na M-PESA debit, catching mistyped tills.
Ziidi holding snapshot
A savings dashboard pulls unitTrustFundDetails.marketValue, contributions, balance and dailyInterestPercentage by clientIdentifier so a family can chart Ziidi MMF growth next to the M-PESA runningBalance.
Frequently asked questions
What objects does the My OneApp client expose?
M-PESA statement rows (transID, money_in, money_out, runningBalance, primaryParty), home balance snapshots (airtimeBalance, dataBalance, mpesaBalance), Fuliza overdraft figures (overdraftBalance, useOdAmount, accessFee, interestRate), Bonga points, Ziidi unitTrustFundDetails, saved bill accounts with paybillNo and dueDate, Hakikisha publicName lookups, e-receipt base64Data and Family Connect sponsorBalance.
How does the app authenticate these calls?
SIM header enrichment first exchanges the app's client credentials for a short-lived plain token that recovers the MSISDN. Later wallet, statement, Fuliza and Ziidi calls send a Bearer session; send-money also attaches an RSA-encrypted PIN.
Is this a public Safaricom developer API?
No. These are first-party calls the Android super-app makes after login. The routes shown here are illustrative and describe the shape of the data, not a supported public M-PESA SDK.
Apps similar to My OneApp
- Airtel Money — Airtel Money is Airtel Kenya's mobile-money wallet, used from *334# or the My Airtel app to send funds, pay merchants (including Lipa Na KCB) and move money to banks and other networks.
- T-Kash — T-Kash is Telkom Kenya's mobile-money app and USSD wallet for sending funds to T-Kash, M-PESA and Airtel Money, paying bills and tills, buying airtime and cashing out at agents.
- Equitel — Equitel is Finserve Africa's Kenyan MVNO, a wholly owned Equity Group subsidiary that rides on Airtel Kenya and delivers Equity banking and mobile-money services from one SIM.
- Tala — Tala is a Central Bank of Kenya-licensed digital lender whose Kenya app disburses instant loans of up to KSh 50,000 straight to M-PESA.
- Branch — Branch is a Kenya digital-finance app for smartphone loans, wallet transfers, bill payments and in-app savings, aimed at people who do not use a traditional bank branch.
- KCB App — KCB Mobile Banking (the KCB App) is Kenya Commercial Bank's consumer app for paying utilities, buying airtime, sending money to KCB, other banks, M-PESA and Vooma wallets, and taking unsecured mobile loans.
- NCBA NOW — NCBA NOW is NCBA Group's Kenya banking app for opening a current account, transferring to NCBA, other banks, M-PESA and Airtel Money, paying bills and taking instant mobile loans.
Topics
- My OneApp API
- Safaricom M-PESA
- Fuliza overdraft
- Bonga points
- Ziidi unit trust
- Lipa na M-PESA
- transID
- runningBalance
Need this app's data API integrated?
We deliver scoped integrations for any named app — from USD 500 with source-code handoff, or hosted access billed per call. Tell us the data you need.
- NDA + SOW on every engagement
- Delivery in 3–7 days
- Payment only after acceptance
- Work scoped to authorized use