Docs

Cart packages

Last updated: 26 Oct 2026

Cart packages add a package to a cart and remove it again. A carted package becomes several cart items, one per part (for example the stay, the tickets and the bookings), and the cart lists them together under packages.

All endpoints are cart-scoped:

/store/v0/carts/{cart_public_id}

Add a package to a cart

POST /store/v0/carts/{cart_public_id}/packages

Request body

{
  "package": {
    "package_id": "9630b448-147c-424a-8ed5-f9d41cdc7421",
    "check_in_date": "2026-10-14",
    "check_out_date": "2026-10-17",
    "guests": 2,
    "choices": {
      "f7fc65b6-f266-408f-b5c5-5bbf8f344022": "d031cf87-a78d-4b6e-997b-bc8a6ff37f41"
    },
    "extra_component_ids": ["c3b5d0a2-7a57-4c1e-b0c4-2f0d7a4a6b11"],
    "slots": {
      "1054ad56-72da-4149-bc41-4216887d98be": "2026-10-15T09:00:00+02:00",
      "c3b5d0a2-7a57-4c1e-b0c4-2f0d7a4a6b11": "2026-10-16T10:00:00+02:00"
    }
  }
}
FieldTypeRequiredDescription
package_idstringyesPackage public ID
check_in_date / check_out_datedate (YYYY-MM-DD)staysThe stay's dates
guestsintegernoParty size. Defaults to 2, kept between the package's smallest_party and largest_party.
choicesobjectwhen the guest picksComponent public ID → option public ID, for every component with guest_picks: true, including the room
extra_component_idsstring[]noPublic IDs of the extras the guest adds
slotsobjectfor servicesComponent public ID → the slot's starts_at, for every service component the guest books (included services and chosen extras)

Response

201 with the updated cart:

{
  "cart": {
    "id": "d1c2b3a4-5e6f-4a2b-9c3d-0e1f2a3b4c5d",
    "items_count": 3,
    "total_quantity": 1,
    "items": [
      {
        "public_id": "0b6d…",
        "kind": "stay",
        "package_id": "5e0c7c1a-2b8f-4d7e-9f1a-3c4d5e6f7a8b",
        "…": "…"
      }
    ],
    "packages": [
      {
        "public_id": "5e0c7c1a-2b8f-4d7e-9f1a-3c4d5e6f7a8b",
        "package_id": "9630b448-147c-424a-8ed5-f9d41cdc7421",
        "name": "Autumn calm at Jølstraholmen",
        "description": "2 guests · Lodgen · 14 Oct–17 Oct",
        "check_in_date": "2026-10-14",
        "check_out_date": "2026-10-17",
        "guests": 2,
        "addon_lines": ["6 × Breakfast"],
        "item_ids": ["0b6d…", "7c1e…", "9a4f…"],
        "total": {
          "cents": 930500,
          "currency": "NOK",
          "amount": 9305.0,
          "formatted": "9,305 NOK",
          "abbreviated": "9.3k NOK"
        },
        "thumbnail_url": "https://assets.servos.dk/derivations/media/thumbnail/400/400/…"
      }
    ],
    "…": "…"
  }
}

How the price is split

The package price is spread over the package's cart items by their list value, and each item keeps its own VAT rate. Extras cost their own price on top of the package price. The package's total is the sum of its items, so the cart total is exact. Show the package as one line with its total, and use item_ids to hide or group its items in the cart.

Add-ons booked onto the stay or a booking, such as breakfast, are part of that item. addon_lines lists them.

Errors

A package that cannot be booked returns 422 with a reason for the guest:

{ "error": "Choose a time for Private sauna", "details": {} }

Typical reasons: the dates are outside the season or break the stay length, the party does not fit, the room is full, a guest choice is missing, a service has no time or the time is taken.

A package_id, component or option public ID that the package does not have returns 404.

Remove a package from a cart

DELETE /store/v0/carts/{cart_public_id}/packages/{public_id}

public_id is the cart package's public_id, not the package's. Removes the package and all its items and returns the updated cart.

Removing one of a package's items with DELETE /items/{public_id} also removes the whole package.

Cart package object reference

FieldTypeDescription
public_idstringCart package public identifier; use it to remove the package
package_idstringThe package's public ID
namestringPackage name
descriptionstringGuests, room and dates in one line
check_in_date / check_out_datestring | nullThe stay's dates; null for a bundle
guestsintegerParty size
addon_linesstring[]Add-ons on the stay or a booking, as "quantity × name"
item_idsstring[]Public IDs of the cart items that make up the package
totalmoneyWhat the package costs in this cart, extras included
thumbnail_urlstring | nullImage for the package line