Introduction
What the TeePay API does, how it is organised and the conventions every request follows.
TeePay lets your business accept payments in East Africa and move money out again from one API. Your server creates payments; TeePay talks to mobile money networks and payment providers, verifies each payment and posts it to your TeePay ledger before telling you it succeeded.
Quickstart
Make your first authenticated call and create a hosted checkout in a few minutes.
API reference
Every public endpoint, generated from the same contract the API is built from.
What you can build
| Product | What it does | Status |
|---|---|---|
| Mobile money push | Sends a USSD prompt to the customer's phone. The customer approves with their PIN. | Requires approval |
| Checkout sessions | A TeePay-hosted payment page you create from your server and redirect to. | Available |
| Payment links | Shareable fixed-amount links, from the dashboard or the Link API. | Available |
| Control Numbers | Tanzanian bill and customer reference numbers payable from banks and mobile wallets. | Requires approval |
| Payouts | Quoted transfers from your TeePay balance to mobile wallets and banks. | Requires approval |
| Webhooks | Signed notifications when payments and payouts complete or fail. | Available |
| MCP server | Lets AI agents create real checkout links and read verified status. | Available |
"Requires approval" means TeePay enables the feature for your account after review. Your code can
check what is enabled at any time with GET /v1/capabilities.
Base URL
https://api.teepay.meAll endpoints are under /v1, accept and return JSON, and must be called over HTTPS from your server.
Conventions
- Authentication
- Authorization: Bearer <secret API key>
- Amounts
- Integer minor units. TZS 5,000.00 is 500000
- Currencies
- ISO 4217 codes, e.g. TZS. Markets are listed by capabilities
- Countries
- ISO 3166-1 alpha-2 codes, e.g. TZ
- Timestamps
- RFC 3339 in UTC
- Retries
- Idempotency-Key header on every create
Amounts in requests are strings
Send amount_minor as a string of digits, for example "500000". This avoids precision loss in
languages that store numbers as floating point. Some read responses return money.amount_minor as a
JSON number; the API reference shows the exact type for every field.
A successful request is not the same as a successful payment. Read How TeePay works before you fulfil your first order.