{"openapi":"3.1.0","info":{"title":"OpenSWMM MCP + REST Gateway","version":"1.0.0"},"paths":{"/health":{"get":{"tags":["system"],"summary":"Liveness check","operationId":"healthCheck","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Healthcheck"}}}}}}},"/api/v1/info":{"get":{"tags":["system"],"summary":"Version and capability metadata","operationId":"getInfo","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Getinfo"}}}}}}},"/api/v1/sessions":{"post":{"tags":["sessions"],"summary":"Create a new, empty model session","operationId":"createSession","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sessions/{session_id}":{"get":{"tags":["sessions"],"summary":"Get a session's status, uploaded-model info, and scenario list","operationId":"getSessionStatus","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["sessions"],"summary":"Delete a session and all its files (destructive, irreversible)","operationId":"deleteSession","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionDeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sessions/{session_id}/models":{"post":{"tags":["models"],"summary":"Upload a SWMM .inp file into a session (modifies session state)","operationId":"uploadModel","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_uploadModel"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sessions/{session_id}/models/text":{"post":{"tags":["models"],"summary":"Upload a SWMM .inp file as a JSON body (filename + content) instead of multipart -- for clients that can't send multipart/form-data, chiefly GPT Actions","operationId":"uploadModelText","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelUploadTextRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sessions/{session_id}/inventory":{"get":{"tags":["models"],"summary":"Structured element counts and 2D mesh status for the uploaded model","operationId":"getModelInventory","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"scenario","in":"query","required":false,"schema":{"type":"string","default":"baseline","title":"Scenario"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelInventoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sessions/{session_id}/validate":{"post":{"tags":["models"],"summary":"QA/QC the model -- disconnected nodes, non-physical geometry, missing outfalls","operationId":"validateModel","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"scenario","in":"query","required":false,"schema":{"type":"string","default":"baseline","title":"Scenario"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelValidateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sessions/{session_id}/download":{"get":{"tags":["models"],"summary":"Download the original or a scenario's .inp file","operationId":"downloadModel","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"scenario","in":"query","required":false,"schema":{"type":"string","default":"baseline","title":"Scenario"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sessions/{session_id}/simulations":{"post":{"tags":["simulations"],"summary":"Run the simulation to completion (modifies session state; synchronous)","operationId":"runSimulation","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimulationRunRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimulationRunResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sessions/{session_id}/integrity":{"get":{"tags":["simulations"],"summary":"Raw continuity-error and numerical-stability metrics -- never a bare pass/fail","operationId":"getSimulationIntegrity","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"scenario","in":"query","required":false,"schema":{"type":"string","default":"baseline","title":"Scenario"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimulationIntegrityResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sessions/{session_id}/results/nodes":{"get":{"tags":["results"],"summary":"Per-node results: depth, head, flooding -- run the simulation first","operationId":"getNodeResults","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"scenario","in":"query","required":false,"schema":{"type":"string","default":"baseline","title":"Scenario"}},{"name":"node_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Node Id"}},{"name":"flooded_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Flooded Only"}},{"name":"surcharged_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Surcharged Only"}},{"name":"top_n","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"title":"Top N"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NodeResultsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sessions/{session_id}/results/links":{"get":{"tags":["results"],"summary":"Per-link results: flow, velocity, filling ratio -- run the simulation first","operationId":"getLinkResults","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"scenario","in":"query","required":false,"schema":{"type":"string","default":"baseline","title":"Scenario"}},{"name":"link_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link Id"}},{"name":"critical_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Critical Only"}},{"name":"top_n","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"title":"Top N"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkResultsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sessions/{session_id}/analysis/flooding":{"get":{"tags":["analysis"],"summary":"Flooded nodes ranked by volume, with evidence-based likely causes","operationId":"analyzeFlooding","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"scenario","in":"query","required":false,"schema":{"type":"string","default":"baseline","title":"Scenario"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FloodingAnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sessions/{session_id}/analysis/summary":{"get":{"tags":["analysis"],"summary":"Concise structured engineering summary across all analysis dimensions","operationId":"getEngineeringSummary","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"scenario","in":"query","required":false,"schema":{"type":"string","default":"baseline","title":"Scenario"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EngineeringSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sessions/{session_id}/2d/summary":{"get":{"tags":["2d"],"summary":"2D mesh size and surface totals -- query while 'running', not after 'ended'","operationId":"get2DSummary","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"scenario","in":"query","required":false,"schema":{"type":"string","default":"baseline","title":"Scenario"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwoDSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sessions/{session_id}/2d/hotspots":{"get":{"tags":["2d"],"summary":"Top-N triangles by max depth/velocity/continuity residual","operationId":"get2DHotspots","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"scenario","in":"query","required":false,"schema":{"type":"string","default":"baseline","title":"Scenario"}},{"name":"top_n","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":10,"title":"Top N"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwoDHotspotsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sessions/{session_id}/2d/coupling":{"get":{"tags":["2d"],"summary":"1D/2D coupling map -- which nodes exchange flow with the 2D surface","operationId":"get2DCoupling","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"scenario","in":"query","required":false,"schema":{"type":"string","default":"baseline","title":"Scenario"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwoDCouplingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sessions/{session_id}/2d/mass-balance":{"get":{"tags":["2d"],"summary":"Detailed 2D mass-balance terms and continuity error","operationId":"get2DMassBalance","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"scenario","in":"query","required":false,"schema":{"type":"string","default":"baseline","title":"Scenario"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwoDMassBalanceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sessions/{session_id}/scenarios":{"post":{"tags":["scenarios"],"summary":"Branch a new scenario from the baseline (or another scenario) and apply changes","operationId":"createScenario","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScenarioCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScenarioCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sessions/{session_id}/scenarios/compare":{"post":{"tags":["scenarios"],"summary":"Diff flooding, capacity, and 2D results between two scenarios (both must have been run)","operationId":"compareScenarios","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScenarioCompareRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScenarioCompareResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Body_uploadModel":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_uploadModel"},"ContinuityMetrics":{"properties":{"runoff_error_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Runoff Error Percent"},"flow_routing_error_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Flow Routing Error Percent"},"quality_error_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Quality Error Percent"}},"type":"object","required":["runoff_error_percent","flow_routing_error_percent"],"title":"ContinuityMetrics"},"CriticalNode":{"properties":{"node_id":{"type":"string","title":"Node Id"},"max_depth":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Depth"},"flood_volume":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Flood Volume"},"time_flooded":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Time Flooded"},"upstream_links":{"items":{"type":"string"},"type":"array","title":"Upstream Links"},"downstream_links":{"items":{"type":"string"},"type":"array","title":"Downstream Links"},"likely_causes":{"items":{"$ref":"#/components/schemas/LikelyCause"},"type":"array","title":"Likely Causes"}},"type":"object","required":["node_id","max_depth","flood_volume","time_flooded","upstream_links","downstream_links","likely_causes"],"title":"CriticalNode"},"EngineeringSummaryResponse":{"properties":{"model_integrity":{"additionalProperties":true,"type":"object","title":"Model Integrity"},"hydrology":{"additionalProperties":true,"type":"object","title":"Hydrology"},"hydraulics":{"additionalProperties":true,"type":"object","title":"Hydraulics"},"flooding":{"additionalProperties":true,"type":"object","title":"Flooding"},"twod":{"additionalProperties":true,"type":"object","title":"Twod"},"critical_findings":{"items":{"type":"string"},"type":"array","title":"Critical Findings"},"limitations":{"items":{"type":"string"},"type":"array","title":"Limitations"}},"type":"object","required":["model_integrity","hydrology","hydraulics","flooding","twod","critical_findings","limitations"],"title":"EngineeringSummaryResponse"},"Finding":{"properties":{"severity":{"type":"string","title":"Severity","description":"'error' or 'warning'"},"category":{"type":"string","title":"Category"},"object_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Object Type"},"object_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Object Id"},"message":{"type":"string","title":"Message"},"evidence":{"additionalProperties":true,"type":"object","title":"Evidence"}},"type":"object","required":["severity","category","message"],"title":"Finding"},"FloodingAnalysisResponse":{"properties":{"summary":{"$ref":"#/components/schemas/FloodingSummary"},"critical_nodes":{"items":{"$ref":"#/components/schemas/CriticalNode"},"type":"array","title":"Critical Nodes"}},"type":"object","required":["summary","critical_nodes"],"title":"FloodingAnalysisResponse"},"FloodingSummary":{"properties":{"flooded_nodes":{"type":"integer","title":"Flooded Nodes"},"total_flood_volume_m3":{"type":"number","title":"Total Flood Volume M3"}},"type":"object","required":["flooded_nodes","total_flood_volume_m3"],"title":"FloodingSummary"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LikelyCause":{"properties":{"cause":{"type":"string","title":"Cause"},"confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confidence"},"evidence":{"additionalProperties":true,"type":"object","title":"Evidence","default":{}}},"type":"object","required":["cause"],"title":"LikelyCause"},"LinkResult":{"properties":{"link_id":{"type":"string","title":"Link Id"},"link_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link Type"},"length":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Length"},"slope":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slope"},"flow":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Flow"},"depth":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Depth"},"max_filling":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Filling"},"max_flow":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Flow"},"max_velocity":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Velocity"},"surcharge_time":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Surcharge Time"},"critical":{"type":"boolean","title":"Critical","default":false}},"type":"object","required":["link_id"],"title":"LinkResult"},"LinkResultsResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"count":{"type":"integer","title":"Count"},"links":{"items":{"$ref":"#/components/schemas/LinkResult"},"type":"array","title":"Links"}},"type":"object","required":["session_id","count","links"],"title":"LinkResultsResponse"},"ModelCounts":{"properties":{"subcatchments":{"type":"integer","title":"Subcatchments"},"junctions":{"type":"integer","title":"Junctions"},"outfalls":{"type":"integer","title":"Outfalls"},"storage_nodes":{"type":"integer","title":"Storage Nodes"},"dividers":{"type":"integer","title":"Dividers"},"conduits":{"type":"integer","title":"Conduits"},"pumps":{"type":"integer","title":"Pumps"},"orifices":{"type":"integer","title":"Orifices"},"weirs":{"type":"integer","title":"Weirs"},"outlets":{"type":"integer","title":"Outlets"},"rain_gages":{"type":"integer","title":"Rain Gages"},"lids":{"type":"integer","title":"Lids"}},"type":"object","required":["subcatchments","junctions","outfalls","storage_nodes","dividers","conduits","pumps","orifices","weirs","outlets","rain_gages","lids"],"title":"ModelCounts"},"ModelInfo":{"properties":{"filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filename"},"flow_units":{"type":"string","title":"Flow Units"},"routing_method":{"type":"string","title":"Routing Method"},"start_time":{"type":"number","title":"Start Time"},"end_time":{"type":"number","title":"End Time"},"routing_step":{"type":"number","title":"Routing Step"}},"type":"object","required":["filename","flow_units","routing_method","start_time","end_time","routing_step"],"title":"ModelInfo"},"ModelInventoryResponse":{"properties":{"model":{"$ref":"#/components/schemas/ModelInfo"},"counts":{"$ref":"#/components/schemas/ModelCounts"},"twod":{"$ref":"#/components/schemas/TwoDSummary"}},"type":"object","required":["model","counts","twod"],"title":"ModelInventoryResponse"},"ModelUploadResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"filename":{"type":"string","title":"Filename"},"sha256":{"type":"string","title":"Sha256"},"size_bytes":{"type":"integer","title":"Size Bytes"},"model_loaded":{"type":"boolean","title":"Model Loaded"},"validation_status":{"type":"string","title":"Validation Status","description":"'clean', 'warnings', or 'errors'"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"}},"type":"object","required":["session_id","filename","sha256","size_bytes","model_loaded","validation_status","warnings"],"title":"ModelUploadResponse"},"ModelUploadTextRequest":{"properties":{"filename":{"type":"string","title":"Filename"},"content":{"type":"string","title":"Content"},"encoding":{"type":"string","title":"Encoding","description":"'utf8' or 'base64'","default":"utf8"}},"type":"object","required":["filename","content"],"title":"ModelUploadTextRequest","description":"Alternative to the multipart /models upload, for clients that can't\nsend multipart/form-data -- chiefly ChatGPT Custom GPT Actions, whose\nActions framework only supports JSON request bodies (confirmed live:\nattaching a file in a GPT conversation does not make its bytes\nreachable as a multipart field on an Action call). `.inp` files are\nplain text, so `content` is the raw file text by default; `encoding:\n\"base64\"` is available for a client that already has the bytes\nbase64-encoded."},"ModelValidateResponse":{"properties":{"valid":{"type":"boolean","title":"Valid"},"errors":{"items":{"type":"string"},"type":"array","title":"Errors"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"},"findings":{"items":{"$ref":"#/components/schemas/Finding"},"type":"array","title":"Findings"}},"type":"object","required":["valid","errors","warnings","findings"],"title":"ModelValidateResponse"},"NodeResult":{"properties":{"node_id":{"type":"string","title":"Node Id"},"node_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Node Type"},"invert_elev":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Invert Elev"},"depth":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Depth"},"head":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Head"},"volume":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Volume"},"flooded":{"type":"boolean","title":"Flooded","default":false},"flood_volume":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Flood Volume"},"time_flooded":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Time Flooded"},"max_overflow_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Overflow Rate"}},"type":"object","required":["node_id"],"title":"NodeResult"},"NodeResultsResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"count":{"type":"integer","title":"Count"},"nodes":{"items":{"$ref":"#/components/schemas/NodeResult"},"type":"array","title":"Nodes"}},"type":"object","required":["session_id","count","nodes"],"title":"NodeResultsResponse"},"ScenarioChange":{"properties":{"object_type":{"type":"string","title":"Object Type","default":"conduit"},"object_id":{"type":"string","title":"Object Id"},"parameter":{"type":"string","title":"Parameter"},"value":{"type":"number","title":"Value"},"units":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Units"}},"type":"object","required":["object_id","parameter","value"],"title":"ScenarioChange"},"ScenarioCompareRequest":{"properties":{"scenario_a":{"type":"string","title":"Scenario A","default":"baseline"},"scenario_b":{"type":"string","title":"Scenario B"}},"type":"object","required":["scenario_b"],"title":"ScenarioCompareRequest"},"ScenarioCompareResponse":{"properties":{"scenario_a":{"type":"string","title":"Scenario A"},"scenario_b":{"type":"string","title":"Scenario B"},"node_flooding_diff":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Node Flooding Diff"},"conduit_flow_diff":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Conduit Flow Diff"},"twod_diff":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Twod Diff"},"continuity":{"additionalProperties":true,"type":"object","title":"Continuity"}},"type":"object","required":["scenario_a","scenario_b","node_flooding_diff","conduit_flow_diff","continuity"],"title":"ScenarioCompareResponse"},"ScenarioCreateRequest":{"properties":{"scenario_name":{"type":"string","title":"Scenario Name"},"base_scenario":{"type":"string","title":"Base Scenario","default":"baseline"},"changes":{"items":{"$ref":"#/components/schemas/ScenarioChange"},"type":"array","title":"Changes"}},"type":"object","required":["scenario_name","changes"],"title":"ScenarioCreateRequest"},"ScenarioCreateResponse":{"properties":{"scenario_name":{"type":"string","title":"Scenario Name"},"changes_applied":{"items":{"$ref":"#/components/schemas/ScenarioChange"},"type":"array","title":"Changes Applied"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"}},"type":"object","required":["scenario_name","changes_applied","warnings"],"title":"ScenarioCreateResponse"},"SessionCreateResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"created_at":{"type":"string","title":"Created At"},"status":{"type":"string","title":"Status"}},"type":"object","required":["session_id","created_at","status"],"title":"SessionCreateResponse"},"SessionDeleteResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"status":{"type":"string","title":"Status","default":"deleted"}},"type":"object","required":["session_id"],"title":"SessionDeleteResponse"},"SessionStatusResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"created_at":{"type":"string","title":"Created At"},"status":{"type":"string","title":"Status"},"original_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Filename"},"model_loaded":{"type":"boolean","title":"Model Loaded"},"scenarios":{"items":{"type":"string"},"type":"array","title":"Scenarios"}},"type":"object","required":["session_id","created_at","status","model_loaded","scenarios"],"title":"SessionStatusResponse"},"SimulationIntegrityResponse":{"properties":{"completed":{"type":"boolean","title":"Completed"},"continuity":{"$ref":"#/components/schemas/ContinuityMetrics"},"numerical":{"additionalProperties":true,"type":"object","title":"Numerical"},"overall_status":{"type":"string","title":"Overall Status"}},"type":"object","required":["completed","continuity","numerical","overall_status"],"title":"SimulationIntegrityResponse"},"SimulationRunRequest":{"properties":{"scenario_name":{"type":"string","title":"Scenario Name","default":"baseline"},"save_results":{"type":"boolean","title":"Save Results","default":true}},"type":"object","title":"SimulationRunRequest"},"SimulationRunResponse":{"properties":{"run_id":{"type":"string","title":"Run Id"},"session_id":{"type":"string","title":"Session Id"},"scenario_name":{"type":"string","title":"Scenario Name"},"status":{"type":"string","title":"Status"},"started_at":{"type":"string","title":"Started At"},"completed_at":{"type":"string","title":"Completed At"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"},"errors":{"items":{"type":"string"},"type":"array","title":"Errors"}},"type":"object","required":["run_id","session_id","scenario_name","status","started_at","completed_at","warnings","errors"],"title":"SimulationRunResponse"},"TwoDCouplingResponse":{"properties":{"active":{"type":"boolean","title":"Active"},"summary":{"$ref":"#/components/schemas/TwoDCouplingSummary"},"raw":{"additionalProperties":true,"type":"object","title":"Raw"}},"type":"object","required":["active","summary","raw"],"title":"TwoDCouplingResponse"},"TwoDCouplingSummary":{"properties":{"coupled_nodes":{"type":"integer","title":"Coupled Nodes"},"vertex_couplings":{"type":"integer","title":"Vertex Couplings"},"triangle_couplings":{"type":"integer","title":"Triangle Couplings"}},"type":"object","required":["coupled_nodes","vertex_couplings","triangle_couplings"],"title":"TwoDCouplingSummary"},"TwoDHotspot":{"properties":{"triangle":{"type":"integer","title":"Triangle"},"centroid":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Centroid"},"max_depth":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Depth"},"max_velocity":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Velocity"},"max_continuity_err":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Continuity Err"}},"type":"object","required":["triangle"],"title":"TwoDHotspot"},"TwoDHotspotsResponse":{"properties":{"active":{"type":"boolean","title":"Active"},"hotspots":{"items":{"$ref":"#/components/schemas/TwoDHotspot"},"type":"array","title":"Hotspots"}},"type":"object","required":["active","hotspots"],"title":"TwoDHotspotsResponse"},"TwoDMassBalanceResponse":{"properties":{"active":{"type":"boolean","title":"Active"},"terms":{"additionalProperties":true,"type":"object","title":"Terms"}},"type":"object","required":["active","terms"],"title":"TwoDMassBalanceResponse"},"TwoDMeshInfo":{"properties":{"vertices":{"type":"integer","title":"Vertices"},"triangles":{"type":"integer","title":"Triangles"},"boundary_edges":{"type":"integer","title":"Boundary Edges"}},"type":"object","required":["vertices","triangles","boundary_edges"],"title":"TwoDMeshInfo"},"TwoDSummary":{"properties":{"active":{"type":"boolean","title":"Active"},"vertices":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Vertices"},"triangles":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Triangles"}},"type":"object","required":["active"],"title":"TwoDSummary"},"TwoDSummaryResponse":{"properties":{"active":{"type":"boolean","title":"Active"},"mesh":{"anyOf":[{"$ref":"#/components/schemas/TwoDMeshInfo"},{"type":"null"}]},"surface":{"anyOf":[{"$ref":"#/components/schemas/TwoDSurfaceInfo"},{"type":"null"}]},"mass_balance":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Mass Balance"}},"type":"object","required":["active"],"title":"TwoDSummaryResponse"},"TwoDSurfaceInfo":{"properties":{"max_depth_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Depth M"},"max_velocity_mps":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Velocity Mps"},"ponded_volume_m3":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ponded Volume M3"}},"type":"object","required":["max_depth_m","max_velocity_mps","ponded_volume_m3"],"title":"TwoDSurfaceInfo"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}