Charter Boats
Charter Boats API
Calendar

Export iCal

Export boat calendar as iCal feed

GET/calendar/:boatId/export.ics

Get an iCal (.ics) feed for a boat's calendar. No API key needed — calendar apps can't send headers, so the feeds are open; if you do send a key it must be a valid one (an invalid API key is refused with 401). The feed can be subscribed to by Google Calendar, Apple Calendar, and other booking platforms.

Path Parameters

ParameterTypeDescription
boatIdstringBoat ID (UUID). A slug is not accepted

Request

curl https://charter.boats/api/calendar/3a121be0-c1f8-4432-8e18-4a125b46da65/export.ics

Response

Returns an iCal file with text/calendar; charset=utf-8 content type, a Content-Disposition header for download, and Cache-Control: no-cache — every fetch is current.

Event times (DTSTART / DTEND) are floating local times — no Z, no TZID. They are the marina's own wall-clock time (a 17:00 check-in reads T170000), so a calendar app shows them as written whatever its time zone. Don't convert them from UTC. DTSTAMP is the exception: it is the UTC instant the feed was generated, as RFC 5545 requires, and carries the Z.

BEGIN:VCALENDAR
PRODID:-//Charter Boats//Calendar//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:Škuribanda - Charter Boats
BEGIN:VEVENT
UID:booking-a1b2c3d4@charter.boats
DTSTAMP:20260910T105119Z
DTSTART:20260919T170000
DTEND:20260926T083000
SUMMARY:Booked - Charter Boats
STATUS:CONFIRMED
TRANSP:OPAQUE
END:VEVENT
BEGIN:VEVENT
UID:booking-e5f6a7b8@charter.boats
DTSTAMP:20260910T105119Z
DTSTART:20261003T170000
DTEND:20261010T083000
SUMMARY:Reserved - Charter Boats
STATUS:TENTATIVE
TRANSP:OPAQUE
END:VEVENT
BEGIN:VEVENT
UID:external-8f570a9e-e154-4801-84a6-0c39457a0216@charter.boats
DTSTAMP:20260910T105119Z
DTSTART:20261010T000000
DTEND:20261017T000000
SUMMARY:Reservation
STATUS:CONFIRMED
TRANSP:OPAQUE
END:VEVENT
BEGIN:VEVENT
UID:block-c9d0e1f2@charter.boats
DTSTAMP:20260910T105119Z
DTSTART:20261101T000000
DTEND:20261103T000000
SUMMARY:Maintenance
STATUS:CONFIRMED
TRANSP:OPAQUE
END:VEVENT
END:VCALENDAR

Calendar Contents

The feed includes future events only (events whose end date is after the current time):

SourceSummaryStatus
Confirmed bookings"Booked - Charter Boats"CONFIRMED
Accepted bookings (held, awaiting payment)"Reserved - Charter Boats"TENTATIVE
Pending bookings"Pending - Charter Boats"TENTATIVE
Owner blocks"Maintenance", "Buffer Time", or "Blocked"CONFIRMED
Synced events (reservations)The source's label — e.g. "Reservation", "Service", or the iCal event's summary — else "Busy"CONFIRMED
Synced events (options)The source's label, e.g. "Option"TENTATIVE

All of these are TRANSP:OPAQUE (busy) except options. The feeds are keyless, so a synced event's label never carries the partner's client name — only the state ("Reservation", "Option", "Service").

If the boat is listed more than once on charter.boats (the same hull under linked listings), the feed carries the events of every linked listing, since they share one calendar.

Event UIDs

Events use stable UIDs scoped to charter.boats:

  • Bookings: booking-{id}@charter.boats
  • Blocks: block-{id}@charter.boats
  • External events: external-{id}@charter.boats

Option Events

Synced events that represent temporary holds (options) are exported as TENTATIVE with TRANSP:TRANSPARENT so they don't block time in receiving calendars. The description reads Option — expires YYYY-MM-DD when the expiry is known, otherwise Option — temporary hold.

Company Feed

GET/calendar/company/:companyId/export.ics

Export every boat in a company as one iCal feed. Each event summary is prefixed with the boat name (e.g. Luxury Catamaran — Booked), so a whole fleet's bookings, blocks, and synced events land in a single calendar. No API key needed. Every event is built by the same builder as the per-boat feed, so UIDs, the time format, the booking statuses (— Booked CONFIRMED, — Reserved and — Pending TENTATIVE) and the option handling (TENTATIVE + TRANSP:TRANSPARENT + expiry description) are identical. One difference:

  • Buffer blocks read — Buffer rather than Buffer Time.
curl https://charter.boats/api/calendar/company/COMPANY_UUID/export.ics
StatusMessage
400Company ID is required
404Company not found
404No boats found for this company

Usage Examples

Subscribe in Google Calendar

  1. Copy the iCal URL: https://charter.boats/api/calendar/{boatId}/export.ics
  2. In Google Calendar, click + next to "Other calendars"
  3. Select "From URL"
  4. Paste the URL and click "Add calendar"

Subscribe in Apple Calendar

  1. Copy the iCal URL
  2. In Calendar app, go to File > New Calendar Subscription
  3. Paste the URL and click Subscribe

Sync with Other Platforms

Most charter platforms allow adding external iCal URLs. Add this export URL as an external calendar in their sync settings. Combined with importing their iCal feed into Charter Boats, this provides two-way calendar sync.

Errors

StatusMessage
400Boat ID is required
404Boat not found

On this page