Documentation
Gumza takes the order. Dispatch delivers it.
Two products, one account. This section covers setting up as a merchant on either, connecting your sales channels, and pushing deliveries from your own system over a keyed REST API.
Which product is which
Gumza is the ordering and fulfilment side. It owns your catalogue, the WhatsApp storefront your customers chat with, payments, and the staff dashboard where orders are accepted, packed and marked ready.
Gumza Dispatch is the last-mile side. It owns riders, delivery zones and fees, assignment, live tracking and proof of delivery. Gumza hands it a delivery once an order is ready; it hands status back by webhook.
You do not have to use both. A merchant who already has a storefront can use Dispatch on its own as a delivery API, and a merchant selling on WhatsApp through Gumza gets the Dispatch side provisioned automatically at signup.
Pick your path
Base URLs
Production hostnames. Everything is HTTPS only; plain HTTP is redirected and HSTS is preloaded on all three.
| Surface | Base URL | Who calls it |
|---|---|---|
| Gumza app + API | https://gumza.ke | Merchants, staff, and Meta / payment provider webhooks |
| Dispatch dashboard | https://dispatch.gumza.ke | Dispatchers, riders, merchants with a delivery-only account |
| Dispatch API | https://api.dispatch.gumza.ke | Your server, using an API key |
The shortest possible integration
Three calls: confirm your key works, price the delivery, create it. Status then arrives on your webhook endpoint without you polling for it.
- POST
/api/v1/external/pingConfirm the key and mark your integration connected - GET
/api/v1/external/quotesFee and ETA before you commit - POST
/api/v1/external/dispatchesCreate the delivery
curl -X POST https://api.dispatch.gumza.ke/api/v1/external/dispatches \
-H "X-API-Key: $DISPATCH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"externalId": "order_10294",
"customerName": "Customer 001",
"customerPhone": "+254700000001",
"pickup": { "address": "Shop 4, Westlands, Nairobi" },
"dropoff": { "address": "Kileleshwa, Nairobi", "lat": -1.2833, "lng": 36.7833 },
"paymentType": "PREPAID",
"amountCents": 250000,
"currency": "KES"
}'Conventions used throughout
- Every response is an envelope:
{ success: true, data }or{ success: false, error }. See Errors & limits. - Money is always an integer in minor units.
amountCents: 250000is KES 2,500.00. - Timestamps are ISO 8601 in UTC. Convert for display, never for storage.
- IDs are UUIDs. Your own identifier goes in
externalIdand comes back on every webhook, so you never have to store ours to reconcile.