Logistics
Delivery is deliberately manual — every shipment is carried by an in-house rider, a manually-tracked third-party courier, or picked up by the customer. There's no live carrier webhook to poll; status updates come from staff via shipment.events. Staff authentication required.
Shipments
carrier is "in_house", "third_party" (with a free-text courier_name, e.g. "DHL", "G4S", "Sendy"), or "pickup".
GET /api/v1/shipments/15/ — response data
{
"id": 15,
"order": 42,
"sale": null,
"carrier": "third_party",
"courier_name": "Sendy",
"tracking_number": "SND-8891",
"route": null,
"agent": null,
"zone": 2,
"zone_name": "Rest of Kenya",
"recipient_name": "Jane Doe",
"recipient_phone": "+254700000000",
"address_line": "123 Example Rd",
"city": "Kisumu",
"region": "Nyanza",
"weight_kg": "0.500",
"is_same_day": false,
"status": "in_transit",
"estimated_delivery": "2026-07-25",
"shipped_at": "2026-07-22T08:00:00Z",
"delivered_at": null,
"cost": "300.00",
"events": [
{ "id": 1, "status": "picked_up", "note": "", "location": "Nairobi hub", "timestamp": "2026-07-22T08:00:00Z" }
],
"payments": []
}Zones, routes & agents
/api/v1/delivery-zones/Region-based pricing — base_fee/per_kg_fee per named zone (e.g. "Nairobi (Local)", "Coast")./api/v1/delivery-agents/In-house riders/boda operators./api/v1/delivery-routes/An agent's assigned route for a given date.