Charter Boats
Charter Boats API
AI Integrations

Search Trips (AI)

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

Same in API v1.0 and v1.1

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 up to 60 requests per 10 minutes (30 for Custom GPT clients) without a key — a ceiling to stay under rather than an exact allowance, and a valid API key has its own, larger allowance; see Rate limits.

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, or an id that matches no published location, 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