Data products
AftaRobot Data API
Verified South African minibus taxi fares, rank-to-rank route intelligence, rural coverage and unmet demand signals.
What buyers get
Canonical places
Aliases such as Joburg, JHB, Tshwane, PTA, Nelspruit and Mbombela resolve to canonical entities.
Bidirectional graph
Rank-to-rank routes are exposed as a two-way mobility graph while preserving the original verified fare source.
Freshness fields
Every fare includes verification timestamps, stale flags and source type where available.
Rural premium data
Tier 3-4 routes identify villages, small towns and informal areas conventional providers usually miss.
Who uses it
Vehicle OEMs
Corridor demand, rural mobility coverage and operator market signals.
Short-term insurers
Route-level exposure, commuter density and regional fare benchmarks.
Fleet operators
Rank-to-rank cost planning, active corridors and long-distance route economics.
Government
Transport access, unmet route demand and rural/informal mobility evidence.
Researchers
Structured informal transport data for places not covered by conventional GTFS feeds.
Pricing tiers
Free
Up to 100 calls/day
R0
Routes and single price lookup for evaluation.
Standard
Up to 1 000 calls/day
R2 500/month
Routes, price index and corridors for operational reports.
Premium
Unlimited calls
R8 500/month
All endpoints, trends, demand intelligence and full reports.
Authentication
Buyer endpoints use API-key authentication. Status and data endpoints require a valid key and tier access so usage can be audited and rate-limited by plan.
Authorization: Bearer ak_your_api_key_herecurl -H "Authorization: Bearer ak_live_xxx" \
"https://aftarobot.co.za/api/v1/data/routes?limit=100"View OpenAPI JSONEndpoints
GET /api/v1/statusFree+API health, canonical route counts, directional graph edges, freshness and data coverage status.
GET /api/v1/fare?from=Hazyview&to=NelspruitFree+Single route price lookup with source, confidence and verification date.
GET /api/v1/data/routes?limit=100&cursor=0Standard+Paginated route, price, GPS, rural tier, association and discovery-value dataset.
GET /api/v1/data/fare-index?limit=100Standard+Monthly provincial taxi price index and fare movement summaries.
GET /api/v1/data/corridors?limit=100Standard+Corridor density, average price and long-distance market summaries.
GET /api/v1/data/demand?limit=100PremiumUnmet route demand signals from failed searches and commuter submissions.
GET /api/v1/data/trends?limit=100PremiumHistorical price change events, stale-fare signals and verified fare movement.
Sample responses
GET /api/v1/fare?from=Hazyview&to=Nelspruit{
"from": "Hazyview",
"to": "Nelspruit",
"fare": 80,
"price": 80,
"currency": "ZAR",
"source": "ASSOCIATION",
"association": "Example Taxi Association",
"cashOnly": true,
"confidenceScore": 95,
"isLongDistance": false,
"verifiedAt": "2026-05-01T00:00:00.000Z"
}GET /api/v1/data/routes?limit=100&cursor=0{
"buyer": "Example OEM",
"generatedAt": "2026-05-17T19:00:00.000Z",
"networkSummary": {
"includesDirectionalEdges": true,
"directionalRoutes": 3327,
"canonicalRoutes": 3082,
"autoReverseRoutes": 245,
"rankBackedEdges": 1131,
"textDestinationRoutes": 2196,
"graphCompletenessPercent": 54,
"canonicalFilter": "isAutoReverse=false"
},
"pagination": {
"limit": 100,
"offset": 0,
"total": 3060,
"hasMore": true,
"nextCursor": "100"
},
"routes": [{
"slug": "hazyview-taxi-rank-to-mkhuhlu",
"originCity": "Hazyview",
"destinationCity": "Mkhuhlu",
"price": 20,
"province": "Mpumalanga",
"distanceKm": 12.5,
"isLongDistance": false,
"coverageTier": 4,
"isRuralInformal": true,
"discoveryValue": 10,
"digitalPresenceElsewhere": false,
"confidenceScore": 80,
"association": null,
"verifiedAt": "2026-05-01T00:00:00.000Z"
}]
}Error codes
401 — Missing or invalid Bearer API key.
403 — Your tier does not include this endpoint.
429 — Daily API limit exceeded.
400 — Required query parameters are missing or invalid.
