{"info":{"name":"CesiSync Agency API","schema":"https://schema.getpostman.com/json/collection/v2.1.0/collection.json"},"variable":[{"key":"baseUrl","value":"https://api.cesisync.com"},{"key":"apiKey","value":"bp_test_…"}],"item":[{"name":"Account","item":[{"name":"GET /v1/me","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/me","host":["{{baseUrl}}"],"path":["v1","me"],"query":[],"variable":[]},"description":"The key you are calling with"}}]},{"name":"Catalog","item":[{"name":"GET /v1/amenity-categories","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/amenity-categories","host":["{{baseUrl}}"],"path":["v1","amenity-categories"],"query":[{"key":"locale","value":"en","description":"Language of names: `tr` or `en`.","disabled":true}],"variable":[]},"description":"Amenity categories"}},{"name":"GET /v1/amenities","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/amenities","host":["{{baseUrl}}"],"path":["v1","amenities"],"query":[{"key":"locale","value":"en","description":"Language of names: `tr` or `en`.","disabled":true}],"variable":[]},"description":"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`)."}},{"name":"GET /v1/property-types","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/property-types","host":["{{baseUrl}}"],"path":["v1","property-types"],"query":[{"key":"locale","value":"en","description":"Language of names: `tr` or `en`.","disabled":true}],"variable":[]},"description":"Property types"}},{"name":"GET /v1/room-types","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/room-types","host":["{{baseUrl}}"],"path":["v1","room-types"],"query":[{"key":"locale","value":"en","description":"Language of names: `tr` or `en`.","disabled":true}],"variable":[]},"description":"Room types"}},{"name":"GET /v1/bed-types","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/bed-types","host":["{{baseUrl}}"],"path":["v1","bed-types"],"query":[{"key":"locale","value":"en","description":"Language of names: `tr` or `en`.","disabled":true}],"variable":[]},"description":"Keys used in `rooms[].beds[].type`; `sleeps` is how many people one bed takes."}},{"name":"GET /v1/legal-forms","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/legal-forms","host":["{{baseUrl}}"],"path":["v1","legal-forms"],"query":[{"key":"country","value":"TR","description":"ISO 3166-1 alpha-2 code.","disabled":false}],"variable":[]},"description":"What a company can be in that country (`LTD`, `AS` in Turkey; `LLC`, `C_CORP` in the US). `individual` marks sole traders."}},{"name":"GET /v1/geo/countries","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/geo/countries","host":["{{baseUrl}}"],"path":["v1","geo","countries"],"query":[{"key":"locale","value":"en","description":"Language of names: `tr` or `en`.","disabled":true}],"variable":[]},"description":"Countries"}},{"name":"GET /v1/geo/nodes","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/geo/nodes","host":["{{baseUrl}}"],"path":["v1","geo","nodes"],"query":[{"key":"parent","value":"","description":"Id of the parent node.","disabled":false},{"key":"locale","value":"en","description":"Language of names: `tr` or `en`.","disabled":true}],"variable":[]},"description":"Walk the tree: country → region → city → district → neighbourhood. Pass a node id as `geoId` to `GET /v1/properties` to filter by it."}},{"name":"GET /v1/geo/search","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/geo/search","host":["{{baseUrl}}"],"path":["v1","geo","search"],"query":[{"key":"q","value":"Kalkan","description":"At least two characters.","disabled":false},{"key":"locale","value":"en","description":"Language of names: `tr` or `en`.","disabled":true},{"key":"country","value":"","description":"Limit to a country node id.","disabled":true}],"variable":[]},"description":"Search places by name"}},{"name":"GET /v1/currencies","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/currencies","host":["{{baseUrl}}"],"path":["v1","currencies"],"query":[],"variable":[]},"description":"Currencies"}},{"name":"GET /v1/locales","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/locales","host":["{{baseUrl}}"],"path":["v1","locales"],"query":[],"variable":[]},"description":"Languages"}}]},{"name":"Properties","item":[{"name":"GET /v1/properties","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/properties","host":["{{baseUrl}}"],"path":["v1","properties"],"query":[{"key":"q","value":"","description":"Name, code or address contains.","disabled":true},{"key":"geoId","value":"","description":"A place id from `/v1/geo/*`; matches that place and everything below it.","disabled":true},{"key":"types","value":"villa,bungalow","description":"Comma-separated property type keys.","disabled":true},{"key":"guests","value":"","description":"Sleeps at least this many.","disabled":true},{"key":"bedrooms","value":"","description":"At least this many bedrooms.","disabled":true},{"key":"bathrooms","value":"","description":"At least this many bathrooms.","disabled":true},{"key":"amenities","value":"pool.private,view.sea","description":"Comma-separated amenity keys; the property must have all of them.","disabled":true},{"key":"subscribed","value":"","description":"`true` only properties you subscribe to, `false` only those you do not.","disabled":true},{"key":"limit","value":"","description":"Page size, at most 60 (default 25).","disabled":true},{"key":"cursor","value":"","description":"The `nextCursor` of the previous page.","disabled":true},{"key":"locale","value":"en","description":"Language of names: `tr` or `en`.","disabled":true}],"variable":[]},"description":"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."}},{"name":"GET /v1/properties/{id}","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/properties/:id","host":["{{baseUrl}}"],"path":["v1","properties",":id"],"query":[{"key":"locale","value":"en","description":"Language of names: `tr` or `en`.","disabled":true}],"variable":[{"key":"id","value":"","description":"The property id (UUID)."}]},"description":"One property"}},{"name":"GET /v1/properties/{id}/media","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/properties/:id/media","host":["{{baseUrl}}"],"path":["v1","properties",":id","media"],"query":[],"variable":[{"key":"id","value":"","description":"The property id (UUID)."}]},"description":"Each photo comes in `thumb`, `medium` and `large` WebP. Fetch the URLs with the same Bearer key."}},{"name":"GET /v1/media/{imageId}/{size}","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/media/:imageId/:size","host":["{{baseUrl}}"],"path":["v1","media",":imageId",":size"],"query":[],"variable":[{"key":"imageId","value":"","description":"Photo id."},{"key":"size","value":"","description":"`thumb`, `medium` or `large`."}]},"description":"A photo file"}},{"name":"GET /v1/properties/{id}/export","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/properties/:id/export","host":["{{baseUrl}}"],"path":["v1","properties",":id","export"],"query":[{"key":"format","value":"zip","description":"`json` (default), `zip`, `calendar.csv` or `rates.csv`.","disabled":true},{"key":"locale","value":"en","description":"Language of names: `tr` or `en`.","disabled":true}],"variable":[{"key":"id","value":"","description":"The property id (UUID)."}]},"description":"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."}}]},{"name":"Subscriptions","item":[{"name":"POST /v1/properties/{id}/subscription","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/properties/:id/subscription","host":["{{baseUrl}}"],"path":["v1","properties",":id","subscription"],"query":[],"variable":[{"key":"id","value":"","description":"The property id (UUID)."}]},"body":{"mode":"raw","raw":"{\n  \"message\": \"We run 40 villas in Kaş.\"\n}","options":{"raw":{"language":"json"}}},"description":"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."}},{"name":"DELETE /v1/properties/{id}/subscription","request":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/properties/:id/subscription","host":["{{baseUrl}}"],"path":["v1","properties",":id","subscription"],"query":[],"variable":[{"key":"id","value":"","description":"The property id (UUID)."}]},"description":"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."}},{"name":"GET /v1/subscriptions","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/subscriptions","host":["{{baseUrl}}"],"path":["v1","subscriptions"],"query":[{"key":"status","value":"","description":"`REQUESTED`, `ACTIVE`, `REJECTED` or `ENDED`.","disabled":true}],"variable":[]},"description":"Your subscriptions"}},{"name":"GET /v1/subscriptions/{id}","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/subscriptions/:id","host":["{{baseUrl}}"],"path":["v1","subscriptions",":id"],"query":[],"variable":[{"key":"id","value":"","description":"The subscription id (UUID)."}]},"description":"One subscription"}}]},{"name":"Calendar and rates","item":[{"name":"GET /v1/properties/{id}/calendar","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/properties/:id/calendar","host":["{{baseUrl}}"],"path":["v1","properties",":id","calendar"],"query":[{"key":"from","value":"2027-07-01","description":"First day, `YYYY-MM-DD`.","disabled":false},{"key":"to","value":"2027-07-15","description":"Last day, exclusive (a stay ends on the day it departs).","disabled":false}],"variable":[{"key":"id","value":"","description":"The property id (UUID)."}]},"description":"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."}},{"name":"GET /v1/properties/{id}/calendar.ics","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/properties/:id/calendar.ics","host":["{{baseUrl}}"],"path":["v1","properties",":id","calendar.ics"],"query":[],"variable":[{"key":"id","value":"","description":"The property id (UUID)."}]},"description":"Closed nights as an RFC 5545 feed for software that only speaks iCal. Names and details are never included."}},{"name":"GET /v1/properties/{id}/rates","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/properties/:id/rates","host":["{{baseUrl}}"],"path":["v1","properties",":id","rates"],"query":[{"key":"from","value":"2027-07-01","description":"First day, `YYYY-MM-DD`.","disabled":false},{"key":"to","value":"2027-07-15","description":"Last day, exclusive (a stay ends on the day it departs).","disabled":false}],"variable":[{"key":"id","value":"","description":"The property id (UUID)."}]},"description":"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`."}},{"name":"GET /v1/properties/{id}/availability","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/properties/:id/availability","host":["{{baseUrl}}"],"path":["v1","properties",":id","availability"],"query":[{"key":"checkIn","value":"2027-07-10","description":"Arrival date.","disabled":false},{"key":"checkOut","value":"2027-07-14","description":"Departure date.","disabled":false},{"key":"guests","value":"4","description":"Number of guests (default 1).","disabled":true},{"key":"extras","value":"pool.heated","description":"Paid amenities to quote, comma separated: `key` for a property-wide amenity, `key@roomId` for one in a room.","disabled":true}],"variable":[{"key":"id","value":"","description":"The property id (UUID)."}]},"description":"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`."}},{"name":"POST /v1/availability/search","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/availability/search","host":["{{baseUrl}}"],"path":["v1","availability","search"],"query":[],"variable":[]},"body":{"mode":"raw","raw":"{\n  \"checkIn\": \"2027-07-10\",\n  \"checkOut\": \"2027-07-14\",\n  \"guests\": 4,\n  \"propertyIds\": [\n    \"5b1c1f1e-0000-4000-8000-000000000001\"\n  ]\n}","options":{"raw":{"language":"json"}}},"description":"Checks the same stay against up to 50 subscribed properties at once (all of yours when `propertyIds` is left out)."}}]},{"name":"Holds and reservations","item":[{"name":"POST /v1/holds","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"},{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"{{$guid}}"}],"url":{"raw":"{{baseUrl}}/v1/holds","host":["{{baseUrl}}"],"path":["v1","holds"],"query":[],"variable":[]},"body":{"mode":"raw","raw":"{\n  \"propertyId\": \"5b1c1f1e-0000-4000-8000-000000000001\",\n  \"checkIn\": \"2027-07-10\",\n  \"checkOut\": \"2027-07-14\",\n  \"guests\": 4,\n  \"holdHours\": 24,\n  \"holdRef\": \"TALEP-1042\"\n}","options":{"raw":{"language":"json"}}},"description":"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."}},{"name":"GET /v1/holds/{id}","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/holds/:id","host":["{{baseUrl}}"],"path":["v1","holds",":id"],"query":[],"variable":[{"key":"id","value":"","description":"The hold id (UUID)."}]},"description":"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."}},{"name":"POST /v1/holds/{id}/confirm","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/holds/:id/confirm","host":["{{baseUrl}}"],"path":["v1","holds",":id","confirm"],"query":[],"variable":[{"key":"id","value":"","description":"The hold id (UUID)."}]},"body":{"mode":"raw","raw":"{\n  \"externalRef\": \"REZ-2027-0042\"\n}","options":{"raw":{"language":"json"}}},"description":"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)."}},{"name":"POST /v1/holds/{id}/extend","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/holds/:id/extend","host":["{{baseUrl}}"],"path":["v1","holds",":id","extend"],"query":[],"variable":[{"key":"id","value":"","description":"The hold id (UUID)."}]},"body":{"mode":"raw","raw":"{\n  \"minutes\": 15\n}","options":{"raw":{"language":"json"}}},"description":"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."}},{"name":"GET /v1/waitlist","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/waitlist","host":["{{baseUrl}}"],"path":["v1","waitlist"],"query":[],"variable":[]},"description":"Your queue entries"}},{"name":"POST /v1/waitlist","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/waitlist","host":["{{baseUrl}}"],"path":["v1","waitlist"],"query":[],"variable":[]},"body":{"mode":"raw","raw":"{\n  \"propertyId\": \"5b1c1f1e-0000-4000-8000-000000000001\",\n  \"checkIn\": \"2027-07-10\",\n  \"checkOut\": \"2027-07-14\",\n  \"guests\": 4,\n  \"holdRef\": \"TALEP-1043\"\n}","options":{"raw":{"language":"json"}}},"description":"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."}},{"name":"DELETE /v1/waitlist/{id}","request":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/waitlist/:id","host":["{{baseUrl}}"],"path":["v1","waitlist",":id"],"query":[],"variable":[{"key":"id","value":"","description":"The entry id (UUID)."}]},"description":"Leave the queue"}},{"name":"DELETE /v1/holds/{id}","request":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/holds/:id","host":["{{baseUrl}}"],"path":["v1","holds",":id"],"query":[],"variable":[{"key":"id","value":"","description":"The hold id (UUID)."}]},"description":"Release a hold"}},{"name":"POST /v1/reservations","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"},{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"{{$guid}}"}],"url":{"raw":"{{baseUrl}}/v1/reservations","host":["{{baseUrl}}"],"path":["v1","reservations"],"query":[],"variable":[]},"body":{"mode":"raw","raw":"{\n  \"propertyId\": \"5b1c1f1e-0000-4000-8000-000000000001\",\n  \"checkIn\": \"2027-07-10\",\n  \"checkOut\": \"2027-07-14\",\n  \"guests\": 4,\n  \"guestName\": \"Ali Veli\",\n  \"externalRef\": \"PMS-1042\",\n  \"notes\": \"Late arrival\"\n}","options":{"raw":{"language":"json"}}},"description":"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."}},{"name":"GET /v1/reservations","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/reservations","host":["{{baseUrl}}"],"path":["v1","reservations"],"query":[{"key":"status","value":"","description":"`HOLD`, `CONFIRMED`, `CANCELLED` or `EXPIRED`.","disabled":true},{"key":"propertyId","value":"","description":"Only this property.","disabled":true},{"key":"limit","value":"","description":"At most 500.","disabled":true}],"variable":[]},"description":"List reservations"}},{"name":"GET /v1/reservations/{id}","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/reservations/:id","host":["{{baseUrl}}"],"path":["v1","reservations",":id"],"query":[],"variable":[{"key":"id","value":"","description":"The reservation id (UUID)."}]},"description":"One reservation"}},{"name":"PATCH /v1/reservations/{id}","request":{"method":"PATCH","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/reservations/:id","host":["{{baseUrl}}"],"path":["v1","reservations",":id"],"query":[],"variable":[{"key":"id","value":"","description":"The reservation id (UUID)."}]},"body":{"mode":"raw","raw":"{\n  \"checkOut\": \"2027-07-15\",\n  \"guests\": 5\n}","options":{"raw":{"language":"json"}}},"description":"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."}},{"name":"POST /v1/reservations/{id}/cancel","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/reservations/:id/cancel","host":["{{baseUrl}}"],"path":["v1","reservations",":id","cancel"],"query":[],"variable":[{"key":"id","value":"","description":"The reservation id (UUID)."}]},"body":{"mode":"raw","raw":"{\n  \"reason\": \"Guest cancelled\"\n}","options":{"raw":{"language":"json"}}},"description":"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\"`."}}]},{"name":"Events","item":[{"name":"GET /v1/events","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/events","host":["{{baseUrl}}"],"path":["v1","events"],"query":[{"key":"after","value":"","description":"Return events after this id (`evt_123` or `123`).","disabled":true},{"key":"propertyId","value":"","description":"Only this property.","disabled":true},{"key":"type","value":"","description":"Only this event type.","disabled":true},{"key":"limit","value":"","description":"At most 500 (default 100).","disabled":true}],"variable":[]},"description":"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."}},{"name":"GET /v1/events/{id}","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/events/:id","host":["{{baseUrl}}"],"path":["v1","events",":id"],"query":[],"variable":[{"key":"id","value":"","description":"Event id, `evt_…`."}]},"description":"One event"}}]},{"name":"Webhooks","item":[{"name":"GET /v1/webhook-endpoints","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/webhook-endpoints","host":["{{baseUrl}}"],"path":["v1","webhook-endpoints"],"query":[],"variable":[]},"description":"List endpoints"}},{"name":"POST /v1/webhook-endpoints","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/webhook-endpoints","host":["{{baseUrl}}"],"path":["v1","webhook-endpoints"],"query":[],"variable":[]},"body":{"mode":"raw","raw":"{\n  \"url\": \"https://example.com/hooks/bp\",\n  \"description\": \"PMS\",\n  \"events\": [\n    \"calendar.updated\",\n    \"reservation.cancelled\"\n  ]\n}","options":{"raw":{"language":"json"}}},"description":"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)."}},{"name":"PATCH /v1/webhook-endpoints/{id}","request":{"method":"PATCH","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/webhook-endpoints/:id","host":["{{baseUrl}}"],"path":["v1","webhook-endpoints",":id"],"query":[],"variable":[{"key":"id","value":"","description":"The endpoint id (UUID)."}]},"body":{"mode":"raw","raw":"{\n  \"active\": true\n}","options":{"raw":{"language":"json"}}},"description":"Set `active: true` to switch a disabled endpoint back on (the failure count is reset)."}},{"name":"DELETE /v1/webhook-endpoints/{id}","request":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/webhook-endpoints/:id","host":["{{baseUrl}}"],"path":["v1","webhook-endpoints",":id"],"query":[],"variable":[{"key":"id","value":"","description":"The endpoint id (UUID)."}]},"description":"Delete an endpoint"}},{"name":"POST /v1/webhook-endpoints/{id}/test","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/webhook-endpoints/:id/test","host":["{{baseUrl}}"],"path":["v1","webhook-endpoints",":id","test"],"query":[],"variable":[{"key":"id","value":"","description":"The endpoint id (UUID)."}]},"description":"Sends a `ping` event now, signed like the real ones, and returns what your server answered. Nothing is stored or retried."}},{"name":"POST /v1/webhook-endpoints/{id}/rotate-secret","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/webhook-endpoints/:id/rotate-secret","host":["{{baseUrl}}"],"path":["v1","webhook-endpoints",":id","rotate-secret"],"query":[],"variable":[{"key":"id","value":"","description":"The endpoint id (UUID)."}]},"description":"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."}},{"name":"GET /v1/webhook-deliveries","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/webhook-deliveries","host":["{{baseUrl}}"],"path":["v1","webhook-deliveries"],"query":[{"key":"endpointId","value":"","description":"Only this endpoint.","disabled":true},{"key":"status","value":"","description":"`PENDING`, `SUCCESS` or `FAILED`.","disabled":true},{"key":"limit","value":"","description":"At most 200.","disabled":true},{"key":"before","value":"","description":"Only deliveries created before this timestamp (for paging).","disabled":true}],"variable":[]},"description":"Delivery log"}},{"name":"POST /v1/webhook-deliveries/{id}/retry","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/webhook-deliveries/:id/retry","host":["{{baseUrl}}"],"path":["v1","webhook-deliveries",":id","retry"],"query":[],"variable":[{"key":"id","value":"","description":"The delivery id (UUID)."}]},"description":"Send a delivery again"}}]},{"name":"Sandbox","item":[{"name":"POST /v1/sandbox/reset","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":{"raw":"{{baseUrl}}/v1/sandbox/reset","host":["{{baseUrl}}"],"path":["v1","sandbox","reset"],"query":[],"variable":[]},"description":"Deletes your sandbox reservations and properties and creates the three sample properties again."}},{"name":"POST /v1/sandbox/simulate/owner-block","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/sandbox/simulate/owner-block","host":["{{baseUrl}}"],"path":["v1","sandbox","simulate","owner-block"],"query":[],"variable":[]},"body":{"mode":"raw","raw":"{\n  \"propertyId\": \"5b1c1f1e-0000-4000-8000-000000000001\",\n  \"from\": \"2027-02-01\",\n  \"to\": \"2027-02-05\"\n}","options":{"raw":{"language":"json"}}},"description":"Triggers `calendar.updated` with `source: \"owner\"`."}},{"name":"POST /v1/sandbox/simulate/owner-unblock","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/sandbox/simulate/owner-unblock","host":["{{baseUrl}}"],"path":["v1","sandbox","simulate","owner-unblock"],"query":[],"variable":[]},"body":{"mode":"raw","raw":"{\n  \"propertyId\": \"5b1c1f1e-0000-4000-8000-000000000001\",\n  \"from\": \"2027-02-01\",\n  \"to\": \"2027-02-05\"\n}","options":{"raw":{"language":"json"}}},"description":"The owner reopens dates"}},{"name":"POST /v1/sandbox/simulate/other-agency-booking","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/sandbox/simulate/other-agency-booking","host":["{{baseUrl}}"],"path":["v1","sandbox","simulate","other-agency-booking"],"query":[],"variable":[]},"body":{"mode":"raw","raw":"{\n  \"propertyId\": \"5b1c1f1e-0000-4000-8000-000000000001\",\n  \"from\": \"2027-02-10\",\n  \"to\": \"2027-02-12\"\n}","options":{"raw":{"language":"json"}}},"description":"Closes the dates and triggers `calendar.updated` with `source: \"agency\"`, exactly what you receive when a competitor books a shared property."}},{"name":"POST /v1/sandbox/simulate/price-change","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/sandbox/simulate/price-change","host":["{{baseUrl}}"],"path":["v1","sandbox","simulate","price-change"],"query":[],"variable":[]},"body":{"mode":"raw","raw":"{\n  \"propertyId\": \"5b1c1f1e-0000-4000-8000-000000000001\",\n  \"from\": \"2027-02-20\",\n  \"to\": \"2027-02-25\",\n  \"nightlyMinor\": 29900\n}","options":{"raw":{"language":"json"}}},"description":"Triggers `rates.updated`."}},{"name":"POST /v1/sandbox/simulate/property-update","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/sandbox/simulate/property-update","host":["{{baseUrl}}"],"path":["v1","sandbox","simulate","property-update"],"query":[],"variable":[]},"body":{"mode":"raw","raw":"{\n  \"propertyId\": \"5b1c1f1e-0000-4000-8000-000000000001\",\n  \"name\": \"Villa Mavi Deluxe\"\n}","options":{"raw":{"language":"json"}}},"description":"Triggers `property.updated`. `name` really renames the sandbox property."}},{"name":"POST /v1/sandbox/simulate/subscription-approve","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/sandbox/simulate/subscription-approve","host":["{{baseUrl}}"],"path":["v1","sandbox","simulate","subscription-approve"],"query":[],"variable":[]},"body":{"mode":"raw","raw":"{\n  \"propertyId\": \"5b1c1f1e-0000-4000-8000-000000000001\"\n}","options":{"raw":{"language":"json"}}},"description":"For a property you subscribed to that waits for approval. Triggers `subscription.approved`."}},{"name":"POST /v1/sandbox/simulate/subscription-revoke","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/sandbox/simulate/subscription-revoke","host":["{{baseUrl}}"],"path":["v1","sandbox","simulate","subscription-revoke"],"query":[],"variable":[]},"body":{"mode":"raw","raw":"{\n  \"propertyId\": \"5b1c1f1e-0000-4000-8000-000000000001\"\n}","options":{"raw":{"language":"json"}}},"description":"Triggers `subscription.revoked` and releases your holds."}}]}]}