---
title: "Create a new boat"
method: POST
path: "/api/v1/boats"
tags: ["Boats"]
---

# Create a new boat

`POST /api/v1/boats`

## Request

- Base URL: `http://localhost:3002`
- URL: `http://localhost:3002/api/v1/boats`
- Auth: HTTP bearer

Creates a boat owned by the caller using the full Boat surface (name, type, harbor, capacity, slip info, fuel surcharge, deposit, photos). Pricing tiers are managed separately and are not created by this endpoint.

## Headers

- `Idempotency-Key` string, uuid: Client-supplied UUID v4. Repeat requests with the same key return the cached response.

## Request body

- object
  - `name` string, required
  - `type` 'SAILBOAT' | 'POWERBOAT' | 'PONTOON' | 'JETSKI' | 'KAYAK' | 'CANOE' | 'YACHT' | 'OTHER', required
  - `harborId` string, required
  - `capacity` integer, required
  - `slipNumber` string, nullable
  - `gateCode` string, nullable
  - `slipInstructions` string, nullable
  - `fuelSurchargeEnabled` boolean
  - `fuelSurchargeAmount` integer, nullable
  - `depositType` 'FIXED' | 'PERCENTAGE'
  - `depositValue` integer
  - `photos` string[]

## Response `201`

Created

- object
  - `data` object, required
    - `boat` object, required
      - `id` string, required
      - `ownerId` string, required
      - `name` string, required
      - `type` 'SAILBOAT' | 'POWERBOAT' | 'PONTOON' | 'JETSKI' | 'KAYAK' | 'CANOE' | 'YACHT' | 'OTHER', required
      - `description` string, nullable, required
      - `capacity` integer, required
      - `lengthFeet` integer, nullable, required
      - `year` integer, nullable, required
      - `make` string, nullable, required
      - `model` string, nullable, required
      - `photos` string[], required
      - `features` string[], required
      - `rules` string, nullable, required
      - `depositType` 'FIXED' | 'PERCENTAGE' | 'null', nullable, required
      - `depositValue` integer, nullable, required
      - `fuelSurchargeEnabled` boolean, nullable, required
      - `fuelSurchargeAmount` integer, nullable, required
      - `minimumNoticeHours` integer, required
      - `harborId` string, required
      - `isActive` boolean, required
      - `isListed` boolean, required
      - `slipNumber` string, nullable, required
      - `gateCode` string, nullable, required
      - `slipInstructions` string, nullable, required
      - `createdAt` string, required
      - `updatedAt` string, required

## Other responses

- `400`: Request body or query parameters failed validation.
- `401`: Authentication required, or the bearer token is missing or invalid.
- `403`: Authenticated but not permitted to access this resource.
- `409`: Idempotency-Key was reused with a different request body

---

[API](https://skmtc.dev/chartercaptain/apis/charter-captain-api.md) · [All operations](https://skmtc.dev/chartercaptain/apis/charter-captain-api/llms.txt) · [OpenAPI document](https://skmtc.dev/chartercaptain/apis/charter-captain-api/revisions/1ffea1113adb?raw)
