Skip to main content

Let's Book API (1.0)

Changelog

2025-11-18

  • Made the url property of a booking nullable when its status is 'draft'
  • Made the phoneNumber property of a customer nullable instead of empty string when not known
  • Added new webhook endpoints
  • Added new webhook requests

2025-10-17

  • Added the booking_fee cost type

2024-05-31

  • Renamed all references from VAT to tax. Legacy VAT properties remain available for backward compatibility but are deprecated.
  • Introduced the /v1/tax-rates endpoint and deprecated the /v1/vat-rates endpoint

Introduction

The Let's Book API follows REST standards. Send parameters as JSON body or form-encoded data. All responses return in JSON format. Every endpoint starts with https://api.letsbook.app. Download the OpenAPI specification at https://support.letsbook.app/api.yaml.

GET requests never modify data and are idempotent. POST/PUT/DELETE requests are not. We use HTTP status codes to communicate errors.

Authentication

Get your API key from the dashboard. Use it as a Bearer Authentication token. The API key is case-sensitive.

Most tools support Bearer Authentication natively. If yours doesn't, construct the Authorization header manually: Authorization: Bearer <API_KEY>.

Example

When your API key is ac11f67b-1dcb-460c-aff3-f1ef35cd3c1c|pMKSUHcHXd7706zhHwBE040alh1BSY9RPsu6ZQ04, configure the header like this:

Authorization: Bearer ac11f67b-1dcb-460c-aff3-f1ef35cd3c1c|pMKSUHcHXd7706zhHwBE040alh1BSY9RPsu6ZQ04

Multiple tenants

If your API user has access to multiple tenants, include the X-Tenant-Id header with every request. Without this header, we default to your primary tenant.

Example

Use the /me endpoint to retrieve all tenants you can access. Then use the id of your desired tenant. For example, if the ID is 9366b305-e315-4abe-ba8a-90e326ad8e81, configure the header like this:

X-Tenant-Id: 9366b305-e315-4abe-ba8a-90e326ad8e81

Me

Retrieves information about the current user. Primarily used to verify that authentication is functioning as expected.

Me

Retrieves user information for the currently authenticated user.

Authorizations:
AuthorizationHeader

Responses

Response Schema: application/json
required
object

Information regarding the authenticated API user

description
required
string

The description of the API key as provided in the dashboard

TenantAccess (object) or null

The primary tenant when no other tenant is selected, or null when the user has no access to any tenant.

required
Array of objects (TenantAccess)

The tenants to which the API key has access

Response samples

Content type
application/json
{
  • "data": {
    • "description": "My app API key",
    • "currentTenant": {
      },
    • "tenants": [
      ]
    }
}

Docks

A dock serves as the pickup and return point for boats. Boats can be moored at docks for specified periods of time.

List all docks

Returns a list of your docks. The docks are sorted by the order as defined in the dashboard. The response is not paginated.

Authorizations:
AuthorizationHeader

Responses

Response Schema: application/json
required
Array of objects (Dock)
Array
id
required
string <uuid>

ID of the Dock

name
required
string

Name of the Dock

slug
required
string

The slug is automatically generated from the name

required
object (DockAddress)

The address of the dock

required
Array of objects (Media)
opensAt
required
string

The time when the dock opens in ISO 8601 format

Response samples

Content type
application/json
{}

Retrieve a dock

Retrieve a Dock object by ID.

Authorizations:
AuthorizationHeader
path Parameters
id
required
string
Example: 8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278

ID of the dock

Responses

Response Schema: application/json
required
object (Dock)

The location from where boats can be picked up

id
required
string <uuid>

ID of the Dock

name
required
string

Name of the Dock

slug
required
string

The slug is automatically generated from the name

required
object (DockAddress)

The address of the dock

required
Array of objects (Media)
opensAt
required
string

The time when the dock opens in ISO 8601 format

Response samples

Content type
application/json
{}

Boat models

A boat model represents a type of boat. Many boat rental companies maintain multiple interchangeable boats of the same type, which we refer to as a boat model.

List all boat models

Returns a list of boat models. The boat models are sorted by the order as defined in the dashboard. The response is not paginated.

Authorizations:
AuthorizationHeader

Responses

Response Schema: application/json
required
Array of objects (BoatModel)
Array
id
required
string <uuid>

ID of the Boat model

name
required
string

Name of the Boat model

slug
required
string

The slug is automatically generated from the name

capacity
required
integer

Number of people the boat can accommodate

shortDescription
required
string

A short description of the boat model

description
required
string

A longer description of the boat model

required
Array of objects (Media)

A list of photos of the boat model

categoryId
required
string or null <uuid>

ID of the category. Can also be null.

Response samples

Content type
application/json
{}

Retrieve a boat model

Retrieve a BoatModel object by ID.

Authorizations:
AuthorizationHeader
path Parameters
id
required
string
Example: 8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278

ID of the boat model

Responses

Response Schema: application/json
required
object (BoatModel)

A boat model

id
required
string <uuid>

ID of the Boat model

name
required
string

Name of the Boat model

slug
required
string

The slug is automatically generated from the name

capacity
required
integer

Number of people the boat can accommodate

shortDescription
required
string

A short description of the boat model

description
required
string

A longer description of the boat model

required
Array of objects (Media)

A list of photos of the boat model

categoryId
required
string or null <uuid>

ID of the category. Can also be null.

Response samples

Content type
application/json
{}

Customers

A customer is an individual who rents a boat.

List all customers

Retrieves a comprehensive list of your customers.

Authorizations:
AuthorizationHeader
query Parameters
page
integer
Default: 1
Example: page=1

The page number to fetch.

Responses

Response Schema: application/json
required
Array of objects (Customer)
required
object (Pagination)

Pagination to iterate large result sets.

Response samples

Content type
application/json
{
  • "data": [
    • {
      }
    ],
  • "pagination": {}
}

Create a customer

Registers a new customer in the system.

Authorizations:
AuthorizationHeader
Request Body schema: application/json
required
customerTypeId
required
string <uuid>

Customer type ID

givenName
required
string

First name of the customer

familyName
required
string

Last name of the customer

emailAddress
required
string <email>

Email address of the customer

phoneNumber
string

Phone number of the customer in E.164 format

preferredLocale
string

Preferred locale of the customer in language_COUNTRY format.

password
string

Password of the customer. Should be left empty if you don't want to change the password. It will be set to a random password if you don't specify one when creating a new customer.

Note: The password must be at least 8 characters long.

addAliasOnDuplicate
boolean
Default: false

If set to true, the customer will be added as an alias to the existing customer with the same email address. If set to false, an error will be returned if the customer already exists.

notifyCustomer
boolean
Default: false

If set to true, the customer will receive an email containing their login credentials.

Responses

Response Schema: application/json
required
object (Customer)

Data of the customer

id
required
string <uuid>

ID of the customer

customerTypeId
required
string <uuid>

ID of the customer type

givenName
required
string

First name of the customer

familyName
required
string

Last name of the customer

fullName
required
string

Full name of the customer

emailAddress
required
string <email>

Email address of the customer

phoneNumber
string

Phone number of the customer in E.164 format

preferredLocale
string

Preferred locale of the customer in language_COUNTRY format.

registeredAt
required
string <date-time>

Date and time when the customer was registered in ISO 8601 format

Request samples

Content type
application/json
{
  • "customerTypeId": "a6fe15b1-8131-4f48-8082-311e0369f599",
  • "givenName": "John",
  • "familyName": "Doe",
  • "emailAddress": "john.doe@example.com",
  • "phoneNumber": "+49123456789",
  • "preferredLocale": "sv_SE",
  • "password": "correcthorsebatterystaple",
  • "addAliasOnDuplicate": false,
  • "notifyCustomer": true
}

Response samples

Content type
application/json
{
  • "data": {
    • "id": "8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278",
    • "customerTypeId": "a6fe15b1-8131-4f48-8082-311e0369f599",
    • "givenName": "John",
    • "familyName": "Doe",
    • "fullName": "John Doe",
    • "emailAddress": "john.doe@example.com",
    • "phoneNumber": "+49123456789",
    • "preferredLocale": "sv_SE",
    • "registeredAt": "2025-11-17T18:34:11+00:00"
    }
}

Search customers

Returns a list of all customers matching the query.

Authorizations:
AuthorizationHeader
query Parameters
emailAddress
string <email>
Example: emailAddress=john.doe@example.com

The email address to search for

page
integer
Default: 1
Example: page=1

The page number to fetch.

Responses

Response Schema: application/json
required
Array of objects (Customer)
required
object (Pagination)

Pagination to iterate large result sets.

Response samples

Content type
application/json
{
  • "data": [
    • {
      }
    ],
  • "pagination": {}
}

Retrieve a customer

Retrieve a Customer object by ID.

Authorizations:
AuthorizationHeader
path Parameters
id
required
string
Example: 8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278

ID of the customer

Responses

Response Schema: application/json
required
object (Customer)

Data of the customer

id
required
string <uuid>

ID of the customer

customerTypeId
required
string <uuid>

ID of the customer type

givenName
required
string

First name of the customer

familyName
required
string

Last name of the customer

fullName
required
string

Full name of the customer

emailAddress
required
string <email>

Email address of the customer

phoneNumber
string

Phone number of the customer in E.164 format

preferredLocale
string

Preferred locale of the customer in language_COUNTRY format.

registeredAt
required
string <date-time>

Date and time when the customer was registered in ISO 8601 format

Response samples

Content type
application/json
{
  • "data": {
    • "id": "8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278",
    • "customerTypeId": "a6fe15b1-8131-4f48-8082-311e0369f599",
    • "givenName": "John",
    • "familyName": "Doe",
    • "fullName": "John Doe",
    • "emailAddress": "john.doe@example.com",
    • "phoneNumber": "+49123456789",
    • "preferredLocale": "sv_SE",
    • "registeredAt": "2025-11-17T18:34:11+00:00"
    }
}

Update a customer

Update an existing customer.

Authorizations:
AuthorizationHeader
path Parameters
id
required
string
Example: 8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278

ID of the customer

Request Body schema: application/json
required
customerTypeId
string <uuid>

Customer type ID

givenName
string

First name of the customer

familyName
string

Last name of the customer

emailAddress
string <email>

Email address of the customer

phoneNumber
string

Phone number of the customer in E.164 format

preferredLocale
string

Preferred locale of the customer in language_COUNTRY format.

password
string

Password of the customer. Should be left empty if you don't want to change the password. It will be set to a random password if you don't specify one when creating a new customer.

Note: The password must be at least 8 characters long.

Responses

Response Schema: application/json
required
object (Customer)

Data of the customer

id
required
string <uuid>

ID of the customer

customerTypeId
required
string <uuid>

ID of the customer type

givenName
required
string

First name of the customer

familyName
required
string

Last name of the customer

fullName
required
string

Full name of the customer

emailAddress
required
string <email>

Email address of the customer

phoneNumber
string

Phone number of the customer in E.164 format

preferredLocale
string

Preferred locale of the customer in language_COUNTRY format.

registeredAt
required
string <date-time>

Date and time when the customer was registered in ISO 8601 format

Request samples

Content type
application/json
{
  • "customerTypeId": "a6fe15b1-8131-4f48-8082-311e0369f599",
  • "givenName": "John",
  • "familyName": "Doe",
  • "emailAddress": "john.doe@example.com",
  • "phoneNumber": "+49123456789",
  • "preferredLocale": "sv_SE",
  • "password": "correcthorsebatterystaple"
}

Response samples

Content type
application/json
{
  • "data": {
    • "id": "8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278",
    • "customerTypeId": "a6fe15b1-8131-4f48-8082-311e0369f599",
    • "givenName": "John",
    • "familyName": "Doe",
    • "fullName": "John Doe",
    • "emailAddress": "john.doe@example.com",
    • "phoneNumber": "+49123456789",
    • "preferredLocale": "sv_SE",
    • "registeredAt": "2025-11-17T18:34:11+00:00"
    }
}

List all customer types

Returns a list of all customer types. The response is not paginated.

Authorizations:
AuthorizationHeader

Responses

Response Schema: application/json
required
Array of objects (CustomerType)
Array
id
required
string <uuid>

ID of the customer type

name
required
string

Name as configured in the dashboard

abbreviation
required
string

Short capitalized name

type
required
string
Enum: "custom" "default" "guest"

Type of the object

Response samples

Content type
application/json
{
  • "data": [
    • {
      }
    ]
}

Bookings

A booking can be created by customers or staff members. It represents a reservation for a specific boat model, to be picked up at a designated time from a specific dock and returned at a specified time to that same dock.

List all bookings

Retrieves a comprehensive list of all bookings.

Authorizations:
AuthorizationHeader
query Parameters
page
integer
Default: 1
Example: page=1

The page number to fetch.

status
string
Enum: "draft" "expired" "option" "confirmed" "completed" "canceled" "all"

Display only bookings with the specified status

updatedAfter
string <date-time>
Example: updatedAfter=2022-01-01T00:00:00Z

Display only bookings updated after the specified date and time in ISO 8601 format

Responses

Response Schema: application/json
required
Array of objects (Booking)
required
object (Pagination)

Pagination to iterate large result sets.

Response samples

Content type
application/json
{
  • "data": [
    • {
      }
    ],
  • "pagination": {}
}

Create a booking

Creates a new booking with confirmed status.

Authorizations:
AuthorizationHeader
Request Body schema: application/json
required
customerId
required
string <uuid>

ID of the customer

dockId
required
string <uuid>

ID of the dock

boatModelId
required
string <uuid>

ID of the boat model

pickup
required
string <date-time>

Pickup date and time in ISO 8601 format

return
required
string <date-time>

Return date and time in ISO 8601 format

boats
integer
Default: 1

Number of boats booked

passengers
integer
Default: 1

Number of passengers including the customer who booked the boat

paid
boolean
Default: true

If set to true, the booking will be marked as paid by adding a cash payment equal to the unpaid costs. It will be ignored when the booking is already fully paid.

Note that slot based pricing may fail to calculate the correct amount as the slot is not known when the booking is created using the API.

createdAt
string <date-time>

The time this booking was first created in ISO 8601 format

notifyCustomer
boolean
Default: false

If set to true, the customer will receive a booking confirmation email.

includePaymentLink
boolean
Default: true

Whether or not the booking confirmation email should contain a payment request link. Only applicable if notifyCustomer is true.

Responses

Response Schema: application/json
required
object
bookingId
required
string <uuid>

The unique identifier of the newly created booking.

Request samples

Content type
application/json
{
  • "customerId": "8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278",
  • "dockId": "3462e0cd-a446-49b7-bf18-b5e1c78098ca",
  • "boatModelId": "3462e0cd-a446-49b7-bf18-b5e1c78098ca",
  • "pickup": "2022-01-01T00:00:00Z",
  • "return": "2022-01-03T00:00:00Z",
  • "boats": 1,
  • "passengers": 1,
  • "paid": true,
  • "createdAt": "2022-01-01T00:00:00Z",
  • "notifyCustomer": false,
  • "includePaymentLink": true
}

Response samples

Content type
application/json
{
  • "data": {
    • "bookingId": "4a974b2a-2d35-4313-a2e9-5aee4e83601f"
    }
}

Retrieve a booking

Retrieve a booking with its financial and customer details.

Authorizations:
AuthorizationHeader
path Parameters
id
required
string
Example: 8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278

ID of the booking

Responses

Response Schema: application/json
required
object (BookingExtended)

Comprehensive booking details

id
required
string <uuid>

Unique identifier of the booking

reference
required
string

A 6-character alphanumeric booking reference. The reference is unique to the booking (per tenant) and is used to identify the booking by both customers and staff.

status
required
string
Default: "draft"
Enum: "draft" "expired" "option" "confirmed" "completed" "canceled"

Current status of the booking

customerId
string or null <uuid>

Unique identifier of the customer. Can be null for draft bookings.

dockId
required
string <uuid>

Unique identifier of the dock

boatModelId
required
string <uuid>

Unique identifier of the boat model

pickup
required
string <date-time>

Pickup date and time

return
required
string <date-time>

Return date and time

boats
required
integer
Default: 1

Number of boats booked

passengers
required
integer
Default: 1

Number of passengers including the customer who booked the boat

createdAt
required
string <date-time>

Timestamp of when the booking was initially created in ISO 8601 format

updatedAt
required
string <date-time>

Timestamp of when the booking was most recently updated in ISO 8601 format

url
string or null <uri>

URL to view the booking. Can be null when booking is still a 'draft' booking.

Customer (object) or null

Customer details of the person who booked

required
object

Financial information about a booking

Response samples

Content type
application/json
{
  • "data": {
    • "id": "551ceb1c-6fbc-479b-819d-734f4044eca2",
    • "reference": "BK8J3L",
    • "status": "confirmed",
    • "customerId": "8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278",
    • "dockId": "3462e0cd-a446-49b7-bf18-b5e1c78098ca",
    • "boatModelId": "3462e0cd-a446-49b7-bf18-b5e1c78098ca",
    • "pickup": "2022-01-01T00:00:00Z",
    • "return": "2022-01-03T00:00:00Z",
    • "boats": 1,
    • "passengers": 1,
    • "createdAt": "2022-01-01T00:00:00Z",
    • "updatedAt": "2022-01-01T00:00:00Z",
    • "customer": {
      },
    • "financialDetails": {
      }
    }
}

Update a booking

Update an existing booking.

Authorizations:
AuthorizationHeader
path Parameters
id
required
string
Example: 8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278

ID of the booking

Request Body schema: application/json
required

Update booking parameters. None of the fields are required.

customerId
string <uuid>

ID of the customer

dockId
string <uuid>

ID of the dock

boatModelId
string <uuid>

ID of the boat model

pickup
string <date-time>

Pickup date and time in ISO 8601 format

return
string <date-time>

Return date and time in ISO 8601 format

boats
integer
Default: 1

Number of boats booked

passengers
integer
Default: 1

Number of passengers including the customer who booked the boat

paid
boolean
Default: true

If set to true, the booking will be marked as paid by adding a cash payment equal to the unpaid costs. It will be ignored when the booking is already fully paid.

Note that slot based pricing may fail to calculate the correct amount as the slot is not known when the booking is created using the API.

createdAt
string <date-time>

The time this booking was first created in ISO 8601 format

notifyCustomer
boolean
Default: false

If set to true, the customer will receive a booking updated email.

Responses

Response Schema: application/json
required
object
bookingId
required
string <uuid>

The ID of the updated booking.

Request samples

Content type
application/json
{
  • "customerId": "8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278",
  • "dockId": "3462e0cd-a446-49b7-bf18-b5e1c78098ca",
  • "boatModelId": "3462e0cd-a446-49b7-bf18-b5e1c78098ca",
  • "pickup": "2022-01-01T00:00:00Z",
  • "return": "2022-01-03T00:00:00Z",
  • "boats": 1,
  • "passengers": 1,
  • "paid": true,
  • "createdAt": "2022-01-01T00:00:00Z",
  • "notifyCustomer": false
}

Response samples

Content type
application/json
{
  • "data": {
    • "bookingId": "4a974b2a-2d35-4313-a2e9-5aee4e83601f"
    }
}

Retrieve booking add-ons

Retrieve the booking's add-ons order. Will return a 404 when no order exists.

Authorizations:
AuthorizationHeader
path Parameters
id
required
string
Example: 8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278

ID of the booking

Responses

Response Schema: application/json
required
object (OrderExtended)

Order details containing one or more products (add-ons) booked alongside the boat trip.

bookingId
required
string <uuid>

Unique identifier of the booking this order belongs to

plannedForDeliveryAt
required
string or null <date-time>

Planned delivery timestamp in ISO 8601 format (typically matches the booking pickup time). Will be null when the booking is not yet confirmed.

currency
required
string

Currency of the amount

totalIncludingTax
required
integer

Total costs including tax in cents

totalExcludingTax
required
integer

Total costs excluding tax in cents

totalTax
required
integer

Total tax in cents (difference between totalIncludingTax and totalExcludingTax).

required
Array of objects (OrderLine)

Details about the contents of the order

Response samples

Content type
application/json
{
  • "data": {
    • "bookingId": "551ceb1c-6fbc-479b-819d-734f4044eca2",
    • "plannedForDeliveryAt": "2025-11-18T12:00:00+00:00",
    • "currency": "EUR",
    • "totalIncludingTax": 1750,
    • "totalExcludingTax": 1466,
    • "totalTax": 284,
    • "orderLines": [
      ]
    }
}

Tax rates

A tax rate is a named percentage used to calculate taxes on add-ons, costs, and other charges.

List all tax rates

Returns a list of tax rates used in costs, add-ons, etc. The response is not paginated.

Authorizations:
AuthorizationHeader

Responses

Response Schema: application/json
required
Array of objects (TaxRate)
Array
id
required
string <uuid>

ID of the tax rate

name
required
string

Name of the tax rate

percentage
required
number

Rate of the tax in 0 - 100 range

readOnly
boolean

Cannot be edited if true

Response samples

Content type
application/json
{
  • "data": [
    • {
      }
    ]
}

List all VAT rates Deprecated

Deprecated. Use the GET /v1/tax-rates endpoint instead.

Authorizations:
AuthorizationHeader

Responses

Response Schema: application/json
required
Array of objects (TaxRate)
Array
id
required
string <uuid>

ID of the tax rate

name
required
string

Name of the tax rate

percentage
required
number

Rate of the tax in 0 - 100 range

readOnly
boolean

Cannot be edited if true

Response samples

Content type
application/json
{
  • "data": [
    • {
      }
    ]
}

Availability

Availability represents the availability of a boat model at a specific dock. Availability is calculated by subtracting the number of bookings for a specific boat model at a specific dock from the total number of boats available at that dock.

Calculate availability

Get availability for a boat model at a dock during a date/time period.

Authorizations:
AuthorizationHeader
query Parameters
dockId
required
string <uuid>
Example: dockId=878f1403-9677-482d-a09d-392004de8c46

The dock ID

boatModelId
required
string <uuid>
Example: boatModelId=2d2071f6-0a1d-4aca-a49d-4d112b141c44

The boat model ID

period
required
string <date-time-period>
Example: period=2022-01-01T00:00:00Z/2022-01-03T00:00:00Z

The period of time to check availability

Responses

Response Schema: application/json
required
object

The availability result

required
object

The parameters used to calculate availability. Can be used to verify the query parameters were parsed correctly.

Response samples

Content type
application/json
{
  • "data": {
    • "lowestAvailability": 4,
    • "perMoment": [
      ]
    },
  • "parameters": {
    • "dockId": "878f1403-9677-482d-a09d-392004de8c46",
    • "boatModelId": "2d2071f6-0a1d-4aca-a49d-4d112b141c44",
    • "period": {
      }
    }
}

Webhooks

A webhook is a way for one system to instantly notify another when something happens. Instead of your app constantly polling our API, Let's Book sends an HTTP POST request to your specified URL whenever an event occurs. See webhook events for details on what we're sending. We consider the webhook call successful when your server returns a response with a 2xx status code.

NOTE: The webhook endpoints are currently in private beta

List all webhooks

Retrieves all webhooks for the current tenant

Authorizations:
AuthorizationHeader

Responses

Response Schema: application/json
required
Array of objects (Webhook)
Array
id
required
string <uuid>

ID of the webhook

name
required
string

Get notified of all booking changes

url
required
string

URL to send the webhook to

secret
required
string

You can store this secret in your app and use it to verify the incoming webhook is coming from Let's Book.

events
required
Array of strings (webhookEvent) non-empty
Items Enum: "booking.drafted" "booking.confirmed" "booking.details_updated" "booking.labels_updated" "booking.completed" "booking.canceled" "booking.expired" "order.confirmed" "order.lines_updated" "order.canceled" "customer.anonymized" "customer.registered" "customer.updated" "customer.removed"

Events to get notified about

tenantIds
required
Array of strings

The tenant this event applies to. You can leave it empty to set it to all tenants the current API key has access to.

enabled
required
boolean

Determines if the webhook is currently enabled or not

Response samples

Content type
application/json
{
  • "data": [
    • {
      }
    ]
}

Add a webhook

Add a new webhook endpoint to be called when specific events happen

Authorizations:
AuthorizationHeader
Request Body schema: application/json
required
name
required
string

Name of the webhook

url
required
string <uri>

URL (endpoint) that will be called when one of the webhook's events occur.

events
required
Array of strings (webhookEvent) non-empty
Items Enum: "booking.drafted" "booking.confirmed" "booking.details_updated" "booking.labels_updated" "booking.completed" "booking.canceled" "booking.expired" "order.confirmed" "order.lines_updated" "order.canceled" "customer.anonymized" "customer.registered" "customer.updated" "customer.removed"

Events to get notified about

tenantIds
Array of strings non-empty

By default, you will receive updates on events of all tenants your API key has access to when creating this webhook. You can provide an explicit list of tenant IDs this webhook applies to.

Responses

Response Schema: application/json
required
object (Webhook)

Webhook

id
required
string <uuid>

ID of the webhook

name
required
string

Get notified of all booking changes

url
required
string

URL to send the webhook to

secret
required
string

You can store this secret in your app and use it to verify the incoming webhook is coming from Let's Book.

events
required
Array of strings (webhookEvent) non-empty
Items Enum: "booking.drafted" "booking.confirmed" "booking.details_updated" "booking.labels_updated" "booking.completed" "booking.canceled" "booking.expired" "order.confirmed" "order.lines_updated" "order.canceled" "customer.anonymized" "customer.registered" "customer.updated" "customer.removed"

Events to get notified about

tenantIds
required
Array of strings

The tenant this event applies to. You can leave it empty to set it to all tenants the current API key has access to.

enabled
required
boolean

Determines if the webhook is currently enabled or not

Request samples

Content type
application/json
{
  • "name": "Zapier booking notifications",
  • "events": [
    • "booking.confirmed",
    • "booking.canceled"
    ],
  • "tenantIds": [
    • "8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278"
    ]
}

Response samples

Content type
application/json
{
  • "data": {
    • "id": "8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278",
    • "name": "Receive booking updates",
    • "secret": "375cc73bb506dc31adff0612ec1e86dda34428951959dd3476727a7944474f90",
    • "events": [
      ],
    • "tenantIds": [
      ],
    • "enabled": true
    }
}

Retrieve a webhook

Retrieve details of a specific webhook

Authorizations:
AuthorizationHeader
path Parameters
id
required
string
Example: 8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278

ID of the webhook

Responses

Response Schema: application/json
required
object (Webhook)

Webhook

id
required
string <uuid>

ID of the webhook

name
required
string

Get notified of all booking changes

url
required
string

URL to send the webhook to

secret
required
string

You can store this secret in your app and use it to verify the incoming webhook is coming from Let's Book.

events
required
Array of strings (webhookEvent) non-empty
Items Enum: "booking.drafted" "booking.confirmed" "booking.details_updated" "booking.labels_updated" "booking.completed" "booking.canceled" "booking.expired" "order.confirmed" "order.lines_updated" "order.canceled" "customer.anonymized" "customer.registered" "customer.updated" "customer.removed"

Events to get notified about

tenantIds
required
Array of strings

The tenant this event applies to. You can leave it empty to set it to all tenants the current API key has access to.

enabled
required
boolean

Determines if the webhook is currently enabled or not

Response samples

Content type
application/json
{
  • "data": {
    • "id": "8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278",
    • "name": "Receive booking updates",
    • "secret": "375cc73bb506dc31adff0612ec1e86dda34428951959dd3476727a7944474f90",
    • "events": [
      ],
    • "tenantIds": [
      ],
    • "enabled": true
    }
}

Update a webhook

Update an existing webhook

Authorizations:
AuthorizationHeader
path Parameters
id
required
string
Example: 8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278

ID of the webhook

Request Body schema: application/json
required

Update webhook parameters. None of the fields are required.

name
string

Name of the webhook

url
string <uri>

URL to send the webhook to

events
Array of strings (webhookEvent) non-empty
Items Enum: "booking.drafted" "booking.confirmed" "booking.details_updated" "booking.labels_updated" "booking.completed" "booking.canceled" "booking.expired" "order.confirmed" "order.lines_updated" "order.canceled" "customer.anonymized" "customer.registered" "customer.updated" "customer.removed"

Events to get notified about

tenantIds
Array of strings non-empty

By default, you will receive updates on events of all tenants your API key has access to when creating this webhook. You can provide an explicit list of tenant IDs this webhook applies to.

Responses

Response Schema: application/json
required
object (Webhook)

Webhook

id
required
string <uuid>

ID of the webhook

name
required
string

Get notified of all booking changes

url
required
string

URL to send the webhook to

secret
required
string

You can store this secret in your app and use it to verify the incoming webhook is coming from Let's Book.

events
required
Array of strings (webhookEvent) non-empty
Items Enum: "booking.drafted" "booking.confirmed" "booking.details_updated" "booking.labels_updated" "booking.completed" "booking.canceled" "booking.expired" "order.confirmed" "order.lines_updated" "order.canceled" "customer.anonymized" "customer.registered" "customer.updated" "customer.removed"

Events to get notified about

tenantIds
required
Array of strings

The tenant this event applies to. You can leave it empty to set it to all tenants the current API key has access to.

enabled
required
boolean

Determines if the webhook is currently enabled or not

Request samples

Content type
application/json
{
  • "name": "Zapier booking notifications",
  • "events": [
    • "booking.confirmed",
    • "booking.canceled"
    ],
  • "tenantIds": [
    • "8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278"
    ]
}

Response samples

Content type
application/json
{
  • "data": {
    • "id": "8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278",
    • "name": "Receive booking updates",
    • "secret": "375cc73bb506dc31adff0612ec1e86dda34428951959dd3476727a7944474f90",
    • "events": [
      ],
    • "tenantIds": [
      ],
    • "enabled": true
    }
}

Delete a webhook

Delete a webhook

Authorizations:
AuthorizationHeader
path Parameters
id
required
string
Example: 8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278

ID of the webhook

Responses

Response Schema: application/json
message
string

Result message

Response samples

Content type
application/json
{
  • "message": "Webhook subscription deleted."
}

Enable a webhook

Enable a webhook to start receiving notifications

Authorizations:
AuthorizationHeader
path Parameters
id
required
string
Example: 8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278

ID of the webhook

Responses

Response Schema: application/json
required
object (Webhook)

Webhook

id
required
string <uuid>

ID of the webhook

name
required
string

Get notified of all booking changes

url
required
string

URL to send the webhook to

secret
required
string

You can store this secret in your app and use it to verify the incoming webhook is coming from Let's Book.

events
required
Array of strings (webhookEvent) non-empty
Items Enum: "booking.drafted" "booking.confirmed" "booking.details_updated" "booking.labels_updated" "booking.completed" "booking.canceled" "booking.expired" "order.confirmed" "order.lines_updated" "order.canceled" "customer.anonymized" "customer.registered" "customer.updated" "customer.removed"

Events to get notified about

tenantIds
required
Array of strings

The tenant this event applies to. You can leave it empty to set it to all tenants the current API key has access to.

enabled
required
boolean

Determines if the webhook is currently enabled or not

Response samples

Content type
application/json
{
  • "data": {
    • "id": "8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278",
    • "name": "Receive booking updates",
    • "secret": "375cc73bb506dc31adff0612ec1e86dda34428951959dd3476727a7944474f90",
    • "events": [
      ],
    • "tenantIds": [
      ],
    • "enabled": true
    }
}

Disable a webhook

Disable a webhook to stop receiving notifications

Authorizations:
AuthorizationHeader
path Parameters
id
required
string
Example: 8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278

ID of the webhook

Responses

Response Schema: application/json
required
object

Webhook

id
required
string <uuid>

ID of the webhook

name
required
string

Get notified of all booking changes

url
required
string

URL to send the webhook to

secret
required
string

You can store this secret in your app and use it to verify the incoming webhook is coming from Let's Book.

events
required
Array of strings (webhookEvent) non-empty
Items Enum: "booking.drafted" "booking.confirmed" "booking.details_updated" "booking.labels_updated" "booking.completed" "booking.canceled" "booking.expired" "order.confirmed" "order.lines_updated" "order.canceled" "customer.anonymized" "customer.registered" "customer.updated" "customer.removed"

Events to get notified about

tenantIds
required
Array of strings

The tenant this event applies to. You can leave it empty to set it to all tenants the current API key has access to.

enabled
required
boolean

Determines if the webhook is currently enabled or not

Response samples

Content type
application/json
{
  • "data": {
    • "id": "8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278",
    • "name": "Receive booking updates",
    • "secret": "375cc73bb506dc31adff0612ec1e86dda34428951959dd3476727a7944474f90",
    • "events": [
      ],
    • "tenantIds": [
      ],
    • "enabled": false
    }
}

Webhook events

A webhook event payload is a JSON object that contains event data for your app to process. When a relevant event occurs, we'll send the payload using a POST request to your webhook endpoint. Here's a list of event details on what we're sending.

NOTE: The webhook events are currently in private beta

Booking drafted Webhook

Triggered when a booking is created. This happens when a customer fills out the booking form or when an admin creates a booking in the dashboard. Draft bookings reserve availability but must be confirmed on time.

Authorizations:
WebhookSignature
Request Body schema: application/json
event
required
string
Value: "booking.drafted"
occurredOn
required
string <date-time>
required
object (BookingExtended)

Comprehensive booking details

Responses

Request samples

Content type
application/json
{
  • "event": "booking.drafted",
  • "occurredOn": "2025-11-17T18:34:11+00:00",
  • "data": {
    • "id": "551ceb1c-6fbc-479b-819d-734f4044eca2",
    • "reference": "BK8J3L",
    • "status": "draft",
    • "customerId": "8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278",
    • "dockId": "3462e0cd-a446-49b7-bf18-b5e1c78098ca",
    • "boatModelId": "3462e0cd-a446-49b7-bf18-b5e1c78098ca",
    • "pickup": "2022-01-01T00:00:00Z",
    • "return": "2022-01-03T00:00:00Z",
    • "boats": 1,
    • "passengers": 1,
    • "createdAt": "2022-01-01T00:00:00Z",
    • "updatedAt": "2022-01-01T00:00:00Z",
    • "customer": {
      },
    • "financialDetails": {
      }
    }
}

Booking confirmed Webhook

Triggered when a booking is confirmed. This happens when the customer completes payment, converting the draft booking into a confirmed booking. An admin can also manually confirm a booking in the dashboard.

Authorizations:
WebhookSignature
Request Body schema: application/json
event
required
string
Value: "booking.confirmed"
occurredOn
required
string <date-time>
required
object (BookingExtended)

Comprehensive booking details

Responses

Request samples

Content type
application/json
{
  • "event": "booking.confirmed",
  • "occurredOn": "2025-11-17T18:34:11+00:00",
  • "data": {
    • "id": "551ceb1c-6fbc-479b-819d-734f4044eca2",
    • "reference": "BK8J3L",
    • "status": "confirmed",
    • "customerId": "8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278",
    • "dockId": "3462e0cd-a446-49b7-bf18-b5e1c78098ca",
    • "boatModelId": "3462e0cd-a446-49b7-bf18-b5e1c78098ca",
    • "pickup": "2022-01-01T00:00:00Z",
    • "return": "2022-01-03T00:00:00Z",
    • "boats": 1,
    • "passengers": 1,
    • "createdAt": "2022-01-01T00:00:00Z",
    • "updatedAt": "2022-01-01T00:00:00Z",
    • "customer": {
      },
    • "financialDetails": {
      }
    }
}

Booking completed Webhook

Triggered when a booking is completed. This happens when the return date time has passed and the trip has ended (when the boat was switched off).

Authorizations:
WebhookSignature
Request Body schema: application/json
event
required
string
Value: "booking.completed"
occurredOn
required
string <date-time>
required
object (BookingExtended)

Comprehensive booking details

Responses

Request samples

Content type
application/json
{
  • "event": "booking.completed",
  • "occurredOn": "2025-11-17T18:34:11+00:00",
  • "data": {
    • "id": "551ceb1c-6fbc-479b-819d-734f4044eca2",
    • "reference": "BK8J3L",
    • "status": "completed",
    • "customerId": "8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278",
    • "dockId": "3462e0cd-a446-49b7-bf18-b5e1c78098ca",
    • "boatModelId": "3462e0cd-a446-49b7-bf18-b5e1c78098ca",
    • "pickup": "2022-01-01T00:00:00Z",
    • "return": "2022-01-03T00:00:00Z",
    • "boats": 1,
    • "passengers": 1,
    • "createdAt": "2022-01-01T00:00:00Z",
    • "updatedAt": "2022-01-01T00:00:00Z",
    • "customer": {
      },
    • "financialDetails": {
      }
    }
}

Booking canceled Webhook

Triggered when a booking is canceled. Either the customer or an admin can cancel a booking. Once canceled, a booking cannot change to another status.

Authorizations:
WebhookSignature
Request Body schema: application/json
event
required
string
Value: "booking.canceled"
occurredOn
required
string <date-time>
required
object (BookingExtended)

Comprehensive booking details

Responses

Request samples

Content type
application/json
{
  • "event": "booking.canceled",
  • "occurredOn": "2025-11-17T18:34:11+00:00",
  • "data": {
    • "id": "551ceb1c-6fbc-479b-819d-734f4044eca2",
    • "reference": "BK8J3L",
    • "status": "canceled",
    • "customerId": "8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278",
    • "dockId": "3462e0cd-a446-49b7-bf18-b5e1c78098ca",
    • "boatModelId": "3462e0cd-a446-49b7-bf18-b5e1c78098ca",
    • "pickup": "2022-01-01T00:00:00Z",
    • "return": "2022-01-03T00:00:00Z",
    • "boats": 1,
    • "passengers": 1,
    • "createdAt": "2022-01-01T00:00:00Z",
    • "updatedAt": "2022-01-01T00:00:00Z",
    • "customer": {
      },
    • "financialDetails": {
      }
    }
}

Booking expired Webhook

Triggered when a booking expires. This happens when the draft booking isn't paid in time.

Authorizations:
WebhookSignature
Request Body schema: application/json
event
required
string
Value: "booking.expired"
occurredOn
required
string <date-time>
required
object (BookingExtended)

Comprehensive booking details

Responses

Request samples

Content type
application/json
{
  • "event": "booking.expired",
  • "occurredOn": "2025-11-17T18:34:11+00:00",
  • "data": {
    • "id": "551ceb1c-6fbc-479b-819d-734f4044eca2",
    • "reference": "BK8J3L",
    • "status": "expired",
    • "customerId": "8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278",
    • "dockId": "3462e0cd-a446-49b7-bf18-b5e1c78098ca",
    • "boatModelId": "3462e0cd-a446-49b7-bf18-b5e1c78098ca",
    • "pickup": "2022-01-01T00:00:00Z",
    • "return": "2022-01-03T00:00:00Z",
    • "boats": 1,
    • "passengers": 1,
    • "createdAt": "2022-01-01T00:00:00Z",
    • "updatedAt": "2022-01-01T00:00:00Z",
    • "customer": {
      },
    • "financialDetails": {
      }
    }
}

Booking details updated Webhook

Triggered when booking details are updated. This happens when the booking dates, time, boat, or other details change.

Authorizations:
WebhookSignature
Request Body schema: application/json
event
required
string
Value: "booking.details_updated"
occurredOn
required
string <date-time>
required
object (BookingExtended)

Comprehensive booking details

Responses

Request samples

Content type
application/json
{
  • "event": "booking.details_updated",
  • "occurredOn": "2025-11-17T18:34:11+00:00",
  • "data": {
    • "id": "551ceb1c-6fbc-479b-819d-734f4044eca2",
    • "reference": "BK8J3L",
    • "status": "confirmed",
    • "customerId": "8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278",
    • "dockId": "3462e0cd-a446-49b7-bf18-b5e1c78098ca",
    • "boatModelId": "3462e0cd-a446-49b7-bf18-b5e1c78098ca",
    • "pickup": "2022-01-01T00:00:00Z",
    • "return": "2022-01-03T00:00:00Z",
    • "boats": 1,
    • "passengers": 1,
    • "createdAt": "2022-01-01T00:00:00Z",
    • "updatedAt": "2022-01-01T00:00:00Z",
    • "customer": {
      },
    • "financialDetails": {
      }
    }
}

Booking labels updated Webhook

Triggered when a label is added or removed from a booking

Authorizations:
WebhookSignature
Request Body schema: application/json
event
required
string
Value: "booking.labels_updated"
occurredOn
required
string <date-time>
required
object

Responses

Request samples

Content type
application/json
{
  • "event": "booking.labels_updated",
  • "occurredOn": "2025-11-17T18:34:11+00:00",
  • "data": {
    • "bookingId": "551ceb1c-6fbc-479b-819d-734f4044eca2",
    • "current": [
      ],
    • "changes": {
      }
    }
}

Order confirmed Webhook

Triggered when an order is confirmed. This happens when the customer proceeds to the next step after compiling their draft order.

Authorizations:
WebhookSignature
Request Body schema: application/json
event
required
string
Value: "order.confirmed"
occurredOn
required
string <date-time>
required
object (OrderExtended)

Order details containing one or more products (add-ons) booked alongside the boat trip.

Responses

Request samples

Content type
application/json
{
  • "event": "order.confirmed",
  • "occurredOn": "2025-11-17T18:34:11+00:00",
  • "data": {
    • "bookingId": "551ceb1c-6fbc-479b-819d-734f4044eca2",
    • "plannedForDeliveryAt": "2025-11-18T12:00:00+00:00",
    • "currency": "EUR",
    • "totalIncludingTax": 1750,
    • "totalExcludingTax": 1466,
    • "totalTax": 284,
    • "orderLines": [
      ]
    }
}

Order lines updated Webhook

Triggered when an order is updated. This happens when a product is added or removed, or when the quantity of an existing product changes.

Authorizations:
WebhookSignature
Request Body schema: application/json
event
required
string
Value: "order.lines_updated"
occurredOn
required
string <date-time>
required
object (OrderExtended)

Order details containing one or more products (add-ons) booked alongside the boat trip.

Responses

Request samples

Content type
application/json
{
  • "event": "order.lines_updated",
  • "occurredOn": "2025-11-17T18:34:11+00:00",
  • "data": {
    • "bookingId": "551ceb1c-6fbc-479b-819d-734f4044eca2",
    • "plannedForDeliveryAt": "2025-11-18T12:00:00+00:00",
    • "currency": "EUR",
    • "totalIncludingTax": 1750,
    • "totalExcludingTax": 1466,
    • "totalTax": 284,
    • "orderLines": [
      ]
    }
}

Order canceled Webhook

Triggered when an order is canceled.

Authorizations:
WebhookSignature
Request Body schema: application/json
event
required
string
Value: "order.canceled"
occurredOn
required
string <date-time>
required
object (OrderExtended)

Order details containing one or more products (add-ons) booked alongside the boat trip.

Responses

Request samples

Content type
application/json
{
  • "event": "order.canceled",
  • "occurredOn": "2025-11-17T18:34:11+00:00",
  • "data": {
    • "bookingId": "551ceb1c-6fbc-479b-819d-734f4044eca2",
    • "plannedForDeliveryAt": "2025-11-18T12:00:00+00:00",
    • "currency": "EUR",
    • "totalIncludingTax": 1750,
    • "totalExcludingTax": 1466,
    • "totalTax": 284,
    • "orderLines": [
      ]
    }
}

Customer registered Webhook

Triggered when a new customer registers. This happens when a guest customer books or when a customer creates an account.

Authorizations:
WebhookSignature
Request Body schema: application/json
event
required
string
Value: "customer.registered"
occurredOn
required
string <date-time>
required
object (Customer)

Data of the customer

Responses

Request samples

Content type
application/json
{
  • "event": "customer.registered",
  • "occurredOn": "2025-11-17T18:34:11+00:00",
  • "data": {
    • "id": "8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278",
    • "customerTypeId": "a6fe15b1-8131-4f48-8082-311e0369f599",
    • "givenName": "John",
    • "familyName": "Doe",
    • "fullName": "John Doe",
    • "emailAddress": "john.doe@example.com",
    • "phoneNumber": "+49123456789",
    • "preferredLocale": "sv_SE",
    • "registeredAt": "2025-11-17T18:34:11+00:00"
    }
}

Customer updated Webhook

Triggered when the customer details are updated.

Authorizations:
WebhookSignature
Request Body schema: application/json
event
required
string
Value: "customer.updated"
occurredOn
required
string <date-time>
required
object (Customer)

Data of the customer

Responses

Request samples

Content type
application/json
{
  • "event": "customer.updated",
  • "occurredOn": "2025-11-17T18:34:11+00:00",
  • "data": {
    • "id": "8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278",
    • "customerTypeId": "a6fe15b1-8131-4f48-8082-311e0369f599",
    • "givenName": "John",
    • "familyName": "Doe",
    • "fullName": "John Doe",
    • "emailAddress": "john.doe@example.com",
    • "phoneNumber": "+49123456789",
    • "preferredLocale": "sv_SE",
    • "registeredAt": "2025-11-17T18:34:11+00:00"
    }
}

Customer anonymized Webhook

Triggered when a customer is anonymized. This means their details have been erased.

Authorizations:
WebhookSignature
Request Body schema: application/json
event
required
string
Value: "customer.anonymized"
occurredOn
required
string <date-time>
required
object (AnonymizedCustomer)

Data of the customer

Responses

Request samples

Content type
application/json
{
  • "event": "customer.anonymized",
  • "occurredOn": "2025-11-17T18:34:11+00:00",
  • "data": {
    • "id": "8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278",
    • "customerTypeId": "a6fe15b1-8131-4f48-8082-311e0369f599",
    • "givenName": "Anonymous",
    • "familyName": "Anonymous",
    • "fullName": "Anonymous Anonymous",
    • "emailAddress": null,
    • "phoneNumber": null,
    • "preferredLocale": "sv_SE",
    • "registeredAt": "2025-11-17T18:34:11+00:00"
    }
}

Customer removed Webhook

Triggered when a customer is removed from the system.

Authorizations:
WebhookSignature
Request Body schema: application/json
event
required
string
Value: "customer.removed"
occurredOn
required
string <date-time>
required
object (Customer)

Data of the customer

Responses

Request samples

Content type
application/json
{
  • "event": "customer.removed",
  • "occurredOn": "2025-11-17T18:34:11+00:00",
  • "data": {
    • "id": "8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278",
    • "customerTypeId": "a6fe15b1-8131-4f48-8082-311e0369f599",
    • "givenName": "John",
    • "familyName": "Doe",
    • "fullName": "John Doe",
    • "emailAddress": "john.doe@example.com",
    • "phoneNumber": "+49123456789",
    • "preferredLocale": "sv_SE",
    • "registeredAt": "2025-11-17T18:34:11+00:00"
    }
}