VAT
properties remain available but are now deprecated./v1/tax-rates
endpoint and deprecated the legacy /v1/vat-rates
endpoint.The Let's Book API adheres to REST standards. When an endpoint accepts
parameters, data should be transmitted as either a JSON body or form-encoded data.
All responses are returned in JSON format. Every endpoint begins with the
base URL: https://api.letsbook.app
. The OpenAPI specification is
available at https://developers.lets-book.com/api-spec.json.
You can be assured that all GET requests will not modify any data and are therefore idempotent, while POST/PUT/DELETE requests are not. We utilize HTTP status codes to communicate errors whenever possible.
To access the API, you will need an API key, which can be obtained from the
dashboard. The API key is
utilized as a Bearer Authentication token. Please note that the API key is case-
sensitive. Most tooling supports Bearer Authentication natively.
If you are using a tool that does not support it, you can construct the Authorization
header manually as follows: Authorization: Bearer <API_KEY>
.
For instance, when your API key is
ac11f67b-1dcb-460c-aff3-f1ef35cd3c1c|pMKSUHcHXd7706zhHwBE040alh1BSY9RPsu6ZQ04
,
you should configure the header as follows:
Authorization: Bearer ac11f67b-1dcb-460c-aff3-f1ef35cd3c1c|pMKSUHcHXd7706zhHwBE040alh1BSY9RPsu6ZQ04
If your API user has access to multiple tenants, you should
include the X-Tenant-Id
header with every request. If no header is
provided, we will default to your primary tenant.
You can utilize the /me
endpoint to retrieve a list of all tenants to which you
have access. You can then use the id
of the desired tenant.
For example, if the ID is 9366b305-e315-4abe-ba8a-90e326ad8e81
,
you would configure the header as follows:
X-Tenant-Id: 9366b305-e315-4abe-ba8a-90e326ad8e81
Retrieves information about the current user. Primarily used to verify that authentication is functioning as expected.
Retrieves user information for the currently authenticated user.
required | object Information regarding the authenticated API user |
{- "data": {
- "description": "My app API key",
- "currentTenant": {
- "id": "1e48f449-d111-4323-87c5-eeab2d2ceb91",
- "name": "My tenant",
- "slug": "my-tenant"
}, - "tenants": [
- {
- "id": "1e48f449-d111-4323-87c5-eeab2d2ceb91",
- "name": "Barry's boats",
- "slug": "barrys-boats"
}, - {
- "id": "e940aa11-0e7e-4267-9233-d5c78977e28e",
- "name": "Crazy canoes",
- "slug": "crazy-canoes"
}
]
}
}
A dock serves as the pickup and return point for boats. Boats can be moored at docks for specified periods of time.
Returns a list of your docks. The docks are sort by the order as defined in the dashboard. The response is not paginated.
required | Array of objects (Dock) |
{- "data": [
- {
- "id": "8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278",
- "name": "Amsterdam East",
- "slug": "amsterdam-east",
- "address": {
- "country": "NL",
- "line1": "Church street 1",
- "line2": "Apt. 1",
- "city": "Amsterdam",
- "postalCode": "1071XA",
- "stateOrRegion": "NY",
- "gps": {
- "lat": 52.37,
- "long": 4.89
}, - "timeZoneName": "Europe/Amsterdam"
}, - "media": [
- {
- "id": "a74c7c12-90f1-45ab-88ca-d2a63a424ed1",
- "type": "image",
- "variants": {
}
}
], - "opensAt": "2022-02-08T09:30:26+0000"
}
]
}
Retrieve a Dock object by ID
id required | string Example: 8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278 ID of the dock |
required | object (Dock) The location from where boats can be picked up |
{- "data": {
- "id": "8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278",
- "name": "Amsterdam East",
- "slug": "amsterdam-east",
- "address": {
- "country": "NL",
- "line1": "Church street 1",
- "line2": "Apt. 1",
- "city": "Amsterdam",
- "postalCode": "1071XA",
- "stateOrRegion": "NY",
- "gps": {
- "lat": 52.37,
- "long": 4.89
}, - "timeZoneName": "Europe/Amsterdam"
}, - "media": [
- {
- "id": "a74c7c12-90f1-45ab-88ca-d2a63a424ed1",
- "type": "image",
- "variants": {
}
}
], - "opensAt": "2022-02-08T09:30:26+0000"
}
}
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.
Returns a list of boat models. The boat models are sort by the order as defined in the dashboard. The response is not paginated.
required | Array of objects (BoatModel) |
{- "data": [
- {
- "id": "8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278",
- "name": "Outboard boat",
- "slug": "outboard-boat",
- "capacity": 2,
- "shortDescription": "A short description",
- "description": "A longer description",
- "media": [
- {
- "id": "a74c7c12-90f1-45ab-88ca-d2a63a424ed1",
- "type": "image",
- "variants": {
}
}
], - "categoryId": "8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278"
}
]
}
Retrieve a BoatModel object by ID
id required | string Example: 8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278 ID of the boat model |
required | object (BoatModel) A boat model |
{- "data": {
- "id": "8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278",
- "name": "Outboard boat",
- "slug": "outboard-boat",
- "capacity": 2,
- "shortDescription": "A short description",
- "description": "A longer description",
- "media": [
- {
- "id": "a74c7c12-90f1-45ab-88ca-d2a63a424ed1",
- "type": "image",
- "variants": {
}
}
], - "categoryId": "8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278"
}
}
Retrieves a comprehensive list of your customers.
page | integer Default: 1 Example: page=1 The page number to fetch |
required | Array of objects (Customer) |
required | object (Pagination) Pagination to iterate large result sets. |
{- "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": "2022-01-01T13:37:00Z"
}
], - "pagination": {
- "totalItems": 1337,
- "perPage": 100,
- "page": 1,
- "totalPages": 14,
- "previousPageUrl": null
}
}
Registers a new customer in the system
customerTypeId required | string 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 |
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. |
required | object (Customer) Data of the customer |
{- "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
}
{- "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": "2022-01-01T13:37:00Z"
}
}
Returns a list of all customers matching the query
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 |
required | Array of objects (Customer) |
required | object (Pagination) Pagination to iterate large result sets. |
{- "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": "2022-01-01T13:37:00Z"
}
], - "pagination": {
- "totalItems": 1337,
- "perPage": 100,
- "page": 1,
- "totalPages": 14,
- "previousPageUrl": null
}
}
Retrieve a Customer object by ID
id required | string Example: 8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278 ID of the customer |
required | object (Customer) Data of the customer |
{- "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": "2022-01-01T13:37:00Z"
}
}
Update an existing customer
id required | string Example: 8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278 ID of the customer |
customerTypeId | string 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 |
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. |
required | object (Customer) Data of the customer |
{- "customerTypeId": "a6fe15b1-8131-4f48-8082-311e0369f599",
- "givenName": "John",
- "familyName": "Doe",
- "emailAddress": "john.doe@example.com",
- "phoneNumber": "+49123456789",
- "preferredLocale": "sv_SE",
- "password": "correcthorsebatterystaple"
}
{- "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": "2022-01-01T13:37:00Z"
}
}
Returns a list of all customer types. The response is not paginated.
required | Array of objects (CustomerType) |
{- "data": [
- {
- "id": "d1f59518-9be6-441f-8ce8-c810d1d9b332",
- "name": "Premium member",
- "abbreviation": "PM",
- "type": "custom"
}
]
}
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.
Bookings can have various statuses.
Retrieves a comprehensive list of all bookings.
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 ISO8601 format |
required | Array of objects (Booking) |
required | object (Pagination) Pagination to iterate large result sets. |
{- "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"
}
], - "pagination": {
- "totalItems": 1337,
- "perPage": 100,
- "page": 1,
- "totalPages": 14,
- "previousPageUrl": null
}
}
Creates a new booking with confirmed
status.
customerId required | string ID of the customer |
dockId required | string ID of the dock |
boatModelId required | string 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. |
required | object |
{- "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
}
{- "data": {
- "bookingId": "4a974b2a-2d35-4313-a2e9-5aee4e83601f"
}
}
Retrieve a booking and its financial details and customer details.
id required | string Example: 8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278 ID of the booking |
required | object (BookingExtended) Comprehensive booking details |
{- "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": {
- "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": "2022-01-01T13:37:00Z"
}, - "financialDetails": {
- "psp": "stripe",
- "currency": "EUR",
- "balance": 0,
- "applicationFee": {
- "amount": 35,
- "currency": "EUR"
}, - "costs": {
- "totalIncludingTax": 1750,
- "totalExcludingTax": 1466,
- "totalIncludingVat": 1750,
- "totalExcludingVat": 1466,
- "lines": [
- {
- "id": "3d0ed9eb-95d3-4e21-a389-2218adab7850",
- "description": "Crate of beer (24 bottles)",
- "type": "pricing_structure",
- "taxRateId": "3d0ed9eb-95d3-4e21-a389-2218adab7850",
- "amountIncludingTax": 1750,
- "amountExcludingTax": 1446,
- "vatRateId": "3d0ed9eb-95d3-4e21-a389-2218adab7850",
- "amountIncludingVat": 1750,
- "amountExcludingVat": 1446
}
]
}, - "payments": {
- "total": 1750,
- "lines": [
- {
- "id": "d5a81709-8922-4c81-a854-c2c0c487b903",
- "source": "cash",
- "amount": 1750,
- "createdAt": "2022-01-01T12:00:00Z"
}
]
}, - "deposits": {
- "total": 15000,
- "lines": [
- {
- "id": "cbfa2986-7759-4d52-9b6e-2fa7fbdb54d2",
- "description": "Deposit for booking \\#H8K13L",
- "amount": 15000,
- "createdAt": "2022-01-01T12:00:00Z"
}
]
}
}
}
}
Update an existing booking.
id required | string Example: 8d159bbe-f6bc-4ddd-8c9a-6091d7ebd278 ID of the booking |
Update booking parameters. None of the fields are required.
customerId | string ID of the customer |
dockId | string ID of the dock |
boatModelId | string 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. |
required | object |
{- "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
}
{- "data": {
- "bookingId": "4a974b2a-2d35-4313-a2e9-5aee4e83601f"
}
}
A tax rate is a named percentage used to calculate taxes on add-ons, costs, and other charges.
Returns a list of tax rates used in costs, add-ons, etc. The response is not paginated.
required | Array of objects (TaxRate) |
{- "data": [
- {
- "id": "d8f8feb5-b8cc-4b8e-9d5c-a9d9d9d9d9d9",
- "name": "NL High",
- "percentage": 21,
- "readOnly": false
}
]
}
Deprecated. Use the GET /v1/tax-rates
endpoint instead.
required | Array of objects (TaxRate) |
{- "data": [
- {
- "id": "d8f8feb5-b8cc-4b8e-9d5c-a9d9d9d9d9d9",
- "name": "NL High",
- "percentage": 21,
- "readOnly": false
}
]
}
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.
Get availability for a boat model at a dock during a date/time period
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 |
required | object The availability result |
required | object The parameters used to calculate availability. Can be used to verify the query parameters were parsed correctly. |
{- "data": {
- "lowestAvailability": 4,
- "perMoment": [
- {
- "moment": "2022-01-01T00:00:00Z",
- "availability": 4
}
]
}, - "parameters": {
- "dockId": "878f1403-9677-482d-a09d-392004de8c46",
- "boatModelId": "2d2071f6-0a1d-4aca-a49d-4d112b141c44",
- "period": {
- "start": "2022-01-01T00:00:00Z",
- "end": "2022-01-03T00:00:00Z"
}
}
}