Itafika

An open-source logistics aggregator API for Kenya.
“Itafika” — Swahili: it will arrive.

One clean API any online shop plugs into to solve delivery — locations, transport modes, and rates already built in. At checkout, a customer picks a location and sees real ways to get the goods to them, each with a price and a time. No developer ever models Kenya's delivery system from scratch.

One call in. A checkout-ready list out.

This playground runs the real Phase 1 quote logic against Itafika's seed dataset. Change the route and the package — watch the options recompute. This is exactly what a shop's checkout receives.

itafika · quote playground seed data
2.5 kg

Tip: try a route nobody serves yet (e.g. an upcountry-to-upcountry pair) to see what a contribution opportunity looks like.

An infrastructure abstraction layer

Itafika does for delivery what Daraja did for payments — put a clean interface in front of a fragmented system, and let a generation build on top of it.

The precedent · Daraja

One clean rail over M-Pesa

Before Daraja, touching M-Pesa meant wrestling the system directly. Daraja hid the mess behind a predictable API — and fintech exploded on top of it.

The move · Itafika

One clean interface over delivery

Itafika asks one question — how can this package get from here to there, and what are the options? — and returns one orderly answer across riders, matatus, buses, and couriers.

Provider-agnostic by design

The core engine never contains logic for a specific courier. It speaks to small adapters; each translates the standard request for its own world. Adding a provider is a contribution at the edge — never a change to the core. Tap a box to see what it does.

E-commerce Client (Shop)
JSON API ↓
Core Routing Engine
standard request, fanned out to every adapter ↓
🛵 RiderBolt · Gatika
🚐 Matatu2NK · Mololine
🚌 BusEasy Coach
📦 CourierG4S · Fargo

The Core Routing Engine

Receives every request in one standardized shape, fans it out to all adapters, collects their answers, and returns a unified list. It knows nothing about any specific provider — that's the whole point. Click any adapter to see its job.

A small, complete surface

Five endpoints, frozen as the canonical contract in spec/openapi.yaml. Click through them.

Every provider, five universal states

Providers each track differently. Itafika normalizes them into one vocabulary, so a shop reads the same five states no matter who carries the package. Advance the shipment.

Three ways to make it yours

Itafika only works if the people who depend on it help build it. The most valuable contribution isn't always code. Tap a card.

🗺️

Contribute data

No code required. Add a stage, hub, or a rate you actually know — the highest-leverage thing most people can do.

Edit spec/data/*.csv, add your row with a source, open a PR. Correcting a stale rate counts just as much as adding one.
Tap to expand ↓
🔌

Write an adapter

Teach Itafika one provider. Implement one interface — LogisticsProviderInterface — and the core never changes.

Three flavours: static (reads the dataset), live (calls a real API/scraper), and human-in-the-loop (a WhatsApp bot where a rider replies “Accept”).
Tap to expand ↓
⚙️

Build the core

The engine, server, and spec tooling — in TypeScript. Spec-first, so contract changes start in openapi.yaml.

Every API change pairs with an ADR in docs/decisions/, keeping the standard and the reference server honest with each other.
Tap to expand ↓
spec/data/rates.csv + your contribution
provider_idorigindestinationbase_kesper_kgtimesource
mololineZONE_NBI_CBD_01ZONE_NKR_MAIN40003 hoursfield-2026-06
2nkZONE_NBI_CBD_01ZONE_NYR_MAIN30003 hoursfield-2026-06
That's the entire contribution flow — a row, a source, a pull request.

Useful on day one. Built to grow at the edges.

Phase 1MVP · now

The static API

Seeded static rates and standardized zone IDs behind the four endpoints; the quote engine returns real, useful numbers. Open-sourced immediately — standardized locations and price estimation are valuable on their own.

In progress
Phase 2Community

Open adapter contribution

Publish LogisticsProviderInterface and invite the community to extend coverage provider by provider — live courier rates, a WhatsApp bot for manual riders, a new town's stage map. The core never changes; the edges grow.

Planned
Phase 3Settlement

Payments & escrow

Integrate Daraja / M-Pesa so cash-on-delivery can trigger a split — delivery fee to the rider or SACCO, balance to the merchant. Changes the regulatory posture, so it comes last and with care.

Planned

Help map how Kenya delivers

The lasting asset isn't the code — it's the open, community-maintained picture of how parcels actually move. Add a rate. Write an adapter. Make delivery something every shop can simply consume.