/v1/quote/{id}One of the signed-in customer's quotes
A signed-in customer.
Parameters
idstring, in the path, required
Response 200 · object
Done.
quoteQuote, requiredquote_idinteger (int64)uuidstringjob_typestringOne of:
houseofficeitemsparcelswastedeliveryhouse_bystringFor a house, how it is described; the firm's choice when left out. A customer's quote must use the firm's.
One of:
sizeroomservice_datestringYYYY-MM-DD, the business's day of the work. Needed for parcels and delivery; for the other types it comes from appointment_time.
appointment_timestringUTC. Needed for house, office, items and waste, and refused on parcels and delivery. Sent as 2026-10-05T12:00:00Z; returned as 2026-10-05 12:00:00.
legsarray of LegAt least one. Several collections or drops only where the firm's job type allows them.
leg_idinteger (int64)positionintegerThe leg's place in the quote, from 0; set from the order sent.
from_addressAddressaddress_idinteger (int64)customer_idinteger (int64)quote_idinteger (int64)house_numberintegerhouse_namestringstreetstringtownstringcitystringcountystringpostcodestringMust be a live postcode in England, Scotland or Wales; stored as "AB1 2CD".
latitudenumberSent with longitude and match_level from a chosen suggestion; otherwise the address is found when saved.
longitudenumbermatch_levelstringHow the position was found. postcode means the postcode's centre was used.
One of:
housestreetpostcodemanualneeds_checkbooleanSet when staff should check the position. Ignored when sent.
to_addressAddressOn a waste leg, the first disposal site chosen; a customer can't set it.
address_idinteger (int64)customer_idinteger (int64)quote_idinteger (int64)house_numberintegerhouse_namestringstreetstringtownstringcitystringcountystringpostcodestringMust be a live postcode in England, Scotland or Wales; stored as "AB1 2CD".
latitudenumberSent with longitude and match_level from a chosen suggestion; otherwise the address is found when saved.
longitudenumbermatch_levelstringHow the position was found. postcode means the postcode's centre was used.
One of:
housestreetpostcodemanualneeds_checkbooleanSet when staff should check the position. Ignored when sent.
from_yard_idinteger (int64)The yard a delivery sent without a collection address is collected from, the one nearest its drop. Ignored when sent.
from_accessAccessWhat a crew meets at one end of a leg.
property_typestringnotesstringAccess notes, such as narrow stairs or no parking.
floorintegerliftbooleancarry_mintegerHow far, in metres, things are carried between the door and the vehicle.
to_accessAccessWhat a crew meets at one end of a leg.
property_typestringnotesstringAccess notes, such as narrow stairs or no parking.
floorintegerliftbooleancarry_mintegerHow far, in metres, things are carried between the door and the vehicle.
recipient_namestringrecipient_phonestringsize_keystringOne of the firm's active sizes for the type (GET /v1/config job_types); needed for parcels, waste and a house by size; a delivery's is standard when left out; none for office and items.
waste_kindsarray of stringOn a waste leg, at least one of the firm's waste kinds; none on other types.
window_startstringHH:MM, the business's local time. Only on parcels and delivery.
window_endstringHH:MM, after window_start.
load_kgintegerA waste load's weight, its size's cubic metres at the price book's rubble_kg_per_m3 when it holds rubble_soil, otherwise kg_per_m3. Ignored when a customer sends it.
itemsarray of Itemitem_idinteger (int64)leg_idinteger (int64)On a quote, the leg the item travels on. Ignored when sent.
typestringcategorystringquantityintegerweightintegerKilograms.
lengthintegerCentimetres.
widthintegerheightintegerfragilebooleanhandling_minutesintegerOne person's minutes to handle the item; left out, they come from its size (20 a cubic metre).
floorintegerOn a quote, the floor the item is on; -1 is a basement and 0, the default, the ground floor.
roomintegerOn a quote moved room by room, the index in its rooms of the item's room.
roomsarray of stringIn the catalogue, the room types the item is usually found in.
largebooleanIn the catalogue, whether the item is large or awkward to move.
special_instructionsstringfullnessstringFor a house by size, how full the property is.
One of:
lightaveragepackedroomsarray of RoomFor a house by room, on a quote with one leg, at least one room.
typestring, requiredOne of:
bedroomkitchenloungedining_roombathroomofficeloftgarageshedfloorinteger, requireditemsarray of ItemSent with a new quote, the room's items; they are stored with the leg's items, on the room's floor and naming the room. Returned rooms have none.
item_idinteger (int64)leg_idinteger (int64)On a quote, the leg the item travels on. Ignored when sent.
typestringcategorystringquantityintegerweightintegerKilograms.
lengthintegerCentimetres.
widthintegerheightintegerfragilebooleanhandling_minutesintegerOne person's minutes to handle the item; left out, they come from its size (20 a cubic metre).
floorintegerOn a quote, the floor the item is on; -1 is a basement and 0, the default, the ground floor.
roomintegerOn a quote moved room by room, the index in its rooms of the item's room.
roomsarray of stringIn the catalogue, the room types the item is usually found in.
largebooleanIn the catalogue, whether the item is large or awkward to move.
customerCustomercustomer_idinteger (int64)titlestringfirst_namestringlast_namestringemailstring (email)email_confirmed_atstringWhen the customer first signed in by a link sent to the email; cleared when the email changes. Ignored when sent.
phonestringThe latest number given.
phonesarray of stringEvery number the customer has given, oldest first, each once however spaced. Ignored when sent.
crewinteger or nullStaff's crew; null works it out from the firm's crew rules. Staff only.
vehicle_idinteger (int64) or nullStaff's vehicle; null chooses the smallest confirmed vehicle that fits. Staff only.
hours_minutesinteger or nullThe time staff charge, in minutes; null works it out. Staff only.
extrasarray of QuoteExtra or nullidinteger (int64), requiredquantityinteger, requirednamestringAs priced. Ignored when sent.
priceinteger (int64)Pence each, as priced. Ignored when sent.
total_valueinteger (int64)What the customer pays, in pence.
price_linesarray of PriceLine or nullThe price's parts. To customers only when the firm shows its breakdown and staff haven't set the price.
kindstring, requiredOne of:
timefixedmilesfloorsheavyfragileextraadjustmentbooking_feeroad_chargesgate_feefreelabelstring, requiredquantitynumber, requiredunitinteger (int64), requiredamountinteger (int64), required
vatVATPriceA price excluding VAT with the VAT the firm adds at the standard 20%; registered is the firm's vat_registered setting, and without it vat is 0 and gross is net.
registeredboolean, requirednetinteger (int64), requiredvatinteger (int64), requiredgrossinteger (int64), required
displayPriceDisplay or nullHow the price is shown to the customer, in pence. An estimate gives the hourly rate; a range its upper end.
kindstring, requiredOne of:
fixedestimaterangeamountinteger (int64), requiredupperinteger (int64)hourly_rateinteger (int64)
pricedPriced or nullWhat a quote was priced with. Staff only.
crewintegervehiclesarray of objectvehicle_idinteger (int64)tripsinteger
hoursnumber
calculatedinteger (int64)The worked-out price, beside staff's override. Staff only.
estimated_costinteger (int64)Staff only.
margininteger (int64)Staff only.
below_marginbooleanUnder the firm's minimum margin. Staff only.
price_overrideinteger (int64) or nullStaff only; set with PUT /v1/admin/quote/{id}/price.
deposit_penceinteger (int64)The deposit due to book, in pence, from the firm's deposit rule or staff's override, capped at the gross price; 0 when there is none or it is under 30 pence.
deposit_onlinestringSet by GET /v1/quote/{id} when accepting takes deposit_pence online first, through the checkout_url accepting answers; "pay" takes it at once, "hold" holds it on the card until staff confirm the booking.
One of:
payholdpay_witharray of stringSet by GET /v1/quote/{id} with deposit_online; the providers the deposit can be paid with, in the order to offer them.
One of:
stripepaypalcard_balanceobjectSet by GET /v1/quote/{id} when accepting pays the deposit online at a firm that charges the balance to the card before the move; accepting with Stripe then needs agree_card.
amount_penceinteger (int64), requiredonstring (date), requiredThe date the balance is taken, from 08:00.
deposit_overrideinteger (int64) or nullStaff only; set with PUT /v1/admin/quote/{id}/deposit.
deposit_holdobjectSet by GET /v1/admin/quote/{id} while the deposit is held on the customer's card, waiting for staff to confirm the booking.
amount_penceinteger (int64), requiredhold_untilstring, requiredUTC, YYYY-MM-DD HH:MM:SS, when the hold lapses.
override_reasonstringStaff only.
statusstring"quoted price" when priced. "accepted" when booked or a delivery, once priced. "awaiting route" while HERE can't be reached: the route is tried again every 5 minutes and the customer is emailed the price when it arrives. "needs pricing" when staff must price it by hand (see pricing_reason); the customer is told their price will follow by email. "expired" once a priced quote is past valid_until, worked out when read. "acceptance received" when the customer accepted online and the business confirms bookings itself.
distanceintegerMetres.
durationintegerMinutes.
duration_in_trafficintegerpricing_reasonstringWhy staff must price the quote by hand, when its status is "needs pricing".
disposal_stopsarray of DisposalStopOn a waste quote: the fewest disposal sites, open on its day, that between them take every kind in the load, chosen from the 5 nearest the collection and in the quickest order by road from the collection to the nearest yard. When none can take it the quote needs pricing, the reason naming the kinds left.
positionintegersite_idinteger (int64)namestringgate_fee_penceinteger (int64)
job_idsarray of integer (int64)The jobs a quote booked when it was made became, one per leg.
created_atstringupdated_atstringsent_atstringWhen the quote was last emailed to the customer. A website quote is emailed when priced; a staff quote when staff send it. Ignored when sent, as are valid_until, accepted_at, accepted_by and terms_version.
valid_untilstring (date)The last day the quote can be accepted, set when it is priced from the business's quote_valid_days and never after the move date.
accepted_atstringaccepted_bystringOne of:
customerstaffterms_versionintegerThe version of the terms and conditions a customer accepted the quote under.
termsTermsversioninteger, required0 for the template not yet saved.
bodystringLeft out in a list of versions.
created_atstringcreated_byinteger (int64)The member of staff who saved it; absent for the template saved at a first acceptance.
created_by_namestringTheir full name.
{
"quote": {
"quote_id": 0,
"uuid": "string",
"job_type": "house",
"house_by": "size",
"service_date": "string",
"appointment_time": "string",
"legs": [
{
"leg_id": 0,
"position": 0,
"from_address": {
"address_id": 0,
"customer_id": 0,
"quote_id": 0,
"house_number": 0,
"house_name": "string",
"street": "string",
"town": "string",
"city": "string",
"county": "string",
"postcode": "string",
"latitude": 0,
"longitude": 0,
"match_level": "house",
"needs_check": true
},
"to_address": {
"address_id": 0,
"customer_id": 0,
"quote_id": 0,
"house_number": 0,
"house_name": "string",
"street": "string",
"town": "string",
"city": "string",
"county": "string",
"postcode": "string",
"latitude": 0,
"longitude": 0,
"match_level": "house",
"needs_check": true
},
"from_yard_id": 0,
"from_access": {
"property_type": "string",
"notes": "string",
"floor": 0,
"lift": true,
"carry_m": 0
},
"to_access": {
"property_type": "string",
"notes": "string",
"floor": 0,
"lift": true,
"carry_m": 0
},
"recipient_name": "string",
"recipient_phone": "string",
"size_key": "string",
"waste_kinds": [
"string"
],
"window_start": "string",
"window_end": "string",
"load_kg": 0,
"items": [
{
"item_id": 0,
"leg_id": 0,
"type": "string",
"category": "string",
"quantity": 0,
"weight": 0,
"length": 0,
"width": 0,
"height": 0,
"fragile": true,
"handling_minutes": 0,
"floor": 0,
"room": 0,
"rooms": [
"bedroom"
],
"large": true
}
]
}
],
"special_instructions": "string",
"fullness": "light",
"rooms": [
{
"type": "bedroom",
"floor": 0,
"items": [
{
"item_id": 0,
"leg_id": 0,
"type": "string",
"category": "string",
"quantity": 0,
"weight": 0,
"length": 0,
"width": 0,
"height": 0,
"fragile": true,
"handling_minutes": 0,
"floor": 0,
"room": 0,
"rooms": [
"bedroom"
],
"large": true
}
]
}
],
"customer": {
"customer_id": 0,
"title": "string",
"first_name": "string",
"last_name": "string",
"email": "email",
"email_confirmed_at": "string",
"phone": "string",
"phones": [
"string"
]
},
"crew": 0,
"vehicle_id": 0,
"hours_minutes": 0,
"extras": [
{
"id": 0,
"quantity": 0,
"name": "string",
"price": 0
}
],
"total_value": 0,
"price_lines": [
{
"kind": "time",
"label": "string",
"quantity": 0,
"unit": 0,
"amount": 0
}
],
"vat": {
"registered": true,
"net": 0,
"vat": 0,
"gross": 0
},
"display": {
"kind": "fixed",
"amount": 0,
"upper": 0,
"hourly_rate": 0
},
"priced": {
"crew": 0,
"vehicles": [
{
"vehicle_id": 0,
"trips": 0
}
],
"hours": 0
},
"calculated": 0,
"estimated_cost": 0,
"margin": 0,
"below_margin": true,
"price_override": 0,
"deposit_pence": 0,
"deposit_online": "pay",
"pay_with": [
"stripe"
],
"card_balance": {
"amount_pence": 0,
"on": "date"
},
"deposit_override": 0,
"deposit_hold": {
"amount_pence": 0,
"hold_until": "string"
},
"override_reason": "string",
"status": "string",
"distance": 0,
"duration": 0,
"duration_in_traffic": 0,
"pricing_reason": "string",
"disposal_stops": [
{
"position": 0,
"site_id": 0,
"name": "string",
"gate_fee_pence": 0
}
],
"job_ids": [
0
],
"created_at": "string",
"updated_at": "string",
"sent_at": "string",
"valid_until": "date",
"accepted_at": "string",
"accepted_by": "customer",
"terms_version": 0
},
"terms": {
"version": 0,
"body": "string",
"created_at": "string",
"created_by": 0,
"created_by_name": "string"
}
}Response 400 · Error
The request is not valid.
errorobject, requiredcodestring, requiredA short machine-readable name, such as not_found.
messagestring, requiredWhat went wrong, for people.
request_idstring, requiredMatches the X-Request-ID response header.
{
"error": {
"code": "string",
"message": "string"
},
"request_id": "string"
}Response 401 · Error
No tenant key, or no valid session.
Fields as in One of the signed-in customer's quotes
Response 403 · Error
The session may not do this.
Fields as in One of the signed-in customer's quotes
Response 404 · Error
Not found, or not yours.
Fields as in One of the signed-in customer's quotes
Response 500 · Error
Something failed on our side.
Fields as in One of the signed-in customer's quotes