Charter Boats
Charter Boats API
Passages

List Passages

List sailing passages between locations

Same in API v1.0 and v1.1

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, 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), or rating/variants — both accepted but fall back to newest-first, stable (routes.rating/variant_count were dropped 2026-09-15, never written)
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,
    "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
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)
rating / variantsAccepted but no longer meaningful (both source columns dropped) — falls back to newest-first, stable

On this page