Charter Boats
Charter Boats API
Passages

Get Passage

Get full details for a specific sailing passage

Endpoint

GET /passages/:slug

Description

Retrieve full details for a sailing passage, including route variants submitted by users, departure/arrival location details with images, and nearby POIs at each end.

Supports a direction parameter to view the return route (swaps departure and arrival).

Authentication

No authentication required for server-side requests — this is a public read endpoint. (A key is only needed for cross-origin calls made from a browser on another domain; see Authentication.) Authenticated users additionally see their own variant votes.

Path Parameters

ParameterTypeDescription
slugstringRoute slug (URL-friendly identifier)

Query Parameters

ParameterTypeRequiredDescription
directionstringNoSet to return to view the passage in reverse

Example Request

curl "https://charter.boats/api/passages/sivota-to-anchorage"

Return Direction

curl "https://charter.boats/api/passages/sivota-to-anchorage?direction=return"

Example Response

{
  "id": "7f71404b-e5a5-403c-92b1-93e4a462da42",
  "from_location_id": 2058,
  "to_location_id": 20002,
  "slug": "sivota-to-anchorage",
  "title": "Sivota to Anchorage",
  "description": null,
  "distance_nm": 5.3,
  "typical_duration_hours": null,
  "difficulty": null,
  "rating": null,
  "rating_count": 0,
  "variant_count": 1,
  "geojson": {
    "type": "Feature",
    "geometry": { "type": "LineString", "coordinates": [[20.6837, 38.6219], [20.7139, 38.6720]] },
    "properties": { "segments": 1, "waypoints": 19, "distance_km": 9.9, "distance_nm": 5.3 }
  },
  "created_at": "2026-02-13T11:30:04.296607+00:00",
  "updated_at": "2026-02-13T11:30:04.362704+00:00",
  "from_location": {
    "id": 2058,
    "name": "Sivota",
    "country": "Greece",
    "country_code": "gr",
    "lat": 38.6219613,
    "lon": 20.6837174,
    "harbour_category": "marina",
    "image_url": "https://www.sailionian.com/wp-content/uploads/2020/11/AdobeStock_231717475-700x525.jpeg"
  },
  "to_location": {
    "id": 20002,
    "name": "Anchorage",
    "country": "Greece",
    "country_code": "gr",
    "lat": 38.6720921,
    "lon": 20.7139492,
    "harbour_category": "anchorage",
    "image_url": "https://public-2996.kxcdn.com/uploads/ckeditor/2020/09/18/porto-katsiki-beach-lefkada-island-min.jpg"
  },
  "variants": [
    {
      "id": "7e8b4043-e185-48e8-b480-8bc122368aeb",
      "route_id": "7f71404b-e5a5-403c-92b1-93e4a462da42",
      "user_id": null,
      "name": "Default route",
      "description": null,
      "geojson": { "type": "Feature", "geometry": { "type": "LineString", "coordinates": [] } },
      "waypoints": null,
      "distance_nm": 5.3,
      "min_draft_m": null,
      "notes": null,
      "upvote_count": 0,
      "downvote_count": 0,
      "source": "searoute",
      "is_default": true,
      "created_at": "2026-02-13T11:30:04.362704+00:00",
      "user": null
    }
  ],
  "user_votes": {},
  "from_pois": [
    {
      "distance_meters": 289,
      "poi": {
        "id": "0649f1d0-fb75-41c0-9fa5-0acc3ec31e4d",
        "name": "12 Gods",
        "category": "restaurant",
        "subcategory": "restaurant",
        "rating": 4.3
      }
    }
  ],
  "to_pois": [
    {
      "distance_meters": 181,
      "poi": {
        "id": "af8e2b94-164c-4b2d-93d5-868cebe11fcc",
        "name": "Taverna Pirofani",
        "category": "restaurant",
        "subcategory": "restaurant",
        "rating": null
      }
    }
  ],
  "is_reversed": false
}

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|nullDefault route geometry as a GeoJSON Feature (geometry + properties)
created_at / updated_atstringRow timestamps
from_locationobjectDeparture location with country, harbour_category, image_url, lat, lon, country_code
to_locationobjectArrival location (same shape)
variantsarrayRoute variants sorted by default first, then by votes
variants[].name / .descriptionstring|nullVariant label and notes
variants[].geojsonobjectVariant geometry (GeoJSON Feature)
variants[].distance_nmnumber|nullVariant distance
variants[].min_draft_mnumber|nullMinimum draft for the variant
variants[].sourcestring|nullHow the variant was generated (e.g. searoute)
variants[].is_defaultbooleanWhether this is the default route
variants[].user_idstring|nullAuthor user ID (null for system-generated variants)
variants[].userobject|nullAuthor summary (id, name); null for system-generated variants
variants[].upvote_countnumberNumber of upvotes
variants[].downvote_countnumberNumber of downvotes
user_votesobjectAuthenticated user's votes (variant_id to vote mapping: 1 = up, -1 = down). Empty if not logged in.
from_poisarrayUp to 5 nearest POIs at departure (distance_meters + nested poi)
to_poisarrayUp to 5 nearest POIs at arrival (same shape)
is_reversedbooleantrue when direction=return was used

Notes

  • When direction=return is set, from_location and to_location are swapped, along with from_pois and to_pois.
  • user_votes is only populated for authenticated users. Each key is a variant ID, and the value is 1 (upvote) or -1 (downvote).

Error Responses

404 Not Found

{
  "statusCode": 404,
  "message": "Route not found"
}

On this page