{"openapi":"3.1.0","info":{"title":"Bear Property Management: The Black Hills Collection: properties, rates, quotes, events and activities","version":"1.0.0","description":"Public, read-only data for the vacation rentals on Bear Property Management: The Black Hills Collection, and for the events and activities near them, made for AI assistants. No API key is needed. Use getQuote for the price of a specific stay: a nightly rate is not a stay price, because minimum stays, length-of-stay discounts and fees apply, and taxes and other fees may be added at checkout. getNightlyRates keeps the next 90 days of nightly rates and getCalendar gives two months. Nightly data exists up to three years (1095 days) ahead, but nothing beyond 90 days is stored: for later dates call refreshRates with the dates you need and it returns them as they are now. Responses are cached for a few minutes to hours. Please keep to about one request per second; the limit is 200 requests per minute per IP address, after which the API answers 429. All prices are in US dollars (the currency field says so). Every figure that comes from the cached rate summary is named indicative (indicativeNightlyRate, indicativeSummary, indicativeRates): it can be up to 6 hours old and is not a price to quote. Call getQuote for the price you tell a traveler: it is live, and it is the only call that returns a booking link carrying the dates. To make the figures you are about to rely on current, call refreshRates for the dates you care about; if the traveler's dates are flexible, refresh the whole range you are comparing."},"servers":[{"url":"https://sites.bookingbench.com"}],"paths":{"/api/agent/v1/sites/owner-5afdfd06/properties":{"get":{"operationId":"listProperties","summary":"Every property on this site, with an indicative starting nightly rate","description":"Facts for each property and an indicativeNightlyRate object, a guide read from a cache that can be up to 6 hours old (see notice and staleAfter). indicativeNightlyRate.status says what is known: ok (from, typical and to are the lowest, median and highest bookable nightly rate over the next windowDays days), booked_out (nothing is bookable in that window) or unknown (the rate could not be read just now; try again). complete is false when any rate is unknown. This list carries three photos per property; getProperty carries all of them, plus reviews. To give a traveler a price, call getQuote (confirmWith has the URL).","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyList"}}}},"429":{"description":"More than 200 requests per minute from this IP address. Wait retryAfter seconds.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"retryAfter":{"type":"string"}}}}}},"503":{"description":"The site has no property system connected."}}}},"/api/agent/v1/sites/owner-5afdfd06/properties/{listingId}":{"get":{"operationId":"getProperty","summary":"One property: description, amenities, house rules, all photos, rating and recent reviews","parameters":[{"name":"listingId","in":"path","required":true,"description":"The property id (the id field of a property).","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyDetail"}}}},"404":{"description":"Unknown site, or a property that is not part of this site."},"429":{"description":"More than 200 requests per minute from this IP address. Wait retryAfter seconds.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"retryAfter":{"type":"string"}}}}}}}}},"/api/agent/v1/sites/owner-5afdfd06/properties/{listingId}/quote":{"get":{"operationId":"getQuote","summary":"Price and availability for a specific stay","description":"This is the price to tell a traveler: it is read live from the property system, not from a cache. totalPrice is the nightly subtotal plus the cleaning fee. Taxes and any other fees are added at checkout. available is false when the property cannot be booked for those dates (booked, or the stay breaks a minimum-stay rule). Stays are limited to 90 nights and must start today or later; checkOut can be as far ahead as nightly data exists (1095 days, about three years).","parameters":[{"name":"listingId","in":"path","required":true,"description":"The property id (the id field of a property).","schema":{"type":"integer"}},{"name":"checkIn","in":"query","required":true,"description":"Arrival date, YYYY-MM-DD.","schema":{"type":"string","format":"date"}},{"name":"checkOut","in":"query","required":true,"description":"Departure date, YYYY-MM-DD. Must be after checkIn.","schema":{"type":"string","format":"date"}},{"name":"guests","in":"query","required":false,"description":"Number of guests, 1 to 50. Defaults to 1.","schema":{"type":"integer","minimum":1,"maximum":50,"default":1}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote"}}}},"400":{"description":"A date is missing, not a real date, in the past, out of order, or the stay is too long.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown site, or a property that is not part of this site."},"429":{"description":"More than 200 requests per minute from this IP address. Wait retryAfter seconds.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"retryAfter":{"type":"string"}}}}}},"501":{"description":"This site's property system cannot produce quotes."}}}},"/api/agent/v1/sites/owner-5afdfd06/properties/{listingId}/calendar":{"get":{"operationId":"getCalendar","summary":"Availability and nightly rate per date, for two months","description":"Two consecutive months starting at the given month, read live. A night nobody published a rate for has ratePublished false and no rate. For the next 90 days in one call use getNightlyRates; for later dates use refreshRates.","parameters":[{"name":"listingId","in":"path","required":true,"description":"The property id (the id field of a property).","schema":{"type":"integer"}},{"name":"year","in":"query","required":false,"description":"Four-digit year. Defaults to the current year.","schema":{"type":"integer"}},{"name":"month","in":"query","required":false,"description":"Month 1-12. Defaults to the current month.","schema":{"type":"integer","minimum":1,"maximum":12}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"currency":{"type":"string","enum":["USD"]},"days":{"type":"array","items":{"$ref":"#/components/schemas/CalendarDay"}}}}}}},"400":{"description":"year or month is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown site, or a property that is not part of this site."},"429":{"description":"More than 200 requests per minute from this IP address. Wait retryAfter seconds.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"retryAfter":{"type":"string"}}}}}}}}},"/api/agent/v1/sites/owner-5afdfd06/properties/{listingId}/rates":{"get":{"operationId":"getNightlyRates","summary":"Indicative nightly rate and availability for the next 90 days, plus a summary","description":"days lists one entry per date starting today: the next 90, which is all that is kept (ask for fewer with the days parameter). For dates later than that, call refreshRates with the dates you need; nightly rates exist up to 1095 days (three years) ahead. through is the last date listed. A night the manager has not priced yet has ratePublished false and no rate (the property system fills it with a default that is not a published price): do not quote it, and ratesPublishedThrough is the last night that does have one. indicativeSummary covers the bookable, published nights (lowest, typical, highest). These figures come from a cache that can be up to 6 hours old: use them to FIND dates, then call getQuote for the exact stay before telling anyone a price. The first request for a unit can take a moment; it is cached afterwards.","parameters":[{"name":"listingId","in":"path","required":true,"description":"The property id (the id field of a property).","schema":{"type":"integer"}},{"name":"days","in":"query","required":false,"description":"How many dates to list, starting today. 1 to 90. Defaults to 90. For later dates use refreshRates.","schema":{"type":"integer","minimum":1,"maximum":90,"default":90}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NightlyRates"}}}},"400":{"description":"days is not a whole number from 1 to 90. For later dates call refreshRates.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown site, or a property that is not part of this site."},"429":{"description":"More than 200 requests per minute from this IP address. Wait retryAfter seconds.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"retryAfter":{"type":"string"}}}}}},"503":{"description":"Rates could not be read from the property system right now; try again later."}}}},"/api/agent/v1/sites/owner-5afdfd06/properties/{listingId}/refresh":{"post":{"operationId":"refreshRates","summary":"Re-read the nightly rates for specific dates from the property system, now","description":"Re-reads the property system now for the nights from checkIn up to (not including) checkOut and updates the saved rates for those dates, so the figures you are about to rely on are current. It changes nothing in the property system and stores nothing you send: the two dates only say what to re-read. Use it when the asOf of the figures you want to rely on is older than you are comfortable with. This is also how to get rates for dates later than 90 days: nothing beyond 90 days is stored, so ask for the dates you need (checkOut no later than 1095 days from today) and they come back as they are now. A night the manager has not priced yet has ratePublished false and no rate (the property system fills it with a default that is not a published price): do not quote it, ask getQuote. If the traveler's dates are flexible, widen it: refresh the whole range you are searching (up to 1095 nights, one call per property) before you compare options, then call getQuote for the stay you settle on. A repeat for dates that were re-read in the last 5 minutes returns that fresh read without a new one (status recent; nextRefreshAfter says when a new read is allowed). Refreshing makes browsing figures current at that moment. It does not replace getQuote, which is still the price to give. Limited to 10 calls a minute per caller.","parameters":[{"name":"listingId","in":"path","required":true,"description":"The property id (the id field of a property).","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshRequest"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshResult"}}}},"400":{"description":"checkIn or checkOut is missing, not a real date, in the past, out of order, or beyond three years ahead.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown site, or a property that is not part of this site."},"429":{"description":"More than 200 requests per minute from this IP address. Wait retryAfter seconds.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"retryAfter":{"type":"string"}}}}}},"503":{"description":"The property system could not be read just now. Nothing was changed; try again shortly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/agent/v1/sites/owner-5afdfd06/events":{"get":{"operationId":"listEvents","summary":"Upcoming events near the property, filtered and paged","description":"Events still to come or still running (an event that began earlier and has not ended is included), earliest first. Dates are plain YYYY-MM-DD and times are local to the event. Filter by category (music, festival, sports, arts, food, family, wellness, outdoors, community), by a date window (from, to) and by words (q). categories lists how many events each category has under the OTHER filters, so you can see what narrowing would leave. Lists carry a short summary; getEvent has the whole description. When nextCursor is not null, pass it back as cursor for the next page. total counts every matching event across pages.","parameters":[{"name":"category","in":"query","required":false,"description":"One of music, festival, sports, arts, food, family, wellness, outdoors, community.","schema":{"enum":["music","festival","sports","arts","food","family","wellness","outdoors","community"]}},{"name":"from","in":"query","required":false,"description":"Events still on at or after this date, YYYY-MM-DD. Defaults to today; an earlier date is treated as today.","schema":{"type":"string","format":"date"}},{"name":"to","in":"query","required":false,"description":"Events that start on or before this date, YYYY-MM-DD, at most 1095 days ahead. No limit by default.","schema":{"type":"string","format":"date"}},{"name":"q","in":"query","required":false,"description":"Words to look for (up to 100 characters), matched against the name and place (events also search the description; activities also the type).","schema":{"type":"string","maxLength":100}},{"name":"limit","in":"query","required":false,"description":"Items per page, 1 to 100. Defaults to 25.","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"cursor","in":"query","required":false,"description":"The nextCursor from the previous page, unchanged. Leave out for the first page.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventList"}}}},"400":{"description":"A parameter is not valid; error says which and how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown site, or a property that is not part of this site."},"429":{"description":"More than 200 requests per minute from this IP address. Wait retryAfter seconds.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"retryAfter":{"type":"string"}}}}}}}}},"/api/agent/v1/sites/owner-5afdfd06/events/{eventId}":{"get":{"operationId":"getEvent","summary":"One event with its whole description","parameters":[{"name":"eventId","in":"path","required":true,"description":"The id field of an event.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}}},"404":{"description":"Unknown site, an unknown event, or an event that is already over."},"429":{"description":"More than 200 requests per minute from this IP address. Wait retryAfter seconds.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"retryAfter":{"type":"string"}}}}}}}}},"/api/agent/v1/sites/owner-5afdfd06/activities":{"get":{"operationId":"listActivities","summary":"Things to do near the property, filtered and paged","description":"Local activities and attractions, alphabetical by name. category matches the activity type exactly (case does not matter); categories lists each type with how many activities match the words in q, so you can see what narrowing would leave. When nextCursor is not null, pass it back as cursor for the next page.","parameters":[{"name":"category","in":"query","required":false,"description":"An activity type exactly as listed in categories.","schema":{"type":"string","maxLength":128}},{"name":"q","in":"query","required":false,"description":"Words to look for (up to 100 characters), matched against the name and place (events also search the description; activities also the type).","schema":{"type":"string","maxLength":100}},{"name":"limit","in":"query","required":false,"description":"Items per page, 1 to 100. Defaults to 25.","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"cursor","in":"query","required":false,"description":"The nextCursor from the previous page, unchanged. Leave out for the first page.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityList"}}}},"400":{"description":"A parameter is not valid; error says which and how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown site, or a property that is not part of this site."},"429":{"description":"More than 200 requests per minute from this IP address. Wait retryAfter seconds.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"retryAfter":{"type":"string"}}}}}}}}},"/api/agent/v1/sites/owner-5afdfd06/activities/{activityId}":{"get":{"operationId":"getActivity","summary":"One activity","parameters":[{"name":"activityId","in":"path","required":true,"description":"The id field of an activity.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Activity"}}}},"404":{"description":"Unknown site or activity."},"429":{"description":"More than 200 requests per minute from this IP address. Wait retryAfter seconds.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"retryAfter":{"type":"string"}}}}}}}}},"/api/agent/v1/sites/owner-5afdfd06/rate-summary":{"get":{"operationId":"getRateSummary","summary":"Indicative lowest, typical and highest nightly rate for every property, next 90 days","description":"indicativeRates is keyed by property id; a property with status booked_out has nothing bookable in the window, and one missing from indicativeRates could not be read this time. These are cached guides, not prices to quote. listProperties carries the same figures with the full property facts.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateSummaryResponse"}}}},"429":{"description":"More than 200 requests per minute from this IP address. Wait retryAfter seconds.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"retryAfter":{"type":"string"}}}}}}}}}},"components":{"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}}},"IndicativeRate":{"description":"What is known about the nightly rate, as a guide read from a cache that can be up to 6 hours old. It is not a price to quote: call getQuote for exact dates. A missing price is never a number: check status.","oneOf":[{"type":"object","required":["status","currency","from","typical","to","nights","windowDays"],"properties":{"status":{"const":"ok"},"currency":{"type":"string","enum":["USD"]},"from":{"type":"integer","description":"Lowest nightly rate among bookable nights."},"typical":{"type":"integer","description":"Median nightly rate among bookable nights."},"to":{"type":"integer","description":"Highest nightly rate among bookable nights."},"nights":{"type":"integer","description":"How many bookable, priced nights the figures are based on."},"windowDays":{"type":"integer","description":"Days looked at (90)."}}},{"type":"object","required":["status","windowDays"],"properties":{"status":{"const":"booked_out"},"windowDays":{"type":"integer"}},"description":"Nothing is bookable in the window."},{"type":"object","required":["status"],"properties":{"status":{"const":"unknown"}},"description":"The rate could not be read just now. Try again; do not assume a price."}]},"Property":{"type":"object","required":["id","name","bookingUrl","indicativeNightlyRate"],"properties":{"id":{"type":"integer"},"name":{"type":"string"},"description":{"type":"string"},"city":{"type":"string"},"state":{"type":"string"},"propertyType":{"type":"string","description":"For example entire_home or private_room."},"bedrooms":{"type":"number"},"bathrooms":{"type":"number"},"maxGuests":{"type":"integer"},"petsAllowed":{"type":"boolean"},"adaAccessible":{"type":"boolean"},"instantBookable":{"type":"boolean"},"weeklyDiscount":{"type":"boolean"},"minNights":{"type":"integer","description":"Minimum stay in nights."},"cancellationPolicy":{"type":"string"},"amenities":{"type":"array","items":{"type":"string"}},"images":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"caption":{"type":["string","null"]}}}},"latitude":{"type":"number","description":"Approximate on purpose: offset by up to about 0.3 mile to protect the property's exact location."},"longitude":{"type":"number","description":"Approximate on purpose, as latitude."},"checkInHourFrom":{"type":"integer","description":"Hour of day, 0-23, property local time."},"checkInHourUntil":{"type":"integer"},"checkOutHour":{"type":"integer"},"houseRules":{"type":"string"},"rating":{"type":"object","description":"Average guest rating. Absent when there is none.","properties":{"value":{"type":"number"},"outOf":{"const":5}}},"bookingUrl":{"type":"string","format":"uri","description":"Where to book this property directly, without dates. For a link that carries the dates, call getQuote."},"indicativeNightlyRate":{"$ref":"#/components/schemas/IndicativeRate"}}},"PropertyList":{"type":"object","properties":{"currency":{"type":"string","enum":["USD"]},"asOf":{"type":["string","null"],"format":"date-time","description":"When the OLDEST nightly rate here was read from the property system (the figures are cached). Null when none could be read."},"staleAfter":{"type":["string","null"],"format":"date-time","description":"When these figures will be re-read from the property system by the next request (6 hours after asOf)."},"notice":{"type":"string","description":"Reminder that these figures are indicative guides, not a price to quote."},"confirmWith":{"type":"string","description":"The quote call that confirms a price for exact dates, as a URL template to fill in. The quote is live."},"complete":{"type":"boolean","description":"False when some properties' rates could not be read this time (their indicativeNightlyRate.status is unknown)."},"windowDays":{"type":"integer","description":"Days each indicativeNightlyRate covers (90)."},"properties":{"type":"array","items":{"$ref":"#/components/schemas/Property"}}}},"PropertyDetail":{"allOf":[{"$ref":"#/components/schemas/Property"},{"type":"object","properties":{"asOf":{"type":["string","null"],"format":"date-time","description":"When the indicative nightly rate was read from the property system."},"staleAfter":{"type":["string","null"],"format":"date-time","description":"When these figures will be re-read from the property system by the next request (6 hours after asOf)."},"notice":{"type":"string","description":"Reminder that these figures are indicative guides, not a price to quote."},"confirmWith":{"type":"string","description":"The quote call that confirms a price for exact dates, as a URL template to fill in. The quote is live."},"reviewCount":{"type":"integer","description":"Total published reviews for this property (reviews lists only the newest)."},"reviews":{"type":"array","items":{"type":"object","properties":{"author":{"type":"string"},"rating":{"type":"number","description":"Out of 5."},"date":{"type":["string","null"],"format":"date"},"text":{"type":"string"}}}}}}]},"Quote":{"type":"object","required":["available"],"properties":{"available":{"type":"boolean"},"nights":{"type":"integer"},"currency":{"type":"string","enum":["USD"],"description":"Currency of every amount here."},"nightlyRate":{"type":"number","description":"Average nightly rate over the stay, USD."},"cleaningFee":{"type":["number","null"],"description":"One-time cleaning fee, USD."},"totalPrice":{"type":"number","description":"Nightly subtotal plus cleaning fee, USD. Taxes and other fees are added at checkout."},"taxesIncluded":{"type":"boolean","enum":[false],"description":"Always false: taxes and any other fees the property system adds are not in totalPrice."},"bookingUrl":{"type":"string","format":"uri","description":"Direct booking link for these dates."},"cancellationPolicy":{"type":["string","null"]}},"example":{"available":true,"nights":2,"currency":"USD","nightlyRate":95,"cleaningFee":49,"totalPrice":239,"taxesIncluded":false,"bookingUrl":"https://book.example.com/checkout/1?start=2026-11-10&end=2026-11-12&numberOfGuests=2","cancellationPolicy":"moderate"}},"CalendarDay":{"type":"object","properties":{"date":{"type":"string","format":"date"},"available":{"type":"boolean","description":"True when the night can be booked."},"ratePublished":{"type":"boolean","description":"False for a night nobody published a rate for (the property system fills it with a default): it has no rate, so do not quote it; ask getQuote."},"indicativeNightlyRate":{"type":["number","null"],"description":"Nightly rate in USD, a guide and not a price to quote. Null when the night has no published rate."}}},"IndicativeSummary":{"type":["object","null"],"properties":{"from":{"type":"integer","description":"Lowest nightly rate among bookable nights, USD."},"typical":{"type":"integer","description":"Median nightly rate among bookable nights, USD."},"to":{"type":"integer","description":"Highest nightly rate among bookable nights, USD."},"nights":{"type":"integer","description":"How many bookable, priced nights the figures are based on."},"name":{"type":"string","description":"The property name (only in the rate-summary response)."},"status":{"const":"booked_out","description":"Only on a property with nothing bookable in the window, which has no figures."}}},"NightlyRates":{"type":"object","description":"Indicative figures from a cache that can be up to 6 hours old. Use them to find dates, then call getQuote.","properties":{"asOf":{"type":"string","format":"date-time","description":"When the rates were read from the property system."},"staleAfter":{"type":["string","null"],"format":"date-time","description":"When these figures will be re-read from the property system by the next request (6 hours after asOf)."},"notice":{"type":"string","description":"Reminder that these figures are indicative guides, not a price to quote."},"confirmWith":{"type":"string","description":"The quote call that confirms a price for exact dates, as a URL template to fill in. The quote is live."},"currency":{"type":"string","enum":["USD"]},"windowDays":{"type":"integer","description":"Days the summary covers (90)."},"calendarDays":{"type":"integer","description":"Days listed, which is how many entries days has (90 unless the days parameter asks for fewer)."},"through":{"type":["string","null"],"format":"date","description":"The last date listed in days."},"ratesPublishedThrough":{"type":["string","null"],"format":"date","description":"The last night that has a published rate. Nights after it carry the default fill of the property system, not a rate the manager set, so they carry no rate. Null when none does."},"maxDays":{"type":"integer","description":"The most days this call lists (90). For later dates, call refreshRates."},"indicativeSummary":{"$ref":"#/components/schemas/IndicativeSummary"},"days":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","format":"date"},"available":{"type":"boolean"},"ratePublished":{"type":"boolean","description":"False for a night nobody published a rate for: it has no rate, so do not quote it; ask getQuote."},"indicativeNightlyRate":{"type":["number","null"],"description":"Indicative nightly rate in USD, a guide and not a price to quote. Null when the night is not priced."}}}}}},"RefreshRequest":{"type":"object","required":["checkIn","checkOut"],"properties":{"checkIn":{"type":"string","format":"date","description":"First night to re-read, YYYY-MM-DD, today or later."},"checkOut":{"type":"string","format":"date","description":"Departure date, YYYY-MM-DD: nights up to but not including this date are re-read. At most three years (1095 days) from today."}},"example":{"checkIn":"2026-11-18","checkOut":"2026-11-20"}},"RefreshResult":{"type":"object","properties":{"status":{"enum":["refreshed","recent"],"description":"refreshed: read from the property system by this call. recent: the same dates were re-read in the last 5 minutes, so that fresh read is returned."},"asOf":{"type":"string","format":"date-time","description":"When these figures were read from the property system."},"nextRefreshAfter":{"type":"string","format":"date-time","description":"When a new read of these dates is allowed."},"notice":{"type":"string","description":"Reminder that these figures are indicative, not a price to quote."},"confirmWith":{"type":"string","description":"The quote call for exactly these dates, ready to use (fill in guests)."},"currency":{"type":"string","enum":["USD"]},"window":{"type":"object","properties":{"checkIn":{"type":"string","format":"date"},"checkOut":{"type":"string","format":"date"},"nights":{"type":"integer"}}},"indicativeWindowSummary":{"$ref":"#/components/schemas/IndicativeSummary","description":"Lowest, typical and highest nightly rate over the nights refreshed. Null when none is bookable."},"days":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","format":"date"},"available":{"type":"boolean"},"ratePublished":{"type":"boolean","description":"False for a night nobody published a rate for: it has no rate, so do not quote it; ask getQuote."},"indicativeNightlyRate":{"type":["number","null"]}}}}}},"Admission":{"type":["object","null"],"description":"Null when the price is not known (not the same as free).","properties":{"amount":{"type":"number","description":"US dollars; 0 means free."},"text":{"type":"string","description":"For example Free or $20."}}},"Event":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"startDate":{"type":"string","format":"date"},"endDate":{"type":["string","null"],"format":"date","description":"The last day of a multi-day event; null for a one-day event."},"startTime":{"type":"string","description":"HH:MM, only when the organizer set one."},"endTime":{"type":"string","description":"HH:MM, only when the organizer set one."},"location":{"type":"string"},"summary":{"type":"string","description":"The description cut to about 300 characters."},"description":{"type":"string","description":"The whole description. Only on getEvent, never in a list."},"category":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"}}},"admission":{"$ref":"#/components/schemas/Admission"},"ticketUrl":{"type":["string","null"]},"contactInfo":{"type":["string","null"]},"imageUrl":{"type":["string","null"]}}},"EventList":{"type":"object","properties":{"site":{"type":"string"},"asOf":{"type":"string","format":"date-time"},"from":{"type":"string","format":"date","description":"The first day of the window actually used."},"to":{"type":["string","null"],"format":"date"},"total":{"type":"integer","description":"Events matching every filter, across all pages."},"count":{"type":"integer","description":"Events on this page."},"categories":{"type":"array","description":"Events per category under the other filters (not the category filter).","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}}}},"events":{"type":"array","items":{"$ref":"#/components/schemas/Event"}},"nextCursor":{"type":["string","null"],"description":"Pass as cursor for the next page; null on the last page."}}},"Activity":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"category":{"type":"string","description":"The activity type (free text set by the owner)."},"location":{"type":"string"},"website":{"type":["string","null"]},"admission":{"$ref":"#/components/schemas/Admission"},"contactInfo":{"type":["string","null"]},"imageUrl":{"type":["string","null"]}}},"ActivityList":{"type":"object","properties":{"site":{"type":"string"},"total":{"type":"integer","description":"Activities matching every filter, across all pages."},"count":{"type":"integer"},"categories":{"type":"array","description":"Activity types with how many match the words in q (not the category filter).","items":{"type":"object","properties":{"name":{"type":"string"},"count":{"type":"integer"}}}},"activities":{"type":"array","items":{"$ref":"#/components/schemas/Activity"}},"nextCursor":{"type":["string","null"]}}},"RateSummaryResponse":{"type":"object","properties":{"asOf":{"type":["string","null"],"format":"date-time","description":"When the OLDEST figure here was read from the property system (the figures are cached)."},"staleAfter":{"type":["string","null"],"format":"date-time","description":"When these figures will be re-read from the property system by the next request (6 hours after asOf)."},"notice":{"type":"string","description":"Reminder that these figures are indicative guides, not a price to quote."},"confirmWith":{"type":"string","description":"The quote call that confirms a price for exact dates, as a URL template to fill in. The quote is live."},"currency":{"type":"string","enum":["USD"]},"windowDays":{"type":"integer","description":"Days each summary covers (90)."},"complete":{"type":"boolean","description":"False when some properties could not be read this time, so they are missing from indicativeRates."},"indicativeRates":{"type":"object","description":"Keyed by property id. Indicative guides, not prices to quote.","additionalProperties":{"$ref":"#/components/schemas/IndicativeSummary"}}}}}}}