Skip to the content

DoRoutes API · version 1

Quotes

GET/v1/quote/extras

Extras offered online

The extras the business offers on its website, in its order. A quote names them in extras with a quantity (weeks for a week extra).

Response 200 · object

Done.

  • extrasarray of PriceExtra, required
    • idinteger (int64)

      Absent for a new extra.

    • namestring, required
    • penceinteger (int64), required
    • unitstring, required

      One of: fixed item unit hour week

    • onlineboolean, required

      Offered on the website. Hourly extras are for staff only.

    • positioninteger, required
Example response 200
{
  "extras": [
    {
      "id": 0,
      "name": "string",
      "pence": 0,
      "unit": "fixed",
      "online": true,
      "position": 0
    }
  ]
}

Response 401 · Error

No tenant key, or no valid session.

  • 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 401
{
  "error": {
    "code": "string",
    "message": "string"
  },
  "request_id": "string"
}

Response 500 · Error

Something failed on our side.

Fields as in Extras offered online

GET/v1/quote/calendar

When a customer may ask for a move

The business's days from tomorrow for six months, the business's closed days among them (weekend days it doesn't work and bank holidays it hasn't opened), and the earliest and latest start times. A customer's quote for a closed day, or a start that isn't on the hour within these times, is refused.

Response 200 · object

Done.

  • fromstring, required

    The first day, as 2026-10-07.

  • tostring, required
  • closedarray of string, required
  • earliest_startstring, required

    As 08:00, the business's local time.

  • latest_startstring, required
Example response 200
{
  "from": "string",
  "to": "string",
  "closed": [
    "string"
  ],
  "earliest_start": "string",
  "latest_start": "string"
}

Response 401 · Error

No tenant key, or no valid session.

Fields as in Extras offered online

Response 500 · Error

Something failed on our side.

Fields as in Extras offered online

POST/v1/quote

Ask for a quote

Prices the job from the route through its legs' stops, in the quickest order by road. Refused unless the job type is on and online (GET /v1/config job_types), never for a delivery, and unless the legs fit the type's switches and the sizes and waste kinds are the firm's. The customer must give a first name, a last name, an email address and a phone number of at least 7 digits; each is trimmed. A customer is created from the email the first time. For an email that already belongs to a customer, the quote shows the details sent, not the stored ones.

Request body · object

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

  • recaptcha_tokenstring

    A reCAPTCHA token, when the tenant checks reCAPTCHA (GET /v1/config says whether).

Example request
{
  "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
  },
  "recaptcha_token": "string"
}

Response 200 · object

Done.

  • messagestring, required
  • 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.

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

Response 400 · Error

The request is not valid.

Fields as in Extras offered online

Response 401 · Error

No tenant key, or no valid session.

Fields as in Extras offered online

Response 404 · Error

Not found, or not yours.

Fields as in Extras offered online

Response 409 · Error

It clashes with what is stored.

Fields as in Extras offered online

Response 500 · Error

Something failed on our side.

Fields as in Extras offered online

GET/v1/admin/terms

The terms and conditions and their versions

Needs the settings.write permission. `terms` is the newest saved version, or the template filled with the business's details as version 0 while none is saved. `versions` lists the saved versions, newest first, without their bodies.

Response 200 · object

Done.

  • termsTerms, required
    • 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.

  • versionsarray of Terms, required
    • 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
{
  "terms": {
    "version": 0,
    "body": "string",
    "created_at": "string",
    "created_by": 0,
    "created_by_name": "string"
  },
  "versions": [
    {
      "version": 0,
      "body": "string",
      "created_at": "string",
      "created_by": 0,
      "created_by_name": "string"
    }
  ]
}

Response 401 · Error

No tenant key, or no valid session.

Fields as in Extras offered online

Response 403 · Error

The session may not do this.

Fields as in Extras offered online

Response 500 · Error

Something failed on our side.

Fields as in Extras offered online

PUT/v1/admin/terms

Save the terms and conditions as a new version

Needs the settings.write permission. Saved versions are never changed; quotes accepted under one keep it.

Request body · object

  • bodystring, required
Example request
{
  "body": "string"
}

Response 200 · object

Done.

  • termsTerms, required
    • 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
{
  "terms": {
    "version": 0,
    "body": "string",
    "created_at": "string",
    "created_by": 0,
    "created_by_name": "string"
  }
}

Response 400 · Error

The request is not valid.

Fields as in Extras offered online

Response 401 · Error

No tenant key, or no valid session.

Fields as in Extras offered online

Response 403 · Error

The session may not do this.

Fields as in Extras offered online

Response 500 · Error

Something failed on our side.

Fields as in Extras offered online

GET/v1/admin/terms/{version}

One saved version of the terms and conditions

Needs the quotes.read permission.

Parameters

  • versioninteger, in the path, required

Response 200 · object

Done.

  • termsTerms, required
    • 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
{
  "terms": {
    "version": 0,
    "body": "string",
    "created_at": "string",
    "created_by": 0,
    "created_by_name": "string"
  }
}

Response 400 · Error

The request is not valid.

Fields as in Extras offered online

Response 401 · Error

No tenant key, or no valid session.

Fields as in Extras offered online

Response 403 · Error

The session may not do this.

Fields as in Extras offered online

Response 404 · Error

Not found, or not yours.

Fields as in Extras offered online

Response 500 · Error

Something failed on our side.

Fields as in Extras offered online

GET/v1/admin/job-types/bookable

The job types staff can book

Needs the quotes.write permission. The types that are on, in the firm's order, delivery and types not offered online included, each with its switches, active sizes and, for waste, the waste kinds taken. The same shape as GET /v1/config job_types.

Response 200 · object

Done.

  • job_typesarray of PublicJobType, required
    • typestring, required

      One of: house office items parcels waste delivery

    • multiple_collectionsboolean, required
    • multiple_dropsboolean, required
    • linestring, required
    • house_bystring

      House only.

      One of: size room

    • sizesarray of object, required
      • keystring, required
      • labelstring, required
      • m3number, required
      • max_length_cminteger
      • max_width_cminteger
      • max_height_cminteger
      • max_kginteger
    • waste_kindsarray of string

      Waste only.

Example response 200
{
  "job_types": [
    {
      "type": "house",
      "multiple_collections": true,
      "multiple_drops": true,
      "line": "string",
      "house_by": "size",
      "sizes": [
        {
          "key": "string",
          "label": "string",
          "m3": 0,
          "max_length_cm": 0,
          "max_width_cm": 0,
          "max_height_cm": 0,
          "max_kg": 0
        }
      ],
      "waste_kinds": [
        "general"
      ]
    }
  ]
}

Response 401 · Error

No tenant key, or no valid session.

Fields as in Extras offered online

Response 403 · Error

The session may not do this.

Fields as in Extras offered online

Response 500 · Error

Something failed on our side.

Fields as in Extras offered online

GET/v1/admin/customers/{customer_id}/quotes

A customer's quotes

Needs the quotes.read permission.

Parameters

  • customer_idstring, in the path, required

Response 200 · object

Done.

  • quotesarray of Quote or null, 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 400 · Error

The request is not valid.

Fields as in Extras offered online

Response 401 · Error

No tenant key, or no valid session.

Fields as in Extras offered online

Response 403 · Error

The session may not do this.

Fields as in Extras offered online

Response 404 · Error

Not found, or not yours.

Fields as in Extras offered online

Response 500 · Error

Something failed on our side.

Fields as in Extras offered online

POST/v1/admin/quotes/preview

Price a quote form without storing it

Needs the quotes.write permission. Takes the body of POST /v1/admin/quote, with staff's crew, vehicle, hours and extras, and prices it the same way, storing nothing and sending no email. With book, an unsaved price book (needs pricing.write), it prices with that instead, for trying settings before saving them. A quote of several legs, or of waste, needs pricing and is priced when saved. Send back the route_ref of the last preview; while the leg's addresses, the time, the vehicle and the yard travel are unchanged its route is reused without asking HERE again. A reference lasts 30 minutes. Each HERE route is counted in the business's usage, as quotes are. When HERE can't be reached the status is awaiting route, and when it finds no route or the job can't be priced, needs pricing, both without a price.

Request body · object

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

  • route_refstring
  • bookPriceBook

    A firm's price book. Amounts are in pence.

    • settingsPriceSettings, required
      • rate_methodstring, required

        One of: table van_plus_people

      • travelstring, required

        One of: none to_pickup both

      • oversizestring, required

        One of: by_hand vehicles trips vehicles_trips

      • road_chargesstring, required

        One of: here flat none

      • displaystring, required

        One of: fixed estimate range

      • breakdownboolean, required
      • range_percentnumber, required
      • min_hoursnumber, required
      • rounding_minutesinteger, required

        One of: 15 30 60

      • booking_feeinteger (int64), required
      • min_margin_percentnumber or null, required
      • fixed_radius_milesnumber, required
      • kg_per_m3number, required
      • rubble_kg_per_m3number, required

        The weight of a load of rubble and soil.

      • min_crewinteger, required
      • crew_rulesarray of object, required
        • above_m3number, required
        • crewinteger, required
      • large_crewinteger, required
      • floor_surchargeinteger (int64), required
      • heavy_surchargeinteger (int64), required
      • heavy_onceboolean, required
      • fragile_surchargeinteger (int64), required
      • fragile_onceboolean, required
      • early_beforestring, required

        HH:MM in the business's time zone, or empty.

      • late_afterstring, required

        HH:MM in the business's time zone, or empty.

    • methodsobject, required

      The price method of each job type.

    • vehiclesarray of VehiclePrices, required
      • vehicle_idinteger (int64), required
      • namestring

        Read only.

      • confirmedboolean

        Read only.

      • hourlyarray of object, required

        The hourly rate for each crew size, under table rates.

        • crewinteger, required
        • hourlyinteger (int64), required
      • van_hourlyinteger (int64) or null, required

        The vehicle with its driver, under van_plus_people rates.

      • extra_person_hourlyinteger (int64), required
      • per_mileinteger (int64), required
    • size_pricesarray of object, required

      The fixed price of each priced size.

      • typestring, required

        One of: house office items parcels waste delivery

      • sizestring, required
      • penceinteger (int64), required
    • fullnessarray of object, required
      • fullnessstring, required

        One of: light average packed

      • factornumber, required
    • adjustmentsarray of object, required
      • kindstring, required

        One of: saturday sunday bank_holiday early late peak midweek

      • percentnumber, required

        From -50 to 200.

    • peak_datesarray of object, required
      • datestring (date), required
      • labelstring, required
    • zonesarray of object, required
      • zonestring, required
      • penceinteger (int64), required
    • extrasarray of PriceExtra, required
      • idinteger (int64)

        Absent for a new extra.

      • namestring, required
      • penceinteger (int64), required
      • unitstring, required

        One of: fixed item unit hour week

      • onlineboolean, required

        Offered on the website. Hourly extras are for staff only.

      • positioninteger, required
Example request
{
  "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
  },
  "route_ref": "string",
  "book": {
    "settings": {
      "rate_method": "table",
      "travel": "none",
      "oversize": "by_hand",
      "road_charges": "here",
      "display": "fixed",
      "breakdown": true,
      "range_percent": 0,
      "min_hours": 0,
      "rounding_minutes": 15,
      "booking_fee": 0,
      "min_margin_percent": 0,
      "fixed_radius_miles": 0,
      "kg_per_m3": 0,
      "rubble_kg_per_m3": 0,
      "min_crew": 0,
      "crew_rules": [
        {
          "above_m3": 0,
          "crew": 0
        }
      ],
      "large_crew": 0,
      "floor_surcharge": 0,
      "heavy_surcharge": 0,
      "heavy_once": true,
      "fragile_surcharge": 0,
      "fragile_once": true,
      "early_before": "string",
      "late_after": "string"
    },
    "methods": {},
    "vehicles": [
      {
        "vehicle_id": 0,
        "name": "string",
        "confirmed": true,
        "hourly": [
          {
            "crew": 0,
            "hourly": 0
          }
        ],
        "van_hourly": 0,
        "extra_person_hourly": 0,
        "per_mile": 0
      }
    ],
    "size_prices": [
      {
        "type": "house",
        "size": "string",
        "pence": 0
      }
    ],
    "fullness": [
      {
        "fullness": "light",
        "factor": 0
      }
    ],
    "adjustments": [
      {
        "kind": "saturday",
        "percent": 0
      }
    ],
    "peak_dates": [
      {
        "date": "date",
        "label": "string"
      }
    ],
    "zones": [
      {
        "zone": "string",
        "pence": 0
      }
    ],
    "extras": [
      {
        "id": 0,
        "name": "string",
        "pence": 0,
        "unit": "fixed",
        "online": true,
        "position": 0
      }
    ]
  }
}

Response 200 · object

Done.

  • previewQuotePreview, required
    • statusstring, required

      One of: quoted price awaiting route needs pricing

    • pricing_reasonstring

      Why it couldn't be routed or priced.

    • total_valueinteger (int64), required

      The price, in pence.

    • calculatedinteger (int64)
    • estimated_costinteger (int64)
    • margininteger (int64)
    • below_marginboolean
    • price_linesarray of PriceLine or null
      • 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
    • 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
    • distanceinteger, required

      Metres.

    • durationinteger, required

      Minutes without traffic.

    • duration_in_trafficinteger, required
    • departure_timestring
    • fuel_litresnumber
    • co2_kgnumber
    • route_refstring

      Send it with the next preview of this form.

Example response 200
{
  "preview": {
    "status": "quoted price",
    "pricing_reason": "string",
    "total_value": 0,
    "calculated": 0,
    "estimated_cost": 0,
    "margin": 0,
    "below_margin": true,
    "price_lines": [
      {
        "kind": "time",
        "label": "string",
        "quantity": 0,
        "unit": 0,
        "amount": 0
      }
    ],
    "display": {
      "kind": "fixed",
      "amount": 0,
      "upper": 0,
      "hourly_rate": 0
    },
    "priced": {
      "crew": 0,
      "vehicles": [
        {
          "vehicle_id": 0,
          "trips": 0
        }
      ],
      "hours": 0
    },
    "distance": 0,
    "duration": 0,
    "duration_in_traffic": 0,
    "departure_time": "string",
    "fuel_litres": 0,
    "co2_kg": 0,
    "route_ref": "string"
  }
}

Response 400 · Error

The request is not valid.

Fields as in Extras offered online

Response 401 · Error

No tenant key, or no valid session.

Fields as in Extras offered online

Response 403 · Error

The session may not do this.

Fields as in Extras offered online

Response 500 · Error

Something failed on our side.

Fields as in Extras offered online

POST/v1/admin/quotes/batch

Create many quotes

Needs the quotes.write permission. For a firm's own system. Takes from 1 to 100 bodies of POST /v1/admin/quote and creates each on its own, in the order sent; a refused quote is answered at its place with its error and the others are kept. Any other failure fails the whole batch.

Request body · object

  • quotesarray of object, required
    • 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.

    • bookboolean
Example request
{
  "quotes": [
    {
      "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
      },
      "book": true
    }
  ]
}

Response 200 · object

One result a quote, in the order sent.

  • resultsarray of object, required
    • quoteQuote
      • 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.

    • errorobject
      • codestring, required
      • messagestring, required
Example response 200
{
  "results": [
    {
      "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
      },
      "error": {
        "code": "string",
        "message": "string"
      }
    }
  ]
}

Response 400 · Error

The request is not valid.

Fields as in Extras offered online

Response 401 · Error

No tenant key, or no valid session.

Fields as in Extras offered online

Response 403 · Error

The session may not do this.

Fields as in Extras offered online

Response 500 · Error

Something failed on our side.

Fields as in Extras offered online

GET/v1/admin/quotes

Quotes, filtered

Needs the quotes.read permission. Filter on a quote field, written field=value. A value may end ~eq, ~ne, ~gt, ~lt, ~gte or ~lte; a,b~between or a~between~b; a,b~in or a,b~nin. Fields: quote_id, uuid, customer_id, status, job_type, service_date, appointment_time, special_instructions, estimated_cost, total_value (pence). date_from and date_to select by service_date.

Parameters

  • qstring, in the query

    Matches the customer's name, email or phone, the postcode of any address on its legs (spaces ignored), or the quote number.

  • limitinteger, in the query

    10 by default, 100 at most.

  • offsetinteger, in the query
  • date_fromstring, in the query

    YYYY-MM-DD.

  • date_tostring, in the query

    YYYY-MM-DD.

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

The request is not valid.

Fields as in Extras offered online

Response 401 · Error

No tenant key, or no valid session.

Fields as in Extras offered online

Response 403 · Error

The session may not do this.

Fields as in Extras offered online

Response 404 · Error

Not found, or not yours.

Fields as in Extras offered online

Response 500 · Error

Something failed on our side.

Fields as in Extras offered online

POST/v1/admin/quote

Create a quote

Needs the quotes.write permission. Takes any job type the firm has on. With book, or for a delivery, the quote is accepted and its jobs made, one per leg, once it is priced, at once or when the retry prices it or staff set its price; until then it waits as any quote does.

Request body · object

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

  • bookboolean

    Save the quote accepted and make its jobs once priced, now or later.

Example request
{
  "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
  },
  "book": true
}

Response 200 · object

Done.

  • messagestring, required
  • 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.

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

Response 400 · Error

The request is not valid.

Fields as in Extras offered online

Response 401 · Error

No tenant key, or no valid session.

Fields as in Extras offered online

Response 403 · Error

The session may not do this.

Fields as in Extras offered online

Response 404 · Error

Not found, or not yours.

Fields as in Extras offered online

Response 409 · Error

It clashes with what is stored.

Fields as in Extras offered online

Response 500 · Error

Something failed on our side.

Fields as in Extras offered online

GET/v1/admin/quote/{id}

A quote

Needs the quotes.read permission.

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.

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
  }
}

Response 400 · Error

The request is not valid.

Fields as in Extras offered online

Response 401 · Error

No tenant key, or no valid session.

Fields as in Extras offered online

Response 403 · Error

The session may not do this.

Fields as in Extras offered online

Response 404 · Error

Not found, or not yours.

Fields as in Extras offered online

Response 500 · Error

Something failed on our side.

Fields as in Extras offered online

PUT/v1/admin/quote/{id}

Change a quote

Needs the quotes.write permission.

Parameters

  • idstring, in the path, required

Request body · Quote

  • 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 request
{
  "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 200 · object

Done.

  • messagestring, required
  • quote_idinteger (int64), required
Example response 200
{
  "message": "string",
  "quote_id": 0
}

Response 400 · Error

The request is not valid.

Fields as in Extras offered online

Response 401 · Error

No tenant key, or no valid session.

Fields as in Extras offered online

Response 403 · Error

The session may not do this.

Fields as in Extras offered online

Response 404 · Error

Not found, or not yours.

Fields as in Extras offered online

Response 409 · Error

It clashes with what is stored.

Fields as in Extras offered online

Response 500 · Error

Something failed on our side.

Fields as in Extras offered online

GET/v1/admin/quote/{id}/items

A quote's items

Needs the quotes.read permission.

Parameters

  • idstring, in the path, required

Response 200 · object

Done.

  • itemsarray of Item or null, required
    • 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.

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

Response 400 · Error

The request is not valid.

Fields as in Extras offered online

Response 401 · Error

No tenant key, or no valid session.

Fields as in Extras offered online

Response 403 · Error

The session may not do this.

Fields as in Extras offered online

Response 404 · Error

Not found, or not yours.

Fields as in Extras offered online

Response 500 · Error

Something failed on our side.

Fields as in Extras offered online

PUT/v1/admin/quote/{id}/price

Set or clear a quote's price override

Needs the quotes.write permission. Pence replaces what the customer pays, with a reason; the worked-out price stays beside it as calculated, from the quote's stored route and price book. A null pence clears the override. A quote that couldn't be priced takes the price given; then a delivery, or a quote saved with book, is accepted and its jobs made (job_ids), and any other's customer is emailed it. An accepted, declined, cancelled or expired quote's price can't change (409).

Parameters

  • idstring, in the path, required

Request body · object

  • penceinteger (int64) or null
  • reasonstring
Example request
{
  "pence": 0,
  "reason": "string"
}

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.

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
  }
}

Response 400 · Error

The request is not valid.

Fields as in Extras offered online

Response 401 · Error

No tenant key, or no valid session.

Fields as in Extras offered online

Response 403 · Error

The session may not do this.

Fields as in Extras offered online

Response 404 · Error

Not found, or not yours.

Fields as in Extras offered online

Response 409 · Error

It clashes with what is stored.

Fields as in Extras offered online

Response 500 · Error

Something failed on our side.

Fields as in Extras offered online

PUT/v1/admin/quote/{id}/deposit

Set or clear a quote's deposit

Needs the quotes.write permission. Pence replaces the firm's deposit rule for this quote; 0 waives the deposit and a null goes back to the rule. The quote's deposit_pence is capped at its gross price and is 0 under 30 pence. An accepted, declined, cancelled or expired quote's deposit can't change (409).

Parameters

  • idstring, in the path, required

Request body · object

  • penceinteger (int64) or null
Example request
{
  "pence": 0
}

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.

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
  }
}

Response 400 · Error

The request is not valid.

Fields as in Extras offered online

Response 401 · Error

No tenant key, or no valid session.

Fields as in Extras offered online

Response 403 · Error

The session may not do this.

Fields as in Extras offered online

Response 404 · Error

Not found, or not yours.

Fields as in Extras offered online

Response 409 · Error

It clashes with what is stored.

Fields as in Extras offered online

Response 500 · Error

Something failed on our side.

Fields as in Extras offered online

POST/v1/admin/quote/{id}/confirm

Book a quote its customer accepted online

Needs the quotes.write permission. For a quote with status "acceptance received": checks its day is still bookable (409 if not), books it (status accepted, jobs made, job_ids) and emails the 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.

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
  }
}

Response 400 · Error

The request is not valid.

Fields as in Extras offered online

Response 401 · Error

No tenant key, or no valid session.

Fields as in Extras offered online

Response 403 · Error

The session may not do this.

Fields as in Extras offered online

Response 404 · Error

Not found, or not yours.

Fields as in Extras offered online

Response 409 · Error

It clashes with what is stored.

Fields as in Extras offered online

Response 500 · Error

Something failed on our side.

Fields as in Extras offered online

POST/v1/admin/quote/{id}/decline

Decline a booking its customer accepted online

Needs the quotes.write permission. For a quote with status "acceptance received": status declined, and the customer is emailed with the reason given.

Parameters

  • idstring, in the path, required

Request body · object

  • reasonstring

    Told to the customer in the email.

Example request
{
  "reason": "string"
}

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.

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
  }
}

Response 400 · Error

The request is not valid.

Fields as in Extras offered online

Response 401 · Error

No tenant key, or no valid session.

Fields as in Extras offered online

Response 403 · Error

The session may not do this.

Fields as in Extras offered online

Response 404 · Error

Not found, or not yours.

Fields as in Extras offered online

Response 409 · Error

It clashes with what is stored.

Fields as in Extras offered online

Response 500 · Error

Something failed on our side.

Fields as in Extras offered online

GET/v1/admin/quote/{id}/pdf

A quote as a PDF

Needs the quotes.read permission. The quote on the business's letterhead, as its customer sees it, with its terms on their own pages. 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 Extras offered online

Response 401 · Error

No tenant key, or no valid session.

Fields as in Extras offered online

Response 403 · Error

The session may not do this.

Fields as in Extras offered online

Response 404 · Error

Not found, or not yours.

Fields as in Extras offered online

Response 500 · Error

Something failed on our side.

Fields as in Extras offered online

POST/v1/admin/quote/{id}/send

Email a quote to its customer

Needs the quotes.write permission. Emails the price and a link to the quote, and records sent_at; sending again sends again. Only a priced quote that is still open can be sent (409).

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.

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
  }
}

Response 400 · Error

The request is not valid.

Fields as in Extras offered online

Response 401 · Error

No tenant key, or no valid session.

Fields as in Extras offered online

Response 403 · Error

The session may not do this.

Fields as in Extras offered online

Response 404 · Error

Not found, or not yours.

Fields as in Extras offered online

Response 409 · Error

It clashes with what is stored.

Fields as in Extras offered online

Response 500 · Error

Something failed on our side.

Fields as in Extras offered online

PUT/v1/admin/quote/{id}/status

Change a quote's status

Needs the quotes.write permission. 409 while the customer's online acceptance waits for staff; confirm or decline it instead.

Parameters

  • idstring, in the path, required

Request body · object

  • statusstring, required
Example request
{
  "status": "string"
}

Response 200 · Message

Done.

  • messagestring, required
Example response 200
{
  "message": "string"
}

Response 400 · Error

The request is not valid.

Fields as in Extras offered online

Response 401 · Error

No tenant key, or no valid session.

Fields as in Extras offered online

Response 403 · Error

The session may not do this.

Fields as in Extras offered online

Response 404 · Error

Not found, or not yours.

Fields as in Extras offered online

Response 409 · Error

It clashes with what is stored.

Fields as in Extras offered online

Response 500 · Error

Something failed on our side.

Fields as in Extras offered online

GET/v1/admin/routes

A quote's route

Needs the quotes.read permission. Returns the quote's stored route, or plans one with HERE for the business's default vehicle (a generic 3.5 t van until it has a confirmed one) and stores it.

Parameters

  • quote_idinteger (int64), in the query, required

Response 200 · object

Done.

  • routeRoute, required
    • quote_idinteger (int64), required
    • from_addressstring
    • to_addressstring
    • appointment_timestring
    • departure_timestring

      When to leave to arrive at the appointment, with traffic.

    • durationinteger

      Minutes without traffic.

    • duration_in_trafficinteger

      Minutes with the traffic expected at the time.

    • distanceinteger

      Metres.

    • fuel_litresnumber

      Litres for the vehicle's fuel and consumption; left out for electric vehicles.

    • co2_kgnumber
    • pointsarray of array of number, required

      The route line as [latitude, longitude] pairs.

    • incidentsarray of object, required
      • typestring
      • criticalitystring
      • descriptionstring
    • noticesarray of object, required

      HERE's warnings, such as a restriction it couldn't avoid.

      • codestring
      • titlestring
      • severitystring
    • vehicle_idinteger (int64)

      The vehicle the route was planned for.

    • generic_vehicleboolean, required

      Set when the route was planned for the generic 3.5 t van because the business has no confirmed default vehicle.

    • road_chargesarray of RoadCharge

      Road charges on the route in pence (tolls, crossings, congestion and clean air zones), when the business passes them on and has road charge lookups left. London's ULEZ is left out for vehicles that meet it.

      • zonestring, required

        london_congestion, london_ulez, dartford, or the toll's own name in snake case.

      • penceinteger (int64), required
Example response 200
{
  "route": {
    "quote_id": 0,
    "from_address": "string",
    "to_address": "string",
    "appointment_time": "string",
    "departure_time": "string",
    "duration": 0,
    "duration_in_traffic": 0,
    "distance": 0,
    "fuel_litres": 0,
    "co2_kg": 0,
    "points": [
      [
        0
      ]
    ],
    "incidents": [
      {
        "type": "string",
        "criticality": "string",
        "description": "string"
      }
    ],
    "notices": [
      {
        "code": "string",
        "title": "string",
        "severity": "string"
      }
    ],
    "vehicle_id": 0,
    "generic_vehicle": true,
    "road_charges": [
      {
        "zone": "string",
        "pence": 0
      }
    ]
  }
}

Response 400 · Error

The request is not valid.

Fields as in Extras offered online

Response 401 · Error

No tenant key, or no valid session.

Fields as in Extras offered online

Response 403 · Error

The session may not do this.

Fields as in Extras offered online

Response 404 · Error

Not found, or not yours.

Fields as in Extras offered online

Response 500 · Error

Something failed on our side.

Fields as in Extras offered online