Boat Availability
Which nights a boat can't be sold for over a date range, or whether one date is free
Showing API v1.1 — versionsShowing API v1.0 — versions
/boats/availabilityThe boat's calendar: bookings, owner blocks and synced partner events, plus the nights no season prices. This is the check to run before relying on dates found through List Boats — search results are a discovery set, and Resolve Pricing prices a range without looking at the calendar at all.
You are reading API v1.1. Send api_version=1.1 to get it: a call with your API key, or to /api/ai/*, that names no version gets 1.0 — switch the picker at the top to v1.0 to read that shape.
You are reading API v1.0, what a call with your API key gets when it names no api_version. dayPrices holds each day's charter day rate (our auto-applied offer already taken off, no fees inside) and there is no dayDiscounts. New integrations should send api_version=1.1 — see Versions.
Authentication
Send your API key in the X-API-Key header, as on every Operator API call. It reads only boats your company operates; another operator's boat is a 403 — sell those through the Discovery API. See Authentication.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
boat_id | string | Yes | Boat UUID (a slug is not accepted) |
start | string | With end | Range start, YYYY-MM-DD |
end | string | With start | Range end, YYYY-MM-DD (inclusive) |
date | string | Instead of start/end | A single date, YYYY-MM-DD |
Send either start + end (range mode) or date (single-date mode). Range mode is the one to use: it is the same calculation the boat page's calendar and the booking flow run.
Nights, not days
Every date here is a night. A charter occupies the nights from its check-in up to but not including its check-out day — the boat is handed back in the morning and can sail again the same afternoon. So a check-in day is occupied, and a check-out day is free for the next guest. A stay from A to B is possible when none of the nights A … B − 1 is in blockedDates.
Range mode
A real v1.1 response:
The same request with api_version=1.0:
| Field | Type | Description |
|---|---|---|
blockedDates | string[] | Nights the boat cannot be sold: occupied by a booking, a block or a synced partner event, or not covered by any season of the boat's active pricing source. Unordered. An event that straddles the range contributes all of its nights, so dates outside start–end can appear — filter to your range |
noPricingDates | string[] | The subset of blockedDates blocked only because no season prices that night |
changeoverDates | string[] | Check-out days of existing bookings, blocks and events — the day one charter ends and the next can begin. Such a night is never blocked for lack of a season; it is in blockedDates only when another booking or event occupies it |
optionedDates | array | Nights held by another party's option (a temporary hold that may lapse): { date, expiry }, expiry a YYYY-MM-DD or null. Usually empty — while the waitlist feature is off, options are reported in blockedDates like any other hold |
start, end | string | Echo of the request |
Price fields in v1.1:
| Field | Type | Description |
|---|---|---|
dayPrices | object | { "YYYY-MM-DD": number } for each free, priced day in the range: that day's list figure — the grand total at max guests per day for the boat, every required fee and the 45 EUR platform fee inside, deposits never |
dayDiscounts | object | Same keys, only on days with a discount: { original, pct } — the day's figure with the partner's discount undone, and the percentage |
Price fields in v1.0:
| Field | Type | Description |
|---|---|---|
dayPrices | object | { "YYYY-MM-DD": number } for each free, priced day in the range: that day's charter day rate, our auto-applied offer already taken off, no fees inside |
A night in neither blockedDates nor optionedDates is free and priced. Whether a particular stay can be booked also depends on the boat's check-in days and minimum stay (charter_day, check_in_periods on Get Boat) — most charter boats are sold Saturday to Saturday, a week at a time.
Single-date mode
| Field | Type | Description |
|---|---|---|
available | boolean | No booking, block or synced event occupies that night |
date | string | Echo of the request |
conflicts | object | How many bookings, owner blocks and synced partner events (external) overlap it |
This mode checks the calendar only — it does not check pricing, so available: true does not mean the night can be sold. Prefer range mode.
Errors
| Status | Message |
|---|---|
400 | boat_id is required |
400 | boat_id must be a UUID |
400 | date or start/end range is required |
404 | Boat not found |
Until 2026-09-15 a boat_id no boat carried was not an error: single-date mode found no
conflicting booking, block or event and answered 200 with available: true, and range mode
answered a calendar with every night in blockedDates. Both are now 404 — never treat a
successful response as confirmation that the boat exists.
A boat that is not published answers the same 404, unless the request is signed in as a member
of the company that owns it or as an administrator: an unlisted boat's calendar is its operator's,
not public information.