API Reference
Welcome to Bookinglayer’s Public API documentation.
If you have any questions or requests please send them through to tech@bookinglayer.com.
The Bookinglayer API is organized around REST. Our API has predictable resource-oriented URLs, accepts form-encoded and JSON-encoded request bodies, returns JSON-encoded responses. Uses standard HTTP response codes, authentication, and verbs.
Authentication
The Bookinglayer Public API uses Business Id to authenticate requests. You can view your Business Id in the Bookinglayer Backoffice > Settings > API.
There are two ways to pass business id with request:
- (Recommended) Set Business-Id in request headers (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX).
- add to query string ?business_id=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX, we support it to make life easier for debugging via browser.
All API requests must be made over HTTPS. Calls made over plain HTTP will fail. API requests without authentication will also fail.
Example Response (200):
{
"data": {
"accommodation_list_mode": true,
"analytics_track_purchase_on_checkout": false,
"cp_version": 2,
"default_guest_language": "en",
"default_order_lock_time": 30,
"default_country_id": "1",
"enable_currency_conversion": true,
...
}
}
Example Response (400):
{"error": {"message": "Missing business_id or business domain."}}
Example Response (404):
{"error": {"message": "No query results for model [App\\Business]."}}
HTTP request
GET public/bookings
URL Parameters
Parameter | Status | Description |
---|---|---|
business_id |
optional | business uuid, required when business_domain is missing. |
business_domain |
optional | business domain (string), required when business_id is missing. |
Filters
Date range type
Filters described as date range allows to filter in 4 ways:
- "2020-01-01" specific date, it will show entities related just to this date,
- "2020-01-01,2020-01-30" closed date range, it will show entities for given date range from,to (>= date field <=),
- "2020-01-01," open date range, it will show entities from given start date without limiting on end,
- ",2020-01-01" open date range, it will show entities to given end date without limiting start,
Amount range type
Filters described as amount range allows to filter in 4 ways:
- "100" specific amount (equal), it will show entities related just to this amount,
- "100,200" closed amount range, it will show entities for given amount range from,to (>= date field <=),
- "100," open amount range, it will show entities from given amount without limiting on end,
- ",200" open amount range, it will show entities to given amount without limiting start,
Sorting
Notation field{,direction} direction is optional desc by default. Example ?sort_by=created_at,asc
Naming convention
Here we describe some naming convention that we fallow across whole api.
- Dates have always "_at" suffix like: created_at, updated_at, starts_at,
- Booleans have always "is_" or "has_" prefixes like: is_checked_in, has_accommodations,
Errors
Example Response (401):
{
"error": {
"message": "Missing business_id or business domain."
}
}
Example Response (422):
{
"data": {
"message": "The given data was invalid.",
"errors": {
"start": [
"The start field is required"
]
}
}
}
Bookinglayer uses conventional HTTP response codes to indicate the success or failure of an API request. In general: Codes in the 2xx range indicate success. Codes in the 4xx range indicate an error that failed given the information provided (e.g., a required parameter was omitted, etc.).
All error responses have same structure error.message + proper HTTP code and status.
Code | Status | Description |
---|---|---|
200 |
OK | Everything worked as expected. |
400 |
Bad Request | The request was unacceptable. |
401 |
Unauthorized | No valid business_id provided. |
402 |
Request Failed | The parameters were valid but the request failed. |
403 |
Forbidden | The business owner excluded endpoint from public, app doesn't have permissions to perform the request. |
404 |
Not Found | The requested resource doesn't exist. |
422 |
Unprocessable Entity | the server understands the content type of the request entity, but it was unable to process the contained instructions. Often due to missing a required parameter or other validation errors. |
429 |
Too Many Requests | Too many requests hit the API too quickly. We recommend an exponential backoff of your requests. |
50X |
Server Errors | Something went wrong on Bookinglayer's end. (These are rate :)) |
Accommodation Availabilities
List Availabilities
Availabilities list for accommodation. This is a special endpoint for product availabilities (more general is #product-availabilities)
HTTP Request
GET public/accommodations/availabilities
Query Parameters
Parameter | Status | Description |
---|---|---|
start |
required | date in yyyy-mm-dd format. |
end |
required | date in yyyy-mm-dd format. |
package |
optional | product id, get accommodation availabilities bound with given package. |
currency |
optional | ISO 4217 (eur, usd...). |
mode |
optional | two options, checkin and checkout, default: checkin, depends on product configuration checkin and checkout availabilities may be different. |
show_available_only |
optional | boolean, 1 will show just dates that have enough availability, 0 will show every date between given period default: 1. |
male |
optional | pax param, number of male guests, required when other pax params are missing. |
female |
optional | pax param, number of female guests, required when other pax params are missing. |
couple |
optional | pax param, number of couples (2 guests), required when other pax params are missing. |
genderless |
optional | pax param, number of genderless guests, required when other pax params are missing, in some cases we don't care about gender guest. |
Booking Engine
public/booking_engine
Example response (200):
{
"data": {
"redirect": "\/frontoffice"
}
}
HTTP Request
GET public/booking_engine
Cart
Persist Cart
Action process BookingRequest json and blocks product availabilities for X min, X is defined on business level.
Example request:
{
"start": "2020-04-05",
"end": "2020-04-09",
"currency": "EUR",
"guests": [
{
"id": "2ccea59b-b9a1-4ba9-94c2-ba3103501058",
"gender": "females",
"first_name": "Susanna",
"last_name": "Boyle",
"email": "Coby_Mueller@gmail.com",
"date_of_birth": "1988-02-27"
}
],
"bookings": [
{
"product_id": "2459a382-3e6c-4456-88d7-c526026fd64e",
"guest_id": "2ccea59b-b9a1-4ba9-94c2-ba3103501058",
"value": [
"2020-04-05",
"2020-04-09"
],
"items": [
{
"id": 105670,
"value": [
"2020-04-07",
"2020-04-08"
]
},
{
"id": 105698,
"value": 3
},
{
"id": 105700,
"value": true
},
{
"id": 105667,
"value": [
"2020-04-05",
"2020-04-07",
"2020-04-08",
"2020-04-09"
]
},
{
"id": 105668,
"value": [
"2020-04-06"
]
}
]
}
]
}
Example response (200):
{
"data": {
"id": "7888f153-9bc7-4a8c-970c-aea27970d615",
"expire_at": "2020-06-23T20:09:08+00:00",
"channel": "frontoffice"
}
}
HTTP Request
POST public/carts
Body Parameters
Parameter | Type | Status | Description |
---|---|---|---|
currency |
string | required | iso_3 code, in example: eur, usd. |
guests |
array | required | array of guest objects. |
guests.*.id |
uuid | optional | append to guest order. |
guests.*.first_name |
string | optional | |
guests.*.last_name |
string | optional | |
guests.*.email |
string | optional | |
guests.*.group_id |
integer | optional | |
bookings |
array | required | bookings to count prices. |
bookings.product_id |
uuid | required | |
bookings.dates.* |
array | required | set of dates, in terms of package and accommodation bookings, first and last date is relevant. |
bookings.parent_id |
uuid | required | nullable, id of parent id. |
bookings.guest_id |
uuid | required | nullable, id of parent, in example when item is a part of package. |
Get Cart
Example response (200):
{
"data": {
"id": "7888f153-9bc7-4a8c-970c-aea27970d615",
"expire_at": "2020-06-23T20:09:08+00:00",
"channel": "frontoffice"
}
}
HTTP Request
GET public/carts/{carts_uuid}
Cart update
When discount code is invalid, you'll get bad request with proper message.
Example request:
{
"discount_code": "occaecati"
}
HTTP Request
PUT public/carts/{carts_uuid}
PATCH public/carts/{carts_uuid}
Body Parameters
Parameter | Type | Status | Description |
---|---|---|---|
discount_code |
string | optional |
Cart delete
Abandon cart, unblock product availabilities.
HTTP Request
DELETE public/carts/{carts_uuid}
Cart totals
Example response (200):
{
"data": {
"totals": {
"base": 1721.33,
"upgrades": 545,
"sub_total": 4966.33,
"discounts": 496.63,
"accommodations": 2700,
"donations": 10,
"total": 0,
"gift_certificate_left": 1520.3,
"gift_certificate": 4479.7
}
}
}
HTTP Request
GET public/carts/{carts_uuid}/totals
Cart Itinerary
Example response (200):
{
"data": [
{
"guest": {
"id": "787f31d2-a787-4502-b123-25827dafb41c",
"first_name": "Braden",
"last_name": "Altenwerth",
"email": "margarett.stamm@yahoo.com",
"birth_date": "1997-10-14",
"gender": "f",
"phone_country_code": null,
"phone": null,
"language_code": "en",
"address_line_1": null,
"address_line_2": null,
"address_line_3": null,
"zip_code": null,
"city": null,
"state": null,
"initials": "BA",
"custom_fields": {
"shoe_size_5e90888d22e8b": null,
"shirt_size_5e9088b5e7be2": null
},
"created_at": "2020-06-23T19:45:08+00:00",
"updated_at": "2020-06-23T19:45:08+00:00"
},
"bookings": [
{
"guest_id": "787f31d2-a787-4502-b123-25827dafb41c",
"parent_id": null,
"product": {
"id": "2459a382-3e6c-4456-88d7-c526026fd64e",
"backoffice_title": "Surf Weekend Package",
"title": "Surf Weekend Package",
"translations": {
"en": {
"title": "Surf Weekend Package",
"frontoffice_title": "Surf Weekend Package",
"description": "Stay 2 or 3 nights with us and get daily surf coaching with optional video analysis.",
"extended_description": null
}
},
"images": [
{
"src": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/09\/surf-package-best.png",
"small": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/09\/100_surf-package-best.png",
"medium": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/09\/320_surf-package-best.png",
"large": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/09\/960_surf-package-best.png"
}
],
"type": "package",
"location": {
"id": 1258,
"title": "Spain",
"abbreviation": "ES"
}
},
"dates": [
{
"starts_at": "2020-07-18 14:00:00",
"ends_at": "2020-07-26 10:00:00",
"price": 666.67
}
],
"qty": 1,
"price": 666.67,
"children": [
{
"guest_id": "787f31d2-a787-4502-b123-25827dafb41c",
"parent_id": 4956069,
"product": {
"id": "aa45e46a-023f-4cbd-b701-18d8a3ed0f8a",
"backoffice_title": "11 - Double Deluxe",
"title": "11 - Double Deluxe",
"translations": {
"en": {
"title": "11 - Double Deluxe",
"frontoffice_title": "11 - Double Deluxe",
"description": "Please provide a short description here.",
"extended_description": null
}
},
"images": [],
"type": "accommodation",
"location": {
"id": 1258,
"title": "Spain",
"abbreviation": "ES"
}
},
"dates": [
{
"starts_at": "2020-07-18 14:00:00",
"ends_at": "2020-07-26 10:00:00",
"price": 1350
}
],
"qty": 9,
"price": 1350,
"children": []
},
{
"guest_id": "787f31d2-a787-4502-b123-25827dafb41c",
"parent_id": 4956069,
"product": {
"id": "e9cf499f-8adf-4d31-bf76-4b31bbac9ff8",
"backoffice_title": "Full Board",
"title": "Full Board",
"translations": {
"en": {
"title": "Full Board",
"frontoffice_title": "Full Board",
"description": "Enjoy a healthy breakfast, lunch and dinner.",
"extended_description": null
},
"es": {
"title": null,
"frontoffice_title": "Pensión completa",
"description": null,
"extended_description": null
}
},
"images": [
{
"src": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/alejandro-luengo-wQ82bn771-U-unsplash.jpg",
"small": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/100_alejandro-luengo-wQ82bn771-U-unsplash.jpg",
"medium": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/320_alejandro-luengo-wQ82bn771-U-unsplash.jpg",
"large": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/960_alejandro-luengo-wQ82bn771-U-unsplash.jpg"
}
],
"type": "bundle",
"location": {
"id": 1258,
"title": "Spain",
"abbreviation": "ES"
}
},
"dates": [
{
"starts_at": null,
"ends_at": null,
"price": 2
}
],
"qty": 1,
"price": 2,
"children": [
{
"guest_id": "787f31d2-a787-4502-b123-25827dafb41c",
"parent_id": 4956094,
"product": {
"id": "b6b01d82-7e79-4e23-b834-b7bb20053e8a",
"backoffice_title": "Breakfast",
"title": "Breakfast",
"translations": {
"en": {
"title": "Breakfast",
"frontoffice_title": "Breakfast",
"description": "The breakfast menu includes cereals, fresh fruit, juices and smoothies, homemade bread basket with spreads, pastries, coffe, milk and more.",
"extended_description": ""
},
"es": {
"title": null,
"frontoffice_title": "Breakfast",
"description": "El menú del desayuno incluye cereales, fruta fresca, zumos y batidos, pan recién hecho, café, leche y más.",
"extended_description": null
}
},
"images": [],
"type": "service",
"location": {
"id": 1258,
"title": "Spain",
"abbreviation": "ES"
}
},
"dates": [
{
"starts_at": null,
"ends_at": null,
"price": 0
}
],
"qty": 1,
"price": 0,
"children": []
},
{
"guest_id": "787f31d2-a787-4502-b123-25827dafb41c",
"parent_id": 4956094,
"product": {
"id": "7d3c7568-1af7-4133-9f1a-a26ce115e94a",
"backoffice_title": "Dinner",
"title": "Dinner",
"translations": {
"en": {
"title": "Dinner",
"frontoffice_title": "Dinner",
"description": "Please provide a short description here.",
"extended_description": null
}
},
"images": [],
"type": "service",
"location": {
"id": 1258,
"title": "Spain",
"abbreviation": "ES"
}
},
"dates": [
{
"starts_at": null,
"ends_at": null,
"price": 0
}
],
"qty": 1,
"price": 0,
"children": []
},
{
"guest_id": "787f31d2-a787-4502-b123-25827dafb41c",
"parent_id": 4956094,
"product": {
"id": "63f37cd0-ff2a-4d1a-b68f-82631c61bdde",
"backoffice_title": "Lunch bag",
"title": "Bolsa con almuerzo",
"translations": {
"en": {
"title": "Lunch bag",
"frontoffice_title": "Bolsa con almuerzo",
"description": "Please provide a short description here.",
"extended_description": null
}
},
"images": [],
"type": "service",
"location": {
"id": 1258,
"title": "Spain",
"abbreviation": "ES"
}
},
"dates": [
{
"starts_at": null,
"ends_at": null,
"price": 0
}
],
"qty": 1,
"price": 0,
"children": []
}
]
},
{
"guest_id": "787f31d2-a787-4502-b123-25827dafb41c",
"parent_id": 4956069,
"product": {
"id": "fb82b5ff-69c6-4cf4-8025-4dc9fe581a4d",
"backoffice_title": "Private Surf Coaching",
"title": "Private Surf Coaching",
"translations": {
"en": {
"title": "Private Surf Coaching",
"frontoffice_title": "Private Surf Coaching",
"description": "Work on your surf skills with a dedicated surf instructor during a 3 hour private session.",
"extended_description": null
},
"es": {
"title": null,
"frontoffice_title": "Entrenamiento de surf privado",
"description": "Mejora tu surfing con un clase privado. Una session tarda 3 horas y incluye material si lo necesites.",
"extended_description": null
}
},
"images": [
{
"src": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/sincerely-media-oC32cy4x-ZA-unsplash.jpg",
"small": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/100_sincerely-media-oC32cy4x-ZA-unsplash.jpg",
"medium": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/320_sincerely-media-oC32cy4x-ZA-unsplash.jpg",
"large": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/960_sincerely-media-oC32cy4x-ZA-unsplash.jpg"
}
],
"type": "activity",
"location": {
"id": 1258,
"title": "Spain",
"abbreviation": "ES"
}
},
"dates": [
{
"starts_at": "2020-07-20 09:00:00",
"ends_at": "2020-07-20 12:00:00",
"price": 70
},
{
"starts_at": "2020-07-24 09:00:00",
"ends_at": "2020-07-24 12:00:00",
"price": 70
}
],
"qty": 2,
"price": 140,
"children": []
},
{
"guest_id": "787f31d2-a787-4502-b123-25827dafb41c",
"parent_id": 4956069,
"product": {
"id": "49882dc9-86f5-420b-8b9a-23b00c071672",
"backoffice_title": "Beginner Surf",
"title": "Beginner Surf",
"translations": {
"en": {
"title": "Beginner Surf",
"frontoffice_title": "Beginner Surf",
"description": "Our Beginner Surf lessons are designed for those who only surf once a year or who have not surfed before.",
"extended_description": null
},
"es": {
"title": null,
"frontoffice_title": "Surf Principantes",
"description": "Nuestros clases para principantes son para los que surfean una vez al año o los que nunca han surfeado en su vida.",
"extended_description": null
}
},
"images": [
{
"src": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/09\/beginner-surf.png",
"small": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/09\/100_beginner-surf.png",
"medium": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/09\/320_beginner-surf.png",
"large": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/09\/960_beginner-surf.png"
}
],
"type": "activity",
"location": {
"id": 1258,
"title": "Spain",
"abbreviation": "ES"
}
},
"dates": [
{
"starts_at": "2020-07-22 09:00:00",
"ends_at": "2020-07-22 11:00:00",
"price": 20
},
{
"starts_at": "2020-07-18 09:00:00",
"ends_at": "2020-07-18 11:00:00",
"price": 20
},
{
"starts_at": "2020-07-26 09:00:00",
"ends_at": "2020-07-26 11:00:00",
"price": 20
}
],
"qty": 3,
"price": 60,
"children": []
},
{
"guest_id": "787f31d2-a787-4502-b123-25827dafb41c",
"parent_id": 4956069,
"product": {
"id": "0d3728d6-a39d-40c4-857a-d90621e1349b",
"backoffice_title": "Advanced Surf",
"title": "Advanced Surf",
"translations": {
"en": {
"title": "Advanced Surf",
"frontoffice_title": "Advanced Surf",
"description": "Advanced Surf lessons are for independant surfers who want to improve their turns and manoeuvres. Advanced Surf lessons are for independant surfers who want to improve their turns and manoeuvres. Advanced Surf lessons are for independant surfers who want to improve their turns and manoeuvres. Advanced Surf lessons are for independant surfers who want to improve their turns and manoeuvres.",
"extended_description": null
},
"es": {
"title": null,
"frontoffice_title": "Surf Avanzado",
"description": "Nuestros clases de surf avanzado son para surfistas independientes que quieren mejorar sus giros y maniobras.",
"extended_description": null
}
},
"images": [
{
"src": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/chris-osmond-q9GnP8x-yEs-unsplash%20%281%29.jpg",
"small": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/100_chris-osmond-q9GnP8x-yEs-unsplash%20%281%29.jpg",
"medium": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/320_chris-osmond-q9GnP8x-yEs-unsplash%20%281%29.jpg",
"large": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/960_chris-osmond-q9GnP8x-yEs-unsplash%20%281%29.jpg"
}
],
"type": "activity",
"location": {
"id": 1258,
"title": "Spain",
"abbreviation": "ES"
}
},
"dates": [
{
"starts_at": "2020-07-25 14:00:00",
"ends_at": "2020-07-25 16:00:00",
"price": 50
},
{
"starts_at": "2020-07-21 14:00:00",
"ends_at": "2020-07-21 16:00:00",
"price": 50
},
{
"starts_at": "2020-07-19 14:00:00",
"ends_at": "2020-07-19 16:00:00",
"price": 50
},
{
"starts_at": "2020-07-23 14:00:00",
"ends_at": "2020-07-23 16:00:00",
"price": 50
}
],
"qty": 4,
"price": 200,
"children": []
},
{
"guest_id": "787f31d2-a787-4502-b123-25827dafb41c",
"parent_id": 4956069,
"product": {
"id": "7d3c7568-1af7-4133-9f1a-a26ce115e94a",
"backoffice_title": "Dinner",
"title": "Dinner",
"translations": {
"en": {
"title": "Dinner",
"frontoffice_title": "Dinner",
"description": "Please provide a short description here.",
"extended_description": null
}
},
"images": [
{
"src": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/stefan-vladimirov-Q_Moi2xjieU-unsplash.jpg",
"small": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/100_stefan-vladimirov-Q_Moi2xjieU-unsplash.jpg",
"medium": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/320_stefan-vladimirov-Q_Moi2xjieU-unsplash.jpg",
"large": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/960_stefan-vladimirov-Q_Moi2xjieU-unsplash.jpg"
}
],
"type": "service",
"location": {
"id": 1258,
"title": "Spain",
"abbreviation": "ES"
}
},
"dates": [
{
"starts_at": null,
"ends_at": null,
"price": 12
}
],
"qty": 1,
"price": 12,
"children": []
},
{
"guest_id": "787f31d2-a787-4502-b123-25827dafb41c",
"parent_id": 4956069,
"product": {
"id": "b6b01d82-7e79-4e23-b834-b7bb20053e8a",
"backoffice_title": "Breakfast",
"title": "Breakfast",
"translations": {
"en": {
"title": "Breakfast",
"frontoffice_title": "Breakfast",
"description": "The breakfast menu includes cereals, fresh fruit, juices and smoothies, homemade bread basket with spreads, pastries, coffe, milk and more.",
"extended_description": ""
},
"es": {
"title": null,
"frontoffice_title": "Breakfast",
"description": "El menú del desayuno incluye cereales, fruta fresca, zumos y batidos, pan recién hecho, café, leche y más.",
"extended_description": null
}
},
"images": [
{
"src": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/ben-kolde-FFqNATH27EM-unsplash.jpg",
"small": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/100_ben-kolde-FFqNATH27EM-unsplash.jpg",
"medium": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/320_ben-kolde-FFqNATH27EM-unsplash.jpg",
"large": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/960_ben-kolde-FFqNATH27EM-unsplash.jpg"
}
],
"type": "service",
"location": {
"id": 1258,
"title": "Spain",
"abbreviation": "ES"
}
},
"dates": [
{
"starts_at": null,
"ends_at": null,
"price": 15
},
{
"starts_at": null,
"ends_at": null,
"price": 15
}
],
"qty": 2,
"price": 30,
"children": []
},
{
"guest_id": "787f31d2-a787-4502-b123-25827dafb41c",
"parent_id": 4956069,
"product": {
"id": "dadfba06-9ffa-412c-840e-e8eee6289ec5",
"backoffice_title": "Surfboard Wax Premium",
"title": "Surfboard Wax",
"translations": {
"en": {
"title": "Surfboard Wax Premium",
"frontoffice_title": "Surfboard Wax",
"description": "For use in water temperatures between 9 and 20 ° C",
"extended_description": null
},
"es": {
"title": null,
"frontoffice_title": "Cera de surf",
"description": "Para usar en temperaturas del agua entre 9 y 20 ° C",
"extended_description": null
}
},
"images": [
{
"src": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/alexandre-capt-0h2kWRb_KEs-unsplash.jpg",
"small": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/100_alexandre-capt-0h2kWRb_KEs-unsplash.jpg",
"medium": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/320_alexandre-capt-0h2kWRb_KEs-unsplash.jpg",
"large": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/960_alexandre-capt-0h2kWRb_KEs-unsplash.jpg"
}
],
"type": "item",
"location": null
},
"dates": [
{
"starts_at": "2020-07-24 12:00:00",
"ends_at": "2020-07-24 12:00:00",
"price": 2.5
},
{
"starts_at": "2020-07-26 12:00:00",
"ends_at": "2020-07-26 12:00:00",
"price": 2.5
},
{
"starts_at": "2020-07-25 12:00:00",
"ends_at": "2020-07-25 12:00:00",
"price": 2.5
},
{
"starts_at": "2020-07-21 12:00:00",
"ends_at": "2020-07-21 12:00:00",
"price": 2.5
},
{
"starts_at": "2020-07-23 12:00:00",
"ends_at": "2020-07-23 12:00:00",
"price": 2.5
},
{
"starts_at": "2020-07-22 12:00:00",
"ends_at": "2020-07-22 12:00:00",
"price": 2.5
},
{
"starts_at": "2020-07-20 12:00:00",
"ends_at": "2020-07-20 12:00:00",
"price": 2.5
},
{
"starts_at": "2020-07-19 12:00:00",
"ends_at": "2020-07-19 12:00:00",
"price": 2.5
},
{
"starts_at": "2020-07-18 12:00:00",
"ends_at": "2020-07-18 12:00:00",
"price": 2.5
}
],
"qty": 9,
"price": 22.5,
"children": []
},
{
"guest_id": "787f31d2-a787-4502-b123-25827dafb41c",
"parent_id": 4956069,
"product": {
"id": "4cc1b6d8-50c3-45f0-b018-0b990ccb86af",
"backoffice_title": "Sport Insurance",
"title": "Sport Insurance",
"translations": {
"en": {
"title": "Sport Insurance",
"frontoffice_title": "Sport Insurance",
"description": "We recommend this option if you don't a travel insurance policy that covers sport accidents.",
"extended_description": null
},
"es": {
"title": null,
"frontoffice_title": "Seguro deportivo",
"description": "Recomendamos esta opción si no tiene una póliza de seguro de viaje que cubra accidentes deportivos.",
"extended_description": null
}
},
"images": [
{
"src": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/jametlene-reskp-gVfGGb62Fpo-unsplash.jpg",
"small": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/100_jametlene-reskp-gVfGGb62Fpo-unsplash.jpg",
"medium": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/320_jametlene-reskp-gVfGGb62Fpo-unsplash.jpg",
"large": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/960_jametlene-reskp-gVfGGb62Fpo-unsplash.jpg"
}
],
"type": "item",
"location": null
},
"dates": [
{
"starts_at": "2020-07-18 12:00:00",
"ends_at": "2020-07-18 12:00:00",
"price": 111.75
}
],
"qty": 1,
"price": 111.75,
"children": []
},
{
"guest_id": "787f31d2-a787-4502-b123-25827dafb41c",
"parent_id": 4956069,
"product": {
"id": "c55eab60-a811-4bf1-b1c3-e318cc30ea99",
"backoffice_title": "Donation",
"title": "Donation",
"translations": {
"en": {
"title": "Donation",
"frontoffice_title": "Donation",
"description": "Plant a tree",
"extended_description": null
}
},
"images": [
{
"src": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/josh-appel-NeTPASr-bmQ-unsplash.jpg",
"small": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/100_josh-appel-NeTPASr-bmQ-unsplash.jpg",
"medium": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/320_josh-appel-NeTPASr-bmQ-unsplash.jpg",
"large": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/960_josh-appel-NeTPASr-bmQ-unsplash.jpg"
}
],
"type": "donation",
"location": {
"id": 1258,
"title": "Spain",
"abbreviation": "ES"
}
},
"dates": [
{
"starts_at": null,
"ends_at": null,
"price": 10
}
],
"qty": 1,
"price": 10,
"children": []
}
]
}
]
},
{
"guest": {
"id": "1673f70c-acbe-495f-a75e-992f64fae7cf",
"first_name": "Billy",
"last_name": "Koelpin",
"email": "beaulah27@hotmail.com",
"birth_date": "1985-09-13",
"gender": "f",
"phone_country_code": null,
"phone": null,
"language_code": "en",
"address_line_1": null,
"address_line_2": null,
"address_line_3": null,
"zip_code": null,
"city": null,
"state": null,
"initials": "BK",
"custom_fields": {
"shoe_size_5e90888d22e8b": null,
"shirt_size_5e9088b5e7be2": null
},
"created_at": "2020-06-23T19:45:08+00:00",
"updated_at": "2020-06-23T19:45:08+00:00"
},
"bookings": [
{
"guest_id": "1673f70c-acbe-495f-a75e-992f64fae7cf",
"parent_id": null,
"product": {
"id": "2459a382-3e6c-4456-88d7-c526026fd64e",
"backoffice_title": "Surf Weekend Package",
"title": "Surf Weekend Package",
"translations": {
"en": {
"title": "Surf Weekend Package",
"frontoffice_title": "Surf Weekend Package",
"description": "Stay 2 or 3 nights with us and get daily surf coaching with optional video analysis.",
"extended_description": null
}
},
"images": [
{
"src": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/09\/surf-package-best.png",
"small": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/09\/100_surf-package-best.png",
"medium": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/09\/320_surf-package-best.png",
"large": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/09\/960_surf-package-best.png"
}
],
"type": "package",
"location": {
"id": 1258,
"title": "Spain",
"abbreviation": "ES"
}
},
"dates": [
{
"starts_at": "2020-07-18 14:00:00",
"ends_at": "2020-07-26 10:00:00",
"price": 666.67
}
],
"qty": 1,
"price": 666.67,
"children": [
{
"guest_id": "1673f70c-acbe-495f-a75e-992f64fae7cf",
"parent_id": 4956098,
"product": {
"id": "aa45e46a-023f-4cbd-b701-18d8a3ed0f8a",
"backoffice_title": "11 - Double Deluxe",
"title": "11 - Double Deluxe",
"translations": {
"en": {
"title": "11 - Double Deluxe",
"frontoffice_title": "11 - Double Deluxe",
"description": "Please provide a short description here.",
"extended_description": null
}
},
"images": [],
"type": "accommodation",
"location": {
"id": 1258,
"title": "Spain",
"abbreviation": "ES"
}
},
"dates": [
{
"starts_at": "2020-07-18 14:00:00",
"ends_at": "2020-07-26 10:00:00",
"price": 1350
}
],
"qty": 9,
"price": 1350,
"children": []
},
{
"guest_id": "1673f70c-acbe-495f-a75e-992f64fae7cf",
"parent_id": 4956098,
"product": {
"id": "e9cf499f-8adf-4d31-bf76-4b31bbac9ff8",
"backoffice_title": "Full Board",
"title": "Full Board",
"translations": {
"en": {
"title": "Full Board",
"frontoffice_title": "Full Board",
"description": "Enjoy a healthy breakfast, lunch and dinner.",
"extended_description": null
},
"es": {
"title": null,
"frontoffice_title": "Pensión completa",
"description": null,
"extended_description": null
}
},
"images": [
{
"src": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/alejandro-luengo-wQ82bn771-U-unsplash.jpg",
"small": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/100_alejandro-luengo-wQ82bn771-U-unsplash.jpg",
"medium": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/320_alejandro-luengo-wQ82bn771-U-unsplash.jpg",
"large": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/960_alejandro-luengo-wQ82bn771-U-unsplash.jpg"
}
],
"type": "bundle",
"location": {
"id": 1258,
"title": "Spain",
"abbreviation": "ES"
}
},
"dates": [
{
"starts_at": null,
"ends_at": null,
"price": 2
}
],
"qty": 1,
"price": 2,
"children": [
{
"guest_id": "1673f70c-acbe-495f-a75e-992f64fae7cf",
"parent_id": 4956123,
"product": {
"id": "b6b01d82-7e79-4e23-b834-b7bb20053e8a",
"backoffice_title": "Breakfast",
"title": "Breakfast",
"translations": {
"en": {
"title": "Breakfast",
"frontoffice_title": "Breakfast",
"description": "The breakfast menu includes cereals, fresh fruit, juices and smoothies, homemade bread basket with spreads, pastries, coffe, milk and more.",
"extended_description": ""
},
"es": {
"title": null,
"frontoffice_title": "Breakfast",
"description": "El menú del desayuno incluye cereales, fruta fresca, zumos y batidos, pan recién hecho, café, leche y más.",
"extended_description": null
}
},
"images": [],
"type": "service",
"location": {
"id": 1258,
"title": "Spain",
"abbreviation": "ES"
}
},
"dates": [
{
"starts_at": null,
"ends_at": null,
"price": 0
}
],
"qty": 1,
"price": 0,
"children": []
},
{
"guest_id": "1673f70c-acbe-495f-a75e-992f64fae7cf",
"parent_id": 4956123,
"product": {
"id": "7d3c7568-1af7-4133-9f1a-a26ce115e94a",
"backoffice_title": "Dinner",
"title": "Dinner",
"translations": {
"en": {
"title": "Dinner",
"frontoffice_title": "Dinner",
"description": "Please provide a short description here.",
"extended_description": null
}
},
"images": [],
"type": "service",
"location": {
"id": 1258,
"title": "Spain",
"abbreviation": "ES"
}
},
"dates": [
{
"starts_at": null,
"ends_at": null,
"price": 0
}
],
"qty": 1,
"price": 0,
"children": []
},
{
"guest_id": "1673f70c-acbe-495f-a75e-992f64fae7cf",
"parent_id": 4956123,
"product": {
"id": "63f37cd0-ff2a-4d1a-b68f-82631c61bdde",
"backoffice_title": "Lunch bag",
"title": "Bolsa con almuerzo",
"translations": {
"en": {
"title": "Lunch bag",
"frontoffice_title": "Bolsa con almuerzo",
"description": "Please provide a short description here.",
"extended_description": null
}
},
"images": [],
"type": "service",
"location": {
"id": 1258,
"title": "Spain",
"abbreviation": "ES"
}
},
"dates": [
{
"starts_at": null,
"ends_at": null,
"price": 0
}
],
"qty": 1,
"price": 0,
"children": []
}
]
},
{
"guest_id": "1673f70c-acbe-495f-a75e-992f64fae7cf",
"parent_id": 4956098,
"product": {
"id": "fb82b5ff-69c6-4cf4-8025-4dc9fe581a4d",
"backoffice_title": "Private Surf Coaching",
"title": "Private Surf Coaching",
"translations": {
"en": {
"title": "Private Surf Coaching",
"frontoffice_title": "Private Surf Coaching",
"description": "Work on your surf skills with a dedicated surf instructor during a 3 hour private session.",
"extended_description": null
},
"es": {
"title": null,
"frontoffice_title": "Entrenamiento de surf privado",
"description": "Mejora tu surfing con un clase privado. Una session tarda 3 horas y incluye material si lo necesites.",
"extended_description": null
}
},
"images": [
{
"src": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/sincerely-media-oC32cy4x-ZA-unsplash.jpg",
"small": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/100_sincerely-media-oC32cy4x-ZA-unsplash.jpg",
"medium": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/320_sincerely-media-oC32cy4x-ZA-unsplash.jpg",
"large": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/960_sincerely-media-oC32cy4x-ZA-unsplash.jpg"
}
],
"type": "activity",
"location": {
"id": 1258,
"title": "Spain",
"abbreviation": "ES"
}
},
"dates": [
{
"starts_at": "2020-07-20 09:00:00",
"ends_at": "2020-07-20 12:00:00",
"price": 70
},
{
"starts_at": "2020-07-24 09:00:00",
"ends_at": "2020-07-24 12:00:00",
"price": 70
}
],
"qty": 2,
"price": 140,
"children": []
},
{
"guest_id": "1673f70c-acbe-495f-a75e-992f64fae7cf",
"parent_id": 4956098,
"product": {
"id": "49882dc9-86f5-420b-8b9a-23b00c071672",
"backoffice_title": "Beginner Surf",
"title": "Beginner Surf",
"translations": {
"en": {
"title": "Beginner Surf",
"frontoffice_title": "Beginner Surf",
"description": "Our Beginner Surf lessons are designed for those who only surf once a year or who have not surfed before.",
"extended_description": null
},
"es": {
"title": null,
"frontoffice_title": "Surf Principantes",
"description": "Nuestros clases para principantes son para los que surfean una vez al año o los que nunca han surfeado en su vida.",
"extended_description": null
}
},
"images": [
{
"src": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/09\/beginner-surf.png",
"small": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/09\/100_beginner-surf.png",
"medium": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/09\/320_beginner-surf.png",
"large": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/09\/960_beginner-surf.png"
}
],
"type": "activity",
"location": {
"id": 1258,
"title": "Spain",
"abbreviation": "ES"
}
},
"dates": [
{
"starts_at": "2020-07-22 09:00:00",
"ends_at": "2020-07-22 11:00:00",
"price": 20
},
{
"starts_at": "2020-07-18 09:00:00",
"ends_at": "2020-07-18 11:00:00",
"price": 20
},
{
"starts_at": "2020-07-26 09:00:00",
"ends_at": "2020-07-26 11:00:00",
"price": 20
}
],
"qty": 3,
"price": 60,
"children": []
},
{
"guest_id": "1673f70c-acbe-495f-a75e-992f64fae7cf",
"parent_id": 4956098,
"product": {
"id": "0d3728d6-a39d-40c4-857a-d90621e1349b",
"backoffice_title": "Advanced Surf",
"title": "Advanced Surf",
"translations": {
"en": {
"title": "Advanced Surf",
"frontoffice_title": "Advanced Surf",
"description": "Advanced Surf lessons are for independant surfers who want to improve their turns and manoeuvres. Advanced Surf lessons are for independant surfers who want to improve their turns and manoeuvres. Advanced Surf lessons are for independant surfers who want to improve their turns and manoeuvres. Advanced Surf lessons are for independant surfers who want to improve their turns and manoeuvres.",
"extended_description": null
},
"es": {
"title": null,
"frontoffice_title": "Surf Avanzado",
"description": "Nuestros clases de surf avanzado son para surfistas independientes que quieren mejorar sus giros y maniobras.",
"extended_description": null
}
},
"images": [
{
"src": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/chris-osmond-q9GnP8x-yEs-unsplash%20%281%29.jpg",
"small": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/100_chris-osmond-q9GnP8x-yEs-unsplash%20%281%29.jpg",
"medium": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/320_chris-osmond-q9GnP8x-yEs-unsplash%20%281%29.jpg",
"large": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/960_chris-osmond-q9GnP8x-yEs-unsplash%20%281%29.jpg"
}
],
"type": "activity",
"location": {
"id": 1258,
"title": "Spain",
"abbreviation": "ES"
}
},
"dates": [
{
"starts_at": "2020-07-25 14:00:00",
"ends_at": "2020-07-25 16:00:00",
"price": 50
},
{
"starts_at": "2020-07-21 14:00:00",
"ends_at": "2020-07-21 16:00:00",
"price": 50
},
{
"starts_at": "2020-07-19 14:00:00",
"ends_at": "2020-07-19 16:00:00",
"price": 50
},
{
"starts_at": "2020-07-23 14:00:00",
"ends_at": "2020-07-23 16:00:00",
"price": 50
}
],
"qty": 4,
"price": 200,
"children": []
},
{
"guest_id": "1673f70c-acbe-495f-a75e-992f64fae7cf",
"parent_id": 4956098,
"product": {
"id": "7d3c7568-1af7-4133-9f1a-a26ce115e94a",
"backoffice_title": "Dinner",
"title": "Dinner",
"translations": {
"en": {
"title": "Dinner",
"frontoffice_title": "Dinner",
"description": "Please provide a short description here.",
"extended_description": null
}
},
"images": [
{
"src": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/stefan-vladimirov-Q_Moi2xjieU-unsplash.jpg",
"small": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/100_stefan-vladimirov-Q_Moi2xjieU-unsplash.jpg",
"medium": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/320_stefan-vladimirov-Q_Moi2xjieU-unsplash.jpg",
"large": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/960_stefan-vladimirov-Q_Moi2xjieU-unsplash.jpg"
}
],
"type": "service",
"location": {
"id": 1258,
"title": "Spain",
"abbreviation": "ES"
}
},
"dates": [
{
"starts_at": null,
"ends_at": null,
"price": 12
}
],
"qty": 1,
"price": 12,
"children": []
},
{
"guest_id": "1673f70c-acbe-495f-a75e-992f64fae7cf",
"parent_id": 4956098,
"product": {
"id": "b6b01d82-7e79-4e23-b834-b7bb20053e8a",
"backoffice_title": "Breakfast",
"title": "Breakfast",
"translations": {
"en": {
"title": "Breakfast",
"frontoffice_title": "Breakfast",
"description": "The breakfast menu includes cereals, fresh fruit, juices and smoothies, homemade bread basket with spreads, pastries, coffe, milk and more.",
"extended_description": ""
},
"es": {
"title": null,
"frontoffice_title": "Breakfast",
"description": "El menú del desayuno incluye cereales, fruta fresca, zumos y batidos, pan recién hecho, café, leche y más.",
"extended_description": null
}
},
"images": [
{
"src": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/ben-kolde-FFqNATH27EM-unsplash.jpg",
"small": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/100_ben-kolde-FFqNATH27EM-unsplash.jpg",
"medium": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/320_ben-kolde-FFqNATH27EM-unsplash.jpg",
"large": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/960_ben-kolde-FFqNATH27EM-unsplash.jpg"
}
],
"type": "service",
"location": {
"id": 1258,
"title": "Spain",
"abbreviation": "ES"
}
},
"dates": [
{
"starts_at": null,
"ends_at": null,
"price": 15
},
{
"starts_at": null,
"ends_at": null,
"price": 15
}
],
"qty": 2,
"price": 30,
"children": []
},
{
"guest_id": "1673f70c-acbe-495f-a75e-992f64fae7cf",
"parent_id": 4956098,
"product": {
"id": "dadfba06-9ffa-412c-840e-e8eee6289ec5",
"backoffice_title": "Surfboard Wax Premium",
"title": "Surfboard Wax",
"translations": {
"en": {
"title": "Surfboard Wax Premium",
"frontoffice_title": "Surfboard Wax",
"description": "For use in water temperatures between 9 and 20 ° C",
"extended_description": null
},
"es": {
"title": null,
"frontoffice_title": "Cera de surf",
"description": "Para usar en temperaturas del agua entre 9 y 20 ° C",
"extended_description": null
}
},
"images": [
{
"src": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/alexandre-capt-0h2kWRb_KEs-unsplash.jpg",
"small": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/100_alexandre-capt-0h2kWRb_KEs-unsplash.jpg",
"medium": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/320_alexandre-capt-0h2kWRb_KEs-unsplash.jpg",
"large": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/960_alexandre-capt-0h2kWRb_KEs-unsplash.jpg"
}
],
"type": "item",
"location": null
},
"dates": [
{
"starts_at": "2020-07-24 12:00:00",
"ends_at": "2020-07-24 12:00:00",
"price": 2.5
},
{
"starts_at": "2020-07-26 12:00:00",
"ends_at": "2020-07-26 12:00:00",
"price": 2.5
},
{
"starts_at": "2020-07-25 12:00:00",
"ends_at": "2020-07-25 12:00:00",
"price": 2.5
},
{
"starts_at": "2020-07-21 12:00:00",
"ends_at": "2020-07-21 12:00:00",
"price": 2.5
},
{
"starts_at": "2020-07-23 12:00:00",
"ends_at": "2020-07-23 12:00:00",
"price": 2.5
},
{
"starts_at": "2020-07-22 12:00:00",
"ends_at": "2020-07-22 12:00:00",
"price": 2.5
},
{
"starts_at": "2020-07-20 12:00:00",
"ends_at": "2020-07-20 12:00:00",
"price": 2.5
},
{
"starts_at": "2020-07-19 12:00:00",
"ends_at": "2020-07-19 12:00:00",
"price": 2.5
},
{
"starts_at": "2020-07-18 12:00:00",
"ends_at": "2020-07-18 12:00:00",
"price": 2.5
}
],
"qty": 9,
"price": 22.5,
"children": []
},
{
"guest_id": "1673f70c-acbe-495f-a75e-992f64fae7cf",
"parent_id": 4956098,
"product": {
"id": "4cc1b6d8-50c3-45f0-b018-0b990ccb86af",
"backoffice_title": "Sport Insurance",
"title": "Sport Insurance",
"translations": {
"en": {
"title": "Sport Insurance",
"frontoffice_title": "Sport Insurance",
"description": "We recommend this option if you don't a travel insurance policy that covers sport accidents.",
"extended_description": null
},
"es": {
"title": null,
"frontoffice_title": "Seguro deportivo",
"description": "Recomendamos esta opción si no tiene una póliza de seguro de viaje que cubra accidentes deportivos.",
"extended_description": null
}
},
"images": [
{
"src": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/jametlene-reskp-gVfGGb62Fpo-unsplash.jpg",
"small": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/100_jametlene-reskp-gVfGGb62Fpo-unsplash.jpg",
"medium": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/320_jametlene-reskp-gVfGGb62Fpo-unsplash.jpg",
"large": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/960_jametlene-reskp-gVfGGb62Fpo-unsplash.jpg"
}
],
"type": "item",
"location": null
},
"dates": [
{
"starts_at": "2020-07-18 12:00:00",
"ends_at": "2020-07-18 12:00:00",
"price": 111.75
}
],
"qty": 1,
"price": 111.75,
"children": []
},
{
"guest_id": "1673f70c-acbe-495f-a75e-992f64fae7cf",
"parent_id": 4956098,
"product": {
"id": "c55eab60-a811-4bf1-b1c3-e318cc30ea99",
"backoffice_title": "Donation",
"title": "Donation",
"translations": {
"en": {
"title": "Donation",
"frontoffice_title": "Donation",
"description": "Plant a tree",
"extended_description": null
}
},
"images": [
{
"src": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/josh-appel-NeTPASr-bmQ-unsplash.jpg",
"small": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/100_josh-appel-NeTPASr-bmQ-unsplash.jpg",
"medium": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/320_josh-appel-NeTPASr-bmQ-unsplash.jpg",
"large": "https:\/\/s3.amazonaws.com\/bookinglayer\/uploads\/businesses\/4\/2020\/04\/22\/960_josh-appel-NeTPASr-bmQ-unsplash.jpg"
}
],
"type": "donation",
"location": {
"id": 1258,
"title": "Spain",
"abbreviation": "ES"
}
},
"dates": [
{
"starts_at": null,
"ends_at": null,
"price": 0
}
],
"qty": 1,
"price": 0,
"children": []
}
]
}
]
}
]
}
HTTP Request
GET public/carts/{carts_uuid}/itinerary
Cart options
Example response (200):
{
"accept_gift_certificates": true,
"accept_discounts": true
}
HTTP Request
GET public/carts/{carts_uuid}/options
Currency Conversion
public/currencies/conversion/{currency_by_iso_or_id}
Example response (422):
{
"data": {
"message": "The given data was invalid.",
"errors": {
"amount": [
"amount field is required"
],
"currency_to": [
"currency to field is required"
]
}
}
}
HTTP Request
GET public/currencies/conversion/{currency_by_iso_or_id}
Customer Fields
Returns field for customer checkout form
Example response (200):
{
"data": []
}
HTTP Request
GET public/customer_fields/{carts_uuid?}
Guest Order
public/guest_order/{guest_order_uuid}
HTTP Request
GET public/guest_order/{guest_order_uuid}
public/guest_order/{guest_order_uuid?}
HTTP Request
PUT public/guest_order/{guest_order_uuid?}
Guest fields
Fields list
Returns guest form fields based on general and product settings.
Example response (200):
{
"data": [
{
"translations": {
"en": {
"label": "Gender"
}
},
"name": "gender",
"type": "select",
"options": [
{
"value": "male",
"translations": {
"en": {
"label": "Male"
}
}
},
{
"value": "female",
"translations": {
"en": {
"label": "Female"
}
}
}
],
"width": "15%",
"validation": {
"required": true
}
},
{
"translations": {
"en": {
"label": "First name"
}
},
"name": "first_name",
"type": "text",
"width": "25%",
"validation": {
"required": true
}
},
{
"translations": {
"en": {
"label": "Last name"
}
},
"name": "last_name",
"type": "text",
"width": "25%",
"validation": {
"required": true
}
},
{
"translations": {
"en": {
"label": "Email",
"validation_error": "Must be a valid email address."
}
},
"name": "email",
"type": "text",
"width": "25%",
"validation": {
"required": true,
"regex": "\/^[a-zA-Z0-9.!#$%&'*+\\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$\/"
}
},
{
"translations": {
"en": {
"label": "Birth date"
}
},
"name": "birth_date",
"type": "date",
"width": "10%",
"validation": {
"required": true
}
}
]
}
HTTP Request
GET public/guest_fields/{products_uuid?}
Order
Create Order
Example response (200):
[]
HTTP Request
POST public/orders
URL Parameters
Parameter | Status | Description |
---|---|---|
cart_id |
required | uuid |
discount_code |
optional | |
referral_code |
optional | |
couple_amount |
optional | integer |
google_analytics_client_id |
optional | |
customer |
required | |
customer.email |
required | |
customer.first_name |
required | |
customer.last_name |
required | |
customer.gender |
optional | male/female |
customer.salutation |
optional | |
customer.phone |
optional | |
customer.phone_countrycode |
optional | |
customer.address_line_1 |
optional | |
customer.address_line_2 |
optional | |
customer.address_line_3 |
optional | |
customer.city |
optional | |
customer.state |
optional | |
customer.country_id |
optional | |
customer.zip_code |
optional | |
customer.language_code |
optional | |
customer.custom_fields |
optional | TODO check |
PackageItems
Get package items configuration.
Example request:
{
"start": "2020-07-18",
"end": "2020-07-25",
"currency": "eur",
"guests": [
{
"id": "guest_1",
"group_id": 122
},
{
"id": "guest_2",
"group_id": 122
}
],
"items": [
{
"id": 9,
"value": [
"2020-07-19",
"2020-07-20"
],
"guest_id": "guest_1"
},
{
"id": 12,
"value": [
"2020-07-19"
],
"guest_id": "guest_1"
},
{
"id": 9,
"value": [
"2020-07-19",
"2020-07-20"
],
"guest_id": "guest_2"
},
{
"id": 12,
"value": [
"2020-07-19"
],
"guest_id": "guest_2"
}
]
}
HTTP Request
POST public/packages/{packages_uuid}/items
GET public/packages/{packages_uuid}/items
Body Parameters
Parameter | Type | Status | Description |
---|
Prices
List
Returns price for given BookingRequest
Example request:
{
"currency": "eur",
"guests": [
{
"id": "guest_1",
"group_id": 122
},
{
"id": "guest_2",
"group_id": 594
}
],
"bookings": [
{
"product_id": "c739295c-8807-4833-bc31-c81f89554ae1",
"value": [
"2020-06-27",
"2020-07-04"
],
"srs": false,
"parent_id": null,
"guest_id": "guest_1"
},
{
"item_id": 43999,
"value": [
"2019-01-11",
"2019-01-13",
"2019-01-15"
],
"srs": false,
"parent_id": "c739295c-8807-4833-bc31-c81f89554ae1",
"guest_id": "guest_1"
},
{
"item_id": 44298,
"value": [
"2020-06-27",
"2020-07-03"
],
"srs": false,
"parent_id": "c739295c-8807-4833-bc31-c81f89554ae1",
"guest_id": "guest_1"
},
{
"product_id": "c739295c-8807-4833-bc31-c81f89554ae1",
"value": [
"2020-06-27",
"2020-07-04"
],
"srs": false,
"parent_id": null,
"guest_id": "guest_2"
},
{
"item_id": 43999,
"value": [
"2019-01-11",
"2019-01-13",
"2019-01-15"
],
"srs": false,
"parent_id": "c739295c-8807-4833-bc31-c81f89554ae1",
"guest_id": "guest_2"
},
{
"item_id": 44298,
"value": [
"2020-06-27",
"2020-07-03"
],
"srs": false,
"parent_id": "c739295c-8807-4833-bc31-c81f89554ae1",
"guest_id": "guest_2"
}
]
}
HTTP Request
POST public/products/prices
GET public/products/prices
Body Parameters
Parameter | Type | Status | Description |
---|---|---|---|
currency |
string | required | iso_3 code, in example: eur, usd. |
guests |
array | required | array of guest objects. |
guests.*.id |
uuid | required | any string, a unique identifier from the app. |
guests.*.group_id |
integer | optional | |
bookings |
array | required | bookings to count prices. |
bookings.guest_id |
uuid | required | nullable, id of parent, in example when item is a part of package. |
bookings.product_id |
uuid | required | |
bookings.value.* |
mixed | required | set of dates, quantity or boolean, in terms of package and accommodation bookings, first and last date is relevant. |
bookings.items |
array | optional | just in case of package booking; |
bookings.items.*.id |
integer | required | . |
bookings.items.*.value |
mixed | required | set of dates, quantity or boolean, in terms of package and accommodation bookings, first and last date is relevant. |
Product
public/products/{product_by_unique_id}
HTTP Request
GET public/products/{product_by_unique_id}
Product Availabilities
Index
Availabilities for product, in two modes: checkin/out (because depends on product configuration dates when you can checkin and not equal date you can checkout) look at mode param.
Example response (422):
{
"data": {
"message": "The given data was invalid.",
"errors": {
"start": [
"start field is required"
],
"end": [
"end field is required"
]
}
}
}
HTTP Request
GET public/products/{products_uuid}/availabilities
URL Parameters
Parameter | Status | Description |
---|---|---|
start |
required | date in yyyy-mm-dd format. |
end |
required | date in yyyy-mm-dd format. |
mode |
optional | two options checkin, checkout, default: checkin. |
show_available_only |
optional | boolean, 1 will show just dates that have enough availability, 0 will show every date between given period default: 1. |
male |
optional | pax param, number of male guests, required when other pax params are missing. |
female |
optional | pax param, number of female guests, required when other pax params are missing. |
couple |
optional | pax param, number of couple (2 guests), required when other pax params are missing. |
genderless |
optional | pax param, number of genderless guests, required when other pax params are missing, in some cases we don't care about gender guest. |
Product iCalendar
public/product_calendar_exports/{product_calendar_export_uuid}
HTTP Request
GET public/product_calendar_exports/{product_calendar_export_uuid}
Settings
public/settings
Example response (200):
{
"data": {
"accommodation_group_by_locations": true,
"analytics_track_purchase_on_checkout": false,
"enable_frontoffice_v2": false,
"facebook_pixel_id": null,
"frontoffice_uri": "",
"frontoffice_accommodation_list_mode_show_min_price": true,
"frontoffice_accommodation_list_mode_show_beds_available": true,
"frontoffice_checkout_using_guest_details": true,
"frontoffice_v2_custom_css": null,
"frontoffice_deeplink": false,
"frontoffice_force_group_booking": false,
"frontoffice_finish_code_injection": "console.log('finish_code_injection');",
"frontoffice_freshworks_chat_code": null,
"frontoffice_google_font": null,
"frontoffice_google_font_headings": null,
"frontoffice_guest_minimum_age": 18,
"frontoffice_meta": null,
"frontoffice_v2_head_inject": null,
"frontoffice_og": null,
"frontoffice_theme": null,
"frontoffice_logo": "https:\/\/timbuktusurf.bookinglayer.com\/files\/customer\/frontoffice_header\/1\/11timbuktusurf.png",
"frontoffice_mobile_logo": null,
"frontoffice_logo_url": null,
"frontoffice_no_available_accom_contact_button": false,
"frontoffice_preselect_multiperson": false,
"frontoffice_price_total_only": false,
"frontoffice_require_guest_email": false,
"frontoffice_tawk_chat_code": null,
"frontoffice_timeslot_multiselect": true,
"frontoffice_favicon": null,
"frontoffice_package_items_booking_mode": "both",
"frontoffice_zopim_chat_code": null,
"google_adwords_conversion_id": null,
"google_adwords_conversion_label": null,
"google_analytics_tracking_domains": null,
"google_analytics_tracking_id": null,
"google_tag_manager": null,
"hubspot_tracking_id": null,
"frontoffice_custom_content": null,
"frontoffice_footer_links": null,
"frontoffice_intercom_chat_code": null,
"lesson_day_end": "20:00",
"lesson_day_start": "08:00",
"maintenance": false,
"payment_finish_code_injection": null,
"currencies": [
{
"id": 1,
"title": "Euro",
"symbol": "€",
"iso_code": "EUR",
"is_default": false,
"is_zero_decimal": false,
"is_enabled": false,
"is_frontoffice_enabled": false,
"conversion_from_eur": "1.000000",
"conversion_date": null,
"created_at": "2018-06-28T07:30:18+00:00",
"updated_at": "2018-06-28T07:30:18+00:00"
}
]
}
}
HTTP Request
GET public/settings
Translations
public/translations
Example response (200):
{
"data": {
"default_language": "en",
"languages": [
"en",
"es",
"ru",
"fr"
],
"translations": {
"en": {
"activity_calendar.guests.activities_label": "Activities",
"activity_calendar.guests.activities_required": "Assign at least one activity or remove this guest",
"activity_calendar.guests.add_guest": "Add guest",
"activity_calendar.guests.header": "Guests details",
"activity_calendar.guests.remove_guest": "Remove guest",
"activity_calendar.maximum_availability_tooltip": "Maximum availability reached",
"activity_calendar.next_day": "Next day",
"activity_calendar.next_week": "Next week",
"activity_calendar.no_activities": "No activities in this week",
"activity_calendar.previous_day": "Previous day",
"activity_calendar.previous_week": "Previous week",
"activity_calendar.selected_activities": "Selected activities",
"activity_calendar.summary.continue": "Continue",
"activity_calendar.summary.total": "Total",
"activity_calendar.validation.left_to_assign": "%{smart_count} activity left to assign |||| %{smart_count} activities left to assign",
"birth_date": "Birth date",
"calendar.available": "Available",
"calendar.checkin_not_available": "Checkin not available",
"calendar.clear_dates": "Clear dates",
"calendar.tooltip.clear_dates_to_change": "You have to clear current dates to set new ones",
"calendar.tooltip.date_not_available": "This date is not available",
"checkout.book_now": "Book now",
"checkout.disount_coupon.invalid": "Coupon is invalid",
"checkout.disount_coupon.label": "Coupon",
"checkout.gift_certificate.invalid": "Gift Certificate is invalid",
"checkout.gift_certificate.label": "Gift Certificate",
"currency": "Currency",
"error.general": "An error occured, please try again",
"female": "Female",
"first_name": "First name",
"gender": "Gender",
"guest": "Guest",
"language": "Language",
"last_name": "Last name",
"male": "Male",
"pax_picker.close": "Close",
"pax_picker.gender.couple": "Couples",
"pax_picker.gender.female": "Females",
"pax_picker.gender.genderless": "Persons",
"pax_picker.gender.male": "Males",
"pax_picker.guests": "Guests",
"pax_picker.minimum_required": "There is a requirement of a minimum %{smart_count} guests",
"pax_picker.total": "Total",
"price_from": "from %{price}",
"product.show_less": "Show less",
"product.show_more": "Show more",
"step.accommodation.allocate_guests": "Allocate guests",
"step.accommodation.allocated_guests_label": "Allocated guests",
"step.accommodation.available_beds": "%{smart_count} beds available",
"step.accommodation.error.guests_to_allocate": "There is %{smart_count} guest left to allocate |||| There are %{smart_count} guests left to allocate",
"step.accommodation.error.minimum_required": "Some rooms have a requirement of a minimum guests",
"step.accommodation.header": "Accommodation",
"step.accommodation.minimum_required": "There is a requirement of a minimum %{smart_count} guests",
"step.accommodation.privately_reserve": "Privately reserve %{name} for an additional %{price}",
"step.cross_sell.header": "Cross-sell",
"step.guest_form.guest_number": "Guest %{smart_count}",
"step.guest_form.header": "Guests",
"step.package_items.configuration_change.change": "Change",
"step.package_items.configuration_change.stay": "Stay",
"step.package_items.configuration_change.warning": "Changing will reset currently selected upgrades",
"step.package_items.configure_per_person": "Configure per person",
"step.package_items.configure_whole_group": "Configure whole group",
"step.package_items.header": "Upgrade your package",
"step.summary.header": "Your booking",
"summary.accommodation": "Accommodation",
"summary.base_price": "Base price",
"summary.checkin": "Checkin",
"summary.checkout": "Checkout",
"summary.choose_dates": "Choose dates",
"summary.choose_guests": "Choose guests",
"summary.continue": "Continue",
"summary.details": "Details",
"summary.discounts": "Discounts",
"summary.donations": "Donations",
"summary.duration": "Duration",
"summary.duration_days": "%{smart_count} day |||| %{smart_count} days",
"summary.duration_nights": "%{smart_count} night |||| %{smart_count} nights",
"summary.gift_certificate": "Gift certificate",
"summary.guests": "Guests",
"summary.insurances": "Insurances",
"summary.single_room_supplement": "Accommodation upgrades",
"summary.total": "Total",
"summary.upgrades": "Upgrades",
"checkout.agreement.required": "Required",
"email": "Email",
"phone": "Phone",
"address_line_1": "Address",
"city": "City",
"state": "State",
"zip_code": "Postcode",
"country_code": "Country",
"note": "Note",
"breadcrumbs_homepage": "Homepage",
"phone_country_code": "Country code",
"step.accommodation.allocated_guests_placeholder": "Choose guests",
"summary.quantity": "Quantity",
"checkout.title": "Checkout",
"activity_calendar.sold_out": "Sold out",
"activity_calendar.available_left": "%{smart_count} left",
"step.accommodation.room_full": "room full",
"age": "Age",
"bookable_dates.days_variant": "%{smart_count} day |||| %{smart_count} days",
"bookable_dates.not_available": "not available",
"bookable_dates.duration": "Duration",
"bookable_dates.dates": "Dates",
"guest_group": "Guest group",
"summary.validation.form_fields_not_valid": "Some form fields are not valid",
"bookable_dates.no_dates_available": "Sorry, there are no dates available.",
"price_per_person": "%{price} \/ person",
"price_from_per_person": "from %{price} \/ person",
"step.accommodation.gender_mismatch": "gender mismatch",
"read_more": "Read more",
"pax_picker.change_warning.content": "Changing will reset current configuration",
"pax_picker.change_warning.stay": "Stay",
"pax_picker.change_warning.change": "Change",
"bookable_dates.change_warning.stay": "Stay",
"bookable_dates.change_warning.change": "Change",
"bookable_dates.change_warning.content": "Changing will reset current configuration",
"checkout.guest_fill.clear": "Clear",
"checkout.guest_fill.placeholder": "Guests...",
"checkout.guest_fill.label": "Fill using guest details",
"bookable_dates.nights_variant": "%{smart_count} night |||| %{smart_count} nights",
"step.accommodation.other_location": "Other",
"activity_calendar.maximum_days_ahead": "Booking is available only up to %{smart_count} days from now",
"date_picker.start_date": "Start date",
"date_picker.end_date": "End date",
"date_picker.duration": "Duration",
"date_picker.nights_variant": "%{smart_count} night |||| %{smart_count} nights",
"date_picker.days_variant": "%{smart_count} day |||| %{smart_count} days",
"test.test.test": "j"
},
"es": {
"summary.total": "Total"
}
}
}
}
HTTP Request
GET public/translations
Widget
public/widgets
Example response (200):
{
"data": []
}
HTTP Request
GET public/widgets
public/widgets/{widget_by_slug}
HTTP Request
GET public/widgets/{widget_by_slug}
public/calendars/{calendar}
HTTP Request
GET public/calendars/{calendar}
public/calendars/{calendar}/timeslots
HTTP Request
GET public/calendars/{calendar}/timeslots