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.

get/v1/me

The key you are calling with

Cevap 200
{
  "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.

get/v1/amenity-categories

Amenity categories

Gerekli yetki: catalog:read

localequeryLanguage of names: tr or en.
Cevap 200
{
  "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.

get/v1/amenities

All 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

localequeryLanguage of names: tr or en.
Cevap 200
{
  "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.

get/v1/property-types

Property types

Gerekli yetki: catalog:read

localequeryLanguage of names: tr or en.
Cevap 200
{
  "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.

get/v1/room-types

Room types

Gerekli yetki: catalog:read

localequeryLanguage of names: tr or en.
Cevap 200
{
  "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.

get/v1/bed-types

Bed types

Keys used in rooms[].beds[].type; sleeps is how many people one bed takes.

Gerekli yetki: catalog:read

localequeryLanguage of names: tr or en.
Cevap 200
{
  "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.

get/v1/geo/countries

Countries

Gerekli yetki: catalog:read

localequeryLanguage of names: tr or en.
Cevap 200
{
  "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.

get/v1/geo/nodes

Children 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 · reqId of the parent node.
localequeryLanguage of names: tr or en.
Cevap 200
{
  "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.

get/v1/currencies

Currencies

Gerekli yetki: catalog:read

Cevap 200
{
  "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.

get/v1/locales

Languages

Gerekli yetki: catalog:read

Cevap 200
{
  "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.

get/v1/properties

Query 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

qqueryName, code or address contains.
geoIdqueryA place id from /v1/geo/*; matches that place and everything below it.
typesqueryComma-separated property type keys.
guestsquerySleeps at least this many.
bedroomsqueryAt least this many bedrooms.
bathroomsqueryAt least this many bathrooms.
amenitiesqueryComma-separated amenity keys; the property must have all of them.
subscribedquerytrue only properties you subscribe to, false only those you do not.
limitqueryPage size, at most 60 (default 25).
cursorqueryThe nextCursor of the previous page.
localequeryLanguage of names: tr or en.
Cevap 200
{
  "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.

get/v1/properties/{id}

One property

Gerekli yetki: properties:read

idpath · reqThe property id (UUID).
localequeryLanguage of names: tr or en.
Cevap 200
{
  "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.

get/v1/properties/{id}/media

Photos

Each photo comes in thumb, medium and large WebP. Fetch the URLs with the same Bearer key.

Gerekli yetki: properties:read

idpath · reqThe property id (UUID).
Cevap 200
{
  "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.

get/v1/media/{imageId}/{size}

A photo file

Gerekli yetki: properties:read

imageIdpath · reqPhoto id.
sizepath · reqthumb, medium or large.
Cevap 200
(binary WebP)
get/v1/properties/{id}/export

Download 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 · reqThe property id (UUID).
formatqueryjson (default), zip, calendar.csv or rates.csv.
localequeryLanguage of names: tr or en.
Cevap 200
(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.

post/v1/properties/{id}/subscription

Subscribe

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 · reqThe property id (UUID).
İstek
{
  "message": "We run 40 villas in Kaş."
}
Cevap 201
{
  "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.

delete/v1/properties/{id}/subscription

Unsubscribe

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 · reqThe property id (UUID).

Olası hatalar: subscription_not_foundsubscription_has_bookings

get/v1/subscriptions

Your subscriptions

Gerekli yetki: properties:read

statusqueryREQUESTED, ACTIVE, REJECTED or ENDED.
Cevap 200
{
  "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.

get/v1/subscriptions/{id}

One subscription

Gerekli yetki: properties:read

idpath · reqThe subscription id (UUID).
Cevap 200
{
  "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.

get/v1/properties/{id}/calendar

Calendar

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 · reqThe property id (UUID).
fromquery · reqFirst day, YYYY-MM-DD.
toquery · reqLast day, exclusive (a stay ends on the day it departs).
Cevap 200
{
  "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.

get/v1/properties/{id}/calendar.ics

Calendar 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 · reqThe property id (UUID).
Cevap 200
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.

get/v1/properties/{id}/rates

Rates

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 · reqThe property id (UUID).
fromquery · reqFirst day, YYYY-MM-DD.
toquery · reqLast day, exclusive (a stay ends on the day it departs).
Cevap 200
{
  "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.

get/v1/properties/{id}/availability

Availability 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 · reqThe property id (UUID).
checkInquery · reqArrival date.
checkOutquery · reqDeparture date.
guestsqueryNumber of guests (default 1).
extrasqueryPaid amenities to quote, comma separated: key for a property-wide amenity, key@roomId for one in a room.
Cevap 200
{
  "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.

post/v1/availability/search

Search 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

İstek
{
  "checkIn": "2027-07-10",
  "checkOut": "2027-07-14",
  "guests": 4,
  "propertyIds": [
    "5b1c1f1e-0000-4000-8000-000000000001"
  ]
}
Cevap 200
{
  "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.

post/v1/holds

Place 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

İstek
{
  "propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
  "checkIn": "2027-07-10",
  "checkOut": "2027-07-14",
  "guests": 4,
  "holdHours": 24,
  "holdRef": "TALEP-1042"
}
Cevap 201
{
  "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.

get/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 · reqThe hold id (UUID).
Cevap 200
{
  "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.

post/v1/holds/{id}/confirm

Confirm 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 · reqThe hold id (UUID).
İstek
{
  "externalRef": "REZ-2027-0042"
}
Cevap 200
{
  "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.

post/v1/holds/{id}/extend

Ask 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 · reqThe hold id (UUID).
İstek
{
  "minutes": 15
}
Cevap 200
{
  "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.

get/v1/waitlist

Your queue entries

Gerekli yetki: reservations:read

Cevap 200
{
  "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.

post/v1/waitlist

Queue 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

İstek
{
  "propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
  "checkIn": "2027-07-10",
  "checkOut": "2027-07-14",
  "guests": 4,
  "holdRef": "TALEP-1043"
}
Cevap 201
{
  "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.

delete/v1/waitlist/{id}

Leave the queue

Gerekli yetki: reservations:write

idpath · reqThe entry id (UUID).
Cevap 204
null

Olası hatalar: waitlist_entry_not_found

delete/v1/holds/{id}

Release a hold

Gerekli yetki: reservations:write

idpath · reqThe hold id (UUID).
Cevap 200
{
  "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.

post/v1/reservations

Send 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

İstek
{
  "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"
}
Cevap 201
{
  "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.

get/v1/reservations

List reservations

Gerekli yetki: reservations:read

statusqueryHOLD, CONFIRMED, CANCELLED or EXPIRED.
propertyIdqueryOnly this property.
limitqueryAt most 500.
Cevap 200
{
  "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.

get/v1/reservations/{id}

One reservation

Gerekli yetki: reservations:read

idpath · reqThe reservation id (UUID).
Cevap 200
{
  "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.

patch/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 · reqThe reservation id (UUID).
İstek
{
  "checkOut": "2027-07-15",
  "guests": 5
}
Cevap 200
{
  "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.

post/v1/reservations/{id}/cancel

Send 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 · reqThe reservation id (UUID).
İstek
{
  "reason": "Guest cancelled"
}
Cevap 200
{
  "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.

get/v1/events

Event 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

afterqueryReturn events after this id (evt_123 or 123).
propertyIdqueryOnly this property.
typequeryOnly this event type.
limitqueryAt most 500 (default 100).
Cevap 200
{
  "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.

get/v1/events/{id}

One event

Gerekli yetki: events:read

idpath · reqEvent id, evt_….
Cevap 200
{
  "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.

get/v1/webhook-endpoints

List endpoints

Gerekli yetki: webhooks:manage

Cevap 200
{
  "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.

post/v1/webhook-endpoints

Add 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

İstek
{
  "url": "https://example.com/hooks/bp",
  "description": "PMS",
  "events": [
    "calendar.updated",
    "reservation.cancelled"
  ]
}
Cevap 201
{
  "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.

patch/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 · reqThe endpoint id (UUID).
İstek
{
  "active": true
}
Cevap 200
{
  "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.

delete/v1/webhook-endpoints/{id}

Delete an endpoint

Gerekli yetki: webhooks:manage

idpath · reqThe endpoint id (UUID).
post/v1/webhook-endpoints/{id}/test

Send 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 · reqThe endpoint id (UUID).
Cevap 200
{
  "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.

post/v1/webhook-endpoints/{id}/rotate-secret

Rotate 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 · reqThe endpoint id (UUID).
Cevap 200
{
  "secret": "whsec_…"
}
Test Et

Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.

get/v1/webhook-deliveries

Delivery log

Gerekli yetki: webhooks:manage

endpointIdqueryOnly this endpoint.
statusqueryPENDING, SUCCESS or FAILED.
limitqueryAt most 200.
beforequeryOnly deliveries created before this timestamp (for paging).
Cevap 200
{
  "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.

post/v1/webhook-deliveries/{id}/retry

Send a delivery again

Gerekli yetki: webhooks:manage

idpath · reqThe delivery id (UUID).
Cevap 202
{
  "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.

post/v1/sandbox/resetyalnızca sandbox

Reset the sandbox

Deletes your sandbox reservations and properties and creates the three sample properties again.

Cevap 200
{
  "status": "reset"
}
Test Et

Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.

post/v1/sandbox/simulate/owner-blockyalnızca sandbox

The owner closes dates

Triggers calendar.updated with source: "owner".

İstek
{
  "propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
  "from": "2027-02-01",
  "to": "2027-02-05"
}
Cevap 200
{
  "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.

post/v1/sandbox/simulate/owner-unblockyalnızca sandbox

The owner reopens dates

İstek
{
  "propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
  "from": "2027-02-01",
  "to": "2027-02-05"
}
Cevap 200
{
  "opened": [],
  "stillClosed": []
}
Test Et

Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.

post/v1/sandbox/simulate/other-agency-bookingyalnızca sandbox

Another agency books

Closes the dates and triggers calendar.updated with source: "agency", exactly what you receive when a competitor books a shared property.

İstek
{
  "propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
  "from": "2027-02-10",
  "to": "2027-02-12"
}
Cevap 200
{
  "ok": true
}
Test Et

Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.

post/v1/sandbox/simulate/price-changeyalnızca sandbox

The owner changes the price

Triggers rates.updated.

İstek
{
  "propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
  "from": "2027-02-20",
  "to": "2027-02-25",
  "nightlyMinor": 29900
}
Cevap 200
{
  "ok": true
}
Test Et

Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.

post/v1/sandbox/simulate/property-updateyalnızca sandbox

The owner edits the listing

Triggers property.updated. name really renames the sandbox property.

İstek
{
  "propertyId": "5b1c1f1e-0000-4000-8000-000000000001",
  "name": "Villa Mavi Deluxe"
}
Cevap 200
{
  "ok": true
}
Test Et

Yalnızca bp_test_ ile başlayan sandbox anahtarları kabul edilir. Anahtar sadece bu sekmede, tarayıcı oturumu boyunca tutulur.

post/v1/sandbox/simulate/subscription-approveyalnızca sandbox

The owner approves your request

For a property you subscribed to that waits for approval. Triggers subscription.approved.

İstek
{
  "propertyId": "5b1c1f1e-0000-4000-8000-000000000001"
}
Cevap 200
{
  "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.

post/v1/sandbox/simulate/subscription-revokeyalnızca sandbox

The owner ends your subscription

Triggers subscription.revoked and releases your holds.

İstek
{
  "propertyId": "5b1c1f1e-0000-4000-8000-000000000001"
}
Cevap 200
{
  "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.