Rate limits
<120 requests/minute per key (burst to 150). Auth endpoints: 10 req/min. Returns 429 with Retry-After header.
POST /api/v1/admin/api-keys).POST /api/v1/shipments with your pickup and drop-off zones.order.delivered webhook.# create a shipment
curl https://api.fleetrails.com/api/v1/shipments \
-H "Authorization: Bearer fr_live_…" \
-H "Content-Type: application/json" \
-d '{"pickup":{"zone":"yaba"},"dropoff":{"zone":"lekki"},
"customer":{"name":"Ada","phone":"+234…"}}'
Admin endpoints for managing keys programmatically:
Endpoints available at both /api/v1/orders and /api/v1/shipments — they are aliases.
Subscribe to events in the console. Every delivery is signed so you can verify it came from us.
Dispatched to tenant webhooks when events occur:
order.created
order.status_changed
order.assigned
order.picked_up
order.delivered
order.payment_confirmed
order.failed_delivery
order.returned
order.cancelled
# POST to your webhook URL
FR-Signature: t=1724508000,v1=5f8a…
Content-Type: application/json
{
"eventType": "order.delivered",
"timestamp": 1724508000123,
"apiKeyId": "ak_live_…",
"tenantId": "tn_…",
"data": {
"orderId": "ord_…",
"trackingCode": "FR-48213",
"status": "DELIVERED",
"recipientName": "Ada O.",
"deliveredAt": "2026-08-24T13:58:04Z"
}
}
# HMAC-SHA256 of (timestamp + "." + body) using webhook secret
# FR-Signature: t=,v1=
const payload = timestamp + "." + body;
const expected = crypto.createHmac("sha256", secret)
.update(payload).digest("hex");
if (expected !== signature) throw new Error("Invalid signature");
Manage keys via the console or programmatically (see Auth section).
fr_live_ (production), fr_test_ (sandbox).API_KEYS_MANAGE scope).POST /api/v1/admin/api-keys/:keyId/rotate returns new secret; old key valid for 24h grace period.120 requests/minute per key (burst to 150). Auth endpoints: 10 req/min. Returns 429 with Retry-After header.
Errors are JSON with a consistent shape:
{
"error": {
"code": "zone_not_found",
"message": "Zone 'xyz' not found",
"details": { "zone": "xyz" }
}
}
Common codes: zone_not_found, insufficient_balance, order_not_found, unauthorized, rate_limited, validation_failed.
| Live API | api.fleetrails.com/api/v1 |
| Sandbox API | sandbox.api.fleetrails.com/api/v1 |
| Tracking links | trk.fleetrails.com |
| Status page | status.fleetrails.com |
Applied per API key:
429 with Retry-After header (seconds)Book a demo and we’ll flip the switch on your workspace.