Delivery orders
Create, track, estimate, and cancel same-day deliveries — the flagship Dawurobo delivery API.
The delivery order API is the core of the platform: create a delivery, get a price up front, track
it to the door, and cancel it. Every operation is a signed POST to
https://delivery.dawurobo.com/api/v1/delivery/{operation} (see
Authentication and signing); full schemas are in the
API Reference.
You need a partner account and a signed request
These endpoints reject unsigned or unauthenticated calls. Create a partner
account for an instant staging key, then
sign every request. Reads (orders.get, orders.track, orders.estimate, locations.list) work
on staging; creating and cancelling real orders is best done with a production key.
Scopes at a glance
| Operation | Scope | Notes |
|---|---|---|
orders.estimate | delivery:read | Price a delivery before committing. |
locations.list | delivery:read | Supported delivery areas/zones. |
orders.create | delivery:write | Create a delivery. Wallet-funded orders also need delivery:wallet:spend. |
orders.get | delivery:read | Full status of one of your orders. |
orders.track | delivery:read | Customer-facing status timeline. |
orders.cancel | delivery:write | Cancel before delivery. |
delivery:wallet:spend is a sensitive money scope — it is not granted by a delivery:*
wildcard and must be issued to your key by name. See How money works.
Estimate a delivery
POST /api/v1/delivery/orders.estimate — pure calculation, no order is created.
{
"delivery_location": { "coordinates": { "lat": 5.556, "lng": -0.2057 } },
"pickup_location": { "coordinates": { "lat": 5.58, "lng": -0.22 } },
"priority": "standard"
}Returns estimated_price, delivery windows, service area, and the standard/economy/cargo
options. Delivery coordinates are required; pickup defaults to central Accra when omitted.
Create an order
POST /api/v1/delivery/orders.create
{
"order_reference": "EXT-1001",
"customer": { "name": "Ama Mensah", "phone": "0244000000" },
"delivery": {
"address": "123 Oxford St, Osu",
"city": "Accra",
"region": "Greater Accra",
"coordinates": { "lat": 5.556, "lng": -0.2057 }
},
"item": "1x parcel",
"pickup": {
"address": "456 Ring Rd",
"contact_person": "Kojo",
"contact_phone": "0209999999",
"coordinates": { "lat": 5.58, "lng": -0.22 }
},
"payment": { "payer": "recipient" },
"delivery_date": "2026-07-10T10:00:00Z"
}On success (201):
{
"status": "success",
"message": "Order created successfully",
"data": {
"order_details": { "order_id": "ORD-...", "estimated_delivery": "2026-07-10T10:00:00Z" },
"status": "order_created"
}
}Keep the returned order_id — you'll use it for orders.get, orders.track, and orders.cancel.
order_reference is your idempotency key
Creating two orders with the same order_reference returns 409 DUPLICATE_ORDER_REFERENCE — a
retry after a network timeout will never double-create or double-charge. If you're unsure whether
a create succeeded, retry with the same order_reference: a 409 means the first attempt
landed (or is still completing — confirm with orders.get), while a fresh 201 means it's now
created.
Who pays — payment.payer
recipient(default) — cash on delivery; your wallet is not touched.partner— the delivery fee is debited from your delivery wallet at creation. This requires thedelivery:wallet:spendscope and valid pickup + delivery coordinates (so Dawurobo prices the fee — a wallet-funded order is never billed against a client-supplied amount). If the wallet can't cover it (and no credit headroom), you get402 INSUFFICIENT_WALLET_BALANCE.
See How money works for the full model.
Get order status
POST /api/v1/delivery/orders.get
{ "order_id": "ORD-..." }Returns the current status, recipient info, amount, and payment status. An order that isn't yours
returns 404 ORDER_NOT_FOUND — the same response as a non-existent order, so you can't probe other
partners' orders.
Track an order
POST /api/v1/delivery/orders.track
{ "order_id": "ORD-..." }Returns a customer-facing timeline (placed → accepted → pickedUp → in_transit → delivered) with
the recipient's phone masked to the last 4 digits — safe to surface in your own UI.
Cancel an order
POST /api/v1/delivery/orders.cancel
{ "order_id": "ORD-...", "reason": "Customer changed their mind" }Cancels an order that hasn't been delivered or already cancelled (otherwise
400 INVALID_ORDER_STATUS). For a wallet-funded order the response includes
refund_status: "pending" — see the refund policy.
List delivery locations
POST /api/v1/delivery/locations.list
{ "region": "Greater Accra", "include_coordinates": true }Returns the supported delivery areas/zones, optionally filtered by region/zone. The returned
ids can be attached to orders.create as location_id to label the pickup/delivery area — but
note that automatic fee pricing works from coordinates: without them the fee falls back to
your payment.amount, and wallet-funded orders require coordinates outright.
Related pages
- How money works — wallet, who pays delivery, refunds.
- Wallet top-up — fund the wallet for
payer: "partner"orders. - Webhooks — order status events pushed to your endpoint.
- Authentication and signing — how to sign these requests.
How money works
The wallet, the settlement model, and where fees come from — explained honestly.
Wallet API — check balance & top up (mobile money)
How to check your Dawurobo delivery wallet balance and top it up with mobile money via the API, then verify the top-up before funding partner-paid delivery orders.