Skip to main content

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โ€‹

FieldTypeRequiredDescription
order_valuenumberYesPre-tax value of the booking. Drives the minimum-order and free-over rules.
addressobjectYesWhere it is going. At least city or postcode.
address.line1stringNoStreet address
address.line2stringNoSecond address line
address.citystringNoTown or city
address.statestringNoState, county or region
address.postcodestringNoPostcode or ZIP
address.countrystringNoISO 3166-1 alpha-2. Defaults to the supplier's country.
location_idintegerNoWhich of the supplier's locations to measure from. Defaults to their default location. An id that is not one of yours returns 404.
starts_atstringNoISO 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โ€‹

FieldTypeDescription
offeredbooleanWhether delivery can go ahead at this price
reasonstringWhy the answer is what it is. See below.
feenumberWhat to charge, in the supplier's currency
distancenumber|nullThe journey, in unit. Null when the mode needed no lookup.
unitstring|nullmi or km, from the supplier's measurement system
coversstring|nullboth, delivery_only or each_way
zonestring|nullThe zone that matched, when priced by zone
shortfallnumber|nullHow much more the order needs to be worth, when that is what blocked it
max_distancenumber|nullThe supplier's own limit
notice_hoursinteger|nullThe notice the supplier needs
distance_is_estimatedbooleanSee Distances are estimates below

Reasonsโ€‹

reasonofferedMeaning
pricedtrueCharge fee
free_over_order_valuetrueThe order is big enough that the supplier waives it
not_offeredfalseThis supplier does not deliver
location_does_not_deliverfalseThat location does not deliver, though others may
too_farfalsePast max_distance
below_minimum_orderfalseUnder the minimum order, short by shortfall
inside_notice_windowfalseSooner than notice_hours
address_unresolvedfalseThe address could not be found
no_zone_matchfalseOutside every zone the supplier drew
not_configuredfalseDelivery 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.