Your shop books it. We carry it.
One request creates a delivery and hands back an id and a tracking link. We call your endpoint every time it changes, so nothing in your system has to poll us and nobody has to retype an address.
{
"reference": "ABC-10432",
"dropoff": {
"name": "Sam Ncube",
"phone": "+263771234567",
"address": "12 Example Road, Avondale, Harare"
},
"items": [{ "description": "One box", "quantity": 1 }]
}
201 Created
{
"id": "dlv_01J8ZX...",
"status": "pending",
"tracking_url": "https://roadrunnerzw.com/t/..."
}
Three steps, and then it runs itself
-
1
Book it
Send the collection and delivery details. You get an id and a tracking link back in the same response, and an idempotency key means a retry cannot book the same parcel twice.
-
2
Hear about it
We call your endpoint when a courier is assigned, collects and delivers. Every message is signed, and you can prove your handler works before a real delivery depends on it.
-
3
Prove it
Every status change is kept with its time and where it came from. That is the record to quote when a customer says a parcel never arrived.
Things worth knowing before you start
- Requests are signed and timestamped
- A captured request cannot be replayed later. The signing scheme is published, and we hand you the exact logic rather than describing it.
- Keys are scoped, and shown once
- Issue a key that can only do what that integration needs. We store a hash, so the secret is readable exactly once, including by us.
- Test mode behaves like live
- The same responses, the same webhooks, the same errors. Nothing reaches a courier until we switch you on.
- Secrets rotate without breaking you
- During a rotation we sign every message with both secrets, so you deploy the new one when it suits you rather than racing us.
A key takes a minute
Create an account and issue yourself a test key. Nothing reaches a courier until you ask us to switch you live.