Location Card
A compact summary of one location — how it is used, where boats go next, and the nearest charter base
Endpoint
Description
A small summary of a single location, built for a map popup or a preview panel. It is the same underlying data as Get Location without the boat listing, the points of interest, or the image gallery — one round trip instead of a page payload.
Two things it adds that the full endpoint does not:
neighborscarry coordinates, so a caller can draw the legs out of this location, and are ordered by how many trips were observed rather than by rating.nearest_baseanswers "where do I charter from, then?" for the majority of locations that have no fleet of their own.
Accepts either a numeric id or a slug.
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 (only the exact GET /api/locations index does). See Authentication.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
id | number | string | Location ID or slug |
Example Request
Example Response
For a place with no fleet of its own, nearest_base is filled in (from /api/locations/atherinos/card):
Response Fields
| Field | Type | Description |
|---|---|---|
name | string | Never null: a place with no name of its own carries its type label (e.g. Anchorage). Where it sits is the separate area field. |
area | string | null | The place's city, or its municipality when no city is recorded. |
type | string | marina, harbour, anchorage, bay, mooring, or spot when no category is recorded. |
blurb | string | null | First sentence of the description, as plain text. |
boat_count | number | Published boats based here, every type — same figure Get Location's boat_count shows; that endpoint's listing_total is a narrower, page-specific number, not this one. |
min_price | number | null | Cheapest published day rate among boats based here. null when no boats are based here. |
poi_counts | object | null | Points of interest nearby, total plus one count per category. null when none are recorded. |
ais | object | null | How the place is used. null when there are too few recorded visits to characterise it. |
ais.kind | string | overnight, day_stop or mixed. |
ais.fullHour | number | null | Local hour by which four in five arrivals have landed — the practical "be there by" time. |
ais.busiestHour | number | null | Local hour with the most MOVEMENTS — arrivals and departures together, which is what "busy" means at a harbour. 🚨 Not an arrival time: at most places it is the morning departure rush. Use fullHour for "when should I turn up". |
ais.boats / ais.stays / ais.observed | number / number / object | The evidence behind the block: distinct boats, recorded stays, and the observation window { from, to }. |
heat | object | null | Berth-density image: url (PNG on media.charter.boats), bounds ([minLat, minLon, maxLat, maxLon], the corners to draw it between), boats, cells. The url carries a ?v=<epoch seconds> version stamp that changes when the image is rebaked — keep it, or a cached older image will be stretched over the new bounds. |
neighbors | array | At most 10 places boats sail to from here: id, slug, name, lat, lon, type, rating, boat_count, plus the fields below. Most-travelled first, then closest. Places with no name are left out. |
neighbors[].pop | number | Distinct boats ever recorded at that neighbour — how popular the place is in its own right, not how many sailed there from here. 0 when unobserved. |
neighbors[].boats_observed | number | null | Distinct boats recorded making this hop. null when unobserved. |
neighbors[].trips | number | null | Observed trips to that location. null means it is merely nearby, not somewhere boats were recorded sailing to. |
neighbors[].hours | number | null | Median door-to-door hours recorded for the hop — harbour to harbour, not time under way. |
neighbors[].nm | number | null | Approximate distance. Estimated for most pairs; treat as indicative. |
neighbors_basis | string | observed, searoute, nearby or none — what produced the list. |
nearest_base | object | null | Closest location with boats to charter, within 40 NM (straight line): { id, slug, name, lat, lon, boat_count, nm }, nm rounded to 0.1. null when this location has its own boats, or when nothing is in range. |
neighbors_basis is worth reading before presenting the list. Only observed means boats were
actually recorded making those trips; the others are proximity, which understates real sailing
distance around headlands.
Errors
| Status | Meaning |
|---|---|
404 | Location not found. If it was merged into another, the body carries data.moved_to with the surviving slug or id. |
500 | Query failed |