# Allegra: yacht charter API for AI assistants

Use this API to help a client learn about Allegra, check whether dates are free, and get an exact price. Charters are sold by Resolute Wind LLC, the yacht's owner company. No sign-in is needed. Every endpoint is a Read tool: it only retrieves information and has no side effects. Nothing here books, holds dates, takes payment or sends messages.

## How to use it

1. **Learn about the yacht**: `GET /v1/discover/boat`, `/v1/discover/itinerary`, `/v1/discover/destinations`, `/v1/discover/charter-rules`, `/v1/discover/policies`, `/v1/discover/questions`.
2. **Check dates**: `GET /v1/availability?start_date=YYYY-MM-DD&nights=N`. The answer is "available", "available on request" (free, but close to another charter, so the owner must confirm) or "unavailable" (with the nearest open dates). To find open dates in a period ("what's open in January?"), `GET /v1/open-dates` lists every open check-in day in up to 92 days, each with its total price.
3. **Get a price**: `GET /v1/quote` with the dates, the number of guests and the payment method, `credit card` or `bank`. Ask the client how they will pay first: the prices differ, paying by bank transfer includes a discount for direct booking, and the method applies to every payment.
4. **Give the next step**: every availability answer and quote has a `next_step` to pass on to the client, word for word.

## Good to know

- Charters are 5 to 7 nights, for up to 8 guests. Dates are the check-in and check-out days, in the yacht's local time.
- Money is in US cents, in whole numbers, in fields whose names end in `_cents`: $1,234 is `123400`. Text written for people (labels, notes, next steps) shows dollars.
- A quote is not a reservation and does not hold the dates.
- Every quote names the seller (Resolute Wind LLC) and repeats the key terms of a booking, such as cancellation and refunds (`key_terms`), so the client sees them with the price before deciding.
- Quotes for dates that are not free are still given, marked unavailable, with other dates to offer.
- Never invent prices or availability: always ask this API.
- Without a key, at most 10 requests per minute per caller address. More get HTTP 429 with a `Retry-After` header giving the seconds to wait.
- Partners (assistant platforms) get an API key from the owner. Send it on every call as `Authorization: Bearer <key>`: calls with a key count against the partner's own allowance instead of the address. A wrong or malformed key gets HTTP 401 (`invalid_api_key`), never an answer without the key.
- Every endpoint starts with `/v1/`. Within this version, changes only add things: new endpoints, new optional parameters, new answer fields. Anything else gets a new version.
- Every answer has an `X-Request-ID` header. Send your own (1 to 64 letters, digits, `.`, `_` or `-`) to have it echoed; quote it when reporting a problem.

## Endpoints

### GET /v1/discover/boat

The yacht: specifications, cabins, crew, amenities, included items, water toys and photos.

Tool class: Read. Side effects: none. It only retrieves information: it books nothing, holds no dates, takes no payment and sends nothing.

Example answer:

```json
{
  "boat_id": "allegra",
  "name": "Allegra",
  "model": "Bali 5.4 sailing catamaran",
  "builder": "Bali Catamarans",
  "year": 2026,
  "length": "55 ft (16.8 m)",
  "beam": "29 ft (8.8 m)",
  "draft": "5 ft (1.5 m)",
  "description": "Allegra is a 55-foot Bali 5.4 catamaran, chartered privately with her own captain and private chef. All-inclusive for up to 8 guests in four private queen cabins, each with its own bathroom and shower. She sails the British Virgin Islands from Village Cay Marina, Road Town, Tortola, with about 1,500 sq ft of living space across the salon, cockpits and flybridge.",
  "cabins": "4 guest cabins with queen beds, each with its own bathroom with shower and its own air conditioning, and 1 crew cabin with 2 twin beds.",
  "crew": "A professional captain and a private chef, dedicated to your party.",
  "max_guests": 8,
  "amenities": [
    "Full air conditioning, controlled separately in every cabin",
    "Bright salon with panoramic views",
    "Flybridge lounge with 360-degree views",
    "Forward cockpit with sun lounges",
    "Aft cockpit for outdoor dining, with shade",
    "Convertible aft deck: a drop-down door turns the aft cockpit into an air-conditioned room in any weather",
    "Hydraulic swim platform",
    "Onboard Wi-Fi",
    "Full-size fridge and freezer",
    "Ice maker and water maker",
    "Generator",
    "Electric toilets"
  ],
  "included": [
    "Your captain and private chef",
    "All meals aboard on your dining plan (Full-Board: 3 meals a day)",
    "Drinks from the ship's bar: wine with meals, spirits, beer and mixers",
    "Fuel for normal cruising",
    "Cruising permits and customs fees within the British Virgin Islands",
    "All water toys",
    "Onboard Wi-Fi",
    "4K drone video and photos of your week",
    "An itinerary planned with your captain around your party"
  ],
  "not_included": [
    "Crew tips (customary 15 to 20% of the charter fee, at your discretion)",
    "Travel to and from Tortola",
    "Premium wines, champagne and spirits beyond the ship's bar",
    "Relocation charges for the US Virgin Islands, St. Martin / St. Barths or other islands (a relocation charge includes dockage away from Village Cay Marina)"
  ],
  "water_toys": [
    "2 paddleboards",
    "2 sea scooters (Seabob)",
    "Water skis and a wakeboard",
    "Floating hammock",
    "Snorkeling gear and fins in every size",
    "Fishing rods",
    "Tender"
  ],
  "photos": [
    {
      "url": "https://www.allegra-yacht.com/assets/specs-hero.webp",
      "caption": "Allegra under sail in the open Caribbean"
    },
    {
      "url": "https://www.allegra-yacht.com/assets/aerial-allegra-anchor.webp",
      "caption": "Allegra from above, at anchor with paddleboards and the swim platform down"
    },
    {
      "url": "https://www.allegra-yacht.com/assets/Home-meet-allegra.webp",
      "caption": "Allegra at anchor in turquoise water"
    },
    {
      "url": "https://www.allegra-yacht.com/assets/aboard-hero.webp",
      "caption": "The salon, with a panoramic view of the coast through the windows"
    },
    {
      "url": "https://www.allegra-yacht.com/assets/Home-gallery-2.webp",
      "caption": "Breakfast table in the salon"
    },
    {
      "url": "https://www.allegra-yacht.com/assets/master-cabin.webp",
      "caption": "The master cabin, with hull windows at water level"
    },
    {
      "url": "https://www.allegra-yacht.com/assets/Home-gallery-7.webp",
      "caption": "A guest cabin in the port hull"
    },
    {
      "url": "https://www.allegra-yacht.com/assets/escape-cta.webp",
      "caption": "View from the flybridge over the bay to a quiet beach"
    },
    {
      "url": "https://www.allegra-yacht.com/assets/Home-water-toys.webp",
      "caption": "Aft deck with water skis, fins, masks and sea scooters ready for the day"
    },
    {
      "url": "https://www.allegra-yacht.com/assets/Home-gallery-8.webp",
      "caption": "Paddleboards on glassy water at sunset"
    },
    {
      "url": "https://www.allegra-yacht.com/assets/Home-gallery-9.webp",
      "caption": "Sushi night by the chef: hand rolls, futomaki and tuna poke"
    },
    {
      "url": "https://www.allegra-yacht.com/assets/top-deck.webp",
      "caption": "Deck plan: flybridge and main deck"
    },
    {
      "url": "https://www.allegra-yacht.com/assets/lower-deck.webp",
      "caption": "Deck plan: cabins, bathrooms and storage"
    }
  ],
  "seller": "Resolute Wind LLC",
  "contact_email": "info@allegra-yacht.com"
}
```

### GET /v1/discover/itinerary

Home base, standard route, seasons and the off-season.

Tool class: Read. Side effects: none. It only retrieves information: it books nothing, holds no dates, takes no payment and sends nothing.

Example answer:

```json
{
  "home_base": "Village Cay Marina, Road Town, Tortola, British Virgin Islands",
  "standard_route": "Every itinerary is planned with your captain around your party. A typical week sails the British Virgin Islands from Village Cay Marina: Norman Island, Jost Van Dyke, Virgin Gorda, Anegada and the quiet coves in between. Most passages are under two hours, in some of the calmest cruising waters anywhere. The US Virgin Islands and St Martin / St Barths are possible for a relocation charge.",
  "seasons": [
    {
      "name": "Winter (high season)",
      "start": "11-01",
      "end": "04-30",
      "description": "December to the end of April brings the steadiest trade winds and the driest weather. It is peak season and books first."
    },
    {
      "name": "Summer (low season)",
      "start": "05-01",
      "end": "07-31",
      "description": "Quieter on the water and a little warmer; easier to book at short notice."
    }
  ],
  "off_season": {
    "start": "08-01",
    "end": "10-31",
    "description": "No charters from Aug 1 to Oct 31, every year."
  },
  "utc_offset": "-04:00"
}
```

### GET /v1/discover/destinations

Cruising areas, each with its relocation charge (bank-transfer and card price) and restrictions.

Tool class: Read. Side effects: none. It only retrieves information: it books nothing, holds no dates, takes no payment and sends nothing.

Example answer:

```json
{
  "destinations": [
    {
      "id": "bvi",
      "name": "British Virgin Islands",
      "home": true,
      "relocation_charge_bank_cents": 0,
      "relocation_charge_card_cents": 0,
      "restrictions": []
    },
    {
      "id": "usvi",
      "name": "US Virgin Islands",
      "home": false,
      "relocation_charge_bank_cents": 150000,
      "relocation_charge_card_cents": 154500,
      "restrictions": [
        "Charged once per charter.",
        "Not available for Christmas or New Year's charters.",
        "The relocation charge includes dockage away from Village Cay Marina."
      ]
    },
    {
      "id": "st-martin",
      "name": "St Martin",
      "home": false,
      "relocation_charge_bank_cents": 300000,
      "relocation_charge_card_cents": 309000,
      "restrictions": [
        "Charged once per charter.",
        "Not available for Christmas or New Year's charters.",
        "The relocation charge includes dockage away from Village Cay Marina.",
        "Needs 48 hours of transit before and after the charter."
      ]
    },
    {
      "id": "st-barths",
      "name": "St Barths",
      "home": false,
      "relocation_charge_bank_cents": 300000,
      "relocation_charge_card_cents": 309000,
      "restrictions": [
        "Charged once per charter.",
        "Not available for Christmas or New Year's charters.",
        "The relocation charge includes dockage away from Village Cay Marina.",
        "Needs 48 hours of transit before and after the charter."
      ]
    }
  ]
}
```

### GET /v1/discover/charter-rules

Charter length, start days, check-in and check-out times, the gap between charters, how far ahead.

Tool class: Read. Side effects: none. It only retrieves information: it books nothing, holds no dates, takes no payment and sends nothing.

Example answer:

```json
{
  "min_nights": 5,
  "max_nights": 7,
  "typical_nights": 7,
  "start_days": "Any day of the week",
  "check_in_time": "12:00",
  "check_out_time": "12:00",
  "utc_offset": "-04:00",
  "preferred_gap_hours": 48,
  "booking_window_years": 2,
  "max_guests": 8,
  "off_season": {
    "start": "08-01",
    "end": "10-31",
    "description": "No charters from Aug 1 to Oct 31, every year."
  },
  "summary": [
    "Charters are 5 to 7 nights; 7 is typical.",
    "Start days: Any day of the week.",
    "Check-in and check-out are at 12:00, local time (UTC-04:00).",
    "48 hours between charters is preferred; dates closer to another charter are \"available on request\" and need the owner's confirmation.",
    "Charters can start up to 2 years ahead.",
    "Up to 8 guests.",
    "No charters from Aug 1 to Oct 31, every year."
  ]
}
```

### GET /v1/discover/policies

Prices by payment method, payment schedule, contract, cancellation and refunds, and deadlines.

Tool class: Read. Side effects: none. It only retrieves information: it books nothing, holds no dates, takes no payment and sends nothing.

Example answer:

```json
{
  "policies": [
    {
      "id": "prices",
      "title": "Card and bank-transfer prices",
      "text": "Every quote is for the payment method you choose. The card price is the published price; paying by bank transfer includes a discount for direct booking, shown on the quote. The method you choose applies to every payment of that booking; changing it later needs a change request."
    },
    {
      "id": "payment-schedule",
      "title": "Payment schedule",
      "text": "Booking 45 or more days before boarding: 25% at booking, 25% within 7 days of the charter contract being signed by both sides, and the final 50% no later than 21 days before boarding. Booking less than 45 days before boarding: 100% at booking. Dates are held only once the first payment is received; if two clients pay for the same dates, the first payment received wins and the other is refunded in full."
    },
    {
      "id": "contract",
      "title": "Charter contract",
      "text": "Every charter has a written charter contract, plus a charter waiver. For bookings 45 or more days out, the contract is sent within 7 days of the deposit and is signed within 10 days of being sent. For later bookings it is sent as fast as possible and signed within 3 days. Where the signed contract differs from these policies, the contract wins."
    },
    {
      "id": "cancellation",
      "title": "Cancellation and refunds",
      "text": "Before the contract is signed, you can cancel for a full refund. After it is signed, cancellation requests go to the owner, and any refund is at the owner's discretion, in line with the contract. If a deadline is missed and the client cannot be reached, the booking may be cancelled and 25% of the charter price kept. If the owner cancels, you get a full refund. Refunds are made by hand, to the way you paid. Trip cancellation insurance is recommended."
    },
    {
      "id": "guest-details",
      "title": "Guest details",
      "text": "Send your guests' names, dietary needs and requests no later than 21 days before boarding, or as soon as possible for late bookings."
    },
    {
      "id": "tips",
      "title": "Crew tips",
      "text": "Crew tips are not included and are not paid through this service. They are customary at 15 to 20% of the charter fee, at your discretion."
    },
    {
      "id": "how-to-book",
      "title": "How to book",
      "text": "Booking through this service opens later. To book or ask about dates today, email info@allegra-yacht.com with your dates, number of guests and route. You must be 18 or older to book."
    }
  ]
}
```

### GET /v1/discover/questions

Answers to common questions, written and approved by the owner.

Tool class: Read. Side effects: none. It only retrieves information: it books nothing, holds no dates, takes no payment and sends nothing.

Example answer:

```json
{
  "questions": [
    {
      "question": "How much does a week aboard Allegra cost?",
      "answer": "Weekly rates run from $32,000 for two guests to $35,000 for eight, all-inclusive, when paying by bank transfer. Charters of 5 or 6 nights are priced from the weekly rate, and Christmas and New Year's have flat prices. Ask for a quote to get the exact price for your dates, guests and payment method."
    },
    {
      "question": "What is included in the price?",
      "answer": "Your captain and private chef, all meals aboard on your dining plan, drinks from the ship's bar, fuel for normal cruising, cruising permits and customs fees within the British Virgin Islands, all water toys, onboard Wi-Fi, and 4K drone video and photos of your week."
    },
    {
      "question": "What is not included?",
      "answer": "Crew tips (customary at 15 to 20% of the charter fee), travel to and from Tortola, premium wines, champagne and spirits beyond the ship's bar, and relocation charges outside the British Virgin Islands. A relocation charge includes dockage away from Village Cay Marina."
    },
    {
      "question": "When is the best time to charter?",
      "answer": "The season runs from November 1 to July 31; the boat is laid up from August 1 to October 31. December to the end of April brings the steadiest trade winds and the driest weather; it is peak season and books first. From May to the end of July it is quieter on the water and easier to book at short notice."
    },
    {
      "question": "How many guests can Allegra take?",
      "answer": "Up to eight guests in four private queen cabins, each with its own bathroom and shower. The layout works for four couples, two families or a group of friends."
    },
    {
      "question": "Is Allegra good for families with children?",
      "answer": "Yes. Short, calm sails between islands, a swim platform at water level, snorkeling gear in every size, and a chef who happily cooks for picky eaters. Young children are welcome; tell us their ages in advance so we can provision for them."
    },
    {
      "question": "Do we need any sailing experience?",
      "answer": "None. Allegra is fully crewed: your captain handles the yacht and your chef handles the galley. You are welcome to take the helm and learn, or never touch a line all week."
    },
    {
      "question": "Where do we sail?",
      "answer": "From Village Cay Marina in Road Town around the British Virgin Islands: Virgin Gorda, Jost Van Dyke, Anegada, Norman Island and the quiet coves in between, planned with your captain. The US Virgin Islands and St Martin / St Barths are possible for a relocation charge, which includes dockage away from Village Cay Marina."
    },
    {
      "question": "What if someone gets seasick or has dietary needs?",
      "answer": "Tell us ahead of time and we will plan around both. The protected waters of the British Virgin Islands are some of the calmest cruising grounds anywhere, and most passages are under two hours. The chef plans the menu around allergies, diets and preferences."
    },
    {
      "question": "How do we get to the boat?",
      "answer": "Fly into Beef Island airport (EIS) on Tortola; Village Cay Marina in Road Town is about 20 minutes away. Check-in is at 12:00 noon."
    },
    {
      "question": "Can we sleep aboard before or after the charter?",
      "answer": "No. Sleeping aboard outside the charter dates is not available."
    }
  ]
}
```

### GET /v1/availability

Whether the yacht is free for these dates: "available", "available on request" or "unavailable".

Unavailable answers include the nearest open dates. Every answer says what to do next.

Tool class: Read. Side effects: none. It only retrieves information: it books nothing, holds no dates, takes no payment and sends nothing.

Parameters:
- `start_date` (required): Check-in day, YYYY-MM-DD. Today or later, within the booking window (see /v1/discover/charter-rules). Example: `2027-01-06`.
- `nights` (required): Number of nights; see /v1/discover/charter-rules for the allowed range. Example: `7`.

Example request:

    GET /v1/availability?start_date=2027-01-06&nights=7

Example answer:

```json
{
  "start_date": "2027-01-06",
  "nights": 7,
  "check_out_date": "2027-01-13",
  "status": "available",
  "reason": "Those dates are free.",
  "next_step": "To book, email info@allegra-yacht.com with these dates, guests and route.",
  "nearest_open_dates": null
}
```

### GET /v1/nearest-dates

The nearest open start dates for the same number of nights, before and after the requested one.

Tool class: Read. Side effects: none. It only retrieves information: it books nothing, holds no dates, takes no payment and sends nothing.

Parameters:
- `start_date` (required): Check-in day, YYYY-MM-DD. Today or later, within the booking window (see /v1/discover/charter-rules). Example: `2027-01-06`.
- `nights` (required): Number of nights; see /v1/discover/charter-rules for the allowed range. Example: `7`.

Example request:

    GET /v1/nearest-dates?start_date=2027-01-06&nights=7

Example answer:

```json
{
  "start_date": "2027-01-06",
  "nights": 7,
  "nearest_open_dates": {
    "earlier": [
      "2026-12-02",
      "2026-12-01"
    ],
    "later": [
      "2027-01-07",
      "2027-01-08",
      "2027-01-09"
    ],
    "earlier_on_request": [
      "2027-01-05",
      "2027-01-04",
      "2026-12-04"
    ],
    "later_on_request": []
  }
}
```

### GET /v1/open-dates

Every check-in day in a range at which the yacht is free for these nights, each with its total price
in US cents for the chosen payment method.

For questions like "what's open in January?": one call instead of a check and a quote per day. Days
that are "available on request" are included and marked. Free days the price rules refuse for the
chosen dining plan or destination (holiday charters) are left out, and `notes` says why. Then get
the itemized quote for the day the client picks.

Tool class: Read. Side effects: none. It only retrieves information: it books nothing, holds no dates, takes no payment and sends nothing.

Parameters:
- `from` (required): First check-in day to look at, YYYY-MM-DD. Today or later. Example: `2027-01-06`.
- `to` (required): Last check-in day to look at, YYYY-MM-DD: on or after `from`, at most 92 days after it, and within the booking window (see /v1/discover/charter-rules). Example: `2027-01-12`.
- `nights` (required): Number of nights; see /v1/discover/charter-rules for the allowed range. Example: `7`.
- `guests` (required): Number of guests; see /v1/discover/boat for the most allowed. Example: `4`.
- `payment_method` (required): How the client will pay: "credit card" or "bank" (bank transfer). Prices differ; the method applies to every payment of a booking. Example: `bank`.
- `dining_plan` (optional): Dining plan id or name (see /v1/discover/boat); default: the yacht's standard plan. Example: `full-board`.
- `destination` (optional): Destination id or name (see /v1/discover/destinations); default: the home waters. Example: `bvi`.

Example request:

    GET /v1/open-dates?from=2027-01-06&to=2027-01-12&nights=7&guests=4&payment_method=bank&dining_plan=full-board&destination=bvi

Example answer:

```json
{
  "from": "2027-01-06",
  "to": "2027-01-12",
  "nights": 7,
  "guests": 4,
  "payment_method": "bank",
  "dining_plan": "full-board",
  "destination": "bvi",
  "currency": "USD",
  "open_dates": [
    {
      "start_date": "2027-01-06",
      "check_out_date": "2027-01-13",
      "status": "available",
      "total_cents": 3300000,
      "holiday": null
    },
    {
      "start_date": "2027-01-07",
      "check_out_date": "2027-01-14",
      "status": "available",
      "total_cents": 3300000,
      "holiday": null
    },
    {
      "start_date": "2027-01-08",
      "check_out_date": "2027-01-15",
      "status": "available",
      "total_cents": 3300000,
      "holiday": null
    },
    {
      "start_date": "2027-01-09",
      "check_out_date": "2027-01-16",
      "status": "available",
      "total_cents": 3300000,
      "holiday": null
    },
    {
      "start_date": "2027-01-10",
      "check_out_date": "2027-01-17",
      "status": "available",
      "total_cents": 3300000,
      "holiday": null
    },
    {
      "start_date": "2027-01-11",
      "check_out_date": "2027-01-18",
      "status": "available",
      "total_cents": 3300000,
      "holiday": null
    },
    {
      "start_date": "2027-01-12",
      "check_out_date": "2027-01-19",
      "status": "available",
      "total_cents": 3300000,
      "holiday": null
    }
  ],
  "notes": [],
  "next_step": "Ask the client which date they prefer, then get its itemized quote and next step from /v1/quote."
}
```

### GET /v1/quote

An itemized price in US cents for the chosen payment method, with the payment schedule if booked today.

Dates that are not free still get a quote, flagged, with the nearest open dates. A quote is not a
reservation and does not hold the dates. Every quote names the seller, the company the client would
book with and pay, and repeats the key terms of a booking, such as cancellation and refunds.

Tool class: Read. Side effects: none. It only retrieves information: it books nothing, holds no dates, takes no payment and sends nothing.

Parameters:
- `start_date` (required): Check-in day, YYYY-MM-DD. Today or later, within the booking window (see /v1/discover/charter-rules). Example: `2027-01-06`.
- `nights` (required): Number of nights; see /v1/discover/charter-rules for the allowed range. Example: `7`.
- `guests` (required): Number of guests; see /v1/discover/boat for the most allowed. Example: `4`.
- `payment_method` (required): How the client will pay: "credit card" or "bank" (bank transfer). Prices differ; the method applies to every payment of a booking. Example: `bank`.
- `dining_plan` (optional): Dining plan id or name (see /v1/discover/boat); default: the yacht's standard plan. Example: `full-board`.
- `destination` (optional): Destination id or name (see /v1/discover/destinations); default: the home waters. Example: `bvi`.

Example request:

    GET /v1/quote?start_date=2027-01-06&nights=7&guests=4&payment_method=bank&dining_plan=full-board&destination=bvi

Example answer:

```json
{
  "start_date": "2027-01-06",
  "nights": 7,
  "check_out_date": "2027-01-13",
  "guests": 4,
  "dining_plan": "full-board",
  "destination": "bvi",
  "payment_method": "bank",
  "currency": "USD",
  "holiday": null,
  "lines": [
    {
      "kind": "base",
      "label": "7 nights, 4 guests",
      "amount_cents": 3300000
    }
  ],
  "total_cents": 3300000,
  "discount_note": "Includes discount for direct booking: $990 off the card price of $33,990",
  "payment_schedule": [
    {
      "label": "Deposit (25%)",
      "amount_cents": 825000,
      "due": "at booking",
      "due_date": null
    },
    {
      "label": "Second payment (25%)",
      "amount_cents": 825000,
      "due": "within 7 days of the contract being signed by both sides",
      "due_date": null
    },
    {
      "label": "Final payment (50%)",
      "amount_cents": 1650000,
      "due": "by 2026-12-16, 21 days before boarding",
      "due_date": "2026-12-16"
    }
  ],
  "availability": {
    "status": "available",
    "reason": "Those dates are free."
  },
  "nearest_open_dates": null,
  "next_step": "To book, email info@allegra-yacht.com with these dates, guests and route.",
  "terms": "Prices as of 2026-10-09; not a reservation; dates are not held.",
  "seller": "Resolute Wind LLC",
  "key_terms": [
    {
      "id": "payment-schedule",
      "title": "Payment schedule",
      "text": "Booking 45 or more days before boarding: 25% at booking, 25% within 7 days of the charter contract being signed by both sides, and the final 50% no later than 21 days before boarding. Booking less than 45 days before boarding: 100% at booking. Dates are held only once the first payment is received; if two clients pay for the same dates, the first payment received wins and the other is refunded in full."
    },
    {
      "id": "contract",
      "title": "Charter contract",
      "text": "Every charter has a written charter contract, plus a charter waiver. For bookings 45 or more days out, the contract is sent within 7 days of the deposit and is signed within 10 days of being sent. For later bookings it is sent as fast as possible and signed within 3 days. Where the signed contract differs from these policies, the contract wins."
    },
    {
      "id": "cancellation",
      "title": "Cancellation and refunds",
      "text": "Before the contract is signed, you can cancel for a full refund. After it is signed, cancellation requests go to the owner, and any refund is at the owner's discretion, in line with the contract. If a deadline is missed and the client cannot be reached, the booking may be cancelled and 25% of the charter price kept. If the owner cancels, you get a full refund. Refunds are made by hand, to the way you paid. Trip cancellation insurance is recommended."
    },
    {
      "id": "tips",
      "title": "Crew tips",
      "text": "Crew tips are not included and are not paid through this service. They are customary at 15 to 20% of the charter fee, at your discretion."
    }
  ]
}
```

## Errors

Every error has the same shape. `code` is machine-readable, `field` names the parameter at fault, `message` says what to change, in plain English, `retryable` says whether the same request can work later unchanged (only when rate limited, HTTP 429, or on a failure on our side, HTTP 5xx), and `request_id` matches the `X-Request-ID` header. Bad requests get HTTP 400, unknown paths HTTP 404.

```json
{
  "error": {
    "code": "invalid_nights",
    "field": "nights",
    "message": "Charters are 5 to 7 nights.",
    "retryable": false,
    "request_id": "req_5f0c3e9a2b7d4c18e6a1f0b9"
  }
}
```
