eBakkie Partner API
Integrate eBakkie delivery services directly into your platform. Calculate rates, create deliveries, track shipments, and receive real-time webhook updates.
Quick Start
- Sign up at ebakkie.co.za/register
- Enable your merchant account at /merchants
- Create an API key
- Make your first API call (see below)
Base URL
https://api.ebakkie.co.za/api/partner
Authentication
Include your API key in the X-API-Key header with every request. Keys start with ebk_live_.
curl -X GET \ https://api.ebakkie.co.za/api/partner/vehicle-types \ -H "X-API-Key: ebk_live_your_api_key_here" \ -H "Content-Type: application/json"
Error Handling
All errors return a consistent JSON format:
{
"statusCode": 400,
"message": "Pickup location is required",
"error": "Bad Request",
"timestamp": "2026-03-17T08:00:00.000Z",
"path": "/api/partner/deliveries"
}| Status Code | Meaning |
|---|---|
| 200 | Success |
| 201 | Created |
| 400 | Bad Request — invalid parameters |
| 401 | Unauthorized — invalid or missing API key |
| 403 | Forbidden — insufficient permissions |
| 404 | Not Found |
| 429 | Rate Limit Exceeded |
| 500 | Internal Server Error |
Endpoints
Webhooks
Register a webhook URL to receive real-time delivery status updates. We send a POST request to your URL whenever a delivery status changes.
Webhook payload:
{
"event": "delivery.completed",
"delivery_id": "ride-uuid",
"status": "completed",
"final_fare": 1048.40,
"driver_name": "Sipho M.",
"completed_at": "2026-03-17T09:12:00.000Z",
"timestamp": "2026-03-17T09:12:01.000Z"
}Available events:
| Event | Description |
|---|---|
delivery.accepted | Driver accepted the delivery |
delivery.arrived | Driver arrived at pickup location |
delivery.started | Goods picked up, delivery in transit |
delivery.completed | Delivery completed successfully |
delivery.cancelled | Delivery was cancelled |
Rate Limits
Default: 60 requests per minute per API key. Rate limit headers are included in every response.
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests per window |
X-RateLimit-Remaining | Remaining requests in current window |
X-RateLimit-Reset | Window reset time (Unix timestamp) |
Code Examples
Node.js / JavaScript
const axios = require('axios');
const ebakkie = axios.create({
baseURL: 'https://api.ebakkie.co.za/api/partner',
headers: { 'X-API-Key': 'ebk_live_your_key_here' }
});
// Calculate rates
const rates = await ebakkie.post('/rates', {
pickup_lat: -26.2041, pickup_lng: 28.0473,
dropoff_lat: -25.7479, dropoff_lng: 28.2293,
});
console.log(rates.data);
// Create a delivery
const delivery = await ebakkie.post('/deliveries', {
pickup_address: '123 Main St, Sandton',
pickup_lat: -26.2041, pickup_lng: 28.0473,
dropoff_address: '456 Oak Ave, Pretoria',
dropoff_lat: -25.7479, dropoff_lng: 28.2293,
vehicle_type_id: '04f17276-...',
recipient_name: 'John Doe',
recipient_phone: '+27612345678',
});
console.log(delivery.data);Python
import requests
API_KEY = "ebk_live_your_key_here"
BASE = "https://api.ebakkie.co.za/api/partner"
headers = {"X-API-Key": API_KEY, "Content-Type": "application/json"}
# Calculate rates
rates = requests.post(f"{BASE}/rates", json={
"pickup_lat": -26.2041, "pickup_lng": 28.0473,
"dropoff_lat": -25.7479, "dropoff_lng": 28.2293,
}, headers=headers)
print(rates.json())
# Create delivery
delivery = requests.post(f"{BASE}/deliveries", json={
"pickup_address": "123 Main St, Sandton",
"pickup_lat": -26.2041, "pickup_lng": 28.0473,
"dropoff_address": "456 Oak Ave, Pretoria",
"dropoff_lat": -25.7479, "dropoff_lng": 28.2293,
"vehicle_type_id": "04f17276-...",
"recipient_name": "John Doe",
"recipient_phone": "+27612345678",
}, headers=headers)
print(delivery.json())PHP
$apiKey = "ebk_live_your_key_here";
$base = "https://api.ebakkie.co.za/api/partner";
$ch = curl_init("$base/rates");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"X-API-Key: $apiKey",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"pickup_lat" => -26.2041, "pickup_lng" => 28.0473,
"dropoff_lat" => -25.7479, "dropoff_lng" => 28.2293,
]),
]);
$response = curl_exec($ch);
$data = json_decode($response, true);
print_r($data);Need help integrating?
Our developer support team is here to help with integration, testing, and going live.