{"openapi":"3.1.0","info":{"title":"CesiSync Agency API","version":"2026-11-01","description":"Open calendar and price network for villa owners and agencies. Authenticate with `Authorization: Bearer bp_live_…` or `bp_test_…` (sandbox)."},"servers":[{"url":"https://api.cesisync.com"}],"tags":[{"name":"Account","description":"Who the key belongs to."},{"name":"Catalog","description":"The shared vocabulary: amenity keys, property and room types, places, currencies. Needs no subscription."},{"name":"Properties","description":"Discover properties and read their listing. Calendar and prices need a subscription."},{"name":"Subscriptions","description":"Ask for, and end, access to a property."},{"name":"Calendar and rates","description":"Availability, prices and quotes of subscribed properties."},{"name":"Holds and reservations","description":"Hold nights, book them, change or cancel. Booking is instant: the dates close for every subscriber."},{"name":"Events","description":"Everything that happened to your properties, in order. The same events your webhooks carry."},{"name":"Webhooks","description":"Manage endpoints and look at deliveries."},{"name":"Sandbox","description":"Test-key only: reset the sample data and simulate what owners and other agencies do."}],"paths":{"/v1/me":{"get":{"tags":["Account"],"summary":"The key you are calling with","description":"","operationId":"get__v1_me","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"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}}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/amenity-categories":{"get":{"tags":["Catalog"],"summary":"Amenity categories","description":"Requires scope `catalog:read`.","operationId":"get__v1_amenity_categories","parameters":[{"name":"locale","in":"query","required":false,"description":"Language of names: `tr` or `en`.","schema":{"type":"string"},"example":"en"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"data":[{"key":"pool","name":"Pool"}]}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/amenities":{"get":{"tags":["Catalog"],"summary":"All amenity keys","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`).\n\nRequires scope `catalog:read`.","operationId":"get__v1_amenities","parameters":[{"name":"locale","in":"query","required":false,"description":"Language of names: `tr` or `en`.","schema":{"type":"string"},"example":"en"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"data":[{"key":"pool.private","name":"Private pool","kind":"BOOL","category":"pool","deprecated":false}]}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/property-types":{"get":{"tags":["Catalog"],"summary":"Property types","description":"Requires scope `catalog:read`.","operationId":"get__v1_property_types","parameters":[{"name":"locale","in":"query","required":false,"description":"Language of names: `tr` or `en`.","schema":{"type":"string"},"example":"en"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"data":[{"key":"villa","name":"Villa"}]}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/room-types":{"get":{"tags":["Catalog"],"summary":"Room types","description":"Requires scope `catalog:read`.","operationId":"get__v1_room_types","parameters":[{"name":"locale","in":"query","required":false,"description":"Language of names: `tr` or `en`.","schema":{"type":"string"},"example":"en"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"data":[{"key":"bedroom","name":"Bedroom"}]}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/bed-types":{"get":{"tags":["Catalog"],"summary":"Bed types","description":"Keys used in `rooms[].beds[].type`; `sleeps` is how many people one bed takes.\n\nRequires scope `catalog:read`.","operationId":"get__v1_bed_types","parameters":[{"name":"locale","in":"query","required":false,"description":"Language of names: `tr` or `en`.","schema":{"type":"string"},"example":"en"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"data":[{"key":"double","name":"Double bed","sleeps":2,"deprecated":false}]}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/legal-forms":{"get":{"tags":["Catalog"],"summary":"Company legal forms of a country","description":"What a company can be in that country (`LTD`, `AS` in Turkey; `LLC`, `C_CORP` in the US). `individual` marks sole traders.\n\nRequires scope `catalog:read`.","operationId":"get__v1_legal_forms","parameters":[{"name":"country","in":"query","required":true,"description":"ISO 3166-1 alpha-2 code.","schema":{"type":"string"},"example":"TR"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"data":[{"key":"LTD","name":"Limited Şirket (Ltd. Şti.)"}]}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/geo/countries":{"get":{"tags":["Catalog"],"summary":"Countries","description":"Requires scope `catalog:read`.","operationId":"get__v1_geo_countries","parameters":[{"name":"locale","in":"query","required":false,"description":"Language of names: `tr` or `en`.","schema":{"type":"string"},"example":"en"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"data":[{"id":"…","iso":"TR","dialCode":"90","currency":"TRY","name":"Turkey"}]}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/geo/nodes":{"get":{"tags":["Catalog"],"summary":"Children of a place","description":"Walk the tree: country → region → city → district → neighbourhood. Pass a node id as `geoId` to `GET /v1/properties` to filter by it.\n\nRequires scope `catalog:read`.","operationId":"get__v1_geo_nodes","parameters":[{"name":"parent","in":"query","required":true,"description":"Id of the parent node.","schema":{"type":"string"}},{"name":"locale","in":"query","required":false,"description":"Language of names: `tr` or `en`.","schema":{"type":"string"},"example":"en"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"data":[{"id":"…","type":"CITY","name":"Kaş"}]}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/geo/search":{"get":{"tags":["Catalog"],"summary":"Search places by name","description":"Requires scope `catalog:read`.","operationId":"get__v1_geo_search","parameters":[{"name":"q","in":"query","required":true,"description":"At least two characters.","schema":{"type":"string"},"example":"Kalkan"},{"name":"locale","in":"query","required":false,"description":"Language of names: `tr` or `en`.","schema":{"type":"string"},"example":"en"},{"name":"country","in":"query","required":false,"description":"Limit to a country node id.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"data":[{"id":"…","type":"SUBURB","name":"Kalkan","path":"Kaş, Antalya, Turkey"}]}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/currencies":{"get":{"tags":["Catalog"],"summary":"Currencies","description":"Requires scope `catalog:read`.","operationId":"get__v1_currencies","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"data":[{"code":"EUR","name":"Euro","symbol":"€","minorUnit":2}]}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/locales":{"get":{"tags":["Catalog"],"summary":"Languages","description":"Requires scope `catalog:read`.","operationId":"get__v1_locales","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"data":[{"code":"en"},{"code":"tr"}]}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/properties":{"get":{"tags":["Properties"],"summary":"Query properties","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.\n\nRequires scope `properties:read`.","operationId":"get__v1_properties","parameters":[{"name":"q","in":"query","required":false,"description":"Name, code or address contains.","schema":{"type":"string"}},{"name":"geoId","in":"query","required":false,"description":"A place id from `/v1/geo/*`; matches that place and everything below it.","schema":{"type":"string"}},{"name":"types","in":"query","required":false,"description":"Comma-separated property type keys.","schema":{"type":"string"},"example":"villa,bungalow"},{"name":"guests","in":"query","required":false,"description":"Sleeps at least this many.","schema":{"type":"string"}},{"name":"bedrooms","in":"query","required":false,"description":"At least this many bedrooms.","schema":{"type":"string"}},{"name":"bathrooms","in":"query","required":false,"description":"At least this many bathrooms.","schema":{"type":"string"}},{"name":"amenities","in":"query","required":false,"description":"Comma-separated amenity keys; the property must have all of them.","schema":{"type":"string"},"example":"pool.private,view.sea"},{"name":"subscribed","in":"query","required":false,"description":"`true` only properties you subscribe to, `false` only those you do not.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Page size, at most 60 (default 25).","schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"description":"The `nextCursor` of the previous page.","schema":{"type":"string"}},{"name":"locale","in":"query","required":false,"description":"Language of names: `tr` or `en`.","schema":{"type":"string"},"example":"en"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"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"}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/properties/{id}":{"get":{"tags":["Properties"],"summary":"One property","description":"Requires scope `properties:read`.","operationId":"get__v1_properties_id","parameters":[{"name":"id","in":"path","required":true,"description":"The property id (UUID).","schema":{"type":"string"}},{"name":"locale","in":"query","required":false,"description":"Language of names: `tr` or `en`.","schema":{"type":"string"},"example":"en"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"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}}}},"404":{"description":"property_not_found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/properties/{id}/media":{"get":{"tags":["Properties"],"summary":"Photos","description":"Each photo comes in `thumb`, `medium` and `large` WebP. Fetch the URLs with the same Bearer key.\n\nRequires scope `properties:read`.","operationId":"get__v1_properties_id_media","parameters":[{"name":"id","in":"path","required":true,"description":"The property id (UUID).","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"data":[{"id":"…","roomId":null,"caption":{},"width":2400,"height":1600,"urls":{"thumb":"https://api.cesisync.com/v1/media/…/thumb"}}]}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/media/{imageId}/{size}":{"get":{"tags":["Properties"],"summary":"A photo file","description":"Requires scope `properties:read`.","operationId":"get__v1_media_imageId_size","parameters":[{"name":"imageId","in":"path","required":true,"description":"Photo id.","schema":{"type":"string"}},{"name":"size","in":"path","required":true,"description":"`thumb`, `medium` or `large`.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"image/webp":{"schema":{"type":"string"},"example":"(binary WebP)"}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/properties/{id}/export":{"get":{"tags":["Properties"],"summary":"Download a property","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.\n\nRequires scope `properties:read`.","operationId":"get__v1_properties_id_export","parameters":[{"name":"id","in":"path","required":true,"description":"The property id (UUID).","schema":{"type":"string"}},{"name":"format","in":"query","required":false,"description":"`json` (default), `zip`, `calendar.csv` or `rates.csv`.","schema":{"type":"string"},"example":"zip"},{"name":"locale","in":"query","required":false,"description":"Language of names: `tr` or `en`.","schema":{"type":"string"},"example":"en"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"string"},"example":"(file)"}}},"400":{"description":"format_invalid","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"not_subscribed","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/properties/{id}/subscription":{"post":{"tags":["Subscriptions"],"summary":"Subscribe","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.\n\nRequires scope `subscriptions:write`.","operationId":"post__v1_properties_id_subscription","parameters":[{"name":"id","in":"path","required":true,"description":"The property id (UUID).","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"message":"We run 40 villas in Kaş."}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"id":"7a0e0000-0000-4000-8000-000000000002","propertyId":"5b1c1f1e-0000-4000-8000-000000000001","status":"ACTIVE","commissionBps":1000,"requestedAt":"2027-01-05T09:00:00.000Z"}}}},"404":{"description":"property_not_found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"subscription_exists","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]},"delete":{"tags":["Subscriptions"],"summary":"Unsubscribe","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.\n\nRequires scope `subscriptions:write`.","operationId":"delete__v1_properties_id_subscription","parameters":[{"name":"id","in":"path","required":true,"description":"The property id (UUID).","schema":{"type":"string"}}],"responses":{"204":{"description":"No content"},"400":{"description":"subscription_not_found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"subscription_has_bookings","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/subscriptions":{"get":{"tags":["Subscriptions"],"summary":"Your subscriptions","description":"Requires scope `properties:read`.","operationId":"get__v1_subscriptions","parameters":[{"name":"status","in":"query","required":false,"description":"`REQUESTED`, `ACTIVE`, `REJECTED` or `ENDED`.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"data":[{"id":"7a0e0000-0000-4000-8000-000000000002","propertyId":"5b1c1f1e-0000-4000-8000-000000000001","status":"ACTIVE","commissionBps":1000,"requestedAt":"2027-01-05T09:00:00.000Z"}]}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/subscriptions/{id}":{"get":{"tags":["Subscriptions"],"summary":"One subscription","description":"Requires scope `properties:read`.","operationId":"get__v1_subscriptions_id","parameters":[{"name":"id","in":"path","required":true,"description":"The subscription id (UUID).","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"id":"7a0e0000-0000-4000-8000-000000000002","propertyId":"5b1c1f1e-0000-4000-8000-000000000001","status":"ACTIVE","commissionBps":1000,"requestedAt":"2027-01-05T09:00:00.000Z"}}}},"400":{"description":"subscription_not_found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/properties/{id}/calendar":{"get":{"tags":["Calendar and rates"],"summary":"Calendar","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.\n\nRequires scope `calendar:read`.","operationId":"get__v1_properties_id_calendar","parameters":[{"name":"id","in":"path","required":true,"description":"The property id (UUID).","schema":{"type":"string"}},{"name":"from","in":"query","required":true,"description":"First day, `YYYY-MM-DD`.","schema":{"type":"string"},"example":"2027-07-01"},{"name":"to","in":"query","required":true,"description":"Last day, exclusive (a stay ends on the day it departs).","schema":{"type":"string"},"example":"2027-07-15"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"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}]}}}},"403":{"description":"not_subscribed","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/properties/{id}/calendar.ics":{"get":{"tags":["Calendar and rates"],"summary":"Calendar as iCal","description":"Closed nights as an RFC 5545 feed for software that only speaks iCal. Names and details are never included.\n\nRequires scope `calendar:read`.","operationId":"get__v1_properties_id_calendar_ics","parameters":[{"name":"id","in":"path","required":true,"description":"The property id (UUID).","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"text/calendar":{"schema":{"type":"string"},"example":"BEGIN:VCALENDAR…"}}},"403":{"description":"not_subscribed","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/properties/{id}/rates":{"get":{"tags":["Calendar and rates"],"summary":"Rates","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`.\n\nRequires scope `rates:read`.","operationId":"get__v1_properties_id_rates","parameters":[{"name":"id","in":"path","required":true,"description":"The property id (UUID).","schema":{"type":"string"}},{"name":"from","in":"query","required":true,"description":"First day, `YYYY-MM-DD`.","schema":{"type":"string"},"example":"2027-07-01"},{"name":"to","in":"query","required":true,"description":"Last day, exclusive (a stay ends on the day it departs).","schema":{"type":"string"},"example":"2027-07-15"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"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"}]}}}},"403":{"description":"not_subscribed","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/properties/{id}/availability":{"get":{"tags":["Calendar and rates"],"summary":"Availability and price for dates","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`.\n\nRequires scope `rates:read`.","operationId":"get__v1_properties_id_availability","parameters":[{"name":"id","in":"path","required":true,"description":"The property id (UUID).","schema":{"type":"string"}},{"name":"checkIn","in":"query","required":true,"description":"Arrival date.","schema":{"type":"string"},"example":"2027-07-10"},{"name":"checkOut","in":"query","required":true,"description":"Departure date.","schema":{"type":"string"},"example":"2027-07-14"},{"name":"guests","in":"query","required":false,"description":"Number of guests (default 1).","schema":{"type":"integer"},"example":4},{"name":"extras","in":"query","required":false,"description":"Paid amenities to quote, comma separated: `key` for a property-wide amenity, `key@roomId` for one in a room.","schema":{"type":"string"},"example":"pool.heated"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"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}]}}}}},"400":{"description":"dates_invalid","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"not_subscribed","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/availability/search":{"post":{"tags":["Calendar and rates"],"summary":"Search availability across properties","description":"Checks the same stay against up to 50 subscribed properties at once (all of yours when `propertyIds` is left out).\n\nRequires scope `rates:read`.","operationId":"post__v1_availability_search","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"checkIn":"2027-07-10","checkOut":"2027-07-14","guests":4,"propertyIds":["5b1c1f1e-0000-4000-8000-000000000001"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"data":[{"propertyId":"5b1c1f1e-0000-4000-8000-000000000001","available":true,"bookable":true,"quote":{"totalMinor":105000}}]}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/holds":{"post":{"tags":["Holds and reservations"],"summary":"Place a hold","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.\n\nRequires scope `reservations:write`.","operationId":"post__v1_holds","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"propertyId":"5b1c1f1e-0000-4000-8000-000000000001","checkIn":"2027-07-10","checkOut":"2027-07-14","guests":4,"holdHours":24,"holdRef":"TALEP-1042"}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"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"}}}},"400":{"description":"extra_unknown","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"not_subscribed","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"queue_priority","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"stay_rules_violated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/holds/{id}":{"get":{"tags":["Holds and reservations"],"summary":"One hold","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.\n\nRequires scope `reservations:read`.","operationId":"get__v1_holds_id","parameters":[{"name":"id","in":"path","required":true,"description":"The hold id (UUID).","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"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"}}}},"400":{"description":"reservation_not_found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]},"delete":{"tags":["Holds and reservations"],"summary":"Release a hold","description":"Requires scope `reservations:write`.","operationId":"delete__v1_holds_id","parameters":[{"name":"id","in":"path","required":true,"description":"The hold id (UUID).","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"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}}}},"400":{"description":"not_a_hold","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/holds/{id}/confirm":{"post":{"tags":["Holds and reservations"],"summary":"Confirm a hold","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).\n\nRequires scope `reservations:write`.","operationId":"post__v1_holds_id_confirm","parameters":[{"name":"id","in":"path","required":true,"description":"The hold id (UUID).","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"externalRef":"REZ-2027-0042"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"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"}}}},"400":{"description":"not_a_hold","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"hold_expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/holds/{id}/extend":{"post":{"tags":["Holds and reservations"],"summary":"Ask for more time","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.\n\nRequires scope `reservations:write`.","operationId":"post__v1_holds_id_extend","parameters":[{"name":"id","in":"path","required":true,"description":"The hold id (UUID).","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"minutes":15}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"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"}}}},"400":{"description":"not_a_hold","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"hold_expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/waitlist":{"get":{"tags":["Holds and reservations"],"summary":"Your queue entries","description":"Requires scope `reservations:read`.","operationId":"get__v1_waitlist","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"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}]}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]},"post":{"tags":["Holds and reservations"],"summary":"Queue for held nights","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.\n\nRequires scope `reservations:write`.","operationId":"post__v1_waitlist","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"propertyId":"5b1c1f1e-0000-4000-8000-000000000001","checkIn":"2027-07-10","checkOut":"2027-07-14","guests":4,"holdRef":"TALEP-1043"}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"id":"…","status":"WAITING","ahead":0}}}},"400":{"description":"hold_ref_required","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"not_subscribed","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"waitlist_full","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/waitlist/{id}":{"delete":{"tags":["Holds and reservations"],"summary":"Leave the queue","description":"Requires scope `reservations:write`.","operationId":"delete__v1_waitlist_id","parameters":[{"name":"id","in":"path","required":true,"description":"The entry id (UUID).","schema":{"type":"string"}}],"responses":{"204":{"description":"No content"},"404":{"description":"waitlist_entry_not_found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/reservations":{"post":{"tags":["Holds and reservations"],"summary":"Send a reservation","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.\n\nRequires scope `reservations:write`.","operationId":"post__v1_reservations","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"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"}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"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}}}},"400":{"description":"extra_unknown","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"not_subscribed","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"queue_priority","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"stay_rules_violated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]},"get":{"tags":["Holds and reservations"],"summary":"List reservations","description":"Requires scope `reservations:read`.","operationId":"get__v1_reservations","parameters":[{"name":"status","in":"query","required":false,"description":"`HOLD`, `CONFIRMED`, `CANCELLED` or `EXPIRED`.","schema":{"type":"string"}},{"name":"propertyId","in":"query","required":false,"description":"Only this property.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"At most 500.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"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}]}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/reservations/{id}":{"get":{"tags":["Holds and reservations"],"summary":"One reservation","description":"Requires scope `reservations:read`.","operationId":"get__v1_reservations_id","parameters":[{"name":"id","in":"path","required":true,"description":"The reservation id (UUID).","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"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}}}},"400":{"description":"reservation_not_found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]},"patch":{"tags":["Holds and reservations"],"summary":"Change a reservation","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.\n\nRequires scope `reservations:write`.","operationId":"patch__v1_reservations_id","parameters":[{"name":"id","in":"path","required":true,"description":"The reservation id (UUID).","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"checkOut":"2027-07-15","guests":5}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"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}}}},"400":{"description":"extra_unknown","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"reservation_not_active","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"stay_rules_violated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/reservations/{id}/cancel":{"post":{"tags":["Holds and reservations"],"summary":"Send a cancellation","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\"`.\n\nRequires scope `reservations:write`.","operationId":"post__v1_reservations_id_cancel","parameters":[{"name":"id","in":"path","required":true,"description":"The reservation id (UUID).","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"reason":"Guest cancelled"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"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"}}}},"409":{"description":"reservation_not_active","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/events":{"get":{"tags":["Events"],"summary":"Event log","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.\n\nRequires scope `events:read`.","operationId":"get__v1_events","parameters":[{"name":"after","in":"query","required":false,"description":"Return events after this id (`evt_123` or `123`).","schema":{"type":"string"}},{"name":"propertyId","in":"query","required":false,"description":"Only this property.","schema":{"type":"string"}},{"name":"type","in":"query","required":false,"description":"Only this event type.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"At most 500 (default 100).","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"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}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/events/{id}":{"get":{"tags":["Events"],"summary":"One event","description":"Requires scope `events:read`.","operationId":"get__v1_events_id","parameters":[{"name":"id","in":"path","required":true,"description":"Event id, `evt_…`.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"id":"evt_981","type":"calendar.updated"}}}},"400":{"description":"event_not_found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/webhook-endpoints":{"get":{"tags":["Webhooks"],"summary":"List endpoints","description":"Requires scope `webhooks:manage`.","operationId":"get__v1_webhook_endpoints","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"data":[{"id":"…","url":"https://example.com/hooks/bp","events":null,"livemode":true,"active":true,"consecutiveFailures":0}]}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]},"post":{"tags":["Webhooks"],"summary":"Add an endpoint","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).\n\nRequires scope `webhooks:manage`.","operationId":"post__v1_webhook_endpoints","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"url":"https://example.com/hooks/bp","description":"PMS","events":["calendar.updated","reservation.cancelled"]}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"id":"…","url":"https://example.com/hooks/bp","secret":"whsec_MfKQ9r8GKYqrTwjUPD8ILPZIo2LaLaSw"}}}},"400":{"description":"too_many_endpoints","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/webhook-endpoints/{id}":{"patch":{"tags":["Webhooks"],"summary":"Change an endpoint","description":"Set `active: true` to switch a disabled endpoint back on (the failure count is reset).\n\nRequires scope `webhooks:manage`.","operationId":"patch__v1_webhook_endpoints_id","parameters":[{"name":"id","in":"path","required":true,"description":"The endpoint id (UUID).","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"active":true}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"id":"…","active":true}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]},"delete":{"tags":["Webhooks"],"summary":"Delete an endpoint","description":"Requires scope `webhooks:manage`.","operationId":"delete__v1_webhook_endpoints_id","parameters":[{"name":"id","in":"path","required":true,"description":"The endpoint id (UUID).","schema":{"type":"string"}}],"responses":{"204":{"description":"No content"},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/webhook-endpoints/{id}/test":{"post":{"tags":["Webhooks"],"summary":"Send a test event","description":"Sends a `ping` event now, signed like the real ones, and returns what your server answered. Nothing is stored or retried.\n\nRequires scope `webhooks:manage`.","operationId":"post__v1_webhook_endpoints_id_test","parameters":[{"name":"id","in":"path","required":true,"description":"The endpoint id (UUID).","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"ok":true,"status":200,"ms":84,"response":"ok"}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/webhook-endpoints/{id}/rotate-secret":{"post":{"tags":["Webhooks"],"summary":"Rotate the secret","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.\n\nRequires scope `webhooks:manage`.","operationId":"post__v1_webhook_endpoints_id_rotate_secret","parameters":[{"name":"id","in":"path","required":true,"description":"The endpoint id (UUID).","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"secret":"whsec_…"}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/webhook-deliveries":{"get":{"tags":["Webhooks"],"summary":"Delivery log","description":"Requires scope `webhooks:manage`.","operationId":"get__v1_webhook_deliveries","parameters":[{"name":"endpointId","in":"query","required":false,"description":"Only this endpoint.","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"`PENDING`, `SUCCESS` or `FAILED`.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"At most 200.","schema":{"type":"string"}},{"name":"before","in":"query","required":false,"description":"Only deliveries created before this timestamp (for paging).","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"data":[{"id":"…","endpointId":"…","status":"SUCCESS","attempts":1,"lastStatusCode":200,"eventId":"evt_981","eventType":"calendar.updated","propertyId":"5b1c1f1e-0000-4000-8000-000000000001","propertySeq":14}]}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/webhook-deliveries/{id}/retry":{"post":{"tags":["Webhooks"],"summary":"Send a delivery again","description":"Requires scope `webhooks:manage`.","operationId":"post__v1_webhook_deliveries_id_retry","parameters":[{"name":"id","in":"path","required":true,"description":"The delivery id (UUID).","schema":{"type":"string"}}],"responses":{"202":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"status":"queued"}}}},"400":{"description":"delivery_not_found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/sandbox/reset":{"post":{"tags":["Sandbox"],"summary":"Reset the sandbox","description":"Deletes your sandbox reservations and properties and creates the three sample properties again.\n\nTest keys only.","operationId":"post__v1_sandbox_reset","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"status":"reset"}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/sandbox/simulate/owner-block":{"post":{"tags":["Sandbox"],"summary":"The owner closes dates","description":"Triggers `calendar.updated` with `source: \"owner\"`.\n\nTest keys only.","operationId":"post__v1_sandbox_simulate_owner_block","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"propertyId":"5b1c1f1e-0000-4000-8000-000000000001","from":"2027-02-01","to":"2027-02-05"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"closed":[{"start":"2027-02-01","end":"2027-02-05"}]}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/sandbox/simulate/owner-unblock":{"post":{"tags":["Sandbox"],"summary":"The owner reopens dates","description":"Test keys only.","operationId":"post__v1_sandbox_simulate_owner_unblock","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"propertyId":"5b1c1f1e-0000-4000-8000-000000000001","from":"2027-02-01","to":"2027-02-05"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"opened":[],"stillClosed":[]}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/sandbox/simulate/other-agency-booking":{"post":{"tags":["Sandbox"],"summary":"Another agency books","description":"Closes the dates and triggers `calendar.updated` with `source: \"agency\"`, exactly what you receive when a competitor books a shared property.\n\nTest keys only.","operationId":"post__v1_sandbox_simulate_other_agency_booking","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"propertyId":"5b1c1f1e-0000-4000-8000-000000000001","from":"2027-02-10","to":"2027-02-12"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"ok":true}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/sandbox/simulate/price-change":{"post":{"tags":["Sandbox"],"summary":"The owner changes the price","description":"Triggers `rates.updated`.\n\nTest keys only.","operationId":"post__v1_sandbox_simulate_price_change","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"propertyId":"5b1c1f1e-0000-4000-8000-000000000001","from":"2027-02-20","to":"2027-02-25","nightlyMinor":29900}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"ok":true}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/sandbox/simulate/property-update":{"post":{"tags":["Sandbox"],"summary":"The owner edits the listing","description":"Triggers `property.updated`. `name` really renames the sandbox property.\n\nTest keys only.","operationId":"post__v1_sandbox_simulate_property_update","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"propertyId":"5b1c1f1e-0000-4000-8000-000000000001","name":"Villa Mavi Deluxe"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"ok":true}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/sandbox/simulate/subscription-approve":{"post":{"tags":["Sandbox"],"summary":"The owner approves your request","description":"For a property you subscribed to that waits for approval. Triggers `subscription.approved`.\n\nTest keys only.","operationId":"post__v1_sandbox_simulate_subscription_approve","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"propertyId":"5b1c1f1e-0000-4000-8000-000000000001"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"ok":true}}}},"400":{"description":"no_pending_request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}},"/v1/sandbox/simulate/subscription-revoke":{"post":{"tags":["Sandbox"],"summary":"The owner ends your subscription","description":"Triggers `subscription.revoked` and releases your holds.\n\nTest keys only.","operationId":"post__v1_sandbox_simulate_subscription_revoke","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"propertyId":"5b1c1f1e-0000-4000-8000-000000000001"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"example":{"ok":true}}}},"400":{"description":"subscription_not_active","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearer":[]}]}}},"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"API key from the Developer page of your agency panel."}},"schemas":{"Problem":{"type":"object","description":"RFC 9457 problem details with a stable machine `code`.","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"}},"required":["status","code"]}}},"x-webhooks":["property.updated","property.media.updated","property.paused","property.resumed","property.removed","calendar.updated","rates.updated","subscription.approved","subscription.rejected","subscription.revoked","reservation.confirmed","reservation.modified","reservation.cancelled","hold.created","hold.confirmed","hold.expired","hold.extended","waitlist.available"],"x-event-types":["property.updated","property.media.updated","property.paused","property.resumed","property.removed","calendar.updated","rates.updated","subscription.approved","subscription.rejected","subscription.revoked","reservation.confirmed","reservation.modified","reservation.cancelled","hold.created","hold.expired","hold.confirmed","hold.extended","waitlist.available"]}