List all bookings
Returns the company's bookings, newest created first by default. Use
sort_by and sort_direction to choose a different order.
Bookings in pending_payment, completed or cancelled state are listed.
A pending booking is listed only if your staff created it in the
dashboard or it is awaiting a bank transfer.
These rules also apply to bookings created through POST /bookings.
GET /bookings/{id} can retrieve them before they appear in this list.
Filters combine as an intersection, and each filter accepting several
values matches any of them. Range filters are supplied as
field[operator]=value.
Query Parameters
Number of results per page. Default 50, maximum 200. Values above 200 or zero/negative are clamped to that range rather than rejected.
50Opaque pagination cursor returned in next_cursor of the previous response. Malformed values are ignored and the first page is returned.
Free-text search over the booking reference, the booking id, and the lead booker's name and email address. An exact reference or id match wins, otherwise a partial reference or id, otherwise a name or email match. Must be 3 to 50 characters.
3 <= length <= 50Return only bookings in these states, as a comma-separated list, e.g. ?state=completed,cancelled. Repeated state[]= keys are accepted too.
Range filter on when the booking was confirmed. Each bound is an ISO 8601 date (e.g. booked_at[gteq]=2026-04-15) or date-time (e.g. booked_at[gteq]=2026-04-15T14:30:00Z). A date covers that whole day, and a value carrying no offset is read in your company's time zone. Bookings that were never confirmed match no bound.
Range filter on the booking's first travel date — the earliest start date across its line items. Bounds are ISO 8601 dates (e.g. start_date[gteq]=2026-06-01), compared as calendar dates with no time zone applied. A booking with no travel date yet, such as one your staff created but nobody has paid for, matches no bound.
datedatedatedateField to order by. A booking with no value for the chosen field is ordered by a substitute value instead, so it still appears: for booked_at, when the booking was created; for start_date, when it was confirmed, or when it was created if it was never confirmed.
"created_at""created_at" | "booked_at" | "start_date"Order direction: asc lists the earliest first, desc the latest first.
"desc""asc" | "desc"Response Body
application/json
application/json
application/json
curl -X GET "https://example.com/bookings" \ -H "Easol-API-Version: 2026-11-01"{
"object": "string",
"url": "string",
"has_more": true,
"next_cursor": "string",
"data": [
{
"object": "booking",
"id": "string",
"reference": "string",
"state": "pending",
"sales_channel": "string",
"total": {
"amount": 0,
"currency": "string"
},
"subtotal": {
"amount": 0,
"currency": "string"
},
"balance": {
"amount": 0,
"currency": "string"
},
"customer": {
"object": "customer",
"id": "string",
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"phone": "+447762000000",
"email_marketing_consent": {
"consented": true,
"consented_at": "2026-09-04T10:00:00Z"
},
"sms_marketing_consent": {
"consented": true,
"consented_at": "2026-09-04T10:00:00Z"
}
},
"billing_address": {
"line_one": "string",
"line_two": "string",
"city": "string",
"post_code": "string",
"country_code": "string",
"subdivision_code": "string"
},
"purchase_order_number": "string",
"vat_number": "string",
"expires_at": "string",
"cancelled_at": "string",
"created_at": "string",
"custom_fields": [
{
"custom_field_id": "fld_aBcDeFgHiJ",
"key": "flight_number",
"type": "text",
"value": "BA2612",
"option": {
"id": "string",
"value": "string"
}
}
],
"first_visit": {
"object": "customer_visit",
"id": "visit_7hK2mQ9x",
"occurred_at": "2026-09-04T10:00:00Z",
"landing_page": "https://shop.example.com/",
"referrer_url": "https://partner.example.com/",
"referral_code": "ExternalPartner"
},
"last_visit": {
"object": "customer_visit",
"id": "visit_7hK2mQ9x",
"occurred_at": "2026-09-04T10:00:00Z",
"landing_page": "https://shop.example.com/",
"referrer_url": "https://partner.example.com/",
"referral_code": "ExternalPartner"
},
"line_items": {
"object": "list",
"url": "string",
"has_more": false,
"next_cursor": "string",
"data": [
{
"object": "line_item",
"id": "string",
"variant_id": "string",
"product_id": "string",
"quantity": 1,
"state": "pending",
"variant_name": "string",
"product_name": "string",
"start_date": "2019-08-24",
"end_date": "2027-04-19",
"start_time": "string",
"experience_slot_id": "string",
"total": {
"amount": 0,
"currency": "string"
},
"guest_count": 2,
"allocated_resources": {
"object": "list",
"url": "string",
"has_more": false,
"next_cursor": "string",
"data": [
{
"object": "resource",
"id": "string",
"name": "string",
"resource_group_name": "string"
}
]
}
}
]
},
"guests": {
"object": "list",
"url": "string",
"has_more": false,
"next_cursor": "string",
"data": [
{
"object": "guest",
"id": "string",
"first_name": "string",
"last_name": "string",
"email": "string",
"phone": "+447762000000",
"line_item_id": "string",
"check_in_status": "pending",
"is_lead": true,
"custom_fields": [
{
"custom_field_id": "fld_aBcDeFgHiJ",
"key": "flight_number",
"type": "text",
"value": "BA2612",
"option": {
"id": "string",
"value": "string"
}
}
]
}
]
}
}
]
}{
"error": {
"code": "string",
"message": "string"
}
}{
"error": {
"code": "string",
"message": "string"
}
}Bookings
A booking is a customer's reserved purchase of one or more products. Bookings move through `pending` → `pending_payment` → `completed` (or `cancelled`). The usual flow is: create a booking, add line items, attach customer and billing details, then collect payment. Guests are counted per line item. A guest is a place on one line item, not a person: someone booked onto two line items counts as two guests, and appears in `guests` once for each. Adding up `guest_count` across a booking's line items therefore counts places, not people.
Create a booking POST
Next Page