Charter Boats
Charter Boats API
Passages

Passages by Location

Get all passages departing from or arriving at a specific location

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/by-location/:id

Description

Retrieve all sailing passages that either depart from or arrive at a specific location. Useful for showing "Sail from here" options on a location detail page.

Results are sorted by distance (shortest passages first). 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.

Path Parameters

ParameterTypeDescription
idnumberNumeric location ID (slugs are not accepted)

Query Parameters

ParameterTypeRequiredDescription
limitnumberNoMax results (default: 20, max: 50)

Example Request

curl "https://charter.boats/api/passages/by-location/21099?limit=5" \
  -H "X-API-Key: YOUR_API_KEY"

Example Response

[
  {
    "id": "ca6df91f-0984-4ce1-a43a-c2bb82d5cc52",
    "from_location_id": 21099,
    "to_location_id": 20010,
    "slug": "sivota-to-bay-svoyrna",
    "title": "Sivota to Bay Svoyrna",
    "description": null,
    "distance_nm": 3.3,
    "typical_duration_hours": null,
    "difficulty": null,
    "rating": null,
    "rating_count": 0,
    "variant_count": 1,
    "geojson": {
      "type": "Feature",
      "geometry": { "type": "LineString", "coordinates": [[20.6837174, 38.6219613], [20.7538605, 38.6263997]] },
      "properties": { "segments": 1, "waypoints": 2, "distance_km": 6.1, "distance_nm": 3.3, "fallback_segments": 1 }
    },
    "created_at": "2026-02-13T11:30:03.869677+00:00",
    "updated_at": "2026-02-13T11:30:04.002968+00:00",
    "from_location": {
      "id": 21099,
      "name": "Lefkas, Marina Sivota",
      "country_code": "gr"
    },
    "to_location": {
      "id": 20010,
      "name": "Bay Svoyrna",
      "country_code": "gr"
    }
  }
]

Response Fields

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

Errors

StatusMessage
400Location ID must be a positive integer
404Location not found

A 404 carries data.moved_to — the surviving location's slug — when the id was absorbed by a location merge; follow it rather than retrying. Until 2026-09-15 a non-numeric id answered 500.

Notes

  • Returns passages where the given location is either the departure or arrival point.
  • Results are sorted by distance ascending (shortest passages first).
  • Includes geojson route geometry. Use Get Passage for full details including variants and POIs.

On this page