Search Trips (AI)
Find curated multi-day sailing itineraries with day-by-day plans
/ai/tripsSearch 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
| Parameter | Type | Required | Description |
|---|---|---|---|
location | string | No | Destination 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_id | integer | No | Exact location ID. Takes precedence over location. A value that is not a positive integer returns an empty list with location_unresolved. |
q | string | No | Free-text match against the trip title. |
boat_type | string | No | Filter by the boat type the itinerary was planned for (e.g. catamaran, sailboat) |
min_days | integer | No | Minimum duration_days (see below -- a one-week trip is 8) |
max_days | integer | No | Maximum duration_days |
activities | string | No | Comma-separated POI categories. Matches trips that stop at any of them. Values are the same categories as /ai/pois: restaurant, grocery, fuel, water, entertainment, … |
limit | integer | No | Max 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
Response
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:
Response Fields
| Field | Type | Description |
|---|---|---|
location_matched | object | Present when you sent location: the place it resolved to (id, name, country). A sailing-region match reports id as "region:<Name>". |
trips | array | Matching itineraries sorted by rating then favorites |
trips[].id | string | Trip UUID |
trips[].title | string | Trip title |
trips[].start_location | string | Starting location name (free text) |
trips[].location | string | The published starting location (marina, city, country) |
trips[].duration_days | integer | Calendar days including the departure day (a one-week trip is 8) |
trips[].distance_nm | number|null | Total distance in nautical miles (total_distance_nm) |
trips[].boat_type | string|null | Boat type the itinerary was planned for |
trips[].activities | array | POI categories of the plan's stops (restaurant, grocery, fuel, …) |
trips[].rating | number|null | Average rating |
trips[].review_count | integer | Number of reviews (0 if none) |
trips[].favorite_count | integer | Number of users who favorited this trip (0 if none) |
trips[].url | string | Link to trip page on charter.boats |
no_results | object | Present only when trips is empty. See the zero-results block. |
location_unresolved | string | Present when location (or location_id) matched no place we hold: echoes the term. trips is then empty and no wider search was run. |
note | string | Present only when trips is empty. One-sentence rendering of no_results. |
Trip Details
/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
Response
(days trimmed to one entry.)
Response Fields
| Field | Type | Description |
|---|---|---|
id | string | Trip UUID |
title | string | Trip title |
start_location | string | Starting location name (free text) |
location | string | The published starting location (marina, city, country) |
start_date | string|null | Planned start date |
end_date | string|null | Planned end date |
duration_days | integer | Calendar days including the departure day (a one-week trip is 8) |
total_distance_nm | number|null | Total distance in nautical miles |
boat_type | string|null | Boat type the itinerary was planned for |
activities | array | POI categories of the plan's stops |
highlights | array | Up to 6 trip highlights |
rating | number|null | Average rating |
review_count | integer | Number of reviews (0 if none) |
favorite_count | integer | Number of favorites (0 if none) |
total_sailing_hours | number|null | Total sailing hours across the trip |
days | array | Condensed day-by-day plan |
days[].day | integer | Day number |
days[].date | string|null | Date for this day |
days[].from | string|null | Start marina/location |
days[].to | string|null | End marina/location |
days[].distance_nm | number|null | Distance sailed this day |
days[].stops | array | Up 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[].notes | string | Day notes (trimmed to 200 chars). Absent when the day has none. |
days[].recap | string | Day recap (trimmed to 200 chars). Absent when the day has none. |
url | string | Link to trip page on charter.boats |
Errors
| Status | Message |
|---|---|
400 | Valid trip UUID required |
404 | Trip not found -- also returned for a trip that is not public, or whose starting location is not published |