{"openapi":"3.1.0","info":{"title":"Wildlife photo hides and lodges API","version":"v1","description":"Read only JSON API behind the website, apps and MCP server: species, places, shooting windows and listings (hides, lodges, tours). No authentication in phase 1. Field names are camelCase; query parameters are snake_case. Lists in query strings are comma separated."},"servers":[{"url":"/"}],"tags":[{"name":"search"},{"name":"species"},{"name":"places"},{"name":"windows"},{"name":"listings"}],"paths":{"/api/v1/search":{"get":{"operationId":"search","tags":["search"],"summary":"Search species, places and listings","parameters":[{"in":"query","name":"q","schema":{"description":"Free text.","example":"lynx","type":"string","maxLength":200},"description":"Free text."},{"in":"query","name":"limit","schema":{"default":8,"description":"Maximum hits per group (default 8, max 25).","type":"integer","minimum":1,"maximum":25},"description":"Maximum hits per group (default 8, max 25)."}],"responses":{"200":{"description":"Grouped hits","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}}},"400":{"description":"Invalid query parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/species":{"get":{"operationId":"listSpecies","tags":["species"],"summary":"List or search species","parameters":[{"in":"query","name":"q","schema":{"description":"Free text.","example":"lynx","type":"string","maxLength":200},"description":"Free text."},{"in":"query","name":"limit","schema":{"default":50,"description":"Maximum results (default 50, max 200).","type":"integer","minimum":1,"maximum":200},"description":"Maximum results (default 50, max 200)."}],"responses":{"200":{"description":"Species","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeciesListResponse"}}}},"400":{"description":"Invalid query parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/species/{slug}":{"get":{"operationId":"getSpecies","tags":["species"],"summary":"A species with its window grid and listings","parameters":[{"in":"path","name":"slug","schema":{"type":"string","description":"Species slug or public id.","example":"eurasian-lynx"},"required":true,"description":"Species slug or public id."}],"responses":{"200":{"description":"Species","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeciesDetail"}}}},"400":{"description":"Invalid query parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/places/{path}":{"get":{"operationId":"getPlace","tags":["places"],"summary":"A continent, country or park with windows, species and listings","parameters":[{"in":"path","name":"path","schema":{"type":"string","description":"Slug path such as \"europe/finland/oulanka\" (slashes may be URL encoded), or a place public id.","example":"europe/finland"},"required":true,"description":"Slug path such as \"europe/finland/oulanka\" (slashes may be URL encoded), or a place public id."},{"in":"query","name":"species","schema":{"type":"string","description":"Species slugs (or public ids), comma separated.","example":"eurasian-lynx,brown-bear"}},{"in":"query","name":"months","schema":{"type":"string","description":"Months, 1 to 12 or English names, comma separated.","example":"6,7"}},{"in":"query","name":"types","schema":{"type":"string","description":"Listing types, comma separated: hide, lodge, tour, workshop, guide.","example":"hide,lodge"}},{"in":"query","name":"price_min","schema":{"description":"Minimum price_from, in the listing currency.","type":"number","minimum":0},"description":"Minimum price_from, in the listing currency."},{"in":"query","name":"price_max","schema":{"description":"Maximum price_from, in the listing currency.","type":"number","minimum":0},"description":"Maximum price_from, in the listing currency."},{"in":"query","name":"sort","schema":{"default":"rank","type":"string","enum":["rank","price_asc","price_desc","distance","odds"]}},{"in":"query","name":"limit","schema":{"default":100,"description":"Maximum results (default 100, max 500).","type":"integer","minimum":1,"maximum":500},"description":"Maximum results (default 100, max 500)."}],"responses":{"200":{"description":"Place","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaceDetail"}}}},"400":{"description":"Invalid query parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/windows":{"get":{"operationId":"listWindows","tags":["windows"],"summary":"Shooting windows for the globe filter","parameters":[{"in":"query","name":"species","schema":{"type":"string","description":"Species slugs (or public ids), comma separated.","example":"eurasian-lynx,brown-bear"}},{"in":"query","name":"months","schema":{"type":"string","description":"Months, 1 to 12 or English names, comma separated.","example":"6,7"}},{"in":"query","name":"bbox","schema":{"type":"string","description":"Bounding box \"west,south,east,north\" in degrees. west > east crosses the antimeridian.","example":"20,59,32,70"}},{"in":"query","name":"verdict","schema":{"type":"string","description":"Only windows with these verdicts. Needs WINDOW_PUBLIC_VERDICT (the default). Comma separated: prime, good, acceptable, avoid."}},{"in":"query","name":"odds","schema":{"type":"string","description":"Only windows with these odds. Comma separated: near_certain, likely, coin_flip, long_shot, lottery."}},{"in":"query","name":"limit","schema":{"default":500,"description":"Maximum results (default 500, max 5000).","type":"integer","minimum":1,"maximum":5000},"description":"Maximum results (default 500, max 5000)."}],"responses":{"200":{"description":"Windows","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WindowsResponse"}}}},"400":{"description":"Invalid query parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/listings":{"get":{"operationId":"listListings","tags":["listings"],"summary":"Listings as globe markers with card fields","parameters":[{"in":"query","name":"bbox","schema":{"type":"string","description":"Bounding box \"west,south,east,north\" in degrees. west > east crosses the antimeridian.","example":"20,59,32,70"}},{"in":"query","name":"species","schema":{"type":"string","description":"Species slugs (or public ids), comma separated.","example":"eurasian-lynx,brown-bear"}},{"in":"query","name":"months","schema":{"type":"string","description":"Months, 1 to 12 or English names, comma separated.","example":"6,7"}},{"in":"query","name":"types","schema":{"type":"string","description":"Listing types, comma separated: hide, lodge, tour, workshop, guide.","example":"hide,lodge"}},{"in":"query","name":"verdict","schema":{"type":"string","description":"Only listings whose best open verdict (the item's `verdict`) is one of these. Needs WINDOW_PUBLIC_VERDICT (the default). Comma separated: prime, good, acceptable."}},{"in":"query","name":"price_min","schema":{"description":"Minimum price_from, in the listing currency.","type":"number","minimum":0},"description":"Minimum price_from, in the listing currency."},{"in":"query","name":"price_max","schema":{"description":"Maximum price_from, in the listing currency.","type":"number","minimum":0},"description":"Maximum price_from, in the listing currency."},{"in":"query","name":"currency","schema":{"description":"Only listings priced in this ISO 4217 currency.","type":"string","pattern":"^[A-Za-z]{3}$"},"description":"Only listings priced in this ISO 4217 currency."},{"in":"query","name":"sort","schema":{"default":"rank","description":"rank (date proximity, then claimed and verified, then completeness), price_asc, price_desc, distance (to the park boundary), odds.","type":"string","enum":["rank","price_asc","price_desc","distance","odds"]},"description":"rank (date proximity, then claimed and verified, then completeness), price_asc, price_desc, distance (to the park boundary), odds."},{"in":"query","name":"match","schema":{"default":"filter","description":"filter drops listings that do not match species/months/types/verdict; fade keeps them with faded=true (for the globe).","type":"string","enum":["filter","fade"]},"description":"filter drops listings that do not match species/months/types/verdict; fade keeps them with faded=true (for the globe)."},{"in":"query","name":"limit","schema":{"default":200,"description":"Maximum results (default 200, max 500).","type":"integer","minimum":1,"maximum":500},"description":"Maximum results (default 200, max 500)."}],"responses":{"200":{"description":"Listings","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListingsResponse"}}}},"400":{"description":"Invalid query parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/listings/{id}":{"get":{"operationId":"getListing","tags":["listings"],"summary":"One listing: photos, species, months, badge, booking link","parameters":[{"in":"path","name":"id","schema":{"type":"string","description":"Listing uuid or public id; \"publicid-slug\" is accepted too.","example":"7k2m9q4xzt"},"required":true,"description":"Listing uuid or public id; \"publicid-slug\" is accepted too."}],"responses":{"200":{"description":"Listing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListingDetail"}}}},"400":{"description":"Invalid query parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/in-season":{"get":{"operationId":"getInSeason","tags":["windows"],"summary":"What is in season in a country this month (opening sequence)","parameters":[{"in":"query","name":"country","schema":{"description":"ISO 3166-1 alpha-2 country code. Unknown or missing opens on Europe.","type":"string","pattern":"^[A-Za-z]{2}$"},"description":"ISO 3166-1 alpha-2 country code. Unknown or missing opens on Europe."},{"in":"query","name":"month","schema":{"description":"Month 1..12; defaults to the current month (UTC).","type":"integer","minimum":1,"maximum":12},"description":"Month 1..12; defaults to the current month (UTC)."},{"in":"query","name":"markers","schema":{"default":"1","description":"Include listing markers inside the area (1, default) or not (0).","type":"string","enum":["0","1"]},"description":"Include listing markers inside the area (1, default) or not (0)."}],"responses":{"200":{"description":"In season","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InSeason"}}}},"400":{"description":"Invalid query parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/openapi.json":{"get":{"operationId":"getOpenApi","summary":"This document","responses":{"200":{"description":"OpenAPI 3.1 document"}}}}},"components":{"schemas":{"SearchResponse":{"type":"object","properties":{"q":{"type":"string"},"species":{"type":"array","items":{"$ref":"#/components/schemas/SpeciesHit"}},"places":{"type":"array","items":{"$ref":"#/components/schemas/PlaceHit"}},"listings":{"type":"array","items":{"$ref":"#/components/schemas/ListingHit"}},"organisations":{"type":"array","items":{"$ref":"#/components/schemas/PartyHit"}},"people":{"type":"array","items":{"$ref":"#/components/schemas/PartyHit"}}},"required":["q","species","places","listings","organisations","people"],"additionalProperties":false},"SpeciesHit":{"type":"object","properties":{"id":{"type":"string"},"publicId":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"path":{"type":"string","description":"Site URL path."},"score":{"type":"number"},"kind":{"type":"string","const":"species"},"scientificName":{"type":"string"},"matchedName":{"type":"string"},"stripeColour":{"type":["string","null"]}},"required":["id","publicId","name","slug","path","score","kind","scientificName","matchedName","stripeColour"],"additionalProperties":false},"PlaceHit":{"type":"object","properties":{"id":{"type":"string"},"publicId":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"path":{"type":"string","description":"Site URL path."},"score":{"type":"number"},"kind":{"type":"string","const":"place"},"placeKind":{"$ref":"#/components/schemas/PlaceKind"},"placePath":{"type":"string"},"bbox":{"anyOf":[{"$ref":"#/components/schemas/BBox"},{"type":"null"}],"description":"Fly the globe here."},"centroid":{"anyOf":[{"$ref":"#/components/schemas/LngLat"},{"type":"null"}]},"context":{"description":"Parent place names, e.g. \"Finland\".","type":["string","null"]}},"required":["id","publicId","name","slug","path","score","kind","placeKind","placePath","bbox","centroid","context"],"additionalProperties":false},"PlaceKind":{"type":"string","enum":["continent","country","region","protected_area","site","city"]},"BBox":{"type":"object","properties":{"west":{"type":"number"},"south":{"type":"number"},"east":{"type":"number"},"north":{"type":"number"}},"required":["west","south","east","north"],"additionalProperties":false,"description":"Bounding box in degrees; west > east crosses the antimeridian."},"LngLat":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"}],"items":false,"minItems":2,"maxItems":2,"description":"[longitude, latitude] in degrees (WGS84)."},"ListingHit":{"type":"object","properties":{"id":{"type":"string"},"publicId":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"path":{"type":"string","description":"Site URL path."},"score":{"type":"number"},"kind":{"type":"string","const":"listing"},"type":{"$ref":"#/components/schemas/ListingType"},"position":{"anyOf":[{"$ref":"#/components/schemas/LngLat"},{"type":"null"}]},"organisationName":{"type":["string","null"]}},"required":["id","publicId","name","slug","path","score","kind","type","position","organisationName"],"additionalProperties":false},"ListingType":{"type":"string","enum":["hide","lodge","tour","workshop","guide"]},"PartyHit":{"type":"object","properties":{"id":{"type":"string"},"publicId":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"path":{"type":"string","description":"Site URL path."},"score":{"type":"number"},"kind":{"type":"string","enum":["organisation","person"]}},"required":["id","publicId","name","slug","path","score","kind"],"additionalProperties":false,"description":"Operators and photographers; empty until phase 2."},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_request","not_found","unsupported_filter","internal_error"]},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false},"SpeciesListResponse":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SpeciesListItem"}}},"required":["items"],"additionalProperties":false},"SpeciesListItem":{"type":"object","properties":{"id":{"type":"string"},"publicId":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"scientificName":{"type":"string"},"group":{"type":"string","enum":["mammal_terrestrial","mammal_marine","bird_raptor","bird_seabird","bird_other","reptile_amphibian","fish","invertebrate"]},"stripeColour":{"type":["string","null"]},"iucnStatus":{"type":["string","null"]},"path":{"type":"string"},"matchedName":{"description":"The name that matched q, if any.","type":["string","null"]}},"required":["id","publicId","slug","name","scientificName","group","stripeColour","iucnStatus","path","matchedName"],"additionalProperties":false},"SpeciesDetail":{"type":"object","properties":{"species":{"type":"object","properties":{"id":{"type":"string"},"publicId":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"scientificName":{"type":"string"},"group":{"type":"string","enum":["mammal_terrestrial","mammal_marine","bird_raptor","bird_seabird","bird_other","reptile_amphibian","fish","invertebrate"]},"stripeColour":{"type":["string","null"]},"iucnStatus":{"type":["string","null"]},"path":{"type":"string"},"gbifTaxonKey":{"type":["number","null"]},"regions":{"type":"array","items":{"type":"string"}},"names":{"type":"array","items":{"type":"object","properties":{"lang":{"type":"string"},"name":{"type":"string"},"kind":{"type":"string","enum":["common","synonym","scientific"]},"isPrimary":{"type":"boolean"}},"required":["lang","name","kind","isPrimary"],"additionalProperties":false}}},"required":["id","publicId","slug","name","scientificName","group","stripeColour","iucnStatus","path","gbifTaxonKey","regions","names"],"additionalProperties":false},"range":{"$ref":"#/components/schemas/RangeAvailability"},"grid":{"type":"array","items":{"$ref":"#/components/schemas/WindowGridRow"},"description":"Places down, months across."},"windows":{"type":"array","items":{"$ref":"#/components/schemas/Window"}},"listings":{"type":"array","items":{"$ref":"#/components/schemas/ListingItem"}},"creativeFields":{"type":"boolean"}},"required":["species","range","grid","windows","listings","creativeFields"],"additionalProperties":false},"RangeAvailability":{"type":"object","properties":{"sources":{"type":"array","items":{"type":"string","enum":["iucn","birdlife","ebird","gbif","other"]}},"hasPolygons":{"type":"boolean"},"hasOccurrenceCells":{"type":"boolean"},"occurrenceMonths":{"type":"array","items":{"type":"integer","minimum":1,"maximum":12}},"bbox":{"anyOf":[{"$ref":"#/components/schemas/BBox"},{"type":"null"}],"description":"Fit the camera to the whole range."}},"required":["sources","hasPolygons","hasOccurrenceCells","occurrenceMonths","bbox"],"additionalProperties":false},"WindowGridRow":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"place":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"publicId":{"type":"string"},"name":{"type":"string"},"kind":{"$ref":"#/components/schemas/PlaceKind"},"placePath":{"type":"string"},"path":{"type":"string"}},"required":["id","publicId","name","kind","placePath","path"],"additionalProperties":false},{"type":"null"}]},"position":{"anyOf":[{"$ref":"#/components/schemas/LngLat"},{"type":"null"}]},"windowIds":{"type":"array","items":{"type":"string"}},"cells":{"minItems":12,"maxItems":12,"type":"array","items":{"$ref":"#/components/schemas/MonthCell"}}},"required":["key","label","place","position","windowIds","cells"],"additionalProperties":false,"description":"One place in a window grid; cells run January to December."},"MonthCell":{"type":"object","properties":{"month":{"type":"integer","minimum":1,"maximum":12},"open":{"type":"boolean"},"peak":{"type":"boolean"},"odds":{"anyOf":[{"$ref":"#/components/schemas/Odds"},{"type":"null"}]},"verdict":{"anyOf":[{"$ref":"#/components/schemas/Verdict"},{"type":"null"}],"description":"Null when the server hides verdicts (WINDOW_PUBLIC_VERDICT=false)."}},"required":["month","open","peak","odds","verdict"],"additionalProperties":false},"Odds":{"type":"string","enum":["near_certain","likely","coin_flip","long_shot","lottery"]},"Verdict":{"type":"string","enum":["prime","good","acceptable","avoid"]},"Window":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"species":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"scientificName":{"type":"string"},"stripeColour":{"type":["string","null"]},"path":{"type":"string"}},"required":["id","slug","name","scientificName","stripeColour","path"],"additionalProperties":false},{"type":"null"}]},"place":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"publicId":{"type":"string"},"name":{"type":"string"},"kind":{"$ref":"#/components/schemas/PlaceKind"},"placePath":{"type":"string"},"path":{"type":"string"}},"required":["id","publicId","name","kind","placePath","path"],"additionalProperties":false},{"type":"null"}]},"locationText":{"type":["string","null"]},"countryText":{"type":["string","null"]},"position":{"anyOf":[{"$ref":"#/components/schemas/LngLat"},{"type":"null"}]},"bbox":{"anyOf":[{"$ref":"#/components/schemas/BBox"},{"type":"null"}]},"months":{"type":"array","items":{"type":"integer","minimum":1,"maximum":12}},"peakWeeksText":{"type":["string","null"]},"peakMonths":{"type":"array","items":{"type":"integer","minimum":1,"maximum":12},"description":"Months named in peakWeeksText."},"behaviour":{"type":"array","items":{"type":"string"}},"coatState":{"type":["string","null"]},"habitat":{"type":"array","items":{"type":"string"}},"odds":{"anyOf":[{"$ref":"#/components/schemas/Odds"},{"type":"null"}]},"crowds":{"type":["string","null"]},"daysNeeded":{"type":["number","null"]},"notes":{"type":"object","properties":{"light":{"type":["string","null"]},"weatherRisk":{"type":"array","items":{"type":"string"}},"tidesMoon":{"type":["string","null"]},"atmosphere":{"type":["string","null"]},"permits":{"type":["string","null"]},"logistics":{"type":["string","null"]}},"required":["light","weatherRisk","tidesMoon","atmosphere","permits","logistics"],"additionalProperties":false},"operatorsText":{"type":["string","null"]},"backupSubjectsText":{"type":["string","null"]},"open":{"type":"boolean","description":"Open in at least one of the requested months (or, without a month filter, open in some month). Served whatever WINDOW_PUBLIC_VERDICT says."},"verdict":{"anyOf":[{"$ref":"#/components/schemas/Verdict"},{"type":"null"}],"description":"Null when WINDOW_PUBLIC_VERDICT=false (public by default)."},"creative":{"anyOf":[{"type":"object","properties":{"imageConcept":{"type":["string","null"]}},"required":["imageConcept"],"additionalProperties":false},{"type":"null"}],"description":"Null unless WINDOW_PUBLIC_CREATIVE=true. The fine art rating is never served."},"trust":{"$ref":"#/components/schemas/TrustLine"}},"required":["id","title","species","place","locationText","countryText","position","bbox","months","peakWeeksText","peakMonths","behaviour","coatState","habitat","odds","crowds","daysNeeded","notes","operatorsText","backupSubjectsText","open","verdict","creative","trust"],"additionalProperties":false,"description":"A shooting window. Estimated cost is never served."},"TrustLine":{"type":"object","properties":{"confidence":{"anyOf":[{"type":"string","enum":["high","medium","low"]},{"type":"null"}]},"researchDepth":{"anyOf":[{"type":"string","enum":["scan","full"]},{"type":"null"}]},"lastVerified":{"description":"ISO date (YYYY-MM-DD).","type":["string","null"]},"sources":{"type":["string","null"]}},"required":["confidence","researchDepth","lastVerified","sources"],"additionalProperties":false,"description":"Shown on every window: confidence, last checked, sources."},"ListingItem":{"type":"object","properties":{"id":{"type":"string"},"type":{"$ref":"#/components/schemas/ListingType"},"position":{"anyOf":[{"$ref":"#/components/schemas/LngLat"},{"type":"null"}]},"name":{"type":"string"},"thumbUrl":{"description":"Round marker thumbnail.","type":["string","null"]},"insidePlaceName":{"type":["string","null"]},"distanceToBoundaryM":{"type":["number","null"]},"verdict":{"anyOf":[{"type":"string","enum":["prime","good","acceptable"]},{"type":"null"}],"description":"Best verdict of an open window this listing serves, for the active month filter. Null when WINDOW_PUBLIC_VERDICT=false; \"avoid\" is reported as null."},"faded":{"type":"boolean","description":"True when the active filter does not match (match=fade)."},"sponsored":{"type":"boolean"},"publicId":{"type":"string"},"slug":{"type":"string"},"path":{"type":"string","description":"Site URL path of the listing page."},"photo":{"anyOf":[{"$ref":"#/components/schemas/Photo"},{"type":"null"}]},"months":{"type":"array","items":{"type":"integer","minimum":1,"maximum":12},"description":"Open months; empty means year round or unknown."},"peakMonths":{"type":"array","items":{"type":"integer","minimum":1,"maximum":12},"description":"Peak months of the windows this listing serves."},"priceFrom":{"type":["number","null"]},"currency":{"type":["string","null"]},"badge":{"$ref":"#/components/schemas/ParkBadge"},"species":{"type":"array","items":{"$ref":"#/components/schemas/SpeciesRef"}},"ownerState":{"type":"string","enum":["imported","submitted","claimed"]},"verified":{"type":"boolean"},"bookingUrl":{"type":["string","null"]},"nextDeparture":{"anyOf":[{"type":"object","properties":{"startDate":{"type":"string"},"endDate":{"type":"string"}},"required":["startDate","endDate"],"additionalProperties":false},{"type":"null"}]},"bestOdds":{"anyOf":[{"$ref":"#/components/schemas/Odds"},{"type":"null"}]},"openWindow":{"type":"boolean","description":"Serves at least one window open in the requested months (any month without a filter)."},"completeness":{"type":"integer","minimum":0,"maximum":5}},"required":["id","type","position","name","thumbUrl","insidePlaceName","distanceToBoundaryM","verdict","faded","sponsored","publicId","slug","path","photo","months","peakMonths","priceFrom","currency","badge","species","ownerState","verified","bookingUrl","nextDeparture","bestOdds","openWindow","completeness"],"additionalProperties":false},"Photo":{"type":"object","properties":{"url":{"type":"string"},"thumbUrl":{"type":["string","null"]},"alt":{"type":"string"},"width":{"type":["number","null"]},"height":{"type":["number","null"]},"kind":{"type":"string","enum":["photo","logo"]}},"required":["url","thumbUrl","alt","width","height","kind"],"additionalProperties":false},"ParkBadge":{"type":"object","properties":{"kind":{"type":"string","enum":["inside","outside","none"]},"text":{"type":"string","example":"Outside, 2 km from Oulanka National Park"},"placeName":{"type":["string","null"]},"path":{"type":["string","null"]},"distanceM":{"type":["number","null"]}},"required":["kind","text","placeName","path","distanceM"],"additionalProperties":false},"SpeciesRef":{"type":"object","properties":{"id":{"type":"string"},"publicId":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"scientificName":{"type":"string"},"group":{"type":"string","enum":["mammal_terrestrial","mammal_marine","bird_raptor","bird_seabird","bird_other","reptile_amphibian","fish","invertebrate"]},"stripeColour":{"type":["string","null"]},"iucnStatus":{"type":["string","null"]},"path":{"type":"string"}},"required":["id","publicId","slug","name","scientificName","group","stripeColour","iucnStatus","path"],"additionalProperties":false},"PlaceDetail":{"type":"object","properties":{"place":{"type":"object","properties":{"id":{"type":"string"},"publicId":{"type":"string"},"kind":{"$ref":"#/components/schemas/PlaceKind"},"name":{"type":"string"},"slug":{"type":"string"},"placePath":{"type":"string"},"path":{"type":"string"},"governanceClass":{"$ref":"#/components/schemas/GovernanceClass"},"bbox":{"anyOf":[{"$ref":"#/components/schemas/BBox"},{"type":"null"}]},"centroid":{"anyOf":[{"$ref":"#/components/schemas/LngLat"},{"type":"null"}]},"designation":{"type":["string","null"]},"iucnCategory":{"type":["string","null"]},"isoA2":{"type":["string","null"]},"areaKm2":{"type":["number","null"]}},"required":["id","publicId","kind","name","slug","placePath","path","governanceClass","bbox","centroid","designation","iucnCategory","isoA2","areaKm2"],"additionalProperties":false},"ancestors":{"type":"array","items":{"$ref":"#/components/schemas/PlaceRef"}},"children":{"type":"array","items":{"$ref":"#/components/schemas/PlaceRef"}},"windows":{"type":"array","items":{"$ref":"#/components/schemas/Window"}},"byMonth":{"minItems":12,"maxItems":12,"type":"array","items":{"type":"object","properties":{"month":{"type":"integer","minimum":1,"maximum":12},"windowIds":{"type":"array","items":{"type":"string"}}},"required":["month","windowIds"],"additionalProperties":false},"description":"Windows open each month, January to December."},"grid":{"type":"array","items":{"$ref":"#/components/schemas/WindowGridRow"},"description":"Species down, months across."},"species":{"type":"array","items":{"$ref":"#/components/schemas/SpeciesRef"}},"listings":{"type":"array","items":{"$ref":"#/components/schemas/ListingItem"}},"creativeFields":{"type":"boolean"}},"required":["place","ancestors","children","windows","byMonth","grid","species","listings","creativeFields"],"additionalProperties":false},"GovernanceClass":{"type":"string","enum":["state","private","community","shared","unknown"],"description":"WDPA governance class; drives the stripe colour."},"PlaceRef":{"type":"object","properties":{"id":{"type":"string"},"publicId":{"type":"string"},"kind":{"$ref":"#/components/schemas/PlaceKind"},"name":{"type":"string"},"slug":{"type":"string"},"placePath":{"type":"string"},"path":{"type":"string"},"governanceClass":{"$ref":"#/components/schemas/GovernanceClass"},"bbox":{"anyOf":[{"$ref":"#/components/schemas/BBox"},{"type":"null"}]},"centroid":{"anyOf":[{"$ref":"#/components/schemas/LngLat"},{"type":"null"}]}},"required":["id","publicId","kind","name","slug","placePath","path","governanceClass","bbox","centroid"],"additionalProperties":false},"WindowsResponse":{"type":"object","properties":{"windows":{"type":"array","items":{"$ref":"#/components/schemas/Window"}},"creativeFields":{"type":"boolean"}},"required":["windows","creativeFields"],"additionalProperties":false},"ListingsResponse":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ListingMarkerItem"}},"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["items","total"],"additionalProperties":false},"ListingMarkerItem":{"type":"object","properties":{"id":{"type":"string"},"type":{"$ref":"#/components/schemas/ListingType"},"position":{"$ref":"#/components/schemas/LngLat"},"name":{"type":"string"},"thumbUrl":{"description":"Round marker thumbnail.","type":["string","null"]},"insidePlaceName":{"type":["string","null"]},"distanceToBoundaryM":{"type":["number","null"]},"verdict":{"anyOf":[{"type":"string","enum":["prime","good","acceptable"]},{"type":"null"}],"description":"Best verdict of an open window this listing serves, for the active month filter. Null when WINDOW_PUBLIC_VERDICT=false; \"avoid\" is reported as null."},"faded":{"type":"boolean","description":"True when the active filter does not match (match=fade)."},"sponsored":{"type":"boolean"},"publicId":{"type":"string"},"slug":{"type":"string"},"path":{"type":"string","description":"Site URL path of the listing page."},"photo":{"anyOf":[{"$ref":"#/components/schemas/Photo"},{"type":"null"}]},"months":{"type":"array","items":{"type":"integer","minimum":1,"maximum":12},"description":"Open months; empty means year round or unknown."},"peakMonths":{"type":"array","items":{"type":"integer","minimum":1,"maximum":12},"description":"Peak months of the windows this listing serves."},"priceFrom":{"type":["number","null"]},"currency":{"type":["string","null"]},"badge":{"$ref":"#/components/schemas/ParkBadge"},"species":{"type":"array","items":{"$ref":"#/components/schemas/SpeciesRef"}},"ownerState":{"type":"string","enum":["imported","submitted","claimed"]},"verified":{"type":"boolean"},"bookingUrl":{"type":["string","null"]},"nextDeparture":{"anyOf":[{"type":"object","properties":{"startDate":{"type":"string"},"endDate":{"type":"string"}},"required":["startDate","endDate"],"additionalProperties":false},{"type":"null"}]},"bestOdds":{"anyOf":[{"$ref":"#/components/schemas/Odds"},{"type":"null"}]},"openWindow":{"type":"boolean","description":"Serves at least one window open in the requested months (any month without a filter)."},"completeness":{"type":"integer","minimum":0,"maximum":5}},"required":["id","type","position","name","thumbUrl","insidePlaceName","distanceToBoundaryM","verdict","faded","sponsored","publicId","slug","path","photo","months","peakMonths","priceFrom","currency","badge","species","ownerState","verified","bookingUrl","nextDeparture","bestOdds","openWindow","completeness"],"additionalProperties":false},"ListingDetail":{"type":"object","properties":{"id":{"type":"string"},"type":{"$ref":"#/components/schemas/ListingType"},"position":{"anyOf":[{"$ref":"#/components/schemas/LngLat"},{"type":"null"}]},"name":{"type":"string"},"thumbUrl":{"description":"Round marker thumbnail.","type":["string","null"]},"insidePlaceName":{"type":["string","null"]},"distanceToBoundaryM":{"type":["number","null"]},"verdict":{"anyOf":[{"type":"string","enum":["prime","good","acceptable"]},{"type":"null"}],"description":"Best verdict of an open window this listing serves, for the active month filter. Null when WINDOW_PUBLIC_VERDICT=false; \"avoid\" is reported as null."},"faded":{"type":"boolean","description":"True when the active filter does not match (match=fade)."},"sponsored":{"type":"boolean"},"publicId":{"type":"string"},"slug":{"type":"string"},"path":{"type":"string","description":"Site URL path of the listing page."},"photo":{"anyOf":[{"$ref":"#/components/schemas/Photo"},{"type":"null"}]},"months":{"type":"array","items":{"type":"integer","minimum":1,"maximum":12},"description":"Open months; empty means year round or unknown."},"peakMonths":{"type":"array","items":{"type":"integer","minimum":1,"maximum":12},"description":"Peak months of the windows this listing serves."},"priceFrom":{"type":["number","null"]},"currency":{"type":["string","null"]},"badge":{"$ref":"#/components/schemas/ParkBadge"},"species":{"type":"array","items":{"$ref":"#/components/schemas/SpeciesRef"}},"ownerState":{"type":"string","enum":["imported","submitted","claimed"]},"verified":{"type":"boolean"},"bookingUrl":{"type":["string","null"]},"nextDeparture":{"anyOf":[{"type":"object","properties":{"startDate":{"type":"string"},"endDate":{"type":"string"}},"required":["startDate","endDate"],"additionalProperties":false},{"type":"null"}]},"bestOdds":{"anyOf":[{"$ref":"#/components/schemas/Odds"},{"type":"null"}]},"openWindow":{"type":"boolean","description":"Serves at least one window open in the requested months (any month without a filter)."},"completeness":{"type":"integer","minimum":0,"maximum":5},"description":{"type":["string","null"]},"photos":{"type":"array","items":{"$ref":"#/components/schemas/Photo"}},"details":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Per-type fields."},"organisation":{"anyOf":[{"type":"object","properties":{"name":{"type":"string"},"websiteUrl":{"type":["string","null"]},"claimed":{"type":"boolean"}},"required":["name","websiteUrl","claimed"],"additionalProperties":false},{"type":"null"}]},"containingPlace":{"anyOf":[{"$ref":"#/components/schemas/PlaceRef"},{"type":"null"}]},"nearestPlace":{"anyOf":[{"$ref":"#/components/schemas/PlaceRef"},{"type":"null"}]},"departures":{"type":"array","items":{"type":"object","properties":{"startDate":{"type":"string"},"endDate":{"type":"string"},"price":{"type":["number","null"]},"currency":{"type":["string","null"]},"seatsLeft":{"type":["number","null"]},"status":{"type":"string"},"bookingUrl":{"type":["string","null"]}},"required":["startDate","endDate","price","currency","seatsLeft","status","bookingUrl"],"additionalProperties":false}},"windows":{"type":"array","items":{"$ref":"#/components/schemas/Window"}},"lastCheckedAt":{"description":"ISO timestamp.","type":["string","null"]},"priceNote":{"type":"string","description":"Prices are in the operator's currency; conversions are approximate."}},"required":["id","type","position","name","thumbUrl","insidePlaceName","distanceToBoundaryM","verdict","faded","sponsored","publicId","slug","path","photo","months","peakMonths","priceFrom","currency","badge","species","ownerState","verified","bookingUrl","nextDeparture","bestOdds","openWindow","completeness","description","photos","details","organisation","containingPlace","nearestPlace","departures","windows","lastCheckedAt","priceNote"],"additionalProperties":false},"InSeason":{"type":"object","properties":{"place":{"$ref":"#/components/schemas/PlaceRef"},"fallback":{"type":"boolean"},"month":{"type":"integer","minimum":1,"maximum":12},"openWindowCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"topSpecies":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"path":{"type":"string"}},"required":["slug","name","path"],"additionalProperties":false}},"line":{"type":"string","example":"In season in Finland this October: brown bear, eurasian lynx"},"markers":{"type":"array","items":{"$ref":"#/components/schemas/ListingMarkerItem"}}},"required":["place","fallback","month","openWindowCount","topSpecies","line","markers"],"additionalProperties":false,"description":"Opening sequence: where to frame and what is in season."}}}}