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, 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 — they are what places the boat:

  1. With latitude/longitude, the boat is linked to a known location within roughly 1 km of that point (the first one found, so be precise).
  2. If that finds nothing (or no coordinates were sent), location_address is matched as a substring of a location's name ("ACI Marina Split", not a street address).
  3. If neither matches and you sent coordinates, 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.

location_city and location_state are never used to find a location — a boat sent with only a city and a country 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,
  "amenities_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, and the import cannot publish them: going live needs check-in days, which the import can't set. Open the boat in the dashboard, add its check-in days (and anything else it reports missing — a location, at least one image), and it publishes once complete. Sending "is_published": true changes nothing about this.

Boat Types

The following boat_type values are accepted:

ValueDescription
sailboatSailing yacht
catamaranCatamaran
yachtMotor yacht
motorboatMotorboat
ribRigid inflatable boat
otherAnything else (gulets included)

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