Import Boat
Import a boat listing with images and amenities
/import/boatImport a new boat listing in a single API call. Handles creating the boat, storing image URLs, linking amenities, and auto-matching to a marina location.
Authentication
Requires API key in the X-API-Key header.
- Owner API key (
cb_live_*): Boat is created under your company automatically. No need to specify owner fields. - Admin API key: Requires
owner_idorowner_emailin the request body to identify who the boat belongs to.
Request Body
Required Fields
| Field | Type | Description |
|---|---|---|
title | string | Boat name/title |
boat_type | string | One of: yacht, catamaran, sailboat, motorboat, rib, other |
capacity | integer | Maximum guests (must be at least 1) |
Optional Fields
| Field | Type | Default | Description |
|---|---|---|---|
description | string | Full description (supports markdown) | |
price_per_day | number | Daily rate | |
length_ft | number | Length in feet | |
year | integer | Year built | |
cabins | integer | Number of cabins | |
berths | integer | Number of berths | |
toilets | integer | Number of toilets | |
model | string | Boat model name | |
manufacturer_name | string | Manufacturer name (looked up or auto-created) | |
rental_type | string | bareboat | bareboat, skippered, or no_licence_needed |
fuel_included | boolean | false | Whether fuel is included |
security_deposit | number | Security deposit amount | |
external_booking_url | string | URL for external booking | |
instant_book | boolean | false | Allow instant booking |
cancellation_policy | string | moderate | flexible, moderate, or strict |
is_published | boolean | false | Whether the listing is visible to guests |
Location Fields
The endpoint auto-matches to an existing marina by coordinates (within ~1km) or by location name. If coordinates are provided but no match is found, a new location is created.
| Field | Type | Description |
|---|---|---|
location_city | string | City where boat is based |
location_country | string | Country |
location_address | string | Full address or marina name (used for location name matching) |
latitude | number | GPS latitude |
longitude | number | GPS longitude |
Deduplication Fields
When both fields are provided, the endpoint checks for existing imports to prevent duplicates.
| Field | Type | Description |
|---|---|---|
import_source | string | Platform name (e.g. boataround) |
import_source_id | string | Unique ID on that platform |
Owner Identification (admin API key only)
| Field | Type | Description |
|---|---|---|
owner_id | string | User UUID |
owner_email | string | Owner's email (creates user + company if not found) |
owner_name | string | Owner's display name (used when creating new user) |
company_id | string | Assign to a specific company (overrides auto-detection) |
Images
Array of image URLs or image objects. The first image is set as primary unless specified otherwise.
| Field | Type | Default | Description |
|---|---|---|---|
images | array | Image URLs (strings) or objects with url and optional is_primary | |
download_images | boolean | false | Download images to server storage instead of keeping source URLs |
Amenities
Array of amenity names (strings). Matched case-insensitively against standard amenities. Unmatched names are saved as custom amenities.
Request
Response
Response Fields
| Field | Type | Description |
|---|---|---|
success | boolean | Whether the import succeeded |
duplicate | boolean | true if an existing boat was returned (same import_source + import_source_id under the same company) |
boat | object | Created (or existing) boat with company, manufacturer, images, and amenities |
images_uploaded | integer | Number of image records created |
images_downloaded | integer | Number of images downloaded to storage (when download_images: true) |
amenities_added | integer | Number of standard amenities matched and linked |
custom_amenities_added | integer | Number of unmatched amenities saved as custom |
view_url | string | Public URL to view the listing |
Deduplication Behavior
When import_source and import_source_id are both provided:
- Same company: Returns the existing boat with
duplicate: true - Different company: Returns
409 Conflict
Errors
| Status | Message |
|---|---|
400 | title is required |
400 | boat_type is required |
400 | boat_type must be one of: yacht, catamaran, sailboat, motorboat, rib, other |
400 | capacity is required and must be at least 1 |
400 | rental_type must be one of: bareboat, skippered, no_licence_needed |
400 | cancellation_policy must be one of: flexible, moderate, strict |
400 | Owner identification required: provide owner_id or owner_email |
401 | API key required. Include X-API-Key header. |
401 | Invalid API key |
409 | This boat has already been imported by another company |