API v1 · Beta · Sandbox live

Build on the
Sharet ledger.
Or license the stack.

REST API. JSON in, JSON out. Idempotent writes. HMAC-signed webhooks. RFC 7807 errors. A free sandbox with simulated M-PESA, MTN, Airtel, Vodacom, and bank rails for Kenya, Tanzania, and Uganda.

REST · JSON RFC 7807 · errors HMAC-SHA256 · webhooks
# Check the API is live
$ curl https://api.sharet.africa/v1/health

# → 200 OK
{
  "status": "ok",
  "version": "v1",
  "rails": [
    "mpesa_ke",
    "mtn_ug"
  ],
  "ts": "2026-09-16T10:42:00Z"
}
The essentials

Everything you
need to know in
one table.

The full contract. If it is not here, it is in the OpenAPI spec. If it is not in the OpenAPI spec, write to us and we will add it.

Base URLhttps://api.sharet.africa/v1
Sandbox URLhttps://sandbox.api.sharet.africa/v1
AuthBearer JWT (short-lived, 15 min) + HMAC-SHA256 signed request body
IdempotencyRequired on all POST/PUT. Header: Idempotency-Key. 24-hour window.
Content-Typeapplication/json
Rate limits100 req/s standard · 1,000 req/s on Tier 03. Headers: X-RateLimit-Remaining.
ErrorsRFC 7807 problem+json
WebhooksHMAC-SHA256 signed · retried 24h with exponential backoff
SLA99.9% uptime target (contractual on Tier 03)
Status pagestatus.sharet.africa
OpenAPI spec/openapi/v1.yaml
Worked example

Send KES 10,000
to a Vodacom
number in Tanzania.

One call. Sharet detects the country, resolves the network, checks liquidity, and returns a transaction ID and fee. Here is exactly what the request and response look like.

Request
curl -X POST https://api.sharet.africa/v1/transactions \
  -H "Authorization: Bearer $TOKEN" \
  -H "Idempotency-Key: 7f3a-4c1b-8e2d" \
  -H "Content-Type: application/json" \
  -d '{
    "source": "wallet_abc",
    "destination": {
      "type": "phone",
      "value": "+255754000000",
      "country": "TZ"
    },
    "amount": {
      "value": "10000",
      "currency": "KES"
    }
  }'
Response · 202 Accepted
{
  "id": "tx_8f3a2b9e",
  "status": "processing",
  "rail": "vodacom_tz",
  "country": "TZ",
  "amount": {
    "value": "10000",
    "currency": "KES"
  },
  "fee": {
    "value": "320",
    "currency": "KES"
  },
  "eta": "2026-09-16T10:45:00Z",
  "webhook": "transaction.settled"
}

Idempotent · retry-safe · webhook fires on settle with HMAC signature

Endpoints · v1

The full v1
surface area.

Nine endpoints. Everything you need to send money, query the ledger, monitor treasury, and receive webhooks. No hidden magic.

POST
/v1/transactions
Send money to any supported rail. Idempotent. Returns transaction ID, fee, and ETA.
GET
/v1/transactions/:id
Retrieve a transaction by ID. Includes status, rail, fee, and settlement timestamp.
GET
/v1/ledger
Query ledger entries. Filters: account, currency, rail, status, from, to. Paginated.
POST
/v1/wallets
Create a Sharet wallet. Optional KYC pre-verification. Returns wallet ID and initial balance.
GET
/v1/wallets/:id
Retrieve wallet balance, currency, and status.
GET
/v1/treasury
Country-level liquidity pools: available balance, threshold, last reconciliation time.
GET
/v1/rails
Current status of every rail: live, degraded, or down. Includes latency percentiles.
POST
/v1/webhooks
Register a webhook URL. Choose events: transaction.settled, transaction.failed, treasury.low, rail.degraded.
POST
/v1/webhooks/test
Trigger a test webhook with a valid HMAC signature. For sandbox use.
Errors

RFC 7807
problem+json.

Every error response follows the same shape. No HTML. No stack traces. No surprises. Parse type to branch, detail to show the user.

StatusMeaningRetry?
400Malformed request bodyNo
401Missing or invalid tokenNo
403Insufficient permissionsNo
409Idempotency conflict — key reused with different bodyNo
422Business rule violation (insufficient balance, over limit)No
429Rate limit exceeded — see Retry-AfterYes
502Upstream rail unavailableYes, with backoff
503Sharet temporarily unavailableYes, with backoff
# Error response shape
{
  "type": "https://api.sharet.africa/errors/insufficient_funds",
  "title": "Insufficient funds",
  "status": 422,
  "detail": "Wallet balance is KES 5,000; requested transfer is KES 10,320.",
  "instance": "/v1/transactions",
  "trace_id": "t_9c2e8f1a"
}
Sandbox · 2026

Live for Kenya
and Uganda.
Tanzania Q4.

The sandbox is real and running. It simulates M-PESA Kenya and MTN Uganda today. Vodacom Tanzania is in integration. Airtel and card simulation are planned for Q1 2027.

RailStatusNotes
mpesa_ke● LiveFull simulation: success, failure, delay
mtn_ug● LiveFull simulation
vodacom_tz● In integrationExpected Q4 2026
airtel_tz○ PlannedQ1 2027
airtel_ug○ PlannedQ1 2027
card○ PlannedQ1 2027
bank_ke○ PlannedQ1 2027
Sandbox access

Free. No card.
5-minute setup.

Request access and you will receive a sandbox token, a set of test phone numbers, and a Postman collection. Test success, failure, delay, and rail-degraded scenarios deterministically.

Deterministic test numbers · real webhooks · real idempotency
Test data

Documented
scenarios.

Every test phone number is documented. +254700000001 succeeds. +254700000002 fails. +254700000003 delays by 30 seconds.

Webhooks

Real signatures,
real retries.

Sandbox webhooks are signed exactly like production. Test your retry logic and signature verification before going live.

SDKs · 2027

Official SDKs
coming Q1.

Python, Node, PHP, and Flutter SDKs are in development. Until then, the API is a plain REST interface that works from any HTTP client. Community SDKs welcome.

Python · Node · PHP · Flutter · Q1 2027
White-label & licensing

Your brand.
Sharet's stack.
Licensed as IP.

For banks, fintechs, SACCOs, and platforms that want their own branded wallet — the entire Sharet ledger, treasury, and adapter stack is licensable. You bring the customers and the brand. We bring the rails and the settlement.

White-label wallet

Launch your own
branded wallet.

A fully-branded wallet with your logo, your colour, and your domain. Your customers see your brand. Sharet runs the ledger, treasury, and rails underneath. Deployment options include Sharet-hosted, single-tenant, or self-hosted in your cloud.

Banks · fintechs · SACCOs · platforms · insurers
Direct ledger

Higher limits,
dedicated quota.

Direct API access with reserved capacity, custom rate limits, and priority routing. Ideal for high-volume platforms.

Treasury

Managed
liquidity.

Sharet operates the country-level liquidity pools, reconciles them daily, and reports to you in real time. Or you operate your own pools and we reconcile across them.

Bespoke rails

New rails built
for your corridor.

If your business needs a rail or corridor Sharet does not yet support, we build the adapter. You get first access. The adapter then becomes part of the Sharet network for future customers.

Custom corridors · bespoke rails · dedicated engineering

Licensing models: revenue share · platform fee · bespoke commercial terms. Contact us to discuss.

Support by tier

Documented paths

Community Slack Email · Tier 02 Dedicated engineer · Tier 03 99.9% SLA · Tier 03 Status page
Get started

Request sandbox.
Or license the stack.

Every request is read by a human on the engineering team. Sandbox access is granted within one working day. Licensing conversations are scheduled within a week.

We reply within one working day. No newsletter signup. No third-party sharing.
Get started · 2026

Build on the
ledger. Or make
it your own.

A working API. A live sandbox. A contractual SLA on Tier 03. Whatever your team needs to ship payments across East Africa — it starts here.