Skip to main content

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" }'
FieldTypeDescription
reasonstringWhy 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 payWhat happens on cancel
WalletThe full amount goes back to your wallet.
InvoiceThe 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"
}
FieldDescription
reasonbusiness (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_byWho cancelled it: api (your API call), dashboard (your team in the dashboard), reeds (Reeds operations) or system (automatic, for expired and processing_failed).
noteThe reason you sent, or Reeds' note. null if there is none.
refunded_amountThe amount refunded, in kobo. 0 if nothing had been charged.
cancelled_atWhen 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.

Next steps​