Errors use HTTP status codes and a JSON body:
{ "error": { "code": "invalid_request", "message": "delivery.contact needs name and phone", "param": "delivery.contact", "requestId": "…" }}- Branch on
code, never onmessage. Messages are for people and may change. paramnames the field at fault, when there is one (for an unknown field, its name).detailsis present forprice_changed,option_unavailable,window_fullandfee_changed.requestIdis theX-Request-Id. Quote it to support.
| Status | Code | Meaning | What to do |
|---|---|---|---|
| 400 | malformed_json |
The body is not valid JSON. | Fix the request. |
| 400 | idempotency_key_required |
A write without Idempotency-Key. |
Add a UUID key. |
| 401 | unauthenticated |
Missing, unknown or revoked key. | Check the key. |
| 403 | insufficient_scope |
The key’s scope does not allow this. | Use an orders key. |
| 403 | merchant_suspended |
Your account is suspended. | Contact Delivr. |
| 404 | not_found |
No such resource (or another merchant’s). | Check the id. |
| 404 | quote_not_found |
No such quote. | Quote again. |
| 405 | method_not_allowed |
Wrong HTTP method. | Fix the request. |
| 409 | conflict |
The resource is not in a state that allows this. | Read it, then decide. |
| 409 | cancellation_not_allowed |
The order can no longer be cancelled, such as a window order after its cutoff. | Contact Delivr support if you still need it stopped. |
| 409 | idempotency_key_in_flight |
The same key is still running. | Retry shortly, same key. |
| 409 | price_changed |
Dearer than quoted. details.option has the new price. |
Show it, or quote again. |
| 409 | option_unavailable |
The option is gone. details.alternatives lists others. |
Offer an alternative. |
| 409 | window_full |
The window filled up. details.alternatives has the nearest. |
Offer it, or use onWindowFull: reschedule. |
| 409 | fee_changed |
The cancellation fee is above maxFeeMinor. details.fee has it. |
Decide, then cancel again. |
| 409 | quote_already_used |
The quote booked another option already. | Quote again. |
| 409 | external_ref_taken |
Another live order has this externalRef. |
Use a unique ref. |
| 409 | order_ended |
The order is cancelled or failed. | Read the order. |
| 422 | invalid_request |
A field is missing, invalid or unknown (param). |
Fix the request. |
| 422 | idempotency_key_reused |
The key was used for a different request. | Use a new key. |
| 422 | no_delivery_options |
Nothing can be offered for this delivery. | Do not offer Delivr for it. |
| 422 | manual_quote_required |
The delivery needs a manual quote (for example very large goods). | Contact Delivr. |
| 422 | invalid_address |
The address was not found. | Check it, or send coordinates. |
| 429 | rate_limited |
Too many requests. | Wait Retry-After seconds. |
| 500 | internal |
Something went wrong at Delivr. | Retry with the same key; contact support if it persists. |
| 503 | unavailable |
Temporarily unavailable. | Retry with the same key. |
New codes may be added. Handle unknown codes by their HTTP status.