Charter Boats
Charter Boats API
Pricing

Resolve Pricing

Get the resolved price for each day in a date range

GET/boats/:id/pricing

Resolve 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 are marked unavailable.

Path Parameters

ParameterTypeDescription
idstringBoat ID (UUID)

Query Parameters

ParameterTypeRequiredDescription
startstringYesStart date (YYYY-MM-DD)
endstringYesEnd date (YYYY-MM-DD)
productstringNoRestrict resolution to a single product variant (e.g. Bareboat, Crewed)

The range is exclusive of the end date (i.e., start up to but not including end).

Request

curl "https://charter.boats/api/boats/3a121be0-c1f8-4432-8e18-4a125b46da65/pricing?start=2026-08-01&end=2026-08-08"

Response

{
  "prices": [
    {
      "date": "2026-08-01",
      "price": 213.31,
      "source": "season",
      "seasonName": "High Season 2026",
      "isAvailable": true,
      "originalPrice": 355.5,
      "discountPercentage": 43,
      "discountName": "43% discount"
    },
    {
      "date": "2026-08-02",
      "price": 0,
      "source": "season",
      "isAvailable": false
    },
    {
      "date": "2026-08-03",
      "price": 0,
      "source": "season",
      "isAvailable": false
    },
    {
      "date": "2026-08-04",
      "price": 0,
      "source": "season",
      "isAvailable": false
    },
    {
      "date": "2026-08-05",
      "price": 0,
      "source": "season",
      "isAvailable": false
    },
    {
      "date": "2026-08-06",
      "price": 0,
      "source": "season",
      "isAvailable": false
    },
    {
      "date": "2026-08-07",
      "price": 0,
      "source": "season",
      "isAvailable": false
    }
  ],
  "summary": {
    "totalDays": 7,
    "availableDays": 1,
    "unavailableDays": 6,
    "subtotal": 213.31,
    "minPrice": 213.31,
    "maxPrice": 213.31,
    "avgPrice": 213.31
  }
}

Response Fields

prices array

FieldTypeDescription
datestringDate (YYYY-MM-DD)
pricenumberResolved price for this day (0 if unavailable)
sourcestringAlways season
seasonNamestringName of the matching season (only present for available days)
isAvailablebooleanWhether the date is bookable
originalPricenumber | nullPre-discount price (if a seasonal discount applies)
discountPercentagenumber | nullActive discount percentage
discountNamestring | nullName of the discount

summary object

FieldTypeDescription
totalDaysintegerTotal days in the range
availableDaysintegerNumber of bookable days
unavailableDaysintegerNumber of blocked days
subtotalnumberSum of prices for available days
minPricenumberLowest daily price among available days
maxPricenumberHighest daily price among available days
avgPricenumberAverage daily price among available days

Price Sources

  • season: The day is priced by a seasonal pricing rule. The matching season's name is included in seasonName.

Pricing Waterfall

  1. Season -- the highest-priority matching season sets the price for the day
  2. No coverage -- if no season covers the day, it is unavailable (isAvailable: false, price: 0, no seasonName)

Errors

StatusMessage
400start and end dates are required
400Dates must be in YYYY-MM-DD format

Use Cases

Calculate Booking Total

const res = await fetch(
  `/api/boats/${boatId}/pricing?start=${checkIn}&end=${checkOut}`
);
const { summary } = await res.json();
 
// Add fees
const fees = await fetch(`/api/boats/${boatId}/fees?start=${checkIn}&end=${checkOut}`);
const feeTotal = fees
  .filter(f => f.required)
  .reduce((sum, f) => sum + (f.period === 'per_day' ? f.amount * summary.availableDays : f.amount), 0);
 
const grandTotal = summary.subtotal + feeTotal + 45; // + $45 service fee

Display Calendar Prices

curl "https://charter.boats/api/boats/3a121be0-c1f8-4432-8e18-4a125b46da65/pricing?start=2026-07-01&end=2026-08-01"

On this page