Quote a Delivery
Work out what delivering to an address would cost, before anything is booked.
The charge is always derived from the supplier's own delivery settings. There is no field for sending a fee, and one sent is ignored.
Available on the Pro plan, and only when the supplier has switched delivery on.
Endpointโ
POST /v1/delivery/quote
Scope: bookings:read
Rate limit: 30 requests per minute (a quote can trigger an address lookup)
Request Bodyโ
| Field | Type | Required | Description |
|---|---|---|---|
order_value | number | Yes | Pre-tax value of the booking. Drives the minimum-order and free-over rules. |
address | object | Yes | Where it is going. At least city or postcode. |
address.line1 | string | No | Street address |
address.line2 | string | No | Second address line |
address.city | string | No | Town or city |
address.state | string | No | State, county or region |
address.postcode | string | No | Postcode or ZIP |
address.country | string | No | ISO 3166-1 alpha-2. Defaults to the supplier's country. |
location_id | integer | No | Which of the supplier's locations to measure from. Defaults to their default location. An id that is not one of yours returns 404. |
starts_at | string | No | ISO 8601. Checked against the supplier's notice window. |
Example Requestโ
curl -X POST https://app.equipdash.com/api/v1/delivery/quote \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"order_value": 200.00,
"location_id": 1,
"address": {
"line1": "1450 Sunset Avenue",
"city": "Venice",
"postcode": "90291",
"country": "US"
}
}'
Example Responseโ
{
"data": {
"offered": true,
"reason": "priced",
"fee": 29.40,
"distance": 14.8,
"unit": "mi",
"covers": "both",
"zone": null,
"shortfall": null,
"max_distance": 30,
"notice_hours": 24,
"location_id": 1,
"distance_is_estimated": true
},
"meta": {
"request_id": "req_01HZ...",
"timestamp": "2026-09-06T10:15:00+00:00"
}
}
Response Fieldsโ
| Field | Type | Description |
|---|---|---|
offered | boolean | Whether delivery can go ahead at this price |
reason | string | Why the answer is what it is. See below. |
fee | number | What to charge, in the supplier's currency |
distance | number|null | The journey, in unit. Null when the mode needed no lookup. |
unit | string|null | mi or km, from the supplier's measurement system |
covers | string|null | both, delivery_only or each_way |
zone | string|null | The zone that matched, when priced by zone |
shortfall | number|null | How much more the order needs to be worth, when that is what blocked it |
max_distance | number|null | The supplier's own limit |
notice_hours | integer|null | The notice the supplier needs |
distance_is_estimated | boolean | See Distances are estimates below |
Reasonsโ
reason | offered | Meaning |
|---|---|---|
priced | true | Charge fee |
free_over_order_value | true | The order is big enough that the supplier waives it |
not_offered | false | This supplier does not deliver |
location_does_not_deliver | false | That location does not deliver, though others may |
too_far | false | Past max_distance |
below_minimum_order | false | Under the minimum order, short by shortfall |
inside_notice_window | false | Sooner than notice_hours |
address_unresolved | false | The address could not be found |
no_zone_match | false | Outside every zone the supplier drew |
not_configured | false | Delivery is on but not set up |
When offered is false, offer pickup. Do not create a delivery booking against a refused quote โ the booking endpoint will make it a pickup anyway.
Distances are estimatesโ
distance is worked out from open map data, not from a routing service, with a road allowance the supplier sets. It is close rather than exact, which is what distance_is_estimated is telling you. If you show it to a customer, say so.
A supplier who needs exact pricing uses postcode zones. Those resolve without any lookup, and their quotes come back with distance: null and zone set.
Adding delivery to a bookingโ
Send a delivery block to Create Booking or Update Booking:
{
"delivery": {
"line1": "1450 Sunset Avenue",
"city": "Venice",
"postcode": "90291",
"country": "US",
"notes": "Gate code 4417, leave at the side door."
}
}
The charge is re-derived from the supplier's settings at that moment โ it is never taken from your request. If delivery is not on offer for that address, the booking is still created, as a pickup, which is what the supplier can actually honor. Read fulfillment_method on the response to see which you got.
A booking comes back with:
{
"fulfillment_method": "delivery",
"return_method": "collection",
"delivery": {
"address": { "line1": "1450 Sunset Avenue", "city": "Venice", "postcode": "90291", "country": "US" },
"latitude": 33.9905,
"longitude": -118.4695,
"distance": 6.4,
"distance_unit": "mi",
"fee": 25.60,
"notes": "Gate code 4417, leave at the side door.",
"delivered_at": null,
"collected_at": null
}
}
delivery is null on a pickup booking, so branch on fulfillment_method.