Skip to content

Quotes

A quote prices a delivery without booking it. You book against the quote afterwards, so the price you saw is the price you pay — it cannot change between agreeing it and booking it.

POST /v1/quotes
Field Type
pickup object Required. latitude, longitude, and optionally postcode.
dropoff object Required. The same shape.
vehicle string bicycle, electric_bicycle, motorcycle, car or van. Omitted means the smallest vehicle the market offers — almost always the cheapest.
weight_grams integer The consignment’s weight, which selects the price bracket. Omitted means 0.
scheduled_for string When the delivery will happen, if not now. A job booked on Tuesday for Friday evening is priced for Friday evening.

Coordinates are required and the postcode is optional. A coordinate is unambiguous; a postcode only matters in areas priced by postcode rather than drawn on a map. If you only have an address, look it up first with GET /v1/places.

Terminal window
curl -u "$COURIER_KEY:$COURIER_SECRET" "$COURIER_API/v1/quotes" \
-H 'Content-Type: application/json' \
-d '{
"pickup": { "latitude": 51.5080, "longitude": -0.1281 },
"dropoff": { "latitude": 51.5081, "longitude": -0.0759, "postcode": "EC3N 4DJ" },
"vehicle": "bicycle",
"weight_grams": 2500
}'

201 Created:

{
"id": "0199d2c4-6b1e-7a42-9c35-2f0d8e1b7a10",
"currency": "GBP",
"total_amount_minor": 918,
"total": "9.18 GBP",
"distance_metres": 4454,
"estimated_duration_seconds": 1047,
"vehicle": "bicycle",
"expires_at": "2026-10-10T12:14:00+00:00",
"breakdown": [
{ "code": "base_fare", "description": "Base fare", "amount_minor": 300 },
{ "code": "distance", "description": "Distance (2.77 mi)", "amount_minor": 249 },
{ "code": "duration", "description": "Journey time (18 min)", "amount_minor": 216 },
{ "code": "tax", "description": "VAT (20%)", "amount_minor": 153 }
],
"price_book_version": 1
}
  • total_amount_minor is what you will be charged. total is the same amount formatted for people.
  • breakdown lists what the price is made of — lines such as base_fare, distance, duration, surge, minimum_fare, merchant_adjustment and tax. They add up to the total.
  • expires_at is ten minutes after the quote was made. Book before then.
  • distance_metres and estimated_duration_seconds come from the same road network as the price.

Refusals are 422 Unprocessable Entity with an error body. The common ones:

code Meaning
pricing.origin_not_covered The pickup is outside the areas we serve.
pricing.destination_not_covered The drop-off is outside the areas we serve.
pricing.no_route No route exists between the two points for that vehicle.
pricing.vehicle_not_available That vehicle isn’t offered in your market.
request.unknown_vehicle The vehicle isn’t one of the five names above.
request.invalid_pickup, request.invalid_dropoff The coordinates aren’t a point on Earth.