Skip to the content

DoRoutes API · version 1

Customers (signed in)

GET/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, required
    • quote_idinteger (int64)
    • uuidstring
    • job_typestring

      One of: house office items parcels waste delivery

    • house_bystring

      For a house, how it is described; the firm's choice when left out. A customer's quote must use the firm's.

      One of: size room

    • service_datestring

      YYYY-MM-DD, the business's day of the work. Needed for parcels and delivery; for the other types it comes from appointment_time.

    • appointment_timestring

      UTC. 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 Leg

      At least one. Several collections or drops only where the firm's job type allows them.

      • leg_idinteger (int64)
      • positioninteger

        The leg's place in the quote, from 0; set from the order sent.

      • from_addressAddress
        • address_idinteger (int64)
        • customer_idinteger (int64)
        • quote_idinteger (int64)
        • house_numberinteger
        • house_namestring
        • streetstring
        • townstring
        • citystring
        • countystring
        • postcodestring

          Must be a live postcode in England, Scotland or Wales; stored as "AB1 2CD".

        • latitudenumber

          Sent with longitude and match_level from a chosen suggestion; otherwise the address is found when saved.

        • longitudenumber
        • match_levelstring

          How the position was found. postcode means the postcode's centre was used.

          One of: house street postcode manual

        • needs_checkboolean

          Set when staff should check the position. Ignored when sent.

      • to_addressAddress

        On a waste leg, the first disposal site chosen; a customer can't set it.

        • address_idinteger (int64)
        • customer_idinteger (int64)
        • quote_idinteger (int64)
        • house_numberinteger
        • house_namestring
        • streetstring
        • townstring
        • citystring
        • countystring
        • postcodestring

          Must be a live postcode in England, Scotland or Wales; stored as "AB1 2CD".

        • latitudenumber

          Sent with longitude and match_level from a chosen suggestion; otherwise the address is found when saved.

        • longitudenumber
        • match_levelstring

          How the position was found. postcode means the postcode's centre was used.

          One of: house street postcode manual

        • needs_checkboolean

          Set 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_accessAccess

        What a crew meets at one end of a leg.

        • property_typestring
        • notesstring

          Access notes, such as narrow stairs or no parking.

        • floorinteger
        • liftboolean
        • carry_minteger

          How far, in metres, things are carried between the door and the vehicle.

      • to_accessAccess

        What a crew meets at one end of a leg.

        • property_typestring
        • notesstring

          Access notes, such as narrow stairs or no parking.

        • floorinteger
        • liftboolean
        • carry_minteger

          How far, in metres, things are carried between the door and the vehicle.

      • recipient_namestring
      • recipient_phonestring
      • size_keystring

        One 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 string

        On a waste leg, at least one of the firm's waste kinds; none on other types.

      • window_startstring

        HH:MM, the business's local time. Only on parcels and delivery.

      • window_endstring

        HH:MM, after window_start.

      • load_kginteger

        A 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 Item
        • item_idinteger (int64)
        • leg_idinteger (int64)

          On a quote, the leg the item travels on. Ignored when sent.

        • typestring
        • categorystring
        • quantityinteger
        • weightinteger

          Kilograms.

        • lengthinteger

          Centimetres.

        • widthinteger
        • heightinteger
        • fragileboolean
        • handling_minutesinteger

          One person's minutes to handle the item; left out, they come from its size (20 a cubic metre).

        • floorinteger

          On a quote, the floor the item is on; -1 is a basement and 0, the default, the ground floor.

        • roominteger

          On a quote moved room by room, the index in its rooms of the item's room.

        • roomsarray of string

          In the catalogue, the room types the item is usually found in.

        • largeboolean

          In the catalogue, whether the item is large or awkward to move.

    • special_instructionsstring
    • fullnessstring

      For a house by size, how full the property is.

      One of: light average packed

    • roomsarray of Room

      For a house by room, on a quote with one leg, at least one room.

      • typestring, required

        One of: bedroom kitchen lounge dining_room bathroom office loft garage shed

      • floorinteger, required
      • itemsarray of Item

        Sent 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.

        • typestring
        • categorystring
        • quantityinteger
        • weightinteger

          Kilograms.

        • lengthinteger

          Centimetres.

        • widthinteger
        • heightinteger
        • fragileboolean
        • handling_minutesinteger

          One person's minutes to handle the item; left out, they come from its size (20 a cubic metre).

        • floorinteger

          On a quote, the floor the item is on; -1 is a basement and 0, the default, the ground floor.

        • roominteger

          On a quote moved room by room, the index in its rooms of the item's room.

        • roomsarray of string

          In the catalogue, the room types the item is usually found in.

        • largeboolean

          In the catalogue, whether the item is large or awkward to move.

    • customerCustomer
      • customer_idinteger (int64)
      • titlestring
      • first_namestring
      • last_namestring
      • emailstring (email)
      • email_confirmed_atstring

        When the customer first signed in by a link sent to the email; cleared when the email changes. Ignored when sent.

      • phonestring

        The latest number given.

      • phonesarray of string

        Every number the customer has given, oldest first, each once however spaced. Ignored when sent.

    • crewinteger or null

      Staff's crew; null works it out from the firm's crew rules. Staff only.

    • vehicle_idinteger (int64) or null

      Staff's vehicle; null chooses the smallest confirmed vehicle that fits. Staff only.

    • hours_minutesinteger or null

      The time staff charge, in minutes; null works it out. Staff only.

    • extrasarray of QuoteExtra or null
      • idinteger (int64), required
      • quantityinteger, required
      • namestring

        As 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 null

      The price's parts. To customers only when the firm shows its breakdown and staff haven't set the price.

      • kindstring, required

        One of: time fixed miles floors heavy fragile extra adjustment booking_fee road_charges gate_fee free

      • labelstring, required
      • quantitynumber, required
      • unitinteger (int64), required
      • amountinteger (int64), required
    • vatVATPrice

      A 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, required
      • netinteger (int64), required
      • vatinteger (int64), required
      • grossinteger (int64), required
    • displayPriceDisplay or null

      How the price is shown to the customer, in pence. An estimate gives the hourly rate; a range its upper end.

      • kindstring, required

        One of: fixed estimate range

      • amountinteger (int64), required
      • upperinteger (int64)
      • hourly_rateinteger (int64)
    • pricedPriced or null

      What a quote was priced with. Staff only.

      • crewinteger
      • vehiclesarray of object
        • vehicle_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_marginboolean

      Under the firm's minimum margin. Staff only.

    • price_overrideinteger (int64) or null

      Staff 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_onlinestring

      Set 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: pay hold

    • pay_witharray of string

      Set by GET /v1/quote/{id} with deposit_online; the providers the deposit can be paid with, in the order to offer them.

      One of: stripe paypal

    • card_balanceobject

      Set 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), required
      • onstring (date), required

        The date the balance is taken, from 08:00.

    • deposit_overrideinteger (int64) or null

      Staff only; set with PUT /v1/admin/quote/{id}/deposit.

    • deposit_holdobject

      Set 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), required
      • hold_untilstring, required

        UTC, YYYY-MM-DD HH:MM:SS, when the hold lapses.

    • override_reasonstring

      Staff 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.

    • distanceinteger

      Metres.

    • durationinteger

      Minutes.

    • duration_in_trafficinteger
    • pricing_reasonstring

      Why staff must price the quote by hand, when its status is "needs pricing".

    • disposal_stopsarray of DisposalStop

      On 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.

      • positioninteger
      • site_idinteger (int64)
      • namestring
      • gate_fee_penceinteger (int64)
    • job_idsarray of integer (int64)

      The jobs a quote booked when it was made became, one per leg.

    • created_atstring
    • updated_atstring
    • sent_atstring

      When 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_atstring
    • accepted_bystring

      One of: customer staff

    • terms_versioninteger

      The version of the terms and conditions a customer accepted the quote under.

  • termsTerms
    • versioninteger, required

      0 for the template not yet saved.

    • bodystring

      Left out in a list of versions.

    • created_atstring
    • created_byinteger (int64)

      The member of staff who saved it; absent for the template saved at a first acceptance.

    • created_by_namestring

      Their full name.

Example response 200
{
  "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, required
    • codestring, required

      A short machine-readable name, such as not_found.

    • messagestring, required

      What went wrong, for people.

  • request_idstring, required

    Matches the X-Request-ID response header.

Example response 400
{
  "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

GET/v1/quote/{id}/pdf

One of the signed-in customers quotes as a PDF

A signed-in customer. The quote on the business's letterhead, with the terms and conditions it is offered or was accepted under on their own pages. 409 while it has no price. Generated for each request and never stored; Cache-Control: no-store.

Parameters

  • idstring, in the path, required

Response 200

The PDF.

Response 400 · Error

The request is not valid.

Fields as in One of the signed-in customer's quotes

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 409 · Error

It clashes with what is stored.

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

POST/v1/quote/{id}/accept

Accept one of the signed-in customer's quotes

A signed-in customer, for a quote that was sent, is still priced and open, and moves after today. terms_version is the version of the terms they read (from GET /v1/quote/{id}). When the quote has a deposit (deposit_pence above 0), the business takes payments online, and it books at once or takes deposits at acceptance (confirm_deposit "take"), nothing changes yet: the answer carries checkout_url, the provider's payment page, and the payment completes the acceptance (refunded if the quote can no longer be accepted by then). Otherwise, as the business sets quote_acceptance, the move is booked at once (status accepted, jobs made) or waits for staff to confirm it (status "acceptance received"); the customer and staff are emailed. 400 without agree; 409 when the quote is expired, already accepted or can't be accepted online, the terms have changed since they were read, or the day is no longer available.

Parameters

  • idstring, in the path, required

Request body · object

  • terms_versioninteger, required
  • agreeboolean, required
  • agree_cardboolean

    Keep the card with the payment provider to take the balance; required when the quote has card_balance and the deposit is paid by Stripe (PayPal keeps no cards, so the balance is then invoiced).

  • providerstring

    The provider to pay the deposit with, one of the quote's pay_with; the first when none. 400 for one the business doesn't take payments with.

    One of: stripe paypal

Example request
{
  "terms_version": 0,
  "agree": true,
  "agree_card": true,
  "provider": "stripe"
}

Response 200 · object

Done.

  • quoteQuote, required
    • quote_idinteger (int64)
    • uuidstring
    • job_typestring

      One of: house office items parcels waste delivery

    • house_bystring

      For a house, how it is described; the firm's choice when left out. A customer's quote must use the firm's.

      One of: size room

    • service_datestring

      YYYY-MM-DD, the business's day of the work. Needed for parcels and delivery; for the other types it comes from appointment_time.

    • appointment_timestring

      UTC. 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 Leg

      At least one. Several collections or drops only where the firm's job type allows them.

      • leg_idinteger (int64)
      • positioninteger

        The leg's place in the quote, from 0; set from the order sent.

      • from_addressAddress
        • address_idinteger (int64)
        • customer_idinteger (int64)
        • quote_idinteger (int64)
        • house_numberinteger
        • house_namestring
        • streetstring
        • townstring
        • citystring
        • countystring
        • postcodestring

          Must be a live postcode in England, Scotland or Wales; stored as "AB1 2CD".

        • latitudenumber

          Sent with longitude and match_level from a chosen suggestion; otherwise the address is found when saved.

        • longitudenumber
        • match_levelstring

          How the position was found. postcode means the postcode's centre was used.

          One of: house street postcode manual

        • needs_checkboolean

          Set when staff should check the position. Ignored when sent.

      • to_addressAddress

        On a waste leg, the first disposal site chosen; a customer can't set it.

        • address_idinteger (int64)
        • customer_idinteger (int64)
        • quote_idinteger (int64)
        • house_numberinteger
        • house_namestring
        • streetstring
        • townstring
        • citystring
        • countystring
        • postcodestring

          Must be a live postcode in England, Scotland or Wales; stored as "AB1 2CD".

        • latitudenumber

          Sent with longitude and match_level from a chosen suggestion; otherwise the address is found when saved.

        • longitudenumber
        • match_levelstring

          How the position was found. postcode means the postcode's centre was used.

          One of: house street postcode manual

        • needs_checkboolean

          Set 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_accessAccess

        What a crew meets at one end of a leg.

        • property_typestring
        • notesstring

          Access notes, such as narrow stairs or no parking.

        • floorinteger
        • liftboolean
        • carry_minteger

          How far, in metres, things are carried between the door and the vehicle.

      • to_accessAccess

        What a crew meets at one end of a leg.

        • property_typestring
        • notesstring

          Access notes, such as narrow stairs or no parking.

        • floorinteger
        • liftboolean
        • carry_minteger

          How far, in metres, things are carried between the door and the vehicle.

      • recipient_namestring
      • recipient_phonestring
      • size_keystring

        One 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 string

        On a waste leg, at least one of the firm's waste kinds; none on other types.

      • window_startstring

        HH:MM, the business's local time. Only on parcels and delivery.

      • window_endstring

        HH:MM, after window_start.

      • load_kginteger

        A 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 Item
        • item_idinteger (int64)
        • leg_idinteger (int64)

          On a quote, the leg the item travels on. Ignored when sent.

        • typestring
        • categorystring
        • quantityinteger
        • weightinteger

          Kilograms.

        • lengthinteger

          Centimetres.

        • widthinteger
        • heightinteger
        • fragileboolean
        • handling_minutesinteger

          One person's minutes to handle the item; left out, they come from its size (20 a cubic metre).

        • floorinteger

          On a quote, the floor the item is on; -1 is a basement and 0, the default, the ground floor.

        • roominteger

          On a quote moved room by room, the index in its rooms of the item's room.

        • roomsarray of string

          In the catalogue, the room types the item is usually found in.

        • largeboolean

          In the catalogue, whether the item is large or awkward to move.

    • special_instructionsstring
    • fullnessstring

      For a house by size, how full the property is.

      One of: light average packed

    • roomsarray of Room

      For a house by room, on a quote with one leg, at least one room.

      • typestring, required

        One of: bedroom kitchen lounge dining_room bathroom office loft garage shed

      • floorinteger, required
      • itemsarray of Item

        Sent 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.

        • typestring
        • categorystring
        • quantityinteger
        • weightinteger

          Kilograms.

        • lengthinteger

          Centimetres.

        • widthinteger
        • heightinteger
        • fragileboolean
        • handling_minutesinteger

          One person's minutes to handle the item; left out, they come from its size (20 a cubic metre).

        • floorinteger

          On a quote, the floor the item is on; -1 is a basement and 0, the default, the ground floor.

        • roominteger

          On a quote moved room by room, the index in its rooms of the item's room.

        • roomsarray of string

          In the catalogue, the room types the item is usually found in.

        • largeboolean

          In the catalogue, whether the item is large or awkward to move.

    • customerCustomer
      • customer_idinteger (int64)
      • titlestring
      • first_namestring
      • last_namestring
      • emailstring (email)
      • email_confirmed_atstring

        When the customer first signed in by a link sent to the email; cleared when the email changes. Ignored when sent.

      • phonestring

        The latest number given.

      • phonesarray of string

        Every number the customer has given, oldest first, each once however spaced. Ignored when sent.

    • crewinteger or null

      Staff's crew; null works it out from the firm's crew rules. Staff only.

    • vehicle_idinteger (int64) or null

      Staff's vehicle; null chooses the smallest confirmed vehicle that fits. Staff only.

    • hours_minutesinteger or null

      The time staff charge, in minutes; null works it out. Staff only.

    • extrasarray of QuoteExtra or null
      • idinteger (int64), required
      • quantityinteger, required
      • namestring

        As 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 null

      The price's parts. To customers only when the firm shows its breakdown and staff haven't set the price.

      • kindstring, required

        One of: time fixed miles floors heavy fragile extra adjustment booking_fee road_charges gate_fee free

      • labelstring, required
      • quantitynumber, required
      • unitinteger (int64), required
      • amountinteger (int64), required
    • vatVATPrice

      A 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, required
      • netinteger (int64), required
      • vatinteger (int64), required
      • grossinteger (int64), required
    • displayPriceDisplay or null

      How the price is shown to the customer, in pence. An estimate gives the hourly rate; a range its upper end.

      • kindstring, required

        One of: fixed estimate range

      • amountinteger (int64), required
      • upperinteger (int64)
      • hourly_rateinteger (int64)
    • pricedPriced or null

      What a quote was priced with. Staff only.

      • crewinteger
      • vehiclesarray of object
        • vehicle_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_marginboolean

      Under the firm's minimum margin. Staff only.

    • price_overrideinteger (int64) or null

      Staff 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_onlinestring

      Set 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: pay hold

    • pay_witharray of string

      Set by GET /v1/quote/{id} with deposit_online; the providers the deposit can be paid with, in the order to offer them.

      One of: stripe paypal

    • card_balanceobject

      Set 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), required
      • onstring (date), required

        The date the balance is taken, from 08:00.

    • deposit_overrideinteger (int64) or null

      Staff only; set with PUT /v1/admin/quote/{id}/deposit.

    • deposit_holdobject

      Set 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), required
      • hold_untilstring, required

        UTC, YYYY-MM-DD HH:MM:SS, when the hold lapses.

    • override_reasonstring

      Staff 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.

    • distanceinteger

      Metres.

    • durationinteger

      Minutes.

    • duration_in_trafficinteger
    • pricing_reasonstring

      Why staff must price the quote by hand, when its status is "needs pricing".

    • disposal_stopsarray of DisposalStop

      On 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.

      • positioninteger
      • site_idinteger (int64)
      • namestring
      • gate_fee_penceinteger (int64)
    • job_idsarray of integer (int64)

      The jobs a quote booked when it was made became, one per leg.

    • created_atstring
    • updated_atstring
    • sent_atstring

      When 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_atstring
    • accepted_bystring

      One of: customer staff

    • terms_versioninteger

      The version of the terms and conditions a customer accepted the quote under.

  • checkout_urlstring

    The payment page for the deposit, when it is paid before the acceptance counts.

Example response 200
{
  "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
  },
  "checkout_url": "string"
}

Response 400 · Error

The request is not valid.

Fields as in One of the signed-in customer's quotes

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 409 · Error

It clashes with what is stored.

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

GET/v1/quote/{id}/route

The route of one of the signed-in customer's quotes

A signed-in customer. The route stored when the quote was priced; it is never planned here. `map` is false once the business's website map allowance is used up this month.

Parameters

  • idstring, in the path, required

Response 200 · object

Done.

  • pointsarray of array of number, required

    The route's line, as [latitude, longitude] pairs.

  • mapboolean, required

    Whether website map tiles can be fetched this month.

Example response 200
{
  "points": [
    [
      0
    ]
  ],
  "map": true
}

Response 400 · Error

The request is not valid.

Fields as in One of the signed-in customer's quotes

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

GET/v1/map/tiles/{z}/{x}/{y}

A website map tile

A signed-in customer. A HERE base vector tile in Web Mercator, for MapLibre. Each tile counts against the business's monthly website map tile allowance, checked before the tile is fetched. One address may ask for 300 a minute. The browser may keep a tile for a day.

Parameters

  • zinteger, in the path, required
  • xinteger, in the path, required

    From 0 to 2^z - 1.

  • yinteger, in the path, required

    From 0 to 2^z - 1.

Response 200

The tile.

Response 400 · Error

The request is not valid.

Fields as in One of the signed-in customer's quotes

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 409 · Error

It clashes with what is stored.

Fields as in One of the signed-in customer's quotes

Response 429 · Error

Too many attempts; see Retry-After.

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

GET/v1/quotes

The signed-in customer's quotes

A signed-in customer.

Response 200 · object

Done.

  • quotesarray of Quote, required
    • quote_idinteger (int64)
    • uuidstring
    • job_typestring

      One of: house office items parcels waste delivery

    • house_bystring

      For a house, how it is described; the firm's choice when left out. A customer's quote must use the firm's.

      One of: size room

    • service_datestring

      YYYY-MM-DD, the business's day of the work. Needed for parcels and delivery; for the other types it comes from appointment_time.

    • appointment_timestring

      UTC. 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 Leg

      At least one. Several collections or drops only where the firm's job type allows them.

      • leg_idinteger (int64)
      • positioninteger

        The leg's place in the quote, from 0; set from the order sent.

      • from_addressAddress
        • address_idinteger (int64)
        • customer_idinteger (int64)
        • quote_idinteger (int64)
        • house_numberinteger
        • house_namestring
        • streetstring
        • townstring
        • citystring
        • countystring
        • postcodestring

          Must be a live postcode in England, Scotland or Wales; stored as "AB1 2CD".

        • latitudenumber

          Sent with longitude and match_level from a chosen suggestion; otherwise the address is found when saved.

        • longitudenumber
        • match_levelstring

          How the position was found. postcode means the postcode's centre was used.

          One of: house street postcode manual

        • needs_checkboolean

          Set when staff should check the position. Ignored when sent.

      • to_addressAddress

        On a waste leg, the first disposal site chosen; a customer can't set it.

        • address_idinteger (int64)
        • customer_idinteger (int64)
        • quote_idinteger (int64)
        • house_numberinteger
        • house_namestring
        • streetstring
        • townstring
        • citystring
        • countystring
        • postcodestring

          Must be a live postcode in England, Scotland or Wales; stored as "AB1 2CD".

        • latitudenumber

          Sent with longitude and match_level from a chosen suggestion; otherwise the address is found when saved.

        • longitudenumber
        • match_levelstring

          How the position was found. postcode means the postcode's centre was used.

          One of: house street postcode manual

        • needs_checkboolean

          Set 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_accessAccess

        What a crew meets at one end of a leg.

        • property_typestring
        • notesstring

          Access notes, such as narrow stairs or no parking.

        • floorinteger
        • liftboolean
        • carry_minteger

          How far, in metres, things are carried between the door and the vehicle.

      • to_accessAccess

        What a crew meets at one end of a leg.

        • property_typestring
        • notesstring

          Access notes, such as narrow stairs or no parking.

        • floorinteger
        • liftboolean
        • carry_minteger

          How far, in metres, things are carried between the door and the vehicle.

      • recipient_namestring
      • recipient_phonestring
      • size_keystring

        One 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 string

        On a waste leg, at least one of the firm's waste kinds; none on other types.

      • window_startstring

        HH:MM, the business's local time. Only on parcels and delivery.

      • window_endstring

        HH:MM, after window_start.

      • load_kginteger

        A 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 Item
        • item_idinteger (int64)
        • leg_idinteger (int64)

          On a quote, the leg the item travels on. Ignored when sent.

        • typestring
        • categorystring
        • quantityinteger
        • weightinteger

          Kilograms.

        • lengthinteger

          Centimetres.

        • widthinteger
        • heightinteger
        • fragileboolean
        • handling_minutesinteger

          One person's minutes to handle the item; left out, they come from its size (20 a cubic metre).

        • floorinteger

          On a quote, the floor the item is on; -1 is a basement and 0, the default, the ground floor.

        • roominteger

          On a quote moved room by room, the index in its rooms of the item's room.

        • roomsarray of string

          In the catalogue, the room types the item is usually found in.

        • largeboolean

          In the catalogue, whether the item is large or awkward to move.

    • special_instructionsstring
    • fullnessstring

      For a house by size, how full the property is.

      One of: light average packed

    • roomsarray of Room

      For a house by room, on a quote with one leg, at least one room.

      • typestring, required

        One of: bedroom kitchen lounge dining_room bathroom office loft garage shed

      • floorinteger, required
      • itemsarray of Item

        Sent 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.

        • typestring
        • categorystring
        • quantityinteger
        • weightinteger

          Kilograms.

        • lengthinteger

          Centimetres.

        • widthinteger
        • heightinteger
        • fragileboolean
        • handling_minutesinteger

          One person's minutes to handle the item; left out, they come from its size (20 a cubic metre).

        • floorinteger

          On a quote, the floor the item is on; -1 is a basement and 0, the default, the ground floor.

        • roominteger

          On a quote moved room by room, the index in its rooms of the item's room.

        • roomsarray of string

          In the catalogue, the room types the item is usually found in.

        • largeboolean

          In the catalogue, whether the item is large or awkward to move.

    • customerCustomer
      • customer_idinteger (int64)
      • titlestring
      • first_namestring
      • last_namestring
      • emailstring (email)
      • email_confirmed_atstring

        When the customer first signed in by a link sent to the email; cleared when the email changes. Ignored when sent.

      • phonestring

        The latest number given.

      • phonesarray of string

        Every number the customer has given, oldest first, each once however spaced. Ignored when sent.

    • crewinteger or null

      Staff's crew; null works it out from the firm's crew rules. Staff only.

    • vehicle_idinteger (int64) or null

      Staff's vehicle; null chooses the smallest confirmed vehicle that fits. Staff only.

    • hours_minutesinteger or null

      The time staff charge, in minutes; null works it out. Staff only.

    • extrasarray of QuoteExtra or null
      • idinteger (int64), required
      • quantityinteger, required
      • namestring

        As 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 null

      The price's parts. To customers only when the firm shows its breakdown and staff haven't set the price.

      • kindstring, required

        One of: time fixed miles floors heavy fragile extra adjustment booking_fee road_charges gate_fee free

      • labelstring, required
      • quantitynumber, required
      • unitinteger (int64), required
      • amountinteger (int64), required
    • vatVATPrice

      A 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, required
      • netinteger (int64), required
      • vatinteger (int64), required
      • grossinteger (int64), required
    • displayPriceDisplay or null

      How the price is shown to the customer, in pence. An estimate gives the hourly rate; a range its upper end.

      • kindstring, required

        One of: fixed estimate range

      • amountinteger (int64), required
      • upperinteger (int64)
      • hourly_rateinteger (int64)
    • pricedPriced or null

      What a quote was priced with. Staff only.

      • crewinteger
      • vehiclesarray of object
        • vehicle_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_marginboolean

      Under the firm's minimum margin. Staff only.

    • price_overrideinteger (int64) or null

      Staff 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_onlinestring

      Set 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: pay hold

    • pay_witharray of string

      Set by GET /v1/quote/{id} with deposit_online; the providers the deposit can be paid with, in the order to offer them.

      One of: stripe paypal

    • card_balanceobject

      Set 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), required
      • onstring (date), required

        The date the balance is taken, from 08:00.

    • deposit_overrideinteger (int64) or null

      Staff only; set with PUT /v1/admin/quote/{id}/deposit.

    • deposit_holdobject

      Set 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), required
      • hold_untilstring, required

        UTC, YYYY-MM-DD HH:MM:SS, when the hold lapses.

    • override_reasonstring

      Staff 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.

    • distanceinteger

      Metres.

    • durationinteger

      Minutes.

    • duration_in_trafficinteger
    • pricing_reasonstring

      Why staff must price the quote by hand, when its status is "needs pricing".

    • disposal_stopsarray of DisposalStop

      On 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.

      • positioninteger
      • site_idinteger (int64)
      • namestring
      • gate_fee_penceinteger (int64)
    • job_idsarray of integer (int64)

      The jobs a quote booked when it was made became, one per leg.

    • created_atstring
    • updated_atstring
    • sent_atstring

      When 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_atstring
    • accepted_bystring

      One of: customer staff

    • terms_versioninteger

      The version of the terms and conditions a customer accepted the quote under.

Example response 200
{
  "quotes": [
    {
      "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
    }
  ]
}

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 500 · Error

Something failed on our side.

Fields as in One of the signed-in customer's quotes