Public endpoints that power the customer-facing booking widget, cancellation flows, participant management, and membership enrollment. These endpoints do not require admin authentication.
Public API
Get customer inventory data
GET /public/customer
Retrieves all inventory items for a customer including locations, pricing, and bookings. Response is AES encrypted.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
customer_id | query | string | Yes | The customer ID |
Responses
| Code | Description |
|---|---|
200 | Encrypted inventory data |
400 | Missing customer_id parameter |
500 | Server error |
Get minimal inventory info for embed widget
GET /public/widget-info
Returns unencrypted minimal boat data (name, image, price, capacity, category) for use by the embed-booking.js widget on third-party sites.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
customer_id | query | string | Yes | |
inventory_id | query | string | Yes |
Responses
| Code | Description |
|---|---|
200 | Minimal inventory info |
400 | Missing required parameters |
404 | Inventory not found |
Get booking details
GET /public/booking
Retrieves details for a specific booking by transaction ID
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
TransactionId | query | string | Yes | The rental/transaction ID |
Responses
| Code | Description |
|---|---|
200 | Booking details |
400 | Missing TransactionId parameter |
500 | Server error |
Update booking
PATCH /public/booking
Updates booking fields using dynamic field paths
Request body
| Field | Type | Required | Description |
|---|---|---|---|
rentalId | string | Yes | |
data | object | No | Key-value pairs of fields to update (supports dot notation) |
Responses
| Code | Description |
|---|---|
200 | Updated booking data |
400 | Missing data or rentalId |
500 | Server error |
Get order with all line items
GET /public/order/{orderId}
Resolves orderId as bookingId, bundleGroupId, or single rentalId and returns grouped line items
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
orderId | path | string | Yes | The order ID (bookingId, bundleGroupId, or rentalId) |
Responses
| Code | Description |
|---|---|
200 | Order with line items |
404 | Order not found |
500 | Server error |
Check asset availability
GET /public/check-availability
Checks if a specific asset is available during a time range
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
inventoryId | query | string | Yes | The inventory ID |
assetId | query | string | Yes | The asset ID |
startUtc | query | integer | Yes | Start time as Unix timestamp |
endUtc | query | integer | Yes | End time as Unix timestamp |
excludeRentalId | query | string | No | Rental ID to exclude from availability check |
Responses
| Code | Description |
|---|---|
200 | Availability status |
400 | Missing required parameters |
500 | Server error |
Get available staff
GET /public/available-staff
Retrieves staff members available for a location with a specific skill during a time range
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
locationId | query | string | Yes | The location ID |
skill | query | string | Yes | The required skill (coach, captain, trainer, operations) |
startTime | query | string | Yes | Start time in ISO format |
endTime | query | string | Yes | End time in ISO format |
Responses
| Code | Description |
|---|---|
200 | List of available staff |
400 | Missing required parameters |
500 | Server error |
Get available staff for date range
GET /public/available-staff-range
Retrieves staff availability by skill for each day in a date range
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
locationId | query | string | Yes | The location ID |
start | query | string | Yes | Start date in ISO format |
end | query | string | Yes | End date in ISO format |
Responses
| Code | Description |
|---|---|
200 | Staff availability by day and skill |
400 | Missing required parameters |
500 | Server error |
Add to waitlist
POST /public/waitlist
Adds a customer to the waitlist for an inventory item
Request body
| Field | Type | Required | Description |
|---|---|---|---|
firstName | string | Yes | |
lastName | string | Yes | |
email | string | Yes | |
date | string | Yes | |
time | string | No | |
duration | integer | No | |
inventoryId | string | Yes | |
locationId | string | Yes | |
customerId | string | No | |
addons | array | No | |
boatAddons | array | No | |
giftCardCode | string | No | |
refAffiliate | string | No |
Responses
| Code | Description |
|---|---|
201 | Waitlist entry created successfully |
400 | Missing required fields |
500 | Server error |
Save cart recovery data
POST /public/cartRecovery
Saves or updates cart recovery data for abandoned cart emails
Request body
| Field | Type | Required | Description |
|---|---|---|---|
id | string | Yes | |
firstName | string | No | |
lastName | string | No | |
email | string | Yes | |
bookingInfo | object | No | |
locationId | string | Yes | |
cartData | object | No | |
customerId | string | No |
Responses
| Code | Description |
|---|---|
200 | Cart recovery data saved |
400 | Missing required fields or invalid email |
500 | Server error |
Get cart recovery data
GET /public/cartRecovery/{id}
Retrieves cart recovery data by stable ID
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | The cart recovery ID |
Responses
| Code | Description |
|---|---|
200 | Cart recovery data |
400 | Recovery ID required |
404 | Cart recovery data not found |
500 | Server error |
Mark cart recovery as completed
DELETE /public/cartRecovery/{id}
Marks a cart recovery record as completed (booking was finished)
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | The cart recovery ID |
Responses
| Code | Description |
|---|---|
200 | Cart recovery marked as completed |
400 | Recovery ID required |
500 | Server error |
Get cart recovery analytics
GET /public/cartRecovery/analytics/{locationId}
Retrieves cart recovery analytics for a location
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
locationId | path | string | Yes | The location ID |
startDate | query | string | No | Start date filter |
endDate | query | string | No | End date filter |
Responses
| Code | Description |
|---|---|
200 | Analytics data |
500 | Server error |
Get monthly availability
GET /public/availability
Retrieves availability for each day in a month for an inventory item
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
inventoryId | query | string | Yes | The inventory ID |
locationId | query | string | Yes | The location ID |
month | query | string | Yes | Month in YYYY-MM format |
timezone | query | string | No | Timezone for date calculations |
Responses
| Code | Description |
|---|---|
200 | Daily availability for the month |
400 | Missing required parameters |
404 | Inventory or location not found |
500 | Server error |
Get custom code integration
GET /public/getCustomCode
Returns custom code integration settings for a customer. Returns 204 if not configured.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
customerId | query | string | Yes | The customer ID |
Responses
| Code | Description |
|---|---|
200 | Custom code configuration |
204 | Custom code not configured |
400 | Missing customerId parameter |
500 | Server error |
Get Google Tag Manager configuration
GET /public/getGTM
Returns GTM configuration for a customer. Returns 204 if not configured.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
customerId | query | string | Yes | The customer ID |
Responses
| Code | Description |
|---|---|
200 | GTM configuration |
204 | GTM not configured |
400 | Missing customerId parameter |
500 | Server error |
Get Meta Conversion API configuration
GET /public/getMetaConversion
Returns Meta Conversion API (Facebook Pixel) configuration. Returns 204 if not configured.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
customerId | query | string | Yes | The customer ID |
Responses
| Code | Description |
|---|---|
200 | Meta Conversion configuration |
204 | Meta Conversion not configured |
400 | Missing customerId parameter |
500 | Server error |
Get TikTok Pixel configuration
GET /public/getTikTokPixel
Returns TikTok Pixel configuration for a customer. Returns 204 if not configured.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
customerId | query | string | Yes | The customer ID |
Responses
| Code | Description |
|---|---|
200 | TikTok Pixel configuration |
204 | TikTok Pixel not configured |
400 | Missing customerId parameter |
500 | Server error |
Get WhatsApp Business configuration
GET /public/getWhatsApp
Returns WhatsApp Business configuration for a customer
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
customerId | query | string | Yes | The customer ID |
Responses
| Code | Description |
|---|---|
200 | WhatsApp Business configuration |
400 | Missing customerId parameter |
404 | Customer not found or WhatsApp not configured |
500 | Server error |
Add protection plan to booking
POST /public/bookings/{rentalId}/protection-plans
Adds a protection plan to an existing booking and charges the customer
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
rentalId | path | string | Yes | The rental/booking ID |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
planId | string | Yes | |
planName | string | Yes | |
percentage | number | No | |
minimum | number | No | |
price | number | No | |
bookingTotal | number | No | |
calculatedCost | number | Yes |
Responses
| Code | Description |
|---|---|
200 | Protection plan added successfully |
400 | Missing required fields or no payment method |
404 | Booking not found |
500 | Server error |
Add a tip to a booking
POST /public/bookings/{rentalId}/tip
Processes a tip for a completed booking using the customer's stored payment method
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
rentalId | path | string | Yes | The rental/booking ID |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
amount | number | Yes | The tip amount in the booking's currency |
percentage | number | No | The tip percentage (if calculated from booking total) |
Responses
| Code | Description |
|---|---|
200 | Tip processed successfully |
400 | Invalid request or payment failed |
404 | Booking not found |
500 | Server error |
Get Apple Wallet pass data
GET /public/bookings/{rentalId}/apple-wallet
Generates Apple Wallet pass data including QR code for a booking
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
rentalId | path | string | Yes | The rental/booking ID |
Responses
| Code | Description |
|---|---|
200 | Apple Wallet pass data |
404 | Booking not found |
500 | Server error |
Download Apple Wallet pass file
GET /public/bookings/{rentalId}/apple-wallet/download
Downloads the Apple Wallet pass file (.pkpass) for a booking
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
rentalId | path | string | Yes | The rental/booking ID |
Responses
| Code | Description |
|---|---|
200 | PKPass file download |
404 | Booking not found |
500 | Server error |
501 | Apple Wallet not configured |
Get Google Wallet pass data
GET /public/bookings/{rentalId}/google-wallet
Generates Google Wallet pass save URL for a booking
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
rentalId | path | string | Yes | The rental/booking ID |
Responses
| Code | Description |
|---|---|
200 | Google Wallet save URL |
404 | Booking not found |
500 | Server error |
Get detailed day availability
GET /public/day-availability
Retrieves detailed availability for a specific day including time slots and bookings
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
inventoryId | query | string | Yes | The inventory ID |
locationId | query | string | Yes | The location ID |
date | query | string | Yes | Date in YYYY-MM-DD format |
timezone | query | string | No | Timezone for date calculations |
Responses
| Code | Description |
|---|---|
200 | Day availability details |
400 | Missing required parameters |
404 | Inventory or location not found |
500 | Server error |
Get time slot popularity data
GET /public/time-slot-popularity
Returns historical booking popularity data for time slots. Used for "Best Selling" badges.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
inventoryId | query | string | Yes | The inventory ID |
locationId | query | string | Yes | The location ID |
dayOfWeek | query | string | No | Day of week for day-specific popularity |
duration | query | integer | No | Rental duration in hours |
Responses
| Code | Description |
|---|---|
200 | Time slot popularity data |
400 | Missing required parameters |
404 | Location not found |
500 | Server error |
Fetch reviews for a location
POST /public/locations/{locationId}/reviews
Public endpoint to fetch reviews from connected platforms (Google, TripAdvisor) for a location
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
locationId | path | string | Yes | The location ID |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
reviewConnections | array | Yes |
Responses
| Code | Description |
|---|---|
200 | Reviews from connected platforms |
400 | Missing reviewConnections array |
500 | Server error |
Upload document for booking
POST /public/bookings/{rentalId}/documents
Upload insurance or ownership documents for a booking. No authentication required.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
rentalId | path | string | Yes | The rental/booking ID |
Responses
| Code | Description |
|---|---|
200 | Document uploaded successfully |
400 | Missing or invalid parameters |
404 | Booking not found |
500 | Server error |
AI customer assistant
POST /public/customer-sidekick
Customer-facing AI assistant for booking-specific questions
Request body
| Field | Type | Required | Description |
|---|---|---|---|
rentalId | string | Yes | |
message | string | Yes |
Responses
| Code | Description |
|---|---|
200 | AI response |
400 | Missing required fields |
500 | Server error |
AI boat recommendation engine
POST /public/boat-concierge
AI-powered boat recommendation engine to help customers find the perfect boat
Request body
| Field | Type | Required | Description |
|---|---|---|---|
customerId | string | Yes | |
message | string | Yes | |
conversationHistory | array | No | |
selectedDate | string | No | |
locationId | string | No |
Responses
| Code | Description |
|---|---|
200 | AI recommendation response |
400 | Missing required fields |
500 | Server error |
Get public customer settings
GET /public/customer/{customerId}/public
Get public customer settings (loyalty, etc.) for checkout
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
customerId | path | string | Yes | The customer ID |
Responses
| Code | Description |
|---|---|
200 | Public customer settings |
400 | Missing customerId |
404 | Customer not found |
500 | Server error |
Get saved payment methods
GET /public/payment-methods
Get saved payment methods for a Stripe customer
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
stripeCustomerId | query | string | Yes | The Stripe customer ID |
Responses
| Code | Description |
|---|---|
200 | List of payment methods |
400 | Missing stripeCustomerId |
500 | Server error |
Public Cancellation
Request cancellation OTP
POST /public/bookings/{rentalId}/cancellation-otp
Request an OTP code for booking cancellation. Sends OTP to the booking's email address.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
rentalId | path | string | Yes | The rental/booking ID |
Responses
| Code | Description |
|---|---|
200 | OTP sent successfully |
400 | Missing rentalId or no valid email on booking |
404 | Booking not found |
500 | Server error |
Verify cancellation OTP
POST /public/bookings/{rentalId}/verify-cancellation-otp
Verify OTP and return a session token for cancellation
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
rentalId | path | string | Yes | The rental/booking ID |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
sessionId | string | Yes | |
code | string | Yes |
Responses
| Code | Description |
|---|---|
200 | OTP verified successfully |
400 | Invalid or expired session/code |
500 | Server error |
Check cancellation eligibility
GET /public/bookings/{rentalId}/cancellation-eligibility
Check if a booking is eligible for self-service cancellation. No authentication required.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
rentalId | path | string | Yes | The rental/booking ID |
Responses
| Code | Description |
|---|---|
200 | Cancellation eligibility status |
400 | Missing rentalId |
404 | Booking not found |
500 | Server error |
Cancel booking
POST /public/bookings/{rentalId}/cancel
Customer self-service cancellation endpoint. Requires OTP verification via X-OTP-Session header.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
rentalId | path | string | Yes | The rental/booking ID |
X-OTP-Session | header | string | Yes | OTP session token from verification |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
reason | string | No | Reason for cancellation |
Responses
| Code | Description |
|---|---|
200 | Booking cancelled successfully |
400 | Missing rentalId or booking already cancelled |
401 | Invalid or expired session |
403 | Not permitted to cancel or cancellation window closed |
404 | Booking not found |
500 | Server error |
Public Participants
Get booking participants
GET /public/booking/participants
Get all participants for a booking with their waiver status
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
rentalId | query | string | Yes | The rental/booking ID |
Responses
| Code | Description |
|---|---|
200 | List of participants with waiver status |
400 | Missing rentalId parameter |
404 | Booking not found |
500 | Server error |
Add or update participant
POST /public/booking/participants
Add a new participant or update an existing one for a booking
Request body
| Field | Type | Required | Description |
|---|---|---|---|
rentalId | string | Yes | |
participant | object | Yes |
Responses
| Code | Description |
|---|---|
200 | Participant added/updated successfully |
400 | Missing required fields |
404 | Booking not found |
500 | Server error |
Update participant
PUT /public/booking/participants
Update an existing participant for a booking
Request body
| Field | Type | Required | Description |
|---|---|---|---|
rentalId | string | Yes | |
participant | object | Yes |
Responses
| Code | Description |
|---|---|
200 | Participant updated successfully |
400 | Missing required fields or participant ID |
404 | Booking or participant not found |
500 | Server error |
Delete participant
DELETE /public/booking/participants/{participantId}
Remove a participant from a booking
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
participantId | path | string | Yes | The participant ID to delete |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
rentalId | string | Yes |
Responses
| Code | Description |
|---|---|
200 | Participant deleted successfully |
400 | Missing required fields |
404 | Booking not found |
500 | Server error |
Send waiver email
POST /public/booking/send-waiver-email
Send a waiver completion email to a participant
Request body
| Field | Type | Required | Description |
|---|---|---|---|
rentalId | string | No | |
participantId | string | No | |
email | string | Yes | |
firstName | string | No | |
lastName | string | No | |
waiverUrl | string | Yes | |
locationId | string | No |
Responses
| Code | Description |
|---|---|
200 | Waiver email sent successfully |
400 | Missing required fields |
500 | Server error |
Send waiver SMS
POST /public/booking/send-waiver-sms
Send a waiver completion SMS to a participant
Request body
| Field | Type | Required | Description |
|---|---|---|---|
rentalId | string | No | |
participantId | string | No | |
phoneNumber | string | Yes | |
firstName | string | No | |
lastName | string | No | |
waiverUrl | string | Yes | |
locationId | string | No |
Responses
| Code | Description |
|---|---|
200 | Waiver SMS sent successfully |
400 | Missing required fields |
500 | Server error |
Process participant payment
POST /public/booking/process-payment
Process a payment for a participant's share of the booking
Request body
| Field | Type | Required | Description |
|---|---|---|---|
rentalId | string | Yes | |
participantId | string | Yes | |
paymentSplit | object | Yes |
Responses
| Code | Description |
|---|---|
200 | Payment processed successfully |
400 | Missing required fields |
404 | Booking or participant not found |
500 | Server error |
Create payment intent
POST /public/booking/create-payment-intent
Create a Stripe payment intent for a participant payment
Request body
| Field | Type | Required | Description |
|---|---|---|---|
rentalId | string | Yes | |
participantId | string | Yes | |
paymentMethodId | string | Yes | |
amount | number | Yes | Amount in cents |
paymentSplit | object | Yes |
Responses
| Code | Description |
|---|---|
200 | Payment intent created successfully |
400 | Missing required fields or payment failed |
404 | Booking or participant not found |
500 | Server error |
Public Memberships
Get public membership tiers
GET /public/memberships/tiers/{locationId}
Get public membership tiers for a location (no auth required). Only returns tiers marked as showToPublic=true.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
locationId | path | string | Yes | The location ID |
Responses
| Code | Description |
|---|---|
200 | List of public membership tiers |
404 | Location not found |
500 | Server error |
Create membership checkout session
POST /public/memberships/checkout
Create a Stripe checkout session for membership signup (no auth required)
Request body
| Field | Type | Required | Description |
|---|---|---|---|
customerId | string | Yes | |
tierId | string | Yes | |
billingCycle | string | Yes | |
renterEmail | string | Yes | |
renterName | string | No | |
renterPhone | string | No | |
renterId | string | No | |
successUrl | string | No | |
cancelUrl | string | No | |
locationId | string | No | |
isInternal | boolean | No |
Responses
| Code | Description |
|---|---|
200 | Checkout session created or membership activated directly |
400 | Missing required fields or tier not available |
404 | Tier or location not found |
500 | Server error |
Get membership details
GET /public/memberships/details/{membershipId}
Get membership details by membership ID (for success page after direct subscription)
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
membershipId | path | string | Yes | The membership ID |
Responses
| Code | Description |
|---|---|
200 | Membership details |
404 | Membership not found |
500 | Server error |
Check membership status
GET /public/memberships/status/{sessionId}
Check status of a membership signup by checkout session ID
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
sessionId | path | string | Yes | The Stripe checkout session ID |
Responses
| Code | Description |
|---|---|
200 | Membership status |
404 | Membership not found |
500 | Server error |
Activate membership
POST /public/memberships/activate
Activate a membership after successful Stripe checkout (no auth required). Called from the success page after Stripe redirects back.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
sessionId | string | Yes | The Stripe checkout session ID |
Responses
| Code | Description |
|---|---|
200 | Membership activated successfully |
400 | Missing sessionId or payment not completed |
404 | Membership not found for this session |
500 | Server error |
Scanner
Scan a license
GET /scanner/scan
Triggers the license scanner and parses the scanned license data.
Responses
| Code | Description |
|---|---|
200 | License scanned successfully |
404 | No license scanned or scanner not triggered |
500 | Scanner error |

