{"openapi":"3.1.0","info":{"title":"DMRLS API","description":"Landslide Monitoring System API — กรมทรัพยากรธรณี","version":"0.2.0"},"paths":{"/health":{"get":{"tags":["health"],"summary":"Health Check","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/alerts/prefs":{"get":{"tags":["alerts"],"summary":"Get Prefs","operationId":"get_prefs_api_alerts_prefs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertPrefs"}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["alerts"],"summary":"Put Prefs","operationId":"put_prefs_api_alerts_prefs_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertPrefs"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertPrefs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/alerts/feed":{"get":{"tags":["alerts"],"summary":"Get Feed","operationId":"get_feed_api_alerts_feed_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertFeedResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/layers/groups":{"get":{"tags":["layers"],"summary":"List Layer Groups","description":"List all layer groups with layers visible to the caller's role.","operationId":"list_layer_groups_api_layers_groups_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/LayerGroupResponse"},"type":"array","title":"Response List Layer Groups Api Layers Groups Get"}}}}}}},"/api/layers":{"get":{"tags":["layers"],"summary":"List Layers","description":"List all active layers visible to the caller's role (flat list).","operationId":"list_layers_api_layers_get","parameters":[{"name":"workspace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace"}},{"name":"layer_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Layer Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GeoserverLayerResponse"},"title":"Response List Layers Api Layers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/layers/admin/groups":{"get":{"tags":["layers"],"summary":"Admin List Groups","description":"Return every group + layer, including inactive ones, for admin UI.","operationId":"admin_list_groups_api_layers_admin_groups_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/LayerGroupResponse"},"type":"array","title":"Response Admin List Groups Api Layers Admin Groups Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["layers"],"summary":"Admin Create Group","operationId":"admin_create_group_api_layers_admin_groups_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LayerGroupCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LayerGroupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/layers/admin/unassigned":{"get":{"tags":["layers"],"summary":"Admin List Unassigned","description":"Layers not yet attached to any group.","operationId":"admin_list_unassigned_api_layers_admin_unassigned_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/GeoserverLayerResponse"},"type":"array","title":"Response Admin List Unassigned Api Layers Admin Unassigned Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/layers/admin/groups/{group_id}":{"patch":{"tags":["layers"],"summary":"Admin Update Group","operationId":"admin_update_group_api_layers_admin_groups__group_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"integer","title":"Group Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LayerGroupUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LayerGroupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["layers"],"summary":"Admin Delete Group","operationId":"admin_delete_group_api_layers_admin_groups__group_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"integer","title":"Group Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/layers/admin/groups/reorder":{"post":{"tags":["layers"],"summary":"Admin Reorder Groups","operationId":"admin_reorder_groups_api_layers_admin_groups_reorder_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LayerGroupReorder"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/LayerGroupResponse"},"type":"array","title":"Response Admin Reorder Groups Api Layers Admin Groups Reorder Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/layers/admin/layers":{"post":{"tags":["layers"],"summary":"Admin Create Layer","operationId":"admin_create_layer_api_layers_admin_layers_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeoserverLayerCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeoserverLayerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/layers/admin/layers/{layer_id}":{"patch":{"tags":["layers"],"summary":"Admin Update Layer","operationId":"admin_update_layer_api_layers_admin_layers__layer_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"layer_id","in":"path","required":true,"schema":{"type":"integer","title":"Layer Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeoserverLayerUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeoserverLayerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["layers"],"summary":"Admin Delete Layer","operationId":"admin_delete_layer_api_layers_admin_layers__layer_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"layer_id","in":"path","required":true,"schema":{"type":"integer","title":"Layer Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/geoserver/gwc/service/wmts":{"get":{"tags":["wms-proxy"],"summary":"Proxy Wmts","description":"Proxy GeoWebCache WMTS GetTile to GeoServer.\n\nGWC's WMTS endpoint is workspace-independent (the LAYER param is\nfully-qualified, e.g. `dmr:foo`), so one proxy path serves every\ncached layer. Same transparent-tile-on-error behaviour as the WMS\nproxy so MapLibre always gets a decodable tile.","operationId":"proxy_wmts_api_geoserver_gwc_service_wmts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/geoserver/{workspace}/wms":{"get":{"tags":["wms-proxy"],"summary":"Proxy Wms","description":"Proxy WMS requests to GeoServer to avoid CORS issues.","operationId":"proxy_wms_api_geoserver__workspace__wms_get","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","title":"Workspace"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gtiles/{maptype}/{z}/{x}/{y}":{"get":{"tags":["gtiles"],"summary":"Proxy Tile","operationId":"proxy_tile_api_gtiles__maptype___z___x___y__get","parameters":[{"name":"maptype","in":"path","required":true,"schema":{"type":"string","title":"Maptype"}},{"name":"z","in":"path","required":true,"schema":{"type":"integer","title":"Z"}},{"name":"x","in":"path","required":true,"schema":{"type":"integer","title":"X"}},{"name":"y","in":"path","required":true,"schema":{"type":"integer","title":"Y"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/places/search":{"get":{"tags":["places"],"summary":"Search Places","operationId":"search_places_api_places_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":200,"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"default":10,"title":"Limit"}},{"name":"lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Bias center latitude","title":"Lat"},"description":"Bias center latitude"},{"name":"lng","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Bias center longitude","title":"Lng"},"description":"Bias center longitude"},{"name":"radius","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50000,"minimum":100},{"type":"null"}],"description":"Bias radius in meters (≤ 50 km)","title":"Radius"},"description":"Bias radius in meters (≤ 50 km)"},{"name":"strict","in":"query","required":false,"schema":{"type":"boolean","description":"When true, drops results outside lat/lng/radius. Requires lat+lng+radius to be set.","default":false,"title":"Strict"},"description":"When true, drops results outside lat/lng/radius. Requires lat+lng+radius to be set."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlacesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pois/by-subdistrict":{"get":{"tags":["pois"],"summary":"List Pois By Subdistrict","description":"List POIs in a subdistrict, optionally filtered by `poi_type`.\n\n`latitude`/`longitude` are required — rows missing coordinates are\nexcluded since they're useless for map rendering.","operationId":"list_pois_by_subdistrict_api_pois_by_subdistrict_get","parameters":[{"name":"subdistrict_code","in":"query","required":true,"schema":{"type":"integer","description":"ADMIN_ID3 / subdistrict_code","title":"Subdistrict Code"},"description":"ADMIN_ID3 / subdistrict_code"},{"name":"poi_type","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Filter by poi_type. May be repeated for multi-value (e.g. school, hospital, health_station).","title":"Poi Type"},"description":"Filter by poi_type. May be repeated for multi-value (e.g. school, hospital, health_station)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/POIListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sentinel/scenes":{"get":{"tags":["sentinel"],"summary":"List Scenes","description":"Sentinel-2 L2A acquisitions intersecting `bbox` between `start` and\n`end`, newest first, filtered to <= `max_cloud` % cloud.","operationId":"list_scenes_api_sentinel_scenes_get","parameters":[{"name":"bbox","in":"query","required":true,"schema":{"type":"string","description":"minLng,minLat,maxLng,maxLat (WGS84)","title":"Bbox"},"description":"minLng,minLat,maxLng,maxLat (WGS84)"},{"name":"start","in":"query","required":true,"schema":{"type":"string","description":"Start date YYYY-MM-DD (inclusive)","title":"Start"},"description":"Start date YYYY-MM-DD (inclusive)"},{"name":"end","in":"query","required":true,"schema":{"type":"string","description":"End date YYYY-MM-DD (inclusive)","title":"End"},"description":"End date YYYY-MM-DD (inclusive)"},{"name":"max_cloud","in":"query","required":false,"schema":{"type":"number","maximum":100,"minimum":0,"description":"Max cloud cover %","default":100.0,"title":"Max Cloud"},"description":"Max cloud cover %"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SentinelScenesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sentinel/tiles/{z}/{x}/{y}":{"get":{"tags":["sentinel"],"summary":"Proxy Tile","description":"Render one XYZ tile for `id` via the internal TiTiler STAC reader.\n\nUses the scene's `visual` asset — Earth Search bakes a true-colour\n8-bit RGB COG, so no rescale or band expression is needed.","operationId":"proxy_tile_api_sentinel_tiles__z___x___y__get","parameters":[{"name":"z","in":"path","required":true,"schema":{"type":"integer","title":"Z"}},{"name":"x","in":"path","required":true,"schema":{"type":"integer","title":"X"}},{"name":"y","in":"path","required":true,"schema":{"type":"integer","title":"Y"}},{"name":"id","in":"query","required":true,"schema":{"type":"string","description":"Sentinel-2 scene id from /scenes","title":"Id"},"description":"Sentinel-2 scene id from /scenes"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ffgs/runs":{"get":{"tags":["ffgs"],"summary":"List Runs","description":"Recent cycles, newest first, with per-horizon valid_time + count.","operationId":"list_runs_api_ffgs_runs_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":400,"minimum":1,"default":12,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ffgs/warning":{"get":{"tags":["ffgs"],"summary":"Get Warning","description":"Sparse {subdistrict_code: flash_flood_category} for one\n(run, horizon). Subdistricts absent here = no warning (category 0).","operationId":"get_warning_api_ffgs_warning_get","parameters":[{"name":"run","in":"query","required":false,"schema":{"type":"string","description":"run_tag or 'latest'","default":"latest","title":"Run"},"description":"run_tag or 'latest'"},{"name":"horizon","in":"query","required":false,"schema":{"type":"string","default":"00","title":"Horizon"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WarningResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ffgs/legend":{"get":{"tags":["ffgs"],"summary":"Get Legend","description":"Category → Thai/English label + hex colour (drives map + legend).","operationId":"get_legend_api_ffgs_legend_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/ffgs/rasters":{"get":{"tags":["ffgs"],"summary":"List Rasters","description":"Published ratio rasters, parsed from storage_object. The frontend\nresolves one layer per (window, horizon) for the latest run and adds\nit through the existing /api/geoserver WMS proxy.","operationId":"list_rasters_api_ffgs_rasters_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RatioResponse"}}}}}}},"/api/villages":{"get":{"tags":["villages"],"summary":"List Villages","description":"Return villages in a subdistrict as a GeoJSON FeatureCollection.","operationId":"list_villages_api_villages_get","parameters":[{"name":"subdistrict_code","in":"query","required":true,"schema":{"type":"integer","description":"6-digit subdistrict code (matches admin_id3 / subdistrict_code)","title":"Subdistrict Code"},"description":"6-digit subdistrict code (matches admin_id3 / subdistrict_code)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Villages Api Villages Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tiles/{dataset}/tilejson":{"get":{"tags":["tiles"],"summary":"Get Tilejson","operationId":"get_tilejson_api_tiles__dataset__tilejson_get","parameters":[{"name":"dataset","in":"path","required":true,"schema":{"type":"string","title":"Dataset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tiles/{dataset}/{z}/{x}/{y}.pbf":{"get":{"tags":["tiles"],"summary":"Get Tile","operationId":"get_tile_api_tiles__dataset___z___x___y__pbf_get","parameters":[{"name":"dataset","in":"path","required":true,"schema":{"type":"string","title":"Dataset"}},{"name":"z","in":"path","required":true,"schema":{"type":"integer","title":"Z"}},{"name":"x","in":"path","required":true,"schema":{"type":"integer","title":"X"}},{"name":"y","in":"path","required":true,"schema":{"type":"integer","title":"Y"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/risk-stats/{admin_id3}":{"get":{"tags":["risk-stats"],"summary":"Get Risk Stats","description":"Get landslide susceptibility and risk area stats for a subdistrict.","operationId":"get_risk_stats_api_risk_stats__admin_id3__get","parameters":[{"name":"admin_id3","in":"path","required":true,"schema":{"type":"string","title":"Admin Id3"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskStatResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/subdistrict-stats/{admin_id3}":{"get":{"tags":["subdistrict-stats"],"summary":"Get Subdistrict Stats","description":"Return DMR demographic + exposure indicators for one subdistrict.","operationId":"get_subdistrict_stats_api_subdistrict_stats__admin_id3__get","parameters":[{"name":"admin_id3","in":"path","required":true,"schema":{"type":"string","title":"Admin Id3"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubdistrictStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/geohazard/{admin_id3}":{"get":{"tags":["geohazard"],"summary":"Get Geohazard Events","operationId":"get_geohazard_events_api_geohazard__admin_id3__get","parameters":[{"name":"admin_id3","in":"path","required":true,"schema":{"type":"string","title":"Admin Id3"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeohazardEventsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/area/{admin_id3}/resources":{"get":{"tags":["area-resources"],"summary":"Get Area Resources","operationId":"get_area_resources_api_area__admin_id3__resources_get","parameters":[{"name":"admin_id3","in":"path","required":true,"schema":{"type":"string","title":"Admin Id3"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AreaResourcesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/usage/events":{"post":{"tags":["usage"],"summary":"Record Usage Event","description":"Record a usage event (page view, etc.). Auth is optional — if a\nbearer token is present we attach the user_id so the stats dashboard\ncan distinguish logged-in users from anonymous visitors.","operationId":"record_usage_event_api_usage_events_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageEventCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/usage/stats":{"get":{"tags":["usage"],"summary":"Get Usage Stats","description":"Get aggregated usage statistics. TODO: restrict to admin.","operationId":"get_usage_stats_api_usage_stats_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/usage/dashboard":{"get":{"tags":["usage"],"summary":"Get Usage Dashboard","description":"Statistics for /manage/statistics: summary cards, grouped buckets,\ndevice split, and online-now count. Events are page_view entries from\nusage_event. Logged-in vs. guest comes from user_id being NULL or not.","operationId":"get_usage_dashboard_api_usage_dashboard_get","parameters":[{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"YYYY-MM-DD","title":"Date From"},"description":"YYYY-MM-DD"},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"YYYY-MM-DD inclusive","title":"Date To"},"description":"YYYY-MM-DD inclusive"},{"name":"group_by","in":"query","required":false,"schema":{"enum":["date","month","year"],"type":"string","default":"date","title":"Group By"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Usage Dashboard Api Usage Dashboard Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/api-keys":{"get":{"tags":["api-keys"],"summary":"List Api Keys","description":"List current user's API keys.","operationId":"list_api_keys_api_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ApiKeyResponse"},"type":"array","title":"Response List Api Keys Api Api Keys Get"}}}}}},"post":{"tags":["api-keys"],"summary":"Create Api Key","description":"Create a new API key. The full key is returned only once.","operationId":"create_api_key_api_api_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/api-keys/{key_id}":{"delete":{"tags":["api-keys"],"summary":"Revoke Api Key","description":"Revoke an API key.","operationId":"revoke_api_key_api_api_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/api-keys/{key_id}/usage":{"get":{"tags":["api-keys"],"summary":"Get Api Key Usage","description":"Get usage stats for a specific API key.","operationId":"get_api_key_usage_api_api_keys__key_id__usage_get","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyUsageStats"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dmr-stations":{"get":{"tags":["dmr-stations"],"summary":"List Stations","operationId":"list_stations_api_dmr_stations_get","parameters":[{"name":"province_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Province Code"}},{"name":"equipment","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Equipment"}},{"name":"include_unpublished","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Unpublished"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Stations Api Dmr Stations Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["dmr-stations"],"summary":"Register Station","operationId":"register_station_api_dmr_stations_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterStationRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Register Station Api Dmr Stations Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dmr-stations/_meta/metrics":{"get":{"tags":["dmr-stations"],"summary":"List Metrics","operationId":"list_metrics_api_dmr_stations__meta_metrics_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Metrics Api Dmr Stations  Meta Metrics Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dmr-stations/{station_id}":{"get":{"tags":["dmr-stations"],"summary":"Get Station","operationId":"get_station_api_dmr_stations__station_id__get","parameters":[{"name":"station_id","in":"path","required":true,"schema":{"type":"string","title":"Station Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Station Api Dmr Stations  Station Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["dmr-stations"],"summary":"Update Station","operationId":"update_station_api_dmr_stations__station_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"station_id","in":"path","required":true,"schema":{"type":"string","title":"Station Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateStationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Station Api Dmr Stations  Station Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["dmr-stations"],"summary":"Unregister Station","operationId":"unregister_station_api_dmr_stations__station_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"station_id","in":"path","required":true,"schema":{"type":"string","title":"Station Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dmr-stations/{station_id}/live":{"get":{"tags":["dmr-stations"],"summary":"Get Station Live","operationId":"get_station_live_api_dmr_stations__station_id__live_get","parameters":[{"name":"station_id","in":"path","required":true,"schema":{"type":"string","title":"Station Id"}},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Refresh"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Station Live Api Dmr Stations  Station Id  Live Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dmr-stations/_admin/available":{"get":{"tags":["dmr-stations"],"summary":"List Available Stations","description":"Fetches the DMR site's full station list for the registration dropdown.","operationId":"list_available_stations_api_dmr_stations__admin_available_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"only_unregistered","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Only Unregistered"}},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Refresh"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Available Stations Api Dmr Stations  Admin Available Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dmr-stations/{station_id}/parameter-config":{"put":{"tags":["dmr-stations"],"summary":"Set Parameter Config","operationId":"set_parameter_config_api_dmr_stations__station_id__parameter_config_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"station_id","in":"path","required":true,"schema":{"type":"string","title":"Station Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParameterConfigRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Parameter Config Api Dmr Stations  Station Id  Parameter Config Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gis-sources":{"get":{"tags":["gis-sources"],"summary":"List Sources","operationId":"list_sources_api_gis_sources_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response List Sources Api Gis Sources Get"}}}}}},"post":{"tags":["gis-sources"],"summary":"Create Source","operationId":"create_source_api_gis_sources_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSourceRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Source Api Gis Sources Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/gis-sources/{code}":{"get":{"tags":["gis-sources"],"summary":"Get Source","operationId":"get_source_api_gis_sources__code__get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Source Api Gis Sources  Code  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["gis-sources"],"summary":"Update Source","operationId":"update_source_api_gis_sources__code__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSourceRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Source Api Gis Sources  Code  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["gis-sources"],"summary":"Delete Source","operationId":"delete_source_api_gis_sources__code__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gis-sources/{code}/probe":{"get":{"tags":["gis-sources"],"summary":"Probe Source","description":"Fetch basic metadata from the upstream ArcGIS service (`?f=json`) and a\ncheap record count. Used by the admin UI to verify a source is reachable.","operationId":"probe_source_api_gis_sources__code__probe_get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Probe Source Api Gis Sources  Code  Probe Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gis-sources/{code}/sync":{"post":{"tags":["gis-sources"],"summary":"Sync Source","operationId":"sync_source_api_gis_sources__code__sync_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}},{"name":"max_features","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Features"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Sync Source Api Gis Sources  Code  Sync Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gis-sources/{code}/geojson":{"get":{"tags":["gis-sources"],"summary":"Features As Geojson","description":"Serve stored features as GeoJSON. Polygons/lines are simplified by\ndefault (~100 m tolerance) so a country-scale overlay ships at a size\nthe browser can actually render — otherwise a single layer with chunky\npolygons can OOM the tab. Client can override via `simplify=0` for\nfull-fidelity exports.","operationId":"features_as_geojson_api_gis_sources__code__geojson_get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}},{"name":"bbox","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bbox"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":5000,"title":"Limit"}},{"name":"simplify","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Simplify"}},{"name":"full_attrs","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Full Attrs"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Features As Geojson Api Gis Sources  Code  Geojson Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/ldap-login":{"post":{"tags":["auth"],"summary":"Ldap Login","description":"Authenticate DMR staff via LDAP / Active Directory.","operationId":"ldap_login_api_auth_ldap_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/login":{"post":{"tags":["auth"],"summary":"Login","description":"Authenticate local (public) user by username/password.","operationId":"login_api_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/register":{"post":{"tags":["auth"],"summary":"Register","description":"Register a new public user account.","operationId":"register_api_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","operationId":"logout_api_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/auth/me":{"get":{"tags":["auth"],"summary":"Get Me","operationId":"get_me_api_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}}},"security":[{"HTTPBearer":[]}]},"patch":{"tags":["auth"],"summary":"Update Me","description":"Self-service profile update. Users can edit their own display name,\nemail, and organization — but NOT role, is_active, or username. Role\nchanges go through the admin users endpoint.","operationId":"update_me_api_auth_me_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SelfUpdateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/auth/ldap-health":{"get":{"tags":["auth"],"summary":"Ldap Health","description":"Admin diagnostic — TCP-opens the configured LDAP host. Used by\nthe admin UI to verify DMR AD reachability without faking a login.","operationId":"ldap_health_api_auth_ldap_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Ldap Health Api Auth Ldap Health Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/auth/refresh":{"post":{"tags":["auth"],"summary":"Refresh Token","operationId":"refresh_token_api_auth_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/users":{"get":{"tags":["users"],"summary":"List Users","operationId":"list_users_api_users_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Page Size"}},{"name":"role","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"}},{"name":"is_active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["users"],"summary":"Create User","operationId":"create_user_api_users_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/users/{user_id}":{"get":{"tags":["users"],"summary":"Get User","operationId":"get_user_api_users__user_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["users"],"summary":"Update User","operationId":"update_user_api_users__user_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["users"],"summary":"Deactivate User","description":"Soft-delete: flip is_active off and revoke active sessions.","operationId":"deactivate_user_api_users__user_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/users/{user_id}/revoke-sessions":{"post":{"tags":["users"],"summary":"Revoke Sessions","description":"Kill all active sessions for a user (they'll need to log in again).","operationId":"revoke_sessions_api_users__user_id__revoke_sessions_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/data-sources":{"get":{"tags":["data-sources"],"summary":"List Data Sources","description":"Catalog of data sources merged with derived live status.","operationId":"list_data_sources_api_data_sources_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/DataSourceResponse"},"type":"array","title":"Response List Data Sources Api Data Sources Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/data-sources/{code}/products":{"get":{"tags":["data-sources"],"summary":"List Data Products","description":"Recent files (storage_object rows) for a given data source.","operationId":"list_data_products_api_data_sources__code__products_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DataProductResponse"},"title":"Response List Data Products Api Data Sources  Code  Products Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pipelines":{"get":{"tags":["pipelines"],"summary":"List Pipelines","description":"All pipeline definitions, each with last-run summary + recent counters.","operationId":"list_pipelines_api_pipelines_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"stage","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by stage (e.g. 'ingest', 'process')","title":"Stage"},"description":"Filter by stage (e.g. 'ingest', 'process')"},{"name":"active_only","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Active Only"}},{"name":"recent_window_hours","in":"query","required":false,"schema":{"type":"integer","maximum":720,"minimum":1,"default":72,"title":"Recent Window Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PipelineSummaryResponse"},"title":"Response List Pipelines Api Pipelines Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pipelines/{code}/runs":{"get":{"tags":["pipelines"],"summary":"List Pipeline Runs","description":"Recent runs for a single pipeline (newest first).","operationId":"list_pipeline_runs_api_pipelines__code__runs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PipelineRunSummary"},"title":"Response List Pipeline Runs Api Pipelines  Code  Runs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/weather/layers":{"get":{"tags":["weather"],"summary":"List Weather Layers","description":"Return all currently-published TMD/HII/IMERG layers, grouped by\nsource. Each item carries the data needed to render it as a WMS\noverlay.","operationId":"list_weather_layers_api_weather_layers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/rainfall/province-summary":{"get":{"tags":["rainfall"],"summary":"Get Province Rainfall","operationId":"get_province_rainfall_api_rainfall_province_summary_get","parameters":[{"name":"source","in":"query","required":false,"schema":{"type":"string","pattern":"^(TMD|HII|IMERG)$","default":"HII","title":"Source"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvinceRainResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rainfall/subdistrict/{admin_id3}":{"get":{"tags":["rainfall"],"summary":"Get Subdistrict Rainfall","operationId":"get_subdistrict_rainfall_api_rainfall_subdistrict__admin_id3__get","parameters":[{"name":"admin_id3","in":"path","required":true,"schema":{"type":"string","title":"Admin Id3"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubdistrictRainResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rainfall/area-summary":{"get":{"tags":["rainfall"],"summary":"Get Area Rainfall","operationId":"get_area_rainfall_api_rainfall_area_summary_get","parameters":[{"name":"province","in":"query","required":true,"schema":{"type":"string","description":"Province name_th","title":"Province"},"description":"Province name_th"},{"name":"district","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"District name_th → subdistrict rows","title":"District"},"description":"District name_th → subdistrict rows"},{"name":"source","in":"query","required":false,"schema":{"type":"string","pattern":"^(TMD|HII|IMERG)$","default":"TMD","title":"Source"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AreaRainResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rainfall/subdistrict-accum":{"get":{"tags":["rainfall"],"summary":"Subdistrict Accum","operationId":"subdistrict_accum_api_rainfall_subdistrict_accum_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubdistrictAccumResponse"}}}}}}},"/api/risk/layers":{"get":{"tags":["risk-layers"],"summary":"List Risk Layers","description":"Return all currently-published landslide risk layers, grouped by\nsource. Each item carries the data needed to render it as a WMS\noverlay.","operationId":"list_risk_layers_api_risk_layers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/risk-watch/province-areas":{"get":{"tags":["risk-watch"],"summary":"List Province Areas","description":"Per-province per-class km² for the requested forecast period.\n\nReads the Data Mart materialized view `mv_risk_province_area` (TOR 5.3.2.2)\n— the province roll-up is pre-aggregated by `mart_refresh`, so this is a\nflat lookup instead of a per-request SUM. Cached in Redis (in-memory tier).","operationId":"list_province_areas_api_risk_watch_province_areas_get","parameters":[{"name":"period","in":"query","required":false,"schema":{"type":"string","pattern":"^(now|1d|3d)$","default":"now","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvinceAreasResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/risk-watch/province-detail":{"get":{"tags":["risk-watch"],"summary":"Province Detail","description":"Return districts + subdistricts for one province with the per-class\nkm² breakdown — drives the /overview/[province] drill-down page.","operationId":"province_detail_api_risk_watch_province_detail_get","parameters":[{"name":"province","in":"query","required":true,"schema":{"type":"string","description":"Thai province name (e.g. นครสวรรค์)","title":"Province"},"description":"Thai province name (e.g. นครสวรรค์)"},{"name":"period","in":"query","required":false,"schema":{"type":"string","pattern":"^(now|1d|3d)$","default":"now","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvinceDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/risk-watch/province-counts":{"get":{"tags":["risk-watch"],"summary":"Province Counts","description":"Per-province counts of at-risk districts / subdistricts.\n\n\"At risk\" = any class ≥ 3 (moderate+) area in the subdistrict — the same\nเสี่ยง = ปานกลางขึ้นไป convention as lib/live-risk.ts pct. Drives the\nsituation-overview report table (replaces the old mock counts).","operationId":"province_counts_api_risk_watch_province_counts_get","parameters":[{"name":"period","in":"query","required":false,"schema":{"type":"string","pattern":"^(now|1d|3d)$","default":"now","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvinceCountsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/risk-watch/areas":{"get":{"tags":["risk-watch"],"summary":"List Risk Watch Areas","operationId":"list_risk_watch_areas_api_risk_watch_areas_get","parameters":[{"name":"period","in":"query","required":false,"schema":{"type":"string","pattern":"^(now|1d|3d)$","default":"now","title":"Period"}},{"name":"as_of","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}],"description":"Past date → summary from the hindcast history (risk_assessment) instead of the live stats","title":"As Of"},"description":"Past date → summary from the hindcast history (risk_assessment) instead of the live stats"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskWatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/risk-watch/subdistrict-classes":{"get":{"tags":["risk-watch"],"summary":"Subdistrict Classes","description":"{adminId3: class} for every subdistrict — drives the /overview and\n/map tambon choropleths. Class semantics match the pixel map:\nworst-pixel class per tambon; null = no rain-threshold coverage\n(render transparent, never as safe).\n\nDefault: the LATEST live risk run. With ?as_of=YYYY-MM-DD: that day's\nNEWEST batch (hindcast before go-live, live history after), always\nthe risk_now view — historical days have no meaningful forecast.","operationId":"subdistrict_classes_api_risk_watch_subdistrict_classes_get","parameters":[{"name":"period","in":"query","required":false,"schema":{"type":"string","pattern":"^(now|1d|3d)$","default":"now","title":"Period"}},{"name":"as_of","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}],"description":"Historical date (YYYY-MM-DD) → that day's newest batch","title":"As Of"},"description":"Historical date (YYYY-MM-DD) → that day's newest batch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubdistrictClassesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"summary":"Root","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AlertFeedResponse":{"properties":{"generated_at":{"type":"string","title":"Generated At"},"items":{"items":{"$ref":"#/components/schemas/AlertItem"},"type":"array","title":"Items"}},"type":"object","required":["generated_at","items"],"title":"AlertFeedResponse"},"AlertItem":{"properties":{"id":{"type":"string","title":"Id"},"type":{"type":"string","title":"Type"},"province":{"type":"string","title":"Province"},"severity":{"type":"string","title":"Severity"},"title":{"type":"string","title":"Title"},"message":{"type":"string","title":"Message"},"value":{"type":"number","title":"Value"},"threshold":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Threshold"},"period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period"},"as_of":{"type":"string","title":"As Of"}},"type":"object","required":["id","type","province","severity","title","message","value","as_of"],"title":"AlertItem"},"AlertPrefs":{"properties":{"provinces":{"items":{"type":"string"},"type":"array","title":"Provinces"},"notify_risk":{"type":"boolean","title":"Notify Risk","default":true},"notify_rain":{"type":"boolean","title":"Notify Rain","default":true},"rain_threshold_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rain Threshold Mm"},"rain_window":{"type":"string","pattern":"^(today|cum3d)$","title":"Rain Window","default":"cum3d"},"web_notify":{"type":"boolean","title":"Web Notify","default":true}},"type":"object","title":"AlertPrefs"},"ApiKeyCreate":{"properties":{"name":{"type":"string","title":"Name"}},"type":"object","required":["name"],"title":"ApiKeyCreate"},"ApiKeyCreatedResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"status":{"type":"string","title":"Status"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"full_key":{"type":"string","title":"Full Key"}},"type":"object","required":["id","name","key_prefix","status","last_used_at","created_at","full_key"],"title":"ApiKeyCreatedResponse","description":"Returned only on creation — includes the full key (shown once)."},"ApiKeyResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"status":{"type":"string","title":"Status"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","key_prefix","status","last_used_at","created_at"],"title":"ApiKeyResponse"},"ApiKeyUsageStats":{"properties":{"api_key_id":{"type":"integer","title":"Api Key Id"},"name":{"type":"string","title":"Name"},"total_calls":{"type":"integer","title":"Total Calls"},"calls_today":{"type":"integer","title":"Calls Today"},"calls_this_month":{"type":"integer","title":"Calls This Month"}},"type":"object","required":["api_key_id","name","total_calls","calls_today","calls_this_month"],"title":"ApiKeyUsageStats"},"AreaRainResponse":{"properties":{"level":{"type":"string","title":"Level"},"source":{"type":"string","title":"Source"},"rows":{"items":{"$ref":"#/components/schemas/AreaRainRow"},"type":"array","title":"Rows"}},"type":"object","required":["level","source","rows"],"title":"AreaRainResponse"},"AreaRainRow":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"today_mm":{"type":"number","title":"Today Mm"},"cum3d_mm":{"type":"number","title":"Cum3D Mm"}},"type":"object","required":["code","name","today_mm","cum3d_mm"],"title":"AreaRainRow"},"AreaResourcesResponse":{"properties":{"admin_id3":{"type":"string","title":"Admin Id3"},"stations":{"type":"integer","title":"Stations"},"network_nodes":{"type":"integer","title":"Network Nodes"},"safe_points":{"type":"integer","title":"Safe Points"},"risk_villages":{"type":"integer","title":"Risk Villages"},"evac_routes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Evac Routes"},"schools":{"type":"integer","title":"Schools"},"hospitals":{"type":"integer","title":"Hospitals"},"health_stations":{"type":"integer","title":"Health Stations"},"temples":{"type":"integer","title":"Temples"},"safe_point_list":{"items":{"$ref":"#/components/schemas/SafePoint"},"type":"array","title":"Safe Point List"},"risk_village_list":{"items":{"$ref":"#/components/schemas/RiskVillage"},"type":"array","title":"Risk Village List"}},"type":"object","required":["admin_id3","stations","network_nodes","safe_points","risk_villages","evac_routes","schools","hospitals","health_stations","temples","safe_point_list","risk_village_list"],"title":"AreaResourcesResponse"},"AuthUserResponse":{"properties":{"id":{"type":"integer","title":"Id"},"username":{"type":"string","title":"Username"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"role":{"type":"string","title":"Role"},"auth_provider":{"type":"string","title":"Auth Provider"}},"type":"object","required":["id","username","role","auth_provider"],"title":"AuthUserResponse","description":"Returned alongside token on login/register."},"ClassAreas":{"properties":{"class1_km2":{"type":"number","title":"Class1 Km2"},"class2_km2":{"type":"number","title":"Class2 Km2"},"class3_km2":{"type":"number","title":"Class3 Km2"},"class4_km2":{"type":"number","title":"Class4 Km2"},"class5_km2":{"type":"number","title":"Class5 Km2"},"total_km2":{"type":"number","title":"Total Km2"}},"type":"object","required":["class1_km2","class2_km2","class3_km2","class4_km2","class5_km2","total_km2"],"title":"ClassAreas"},"CreateSourceRequest":{"properties":{"source_code":{"type":"string","maxLength":40,"minLength":2,"title":"Source Code"},"name_th":{"type":"string","title":"Name Th"},"name_en":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name En"},"service_url":{"type":"string","title":"Service Url"},"service_type":{"type":"string","enum":["ARCGIS_MS","ARCGIS_FS","WMS","WFS","OTHER"],"title":"Service Type","default":"ARCGIS_MS"},"layer_id":{"type":"integer","title":"Layer Id","default":0},"geometry_type":{"anyOf":[{"type":"string","enum":["POINT","LINE","POLYGON"]},{"type":"null"}],"title":"Geometry Type"},"target_table":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Table"},"schedule_cron":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule Cron"},"group_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Group Id"},"default_visible":{"type":"boolean","title":"Default Visible","default":false},"visibility":{"type":"string","enum":["public","logged","staff","admin"],"title":"Visibility","default":"public"}},"type":"object","required":["source_code","name_th","service_url"],"title":"CreateSourceRequest"},"DailyCount":{"properties":{"date":{"type":"string","title":"Date"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["date","count"],"title":"DailyCount"},"DataProductResponse":{"properties":{"id":{"type":"integer","title":"Id"},"source_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Code"},"object_key":{"type":"string","title":"Object Key"},"bucket":{"type":"string","title":"Bucket"},"object_type":{"type":"string","title":"Object Type"},"file_size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"File Size Bytes"},"run_tag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Run Tag"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","object_key","bucket","object_type","created_at"],"title":"DataProductResponse","description":"A single dataset/file produced for a data source."},"DataSourceResponse":{"properties":{"code":{"type":"string","title":"Code"},"name_th":{"type":"string","title":"Name Th"},"name_en":{"type":"string","title":"Name En"},"source_type":{"type":"string","title":"Source Type"},"api_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_active":{"type":"boolean","title":"Is Active"},"status":{"type":"string","title":"Status"},"last_success_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Success At"},"last_failure_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Failure At"},"latency_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Latency Ms"},"records_received":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Records Received"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"checked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Checked At"}},"type":"object","required":["code","name_th","name_en","source_type","is_active","status"],"title":"DataSourceResponse","description":"A single data-source row (catalog entry merged with derived live status)."},"DistrictDetail":{"properties":{"district":{"type":"string","title":"District"},"areas":{"$ref":"#/components/schemas/ClassAreas"},"subdistricts":{"items":{"$ref":"#/components/schemas/SubdistrictDetail"},"type":"array","title":"Subdistricts"}},"type":"object","required":["district","areas","subdistricts"],"title":"DistrictDetail"},"GeohazardEventResponse":{"properties":{"id":{"type":"integer","title":"Id"},"event_id":{"type":"string","title":"Event Id"},"geohaz_type_th":{"type":"string","title":"Geohaz Type Th"},"geohaz_type_en":{"type":"string","title":"Geohaz Type En"},"event_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Date"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"depth_km":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Depth Km"},"effect":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Effect"}},"type":"object","required":["id","event_id","geohaz_type_th","geohaz_type_en","event_date","latitude","longitude","depth_km","effect"],"title":"GeohazardEventResponse"},"GeohazardEventsResponse":{"properties":{"admin_id3":{"type":"string","title":"Admin Id3"},"events":{"items":{"$ref":"#/components/schemas/GeohazardEventResponse"},"type":"array","title":"Events"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["admin_id3","events","total"],"title":"GeohazardEventsResponse"},"GeoserverLayerCreate":{"properties":{"workspace":{"type":"string","title":"Workspace","default":"dmr"},"layer_name":{"type":"string","title":"Layer Name"},"layer_type":{"type":"string","title":"Layer Type","default":"VECTOR"},"name_th":{"type":"string","title":"Name Th"},"name_en":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name En"},"group_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Group Id"},"srs":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Srs"},"style_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Style Name"},"bbox_json":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bbox Json"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"},"default_visible":{"type":"boolean","title":"Default Visible","default":false},"default_opacity":{"type":"integer","title":"Default Opacity","default":100},"has_info":{"type":"boolean","title":"Has Info","default":true},"visibility":{"type":"string","title":"Visibility","default":"public"},"is_active":{"type":"boolean","title":"Is Active","default":true},"data_source_kind":{"type":"string","title":"Data Source Kind","default":"FILE_UPLOAD"},"source_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Ref"}},"type":"object","required":["layer_name","name_th"],"title":"GeoserverLayerCreate"},"GeoserverLayerResponse":{"properties":{"id":{"type":"integer","title":"Id"},"workspace":{"type":"string","title":"Workspace"},"layer_name":{"type":"string","title":"Layer Name"},"wms_layer_name":{"type":"string","title":"Wms Layer Name"},"layer_type":{"type":"string","title":"Layer Type"},"srs":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Srs"},"style_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Style Name"},"wms_url":{"type":"string","title":"Wms Url"},"serve_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Serve Url"},"name_th":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Th"},"name_en":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name En"},"sort_order":{"type":"integer","title":"Sort Order","default":0},"default_visible":{"type":"boolean","title":"Default Visible","default":false},"default_opacity":{"type":"integer","title":"Default Opacity","default":100},"legends":{"items":{"$ref":"#/components/schemas/LegendItem"},"type":"array","title":"Legends","default":[]},"has_info":{"type":"boolean","title":"Has Info","default":false},"visibility":{"type":"string","title":"Visibility","default":"public"},"is_active":{"type":"boolean","title":"Is Active","default":true},"group_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Group Id"},"data_source_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Data Source Kind"},"source_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Ref"},"last_refreshed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Refreshed At"},"refresh_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Status"}},"type":"object","required":["id","workspace","layer_name","wms_layer_name","layer_type","wms_url"],"title":"GeoserverLayerResponse"},"GeoserverLayerUpdate":{"properties":{"name_th":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Th"},"name_en":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name En"},"group_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Group Id"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"},"default_visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Default Visible"},"default_opacity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Default Opacity"},"visibility":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Visibility"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"workspace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace"},"layer_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Layer Name"},"layer_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Layer Type"},"srs":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Srs"},"style_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Style Name"},"bbox_json":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bbox Json"},"has_info":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Info"},"data_source_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Data Source Kind"},"source_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Ref"}},"type":"object","title":"GeoserverLayerUpdate"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HorizonInfo":{"properties":{"horizon":{"type":"string","title":"Horizon"},"valid_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Valid Time"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["horizon","valid_time","count"],"title":"HorizonInfo"},"LayerGroupCreate":{"properties":{"code":{"type":"string","title":"Code"},"name_th":{"type":"string","title":"Name Th"},"name_en":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name En"},"category":{"type":"string","title":"Category","default":"STATIC"},"selection_mode":{"type":"string","title":"Selection Mode","default":"multiple"},"default_expanded":{"type":"boolean","title":"Default Expanded","default":false},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","required":["code","name_th"],"title":"LayerGroupCreate"},"LayerGroupReorder":{"properties":{"ordered_ids":{"items":{"type":"integer"},"type":"array","title":"Ordered Ids"}},"type":"object","required":["ordered_ids"],"title":"LayerGroupReorder"},"LayerGroupResponse":{"properties":{"id":{"type":"integer","title":"Id"},"code":{"type":"string","title":"Code"},"name_th":{"type":"string","title":"Name Th"},"name_en":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name En"},"sort_order":{"type":"integer","title":"Sort Order"},"default_expanded":{"type":"boolean","title":"Default Expanded","default":false},"selection_mode":{"type":"string","title":"Selection Mode","default":"multiple"},"category":{"type":"string","title":"Category","default":"STATIC"},"is_active":{"type":"boolean","title":"Is Active","default":true},"layers":{"items":{"$ref":"#/components/schemas/GeoserverLayerResponse"},"type":"array","title":"Layers","default":[]}},"type":"object","required":["id","code","name_th","sort_order"],"title":"LayerGroupResponse"},"LayerGroupUpdate":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"name_th":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Th"},"name_en":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name En"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"selection_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Selection Mode"},"default_expanded":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Default Expanded"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"LayerGroupUpdate"},"LegendItem":{"properties":{"color":{"type":"string","title":"Color"},"label":{"type":"string","title":"Label"}},"type":"object","required":["color","label"],"title":"LegendItem"},"LoginRequest":{"properties":{"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"}},"type":"object","required":["username","password"],"title":"LoginRequest"},"LoginResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"user":{"$ref":"#/components/schemas/AuthUserResponse"}},"type":"object","required":["access_token","user"],"title":"LoginResponse"},"MessageResponse":{"properties":{"message":{"type":"string","title":"Message"}},"type":"object","required":["message"],"title":"MessageResponse"},"POIItem":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"poi_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Poi Type"},"subdistrict_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Subdistrict Code"},"latitude":{"type":"number","title":"Latitude"},"longitude":{"type":"number","title":"Longitude"}},"type":"object","required":["id","name","poi_type","subdistrict_code","latitude","longitude"],"title":"POIItem"},"POIListResponse":{"properties":{"subdistrict_code":{"type":"integer","title":"Subdistrict Code"},"items":{"items":{"$ref":"#/components/schemas/POIItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["subdistrict_code","items","total"],"title":"POIListResponse"},"PageViewCount":{"properties":{"page_path":{"type":"string","title":"Page Path"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["page_path","count"],"title":"PageViewCount"},"ParameterConfigItem":{"properties":{"metric_code":{"type":"string","title":"Metric Code"},"is_visible":{"type":"boolean","title":"Is Visible","default":true},"display_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Label"},"sort_order":{"type":"integer","title":"Sort Order","default":100}},"type":"object","required":["metric_code"],"title":"ParameterConfigItem"},"ParameterConfigRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ParameterConfigItem"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"ParameterConfigRequest"},"PipelineRunSummary":{"properties":{"id":{"type":"integer","title":"Id"},"status":{"type":"string","title":"Status"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"records_processed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Records Processed"},"records_failed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Records Failed"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms"},"fallback_used":{"type":"boolean","title":"Fallback Used","default":false},"fallback_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Source"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"}},"type":"object","required":["id","status","started_at"],"title":"PipelineRunSummary"},"PipelineSummaryResponse":{"properties":{"id":{"type":"integer","title":"Id"},"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"stage":{"type":"string","title":"Stage"},"source_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Type"},"schedule_cron":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule Cron"},"server_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Server Role"},"output_bucket":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Bucket"},"output_prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Prefix"},"is_active":{"type":"boolean","title":"Is Active"},"fallback_pipeline_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fallback Pipeline Id"},"last_run":{"anyOf":[{"$ref":"#/components/schemas/PipelineRunSummary"},{"type":"null"}]},"recent_run_count":{"type":"integer","title":"Recent Run Count","default":0},"recent_success_count":{"type":"integer","title":"Recent Success Count","default":0}},"type":"object","required":["id","code","name","stage","is_active"],"title":"PipelineSummaryResponse"},"PlaceResult":{"properties":{"place_id":{"type":"string","title":"Place Id"},"name":{"type":"string","title":"Name"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"lat":{"type":"number","title":"Lat"},"lng":{"type":"number","title":"Lng"},"types":{"items":{"type":"string"},"type":"array","title":"Types","default":[]},"rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rating"}},"type":"object","required":["place_id","name","lat","lng"],"title":"PlaceResult","description":"Normalized place. Coordinates are WGS84 (EPSG:4326)."},"PlacesResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/PlaceResult"},"type":"array","title":"Results"}},"type":"object","required":["results"],"title":"PlacesResponse"},"ProvinceAreaRow":{"properties":{"province":{"type":"string","title":"Province"},"class1_km2":{"type":"number","title":"Class1 Km2"},"class2_km2":{"type":"number","title":"Class2 Km2"},"class3_km2":{"type":"number","title":"Class3 Km2"},"class4_km2":{"type":"number","title":"Class4 Km2"},"class5_km2":{"type":"number","title":"Class5 Km2"},"total_km2":{"type":"number","title":"Total Km2"}},"type":"object","required":["province","class1_km2","class2_km2","class3_km2","class4_km2","class5_km2","total_km2"],"title":"ProvinceAreaRow"},"ProvinceAreasResponse":{"properties":{"period":{"type":"string","title":"Period"},"provinces":{"items":{"$ref":"#/components/schemas/ProvinceAreaRow"},"type":"array","title":"Provinces"}},"type":"object","required":["period","provinces"],"title":"ProvinceAreasResponse"},"ProvinceCountRow":{"properties":{"province":{"type":"string","title":"Province"},"at_risk_districts":{"type":"integer","title":"At Risk Districts"},"at_risk_subdistricts":{"type":"integer","title":"At Risk Subdistricts"}},"type":"object","required":["province","at_risk_districts","at_risk_subdistricts"],"title":"ProvinceCountRow"},"ProvinceCountsResponse":{"properties":{"period":{"type":"string","title":"Period"},"provinces":{"items":{"$ref":"#/components/schemas/ProvinceCountRow"},"type":"array","title":"Provinces"}},"type":"object","required":["period","provinces"],"title":"ProvinceCountsResponse"},"ProvinceDetailResponse":{"properties":{"period":{"type":"string","title":"Period"},"province":{"type":"string","title":"Province"},"areas":{"$ref":"#/components/schemas/ClassAreas"},"districts":{"items":{"$ref":"#/components/schemas/DistrictDetail"},"type":"array","title":"Districts"}},"type":"object","required":["period","province","areas","districts"],"title":"ProvinceDetailResponse"},"ProvinceRainResponse":{"properties":{"source":{"type":"string","title":"Source"},"issued":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Issued"},"provinces":{"items":{"$ref":"#/components/schemas/ProvinceRainRow"},"type":"array","title":"Provinces"}},"type":"object","required":["source","issued","provinces"],"title":"ProvinceRainResponse"},"ProvinceRainRow":{"properties":{"province":{"type":"string","title":"Province"},"today_mm":{"type":"number","title":"Today Mm"},"cum3d_mm":{"type":"number","title":"Cum3D Mm"},"cum10d_mm":{"type":"number","title":"Cum10D Mm"}},"type":"object","required":["province","today_mm","cum3d_mm","cum10d_mm"],"title":"ProvinceRainRow"},"RatioLayer":{"properties":{"window":{"type":"string","title":"Window"},"horizon":{"type":"string","title":"Horizon"},"run_tag":{"type":"string","title":"Run Tag"},"valid_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Valid Time"},"wms_layer_name":{"type":"string","title":"Wms Layer Name"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["window","horizon","run_tag","valid_time","wms_layer_name","created_at"],"title":"RatioLayer"},"RatioResponse":{"properties":{"wms_url":{"type":"string","title":"Wms Url"},"workspace":{"type":"string","title":"Workspace"},"default_style":{"type":"string","title":"Default Style"},"latest_run":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Run"},"layers":{"items":{"$ref":"#/components/schemas/RatioLayer"},"type":"array","title":"Layers"}},"type":"object","required":["wms_url","workspace","default_style","latest_run","layers"],"title":"RatioResponse"},"RegisterRequest":{"properties":{"username":{"type":"string","title":"Username"},"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"},"display_name":{"type":"string","title":"Display Name"},"organization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization"}},"type":"object","required":["username","email","password","display_name"],"title":"RegisterRequest"},"RegisterStationRequest":{"properties":{"station_id":{"type":"string","maxLength":40,"minLength":3,"title":"Station Id"},"description_th":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description Th"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["station_id"],"title":"RegisterStationRequest"},"RiskStatForecast":{"properties":{"class1_very_low_km2":{"type":"number","title":"Class1 Very Low Km2","default":0.0},"class2_low_km2":{"type":"number","title":"Class2 Low Km2","default":0.0},"class3_moderate_km2":{"type":"number","title":"Class3 Moderate Km2","default":0.0},"class4_high_km2":{"type":"number","title":"Class4 High Km2","default":0.0},"class5_very_high_km2":{"type":"number","title":"Class5 Very High Km2","default":0.0},"total_area_km2":{"type":"number","title":"Total Area Km2","default":0.0}},"type":"object","title":"RiskStatForecast"},"RiskStatResponse":{"properties":{"admin_id3":{"type":"string","title":"Admin Id3"},"province_th":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Province Th"},"district_th":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"District Th"},"subdistrict_th":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subdistrict Th"},"susceptibility":{"anyOf":[{"$ref":"#/components/schemas/RiskStatForecast"},{"type":"null"}]},"forecasts":{"additionalProperties":{"$ref":"#/components/schemas/RiskStatForecast"},"type":"object","title":"Forecasts","default":{}}},"type":"object","required":["admin_id3"],"title":"RiskStatResponse"},"RiskVillage":{"properties":{"village":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Village"},"moo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Moo"},"risk_desc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Risk Desc"}},"type":"object","title":"RiskVillage"},"RiskWatchGroup":{"properties":{"level":{"type":"string","title":"Level"},"provinces":{"items":{"$ref":"#/components/schemas/RiskWatchProvince"},"type":"array","title":"Provinces"}},"type":"object","required":["level","provinces"],"title":"RiskWatchGroup"},"RiskWatchProvince":{"properties":{"province":{"type":"string","title":"Province"},"provinceRiskPercent":{"type":"number","title":"Provinceriskpercent"},"subdistricts":{"items":{"$ref":"#/components/schemas/RiskWatchSubdistrict"},"type":"array","title":"Subdistricts"}},"type":"object","required":["province","provinceRiskPercent","subdistricts"],"title":"RiskWatchProvince"},"RiskWatchResponse":{"properties":{"period":{"type":"string","title":"Period"},"groups":{"items":{"$ref":"#/components/schemas/RiskWatchGroup"},"type":"array","title":"Groups"}},"type":"object","required":["period","groups"],"title":"RiskWatchResponse"},"RiskWatchSubdistrict":{"properties":{"adminId3":{"type":"string","title":"Adminid3"},"name":{"type":"string","title":"Name"},"district":{"type":"string","title":"District"},"riskPercent":{"type":"number","title":"Riskpercent"}},"type":"object","required":["adminId3","name","district","riskPercent"],"title":"RiskWatchSubdistrict"},"RunInfo":{"properties":{"run_tag":{"type":"string","title":"Run Tag"},"horizons":{"items":{"$ref":"#/components/schemas/HorizonInfo"},"type":"array","title":"Horizons"}},"type":"object","required":["run_tag","horizons"],"title":"RunInfo"},"RunsResponse":{"properties":{"latest":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest"},"runs":{"items":{"$ref":"#/components/schemas/RunInfo"},"type":"array","title":"Runs"}},"type":"object","required":["latest","runs"],"title":"RunsResponse"},"SafePoint":{"properties":{"place":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Place"},"village":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Village"},"moo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Moo"}},"type":"object","title":"SafePoint"},"SelfUpdateRequest":{"properties":{"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"organization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization"}},"type":"object","title":"SelfUpdateRequest"},"SentinelScene":{"properties":{"id":{"type":"string","title":"Id"},"datetime":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Datetime"},"cloud_cover":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cloud Cover"},"thumbnail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail"},"tile_url":{"type":"string","title":"Tile Url"},"bbox":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Bbox"}},"type":"object","required":["id","datetime","cloud_cover","thumbnail","tile_url","bbox"],"title":"SentinelScene"},"SentinelScenesResponse":{"properties":{"total":{"type":"integer","title":"Total"},"scenes":{"items":{"$ref":"#/components/schemas/SentinelScene"},"type":"array","title":"Scenes"}},"type":"object","required":["total","scenes"],"title":"SentinelScenesResponse"},"SubdistrictAccumResponse":{"properties":{"as_of":{"type":"string","title":"As Of"},"items":{"additionalProperties":{"items":{"type":"number"},"type":"array"},"type":"object","title":"Items"}},"type":"object","required":["as_of","items"],"title":"SubdistrictAccumResponse"},"SubdistrictClassesResponse":{"properties":{"period":{"type":"string","title":"Period"},"process_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Process Time"},"classes":{"additionalProperties":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"object","title":"Classes"}},"type":"object","required":["period","process_time","classes"],"title":"SubdistrictClassesResponse"},"SubdistrictDetail":{"properties":{"adminId3":{"type":"string","title":"Adminid3"},"subdistrict":{"type":"string","title":"Subdistrict"},"areas":{"$ref":"#/components/schemas/ClassAreas"}},"type":"object","required":["adminId3","subdistrict","areas"],"title":"SubdistrictDetail"},"SubdistrictRainPoint":{"properties":{"label":{"type":"string","title":"Label"},"date":{"type":"string","title":"Date"},"daily":{"type":"number","title":"Daily"},"cumulative":{"type":"number","title":"Cumulative"},"forecast":{"type":"boolean","title":"Forecast"}},"type":"object","required":["label","date","daily","cumulative","forecast"],"title":"SubdistrictRainPoint"},"SubdistrictRainResponse":{"properties":{"admin_id3":{"type":"string","title":"Admin Id3"},"source_observed":{"type":"string","title":"Source Observed"},"source_forecast":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Forecast"},"points":{"items":{"$ref":"#/components/schemas/SubdistrictRainPoint"},"type":"array","title":"Points"}},"type":"object","required":["admin_id3","source_observed","source_forecast","points"],"title":"SubdistrictRainResponse"},"SubdistrictStatsResponse":{"properties":{"admin_id3":{"type":"string","title":"Admin Id3"},"population":{"type":"integer","title":"Population","default":0},"households":{"type":"integer","title":"Households","default":0},"male":{"type":"integer","title":"Male","default":0},"female":{"type":"integer","title":"Female","default":0},"pop_child_0_14":{"type":"integer","title":"Pop Child 0 14","default":0},"pop_65plus":{"type":"integer","title":"Pop 65Plus","default":0},"area_km2":{"type":"number","title":"Area Km2","default":0.0},"exposure_density":{"type":"number","title":"Exposure Density","default":0.0},"exposure_index":{"type":"number","title":"Exposure Index","default":0.0},"vulnerability_count":{"type":"integer","title":"Vulnerability Count","default":0},"vulnerability_index":{"type":"number","title":"Vulnerability Index","default":0.0}},"type":"object","required":["admin_id3"],"title":"SubdistrictStatsResponse"},"TokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"}},"type":"object","required":["access_token"],"title":"TokenResponse"},"UpdateSourceRequest":{"properties":{"name_th":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Th"},"name_en":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name En"},"service_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Service Url"},"service_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Service Type"},"layer_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Layer Id"},"geometry_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geometry Type"},"target_table":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Table"},"schedule_cron":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule Cron"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"UpdateSourceRequest"},"UpdateStationRequest":{"properties":{"description_th":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description Th"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"name_en":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name En"},"is_published":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Published"}},"type":"object","title":"UpdateStationRequest"},"UsageEventCreate":{"properties":{"event_type":{"type":"string","title":"Event Type","default":"page_view"},"page_path":{"type":"string","title":"Page Path"},"guest_session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Guest Session Id"}},"type":"object","required":["page_path"],"title":"UsageEventCreate"},"UsageStatsResponse":{"properties":{"total_page_views":{"type":"integer","title":"Total Page Views"},"unique_guests":{"type":"integer","title":"Unique Guests"},"unique_registered":{"type":"integer","title":"Unique Registered"},"views_by_page":{"items":{"$ref":"#/components/schemas/PageViewCount"},"type":"array","title":"Views By Page"},"views_by_day":{"items":{"$ref":"#/components/schemas/DailyCount"},"type":"array","title":"Views By Day"}},"type":"object","required":["total_page_views","unique_guests","unique_registered","views_by_page","views_by_day"],"title":"UsageStatsResponse"},"UserCreate":{"properties":{"username":{"type":"string","title":"Username"},"email":{"type":"string","title":"Email"},"display_name":{"type":"string","title":"Display Name"},"role":{"type":"string","title":"Role","default":"public"},"organization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization"},"password":{"type":"string","title":"Password"}},"type":"object","required":["username","email","display_name","password"],"title":"UserCreate"},"UserListResponse":{"properties":{"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"},"items":{"items":{"$ref":"#/components/schemas/UserResponse"},"type":"array","title":"Items"}},"type":"object","required":["total","page","page_size","items"],"title":"UserListResponse"},"UserResponse":{"properties":{"id":{"type":"integer","title":"Id"},"username":{"type":"string","title":"Username"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"role":{"type":"string","title":"Role"},"permissions":{"items":{"type":"string"},"type":"array","title":"Permissions","default":[]},"organization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization"},"auth_provider":{"type":"string","title":"Auth Provider","default":"local"},"is_active":{"type":"boolean","title":"Is Active"},"last_login_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","username","role","is_active","created_at"],"title":"UserResponse"},"UserUpdate":{"properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"organization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"UserUpdate"},"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"},"WarningResponse":{"properties":{"run_tag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Run Tag"},"horizon":{"type":"string","title":"Horizon"},"valid_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Valid Time"},"count":{"type":"integer","title":"Count"},"levels":{"additionalProperties":{"type":"integer"},"type":"object","title":"Levels"}},"type":"object","required":["run_tag","horizon","valid_time","count","levels"],"title":"WarningResponse"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}