API reference
Every endpoint in one place
A flat index of the 84 documented endpoints, grouped by area. Select a path to jump to its full description and examples.
Base URL
https://api.paysasa.com/api/v1Authx-api-keyFormatJSON84 endpoints
Multi-currency & amounts1 endpoint
| Method | Path | Summary |
|---|---|---|
| GET | /currencies | List enabled currencies (session required). |
Checkout sessions6 endpoints
| Method | Path | Summary |
|---|---|---|
| POST | /checkout/sessions | Create a new checkout session. |
| GET | /checkout/sessions/:id | Retrieve a checkout session by ID to check payment status. |
| POST | /checkout/requests | POS-focused helper endpoint. |
| POST | /checkout/discovery/paybill | Business paypoint helper: create a custom-amount hosted checkout. |
| POST | /checkout/sessions/:id/pay | Initiate payment on an existing checkout session. |
| POST | /checkout/sessions/:id/cancel | Cancel an active checkout session when the customer exits payment or requests cancellation. |
Payment links1 endpoint
| Method | Path | Summary |
|---|---|---|
| POST | /payment-links |
Invoices & recurring billing6 endpoints
| Method | Path | Summary |
|---|---|---|
| POST | /invoices | Create an invoice. Requires business_id when using API key auth. |
| GET | /invoices | List invoices for your business. |
| GET | /invoices/:id | Retrieve invoice status (paid, pending, amount_remaining). |
| POST | /invoices/:id/send | Email or SMS the invoice link to the customer (includes payment_url ). |
| GET | /invoices/:id/public | No authentication — used by the hosted payment page. |
| POST | /invoices/:id/checkout | No authentication — start M-PESA payment from your own UI (returns hosted_url ). |
Subscriptions7 endpoints
| Method | Path | Summary |
|---|---|---|
| POST | /billing/customers | Create billing customer |
| POST | /billing/products | Create product |
| POST | /billing/prices | Recurring price ( amount minor units, interval day|week|month|year) |
| POST | /subscriptions | Create subscription; returns payment_url for first invoice |
| POST | /subscriptions/checkout | Create a subscription and return a checkout URL |
| POST | /subscriptions/:id/cancel|pause|resume | Cancel, pause, or resume a subscription |
| GET | /subscriptions/portal | Customer portal (subscription_id + email or phone) |
Donations8 endpoints
| Method | Path | Summary |
|---|---|---|
| GET | /donations/campaigns | List campaigns |
| POST | /donations/campaigns | Create draft campaign (purpose + beneficiary required) |
| PATCH | /donations/campaigns/:id | Update campaign; set status to active|paused|closed |
| GET | /donations/gifts | List gifts (optional campaign_id, q) |
| GET | /donations/campaigns/:id/export | CSV export of gifts/receipts |
| GET | /donations/public/:slug | Public campaign payload |
| POST | /donations/public/:slug | Wallet pay (signed-in donor) |
| POST | /donations/public/:slug/mpesa-checkout | Create M-Pesa STK checkout session |
Reconciliation2 endpoints
| Method | Path | Summary |
|---|---|---|
| GET | /mp/c2b/reconciliation | List unmatched callback items and candidate checkout sessions. |
| POST | /mp/c2b/reconciliation/:unmatchedId/match | Resolve one unmatched callback by matching it to a checkout session. |
Wallets & conversion3 endpoints
| Method | Path | Summary |
|---|---|---|
| GET | /wallets/convert/quote | Query: from_wallet_id , to_wallet_id , amount (minor units in source currency). |
| POST | /wallets/convert | |
| POST | /wallets | Create an additional currency wallet: { currency: "USD", wallet_type: "individual" } . |
Wallet-as-a-Service16 endpoints
| Method | Path | Summary |
|---|---|---|
| GET | /businesses/:id/waas | WaaS settings (enable, reserved, manual/API deposit toggles) |
| PATCH | /businesses/:id/waas | WaaS settings (enable, reserved, manual/API deposit toggles) |
| GET | /waas/virtual-accounts | List/create VAs (?include_ledger=1). Body: external_id, display_name?, display_identifier?. Response includes mpesa_account_number |
| POST | /waas/virtual-accounts | List/create VAs (?include_ledger=1). Body: external_id, display_name?, display_identifier?. Response includes mpesa_account_number |
| GET | /waas/virtual-accounts/:id | Get/update VA (status, display_name, display_identifier; ?include_transactions=1) |
| PATCH | /waas/virtual-accounts/:id | Get/update VA (status, display_name, display_identifier; ?include_transactions=1) |
| POST | /waas/deposits/intent | Time-bound PayBill deposit intent |
| GET | /waas/deposits/intent/:id | Deposit intent status |
| POST | /waas/deposits/checkout | Hosted checkout session (wallet + M-Pesa) |
| POST | /waas/deposits/stk | Checkout + one-shot M-Pesa STK |
| POST | /waas/withdraw | Withdraw to M-Pesa or Paysasa wallet (fee_bearer: master|va) |
| GET | /waas/withdraw/quote | Quote fee + debits (?amount=&fee_bearer=) |
| GET | /waas/withdraw/status | Poll withdrawal (?transaction_id= or ?reference=) |
| GET | /waas/transactions | WaaS tx history (?external_id=, ?virtual_account_id=, ?type=) |
| GET | /waas/reconciliation | Master wallet vs aggregates snapshot |
| POST | /waas/sandbox/simulate-deposit | Sandbox-only simulated C2B (test API keys) |
Payroll4 endpoints
| Method | Path | Summary |
|---|---|---|
| GET | /ext/payroll/employees | List employees for a business |
| POST | /ext/payroll/employees | Create an employee |
| POST | /ext/payroll/runs | Calculate or approve a payroll run (action in the body) |
| GET | /ext/payroll/reports | Statutory reports and the P9 annual summary |
Business ownership transfer3 endpoints
| Method | Path | Summary |
|---|---|---|
| GET | /businesses/:id/ownership-transfer | Owner only. Returns { enabled, transfer } . |
| POST | /businesses/:id/ownership-transfer | action: "send_otp" with pin , or create request with toEmail , pin , otp , optional revokeApiKeys (default true). |
| DELETE | /businesses/:id/ownership-transfer | Body/query transferId . |
Lengo (Save Now, Buy Later)10 endpoints
| Method | Path | Summary |
|---|---|---|
| POST | /lengo/offers | Create a merchant Lengo offer using your business API key or an authenticated dashboard session. |
| POST | /lengo/goals | Customer-authenticated route to create a Lengo goal from an existing merchant offer. |
| POST | /lengo/goals/:id/deposit | Deposit from the customer's active personal wallet into the savings wallet backing the Lengo goal. |
| GET | /lengo/offers | Public catalog list. Filter by business_id , business_slug , external_product_id (requires business_id), status , currency , page… |
| GET | /lengo/offers/resolve | Single-call resolver for embed widgets: pass offer_id or business_id + external_product_id . |
| GET | /lengo/stores | paginated businesses with active Lengo offers ( page , limit ) |
| GET | /lengo/goals | customer goals (paginated) |
| GET | /lengo/merchant/offers | paginated |
| GET | /lengo/merchant/goals | paginated |
| GET | /lengo/merchant/overview |
Deni (IOUs)5 endpoints
| Method | Path | Summary |
|---|---|---|
| POST | /deni | |
| GET | /deni?role=creditor|debtor|all | |
| PATCH | /deni/:id | Creditor adjusts remaining balance; debtor is notified. |
| POST | /deni/:id/remind | Body: { "channels": ["sms","email"] } |
| POST | /deni/:id/pay | Authenticated debtor wallet + PIN (P2P fees). |
POS Lite1 endpoint
| Method | Path | Summary |
|---|---|---|
| POST | /pos | Complete a sale or push a catalogue item (action in the body) |
eTIMS (KRA)11 endpoints
| Method | Path | Summary |
|---|---|---|
| POST | /etims/invoices | Create fiscal invoice (QUEUED or PENDING_MANUAL) |
| GET | /etims/invoices/:id | Fetch status + KRA CU / QR when accepted |
| POST | /etims/invoices/:id/confirm-manual-filing | Mark PENDING_MANUAL as filed (CU #) |
| GET | /etims/invoices | List recent documents (?status=&limit=) |
| POST | /etims/credit-notes | Create credit note (needs originalDocumentId) |
| GET | /etims/reports/manual-export | CSV export for KRA portal re-entry |
| GET | /etims/items | List item ↔ KRA classification mappings |
| POST | /etims/items | Upsert item mapping |
| GET | /etims/tax-codes | Tax types (A–E) |
| GET | /etims | Account setup / activate (dashboard + API) |
| POST | /etims | Account setup / activate (dashboard + API) |
No endpoint matches that filter.
Paths are relative to the base URL above. Parameters in a path such as :id are placeholders you replace.