{"openapi":"3.1.0","info":{"title":"Sumberkima Hill stays API","version":"1.0.0","description":"Read-only access to Sumberkima Hill, a resort of private villas, cabins and rooms in North West Bali, for AI agents and other software.\n\nFind stays and live prices, read property details, and create booking links for guests. Bookings themselves are only made by the guest on the website.\n\nNo authentication. Per IP: 30 stay searches and 30 quotes per minute, 10 booking links per minute.\n\nThe same tools are available over MCP at https://sumberkimahill.com/mcp.","contact":{"name":"Sumberkima Hill","url":"https://sumberkimahill.com/contact","email":"sumberkimahill@gmail.com"}},"servers":[{"url":"https://sumberkimahill.com"}],"paths":{"/api/public/stays":{"get":{"operationId":"searchStays","summary":"Find properties free for a stay","description":"Properties free for every night from checkIn to checkOut that can host the guests, with all-inclusive nightly estimates in IDR, minimum-stay rules, quote links and booking links.","parameters":[{"name":"checkIn","in":"query","required":true,"description":"Check-in date, YYYY-MM-DD. Check-in is from 15:00 Bali time.","schema":{"type":"string","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","examples":["2027-03-10"]}},{"name":"checkOut","in":"query","required":true,"description":"Check-out date, YYYY-MM-DD. Check-out is by 11:00 Bali time.","schema":{"type":"string","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","examples":["2027-03-14"]}},{"name":"adults","in":"query","required":false,"description":"Number of adults.","schema":{"default":2,"type":"integer","minimum":1,"maximum":30}},{"name":"children","in":"query","required":false,"description":"Number of children. Children count towards the guest limit.","schema":{"default":0,"type":"integer","minimum":0,"maximum":30}},{"name":"infants","in":"query","required":false,"description":"Number of infants (ages 0-2). Infants do not count towards the guest limit.","schema":{"default":0,"type":"integer","minimum":0,"maximum":30}},{"name":"pets","in":"query","required":false,"description":"Number of pets. Only some properties allow pets.","schema":{"default":0,"type":"integer","minimum":0,"maximum":5}},{"name":"propertyType","in":"query","required":false,"description":"Only this kind of property.","schema":{"type":"string","enum":["Villa","Cabin","Room"]}},{"name":"bedrooms","in":"query","required":false,"description":"Only properties with exactly this many bedrooms (6 means 6 or more).","schema":{"type":"integer","minimum":1,"maximum":6}},{"name":"pool","in":"query","required":false,"description":"Only properties with a private pool, or with access to a shared pool.","schema":{"type":"string","enum":["private","shared"]}},{"name":"features","in":"query","required":false,"description":"Only properties with all of these features.","schema":{"maxItems":6,"type":"array","items":{"type":"string","enum":["hasBathTub","hasEnclosedIndoorAC","hasBedroomAC","hasKitchen","hasSunriseView","hasSunsetView"]}},"style":"form","explode":true},{"name":"name","in":"query","required":false,"description":"Only properties whose name contains this text, e.g. \"Kura\".","schema":{"type":"string","maxLength":100}},{"name":"sort","in":"query","required":false,"description":"Order of the results.","schema":{"default":"price-low-high","type":"string","enum":["price-low-high","price-high-low"]}},{"name":"limit","in":"query","required":false,"description":"Most results to return.","schema":{"default":25,"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"Available properties.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Error. `error` is a code (invalid_request, not_found, rate_limited, availability_unavailable, quote_unavailable, internal_error) and `message` explains it.","content":{"application/json":{"schema":{"type":"object","required":["error","message"],"properties":{"error":{"type":"string"},"message":{"type":"string"},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}}}}}}},"429":{"description":"Error. `error` is a code (invalid_request, not_found, rate_limited, availability_unavailable, quote_unavailable, internal_error) and `message` explains it.","content":{"application/json":{"schema":{"type":"object","required":["error","message"],"properties":{"error":{"type":"string"},"message":{"type":"string"},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}}}}}}},"503":{"description":"Error. `error` is a code (invalid_request, not_found, rate_limited, availability_unavailable, quote_unavailable, internal_error) and `message` explains it.","content":{"application/json":{"schema":{"type":"object","required":["error","message"],"properties":{"error":{"type":"string"},"message":{"type":"string"},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}}}}}}}}}},"/api/public/properties/{slug}/quote":{"get":{"operationId":"getQuote","summary":"Get the live price of a stay","description":"The exact price of a stay from the booking system, in the currency it is charged in, with the payment schedule and policies. If the stay cannot be booked, `bookable` is false and `reason` says why (booking_not_available, minimum_stay_violation, guest_limit_exceeded, pets_not_allowed, promo_code_not_applied).","parameters":[{"name":"slug","in":"path","required":true,"description":"Property slug, e.g. villa-kura-kura.","schema":{"type":"string"}},{"name":"checkIn","in":"query","required":true,"description":"Check-in date, YYYY-MM-DD. Check-in is from 15:00 Bali time.","schema":{"type":"string","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","examples":["2027-03-10"]}},{"name":"checkOut","in":"query","required":true,"description":"Check-out date, YYYY-MM-DD. Check-out is by 11:00 Bali time.","schema":{"type":"string","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","examples":["2027-03-14"]}},{"name":"adults","in":"query","required":false,"description":"Number of adults.","schema":{"default":2,"type":"integer","minimum":1,"maximum":30}},{"name":"children","in":"query","required":false,"description":"Number of children. Children count towards the guest limit.","schema":{"default":0,"type":"integer","minimum":0,"maximum":30}},{"name":"infants","in":"query","required":false,"description":"Number of infants (ages 0-2). Infants do not count towards the guest limit.","schema":{"default":0,"type":"integer","minimum":0,"maximum":30}},{"name":"pets","in":"query","required":false,"description":"Number of pets. Only some properties allow pets.","schema":{"default":0,"type":"integer","minimum":0,"maximum":5}},{"name":"promoCode","in":"query","required":false,"description":"A promotion code the guest has.","schema":{"type":"string","maxLength":50}}],"responses":{"200":{"description":"A quote, or the reason the stay cannot be booked.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Error. `error` is a code (invalid_request, not_found, rate_limited, availability_unavailable, quote_unavailable, internal_error) and `message` explains it.","content":{"application/json":{"schema":{"type":"object","required":["error","message"],"properties":{"error":{"type":"string"},"message":{"type":"string"},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}}}}}}},"404":{"description":"Error. `error` is a code (invalid_request, not_found, rate_limited, availability_unavailable, quote_unavailable, internal_error) and `message` explains it.","content":{"application/json":{"schema":{"type":"object","required":["error","message"],"properties":{"error":{"type":"string"},"message":{"type":"string"},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}}}}}}},"429":{"description":"Error. `error` is a code (invalid_request, not_found, rate_limited, availability_unavailable, quote_unavailable, internal_error) and `message` explains it.","content":{"application/json":{"schema":{"type":"object","required":["error","message"],"properties":{"error":{"type":"string"},"message":{"type":"string"},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}}}}}}},"502":{"description":"Error. `error` is a code (invalid_request, not_found, rate_limited, availability_unavailable, quote_unavailable, internal_error) and `message` explains it.","content":{"application/json":{"schema":{"type":"object","required":["error","message"],"properties":{"error":{"type":"string"},"message":{"type":"string"},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}}}}}}}}}},"/api/public/booking-links":{"post":{"operationId":"createBookingLink","summary":"Create a booking link for a guest","description":"A link to the property page with the stay chosen and the live price shown. With `guest`, the booking form opens with those details filled in (they are kept for 3 days). Nothing is booked or charged: the guest clicks Book, checks the details, accepts the rental agreement and pays.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"property":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[a-z0-9-]+$","description":"Property slug, as returned by search_stays or list_properties (e.g. \"villa-kura-kura\")."},"checkIn":{"type":"string","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","examples":["2027-03-10"],"description":"Check-in date, YYYY-MM-DD. Check-in is from 15:00 Bali time."},"checkOut":{"type":"string","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","examples":["2027-03-14"],"description":"Check-out date, YYYY-MM-DD. Check-out is by 11:00 Bali time."},"adults":{"default":2,"description":"Number of adults.","type":"integer","minimum":1,"maximum":30},"children":{"default":0,"description":"Number of children. Children count towards the guest limit.","type":"integer","minimum":0,"maximum":30},"infants":{"default":0,"description":"Number of infants (ages 0-2). Infants do not count towards the guest limit.","type":"integer","minimum":0,"maximum":30},"pets":{"default":0,"description":"Number of pets. Only some properties allow pets.","type":"integer","minimum":0,"maximum":5},"guest":{"type":"object","properties":{"firstName":{"type":"string","minLength":1,"maxLength":100},"lastName":{"type":"string","minLength":1,"maxLength":100},"email":{"type":"string","maxLength":254,"format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"phone":{"description":"Phone number in international format with the country code, e.g. +61412345678.","type":"string"},"country":{"description":"Country of residence as an ISO 3166-1 alpha-2 code, e.g. \"AU\".","type":"string","pattern":"^[A-Z]{2}$"},"specialRequests":{"type":"string","maxLength":1000}},"description":"Details to fill in on the booking form. The guest checks them before booking. Leave out anything you do not know."}},"required":["property","checkIn","checkOut"]}}}},"responses":{"201":{"description":"The booking link.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Error. `error` is a code (invalid_request, not_found, rate_limited, availability_unavailable, quote_unavailable, internal_error) and `message` explains it.","content":{"application/json":{"schema":{"type":"object","required":["error","message"],"properties":{"error":{"type":"string"},"message":{"type":"string"},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}}}}}}},"404":{"description":"Error. `error` is a code (invalid_request, not_found, rate_limited, availability_unavailable, quote_unavailable, internal_error) and `message` explains it.","content":{"application/json":{"schema":{"type":"object","required":["error","message"],"properties":{"error":{"type":"string"},"message":{"type":"string"},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}}}}}}},"429":{"description":"Error. `error` is a code (invalid_request, not_found, rate_limited, availability_unavailable, quote_unavailable, internal_error) and `message` explains it.","content":{"application/json":{"schema":{"type":"object","required":["error","message"],"properties":{"error":{"type":"string"},"message":{"type":"string"},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}}}}}}}}}},"/api/public/resort":{"get":{"operationId":"getResortInformation","summary":"Resort information","description":"Location and how to get there, check-in and check-out times, payment and cancellation policies, currencies, contact details and key pages.","responses":{"200":{"description":"Resort information.","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/public/properties":{"get":{"operationId":"listProperties","summary":"List all properties","description":"Every property with its slug, capacity, features and amenities, as `{ success, data, meta }`. Does not check availability.","parameters":[{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["Villa","Cabin","Room"]}},{"name":"minGuests","in":"query","required":false,"schema":{"type":"integer"}},{"name":"maxGuests","in":"query","required":false,"schema":{"type":"integer"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Properties.","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/public/properties/{slug}":{"get":{"operationId":"getProperty","summary":"Property details","description":"One property in full, as `{ success, data, meta }`, including its photo gallery.","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The property.","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"No such property.","content":{"application/json":{"schema":{"type":"object"}}}}}}}}}