Charter Boats
Charter Boats API
Boats

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

GET/boats/availability

The 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

ParameterTypeRequiredDescription
boat_idstringYesBoat UUID (a slug is not accepted)
startstringWith endRange start, YYYY-MM-DD
endstringWith startRange end, YYYY-MM-DD (inclusive)
datestringInstead of start/endA 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

curl "https://charter.boats/api/boats/availability?boat_id=55467c1d-bfab-484f-b0c0-bb9352d4d46d&start=2027-06-05&end=2027-06-12&api_version=1.1" \
  -H "X-API-Key: YOUR_API_KEY"

A real v1.1 response:

{
  "blockedDates": [],
  "noPricingDates": [],
  "dayPrices": {
    "2027-06-05": 652,
    "2027-06-06": 652,
    "2027-06-07": 652,
    "2027-06-08": 652,
    "2027-06-09": 652,
    "2027-06-10": 652,
    "2027-06-11": 652,
    "2027-06-12": 676
  },
  "dayDiscounts": {
    "2027-06-05": {
      "original": 757,
      "pct": 14
    },
    "2027-06-06": {
      "original": 757,
      "pct": 14
    },
    "2027-06-07": {
      "original": 757,
      "pct": 14
    },
    "2027-06-08": {
      "original": 757,
      "pct": 14
    },
    "2027-06-09": {
      "original": 757,
      "pct": 14
    },
    "2027-06-10": {
      "original": 757,
      "pct": 14
    },
    "2027-06-11": {
      "original": 757,
      "pct": 14
    },
    "2027-06-12": {
      "original": 786,
      "pct": 14
    }
  },
  "changeoverDates": [],
  "optionedDates": [
    {
      "date": "2027-06-05",
      "expiry": "2026-10-05"
    },
    {
      "date": "2027-06-06",
      "expiry": "2026-10-05"
    },
    {
      "date": "2027-06-07",
      "expiry": "2026-10-05"
    },
    {
      "date": "2027-06-08",
      "expiry": "2026-10-05"
    },
    {
      "date": "2027-06-09",
      "expiry": "2026-10-05"
    },
    {
      "date": "2027-06-10",
      "expiry": "2026-10-05"
    },
    {
      "date": "2027-06-11",
      "expiry": "2026-10-05"
    }
  ],
  "start": "2027-06-05",
  "end": "2027-06-12"
}

The same request with api_version=1.0:

{
  "blockedDates": [],
  "noPricingDates": [],
  "dayPrices": {
    "2027-06-05": 595,
    "2027-06-06": 595,
    "2027-06-07": 595,
    "2027-06-08": 595,
    "2027-06-09": 595,
    "2027-06-10": 595,
    "2027-06-11": 595,
    "2027-06-12": 619
  },
  "changeoverDates": [],
  "optionedDates": [
    {
      "date": "2027-06-05",
      "expiry": "2026-10-05"
    },
    {
      "date": "2027-06-06",
      "expiry": "2026-10-05"
    },
    {
      "date": "2027-06-07",
      "expiry": "2026-10-05"
    },
    {
      "date": "2027-06-08",
      "expiry": "2026-10-05"
    },
    {
      "date": "2027-06-09",
      "expiry": "2026-10-05"
    },
    {
      "date": "2027-06-10",
      "expiry": "2026-10-05"
    },
    {
      "date": "2027-06-11",
      "expiry": "2026-10-05"
    }
  ],
  "start": "2027-06-05",
  "end": "2027-06-12"
}
FieldTypeDescription
blockedDatesstring[]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
noPricingDatesstring[]The subset of blockedDates blocked only because no season prices that night
changeoverDatesstring[]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
optionedDatesarrayNights 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, endstringEcho of the request

Price fields in v1.1:

FieldTypeDescription
dayPricesobject{ "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
dayDiscountsobjectSame 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:

FieldTypeDescription
dayPricesobject{ "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

curl "https://charter.boats/api/boats/availability?boat_id=3a121be0-c1f8-4432-8e18-4a125b46da65&date=2026-10-17" \
  -H "X-API-Key: YOUR_API_KEY"
{
  "available": false,
  "date": "2026-10-17",
  "conflicts": { "bookings": 0, "blocks": 0, "external": 1 }
}
FieldTypeDescription
availablebooleanNo booking, block or synced event occupies that night
datestringEcho of the request
conflictsobjectHow 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

StatusMessage
400boat_id is required
400boat_id must be a UUID
400date or start/end range is required
404Boat 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.

On this page