API başvurusu
Tüm uç noktalar, parametreler ve örnek cevaplar. Her uç noktanın altındaki Test Et bölümü sandbox anahtarınızla çalışır.
Account
Who the key belongs to.
/v1/meThe key you are calling with
{
"organization": {
"id": "…",
"name": "Acme Travel",
"status": "ACTIVE"
},
"livemode": true,
"scopes": [
"properties:read"
],
"apiVersion": "2026-11-01",
"rateLimit": {
"perMinute": 600
},
"plan": {
"key": "agency_100",
"name": {
"en": "Starter"
},
"maxSubscriptions": 100,
"status": "ACTIVE",
"trialEndsAt": null,
"periodEnd": null,
"used": 3
}
}Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
Catalog
The shared vocabulary: amenity keys, property and room types, places, currencies. Needs no subscription.
/v1/amenity-categoriesAmenity categories
Gerekli yetki: catalog:read
localequery | Language of names: tr or en. |
{
"data": [
{
"key": "pool",
"name": "Pool"
}
]
}Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/amenitiesAll amenity keys
Keys are permanent and never renamed; a retired key is marked deprecated and points to replacedBy. kind is BOOL, NUM (with unit) or ENUM (with options).
Gerekli yetki: catalog:read
localequery | Language of names: tr or en. |
{
"data": [
{
"key": "pool.private",
"name": "Private pool",
"kind": "BOOL",
"category": "pool",
"deprecated": false
}
]
}Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/property-typesProperty types
Gerekli yetki: catalog:read
localequery | Language of names: tr or en. |
{
"data": [
{
"key": "villa",
"name": "Villa"
}
]
}Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/room-typesRoom types
Gerekli yetki: catalog:read
localequery | Language of names: tr or en. |
{
"data": [
{
"key": "bedroom",
"name": "Bedroom"
}
]
}Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/bed-typesBed types
Keys used in rooms[].beds[].type; sleeps is how many people one bed takes.
Gerekli yetki: catalog:read
localequery | Language of names: tr or en. |
{
"data": [
{
"key": "double",
"name": "Double bed",
"sleeps": 2,
"deprecated": false
}
]
}Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/legal-formsCompany legal forms of a country
What a company can be in that country (LTD, AS in Turkey; LLC, C_CORP in the US). individual marks sole traders.
Gerekli yetki: catalog:read
countryquery · req | ISO 3166-1 alpha-2 code. |
{
"data": [
{
"key": "LTD",
"name": "Limited Şirket (Ltd. Şti.)"
}
]
}Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/geo/countriesCountries
Gerekli yetki: catalog:read
localequery | Language of names: tr or en. |
{
"data": [
{
"id": "…",
"iso": "TR",
"dialCode": "90",
"currency": "TRY",
"name": "Turkey"
}
]
}Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/geo/nodesChildren of a place
Walk the tree: country → region → city → district → neighbourhood. Pass a node id as geoId to GET /v1/properties to filter by it.
Gerekli yetki: catalog:read
parentquery · req | Id of the parent node. |
localequery | Language of names: tr or en. |
{
"data": [
{
"id": "…",
"type": "CITY",
"name": "Kaş"
}
]
}Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/geo/searchSearch places by name
Gerekli yetki: catalog:read
qquery · req | At least two characters. |
localequery | Language of names: tr or en. |
countryquery | Limit to a country node id. |
{
"data": [
{
"id": "…",
"type": "SUBURB",
"name": "Kalkan",
"path": "Kaş, Antalya, Turkey"
}
]
}Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/currenciesCurrencies
Gerekli yetki: catalog:read
{
"data": [
{
"code": "EUR",
"name": "Euro",
"symbol": "€",
"minorUnit": 2
}
]
}Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/localesLanguages
Gerekli yetki: catalog:read
{
"data": [
{
"code": "en"
},
{
"code": "tr"
}
]
}Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
Properties
Discover properties and read their listing. Calendar and prices need a subscription.
/v1/propertiesQuery properties
Live properties in the network. Without a subscription you see the listing (texts, photos, rooms, amenities, capacity) with the location rounded to two decimals; with one you also see the exact address, owner contact and prices.
Gerekli yetki: properties:read
qquery | Name, code or address contains. |
geoIdquery | A place id from /v1/geo/*; matches that place and everything below it. |
typesquery | Comma-separated property type keys. |
guestsquery | Sleeps at least this many. |
bedroomsquery | At least this many bedrooms. |
bathroomsquery | At least this many bathrooms. |
amenitiesquery | Comma-separated amenity keys; the property must have all of them. |
subscribedquery | true only properties you subscribe to, false only those you do not. |
limitquery | Page size, at most 60 (default 25). |
cursorquery | The nextCursor of the previous page. |
localequery | Language of names: tr or en. |
{
"data": [
{
"id": "5b1c1f1e-0000-4000-8000-000000000001",
"code": "BP-1004",
"name": "Villa Mavi",
"typeKey": "villa",
"maxGuests": 8,
"bedrooms": 4,
"bathrooms": 3,
"currency": "EUR",
"city": "Kaş",
"district": "Kalkan",
"coverImageId": "…",
"subscriptionMode": "DIRECT",
"subscriptionStatus": null
}
],
"total": 42,
"nextCursor": "Mg"
}Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/properties/{id}One property
Gerekli yetki: properties:read
idpath · req | The property id (UUID). |
localequery | Language of names: tr or en. |
{
"id": "5b1c1f1e-0000-4000-8000-000000000001",
"code": "BP-1004",
"name": "Villa Mavi",
"typeKey": "villa",
"currency": "EUR",
"maxGuests": 8,
"translations": {
"en": {
"title": "Sea-view villa"
}
},
"rooms": [],
"amenities": [
{
"key": "pool.private",
"roomId": null,
"value": true
},
{
"key": "pool.heated",
"roomId": null,
"value": true,
"feeMinor": 200000,
"feeMode": "PER_NIGHT"
}
],
"images": [],
"subscription": null
}Olası hatalar: property_not_found
Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/properties/{id}/mediaPhotos
Each photo comes in thumb, medium and large WebP. Fetch the URLs with the same Bearer key.
Gerekli yetki: properties:read
idpath · req | The property id (UUID). |
{
"data": [
{
"id": "…",
"roomId": null,
"caption": {},
"width": 2400,
"height": 1600,
"urls": {
"thumb": "https://api.cesisync.com/v1/media/…/thumb"
}
}
]
}Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/media/{imageId}/{size}A photo file
Gerekli yetki: properties:read
imageIdpath · req | Photo id. |
sizepath · req | thumb, medium or large. |
(binary WebP)/v1/properties/{id}/exportDownload a property
Your data is yours: take a subscribed property with you as JSON, a ZIP of photos plus JSON, or CSV files for calendar and rates.
Gerekli yetki: properties:read
idpath · req | The property id (UUID). |
formatquery | json (default), zip, calendar.csv or rates.csv. |
localequery | Language of names: tr or en. |
(file)Olası hatalar: not_subscribedformat_invalid
Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
Subscriptions
Ask for, and end, access to a property.
/v1/properties/{id}/subscriptionSubscribe
On a property with direct approval the subscription is ACTIVE at once. Otherwise it is REQUESTED and you get a subscription.approved or subscription.rejected event when the owner decides.
Gerekli yetki: subscriptions:write
idpath · req | The property id (UUID). |
{
"message": "We run 40 villas in Kaş."
}{
"id": "7a0e0000-0000-4000-8000-000000000002",
"propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
"status": "ACTIVE",
"commissionBps": 1000,
"requestedAt": "2027-01-05T09:00:00.000Z"
}Olası hatalar: subscription_existsproperty_not_found
Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/properties/{id}/subscriptionUnsubscribe
Ends access. Refused with subscription_has_bookings while you have a running hold or a reservation that has not ended yet; those must run out or be cancelled first.
Gerekli yetki: subscriptions:write
idpath · req | The property id (UUID). |
Olası hatalar: subscription_not_foundsubscription_has_bookings
/v1/subscriptionsYour subscriptions
Gerekli yetki: properties:read
statusquery | REQUESTED, ACTIVE, REJECTED or ENDED. |
{
"data": [
{
"id": "7a0e0000-0000-4000-8000-000000000002",
"propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
"status": "ACTIVE",
"commissionBps": 1000,
"requestedAt": "2027-01-05T09:00:00.000Z"
}
]
}Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/subscriptions/{id}One subscription
Gerekli yetki: properties:read
idpath · req | The subscription id (UUID). |
{
"id": "7a0e0000-0000-4000-8000-000000000002",
"propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
"status": "ACTIVE",
"commissionBps": 1000,
"requestedAt": "2027-01-05T09:00:00.000Z"
}Olası hatalar: subscription_not_found
Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
Calendar and rates
Availability, prices and quotes of subscribed properties.
/v1/properties/{id}/calendarCalendar
Day by day: FREE, BUSY (closed by the owner, an imported calendar or any agency; never says by whom) or MINE (your own hold or booking). A day is a night: 2027-07-01 is the night from 1 July to 2 July.
Gerekli yetki: calendar:read
idpath · req | The property id (UUID). |
fromquery · req | First day, YYYY-MM-DD. |
toquery · req | Last day, exclusive (a stay ends on the day it departs). |
{
"propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
"from": "2027-07-01",
"to": "2027-07-03",
"days": [
{
"date": "2027-07-01",
"state": "FREE",
"nightlyMinor": 25000,
"minNights": 3
},
{
"date": "2027-07-02",
"state": "BUSY",
"nightlyMinor": 25000,
"minNights": 3
}
]
}Olası hatalar: not_subscribed
Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/properties/{id}/calendar.icsCalendar as iCal
Closed nights as an RFC 5545 feed for software that only speaks iCal. Names and details are never included.
Gerekli yetki: calendar:read
idpath · req | The property id (UUID). |
BEGIN:VCALENDAR…Olası hatalar: not_subscribed
Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/properties/{id}/ratesRates
Price periods overlapping the range, with minimum stay and allowed arrival weekdays (checkinDays, 0 = Sunday), plus cleaning, deposit and extra-guest terms. Amounts are integers in minor units (cents) of currency.
Gerekli yetki: rates:read
idpath · req | The property id (UUID). |
fromquery · req | First day, YYYY-MM-DD. |
toquery · req | Last day, exclusive (a stay ends on the day it departs). |
{
"propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
"currency": "EUR",
"baseNightlyMinor": 20000,
"minNightsDefault": 2,
"cleaningFeeMinor": 5000,
"depositMinor": 20000,
"periods": [
{
"start": "2027-06-15",
"end": "2027-09-15",
"nightlyMinor": 30000,
"minNights": 3,
"checkinDays": [
6
],
"label": "High season"
}
]
}Olası hatalar: not_subscribed
Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/properties/{id}/availabilityAvailability and price for dates
Is the stay free, and what does it cost? quote lists every night, cleaning and extra-guest fees, and violations for any rule it breaks (min_nights, checkin_day_not_allowed, too_many_guests, no_rate). bookable is true only when it is free and breaks no rule. extraOptions lists the property's paid amenities with what each would cost for this stay (amountMinor); pass the ones the guest wants in extras and they appear in quote.extras and in quote.totalMinor.
Gerekli yetki: rates:read
idpath · req | The property id (UUID). |
checkInquery · req | Arrival date. |
checkOutquery · req | Departure date. |
guestsquery | Number of guests (default 1). |
extrasquery | Paid amenities to quote, comma separated: key for a property-wide amenity, key@roomId for one in a room. |
{
"propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
"available": true,
"bookable": true,
"holdHoursMax": 72,
"quote": {
"currency": "EUR",
"checkIn": "2027-07-10",
"checkOut": "2027-07-14",
"accommodationMinor": 100000,
"cleaningMinor": 5000,
"extraGuestsMinor": 0,
"totalMinor": 105000,
"depositMinor": 20000,
"violations": [],
"bookable": true,
"nights": [
{
"date": "2027-07-10",
"amountMinor": 25000
}
]
}
}Olası hatalar: not_subscribeddates_invalid
Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/availability/searchSearch availability across properties
Checks the same stay against up to 50 subscribed properties at once (all of yours when propertyIds is left out).
Gerekli yetki: rates:read
{
"checkIn": "2027-07-10",
"checkOut": "2027-07-14",
"guests": 4,
"propertyIds": [
"5b1c1f1e-0000-4000-8000-000000000001"
]
}{
"data": [
{
"propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
"available": true,
"bookable": true,
"quote": {
"totalMinor": 105000
}
}
]
}Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
Holds and reservations
Hold nights, book them, change or cancel. Booking is instant: the dates close for every subscriber.
/v1/holdsPlace a hold
Pass extras ([{ "key": "pool.heated" }], with roomId for an amenity of a room) for the paid amenities the guest wants: their price is added to the total and they are stored on the hold, shown to the owner, and returned in extras here and in hold.created. Takes the nights off the calendar for everyone while the guest decides or pays, for up to the time the owner allows (holdMinutesMax of the property; you may ask for less with holdMinutes or holdHours). holdRef is your number for this hold or request and is required. Confirm the hold before it ends, or it falls away on its own, the nights open again and you get hold.expired. Send an Idempotency-Key header so a retry never creates a second hold.
Gerekli yetki: reservations:write
{
"propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
"checkIn": "2027-07-10",
"checkOut": "2027-07-14",
"guests": 4,
"holdHours": 24,
"holdRef": "TALEP-1042"
}{
"id": "0d6f6e0a-0000-4000-8000-000000000009",
"code": "R-100231",
"propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
"status": "HOLD",
"checkIn": "2027-07-10",
"checkOut": "2027-07-14",
"guests": 4,
"guestName": "Ali Veli",
"externalRef": "PMS-1042",
"currency": "EUR",
"totalMinor": 100000,
"holdRef": "TALEP-1042",
"holdExpiresAt": "2027-06-01T12:00:00.000Z"
}Olası hatalar: hold_ref_requiredextra_unknowndates_unavailablequeue_prioritystay_rules_violatednot_subscribed
Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/holds/{id}One hold
Poll this (every 5 seconds is fine) if you would rather not wait for a webhook: status is HOLD while it runs, CONFIRMED once converted, EXPIRED or CANCELLED otherwise; holdExpiresAt is when it ends.
Gerekli yetki: reservations:read
idpath · req | The hold id (UUID). |
{
"id": "0d6f6e0a-0000-4000-8000-000000000009",
"code": "R-100231",
"propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
"status": "HOLD",
"checkIn": "2027-07-10",
"checkOut": "2027-07-14",
"guests": 4,
"guestName": "Ali Veli",
"externalRef": "PMS-1042",
"currency": "EUR",
"totalMinor": 100000,
"holdExpiresAt": "2027-06-01T12:00:00.000Z"
}Olası hatalar: reservation_not_found
Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/holds/{id}/confirmConfirm a hold
Turns the hold into a reservation once the guest has paid. externalRef is your reservation number and is required here (unless the hold already has one).
Gerekli yetki: reservations:write
idpath · req | The hold id (UUID). |
{
"externalRef": "REZ-2027-0042"
}{
"id": "0d6f6e0a-0000-4000-8000-000000000009",
"code": "R-100231",
"propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
"status": "CONFIRMED",
"checkIn": "2027-07-10",
"checkOut": "2027-07-14",
"guests": 4,
"guestName": "Ali Veli",
"externalRef": "PMS-1042",
"currency": "EUR",
"totalMinor": 100000,
"holdRef": "TALEP-1042"
}Olası hatalar: external_ref_requiredhold_expirednot_a_hold
Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/holds/{id}/extendAsk for more time
Adds up to the owner's hold limit (minutes, default: the full limit; more is refused with 400 extension_too_long) to a running hold, at most three times and only in its last five minutes (409 extension_too_early before that). After the third extension the hold simply runs out and you place a new one, and only while no other agency is queued for the same nights. The answer is the updated hold with its new holdExpiresAt; you also get hold.extended. If someone is waiting you get 409 queue_waiting and the hold simply runs out.
Gerekli yetki: reservations:write
idpath · req | The hold id (UUID). |
{
"minutes": 15
}{
"id": "0d6f6e0a-0000-4000-8000-000000000009",
"code": "R-100231",
"propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
"status": "HOLD",
"checkIn": "2027-07-10",
"checkOut": "2027-07-14",
"guests": 4,
"guestName": "Ali Veli",
"externalRef": "PMS-1042",
"currency": "EUR",
"totalMinor": 100000,
"extensionCount": 1,
"holdExpiresAt": "2027-06-01T12:15:00.000Z"
}Olası hatalar: extension_too_earlyextension_too_longextension_limitqueue_waitinghold_expirednot_a_hold
Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/waitlistYour queue entries
Gerekli yetki: reservations:read
{
"data": [
{
"id": "…",
"propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
"checkIn": "2027-07-10",
"checkOut": "2027-07-14",
"guests": 4,
"holdRef": "TALEP-1043",
"status": "WAITING",
"priorityUntil": null
}
]
}Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/waitlistQueue for held nights
When the nights you want are held by someone else, queue for them instead of polling. The first agency in line gets waitlist.available when the nights free up and five minutes (priorityUntil) during which only it can place a hold on them; if it does not, the next one is told. Queueing while the nights are free answers 409 dates_available: just place the hold.
Gerekli yetki: reservations:write
{
"propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
"checkIn": "2027-07-10",
"checkOut": "2027-07-14",
"guests": 4,
"holdRef": "TALEP-1043"
}{
"id": "…",
"status": "WAITING",
"ahead": 0
}Olası hatalar: hold_ref_requireddates_availablewaitlist_fullnot_subscribed
Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/waitlist/{id}Leave the queue
Gerekli yetki: reservations:write
idpath · req | The entry id (UUID). |
nullOlası hatalar: waitlist_entry_not_found
/v1/holds/{id}Release a hold
Gerekli yetki: reservations:write
idpath · req | The hold id (UUID). |
{
"id": "0d6f6e0a-0000-4000-8000-000000000009",
"code": "R-100231",
"propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
"status": "CANCELLED",
"checkIn": "2027-07-10",
"checkOut": "2027-07-14",
"guests": 4,
"guestName": "Ali Veli",
"externalRef": "PMS-1042",
"currency": "EUR",
"totalMinor": 100000
}Olası hatalar: not_a_hold
Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/reservationsSend a reservation
Paid amenities the guest wants go in extras (see extraOptions of the availability answer); they are added to the total, stored on the reservation and sent in reservation.confirmed. externalRef is your reservation number in your own system and is required. Books the stay and closes the nights for every subscriber within seconds (they get calendar.updated). If the nights were taken in the meantime the answer is 409 dates_unavailable; if the stay breaks a rule (min_nights …) it is 422 stay_rules_violated with the reasons. Amounts are quoted from the owner's rates at booking time and stored with the booking. Send an Idempotency-Key header: a retry with the same key returns the first answer instead of booking twice.
Gerekli yetki: reservations:write
{
"propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
"checkIn": "2027-07-10",
"checkOut": "2027-07-14",
"guests": 4,
"guestName": "Ali Veli",
"externalRef": "PMS-1042",
"notes": "Late arrival"
}{
"id": "0d6f6e0a-0000-4000-8000-000000000009",
"code": "R-100231",
"propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
"status": "CONFIRMED",
"checkIn": "2027-07-10",
"checkOut": "2027-07-14",
"guests": 4,
"guestName": "Ali Veli",
"externalRef": "PMS-1042",
"currency": "EUR",
"totalMinor": 100000
}Olası hatalar: external_ref_requiredextra_unknowndates_unavailablequeue_prioritystay_rules_violatednot_subscribed
Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/reservationsList reservations
Gerekli yetki: reservations:read
statusquery | HOLD, CONFIRMED, CANCELLED or EXPIRED. |
propertyIdquery | Only this property. |
limitquery | At most 500. |
{
"data": [
{
"id": "0d6f6e0a-0000-4000-8000-000000000009",
"code": "R-100231",
"propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
"status": "CONFIRMED",
"checkIn": "2027-07-10",
"checkOut": "2027-07-14",
"guests": 4,
"guestName": "Ali Veli",
"externalRef": "PMS-1042",
"currency": "EUR",
"totalMinor": 100000
}
]
}Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/reservations/{id}One reservation
Gerekli yetki: reservations:read
idpath · req | The reservation id (UUID). |
{
"id": "0d6f6e0a-0000-4000-8000-000000000009",
"code": "R-100231",
"propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
"status": "CONFIRMED",
"checkIn": "2027-07-10",
"checkOut": "2027-07-14",
"guests": 4,
"guestName": "Ali Veli",
"externalRef": "PMS-1042",
"currency": "EUR",
"totalMinor": 100000
}Olası hatalar: reservation_not_found
Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/reservations/{id}Change a reservation
New dates or guest count are quoted and checked again (your own nights do not count as taken); the nights move atomically. Details (guestName, externalRef, notes) change without any check.
Gerekli yetki: reservations:write
idpath · req | The reservation id (UUID). |
{
"checkOut": "2027-07-15",
"guests": 5
}{
"id": "0d6f6e0a-0000-4000-8000-000000000009",
"code": "R-100231",
"propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
"status": "CONFIRMED",
"checkIn": "2027-07-10",
"checkOut": "2027-07-14",
"guests": 4,
"guestName": "Ali Veli",
"externalRef": "PMS-1042",
"currency": "EUR",
"totalMinor": 100000
}Olası hatalar: extra_unknowndates_unavailablestay_rules_violatedreservation_not_active
Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/reservations/{id}/cancelSend a cancellation
Cancels the booking and reopens the nights for every subscriber. An owner may also cancel (with a reason): you then get reservation.cancelled with by: "owner".
Gerekli yetki: reservations:write
idpath · req | The reservation id (UUID). |
{
"reason": "Guest cancelled"
}{
"id": "0d6f6e0a-0000-4000-8000-000000000009",
"code": "R-100231",
"propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
"status": "CANCELLED",
"checkIn": "2027-07-10",
"checkOut": "2027-07-14",
"guests": 4,
"guestName": "Ali Veli",
"externalRef": "PMS-1042",
"currency": "EUR",
"totalMinor": 100000,
"cancelledBy": "AGENCY"
}Olası hatalar: reservation_not_active
Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
Events
Everything that happened to your properties, in order. The same events your webhooks carry.
/v1/eventsEvent log
Every event about your subscribed properties and your own bookings, oldest first. Keep the id of the last event you processed and pass it as after to continue; each property also numbers its events (property_seq 1, 2, 3…), so a gap tells you a webhook was missed.
Gerekli yetki: events:read
afterquery | Return events after this id (evt_123 or 123). |
propertyIdquery | Only this property. |
typequery | Only this event type. |
limitquery | At most 500 (default 100). |
{
"data": [
{
"id": "evt_981",
"type": "calendar.updated",
"created_at": "2027-06-01T10:00:00.000Z",
"livemode": true,
"api_version": "2026-11-01",
"property_id": "5b1c1f1e-0000-4000-8000-000000000001",
"property_seq": 14,
"data": {
"closed": [
{
"start": "2027-07-10",
"end": "2027-07-14"
}
],
"opened": [],
"source": "agency"
}
}
],
"next_after": "evt_981",
"has_more": false
}Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/events/{id}One event
Gerekli yetki: events:read
idpath · req | Event id, evt_…. |
{
"id": "evt_981",
"type": "calendar.updated"
}Olası hatalar: event_not_found
Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
Webhooks
Manage endpoints and look at deliveries.
/v1/webhook-endpointsList endpoints
Gerekli yetki: webhooks:manage
{
"data": [
{
"id": "…",
"url": "https://example.com/hooks/bp",
"events": null,
"livemode": true,
"active": true,
"consecutiveFailures": 0
}
]
}Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/webhook-endpointsAdd an endpoint
The signing secret (whsec_…) is in this answer and only this answer. Leave events out to receive every event type. Addresses must be public https (http is allowed outside production).
Gerekli yetki: webhooks:manage
{
"url": "https://example.com/hooks/bp",
"description": "PMS",
"events": [
"calendar.updated",
"reservation.cancelled"
]
}{
"id": "…",
"url": "https://example.com/hooks/bp",
"secret": "whsec_MfKQ9r8GKYqrTwjUPD8ILPZIo2LaLaSw"
}Olası hatalar: url_invalidurl_not_publicevent_type_invalidtoo_many_endpoints
Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/webhook-endpoints/{id}Change an endpoint
Set active: true to switch a disabled endpoint back on (the failure count is reset).
Gerekli yetki: webhooks:manage
idpath · req | The endpoint id (UUID). |
{
"active": true
}{
"id": "…",
"active": true
}Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/webhook-endpoints/{id}Delete an endpoint
Gerekli yetki: webhooks:manage
idpath · req | The endpoint id (UUID). |
/v1/webhook-endpoints/{id}/testSend a test event
Sends a ping event now, signed like the real ones, and returns what your server answered. Nothing is stored or retried.
Gerekli yetki: webhooks:manage
idpath · req | The endpoint id (UUID). |
{
"ok": true,
"status": 200,
"ms": 84,
"response": "ok"
}Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/webhook-endpoints/{id}/rotate-secretRotate the secret
Returns a new secret. The old one keeps signing alongside it for 24 hours (the signature header carries both), so you can switch without losing events.
Gerekli yetki: webhooks:manage
idpath · req | The endpoint id (UUID). |
{
"secret": "whsec_…"
}Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/webhook-deliveriesDelivery log
Gerekli yetki: webhooks:manage
endpointIdquery | Only this endpoint. |
statusquery | PENDING, SUCCESS or FAILED. |
limitquery | At most 200. |
beforequery | Only deliveries created before this timestamp (for paging). |
{
"data": [
{
"id": "…",
"endpointId": "…",
"status": "SUCCESS",
"attempts": 1,
"lastStatusCode": 200,
"eventId": "evt_981",
"eventType": "calendar.updated",
"propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
"propertySeq": 14
}
]
}Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/webhook-deliveries/{id}/retrySend a delivery again
Gerekli yetki: webhooks:manage
idpath · req | The delivery id (UUID). |
{
"status": "queued"
}Olası hatalar: delivery_not_found
Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
Sandbox
Test-key only: reset the sample data and simulate what owners and other agencies do.
/v1/sandbox/resetyalnızca sandboxReset the sandbox
Deletes your sandbox reservations and properties and creates the three sample properties again.
{
"status": "reset"
}Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/sandbox/simulate/owner-blockyalnızca sandboxThe owner closes dates
Triggers calendar.updated with source: "owner".
{
"propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
"from": "2027-02-01",
"to": "2027-02-05"
}{
"closed": [
{
"start": "2027-02-01",
"end": "2027-02-05"
}
]
}Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/sandbox/simulate/owner-unblockyalnızca sandboxThe owner reopens dates
{
"propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
"from": "2027-02-01",
"to": "2027-02-05"
}{
"opened": [],
"stillClosed": []
}Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/sandbox/simulate/other-agency-bookingyalnızca sandboxAnother agency books
Closes the dates and triggers calendar.updated with source: "agency", exactly what you receive when a competitor books a shared property.
{
"propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
"from": "2027-02-10",
"to": "2027-02-12"
}{
"ok": true
}Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/sandbox/simulate/price-changeyalnızca sandboxThe owner changes the price
Triggers rates.updated.
{
"propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
"from": "2027-02-20",
"to": "2027-02-25",
"nightlyMinor": 29900
}{
"ok": true
}Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/sandbox/simulate/property-updateyalnızca sandboxThe owner edits the listing
Triggers property.updated. name really renames the sandbox property.
{
"propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
"name": "Villa Mavi Deluxe"
}{
"ok": true
}Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/sandbox/simulate/subscription-approveyalnızca sandboxThe owner approves your request
For a property you subscribed to that waits for approval. Triggers subscription.approved.
{
"propertyId": "5b1c1f1e-0000-4000-8000-000000000001"
}{
"ok": true
}Olası hatalar: no_pending_request
Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.
/v1/sandbox/simulate/subscription-revokeyalnızca sandboxThe owner ends your subscription
Triggers subscription.revoked and releases your holds.
{
"propertyId": "5b1c1f1e-0000-4000-8000-000000000001"
}{
"ok": true
}Olası hatalar: subscription_not_active
Test Et
Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.