Charter Boats
Charter Boats API
Pricing

Seasonal Pricing

Read a boat's seasonal pricing rules

GET/boats/:id/prices

Retrieve the seasonal pricing rules for a boat, ordered by priority (highest first), then by start month. Quotes we can't sell — one-way delivery legs, weeks quoted from another base, implausible partner-side prices — are left out.

Authentication

Send your API key in the X-API-Key header, as on every Operator API call — see Authentication.

Path Parameters

ParameterTypeDescription
idstringBoat ID (UUID). A slug is not accepted

Request

curl https://charter.boats/api/boats/3a121be0-c1f8-4432-8e18-4a125b46da65/prices \
  -H "X-API-Key: YOUR_API_KEY"

Response

Returns an array of price objects.

[
  {
    "id": "d2dd1fae-9d95-40c2-aaaf-e7aec87b4ab6",
    "boat_id": "3a121be0-c1f8-4432-8e18-4a125b46da65",
    "name": "High Season 2027",
    "start_month": 8,
    "start_day": 14,
    "end_month": 8,
    "end_day": 21,
    "price_per_day": 203,
    "priority": 13,
    "created_at": "2026-09-06T15:55:26.690369+00:00",
    "discount_percentage": 30,
    "discount_name": "30% discount",
    "original_price_per_day": 350,
    "valid_from_year": 2027,
    "valid_to_year": 2027,
    "product_name": "Crewed"
  },
  {
    "id": "bcdece2a-9a31-4388-b5c7-f83a21cfc0df",
    "boat_id": "3a121be0-c1f8-4432-8e18-4a125b46da65",
    "name": "High Season 2027",
    "start_month": 7,
    "start_day": 10,
    "end_month": 8,
    "end_day": 14,
    "price_per_day": 219.24,
    "priority": 12,
    "created_at": "2026-09-06T15:55:26.690369+00:00",
    "discount_percentage": 30,
    "discount_name": "30% discount",
    "original_price_per_day": 378,
    "valid_from_year": 2027,
    "valid_to_year": 2027,
    "product_name": "Crewed"
  }
]

Response Fields

FieldTypeDescription
idstringPrice ID (UUID)
boat_idstringBoat this price belongs to
namestringPrice name
start_monthintegerStart month (1-12)
start_dayintegerStart day (1-31)
end_monthintegerEnd month (1-12)
end_dayintegerEnd day (1-31)
price_per_daynumberDaily rate for this price
priorityintegerHigher priority wins on overlaps (default: 0)
original_price_per_daynumber | nullPre-discount price (if a discount applies)
discount_percentagenumber | nullActive discount percentage
discount_namestring | nullName of the discount
valid_from_yearinteger | nullYear the price starts applying
valid_to_yearinteger | nullYear the price stops applying
product_namestring | nullProduct/package variant this price belongs to (e.g. Bareboat, Crewed)
created_atstringISO 8601 timestamp

Prices can wrap around year boundaries (e.g., November 15 to January 15).

This endpoint is read-only. Seasonal prices are created and edited from the dashboard under your logged-in session — there is no keyed endpoint to write them. To compute the effective price for specific dates, use Resolve Pricing.

Price Resolution

When multiple prices overlap a date, the one with the highest priority value wins (the full tie-break rules are on Resolve Pricing). A date no price covers has no price, so it can't be booked — but a covered date is not necessarily free: prices say nothing about bookings. Check the calendar with Boat Availability.

Errors

StatusMessage
400Boat ID must be a UUID
404Boat not found
500Failed to fetch prices

A slug — or anything else that isn't UUID-shaped — answers 400, and a UUID no boat carries answers 404. Until 2026-09-15 the first was a 500 and the second an empty array (200 []), which read as "this boat publishes no seasons"; an empty array now means only that, for a boat that exists.

On this page