Charter Boats
Charter Boats API
AI Integrations

Search Boats (AI)

Search charter boats with fuzzy location matching, availability checking, and deal ranking

GET/ai/boats

Search available charter boats by location, type, dates, capacity, and budget. Optimized for AI consumption with fuzzy location matching, availability bitmask filtering, and batch price resolution.

Authentication

No authentication required. Rate limited to 60 requests per 10 minutes (30 for Custom GPT clients).

Query Parameters

ParameterTypeRequiredDescription
locationstringNoDestination name -- marina, city, island, region, or country. Fuzzy matched against location names, cities, states, and countries.
searchstringNoFree-text match against boat title and model.
boat_typestringNoOne of: sailboat, catamaran, yacht, motorboat, gulet
manufacturerstringNoManufacturer name (fuzzy matched, e.g. Bali, Beneteau).
guestsintegerNoMinimum guest capacity (1-50)
date_fromstringNoCharter start date (YYYY-MM-DD). Enables availability filtering and a per-week price summary. Past dates are auto-corrected to the next matching future date.
date_tostringNoCharter end date (YYYY-MM-DD). Typical charters are 7 days (Saturday to Saturday).
price_minnumberNoMinimum price per day in EUR. Ignored when dates are set (weekly prices are used instead).
price_maxnumberNoMaximum price per day in EUR. Ignored when dates are set.
total_maxnumberNoMaximum whole-trip total (charter + required extras) for the requested week. Requires date_from/date_to.
cabinsintegerNoMinimum number of cabins
length_minnumberNoMinimum length in feet
year_minintegerNoMinimum build year
sortstringNoSort order: deals (default), price_low, price_high, newest
limitintegerNoResults to return (default: 5, max: 20)

Request

# Search catamarans in Croatia for 8 guests
curl "https://charter.boats/api/ai/boats?location=Split&boat_type=catamaran&guests=8&sort=deals"
 
# Search with dates for availability + per-week price summary
curl "https://charter.boats/api/ai/boats?location=Split&date_from=2026-07-11&date_to=2026-07-18&limit=2"

Response

{
  "boats": [
    {
      "id": "33a02043-4893-4f6a-8f09-3ca2015d670f",
      "slug": "chaparral-263-sunesta-michelangelo",
      "url": "https://chrtr.me/F4gT65",
      "title": "Michelangelo",
      "boat_type": "motorboat",
      "manufacturer": "Chaparral",
      "model": "263 Sunesta",
      "location": "Port of Split / East Harbour, Split, Croatia",
      "year": 2003,
      "length_ft": 26.2,
      "capacity": 12,
      "cabins": null,
      "toilets": null,
      "skippered": "optional",
      "discounted_price_per_day": 1153,
      "discount_percentage": 0,
      "discount_label": null,
      "price_rank_percentile": 41,
      "currency": "EUR",
      "required_extras": {
        "per_day": 0,
        "per_booking": 0,
        "per_person": 0,
        "per_person_per_day": 0
      },
      "price_summary": "~8071 EUR total for the week of Sat 11 Jul 2026 → Sat 18 Jul 2026, 12 guests. Charter: 8071 EUR (1153/day)",
      "available": true,
      "checkinout_days": ["Saturday"],
      "instant_book": true,
      "hero_image_url": "https://pub-1d6bb2ea901f4e66a126571a99715069.r2.dev/boats/33a02043-4893-4f6a-8f09-3ca2015d670f/images/1775078029669_c7b5af9d.jpg"
    }
  ],
  "inventory": {
    "total_boats": 98,
    "discounted_price_per_day": { "min": 89, "median": 1379, "max": 18234 },
    "capacity": { "min": 2, "max": 38 },
    "length_ft": { "min": 20.5, "max": 177.2 },
    "by_type": { "gulet": 4, "yacht": 19, "sailboat": 52, "catamaran": 7, "motorboat": 16 }
  },
  "location_matched": {
    "id": "21157",
    "name": "Split, West Coast (Zapadna obala)",
    "country": "Croatia"
  },
  "search_url": "https://charter.boats/search?location_id=21157&d=2026-07-11%2C2026-07-18"
}

When no dates are passed, available is omitted, price_summary is null, required_extras is null, and inventory.by_type is only present when boat_type was not filtered.

Response Fields

FieldTypeDescription
boatsarrayMatching boats ranked by the selected sort order
boats[].idstringBoat UUID
boats[].slugstring|nullURL slug
boats[].urlstringShort link to the boat page (https://chrtr.me/<code>)
boats[].titlestringBoat name
boats[].boat_typestringType of boat
boats[].manufacturerstring|nullManufacturer name
boats[].modelstring|nullModel name
boats[].locationstringFormatted location string (marina, city, country)
boats[].yearinteger|nullBuild year
boats[].length_ftnumber|nullLength in feet
boats[].capacityinteger|nullMaximum guests
boats[].cabinsinteger|nullNumber of cabins
boats[].toiletsinteger|nullNumber of heads/toilets
boats[].skipperedboolean|stringtrue (skippered only), false (bareboat), or "optional"
boats[].discounted_price_per_daynumberDaily rate in the boat's currency (already discounted)
boats[].discount_percentagenumberActive discount percentage. 0 if none.
boats[].discount_labelstring|nullDiscount description (e.g. "50% discount"). null when no discount.
boats[].price_rank_percentilenumber|nullWhere this boat's daily rate sits within the matched inventory (0 = cheapest, 100 = most expensive)
boats[].currencystringCurrency code (e.g. EUR)
boats[].required_extrasobject|nullMandatory extras for the quoted week (per_day, per_booking, per_person, per_person_per_day). null when no dates provided.
boats[].price_summarystring|nullHuman-readable total breakdown for the quoted week. null when no dates provided.
boats[].availablebooleanOnly present when a date range was supplied — true if available for the requested week.
boats[].checkinout_daysarrayAllowed check-in/turnover weekday(s), e.g. ["Saturday"]
boats[].instant_bookbooleanWhether the boat supports instant booking
boats[].hero_image_urlstring|nullPrimary boat image URL
inventoryobjectAggregate stats across all boats matching the filters (before limit)
inventory.total_boatsintegerTotal boats matching criteria
inventory.discounted_price_per_dayobject|null{ min, median, max } daily rates
inventory.capacityobject|null{ min, max } guest capacity
inventory.length_ftobject|null{ min, max } length
inventory.by_typeobjectBoat counts per type (only when boat_type not filtered)
location_matchedobject|nullThe location the query resolved to (id, name, country)
search_urlstringLink to full search results on charter.boats
alternativesarrayPresent only when strict results are insufficient — nearby/relaxed matches with match_score, matched, and missed fields added to each boat
alternative_inventoryobjectPresent alongside alternatives — aggregate stats for the broadened search

Location Matching

The location parameter is fuzzy-matched against the database in priority order:

  1. Exact name match (e.g., "Marina Zenta")
  2. City match (e.g., "Split" matches all marinas in Split)
  3. State/region match
  4. Country match (e.g., "Greece" or "Croatia")

When a city or marina is matched, boats from all locations in that city are included. For country/state matches, all locations in the region are searched.

Sort Orders

ValueDescription
dealsBest discounts first, then lowest price (default)
price_lowCheapest per-day rate first
price_highMost expensive first
newestNewest build year first

Boat Details

GET/ai/boats/{id}

Full detail for a single boat: description, specs, 365-day pricing windows, authoritative bookable check-in/check-out slots, fees, discounts, and cancellation policy. The {id} accepts either a boat UUID or a chrtr.me short code.

Request

curl "https://charter.boats/api/ai/boats/3a121be0-c1f8-4432-8e18-4a125b46da65"

Response

{
  "url": "https://chrtr.me/4jiseT",
  "boat": {
    "id": "3a121be0-c1f8-4432-8e18-4a125b46da65",
    "title": "Škuribanda",
    "description": null,
    "boat_type": "sailboat",
    "manufacturer": "Beneteau",
    "year": 2006,
    "length_ft": 39.2,
    "capacity": 8,
    "cabins": 3,
    "berths": 8,
    "toilets": 2,
    "instant_book": true,
    "rental_type": "skippered",
    "charter_schedule": "Check-in Sat from 17:00 to 09:00, minimum 7 nights",
    "security_deposit": 1500,
    "location": {
      "name": "Marina Zenta",
      "city": "Split",
      "country": "Croatia"
    },
    "amenities": []
  },
  "pricing": {
    "horizon_days": 365,
    "currency": "EUR",
    "ranges": [
      { "from": "2026-06-28", "to": "2026-07-03", "price_per_day": 197.51 },
      { "from": "2026-07-12", "to": "2026-07-24", "price_per_day": 213.31 },
      { "from": "2026-09-27", "to": "2026-10-10", "price_per_day": 150.11 }
    ],
    "truncated": false,
    "note": "Price already includes operator_seasonal discount. Every date inside a `ranges[*]` entry IS bookable (subject to `boat.charter_schedule`)..."
  },
  "bookable_slots": {
    "note": "Authoritative list of (check-in, check-out) slots you may quote. `base_price` is the charter total only — ADD fees from `fees.required`...",
    "slots": [
      {
        "type": "skippered",
        "checkin": "2026-06-27T17:00",
        "checkout": "2026-07-04T09:00",
        "nights": 7,
        "base_price": 1382.57
      },
      {
        "type": "skippered",
        "checkin": "2026-07-11T17:00",
        "checkout": "2026-07-18T09:00",
        "nights": 7,
        "base_price": 1493.17
      }
    ],
    "truncated": false
  },
  "fees": {
    "required": [
      { "description": "End cleaning", "amount": 270, "period": "per_booking" },
      { "description": "Tourist tax", "amount": 1.4, "period": "per_person_per_night" },
      { "description": "Service fee", "amount": 45, "period": "per_booking" }
    ],
    "optional": [
      { "description": "SUP Paddle", "amount": 100, "period": "per_booking" },
      { "description": "Skipper (+ food)", "amount": 160, "period": "per_day" }
    ]
  },
  "discounts": {
    "note": "`operator_seasonal` is ALREADY APPLIED to `pricing.ranges[*].price_per_day`. `operator_conditional_offers` and `agent_grants` are NOT applied...",
    "operator_seasonal": [
      {
        "label": "43% discount",
        "value": { "type": "percent", "amount": 43 },
        "applies_to": { "from": "2026-06-28", "to": "2026-07-24" },
        "original_price_per_day": 329.17
      }
    ],
    "operator_conditional_offers": [],
    "agent_grants": []
  },
  "company": {
    "has_members": false,
    "cancellation_policy": "Free cancellation within 24 hours of booking. 50% refund if cancelled 30+ days before arrival. No refund after. Service fees are non-refundable."
  }
}

Response Fields

FieldTypeDescription
urlstring|nullShort link to the boat page
boat.idstringBoat UUID
boat.titlestringBoat name
boat.descriptionstring|nullDescription (trimmed to ~500 chars)
boat.boat_typestring|nullType of boat
boat.manufacturerstring|nullManufacturer name
boat.yearinteger|nullBuild year
boat.length_ftnumber|nullLength in feet
boat.capacityinteger|nullMaximum guests
boat.cabinsinteger|nullNumber of cabins
boat.berthsinteger|nullNumber of berths
boat.toiletsinteger|nullNumber of heads/toilets
boat.instant_bookbooleanWhether instant booking is supported
boat.rental_typestring|nulle.g. skippered, bareboat
boat.charter_schedulestring|nullHuman-readable check-in day/time and minimum nights
boat.security_depositnumber|nullSecurity deposit amount
boat.locationobject{ name, city, country } (each may be null)
boat.amenitiesarray{ name, category } entries (max 20)
pricing.horizon_daysintegerLook-ahead window (365)
pricing.currencystringCurrency code
pricing.rangesarrayContiguous available date windows with from, to, price_per_day (discount already applied)
pricing.truncatedbooleantrue if more than 30 ranges were dropped
pricing.notestringGuidance on how to read pricing
bookable_slots.notestringGuidance on quoting slots
bookable_slots.slotsarrayAuthoritative { type, checkin, checkout, nights, base_price } slots (charter total only)
bookable_slots.truncatedbooleanWhether the slot list was truncated
fees.requiredarrayMandatory { description, amount, period } fees
fees.optionalarrayOptional add-on fees
discounts.notestringGuidance on which discounts are pre-applied
discounts.operator_seasonalarraySeasonal discounts already baked into pricing.ranges
discounts.operator_conditional_offersarrayCoupon-style offers (NOT pre-applied) with visibility, condition, remaining_uses
discounts.agent_grantsarrayAgent-granted discounts (NOT pre-applied)
company.has_membersbooleanWhether the operator has staff members responding
company.cancellation_policystringPlain-language cancellation policy

On this page