Charter Boats
Charter Boats API
Agent API

Agent Search

Dense agent search revealing platform, deeplinks, per-week availability, options, and commission preview

GET/agent/boats

The dense "one boat per line" agent feed. It reuses the same matching and value-ordering as the consumer search, then re-fetches each match with agent-only columns and enriches it for the requested week.

Authentication

Logged-in session as an active agent. Returns 401 when not logged in, 403 when the session has no active agent profile. See the Agent API overview.

Query Parameters

Accepts the same parameters as the consumer search (GET /api/boats). All are optional; with none, it returns the value-ranked default set.

ParameterTypeDescription
location_idintegerLocation to search (marina/city/region resolved server-side).
location_type + location_valuestringAlternative to location_id — e.g. location_type=text&location_value=Lefkada. Named sailing regions (Dalmatia, the Dodecanese) resolve too. A value that matches no known place returns an empty result set rather than boats from elsewhere.
country_codestringNarrows a location_type of state, city or municipality to one country (e.g. GR). Ignored for country, text and location_id.
typestringBoat type(s), comma-separated: sailboat, catamaran, yacht, motorboat, gulet, rib.
dstringCharter dates as YYYY-MM-DD,YYYY-MM-DD (Saturday→Saturday). A range spanning several charter weeks is priced as all of them — a fortnight is week 1 + week 2. A single date does not reliably availability-filter — always pass a range.
guestsintegerMinimum capacity — only boats with capacityguests match. Also folds per-person required extras into the quoted price.
priceMin / priceMaxnumberDaily-rate bounds (EUR).
cabins / berths / toiletsintegerMinimum counts.
lengthMin / lengthMaxnumberLength bounds (feet).
yearMin / yearMaxintegerBuild-year bounds.
rentalTypesstringComma-separated: bareboat, skippered, no_licence_needed. no_licence_needed means the operator asks no licence of the charterer — it does not mean a skipper comes with the boat.
featuresstringComma-separated equipment slugs.
manufacturerSlugstringManufacturer filter.
makesstringComma-separated make/model filter: bali (whole make) or bali:4.2 (one model). Same semantics as GET /api/boats. Use this — not q — to search by model.
qstringBoat NAME filter — matched against the boat's title only, never its model. For a make or model, use makes.
sort or sortBystringrecommended (default, best value first), price-low, price-high, rating (aliases price_asc / price_desc accepted).
limitintegerResults to return. Default 20, max 50.
offsetintegerNumber of results to skip.

Request

# Requires an authenticated agent session (cookie); an API key does not authenticate here.
curl "https://charter.boats/api/agent/boats?location_id=11336&d=2026-10-03,2026-10-10&guests=6" \
  -H "Cookie: <charter.boats session cookie>"

Response

{
  "boats": [
    {
      "id": "3a121be0-c1f8-4432-8e18-4a125b46da65",
      "slug": "beneteau-oceanis-40",
      "title": "Škuribanda",
      "model": "Oceanis 40",
      "boat_type": "sailboat",
      "year": 2006,
      "capacity": 8,
      "cabins": 3,
      "berths": 8,
      "heads": 2,
      "length_ft": 39.2,
      "average_rating": null,
      "review_count": 0,
      "hero_image_url": "https://media.charter.boats/boats/3a121be0-c1f8-4432-8e18-4a125b46da65/images/<image-id>_hero.jpg",
      "images": [
        "https://media.charter.boats/boats/3a121be0-c1f8-4432-8e18-4a125b46da65/images/<image-id>_hero.jpg",
        "https://media.charter.boats/boats/3a121be0-c1f8-4432-8e18-4a125b46da65/images/<image-id>_hero.jpg"
      ],
      "series": [
        { "w": 0, "start": "2026-09-05", "price": 0, "avail": false, "option": false, "booked": true },
        { "w": 1, "start": "2026-09-12", "price": 512, "avail": true, "option": true, "booked": false }
      ],
      "manufacturer": { "id": "…", "name": "Beneteau", "slug": "beneteau", "logo_url": null },
      "brand": "Beneteau",
      "location": { "id": 11336, "name": "D-Marin Lefkas", "city": "Lefkada", "country": "Greece", "country_code": "GR" },
      "currency": "EUR",
      "features": [{ "label": "Bimini", "slug": "bimini" }, { "label": "Autopilot", "slug": "autopilot" }, { "label": "Bow thruster", "slug": "bow_thruster" }],
      "deposit": 1500,
      "platform": "nausys",
      "rank": 0.31,
      "similar": false,
      "price": {
        "amount": 3381,
        "unit": "week",
        "weeks": 1,
        "nights": 7,
        "week_start": null,
        "discount_pct": 12,
        "required_extras": 465,
        "required_extras_unit": "stay",
        "required_extras_from": false,
        "rental": "bareboat",
        "payment_terms": "50% now · 50% 30 days before"
      },
      "week": {
        "index": 4,
        "available": true,
        "price_per_day": 483,
        "discount_pct": 12,
        "charter_total": 3381,
        "required_extras": 465,
        "required_extras_from": false,
        "all_in": 3846
      },
      "commission_preview": { "estimate": 0, "gated": true, "exact": false },
      "links": {
        "mmk": null,
        "nausys": "https://agency.nausys.com/NauSYS-agency/app/yachtReservations.xhtml"
      },
      "booked_12m_pct": 52,
      "options": [
        { "start": "2026-10-17", "end": "2026-10-24", "expires": "2026-09-20" }
      ],
      "activity": { "option": false, "booked": false, "last_option_at": null }
    }
  ],
  "total": 42,
  "agent": { "split_percent": <your split>, "commission_gated": true }
}

When no d week is passed, price.unit is "day" (amount is the daily rate), price.weeks/price.nights are null, week.index is -1, and week.available is null.

The response carries no pagination cursor (hasMore / next_offset): page with offset + limit against total.

Response Fields

FieldTypeDescription
boats[].idstringBoat UUID
boats[].slugstring|nullURL slug
boats[].titlestringBoat name (falls back to model when the boat has no valid name)
boats[].modelstring|nullModel name
boats[].brandstring|nullManufacturer name
boats[].manufacturerobject|null{ id, name, slug, logo_url }
boats[].boat_typestringType of boat
boats[].year / capacity / cabins / berths / heads / length_ftnumber|nullSpecs. length_ft is length overall (LOA).
boats[].average_rating / review_countnumber|nullGuest review summary
boats[].locationobject{ id, name, city, country, country_code }
boats[].currencystringCurrency code (operator's base currency, default EUR)
boats[].hero_image_urlstring|nullThe boat's hero image, 1200×800 variant on media.charter.boats
boats[].imagesstring[]Up to 5 gallery images, ordered with the same category-diverse logic as the boat detail hero. Served as the 1200×800 WebP variant on media.charter.boats — hotlink these directly; the un-resized original is not a public URL.
boats[].seriesobject[]Forward price/availability series for the graph: one entry per week from the current week, up to 26 weeks (fewer near the end of the 52-week window). { w, start, price, avail, option, booked }w week index, start that week's start date on this boat's own changeover day, price the per-day price for that week (0 = not sold that week, never free), avail free in the availability calendar, option / booked whether a hold or a booking covers it.
boats[].featuresobject[]Equipment & amenities: { label, slug }label is the display spelling matching the detail page, slug the canonical filterable feature (or null for non-canonical items)
boats[].depositnumber|nullSecurity deposit (null when none is set)
boats[].platformstringAgent-only. Source pricing platform: mmk, nausys, or direct. Marks the price-of-record deeplink.
boats[].ranknumber|nullValue rank used by recommended ordering (lower = better value; null when the boat has no bookable priced week)
boats[].priceobjectHeadline price: amount + unit (week when a date is set, else day), weeks/nights (the span amount covers — a fortnight search returns weeks: 2, nights: 14, and amount is both weeks at their own rates), discount_pct, required_extras, rental (bareboat / skippered / skipper optional / skipper required (paid extra)), payment_terms. When the boat cannot be sold in the requested week — it has no price for it, or it is already booked in it — the price comes from the nearest week it can be sold in among the weeks it was matched on (for a similar backfill boat that includes ±1 week), and week_start carries that week's start on this boat's own changeover day, which is not always a Saturday. week_start is null when the price is for the week you asked for — and also when the boat has no sellable week in range, in which case the quote stays on the requested week and amount can be 0 (nothing to sell). required_extras is a charter-length total (per-person parts only once guests is set); with no date it is the boat's cheapest priced week, not 0 — a mandatory fee belongs to the boat, not to the dates. required_extras_unit says which span it covers (stay with dates, week without, where amount is per day), and required_extras_from is true when the figure is a floor — no priced week charges less and one charges more.
boats[].weekobjectSelected-week detail: index (the requested week in the rolling 52-week window), available (whether that requested week is free), and price_per_day, discount_pct, charter_total, required_extras, required_extras_from, all_in — these price figures come from the same quoted week as price (see week_start). index=-1 / available=null when no week is set.
boats[].commission_previewobjectAgent-only. { estimate, gated, exact }. A rough pre-booking estimate; estimate is 0 while gated (the agent has no prior booking yet). Never exact pre-booking.
boats[].linksobjectAgent-only. { mmk, nausys } deeplinks (a platform key is null when the boat isn't on it).
boats[].similarbooleantrue for nearby/flexible backfill boats appended after the strict matches — the UI groups these under a "Similar boats" divider
boats[].booked_12m_pctnumberShare of the next 52 weeks covered by a blocking event that is not an option — partner bookings, and owner/calendar blocks too
boats[].optionsarrayHolds over the next 12 months, soonest first, at most 8: { start, end, expires } (expires may be null)
boats[].activityobject{ option, booked, last_option_at }option / booked describe the selected week (false when no week is set); last_option_at is when the most recent hold on this boat was placed, across the next 12 months
totalintegerTotal boats matching the filters (before limit); similar backfill boats are not counted
agentobjectThe calling agent's { split_percent, commission_gated }split_percent is your own configured split, set on your agent profile; it is not a standard rate

On this page