Cancellations
You can cancel a delivery until the rider sets off for the pickup. A charged delivery is refunded in full.
Cancel a delivery
POST /deliveries/{id}/cancel with a reason in the body. Idempotency-Key is required.
curl -X POST https://api.getreeds.co/shipping/v1/deliveries/dlv_9Kd3Qx7M/cancel \
-H "Authorization: Bearer $REEDS_ACCESS_TOKEN" \
-H "Idempotency-Key: order-10045-cancel" \
-H "Content-Type: application/json" \
-d '{ "reason": "Customer cancelled the order" }'
| Field | Type | Description |
|---|---|---|
reason | string | Why you are cancelling. Kept on the delivery as cancellation.note. |
The response is the updated delivery, with status: "cancelled" and a filled cancellation block.
When you can cancel
Check the delivery's cancellable field. It is true until the rider sets off for the pickup, and false after that.
If you cancel when cancellable is false, you get 409 CANCEL_NOT_ALLOWED and nothing changes. See CANCEL_NOT_ALLOWED. Once a parcel is moving, contact support.
Refunds
| How you pay | What happens on cancel |
|---|---|
| Wallet | The full amount goes back to your wallet. |
| Invoice | The delivery is removed from the month's invoice. |
The cancellation block
Once cancelled, the delivery's cancellation field is filled in. It is null before that.
"cancellation": {
"reason": "business",
"cancelled_by": "api",
"note": "Customer cancelled the order",
"refunded_amount": 280000,
"cancelled_at": "2026-10-26T10:45:00+01:00"
}
| Field | Description |
|---|---|
reason | business (you cancelled, through the API or dashboard), expired (a draft or unready delivery passed 7 days, see Drafts and required actions), processing_failed (Reeds couldn't set up the delivery within 30 minutes), or reeds (cancelled by Reeds, with a note). |
cancelled_by | Who cancelled it: api (your API call), dashboard (your team in the dashboard), reeds (Reeds operations) or system (automatic, for expired and processing_failed). |
note | The reason you sent, or Reeds' note. null if there is none. |
refunded_amount | The amount refunded, in kobo. 0 if nothing had been charged. |
cancelled_at | When it was cancelled. |
Webhook
Every cancellation fires delivery.cancelled, including the cancellation block. This is also how you learn about cancellations you didn't make (expired, processing_failed, reeds).
Cancelling a draft
A draft hasn't been charged, so cancelling one costs nothing. The call is the same, and refunded_amount is 0.