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}/packagesRequest 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"
}
}
}| Field | Type | Required | Description |
|---|---|---|---|
package_id | string | yes | Package public ID |
check_in_date / check_out_date | date (YYYY-MM-DD) | stays | The stay's dates |
guests | integer | no | Party size. Defaults to 2, kept between the package's smallest_party and largest_party. |
choices | object | when the guest picks | Component public ID → option public ID, for every component with guest_picks: true, including the room |
extra_component_ids | string[] | no | Public IDs of the extras the guest adds |
slots | object | for services | Component 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
| Field | Type | Description |
|---|---|---|
public_id | string | Cart package public identifier; use it to remove the package |
package_id | string | The package's public ID |
name | string | Package name |
description | string | Guests, room and dates in one line |
check_in_date / check_out_date | string | null | The stay's dates; null for a bundle |
guests | integer | Party size |
addon_lines | string[] | Add-ons on the stay or a booking, as "quantity × name" |
item_ids | string[] | Public IDs of the cart items that make up the package |
total | money | What the package costs in this cart, extras included |
thumbnail_url | string | null | Image for the package line |