{"openapi":"3.1.0","info":{"title":"GulfLine API","version":"1.0.0","description":"Gulf Coast weather API — sub-city zones, timeline-first forecasts, honest confidence. Every payload discloses its source and data age."},"components":{"securitySchemes":{"apiKey":{"type":"apiKey","name":"X-Api-Key","in":"header"}},"schemas":{}},"paths":{"/api/v1/health":{"get":{"tags":["ops"],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["ok"]},"uptimeSeconds":{"type":"number"},"trackedCells":{"type":"integer"}},"required":["status","uptimeSeconds","trackedCells"],"additionalProperties":false}}}}}}},"/api/v1/zones":{"get":{"tags":["zones"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"city","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Stable zone id, e.g. league-city-east"},"city":{"type":"string","description":"City slug, e.g. league-city"},"name":{"type":"string","description":"Human name, e.g. East League City (bayside)"},"description":{"type":"string"},"centroid":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"}},"required":["lat","lon"],"additionalProperties":false},"cellCount":{"type":"integer","exclusiveMinimum":true,"minimum":0}},"required":["id","city","name","centroid","cellCount"],"additionalProperties":false}}}}}}}},"/api/v1/zones/{zoneId}":{"get":{"tags":["zones"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"zoneId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"Stable zone id, e.g. league-city-east"},"city":{"type":"string","description":"City slug, e.g. league-city"},"name":{"type":"string","description":"Human name, e.g. East League City (bayside)"},"description":{"type":"string"},"centroid":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"}},"required":["lat","lon"],"additionalProperties":false},"cellCount":{"type":"integer","exclusiveMinimum":true,"minimum":0},"memberCells":{"type":"array","items":{"type":"object","properties":{"office":{"type":"string","description":"NWS forecast office id, e.g. HGX"},"x":{"type":"integer"},"y":{"type":"integer"}},"required":["office","x","y"],"additionalProperties":false}},"materializedAt":{"type":"string","format":"date-time","description":"When the polygon→cells mapping was last computed"},"geojson":{"description":"GeoJSON Polygon/MultiPolygon of the zone boundary"}},"required":["id","city","name","centroid","cellCount","memberCells","materializedAt"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"statusCode":{"type":"integer"}},"required":["error","message","statusCode"],"additionalProperties":false}}}}}}},"/api/v1/locate":{"get":{"tags":["zones"],"parameters":[{"schema":{"type":"number","minimum":-90,"maximum":90},"in":"query","name":"lat","required":true},{"schema":{"type":"number","minimum":-180,"maximum":180},"in":"query","name":"lon","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"cell":{"type":"object","properties":{"office":{"type":"string","description":"NWS forecast office id, e.g. HGX"},"x":{"type":"integer"},"y":{"type":"integer"}},"required":["office","x","y"],"additionalProperties":false},"zone":{"type":"object","properties":{"id":{"type":"string","description":"Stable zone id, e.g. league-city-east"},"city":{"type":"string","description":"City slug, e.g. league-city"},"name":{"type":"string","description":"Human name, e.g. East League City (bayside)"},"description":{"type":"string"},"centroid":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"}},"required":["lat","lon"],"additionalProperties":false},"cellCount":{"type":"integer","exclusiveMinimum":true,"minimum":0}},"required":["id","city","name","centroid","cellCount"],"additionalProperties":false,"description":"Present when the point falls in a curated zone"},"label":{"type":"string","description":"Curated zone name, or synthesized \"City — compass octant\" label"}},"required":["cell","label"],"additionalProperties":false}}}}}}},"/api/v1/zones/{zoneId}/timeline":{"get":{"tags":["forecast"],"parameters":[{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"in":"query","name":"date","required":false,"description":"Local calendar date (America/Chicago); defaults to today"},{"schema":{"type":"string"},"in":"path","name":"zoneId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"zoneId":{"type":"string"},"cell":{"type":"object","properties":{"office":{"type":"string","description":"NWS forecast office id, e.g. HGX"},"x":{"type":"integer"},"y":{"type":"integer"}},"required":["office","x","y"],"additionalProperties":false},"label":{"type":"string"},"date":{"type":"string","description":"Local calendar date, YYYY-MM-DD, America/Chicago"},"windows":{"type":"array","items":{"type":"object","properties":{"start":{"type":"string","format":"date-time"},"end":{"type":"string","format":"date-time"},"peakPop":{"type":"integer","minimum":0,"maximum":100},"qpfIn":{"type":"number","nullable":true,"description":"Rain amount attributed to this window in inches; null when not attributable"},"thunder":{"type":"boolean"},"character":{"type":"string","enum":["isolated","scattered","numerous","widespread","unknown"]},"characterCopy":{"type":"string"},"confidence":{"type":"object","properties":{"level":{"type":"string","enum":["low","medium","high"]},"reasons":{"type":"array","items":{"type":"string"},"description":"Why this confidence level — lead time, coverage character, AFD language"}},"required":["level","reasons"],"additionalProperties":false},"summary":{"type":"string","description":"e.g. \"Storms 2:30–5 PM, scattered, likely thunder\""}},"required":["start","end","peakPop","qpfIn","thunder","character","characterCopy","confidence","summary"],"additionalProperties":false}},"dryStretches":{"type":"array","items":{"type":"object","properties":{"start":{"type":"string","format":"date-time"},"end":{"type":"string","format":"date-time"},"summary":{"type":"string","description":"Affirmative copy, e.g. \"Reliably dry through 1 PM\""}},"required":["start","end","summary"],"additionalProperties":false}},"hourly":{"type":"array","items":{"type":"object","properties":{"t":{"type":"string","format":"date-time"},"pop":{"type":"integer","minimum":0,"maximum":100,"nullable":true},"popRange":{"type":"array","minItems":2,"maxItems":2,"items":[{"type":"number"},{"type":"number"}],"nullable":true,"description":"Min/max PoP across zone member cells; null for single-cell queries"},"thunderProb":{"type":"integer","minimum":0,"maximum":100,"nullable":true},"skyCover":{"type":"integer","minimum":0,"maximum":100,"nullable":true},"tempF":{"type":"number","nullable":true}},"required":["t","pop","popRange","thunderProb","skyCover","tempF"],"additionalProperties":false}},"regime":{"type":"string","description":"Regime id for the metro/date, when classified"},"meta":{"type":"object","properties":{"source":{"type":"string","description":"Underlying data source id, e.g. nws-ndfd, goes-glm"},"generatedAt":{"type":"string","format":"date-time"},"dataAgeSeconds":{"type":"integer","minimum":0,"description":"Age of the underlying upstream data when this response was generated"},"notes":{"type":"array","items":{"type":"string"}}},"required":["source","generatedAt","dataAgeSeconds"],"additionalProperties":false}},"required":["label","date","windows","dryStretches","hourly","meta"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"statusCode":{"type":"integer"}},"required":["error","message","statusCode"],"additionalProperties":false}}}}}}},"/api/v1/timeline":{"get":{"tags":["forecast"],"parameters":[{"schema":{"type":"number","minimum":-90,"maximum":90},"in":"query","name":"lat","required":true},{"schema":{"type":"number","minimum":-180,"maximum":180},"in":"query","name":"lon","required":true},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"in":"query","name":"date","required":false,"description":"Local calendar date (America/Chicago); defaults to today"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"zoneId":{"type":"string"},"cell":{"type":"object","properties":{"office":{"type":"string","description":"NWS forecast office id, e.g. HGX"},"x":{"type":"integer"},"y":{"type":"integer"}},"required":["office","x","y"],"additionalProperties":false},"label":{"type":"string"},"date":{"type":"string","description":"Local calendar date, YYYY-MM-DD, America/Chicago"},"windows":{"type":"array","items":{"type":"object","properties":{"start":{"type":"string","format":"date-time"},"end":{"type":"string","format":"date-time"},"peakPop":{"type":"integer","minimum":0,"maximum":100},"qpfIn":{"type":"number","nullable":true,"description":"Rain amount attributed to this window in inches; null when not attributable"},"thunder":{"type":"boolean"},"character":{"type":"string","enum":["isolated","scattered","numerous","widespread","unknown"]},"characterCopy":{"type":"string"},"confidence":{"type":"object","properties":{"level":{"type":"string","enum":["low","medium","high"]},"reasons":{"type":"array","items":{"type":"string"},"description":"Why this confidence level — lead time, coverage character, AFD language"}},"required":["level","reasons"],"additionalProperties":false},"summary":{"type":"string","description":"e.g. \"Storms 2:30–5 PM, scattered, likely thunder\""}},"required":["start","end","peakPop","qpfIn","thunder","character","characterCopy","confidence","summary"],"additionalProperties":false}},"dryStretches":{"type":"array","items":{"type":"object","properties":{"start":{"type":"string","format":"date-time"},"end":{"type":"string","format":"date-time"},"summary":{"type":"string","description":"Affirmative copy, e.g. \"Reliably dry through 1 PM\""}},"required":["start","end","summary"],"additionalProperties":false}},"hourly":{"type":"array","items":{"type":"object","properties":{"t":{"type":"string","format":"date-time"},"pop":{"type":"integer","minimum":0,"maximum":100,"nullable":true},"popRange":{"type":"array","minItems":2,"maxItems":2,"items":[{"type":"number"},{"type":"number"}],"nullable":true,"description":"Min/max PoP across zone member cells; null for single-cell queries"},"thunderProb":{"type":"integer","minimum":0,"maximum":100,"nullable":true},"skyCover":{"type":"integer","minimum":0,"maximum":100,"nullable":true},"tempF":{"type":"number","nullable":true}},"required":["t","pop","popRange","thunderProb","skyCover","tempF"],"additionalProperties":false}},"regime":{"type":"string","description":"Regime id for the metro/date, when classified"},"meta":{"type":"object","properties":{"source":{"type":"string","description":"Underlying data source id, e.g. nws-ndfd, goes-glm"},"generatedAt":{"type":"string","format":"date-time"},"dataAgeSeconds":{"type":"integer","minimum":0,"description":"Age of the underlying upstream data when this response was generated"},"notes":{"type":"array","items":{"type":"string"}}},"required":["source","generatedAt","dataAgeSeconds"],"additionalProperties":false}},"required":["label","date","windows","dryStretches","hourly","meta"],"additionalProperties":false}}}}}}},"/api/v1/plan":{"get":{"tags":["forecast"],"parameters":[{"schema":{"type":"number","minimum":-90,"maximum":90},"in":"query","name":"lat","required":true},{"schema":{"type":"number","minimum":-180,"maximum":180},"in":"query","name":"lon","required":true},{"schema":{"type":"string","format":"date-time"},"in":"query","name":"start","required":true},{"schema":{"type":"string","format":"date-time"},"in":"query","name":"end","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"verdict":{"type":"string","enum":["go","risky","no-go"]},"confidence":{"type":"object","properties":{"level":{"type":"string","enum":["low","medium","high"]},"reasons":{"type":"array","items":{"type":"string"},"description":"Why this confidence level — lead time, coverage character, AFD language"}},"required":["level","reasons"],"additionalProperties":false},"windows":{"type":"array","items":{"type":"object","properties":{"start":{"type":"string","format":"date-time"},"end":{"type":"string","format":"date-time"},"peakPop":{"type":"integer","minimum":0,"maximum":100},"qpfIn":{"type":"number","nullable":true,"description":"Rain amount attributed to this window in inches; null when not attributable"},"thunder":{"type":"boolean"},"character":{"type":"string","enum":["isolated","scattered","numerous","widespread","unknown"]},"characterCopy":{"type":"string"},"confidence":{"type":"object","properties":{"level":{"type":"string","enum":["low","medium","high"]},"reasons":{"type":"array","items":{"type":"string"},"description":"Why this confidence level — lead time, coverage character, AFD language"}},"required":["level","reasons"],"additionalProperties":false},"summary":{"type":"string","description":"e.g. \"Storms 2:30–5 PM, scattered, likely thunder\""}},"required":["start","end","peakPop","qpfIn","thunder","character","characterCopy","confidence","summary"],"additionalProperties":false},"description":"Rain-risk windows overlapping the requested plan window"},"reasons":{"type":"array","items":{"type":"string"}},"advice":{"type":"string","description":"e.g. \"Storms should clear by 5 — check back Saturday morning, confidence will be higher\""},"label":{"type":"string"},"meta":{"type":"object","properties":{"source":{"type":"string","description":"Underlying data source id, e.g. nws-ndfd, goes-glm"},"generatedAt":{"type":"string","format":"date-time"},"dataAgeSeconds":{"type":"integer","minimum":0,"description":"Age of the underlying upstream data when this response was generated"},"notes":{"type":"array","items":{"type":"string"}}},"required":["source","generatedAt","dataAgeSeconds"],"additionalProperties":false}},"required":["verdict","confidence","windows","reasons","advice","label","meta"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"statusCode":{"type":"integer"}},"required":["error","message","statusCode"],"additionalProperties":false}}}}}}},"/api/v1/regime":{"get":{"tags":["forecast"],"parameters":[{"schema":{"type":"string","default":"league-city"},"in":"query","name":"city","required":false},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"in":"query","name":"date","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"regime":{"type":"string","enum":["classic-seabreeze","outflow-dominated","capped-dry","tropical-surge","frontal","mixed-uncertain"]},"confidence":{"type":"object","properties":{"level":{"type":"string","enum":["low","medium","high"]},"reasons":{"type":"array","items":{"type":"string"},"description":"Why this confidence level — lead time, coverage character, AFD language"}},"required":["level","reasons"],"additionalProperties":false},"evidence":{"type":"array","items":{"type":"string"},"description":"The signals that fired, in order — never pretend the heuristic is smarter than it is"},"copy":{"type":"string","description":"Regime explanation as a local would give it"},"classifier":{"type":"string","description":"Classifier version, e.g. \"rules-v1\""},"afd":{"type":"object","properties":{"issuanceTime":{"type":"string","format":"date-time"},"confidenceExcerpt":{"type":"string","nullable":true}},"required":["issuanceTime","confidenceExcerpt"],"additionalProperties":false,"nullable":true,"description":"Latest NWS Area Forecast Discussion signals for the metro"},"city":{"type":"string"},"date":{"type":"string"},"meta":{"type":"object","properties":{"source":{"type":"string","description":"Underlying data source id, e.g. nws-ndfd, goes-glm"},"generatedAt":{"type":"string","format":"date-time"},"dataAgeSeconds":{"type":"integer","minimum":0,"description":"Age of the underlying upstream data when this response was generated"},"notes":{"type":"array","items":{"type":"string"}}},"required":["source","generatedAt","dataAgeSeconds"],"additionalProperties":false}},"required":["regime","confidence","evidence","copy","classifier","afd","city","date","meta"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"statusCode":{"type":"integer"}},"required":["error","message","statusCode"],"additionalProperties":false}}}}}}},"/api/v1/alerts":{"get":{"tags":["conditions"],"parameters":[{"schema":{"type":"number","minimum":-90,"maximum":90},"in":"query","name":"lat","required":true},{"schema":{"type":"number","minimum":-180,"maximum":180},"in":"query","name":"lon","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"alerts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"event":{"type":"string","description":"NWS event name, e.g. \"Severe Thunderstorm Warning\""},"severity":{"type":"string"},"headline":{"type":"string","nullable":true},"onset":{"type":"string","format":"date-time","nullable":true},"ends":{"type":"string","format":"date-time","nullable":true},"riderRelevant":{"type":"boolean","description":"True for exposure-relevant events: severe/tornado/lightning/flood/heat"}},"required":["id","event","severity","headline","onset","ends","riderRelevant"],"additionalProperties":false}},"meta":{"type":"object","properties":{"source":{"type":"string","description":"Underlying data source id, e.g. nws-ndfd, goes-glm"},"generatedAt":{"type":"string","format":"date-time"},"dataAgeSeconds":{"type":"integer","minimum":0,"description":"Age of the underlying upstream data when this response was generated"},"notes":{"type":"array","items":{"type":"string"}}},"required":["source","generatedAt","dataAgeSeconds"],"additionalProperties":false}},"required":["alerts","meta"],"additionalProperties":false}}}}}}},"/api/v1/nowcast":{"get":{"tags":["conditions"],"parameters":[{"schema":{"type":"number","minimum":-90,"maximum":90},"in":"query","name":"lat","required":true},{"schema":{"type":"number","minimum":-180,"maximum":180},"in":"query","name":"lon","required":true},{"schema":{"type":"integer","minimum":15,"maximum":240,"default":90},"in":"query","name":"minutes","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"staysDryOdds":{"type":"integer","minimum":0,"maximum":100,"description":"Probability (%) of staying dry at this point for the requested window"},"expectedRainStart":{"type":"string","format":"date-time","nullable":true},"lightning":{"type":"object","properties":{"risk":{"type":"string","enum":["none","possible","active","unknown"]},"lastFlashMinutesAgo":{"type":"number","nullable":true},"lastFlashDistanceMiles":{"type":"number","nullable":true}},"required":["risk","lastFlashMinutesAgo","lastFlashDistanceMiles"],"additionalProperties":false},"heat":{"type":"object","properties":{"heatIndexF":{"type":"number","nullable":true},"wbgtF":{"type":"number","nullable":true,"description":"Wet-bulb globe temperature — exposure standard"},"guidance":{"type":"string"}},"required":["heatIndexF","wbgtF","guidance"],"additionalProperties":false},"source":{"type":"string","description":"Nowcast backing source; v1 = ndfd+openmeteo-v1, later radar-backed under the same contract"},"meta":{"type":"object","properties":{"source":{"type":"string","description":"Underlying data source id, e.g. nws-ndfd, goes-glm"},"generatedAt":{"type":"string","format":"date-time"},"dataAgeSeconds":{"type":"integer","minimum":0,"description":"Age of the underlying upstream data when this response was generated"},"notes":{"type":"array","items":{"type":"string"}}},"required":["source","generatedAt","dataAgeSeconds"],"additionalProperties":false}},"required":["staysDryOdds","expectedRainStart","lightning","heat","source","meta"],"additionalProperties":false}}}}}}},"/api/v1/lightning/clearance":{"get":{"tags":["lightning"],"parameters":[{"schema":{"type":"number","minimum":1,"maximum":50,"default":10},"in":"query","name":"radiusMiles","required":false},{"schema":{"type":"integer","minimum":5,"maximum":120,"default":30},"in":"query","name":"clearMinutes","required":false},{"schema":{"type":"number","minimum":-90,"maximum":90},"in":"query","name":"lat","required":true},{"schema":{"type":"number","minimum":-180,"maximum":180},"in":"query","name":"lon","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["clear","closed","unknown"]},"closedUntil":{"type":"string","format":"date-time","nullable":true,"description":"When the policy window reopens if no further flashes occur; null when clear/unknown"},"lastFlash":{"type":"object","properties":{"at":{"type":"string","format":"date-time"},"lat":{"type":"number"},"lon":{"type":"number"},"distanceMiles":{"type":"number"}},"required":["at","lat","lon"],"additionalProperties":false,"nullable":true},"flashesInWindow":{"type":"integer","minimum":0},"policy":{"type":"object","properties":{"radiusMiles":{"type":"number","minimum":1,"maximum":50,"default":10},"clearMinutes":{"type":"integer","minimum":5,"maximum":120,"default":30}},"additionalProperties":false},"dataSource":{"type":"string","enum":["goes-glm"]},"locationAccuracyNote":{"type":"string"},"meta":{"type":"object","properties":{"source":{"type":"string","description":"Underlying data source id, e.g. nws-ndfd, goes-glm"},"generatedAt":{"type":"string","format":"date-time"},"dataAgeSeconds":{"type":"integer","minimum":0,"description":"Age of the underlying upstream data when this response was generated"},"notes":{"type":"array","items":{"type":"string"}}},"required":["source","generatedAt","dataAgeSeconds"],"additionalProperties":false}},"required":["status","closedUntil","lastFlash","flashesInWindow","policy","dataSource","locationAccuracyNote","meta"],"additionalProperties":false}}}}}}},"/api/v1/lightning/recent":{"get":{"tags":["lightning"],"parameters":[{"schema":{"type":"number","minimum":-90,"maximum":90},"in":"query","name":"lat","required":true},{"schema":{"type":"number","minimum":-180,"maximum":180},"in":"query","name":"lon","required":true},{"schema":{"type":"number","minimum":1,"maximum":100,"default":25},"in":"query","name":"radiusMiles","required":false},{"schema":{"type":"integer","minimum":5,"maximum":180,"default":60},"in":"query","name":"minutes","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"flashes":{"type":"array","items":{"type":"object","properties":{"at":{"type":"string","format":"date-time"},"lat":{"type":"number"},"lon":{"type":"number"},"distanceMiles":{"type":"number"}},"required":["at","lat","lon"],"additionalProperties":false}},"meta":{"type":"object","properties":{"source":{"type":"string","description":"Underlying data source id, e.g. nws-ndfd, goes-glm"},"generatedAt":{"type":"string","format":"date-time"},"dataAgeSeconds":{"type":"integer","minimum":0,"description":"Age of the underlying upstream data when this response was generated"},"notes":{"type":"array","items":{"type":"string"}}},"required":["source","generatedAt","dataAgeSeconds"],"additionalProperties":false}},"required":["flashes","meta"],"additionalProperties":false}}}}}}},"/api/v1/ask":{"post":{"tags":["ai"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","minLength":3,"maxLength":500},"lat":{"type":"number","minimum":-90,"maximum":90},"lon":{"type":"number","minimum":-180,"maximum":180}},"required":["query","lat","lon"],"additionalProperties":false}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"answer":{"type":"string"},"confidencePct":{"type":"integer","minimum":0,"maximum":100,"description":"Derived from engine confidence — never model-invented"},"structured":{"description":"The raw engine outputs (plan/clearance/timeline) the answer was built from"},"intent":{"type":"object","properties":{"activity":{"type":"string","enum":["pool","ride","boat","cookout","outdoor-generic"]},"windowStart":{"type":"string","description":"ISO datetime the user means, resolved from relative phrases"},"windowEnd":{"type":"string"},"needsLightningClearance":{"type":"boolean"}},"required":["activity","windowStart","windowEnd","needsLightningClearance"],"additionalProperties":false},"model":{"type":"string","description":"Local model id, e.g. \"qwen3-8b-q4\""},"meta":{"type":"object","properties":{"source":{"type":"string","description":"Underlying data source id, e.g. nws-ndfd, goes-glm"},"generatedAt":{"type":"string","format":"date-time"},"dataAgeSeconds":{"type":"integer","minimum":0,"description":"Age of the underlying upstream data when this response was generated"},"notes":{"type":"array","items":{"type":"string"}}},"required":["source","generatedAt","dataAgeSeconds"],"additionalProperties":false}},"required":["answer","confidencePct","intent","model","meta"],"additionalProperties":false}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"statusCode":{"type":"integer"}},"required":["error","message","statusCode"],"additionalProperties":false}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"statusCode":{"type":"integer"}},"required":["error","message","statusCode"],"additionalProperties":false}}}}}}},"/api/v1/openapi.json":{"get":{"responses":{"200":{"description":"Default Response"}}}}},"security":[{"apiKey":[]}]}