Skip to main content

Products Tools (Rental)

Module-gated

These tools are only advertised to AI clients when the supplier has the Rentals module enabled. See Per-supplier tool filtering for details.

Manage your rental product catalog, check availability, calculate pricing, and track inventory levels.

Required scope: products:read for read tools, products:write for write tools

Tools Overviewโ€‹

ToolDescriptionRead-only?
list_productsList rental products with optional filtersYes
get_productGet detailed product informationYes
create_productCreate a new rental productNo
update_productUpdate an existing productNo
check_product_availabilityCheck availability for specific datesYes
calculate_rental_priceCalculate exact pricing for a date rangeYes
get_inventoryGet inventory status for a productYes
get_inventory_statusGet per-item status (available, rented, in workshop)Yes
get_low_inventory_productsGet products with low current availabilityYes
get_expiring_complianceInspection and insurance dates for every boatYes

list_productsโ€‹

List rental products with optional filters. Returns product details including starting price.

Parametersโ€‹

NameTypeRequiredDescription
searchstringNoSearch by name or SKU
category_idintegerNoFilter by category
statusstringNoFilter by status: active, inactive, archived
limitintegerNoNumber of results (default 10)

get_productโ€‹

Get detailed information about a product.

Parametersโ€‹

NameTypeRequiredDescription
product_idintegerNoThe product ID
namestringNoSearch by product name

Provide either product_id or name.

For a boat (product type Boats) the response carries a compliance object with the same fields as the REST compliance object. list_products carries it on each boat too.


create_productโ€‹

Create a new rental product. Supports flat (single price) or schedule (tiered) pricing, with optional seasonal pricing.

Parametersโ€‹

NameTypeRequiredDescription
namestringYesProduct name
category_idintegerNoPrimary category ID (use list_product_categories to find IDs). Use category_ids for multiple.
category_idsinteger[]NoPut the product in multiple categories (primary first).
daily_pricenumberNoFor flat pricing: the single rental price
price_intervalstringNoPricing interval: day, hour, week. Defaults to day
schedule_tiersarrayNoFor tiered pricing: [{interval, price}] with whole-number intervals. For a half-day rate use half_day_price, not a fractional interval
half_day_pricenumberNoOptional half-day rate. Day-based pricing only โ€” adds a "ยฝ day" price (an interval: 0.5 row) for rentals up to half a day, alongside the daily rate. Combine with a day-based schedule_tiers, or with daily_price (which is promoted to a day schedule). Ignored for hourly/weekly pricing
additional_charge_per_intervalnumberNoExtra charge per interval beyond the last tier
descriptionstringNoProduct description
skustringNoSKU/product code
price_appliesstringNoyearRound (default) or seasonal
seasonal_pricingarrayNoPer-season pricing: [{season_id, price, price_interval, schedule_tiers, half_day_price}] (half_day_price is the season's day-based half-day rate)
whats_includedarrayNo[{label, description}] rows. See Content Blocks.
does_not_includearrayNo[{label, description}] rows โ€” what's not included. See Content Blocks.
itineraryarrayNo[{time, title, description}] rows.
highlightsarrayNoFlat list of strings (pill chips).
check_in_detailsstringNoRich-text HTML, sanitized to the allowlist at write time.
what_to_bringarrayNoFlat list of strings (pill chips).
restrictionsstringNoRich-text HTML.
health_and_safetystringNoRich-text HTML.
cancellation_notesstringNoRich-text HTML.
custom_sectionsarrayNoOrdered [{heading, body}] blocks beyond the eight fixed sections. heading is plain text; body is rich-text HTML.
min_rental_valueinteger or nullNoShortest rental for this item. 0 means no minimum; null or omitted follows the shop minimum.
min_rental_unitstringNoMinutes, Hours or Days. Defaults to Hours.
user_confirmedbooleanYesMust be true to create

Example: Flat Pricingโ€‹

{
"name": "Mountain Bike",
"daily_price": 35,
"price_interval": "day",
"user_confirmed": true
}

Example: Tiered Pricingโ€‹

{
"name": "Kayak",
"price_interval": "hour",
"schedule_tiers": [
{"interval": 1, "price": 20},
{"interval": 2, "price": 30},
{"interval": 3, "price": 35}
],
"additional_charge_per_interval": 5,
"user_confirmed": true
}

Example: Day Rate with a Half-Day Priceโ€‹

half_day_price adds a "ยฝ day" rate (an interval: 0.5 row) for day-based rentals up to half a day, alongside the daily rate. Provide it with a day-based schedule_tiers, or (as below) with a plain daily_price โ€” which is promoted to a day schedule so both rates persist.

{
"name": "Paddleboard",
"daily_price": 60,
"price_interval": "day",
"half_day_price": 35,
"user_confirmed": true
}

update_productโ€‹

Update an existing product.

Parametersโ€‹

NameTypeRequiredDescription
product_idintegerYesThe product ID to update
namestringNoNew product name
descriptionstringNoNew description
skustringNoNew SKU
pricenumberNoNew base price
inventory_trackingstringNoitem for individually labeled stock, or group for one total. Existing stock determines its tracking method.
inventory_identifiersstring[]NoWith inventory_tracking: item, number an unused stock pool using one distinct label per unit, or keep the same saved labels without adding stock. Changing used stock numbers is refused.
turnaround_minutesintegerNoKeep returned stock unavailable for this many minutes, from 0 to 525600. Zero removes the gap.
statusstringNoNew status: active, inactive
category_idintegerNoNew primary category ID. Use category_ids for multiple.
category_idsinteger[]NoReplace the product's categories with this set (primary first).
whats_includedarrayNo[{label, description}] rows. See Content Blocks.
does_not_includearrayNo[{label, description}] rows โ€” what's not included. See Content Blocks.
itineraryarrayNo[{time, title, description}] rows.
highlightsarrayNoFlat list of strings.
check_in_detailsstringNoRich-text HTML.
what_to_bringarrayNoFlat list of strings.
restrictionsstringNoRich-text HTML.
health_and_safetystringNoRich-text HTML.
cancellation_notesstringNoRich-text HTML.
custom_sectionsarrayNoOrdered [{heading, body}] blocks. heading plain text; body rich-text HTML.
inspection_expirystringNoBoats only. Date the inspection runs out, YYYY-MM-DD. none removes it.
insurance_expirystringNoBoats only. Date the insurance runs out, YYYY-MM-DD. none removes it.
insurance_policy_numberstringNoBoats only. none removes it.
inspection_document_locationstringNoBoats only. An http or https link to the inspection certificate. none removes it.
insurance_document_locationstringNoBoats only. An http or https link to the insurance document. none removes it.
block_bookings_if_lapsedbooleanNoBoats only. Stop bookings for the boat, and every experience that uses it, while a date has lapsed.
user_confirmedbooleanYesMust be true to update

check_product_availabilityโ€‹

Check if a product is available for specific dates and quantity. Returns availability status and estimated pricing.

Parametersโ€‹

NameTypeRequiredDescription
product_idintegerYesThe product ID
start_datestringYesStart date for the period
end_datestringYesEnd date for the period
quantityintegerNoQuantity needed (default 1)

calculate_rental_priceโ€‹

Calculate the exact rental price for one or more products over a date range using the system pricing engine. Use this instead of calculating prices manually.

Parametersโ€‹

NameTypeRequiredDescription
product_idsarrayYesArray of product IDs to calculate prices for
start_datestringYesRental start datetime (YYYY-MM-DD HH:MM:SS)
end_datestringYesRental end datetime (YYYY-MM-DD HH:MM:SS)
quantityintegerNoQuantity per product (default 1)
variation_idintegerNoVariation to price. When the product prices by variation and this variation has its own pricing, that pricing is used; otherwise the base price applies.
location_idintegerNoPickup location to price at. Most specific scope wins: variation-at-location โ†’ location โ†’ variation โ†’ base.

get_inventoryโ€‹

Get inventory status for a product. Optionally check per-item availability for a date range.

Parametersโ€‹

NameTypeRequiredDescription
product_idintegerYesThe product ID
start_datestringNoCheck availability from this datetime
end_datestringNoCheck availability until this datetime
variation_idintegerNoFilter to a specific variation
location_idintegerNoFilter to a business location.
limitintegerNoRecords per page, from 1 to 100. Default 30.
offsetintegerNoRecords to skip. Default zero. Use pagination.next_offset for the next page.

The response includes pagination.total_records, has_more, and next_offset. inventory_records counts the returned page. Read subsequent pages before reporting a complete list of unit numbers. Availability totals still cover all matching inventory.


get_inventory_statusโ€‹

Get status of individual inventory items for a product, showing which items are available, rented, or in the workshop.

Parametersโ€‹

NameTypeRequiredDescription
product_idintegerYesThe product ID

get_low_inventory_productsโ€‹

Get products with low current availability. Shows products where available quantity (accounting for active bookings) is below the threshold. Point-in-time availability for today.

Parametersโ€‹

NameTypeRequiredDescription
thresholdintegerNoConsider inventory low if available quantity is below this number (default 5)

get_expiring_complianceโ€‹

Inspection and insurance for every boat (a rental product of type Boats), plus any older charter experience that keeps its own dates. Each row has name, kind (boat or experience), product_id or experience_id, and the fields of the REST compliance object.

Allowed with products:read or experiences:read.

Parametersโ€‹

NameTypeRequiredDescription
showstringNoall (default) lists every boat. needs_attention lists only boats whose inspection or insurance has lapsed or runs out within days.
daysintegerNoWith needs_attention: the window in days (default 30, max 365). Lapsed dates are always included. Sending days alone implies needs_attention.

To change a date, call update_product.