Dawurobo Partner Platform

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

OperationScopeNotes
orders.estimatedelivery:readPrice a delivery before committing.
locations.listdelivery:readSupported delivery areas/zones.
orders.createdelivery:writeCreate a delivery. Wallet-funded orders also need delivery:wallet:spend.
orders.getdelivery:readFull status of one of your orders.
orders.trackdelivery:readCustomer-facing status timeline.
orders.canceldelivery:writeCancel 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 the delivery:wallet:spend scope 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 get 402 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.