Charter Boats
Charter Boats API

Quick Start

Start importing boats in under 5 minutes

This guide walks you through importing a boat listing using the Charter Boats API.

Prefer not to write code? You can also add a boat through the dashboard UI at charter.boats/dashboard/boats/new — no API key required. This API guide is for bulk or automated imports.

Prerequisites

Import Your First Boat

1. Prepare your request

Create a JSON payload with your boat details:

{
  "title": "Luxury Catamaran - BALI 4.6",
  "description": "Beautiful 46ft catamaran perfect for island hopping.",
  "boat_type": "catamaran",
  "capacity": 10,
  "manufacturer_name": "Bali",
  "model": "4.6",
  "price_per_day": 2500,
  "latitude": 43.5026,
  "longitude": 16.4307,
  "location_address": "ACI Marina Split",
  "location_city": "Split",
  "location_state": "Croatia",
  "images": [
    "https://example.com/boat-exterior.jpg",
    "https://example.com/boat-interior.jpg"
  ]
}

title, boat_type (see Boat Types) and capacity are the only required fields. See the full field list in the Import Boat reference.

How the marina is found

Send the marina's coordinates, or a known location's location_id — they are what places the boat:

  1. With location_id, that location is used as sent (an id that names no location is a 400).
  2. Otherwise, with latitude/longitude, the boat is linked to the nearest known location within roughly 1 km of that point.
  3. If nothing is that close, a new marina is created there, named after location_address (without one it has no name and shows as its type, "Marina"), with location_state stored as its country.

A name never finds a location — location_address, location_city and location_state only fill in a new marina. A boat sent with neither location_id nor coordinates ends up with no location at all, and a boat without a location cannot be published.

2. Send the request

curl -X POST https://charter.boats/api/import/boat \
  -H "Content-Type: application/json" \
  -H "X-API-Key: YOUR_API_KEY" \
  -d '{
    "title": "Luxury Catamaran - BALI 4.6",
    "boat_type": "catamaran",
    "capacity": 10,
    "manufacturer_name": "Bali",
    "model": "4.6",
    "price_per_day": 2500,
    "latitude": 43.5026,
    "longitude": 16.4307,
    "location_address": "ACI Marina Split",
    "images": ["https://example.com/boat-exterior.jpg"]
  }'

3. Check the response

A successful response returns the created boat:

{
  "success": true,
  "duplicate": false,
  "boat": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "slug": "luxury-catamaran-bali-4-6",
    "title": "Luxury Catamaran - BALI 4.6",
    "boat_type": "catamaran",
    "capacity": 10,
    "location_id": 12908,
    "is_published": false
  },
  "images_uploaded": 1,
  "images_downloaded": 0,
  "features_added": 0,
  "view_url": "https://charter.boats/boats/luxury-catamaran-bali-4-6"
}

Store the boat's id (UUID) — the slug in view_url can change when the listing is renamed.

Imported boats are created unpublished. Going live needs a location, a capacity, at least one image and check-in days (charter_day or check_in_periods, fields of both the import and Update Boat). Send "is_published": true and a complete import is published straight away; otherwise fill what is missing — a location, capacity or check-in days through Update Boat, images in the dashboard — and it publishes once complete.

Boat Types

The following boat_type values are accepted. Leave boat_type out and a boat whose model we already know takes that model's type; a model we don't know yet (or know no type for) needs it sent, or the request is a 400.

ValueDescription
sailboatSailing yacht
catamaranCatamaran
yachtMotor yacht
motorboatMotorboat
guletGulet
ribRigid inflatable boat
otherAnything else (river and canal boats, for example)

Any other value is rejected with 400.

Set Pricing & Availability

Imported boats need pricing before they can be booked. Seasonal prices and fees are configured from the dashboard — these edits are tied to your logged-in session and aren't exposed as keyed API endpoints. To read the resulting price for specific dates, use Resolve Pricing; for the raw seasonal rules, see Seasonal Pricing.

What's Next

On this page