{"openapi":"3.1.0","info":{"title":"WhichFamilyVacation Catalog API","version":"1.0.0","description":"Read-only editorial family-stay catalog. Price tiers are approximate; live prices, availability, and occupancy are not provided."},"servers":[{"url":"https://whichfamilyvacation.com"}],"paths":{"/api/catalog/search":{"get":{"summary":"Search published family stays","description":"With no filters, returns the highest FamilyFactor stays. Results are deterministic.","parameters":[{"name":"q","in":"query","schema":{"type":"string","maxLength":80}},{"name":"dest","in":"query","schema":{"type":"string"}},{"name":"ages","in":"query","schema":{"enum":["toddlers","elementary","tweens","teens"]}},{"name":"price","in":"query","schema":{"enum":["$","$$","$$$","$$$$"]}},{"name":"type","in":"query","schema":{"enum":["all-inclusive","disney","cabin","hotel"]}},{"name":"ff","in":"query","schema":{"type":"number","minimum":0,"maximum":100}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":10,"default":10}}],"responses":{"200":{"description":"Matching editorial stays","content":{"application/json":{"schema":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/Stay"}},"count":{"type":"integer"},"limit":{"type":"integer"},"disclaimer":{"type":"string"}}}}}},"400":{"description":"Invalid filter value"}}}},"/api/catalog/stays/{slug}":{"get":{"summary":"Get one published stay by exact slug","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Published editorial stay","content":{"application/json":{"schema":{"type":"object","properties":{"stay":{"$ref":"#/components/schemas/Stay"},"disclaimer":{"type":"string"}}}}}},"404":{"description":"Stay not found"}}}}},"components":{"schemas":{"Stay":{"type":"object","required":["slug","name","url","location","stay_types","family_factor","price_tier","age_fit","editorial_summary","live_price","availability","occupancy"],"properties":{"slug":{"type":"string"},"name":{"type":"string"},"url":{"type":"string","format":"uri","description":"Canonical WhichFamilyVacation stay page."},"location":{"type":"object","properties":{"city":{"type":"string"},"state":{"type":"string"},"country":{"type":"string"}}},"stay_types":{"type":"array","items":{"type":"string"}},"family_factor":{"type":"object","properties":{"score":{"type":["number","null"],"description":"Null when not yet assessed."},"status":{"enum":["unassessed"]},"scale":{"const":100},"methodology_url":{"type":"string","format":"uri"}}},"price_tier":{"type":"object","properties":{"value":{"enum":["$","$$","$$$","$$$$",null]},"is_live":{"const":false}}},"age_fit":{"type":"object","description":"Editorial family-fit tags, not room capacity or childcare eligibility.","properties":{"best_for":{"type":"array","items":{"type":"string"}},"range":{"type":"string"}}},"editorial_summary":{"type":"string"},"booking_notes":{"type":"array","items":{"type":"string"},"description":"Optional reviewed property conditions to show before booking, such as minimum check-in age."},"direct_booking":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"is_affiliate":{"const":false}},"description":"Optional verified operator website for direct-only properties."},"live_price":{"type":"null"},"availability":{"type":"null"},"occupancy":{"type":"null"}}}}}}