Resolve Pricing
Get the resolved price for each day in a date range
Same in API v1.0 and v1.1
/boats/:id/pricingResolve the effective daily price for each day in a date range. Each day is matched against the boat's seasonal pricing rules. Days with no season coverage come back with no price. This is a pricing lookup, not an availability check -- see the note under Response Fields.
Only sellable seasons take part: those of the boat's active pricing source (pricing_source on Get Boat — a boat listed on two platforms is priced from the one it is booked through), excluding quotes we can't sell (one-way delivery legs, weeks quoted from another base, implausible partner-side prices).
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.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
id | string | Boat ID (UUID). A slug is not accepted |
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
start | string | Yes | Start date (YYYY-MM-DD) |
end | string | Yes | End date (YYYY-MM-DD) |
product | string | No | Price one product variant (e.g. Bareboat, Crewed — see mmk_products on Get Boat). Seasons with no product stay in play. Without it, the seasons of every product compete for each day under the rules below, so pass it whenever the boat sells more than one package |
The range runs from start up to but not including end — except on a day-clock boat (check-out later in the day than check-in), where the check-out day is a priced day and end is included (see totalDays and charter_unit below).
Request
Response
Response Fields
prices array
| Field | Type | Description |
|---|---|---|
date | string | Date (YYYY-MM-DD) |
price | number | Resolved price for this day; 0 when no season covers it (isPriced: false) |
source | string | Always season |
seasonName | string | Name of the matching season (only present for priced days) |
isPriced | boolean | A season covers this date, so it has a price. Not an availability check -- see the note below |
originalPrice | number | null | Pre-discount price (if a seasonal discount applies) |
discountPercentage | number | null | Active discount percentage |
discountName | string | null | Name of the discount |
Top level
| Field | Type | Description |
|---|---|---|
extras_processing_percent | number | Percentage added to our sale price to cover card processing on the required extras we collect at checkout (calculation_type: advance_payment, or none). Commission is charged on the charter price, so an extra we collect on the operator's behalf earns nothing while the card fees on it are ours; this covers them. The extras themselves pass through to the operator at face value, it is absorbed into the charter price rather than billed as a line, and it applies to no extra settled at the marina and to no optional extra — an operator who would rather not carry it marks the extra separate_payment and collects it at the base. Added 2026-09-19 |
summary object
| Field | Type | Description |
|---|---|---|
totalDays | integer | Charter days priced — the stay's count in charter_unit: its nights on a night boat, its nights + 1 on a day-clock boat (check-out later in the day than check-in, so the check-out day is a priced day) |
charter_unit | string | night, or day on a boat whose check-out is later in the day than its check-in — the unit totalDays counts in, so a 5→12 Oct stay is totalDays: 8, charter_unit: "day" there and 7, "night" elsewhere. Added 2026-09-24 |
pricedDays | integer | Number of days a season covers |
unpricedDays | integer | Number of days no season covers |
subtotal | number | Sum of prices for priced days |
minPrice | number | Lowest daily price among priced days |
maxPrice | number | Highest daily price among priced days |
avgPrice | number | Average daily price among priced days |
subtotal is the charter alone. It does not include the extras processing uplift above,
the boat's own fees, or the flat platform fee — a booking total is charter + extras_processing_percent
of the required extras billed at checkout + those extras + any optional extras chosen + the
platform fee.
This endpoint does not check availability. It reads seasonal pricing only --
it never looks at bookings, blocks or synced calendar events, so a fully booked
week still comes back with every day priced. To find out whether a boat is free,
call GET /api/boats/availability and treat its
blockedDates as nights: the checkout day is handed back in the morning and is
never occupied.
Renamed on 2026-08-05 from isAvailable / availableDays / unavailableDays,
which read as an availability check and were used as one.
Price Sources
- season: The day is priced by a seasonal pricing rule. The matching season's name is included in
seasonName.
Pricing Waterfall
- Season -- a matching season sets the price for the day. Where several seasons cover
the same day, they are resolved in this order:
- The day's own week. A season that starts on the week-start the day falls in,
counted in 7-day steps from the request's
start, wins. Partner feeds return one quote per bookable week, so a boat with two changeover days has two overlapping seasons across almost every night; this picks the one quoted for the week the day actually sits in. A 14-day range therefore takes days 8-14 from week two's own season, not week one's. A partner (MMK or Nausys) season also counts as that week's own when the week-start falls in its check-in window — from its first day to its last day less the length of the quote it was built from — because equal back-to-back partner quotes are stored as one season. - Priority -- higher
prioritywins. - Narrower range -- on equal priority, the season covering fewer days wins, since a week-scoped quote is a fresher figure than the season-wide one it overlaps.
- The day's own week. A season that starts on the week-start the day falls in,
counted in 7-day steps from the request's
- No coverage -- if no season covers the day it has no price (
isPriced: false,price: 0, noseasonName)
A Nausys boat that sells stays shorter than a week is quoted per stay length: a range of exactly N nights (N under 7) takes every day from that length's own quote where one covers it, before any of the rules above, and otherwise falls back to the week's. A week's quote prices any stay of 7 nights or more.
Step 1.1 only breaks ties between seasons that already cover the day -- it never stretches a season or invents a price. A range longer than its own week's season falls through to the remaining rules for the days outside it.
Errors
| Status | Message |
|---|---|
400 | Boat ID must be a UUID |
400 | start and end dates are required |
400 | Dates must be in YYYY-MM-DD format |
404 | Boat not found |
500 | Failed to fetch seasons |
An id that is not UUID-shaped — a slug, for instance — answers 400 without touching the database; a well-formed UUID no boat carries answers 404. Both used to be 500 with Boat not found in the message, so an integration written before 2026-09-15 that keys on the message keeps working.
Use Cases
Calculate Booking Total
Price the stay, then add the required fees. Fees are costed per stay the way charter.boats costs them — a percentage fee applies once, to its base for the whole stay, multiplied only by guests — and they split into what is paid online with the booking and what is settled at the base.
Fees settled at the base (separate_payment, or no calculation_type) are real costs of the charter but are not part of the online payment. Confirm the dates are free with Boat Availability before presenting a total — this endpoint prices booked weeks too.