Update Boat
Edit an existing boat listing
Same in API v1.0 and v1.1
/boats/:idEdit the details of a boat your company owns. Send only the fields you want to change; every field left out keeps its value. After every save the boat's completeness is checked again, so an update can publish a boat that became complete — or unpublish one that no longer is.
Authentication
Requires one of:
- API key:
X-API-Keyheader with your API key. This is the way to call it from your own systems. - Session: a signed-in charter.boats session — what the dashboard uses from the browser. Outside charter.boats a request without a key is stopped by bot protection (HTML
403), so integrations should use the key.
Either way, the account must be a member of the company that owns the boat. Changing pricing_source additionally needs an admin or owner of that company.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Boat UUID (a slug is not accepted) |
Request Body
| Field | Type | Description |
|---|---|---|
title | string | Boat name/title |
description | string | Full description, as plain text |
boat_type | string | catamaran, sailboat, yacht, motorboat, gulet, rib, or other |
manufacturer_id | string | The make — an id from List makes. An id no make carries is a 400 |
model | string | The model, as you write it. A changed make or model is matched to our model list again, which is what the make and model search filters read |
capacity | integer | Maximum guests. Cannot be cleared — "" is a 400 |
cabins | integer | Cabins |
berths | integer | Berths |
toilets | integer | Toilets |
rental_type | string | bareboat, skippered or no_licence_needed — the values Import Boat takes. Anything else is a 400 |
min_charter_days | integer | Shortest charter. Used when the boat's first check-in window (check_in_periods) sets no minimalReservationDuration |
deposit_with_waiver | number | The security deposit when the guest takes the damage waiver. On a boat MMK or Nausys prices, the platform's sync writes it whenever the platform states one, over your value |
length_ft | number | Length overall (LOA) in feet. On a boat priced from MMK or Nausys a changed length is pinned, so the next sync keeps your figure |
year | integer | Year built |
location_id | integer | Location id |
instant_book | boolean | Allow instant booking. Refused (400) on boats with one-way (multi-port) availability, and on Nausys-priced boats whose operator has to approve each hold |
skipper | integer|null | 0 = no skipper, 1 = always skippered, null = skipper is an optional add-on |
security_deposit | number | Security deposit amount |
charter_day | integer|null | Charter start weekday (0=Sun … 6=Sat) |
check_in_periods | array|null | Check-in/out windows, stored as sent — the shape Get Boat returns (dateFrom, dateTo, checkInDays, checkOutDays, checkInTime, checkOutTime, minimalReservationDuration). Replaces the whole list. A boat needs this or charter_day to be published |
checkin_time | string|null | Check-in time (e.g. "17:00"). A window's own checkInTime comes first where one covers the date |
checkout_time | string|null | Check-out time (e.g. "09:00"). A window's own checkOutTime comes first where one covers the date |
mmsi | integer | The boat's MMSI, for AIS tracking |
flespi_imei | string | IMEI of the boat's tracker |
flespi_modem_model | string | Model of the boat's tracker |
features | array | Equipment as canonical slugs — replaces the boat's own equipment list; [] clears it. Equipment that comes standard with the boat's model stays on the boat either way. See Feature Vocabulary |
pricing_source | string | direct, mmk, or nausys — which platform prices the boat. Admin or owner only. Switching to mmk or nausys needs the boat to be linked to, and still listed by, that platform |
copy_prices | boolean | With a switch to direct: seed the boat's own seasons and extras from the platform it is leaving, replacing any it already has. Without it a boat switched to direct has no price of its own until you add one |
Sending "" for a number field clears it (stored as null).
Fields not listed are ignored. So are fields a connected platform owns on a boat it prices — on an MMK-priced boat manufacturer_id, model, location_id, skipper and security_deposit, on a Nausys-priced boat manufacturer_id, model, location_id and skipper — which the platform's sync rewrites; they are skipped silently, not rejected. Switch pricing_source to direct to edit them. The four check-in fields are not among them: on a boat MMK or Nausys prices, a value you set is kept by later syncs.
Request
Response
The boat after the update, with the fields your dashboard's boat editor reads, plus:
| Field | Type | Description |
|---|---|---|
is_published | boolean | Whether the boat is published after this save |
missing | array | What the boat still lacks to be published (empty when it is) |
auto_unpublished | boolean | true when this save took a published boat offline because it is no longer complete |
skipped_fees | array | With copy_prices, anything that could not be copied across (always present; usually empty) |
Errors
| Status | Message |
|---|---|
400 | Capacity is required |
400 | rental_type must be one of: bareboat, skippered, no_licence_needed |
400 | manufacturer_id not found |
400 | Instant booking cannot be enabled for boats with multi-port availability. … |
400 | Instant booking is not available for this boat: … |
400 | pricing_source must be direct, mmk or nausys |
400 | This boat is not linked to … |
400 | … no longer lists this boat |
401 | Invalid API key — a key that belongs to no account |
401 | Invalid API key format — a malformed key |
401 | Authentication required — no key and no signed-in session |
403 | Not a company member — you don't belong to the boat's company |
403 | Only the company owner can change the pricing source |
404 | Boat not found |