{"openapi":"3.1.0","info":{"title":"Posadita direct booking","version":"1.0.0","description":"Holiday rentals booked directly with their hosts. Read a place, check which nights are free, price a stay, and prepare a checkout for the guest.\n\nTo find a place: the network lists the regions Posadita has opened, the places in each region priced for a stay, the communities and portfolios there, and one collection's own page. Posadita takes no commission and sells no placement: places appear because their host opted in, in an order that favours nobody.\n\nA checkout reserves nothing: it returns a link that the GUEST opens to confirm the stay, agree to the host's terms and pay. It expires after 24 hours. Do not try to complete a booking on a guest's behalf.\n\nAmounts are integer minor units (cents). Dates are YYYY-MM-DD in the place's own timezone.\n\nThe place operations and one collection's search are also offered as MCP tools at https://posadita.com/mcp (Streamable HTTP, no authentication)."},"servers":[{"url":"https://posadita.com"}],"paths":{"/api/public/v1/network/regions":{"get":{"operationId":"listRegions","summary":"The regions Posadita has opened, their towns counted, with the operator's pictures","responses":{"200":{"description":"Open regions only.","content":{"application/json":{"schema":{"type":"object","properties":{"regions":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"country":{"type":["string","null"]},"placeCount":{"type":"integer"},"cover":{"type":["object","null"],"description":"A picture the operator chose – never a host's photo of a flat. Print `credit` beside it when it is set.","properties":{"url":{"type":"string","format":"uri"},"thumbUrl":{"type":"string","format":"uri"},"credit":{"type":["string","null"]}}},"hero":{"type":["object","null"],"description":"A picture the operator chose – never a host's photo of a flat. Print `credit` beside it when it is set.","properties":{"url":{"type":"string","format":"uri"},"thumbUrl":{"type":"string","format":"uri"},"credit":{"type":["string","null"]}}},"towns":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"placeCount":{"type":"integer"},"photo":{"type":["object","null"],"description":"A picture the operator chose – never a host's photo of a flat. Print `credit` beside it when it is set.","properties":{"url":{"type":"string","format":"uri"},"thumbUrl":{"type":"string","format":"uri"},"credit":{"type":["string","null"]}}}}}}}}}}}}}}}}},"/api/public/v1/network/regions/{slug}":{"get":{"operationId":"getRegion","summary":"One open region","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"An open region's slug, from /api/public/v1/network/regions."}],"responses":{"200":{"description":"The region.","content":{"application/json":{"schema":{"type":"object","properties":{"region":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"country":{"type":["string","null"]},"placeCount":{"type":"integer"},"cover":{"type":["object","null"],"description":"A picture the operator chose – never a host's photo of a flat. Print `credit` beside it when it is set.","properties":{"url":{"type":"string","format":"uri"},"thumbUrl":{"type":"string","format":"uri"},"credit":{"type":["string","null"]}}},"hero":{"type":["object","null"],"description":"A picture the operator chose – never a host's photo of a flat. Print `credit` beside it when it is set.","properties":{"url":{"type":"string","format":"uri"},"thumbUrl":{"type":"string","format":"uri"},"credit":{"type":["string","null"]}}},"towns":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"placeCount":{"type":"integer"},"photo":{"type":["object","null"],"description":"A picture the operator chose – never a host's photo of a flat. Print `credit` beside it when it is set.","properties":{"url":{"type":"string","format":"uri"},"thumbUrl":{"type":"string","format":"uri"},"credit":{"type":["string","null"]}}}}}}}}}}}}},"404":{"description":"No OPEN region has this slug – regions are opened by hand, and a region that is not open has no places to list","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/public/v1/network/regions/{slug}/places":{"get":{"operationId":"listRegionPlaces","summary":"The places in an open region, across hosts – priced for a stay when dates are given","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"An open region's slug, from /api/public/v1/network/regions."},{"name":"place","in":"query","required":false,"schema":{"type":"string"},"description":"One town of the region, as `towns[].name`."},{"name":"from","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"Arrival (with to). With dates every place is priced for exactly that stay."},{"name":"to","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"Departure (with from)."},{"name":"guests","in":"query","required":false,"schema":{"type":"integer","minimum":1},"description":"Everyone staying (default 1)."},{"name":"sort","in":"query","required":false,"schema":{"enum":["recommended","price_asc","price_desc","size"]},"description":"Default recommended – a daily shuffle, so no host's place is always on top."},{"name":"type","in":"query","required":false,"schema":{"type":"string"},"description":"One property type."},{"name":"minBedrooms","in":"query","required":false,"schema":{"type":"integer","minimum":1},"description":"At least this many bedrooms."},{"name":"amenities","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated amenity ids; every one of them, not any."},{"name":"availableOnly","in":"query","required":false,"schema":{"type":"boolean"},"description":"With dates: leave out what cannot be booked for them."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":200},"description":"Page size (default 24)."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0},"description":"Where the page starts."}],"responses":{"200":{"description":"The places, one page of them.","content":{"application/json":{"schema":{"type":"object","properties":{"region":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"country":{"type":["string","null"]}}},"place":{"type":["string","null"]},"sites":{"type":"array","description":"Communities and portfolios with a place in this result.","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"kind":{"enum":["community","portfolio"]},"locality":{"type":["string","null"]},"regionSlug":{"type":["string","null"]},"url":{"type":"string","format":"uri","description":"The site itself."},"coverUrl":{"type":["string","null"]},"logoUrl":{"type":["string","null"]},"placeCount":{"type":"integer"},"placesHere":{"type":"integer"},"freeHere":{"type":["integer","null"]}}}},"search":{"type":["object","null"],"properties":{"from":{"type":"string","format":"date"},"to":{"type":"string","format":"date"},"guests":{"type":"integer"}}},"sort":{"type":"string"},"total":{"type":"integer"},"available":{"type":["integer","null"]},"offset":{"type":"integer"},"limit":{"type":"integer"},"places":{"type":"array","description":"Bookable places first (free, then taken), then listings, then places not online yet.","items":{"type":"object","description":"One place. Only `state: bookable` is priced and can be quoted or checked out; a `listing` is booked by contacting its host and NEVER carries a price.","properties":{"propertyId":{"type":"string"},"slug":{"type":["string","null"]},"name":{"type":"string"},"url":{"type":["string","null"],"description":"The place's own page – null only when it is not online yet."},"state":{"enum":["bookable","listing","unpublished"]},"propertyType":{"type":"string"},"headline":{"type":["string","null"]},"locality":{"type":["string","null"]},"photoUrl":{"type":["string","null"]},"maxGuests":{"type":["integer","null"]},"bedrooms":{"type":["integer","null"]},"beds":{"type":["integer","null"]},"sizeM2":{"type":["integer","null"]},"amenities":{"type":"array","items":{"type":"string"}},"available":{"type":["boolean","null"],"description":"For the dates asked; null without dates."},"currency":{"type":"string","description":"ISO 4217"},"totalCents":{"type":["integer","null"],"description":"The whole stay as get_quote prices it; null without dates, when it cannot be booked, and always on a listing."},"nights":{"type":["integer","null"]},"fromNightlyCents":{"type":["integer","null"],"description":"Lowest nightly rate; bookable places only."},"rejection":{"type":["object","null"],"properties":{"reason":{"type":"string"},"minStay":{"type":"integer"},"maxGuests":{"type":"integer"}}},"position":{"type":["object","null"],"description":"Rounded when the host keeps the address private (`pinPrecision: area`).","properties":{"lat":{"type":"number"},"lng":{"type":"number"}}},"pinPrecision":{"type":["string","null"],"enum":["exact","area",null]},"partOf":{"type":["object","null"],"description":"A community or portfolio the place is on.","properties":{"slug":{"type":"string"},"name":{"type":"string"},"kind":{"enum":["community","portfolio"]}}}}}}}}}}},"400":{"description":"from/to unusable","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"No OPEN region has this slug – regions are opened by hand, and a region that is not open has no places to list","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/public/v1/network/sites":{"get":{"operationId":"listSites","summary":"The communities and portfolios in the network","parameters":[{"name":"region","in":"query","required":false,"schema":{"type":"string"},"description":"Only those in this open region."}],"responses":{"200":{"description":"Sites with at least one place in the network.","content":{"application/json":{"schema":{"type":"object","properties":{"sites":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"kind":{"enum":["community","portfolio"]},"locality":{"type":["string","null"]},"regionSlug":{"type":["string","null"]},"url":{"type":"string","format":"uri","description":"The site itself."},"coverUrl":{"type":["string","null"]},"logoUrl":{"type":["string","null"]},"placeCount":{"type":"integer"}}}}}}}}}}}},"/api/public/v1/network/suggest":{"get":{"operationId":"suggest","summary":"Names that exist here – regions, towns, communities, portfolios – for a few typed letters","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","maxLength":60}}],"responses":{"200":{"description":"Up to ten, best first.","content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string"},"suggestions":{"type":"array","items":{"type":"object","description":"`kind: not_open` is a name we know of in a region not open yet – it has no places to list. Never a geocoder: a name nobody here uses is not suggested.","properties":{"kind":{"enum":["region","town","community","portfolio","not_open"]},"name":{"type":"string"},"slug":{"type":"string"},"regionSlug":{"type":["string","null"]},"regionName":{"type":"string"},"locality":{"type":["string","null"]},"placeCount":{"type":"integer"}},"required":["kind","name"]}}}}}}}}}},"/api/public/v1/c/{slug}":{"get":{"operationId":"getCollection","summary":"One collection – a community or a host's portfolio: its own page and its places","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"The collection's slug, from posadita.com/s/{slug} or a site's `slug`."},{"name":"locale","in":"query","required":false,"schema":{"type":"string","enum":["en","cs","sk","de","it","fr","pt","es"]}},{"name":"from","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"Arrival (with to). With dates every place is priced for exactly that stay."},{"name":"to","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"Departure (with from)."},{"name":"guests","in":"query","required":false,"schema":{"type":"integer","minimum":1},"description":"Everyone staying (default 1)."},{"name":"sort","in":"query","required":false,"schema":{"enum":["recommended","price_asc","price_desc","size"]},"description":"Default recommended – a daily shuffle, so no host's place is always on top."},{"name":"type","in":"query","required":false,"schema":{"type":"string"},"description":"One property type."},{"name":"minBedrooms","in":"query","required":false,"schema":{"type":"integer","minimum":1},"description":"At least this many bedrooms."},{"name":"amenities","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated amenity ids; every one of them, not any."},{"name":"availableOnly","in":"query","required":false,"schema":{"type":"boolean"},"description":"With dates: leave out what cannot be booked for them."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":200},"description":"Page size (default 24)."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0},"description":"Where the page starts."}],"responses":{"200":{"description":"The collection and one page of its places.","content":{"application/json":{"schema":{"type":"object","properties":{"collection":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"kind":{"type":"string"},"locality":{"type":["string","null"]},"url":{"type":["string","null"]},"isDemo":{"type":"boolean","description":"Posadita's sample site – nothing on it can be booked for real."},"locale":{"type":"string","description":"The language the texts are in."},"headline":{"type":["string","null"]},"about":{"type":["string","null"]},"photos":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"thumbUrl":{"type":"string"},"caption":{"type":["string","null"]}}}},"logoUrl":{"type":["string","null"]},"highlights":{"type":"array","items":{"type":"object","properties":{"icon":{"type":"string"},"title":{"type":"string"},"body":{"type":"string"}}}},"blocks":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string"},"title":{"type":["string","null"]},"body":{"type":["string","null"]},"photoUrl":{"type":["string","null"]}}}},"faq":{"type":"array","items":{"type":"object","properties":{"q":{"type":"string"},"a":{"type":"string"}}}}}},"search":{"type":["object","null"],"properties":{"from":{"type":"string","format":"date"},"to":{"type":"string","format":"date"},"guests":{"type":"integer"}}},"sort":{"type":"string"},"total":{"type":"integer"},"available":{"type":["integer","null"]},"offset":{"type":"integer"},"limit":{"type":"integer"},"places":{"type":"array","description":"Bookable places first (free, then taken), then listings, then places not online yet.","items":{"type":"object","description":"One place. Only `state: bookable` is priced and can be quoted or checked out; a `listing` is booked by contacting its host and NEVER carries a price.","properties":{"propertyId":{"type":"string"},"slug":{"type":["string","null"]},"name":{"type":"string"},"url":{"type":["string","null"],"description":"The place's own page – null only when it is not online yet."},"state":{"enum":["bookable","listing","unpublished"]},"propertyType":{"type":"string"},"headline":{"type":["string","null"]},"locality":{"type":["string","null"]},"photoUrl":{"type":["string","null"]},"maxGuests":{"type":["integer","null"]},"bedrooms":{"type":["integer","null"]},"beds":{"type":["integer","null"]},"sizeM2":{"type":["integer","null"]},"amenities":{"type":"array","items":{"type":"string"}},"available":{"type":["boolean","null"],"description":"For the dates asked; null without dates."},"currency":{"type":"string","description":"ISO 4217"},"totalCents":{"type":["integer","null"],"description":"The whole stay as get_quote prices it; null without dates, when it cannot be booked, and always on a listing."},"nights":{"type":["integer","null"]},"fromNightlyCents":{"type":["integer","null"],"description":"Lowest nightly rate; bookable places only."},"rejection":{"type":["object","null"],"properties":{"reason":{"type":"string"},"minStay":{"type":"integer"},"maxGuests":{"type":"integer"}}},"position":{"type":["object","null"],"description":"Rounded when the host keeps the address private (`pinPrecision: area`).","properties":{"lat":{"type":"number"},"lng":{"type":"number"}}},"pinPrecision":{"type":["string","null"],"enum":["exact","area",null]},"partOf":{"type":["object","null"],"description":"A community or portfolio the place is on.","properties":{"slug":{"type":"string"},"name":{"type":"string"},"kind":{"enum":["community","portfolio"]}}}}}}}}}}},"400":{"description":"from/to unusable","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"No published collection with this slug","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/public/v1/p/{slug}":{"get":{"operationId":"getProperty","summary":"One place: facts, location, amenities, policies, and a from-price when it takes bookings","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"The place's slug, from its page URL (/p/{slug}) or from /llms.txt."},{"name":"locale","in":"query","required":false,"schema":{"type":"string","enum":["en","cs","sk","de","it","fr","pt","es"]}}],"responses":{"200":{"description":"The place. `bookable: false` means it is shown but booked by contacting the host."},"404":{"description":"No published place with this slug","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/public/v1/p/{slug}/availability":{"get":{"operationId":"getAvailability","summary":"Which nights are free between two dates (at most 62 days per call)","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"The place's slug, from its page URL (/p/{slug}) or from /llms.txt."},{"name":"from","in":"query","required":true,"schema":{"type":"string","format":"date"},"description":"First night"},{"name":"to","in":"query","required":true,"schema":{"type":"string","format":"date"},"description":"Last night"}],"responses":{"200":{"description":"One entry per night. `priceCents` is null when the place does not take bookings online.","content":{"application/json":{"schema":{"type":"object","properties":{"days":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","format":"date"},"available":{"type":"boolean"},"minStay":{"type":"integer"},"checkinAllowed":{"type":"boolean"},"checkoutAllowed":{"type":"boolean"},"priceCents":{"type":["integer","null"]}}}}}}}}},"400":{"description":"Bad or too long a range","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/public/v1/p/{slug}/quote":{"get":{"operationId":"getQuote","summary":"The price of one stay, or why it cannot be booked","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"The place's slug, from its page URL (/p/{slug}) or from /llms.txt."},{"name":"checkIn","in":"query","required":true,"schema":{"type":"string","format":"date"},"description":"Arrival"},{"name":"checkOut","in":"query","required":true,"schema":{"type":"string","format":"date"},"description":"Departure"},{"name":"adults","in":"query","required":true,"schema":{"type":"integer","minimum":1}},{"name":"children","in":"query","required":false,"schema":{"type":"integer","minimum":0}}],"responses":{"200":{"description":"A quote, or a rejection with `ok: false`","content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"ok":{"const":true},"checkIn":{"type":"string","format":"date"},"checkOut":{"type":"string","format":"date"},"adults":{"type":"integer"},"children":{"type":"integer"},"nights":{"type":"integer"},"currency":{"type":"string","description":"ISO 4217"},"totalCents":{"type":"integer","description":"Everything the guest pays for the stay, in minor units."},"breakdown":{"type":"object","properties":{"nightsCents":{"type":"integer"},"lengthDiscountCents":{"type":"integer"},"extraGuestFeeCents":{"type":"integer"},"cleaningFeeCents":{"type":"integer"},"promoDiscountCents":{"type":"integer"}}}},"required":["ok","checkIn","checkOut","nights","currency","totalCents"]},{"type":"object","description":"The stay cannot be booked as asked. `reason` says why: unavailable (with the taken `dates`), min_stay (with `minStay`), no_checkin_day, no_checkout_day, max_guests (with `maxGuests`), no_rates, invalid_range.","properties":{"ok":{"const":false},"reason":{"type":"string"},"dates":{"type":"array","items":{"type":"string","format":"date"}},"minStay":{"type":"integer"},"maxGuests":{"type":"integer"}},"required":["ok","reason"]}]}}}},"404":{"description":"The place does not take bookings online","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/public/v1/p/{slug}/checkouts":{"post":{"operationId":"createCheckout","summary":"Prepare a stay for the guest to confirm and pay — returns a link, reserves nothing","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"The place's slug, from its page URL (/p/{slug}) or from /llms.txt."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["checkIn","checkOut","adults"],"properties":{"checkIn":{"type":"string","format":"date"},"checkOut":{"type":"string","format":"date"},"adults":{"type":"integer","minimum":1},"children":{"type":"integer","minimum":0},"guest":{"type":"object","description":"Optional. Pre-fills the form; the guest can change it.","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"email":{"type":"string"},"phone":{"type":"string"}}},"message":{"type":"string","description":"Optional note to the host, pre-filled."},"locale":{"type":"string"},"agent":{"type":"string","description":"Who is asking, e.g. the assistant's name. Shown to nobody but the host's statistics."}}}}}},"responses":{"201":{"description":"Send `checkoutUrl` to the guest.","content":{"application/json":{"schema":{"type":"object","properties":{"checkoutUrl":{"type":"string","format":"uri"},"expiresAt":{"type":"string","format":"date-time"},"quote":{"type":"object","properties":{"ok":{"const":true},"checkIn":{"type":"string","format":"date"},"checkOut":{"type":"string","format":"date"},"adults":{"type":"integer"},"children":{"type":"integer"},"nights":{"type":"integer"},"currency":{"type":"string","description":"ISO 4217"},"totalCents":{"type":"integer","description":"Everything the guest pays for the stay, in minor units."},"breakdown":{"type":"object","properties":{"nightsCents":{"type":"integer"},"lengthDiscountCents":{"type":"integer"},"extraGuestFeeCents":{"type":"integer"},"cleaningFeeCents":{"type":"integer"},"promoDiscountCents":{"type":"integer"}}}},"required":["ok","checkIn","checkOut","nights","currency","totalCents"]},"next":{"type":"string"}}}}}},"404":{"description":"The place does not take bookings online","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"422":{"description":"The stay cannot be booked as asked","content":{"application/json":{"schema":{"type":"object","description":"The stay cannot be booked as asked. `reason` says why: unavailable (with the taken `dates`), min_stay (with `minStay`), no_checkin_day, no_checkout_day, max_guests (with `maxGuests`), no_rates, invalid_range.","properties":{"ok":{"const":false},"reason":{"type":"string"},"dates":{"type":"array","items":{"type":"string","format":"date"}},"minStay":{"type":"integer"},"maxGuests":{"type":"integer"}},"required":["ok","reason"]}}}},"429":{"description":"Too many checkouts from this address","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}}}}