VAT
properties are still available, but are deprecated./v1/tax-rates
endpoint and deprecated the old /v1/vat-rates
endpoint.The Let's Book API uses the REST standard. When an endpoint accepts
parameters, the data should be sent as a JSON body or form-encoded.
The response will always be returned as JSON. All endpoints start with the
base URL: https://api.letsbook.app
. The OpenAPI specification is
available at https://developers.lets-book.com/api-spec.json.
Note: The API is currently in beta. Please contact us if you run into any issues.
You can be certain all GET requests won't change any data and are therefore idempotent while POST/PUT/DELETE requests are not. We use HTTP status codes to communicate what went wrong whenever possible.
To use the API, you'll need an API key which can be obtained from the
dashboard. The API key is
used as a 'Bearer Authentication' token. Note that the API key is case
sensitive. The tooling you're using probably supports Bearer Authentication.
If you're using a tool that doesn't, you can construct the Authorization
header yourself like this: Authorization: Bearer <API_KEY>
.
For example, when your API key is
ac11f67b-1dcb-460c-aff3-f1ef35cd3c1c|pMKSUHcHXd7706zhHwBE040alh1BSY9RPsu6ZQ04
you should set the header as follows:
Authorization: Bearer ac11f67b-1dcb-460c-aff3-f1ef35cd3c1c|pMKSUHcHXd7706zhHwBE040alh1BSY9RPsu6ZQ04
If your API user has access to multiple tenants, you should
supply the X-Tenant-Id
header with every request. If no header is
specified, we will assume the default tenant.
You can use the /me
endpoint to get a list of all tenants you
have access to. You can then use the id
of the tenant you want to
access. Let's say the ID is 9366b305-e315-4abe-ba8a-90e326ad8e81
.
You can then set the header like this:
X-Tenant-Id: 9366b305-e315-4abe-ba8a-90e326ad8e81
Retrieve user information about the current user.
required | object Information about 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 is the pickup & return point for a boat. Boats can be moored at docks for a period 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 is a type of boat. Many boat rental companies have multiple of interchangeable boats. We call that 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"
}
}
Returns a 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
}
}
Register a new customer
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 made by customers or staff members. It is basically a reservation for a specific boat model, picked up at a certain time at a specific dock and returned an at a certain time at that same dock.
Bookings can have different statuses.
Returns a 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" Only show bookings with the supplied status |
updatedAfter | string <date-time> Example: updatedAfter=2022-01-01T00:00:00Z Only show bookings updated after supplied date 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 confirmed
booking.
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 (schemas) 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"
}
}
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 is 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 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"
}
}
}