Packages
Create and manage stay packages, bundles, and upsell offers. Each package has a defined type, price, and inclusions list that can be surfaced to guests pre-arrival or at booking.
The Package object
idstringUnique package ID. Prefixed pkg_.
property_idstringProperty this package belongs to.
namestringDisplay name, e.g. Romance Getaway.
slugstringURL-safe identifier. Must be unique per property.
typeenumromance · golf · spa · family · celebration · business · honeymoon · adventure · custom
pricefloatPackage price in the property's default currency.
currencystringISO 4217 currency code (e.g. USD).
descriptionstring?Short marketing description.
inclusionsstring[]List of what is included in the package.
is_activebooleanWhether the package is available to guests.
valid_fromdate?Optional start date for seasonal packages.
valid_untildate?Optional end date for seasonal packages.
created_atdatetimeISO 8601 timestamp.
Endpoints
/v1/packagesCreate a packageCreate a new stay package or upsell bundle.
Request Body
namestringrequiredDisplay name of the package.slugstringrequiredURL-safe unique identifier.typestringrequiredPackage type: romance, golf, spa, family, celebration, business, honeymoon, adventure, or custom.pricenumberrequiredPrice in the property's default currency.currencystringrequiredISO 4217 currency code.inclusionsstring[]requiredArray of inclusions.descriptionstringShort marketing description.is_activebooleanSet false to create in draft state. Defaults to true.valid_fromstringStart date for seasonal availability (YYYY-MM-DD).valid_untilstringEnd date for seasonal availability (YYYY-MM-DD).curl -X POST https://api.escapelife.ai/v1/packages \
-H "X-API-Key: sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"name": "Romance Getaway",
"slug": "romance-getaway",
"type": "romance",
"price": 890,
"currency": "USD",
"description": "The ultimate couples escape",
"inclusions": [
"Champagne on arrival",
"Couples spa treatment",
"Private dining experience",
"Rose petal turndown"
],
"is_active": true
}'{
"id": "pkg_jkl012",
"property_id": "pty_xyz",
"name": "Romance Getaway",
"slug": "romance-getaway",
"type": "romance",
"price": 890.0,
"currency": "USD",
"description": "The ultimate couples escape",
"inclusions": [
"Champagne on arrival",
"Couples spa treatment",
"Private dining experience",
"Rose petal turndown"
],
"is_active": true,
"valid_from": null,
"valid_until": null,
"created_at": "2026-03-16T10:00:00Z"
}/v1/packagesList packagesReturn all packages for the property.
Path / Query Parameters
active_onlybooleanWhen true (default), only returns packages with is_active: true.typestringFilter by package type.limitintegerMax results (1–100). Default 20.offsetintegerPagination offset. Default 0./v1/packages/{id}Retrieve a packageFetch a single package by ID.
Path / Query Parameters
idstringrequiredPackage ID (pkg_...)./v1/packages/{id}Update a packageUpdate price, inclusions, availability window, or active status.
Path / Query Parameters
idstringrequiredPackage ID (pkg_...).Request Body
namestringNew display name.pricenumberUpdated price.inclusionsstring[]Updated inclusions list (replaces existing).is_activebooleanActivate or deactivate the package.valid_fromstringNew start date (YYYY-MM-DD).valid_untilstringNew end date (YYYY-MM-DD).descriptionstringUpdated description.curl -X PATCH https://api.escapelife.ai/v1/packages/pkg_jkl012 \
-H "X-API-Key: sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{"is_active": false}'Seasonal packages
Use valid_from and valid_until to restrict a package to a date window — useful for holiday offers, peak season bundles, or limited-time promotions.
curl -X POST https://api.escapelife.ai/v1/packages \
-H "X-API-Key: sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"name": "Summer Family Escape",
"slug": "summer-family-2026",
"type": "family",
"price": 580,
"currency": "USD",
"inclusions": ["Kids club", "Beach equipment", "Daily breakfast"],
"valid_from": "2026-06-01",
"valid_until": "2026-08-31",
"is_active": true
}'