Skip to main content

Bookings

Overview

This resource represents the Bookings (reservations) occupying the calendar for a given Rental.

Depending on the use case, there are various types of Bookings (determined by status attribute):

  • Booked - the actual confirmed bookings for a given Client.

  • Tentative - the bookings that are not confirmed yet. Either these bookings eventually become Booked or they expire (which is determined by tentative_expires_at attribute) and are canceled in such such case.

  • Unavailable - mostly useful for blocking the calendar (e.g. for a given season)

  • Canceled - the bookings that no longer occupy the calendar

start_at and end_at are naive datetimes

start_at and end_at are naive datetimes denominated in the rental's local timezone. They are serialized with a trailing Z, but that Z is misleading and should be ignored — the values are not UTC. The wire format is a historical quirk and changing it would be a breaking change for existing integrations, so we don't plan to change it. If you need an absolute moment in time (for example, to compare against now in a time-window check), use start_at_global / end_at_global instead, which are true UTC instants.

Parameters

NameTypeRead/WriteDescription
idIntegerReadBooking's id.
referenceStringReadBooking's reference code.
statusStringReadBooking's status.
updated_atTimeReadBooking's update time.
start_atTimeReadBooking's start time as a naive datetime in the rental's timezone (see warning above).
start_at_globalTimeReadBooking's start time as a true UTC instant. Prefer this for absolute time-window comparisons.
end_atTimeReadBooking's end time as a naive datetime in the rental's timezone (see warning above).
end_at_globalTimeReadBooking's end time as a true UTC instant. Prefer this for absolute time-window comparisons.

List bookings

Based on the OAuth token scopes bookings listing will be limited to a certain range.

ScopeRead Permissions
:publicDisplay only future, not canceled bookings
:bookings_write_ownedDisplay only future, not canceled bookings
:bookings_readDisplay all bookings
:bookings_writeDisplay all bookings

Returns a list of all bookings for current account(s).

Returns only future and non-canceled bookings by default

By default this endpoint returns only future and non-canceled bookings, if you like to change this behavior, make sure to check the search parameters.

GET /bookings
response.json
{
"links": {
"bookings.account": "https://www.bookingsync.com/api/v3/accounts/{bookings.account}",
"bookings.rental": "https://www.bookingsync.com/api/v3/rentals/{bookings.rental}",
"bookings.bookings_tags": "https://www.bookingsync.com/api/v3/bookings_tags/{bookings.bookings_tags}",
"bookings.rentals_tags": "https://www.bookingsync.com/api/v3/rentals_tags/{bookings.rentals_tags}",
"bookings.discount_code_usage": "https://www.bookingsync.com/api/v3/discount_code_usages/{bookings.discount_code_usage}"
},
"bookings": [
{
"links": {
"account": 1,
"rental": 16,
"bookings_tags": [
1,
2
],
"rentals_tags": [],
"discount_code_usage": 12
},
"id": 203,
"start_at": "2026-05-27T12:59:44Z",
"end_at": "2026-06-03T12:59:44Z",
"status": "Booked",
"updated_at": "2026-05-13T12:59:44.733Z"
}
],
"meta": {}
}

Search bookings

Search parameters allow to filter bookings by specified fields.

Example:

GET /bookings?status=booked,unavailable&from=2014-03-24T12:00:00Z

Search Parameters

NameTypeDefaultDescription
fromTimenowBookings ending after given time. Default is now.
untilTimeBookings starting before given time.
monthsIntegerBookings starting before :from + :months.
statusStringList of comma separated statuses. Possible values: booked,unavailable,tentative.
include_canceledBooleanfalseShow also canceled bookings (requires :bookings_read or :bookings_write scope).
rental_idStringList of comma separated IDs. Returns only bookings for this rental(s)
client_idStringList of comma separated IDs. Returns only bookings for this client(s)
updated_sinceTimeBookings updated after given time. Also includes ids of bookings canceled after given time.

Get a single booking

Returns a single booking identified by ID

GET /bookings/:booking_id
response.json
{
"links": {
"bookings.account": "https://www.bookingsync.com/api/v3/accounts/{bookings.account}",
"bookings.rental": "https://www.bookingsync.com/api/v3/rentals/{bookings.rental}",
"bookings.bookings_tags": "https://www.bookingsync.com/api/v3/bookings_tags/{bookings.bookings_tags}",
"bookings.rentals_tags": "https://www.bookingsync.com/api/v3/rentals_tags/{bookings.rentals_tags}",
"bookings.discount_code_usage": "https://www.bookingsync.com/api/v3/discount_code_usages/{bookings.discount_code_usage}"
},
"bookings": [
{
"links": {
"account": 1,
"rental": 16,
"bookings_tags": [
1,
2
],
"rentals_tags": [],
"discount_code_usage": 12
},
"id": 203,
"start_at": "2026-05-27T12:59:44Z",
"end_at": "2026-06-03T12:59:44Z",
"status": "Booked",
"updated_at": "2026-05-13T12:59:44.742Z"
}
],
"meta": {}
}

Create a new booking

Status assignment

To assign a status to a booking, you have to set either booked, unavailable or tentative_expires_at fields. Only one of those attributes can be used at the same time.

start_at and end_at must include a time component

Send start_at and end_at as full ISO-8601 datetimes (e.g. 2026-06-15T16:00:00Z), not bare dates. The recommended values are the rental's checkin_time for start_at and checkout_time for end_at — those are the times at which the previous/next guest is expected to leave/arrive, so they avoid overlap with adjacent bookings. A date-only value is coerced to midnight in the rental's local timezone, which typically falls inside an adjacent booking's stay and is rejected with start_at/end_at "is within a used period" — even when /rentals/search reported availability (search works at day granularity).

Creates a booking for given rental.

POST /rentals/:rental_id/bookings
request.json
{
"bookings": [
{
"booked": true,
"client_id": 37,
"adults": 5,
"currency": "USD",
"discount": "10%",
"final_price": "2700.0",
"initial_price": "3000.0",
"start_at": "2026-06-15T16:00:00Z",
"end_at": "2026-06-22T10:00:00Z",
"bookings_tag_ids": [
1,
2
]
}
]
}
response.json
{
"links": {
"bookings.account": "https://www.bookingsync.com/api/v3/accounts/{bookings.account}",
"bookings.rental": "https://www.bookingsync.com/api/v3/rentals/{bookings.rental}",
"bookings.client": "https://www.bookingsync.com/api/v3/clients/{bookings.client}",
"bookings.rental_agreement": "https://www.bookingsync.com/api/v3/rental_agreements/{bookings.rental_agreement}",
"bookings.source": "https://www.bookingsync.com/api/v3/sources/{bookings.source}",
"bookings.inquiry": "https://www.bookingsync.com/api/v3/inquiries/{bookings.inquiry}",
"bookings.booking_comments": "https://www.bookingsync.com/api/v3/booking_comments/{bookings.booking_comments}",
"bookings.bookings_fees": "https://www.bookingsync.com/api/v3/bookings_fees/{bookings.bookings_fees}",
"bookings.bookings_taxes": "https://www.bookingsync.com/api/v3/bookings_taxes/{bookings.bookings_taxes}",
"bookings.payments": "https://www.bookingsync.com/api/v3/payments/{bookings.payments}",
"bookings.bookings_payments": "https://www.bookingsync.com/api/v3/bookings_payments/{bookings.bookings_payments}",
"bookings.bookings_tags": "https://www.bookingsync.com/api/v3/bookings_tags/{bookings.bookings_tags}",
"bookings.rentals_tags": "https://www.bookingsync.com/api/v3/rentals_tags/{bookings.rentals_tags}",
"bookings.discount_code_usage": "https://www.bookingsync.com/api/v3/discount_code_usages/{bookings.discount_code_usage}"
},
"bookings": [
{
"links": {
"account": 1,
"rental": 16,
"client": 37,
"inquiry": null,
"rental_agreement": null,
"source": null,
"bookings_fees": [],
"bookings_payments": [
23
],
"bookings_taxes": [],
"bookings_tags": [
1,
2
],
"booking_comments": [],
"conversations": [
11
],
"payments": [
23
],
"rentals_tags": [],
"discount_code_usage": 12
},
"id": 80,
"created_by_id": 42,
"created_by_type": "User",
"start_at": "2026-05-27T12:59:44Z",
"end_at": "2026-06-03T12:59:44Z",
"status": "Booked",
"updated_at": "2026-05-13T12:59:44.771Z",
"reference": "0000EG",
"booked_at": "BOOKED_AT",
"booked": true,
"unavailable": false,
"tentative_expires_at": null,
"initial_price": "3000.0",
"initial_rental_price": "3000.0",
"channel_price": null,
"discount": "10%",
"final_price": "2700.0",
"final_rental_price": "2700.0",
"downpayment": null,
"paid_amount": "2700.0",
"authorized_amount": "0.0",
"paid_or_authorized_amount": "2700.0",
"currency": "USD",
"notes": "",
"damage_deposit": "0.0",
"charge_damage_deposit_on_arrival": true,
"adults": 5,
"children": null,
"bookings_payments_count": 1,
"review_requests_count": 0,
"locked": null,
"created_at": "2026-05-06T12:59:44.771Z",
"canceled_at": null,
"cancelation_reason": null,
"cancelation_initiator": null,
"cancelation_message_to_guest": null,
"cancelation_message_to_channel": null,
"expected_checkin_time": "14:45",
"expected_checkout_time": "11:30",
"checkin_type": "lockbox",
"payment_url": null,
"short_payment_url": null,
"balance_due_at": "2026-05-20T12:59:44Z",
"rental_payback_to_owner": null,
"final_payback_to_owner": "0.0",
"commission": null,
"contract_updated_at": "2026-05-11T12:59:44Z",
"external_reference": null,
"owned_by_app": false,
"payment_left_to_collect": "0.0",
"booking_rent_revenue_amount": "3000.0",
"city_taxes_amount": "0.0",
"internal_fees": [
{
"kind": "traveller_fee",
"net_amount_in_cents": 3429,
"gross_amount_in_cents": 4115,
"currency": "EUR",
"vat_percentage": 20
},
{
"kind": "cancelation_protection_fee",
"net_amount_in_cents": 10000,
"gross_amount_in_cents": 12000,
"currency": "EUR",
"vat_percentage": 20
}
]
}
],
"meta": {}
}
Comments, Fees and Taxes

You can also pass comments, bookings fees and bookings taxes directly during a booking creation using the parameters: comments, bookings_fees and bookings_taxes.

Managing Bookings Tags

There are three ways to manage bookings tags on a booking:

  • bookings_tag_ids - Replaces all existing tags with the provided list. Use this when you want to set the exact list of tags.
  • bookings_tag_ids_to_add - Adds tags to the existing ones without removing any. Use this for incremental additions.
  • bookings_tag_ids_to_remove - Removes specific tags while preserving others. Use this for selective removal.

You can use bookings_tag_ids_to_add and bookings_tag_ids_to_remove together in the same request to add and remove tags simultaneously. However, neither can be used together with bookings_tag_ids.

Update a booking

Returns an updated booking identified by ID.

PUT /bookings/:booking_id
request.json
{
"bookings": [
{
"booked": true,
"client_id": 37,
"adults": 5,
"currency": "USD",
"discount": "10%",
"final_price": "2700.0",
"initial_price": "3000.0",
"start_at": "2026-06-15T16:00:00Z",
"end_at": "2026-06-22T10:00:00Z"
}
]
}
response.json
{
"links": {
"bookings.account": "https://www.bookingsync.com/api/v3/accounts/{bookings.account}",
"bookings.rental": "https://www.bookingsync.com/api/v3/rentals/{bookings.rental}",
"bookings.bookings_tags": "https://www.bookingsync.com/api/v3/bookings_tags/{bookings.bookings_tags}",
"bookings.rentals_tags": "https://www.bookingsync.com/api/v3/rentals_tags/{bookings.rentals_tags}",
"bookings.discount_code_usage": "https://www.bookingsync.com/api/v3/discount_code_usages/{bookings.discount_code_usage}"
},
"bookings": [
{
"links": {
"account": 1,
"rental": 16,
"bookings_tags": [
1,
2
],
"rentals_tags": [],
"discount_code_usage": 12
},
"id": 203,
"start_at": "2026-05-27T12:59:44Z",
"end_at": "2026-06-03T12:59:44Z",
"status": "Booked",
"updated_at": "2026-05-13T12:59:44.789Z"
}
],
"meta": {}
}

Cancel a booking

Required OAuth scope: :bookings_write or :bookings_write_owned

Returns an empty response with 204 No Content status code on success.

DELETE /bookings/:booking_id