Export iCal
Export boat calendar as iCal feed
/calendar/:boatId/export.icsGet 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
| Parameter | Type | Description |
|---|---|---|
boatId | string | Boat ID (UUID). A slug is not accepted |
Request
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.
Calendar Contents
The feed includes future events only (events whose end date is after the current time):
| Source | Summary | Status |
|---|---|---|
| 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
/calendar/company/:companyId/export.icsExport 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
— Bufferrather thanBuffer Time.
| Status | Message |
|---|---|
400 | Company ID is required |
404 | Company not found |
404 | No boats found for this company |
Usage Examples
Subscribe in Google Calendar
- Copy the iCal URL:
https://charter.boats/api/calendar/{boatId}/export.ics - In Google Calendar, click
+next to "Other calendars" - Select "From URL"
- Paste the URL and click "Add calendar"
Subscribe in Apple Calendar
- Copy the iCal URL
- In Calendar app, go to File > New Calendar Subscription
- 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
| Status | Message |
|---|---|
400 | Boat ID is required |
404 | Boat not found |