{"openapi":"3.1.0","info":{"title":"StayHive public property API","version":"1.0.0","description":"Read-only catalogue, property, availability, and date-specific quote endpoints for published StayHive properties. Agents may quote a stay and construct a booking link; the guest completes payment in the browser via Stripe. Hosts remain the merchant. There is no agent-to-agent payment."},"servers":[{"url":"https://stayhive.com.au"}],"paths":{"/api/public/properties":{"get":{"operationId":"listPublicProperties","summary":"List published, agent-readable properties","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":500}},{"name":"updated_since","in":"query","schema":{"type":"string","format":"date-time"}}],"responses":{"200":{"description":"Catalogue","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicPropertiesList"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicQuoteRateLimit"}}}}}}},"/api/public/properties/{slug}":{"get":{"operationId":"getPublicProperty","summary":"One published, agent-readable property","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"example":"rental-unit-in-melbourne-melbourne-vic-29f4f5"}],"responses":{"200":{"description":"Property detail","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicPropertySlug"},"examples":{"demo":{"value":{"slug":"rental-unit-in-melbourne-melbourne-vic-29f4f5","booking_url":"https://stayhive.com.au/stay/rental-unit-in-melbourne-melbourne-vic-29f4f5","quote_url":"https://stayhive.com.au/api/public/quote/rental-unit-in-melbourne-melbourne-vic-29f4f5","booking_url_template":"https://stayhive.com.au/stay/rental-unit-in-melbourne-melbourne-vic-29f4f5{?check_in,check_out,guests,quote}","agent_bookable":true,"agent_readable":true,"deposit_terms":null,"currency_note":"Rates are AUD on nightly_rate_aud"}}}}}},"404":{"description":"Unknown, unpublished, or not agent-readable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"},"example":{"error":"Property not found"}}}}}}},"/api/public/availability/{slug}":{"get":{"operationId":"getPublicAvailability","summary":"Booked date ranges and minimum stay","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"example":"rental-unit-in-melbourne-melbourne-vic-29f4f5"}],"responses":{"200":{"description":"Blocked ranges (half-open: `to` is checkout and bookable)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicAvailability"},"example":{"slug":"rental-unit-in-melbourne-melbourne-vic-29f4f5","blocked":[{"from":"2026-10-01","to":"2026-10-04"}],"min_nights":2,"booking_url":"https://stayhive.com.au/stay/rental-unit-in-melbourne-melbourne-vic-29f4f5","currency":"AUD","booking_url_template":"https://stayhive.com.au/stay/rental-unit-in-melbourne-melbourne-vic-29f4f5{?check_in,check_out,guests,quote}","quote_url":"https://stayhive.com.au/api/public/quote/rental-unit-in-melbourne-melbourne-vic-29f4f5"}}}},"404":{"description":"Unknown, unpublished, or not agent-readable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"},"example":{"error":"Property not found"}}}}}}},"/api/public/quote/{slug}":{"get":{"operationId":"getPublicQuote","summary":"Exact quote for dates and guests (no hold)","description":"Returns a 15-minute signed quote token when bookable. Availability is point-in-time. If checkout later returns 409, call quote again with new dates — do not retry the same stay. Fresh means StayHive trusted current database availability (a recent sync, or no iCal feeds to refresh).","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"example":"rental-unit-in-melbourne-melbourne-vic-29f4f5"},{"name":"check_in","in":"query","required":true,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},{"name":"check_out","in":"query","required":true,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},{"name":"guests","in":"query","required":true,"schema":{"type":"integer","minimum":1}},{"name":"currency","in":"query","required":false,"schema":{"type":"string"},"description":"Only AUD is supported."}],"responses":{"200":{"description":"Bookable or unbookable quote","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicQuoteSuccess"},"examples":{"bookable":{"summary":"Illustrative bookable quote — not live inventory","description":"Illustrative response — do not use this price as current availability or pricing.","value":{"slug":"rental-unit-in-melbourne-melbourne-vic-29f4f5","bookable":true,"currency":"AUD","total_cents":90000,"quote_id":"<signed-token>","booking_url":"https://stayhive.com.au/stay/rental-unit-in-melbourne-melbourne-vic-29f4f5?check_in=2026-10-12&check_out=2026-10-15&guests=2&quote=<signed-token>","deposit_terms":null,"availability_fresh":true}},"unbookable":{"summary":"Host turned off AI quoting","value":{"slug":"rental-unit-in-melbourne-melbourne-vic-29f4f5","bookable":false,"reason_code":"PROPERTY_NOT_AGENT_BOOKABLE","reason":"The host has turned off AI assistant quoting for this property.","remedy":"Guests can still book on the stay page in a browser.","booking_url":"https://stayhive.com.au/stay/rental-unit-in-melbourne-melbourne-vic-29f4f5?check_in=2026-10-12&check_out=2026-10-15&guests=2","deposit_terms":null,"currency":"AUD","availability_fresh":null}}}}}},"400":{"description":"Invalid query","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicQuoteError"}}}},"404":{"description":"Unknown, unpublished, or not agent-readable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"},"example":{"error":"Property not found"}}}},"429":{"description":"Rate limited (20/IP/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicQuoteRateLimit"}}}},"500":{"description":"Unexpected failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicQuoteError"},"example":{"error":"Something went wrong"}}}},"503":{"description":"Signing secret or admin client unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicQuoteError"},"example":{"error":"Something went wrong"}}}}}}}},"components":{"schemas":{"PublicPropertiesList":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"version":{"type":"string"},"count":{"type":"number"},"updated_since":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"properties":{"type":"array","items":{"type":"object","properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"slug":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"location":{"type":"object","properties":{"suburb":{"anyOf":[{"type":"string"},{"type":"null"}]},"state":{"anyOf":[{"type":"string"},{"type":"null"}]},"country":{"type":"string","minLength":2,"maxLength":2},"country_name":{"type":"string"}},"required":["suburb","state","country","country_name"],"additionalProperties":false},"property_type":{"type":"string"},"bedrooms":{"anyOf":[{"type":"number"},{"type":"null"}]},"bathrooms":{"anyOf":[{"type":"number"},{"type":"null"}]},"sleeps":{"anyOf":[{"type":"number"},{"type":"null"}]},"nightly_rate_aud":{"anyOf":[{"type":"number"},{"type":"null"}]},"nightly_rate_from_aud":{"anyOf":[{"type":"number"},{"type":"null"}]},"nightly_rate_base_aud":{"anyOf":[{"type":"number"},{"type":"null"}]},"min_nights":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}]},"cleaning_fee_aud":{"anyOf":[{"type":"number"},{"type":"null"}]},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"amenities":{"type":"array","items":{"type":"string"}},"booking_url":{"type":"string","format":"uri"},"schema_type":{"type":"string","const":"VacationRental"},"last_updated":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"has_house_rules":{"type":"boolean"},"has_cancellation_policy":{"type":"boolean"},"agent_bookable":{"type":"boolean"},"currency":{"type":"string","const":"AUD"}},"required":["name","slug","description","location","property_type","bedrooms","bathrooms","sleeps","nightly_rate_aud","min_nights","cleaning_fee_aud","latitude","longitude","amenities","booking_url","schema_type","last_updated","has_house_rules","has_cancellation_policy","agent_bookable","currency"],"additionalProperties":false}}},"required":["version","count","updated_since","properties"],"additionalProperties":false},"PublicPropertySlug":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"slug":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"location":{"type":"object","properties":{"suburb":{"anyOf":[{"type":"string"},{"type":"null"}]},"state":{"anyOf":[{"type":"string"},{"type":"null"}]},"country":{"type":"string","minLength":2,"maxLength":2},"country_name":{"type":"string"}},"required":["suburb","state","country","country_name"],"additionalProperties":false},"property_type":{"type":"string"},"bedrooms":{"anyOf":[{"type":"number"},{"type":"null"}]},"bathrooms":{"anyOf":[{"type":"number"},{"type":"null"}]},"sleeps":{"anyOf":[{"type":"number"},{"type":"null"}]},"nightly_rate_aud":{"anyOf":[{"type":"number"},{"type":"null"}]},"nightly_rate_from_aud":{"anyOf":[{"type":"number"},{"type":"null"}]},"nightly_rate_base_aud":{"anyOf":[{"type":"number"},{"type":"null"}]},"check_in":{"anyOf":[{"type":"string"},{"type":"null"}]},"check_out":{"anyOf":[{"type":"string"},{"type":"null"}]},"min_nights":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}]},"cleaning_fee_aud":{"anyOf":[{"type":"number"},{"type":"null"}]},"amenities":{"type":"array","items":{"type":"string"}},"photos":{"type":"array","items":{"type":"string","format":"uri"}},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"booking_url":{"type":"string","format":"uri"},"direct_booking":{"type":"boolean"},"host_accepts_payments":{"type":"boolean"},"platform":{"type":"string"},"schema_type":{"type":"string","const":"VacationRental"},"direct_booking_instructions":{"type":"string"},"last_updated":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"cancellation_policy":{"anyOf":[{"type":"string"},{"type":"null"}]},"house_rules":{"anyOf":[{"type":"string"},{"type":"null"}]},"max_guests":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}]},"deposit_terms":{"type":"null"},"booking_url_template":{"type":"string"},"quote_url":{"type":"string","format":"uri"},"agent_bookable":{"type":"boolean"},"agent_readable":{"type":"boolean"}},"required":["name","slug","description","location","property_type","bedrooms","bathrooms","sleeps","nightly_rate_aud","check_in","check_out","min_nights","cleaning_fee_aud","amenities","photos","latitude","longitude","booking_url","direct_booking","host_accepts_payments","platform","schema_type","direct_booking_instructions","last_updated","cancellation_policy","house_rules","max_guests","deposit_terms","booking_url_template","quote_url","agent_bookable","agent_readable"],"additionalProperties":false},"PublicAvailability":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slug":{"type":"string"},"blocked":{"type":"array","items":{"type":"object","properties":{"from":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"to":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["from","to"],"additionalProperties":false}},"min_nights":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"booking_url":{"type":"string","format":"uri"},"currency":{"type":"string","const":"AUD"},"booking_url_template":{"type":"string"},"quote_url":{"type":"string","format":"uri"}},"required":["slug","blocked","min_nights","booking_url","currency","booking_url_template","quote_url"],"additionalProperties":false},"PublicQuoteQuery":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"check_in":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"check_out":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"guests":{"type":"integer","minimum":1,"maximum":9007199254740991},"currency":{"type":"string"}},"required":["check_in","check_out","guests"],"additionalProperties":false},"PublicQuoteSuccess":{"$schema":"https://json-schema.org/draft/2020-12/schema","oneOf":[{"type":"object","properties":{"slug":{"type":"string"},"title":{"type":"string"},"timezone":{"type":"string"},"check_in":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"check_out":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"nights":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"guests":{"type":"integer","minimum":1,"maximum":9007199254740991},"currency":{"type":"string","const":"AUD"},"min_nights":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"check_in_time":{"anyOf":[{"type":"string"},{"type":"null"}]},"check_out_time":{"anyOf":[{"type":"string"},{"type":"null"}]},"cancellation_policy":{"anyOf":[{"type":"string"},{"type":"null"}]},"house_rules":{"anyOf":[{"type":"string"},{"type":"null"}]},"deposit_terms":{"type":"null"},"booking_url":{"type":"string","format":"uri"},"availability_checked_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"availability_fresh":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"True/false after a calendar refresh was attempted. Null when the quote failed earlier (e.g. MIN_NIGHTS_NOT_MET) and freshness was not checked."},"bookable":{"type":"boolean","const":true},"line_items":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"nights":{"type":"integer","minimum":0,"maximum":9007199254740991},"unit_cents":{"type":"integer","minimum":0,"maximum":9007199254740991},"total_cents":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["label","total_cents"],"additionalProperties":false}},"total_cents":{"type":"integer","minimum":0,"maximum":9007199254740991},"quote_id":{"type":"string","description":"HMAC quote token (15-minute TTL). Not a durable identifier — never log or persist this value."},"quote_expires_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["slug","title","timezone","check_in","check_out","nights","guests","currency","min_nights","check_in_time","check_out_time","cancellation_policy","house_rules","deposit_terms","booking_url","availability_checked_at","availability_fresh","bookable","line_items","total_cents","quote_id","quote_expires_at"],"additionalProperties":false},{"type":"object","properties":{"slug":{"type":"string"},"title":{"type":"string"},"timezone":{"type":"string"},"check_in":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"check_out":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"nights":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"guests":{"type":"integer","minimum":1,"maximum":9007199254740991},"currency":{"type":"string","const":"AUD"},"min_nights":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"check_in_time":{"anyOf":[{"type":"string"},{"type":"null"}]},"check_out_time":{"anyOf":[{"type":"string"},{"type":"null"}]},"cancellation_policy":{"anyOf":[{"type":"string"},{"type":"null"}]},"house_rules":{"anyOf":[{"type":"string"},{"type":"null"}]},"deposit_terms":{"type":"null"},"booking_url":{"type":"string","format":"uri"},"availability_checked_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"availability_fresh":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"True/false after a calendar refresh was attempted. Null when the quote failed earlier (e.g. MIN_NIGHTS_NOT_MET) and freshness was not checked."},"bookable":{"type":"boolean","const":false},"reason_code":{"type":"string","enum":["DATES_UNAVAILABLE","MIN_NIGHTS_NOT_MET","MAX_GUESTS_EXCEEDED","ENQUIRY_MODE_ONLY","NO_RATE_SET","PROPERTY_NOT_AGENT_BOOKABLE","PROPERTY_UNPUBLISHED","HOST_PLAN_INACTIVE","DATES_IN_PAST","STAY_TOO_LONG","CURRENCY_UNSUPPORTED"]},"reason":{"type":"string"},"remedy":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["slug","title","timezone","check_in","check_out","nights","guests","currency","min_nights","check_in_time","check_out_time","cancellation_policy","house_rules","deposit_terms","booking_url","availability_checked_at","availability_fresh","bookable","reason_code","reason","remedy"],"additionalProperties":false}]},"PublicQuoteError":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false},"PublicQuoteRateLimit":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"},"retry_after_seconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["error","retry_after_seconds"],"additionalProperties":false},"PublicApiError":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"x-stayhive-notes":{"demo_slug":"rental-unit-in-melbourne-melbourne-vic-29f4f5","demo_property_url":"https://stayhive.com.au/api/public/properties/rental-unit-in-melbourne-melbourne-vic-29f4f5","demo_availability_url":"https://stayhive.com.au/api/public/availability/rental-unit-in-melbourne-melbourne-vic-29f4f5","demo_quote_url":"https://stayhive.com.au/api/public/quote/rental-unit-in-melbourne-melbourne-vic-29f4f5","guest_pays_in_browser":true,"no_agent_payment":true}}