Charter Boats
Charter Boats API
AI Integrations

Search Trips (AI)

Find curated multi-day sailing itineraries with day-by-day plans

GET/ai/trips

Search community-created and AI-generated sailing itineraries. Useful for trip planning -- includes duration, distance, the kinds of stops made, and ratings. Only public itineraries starting from a published location are returned.

Itineraries are hand-built, so coverage is far thinner than the boat and location data: an empty result means we have not written one to match, not that the trip can't be sailed.

Authentication

No authentication required. Sending your key is optional -- see the overview. Shares the /api/ai/* rate limit of 60 requests per 10 minutes (30 for Custom GPT clients).

Query Parameters

ParameterTypeRequiredDescription
locationstringNoDestination name, resolved by the same resolver as boat search (marina, city, island, sailing region or country -- a trailing country or region is understood, as in Nydri, Greece). Finds itineraries whose route passes through the place it resolves to, and the response says which that was in location_matched. A name that resolves to nothing returns an empty list with location_unresolved -- never itineraries somewhere else.
location_idintegerNoExact location ID. Takes precedence over location. A value that is not a positive integer returns an empty list with location_unresolved.
qstringNoFree-text match against the trip title.
boat_typestringNoFilter by the boat type the itinerary was planned for (e.g. catamaran, sailboat)
min_daysintegerNoMinimum duration_days (see below -- a one-week trip is 8)
max_daysintegerNoMaximum duration_days
activitiesstringNoComma-separated POI categories. Matches trips that stop at any of them. Values are the same categories as /ai/pois: restaurant, grocery, fuel, water, entertainment, …
limitintegerNoMax results (default: 5, max: 20)

duration_days counts calendar days including the departure day, so a Saturday-to-Saturday week is 8. To find one-week trips, use min_days=7&max_days=8.

Request

# One-week itineraries in Croatia
curl "https://charter.boats/api/ai/trips?location=Croatia&min_days=7&max_days=8"
 
# Itineraries from Split with restaurant and grocery stops
curl "https://charter.boats/api/ai/trips?location=Split&activities=restaurant,grocery"

Response

{
  "trips": [
    {
      "id": "0cbae6c3-d629-4a2b-965e-50b26e3bd37c",
      "title": "Split 1-Week Catamaran Trip",
      "start_location": "Split",
      "location": "ACI Marina Split, Croatia",
      "duration_days": 8,
      "distance_nm": 85.6,
      "boat_type": "catamaran",
      "activities": ["grocery", "restaurant"],
      "rating": null,
      "review_count": 0,
      "favorite_count": 0,
      "url": "https://charter.boats/trips/0cbae6c3-d629-4a2b-965e-50b26e3bd37c"
    }
  ]
}

When nothing matches, trips is empty and the response carries the shared zero-results block -- no_results (searched, why, try_next) plus a one-line note. searched names the place as resolved, not the term you sent:

{
  "trips": [],
  "no_results": {
    "searched": "near Greece, 7-? days",
    "why": "Itineraries are hand-built, so an empty result means we have not written one to match — not that the trip cannot be sailed.",
    "try_next": [
      "drop `min_days`/`max_days` — itineraries are written to their own length",
      "widen to the region or country, or drop `q`"
    ]
  },
  "note": "Nothing matched near Greece, 7-? days. Itineraries are hand-built, so an empty result means we have not written one to match — not that the trip cannot be sailed. Try: drop `min_days`/`max_days` — itineraries are written to their own length; widen to the region or country, or drop `q`."
}

Response Fields

FieldTypeDescription
location_matchedobjectPresent when you sent location: the place it resolved to (id, name, country). A sailing-region match reports id as "region:<Name>".
tripsarrayMatching itineraries sorted by rating then favorites
trips[].idstringTrip UUID
trips[].titlestringTrip title
trips[].start_locationstringStarting location name (free text)
trips[].locationstringThe published starting location (marina, city, country)
trips[].duration_daysintegerCalendar days including the departure day (a one-week trip is 8)
trips[].distance_nmnumber|nullTotal distance in nautical miles (total_distance_nm)
trips[].boat_typestring|nullBoat type the itinerary was planned for
trips[].activitiesarrayPOI categories of the plan's stops (restaurant, grocery, fuel, …)
trips[].ratingnumber|nullAverage rating
trips[].review_countintegerNumber of reviews (0 if none)
trips[].favorite_countintegerNumber of users who favorited this trip (0 if none)
trips[].urlstringLink to trip page on charter.boats
no_resultsobjectPresent only when trips is empty. See the zero-results block.
location_unresolvedstringPresent when location (or location_id) matched no place we hold: echoes the term. trips is then empty and no wider search was run.
notestringPresent only when trips is empty. One-sentence rendering of no_results.

Trip Details

GET/ai/trips/{id}

Full detail for a single public itinerary, including a condensed day-by-day plan. The {id} must be a trip UUID. Only public trips whose starting location is published are accessible to external callers.

Request

curl "https://charter.boats/api/ai/trips/0cbae6c3-d629-4a2b-965e-50b26e3bd37c"

Response

{
  "id": "0cbae6c3-d629-4a2b-965e-50b26e3bd37c",
  "title": "Split 1-Week Catamaran Trip",
  "start_location": "Split",
  "location": "ACI Marina Split, Croatia",
  "start_date": "2026-09-06",
  "end_date": "2026-09-13",
  "duration_days": 8,
  "total_distance_nm": 85.6,
  "boat_type": "catamaran",
  "activities": ["grocery", "restaurant"],
  "highlights": [
    "Charming Stari Grad with historic harbor",
    "Vibrant Hvar Town with excellent restaurants",
    "Port Bol's renowned fish market on Brač"
  ],
  "rating": null,
  "review_count": 0,
  "favorite_count": 0,
  "total_sailing_hours": 15,
  "days": [
    {
      "day": 2,
      "date": "2026-09-07",
      "from": "ACI Marina Split",
      "to": "Stari Grad",
      "distance_nm": 20.4,
      "stops": [
        { "name": "Stari Grad", "kind": "location", "activity": "Moor in the old town harbour and walk the Stari Grad Plain", "duration_min": null },
        { "name": "Antika", "kind": "poi", "activity": "Dinner ashore", "duration_min": 90 }
      ],
      "notes": "First sailing day. Discover Stari Grad's charming harbor and excellent local cuisine. Swim in historic waters.",
      "recap": "First sailing day. Discover Stari Grad's charming harbor and excellent local cuisine. Swim in historic waters."
    }
  ],
  "url": "https://charter.boats/trips/0cbae6c3-d629-4a2b-965e-50b26e3bd37c"
}

(days trimmed to one entry.)

Response Fields

FieldTypeDescription
idstringTrip UUID
titlestringTrip title
start_locationstringStarting location name (free text)
locationstringThe published starting location (marina, city, country)
start_datestring|nullPlanned start date
end_datestring|nullPlanned end date
duration_daysintegerCalendar days including the departure day (a one-week trip is 8)
total_distance_nmnumber|nullTotal distance in nautical miles
boat_typestring|nullBoat type the itinerary was planned for
activitiesarrayPOI categories of the plan's stops
highlightsarrayUp to 6 trip highlights
ratingnumber|nullAverage rating
review_countintegerNumber of reviews (0 if none)
favorite_countintegerNumber of favorites (0 if none)
total_sailing_hoursnumber|nullTotal sailing hours across the trip
daysarrayCondensed day-by-day plan
days[].dayintegerDay number
days[].datestring|nullDate for this day
days[].fromstring|nullStart marina/location
days[].tostring|nullEnd marina/location
days[].distance_nmnumber|nullDistance sailed this day
days[].stopsarrayUp to 6 places visited on the day, in plan order: name, kind (location | poi), activity (what the plan says to do there, trimmed to 150 chars, or null), duration_min (minutes, null when the plan gives none or the stay is overnight). Sailing legs and on-boat activities are not stops. May be empty; absent when the day has no timeline.
days[].notesstringDay notes (trimmed to 200 chars). Absent when the day has none.
days[].recapstringDay recap (trimmed to 200 chars). Absent when the day has none.
urlstringLink to trip page on charter.boats

Errors

StatusMessage
400Valid trip UUID required
404Trip not found -- also returned for a trip that is not public, or whose starting location is not published

On this page