Charter Boats
Charter Boats API
Fees

List Boat Fees

Get all fees for a specific boat

GET/boats/:id/fees

Retrieve the fees that apply to one stay on a boat, filtered by its active pricing source. Fees are ordered by sort_order.

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)

Query Parameters

ParameterTypeRequiredDescription
startstringNoCharter start date (YYYY-MM-DD) -- selects the fees valid on that date
endstringNoCharter end date (YYYY-MM-DD). Only sets the charter length (see below), and only together with start; it does not filter validity
productstringNoRestrict to fees for a product variant (e.g. Bareboat, Crewed); fees with no product_name are always included. Without it the boat's default package is returned, never every package stacked
guestsintegerNoCrew size; selects the matching row of a per-person fee table (MMK boats — no other fee is narrowed by it). Defaults to the boat's capacity

When start is provided, only fees whose validity window contains the charter start date are returned — an operator publishes one price per window and a charter is priced by the window it departs in, so a stay crossing a boundary never gets two variants of one fee. Fees with no valid_from/valid_to dates are always included.

guests picks the row of a person-indexed fee table (some operators publish a park or permit fee per crew size). When absent, the boat's capacity is assumed.

Charter length

Operators often publish a fee as a table indexed by charter length -- one row per duration, such as a mooring fee of 60 EUR for 1 day, 42 EUR for 2 days and so on up to a weekly rate. Each row carries min_duration/max_duration, and only the row matching this charter contributes; the rest are omitted from the response.

The length is the number of nights from start to end. When either is absent the standard charter week (7 nights) is assumed, so a dateless call returns the fees a one-week booking would pay -- not every row of every table. Request a specific start/end to price any other duration.

Fees with no min_duration and no max_duration are unaffected and always returned.

The id path parameter must be a UUID. Non-UUID values return an empty array.

Request

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

For a specific stay, package and party size:

curl "https://charter.boats/api/boats/3a121be0-c1f8-4432-8e18-4a125b46da65/fees?start=2027-06-12&end=2027-06-19&product=Crewed&guests=6" \
  -H "X-API-Key: YOUR_API_KEY"

Response

Returns an array of fee objects.

[
  {
    "id": "f044b733-9d67-43c5-9280-4665d3569f63",
    "boat_id": "3a121be0-c1f8-4432-8e18-4a125b46da65",
    "description": "End cleaning Tranz log",
    "amount": 360,
    "period": "per_booking",
    "required": true,
    "sort_order": 0,
    "created_at": "2026-04-08T04:54:31.253295+00:00",
    "category": "service",
    "on_request": false,
    "valid_from": "1970-01-01",
    "valid_to": "2124-10-16",
    "min_duration": null,
    "max_duration": 365,
    "amount_is_percentage": false,
    "calculation_type": "separate_payment",
    "product_name": "Crewed"
  },
  {
    "id": "747f015b-c7fb-45fe-98ef-044468cd814b",
    "boat_id": "3a121be0-c1f8-4432-8e18-4a125b46da65",
    "description": "Skipper (+ food)",
    "amount": 170,
    "period": "per_day",
    "required": true,
    "sort_order": 0,
    "created_at": "2026-04-08T04:54:31.253295+00:00",
    "category": "service",
    "on_request": false,
    "valid_from": "1970-01-01",
    "valid_to": "2127-06-21",
    "min_duration": null,
    "max_duration": 365,
    "amount_is_percentage": false,
    "calculation_type": "separate_payment",
    "product_name": "Crewed"
  }
]

Response Fields

FieldTypeDescription
idstringFee ID (UUID)
boat_idstringBoat this fee belongs to
descriptionstringFee name/description
amountnumberFee amount in the boat's operator currency (or a percentage if amount_is_percentage is true — see Percentage fees)
periodstringBilling period (see below)
requiredbooleanIf true, fee is mandatory for every booking
categorystring | nullFee category (e.g. service, equipment)
on_requestbooleanIf true, fee must be requested separately
sort_orderintegerDisplay order
valid_fromstring | nullStart date of validity period (YYYY-MM-DD)
valid_tostring | nullEnd date of validity period (YYYY-MM-DD)
amount_is_percentagebooleanWhether amount is a percentage rather than a fixed value
percentage_basestring | nullOnly on percentage fees of Nausys-priced boats: what the percentage is taken of, as Nausys names it — e.g. DAILY_PRICE (the per-day charter price), CLIENT_PRICE_WITH_EXTRAS_ADVANCE_PAYMENT (the charter price plus the other advance-paid extras). Absent elsewhere, where a percentage is of the charter price for the stay
calculation_typestring | nullHow the fee is settled: advance_payment is collected online with the charter payment; separate_payment is paid at the base; included_in_price is informational; null means the operator did not declare it and it is settled at the base
min_durationinteger | nullMinimum charter length, in nights, for this fee to apply
max_durationinteger | nullMaximum charter length, in nights, for this fee to apply
product_namestring | nullProduct/package variant this fee belongs to (e.g. Bareboat, Crewed)
created_atstringISO 8601 timestamp

Fee Periods

PeriodDescription
per_bookingCharged once per booking
per_dayMultiplied by the number of nights
per_personCharged per guest
per_person_per_dayPer guest per night of the charter
per_person_per_nightPer guest per night
per_person_per_weekPer guest per started week
per_weekCharged per started week
one_wayOne-way delivery fee

Percentage fees

When amount_is_percentage is true, amount is a percentage of a base — the charter price for the whole stay unless percentage_base names another. It applies once to that base: the period does not multiply it by nights or weeks, only a per-person period multiplies it by the number of guests. A per_day fee of 10 with amount_is_percentage: true on a €1,400 week is €140, not €980.

The example on Resolve Pricing costs every period this way.

On this page