Charter Boats
Charter Boats API
Passages

List Passages

List sailing passages between locations

Legacy — not maintained. Passages are a dormant data set generated in February 2026 and no longer updated. Many titles are generic ("Anchorage to Anchorage"), an embedded location name is often null, and some endpoints have since been merged into other locations without the geometry being recomputed. For passages boats were actually observed sailing, with measured times, use ais_passages on Get Location.

Endpoint

GET /passages

Description

List sailing passages (routes between two locations) with optional filtering by location and difficulty. Each passage includes distance, difficulty rating, and departure/arrival location details. Only passages whose departure and arrival locations are both published are returned.

Authentication

Send X-API-Key: YOUR_API_KEY on every call from outside charter.boats — without it Cloudflare bot protection answers with an HTML 403 page, not JSON. Call it from your server: this route sends no CORS headers. See Authentication.

Query Parameters

ParameterTypeRequiredDescription
location_idnumberNoFilter passages that start or end at this location. Must be a positive integer — a value that is not answers 400 rather than silently dropping the filter and returning the whole list
difficultystringNoFilter by difficulty level
sortstringNoSort order: distance (default), rating, or variants
limitnumberNoMax results (default: 50, max: 100)
offsetnumberNoPagination offset (default: 0)

Example Request

curl "https://charter.boats/api/passages?sort=distance&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

Example Response

[
  {
    "id": "9f851915-8781-4ebe-a615-4d640ac812c9",
    "from_location_id": 19994,
    "to_location_id": 19995,
    "slug": "anchorage-to-anchorage-19994-19995",
    "title": "Anchorage to Anchorage",
    "description": null,
    "distance_nm": 0.3,
    "typical_duration_hours": null,
    "difficulty": null,
    "rating": null,
    "rating_count": 0,
    "variant_count": 1,
    "geojson": {
      "type": "Feature",
      "geometry": { "type": "LineString", "coordinates": [[20.740625, 38.687375], [20.745375, 38.687875]] },
      "properties": { "segments": 1, "waypoints": 4, "distance_km": 0.5, "distance_nm": 0.3, "fallback_segments": 0 }
    },
    "created_at": "2026-02-13T11:31:44.721131+00:00",
    "updated_at": "2026-02-13T11:31:44.764294+00:00",
    "from_location": {
      "id": 19994,
      "name": "Meganisi Anchorage",
      "country_code": "gr",
      "lat": 38.6874676,
      "lon": 20.7407053
    },
    "to_location": {
      "id": 19995,
      "name": null,
      "country_code": "gr",
      "lat": 38.6880372,
      "lon": 20.7454467
    }
  }
]

Response Fields

FieldTypeDescription
idstringRoute ID (UUID)
from_location_id / to_location_idnumberDeparture / arrival location IDs
slugstringURL-friendly slug
titlestringRoute title
descriptionstring|nullRoute description
distance_nmnumber|nullDistance in nautical miles
difficultystring|nullDifficulty level
typical_duration_hoursnumber|nullEstimated sailing time in hours
ratingnumber|nullAverage rating
rating_countnumberNumber of ratings (0 when none)
variant_countnumber|nullNumber of route variants
geojsonobject|nullRoute geometry as a GeoJSON Feature (geometry LineString + properties with distance_nm, waypoints, etc.)
created_at / updated_atstringRow timestamps
from_locationobjectDeparture location (id, name, country_code, lat, lon). name is the stored name and can be null for an unnamed place
to_locationobjectArrival location (same shape)

In the list endpoint the embedded from_location / to_location carry only id, name, country_code, lat, and lon (no country, image_url, or harbour_category — those appear in Get Passage). country_code is lowercase.

Sort Options

ValueDescription
distanceShortest passages first (default)
ratingHighest rated first
variantsMost route variants first

On this page