{"openapi":"3.1.0","info":{"title":"URBANMIND API","description":"Urban planning scenario analysis platform","version":"0.1.0"},"paths":{"/api/health":{"get":{"tags":["health"],"summary":"Health Check","description":"Health check endpoint.","operationId":"health_check_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/register":{"post":{"tags":["authentication"],"summary":"Register User","description":"Register a new user. They wait for an admin until approved (routers/admin.py).\n\nNew users always get the 'planner' role; admins change roles via\nPUT /users/{user_id}/role.","operationId":"register_user_api_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/login":{"post":{"tags":["authentication"],"summary":"Login For Access Token","description":"Login and get access token.","operationId":"login_for_access_token_api_auth_login_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_login_for_access_token_api_auth_login_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Token"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/password":{"post":{"tags":["authentication"],"summary":"Change Password","description":"Change your own password. Ends your other sign-ins, and gives this one a new token.","operationId":"change_password_api_auth_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordChange"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Token"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/auth/me":{"get":{"tags":["authentication"],"summary":"Read Users Me","description":"Get current user information including role.","operationId":"read_users_me_api_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/auth/users":{"get":{"tags":["authentication"],"summary":"List Users","description":"List all users (admin only).","operationId":"list_users_api_auth_users_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/User"},"type":"array","title":"Response List Users Api Auth Users Get"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/auth/users/{user_id}":{"get":{"tags":["authentication"],"summary":"Get User","description":"Get a specific user by ID (admin only).","operationId":"get_user_api_auth_users__user_id__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"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/User"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["authentication"],"summary":"Delete User","description":"Delete a user (admin only).","operationId":"delete_user_api_auth_users__user_id__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/users/{user_id}/role":{"put":{"tags":["authentication"],"summary":"Update User Role","description":"Update a user's role (admin only).\n\nRoles:\n- admin: Full access - manage users, all CRUD, system settings\n- planner: Create/edit scenarios, run analysis, comment, share\n- viewer: Read-only - view scenarios, add comments only","operationId":"update_user_role_api_auth_users__user_id__role_put","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRoleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/roles":{"get":{"tags":["authentication"],"summary":"Get Available Roles","description":"Get list of available user roles and their descriptions.\n\nThis endpoint is public to help with registration forms and role display.","operationId":"get_available_roles_api_auth_roles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response Get Available Roles Api Auth Roles Get"}}}}}}},"/api/projects/default":{"get":{"tags":["projects"],"summary":"Get Or Create Default Project","description":"Return the user's first project, auto-creating 'My Workspace' if none exists.\n\nIdempotent: safe to call on every app load.","operationId":"get_or_create_default_project_api_projects_default_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/projects/":{"post":{"tags":["projects"],"summary":"Create Project","description":"Create a new project.","operationId":"create_project_api_projects__post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["projects"],"summary":"Read Projects","description":"Get all projects for the current user.","operationId":"read_projects_api_projects__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Project"},"title":"Response Read Projects Api Projects  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects/{project_id}":{"get":{"tags":["projects"],"summary":"Read Project","description":"Get a specific project by ID.","operationId":"read_project_api_projects__project_id__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["projects"],"summary":"Update Project","description":"Update a project.","operationId":"update_project_api_projects__project_id__put","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["projects"],"summary":"Delete Project","description":"Delete a project.","operationId":"delete_project_api_projects__project_id__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scenarios/":{"post":{"tags":["scenarios"],"summary":"Create Scenario","description":"Create a new scenario in a project.","operationId":"create_scenario_api_scenarios__post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"project_id","in":"query","required":true,"schema":{"type":"integer","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScenarioCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Scenario"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["scenarios"],"summary":"Read Scenarios","description":"Get all scenarios for a project the user owns (or a public project).","operationId":"read_scenarios_api_scenarios__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"project_id","in":"query","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Scenario"},"title":"Response Read Scenarios Api Scenarios  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scenarios/{scenario_id}":{"get":{"tags":["scenarios"],"summary":"Read Scenario","description":"Get a specific scenario by ID.","operationId":"read_scenario_api_scenarios__scenario_id__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Scenario"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["scenarios"],"summary":"Update Scenario","description":"Update a scenario.","operationId":"update_scenario_api_scenarios__scenario_id__put","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScenarioUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Scenario"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["scenarios"],"summary":"Delete Scenario","description":"Delete a scenario.","operationId":"delete_scenario_api_scenarios__scenario_id__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scenarios/{scenario_id}/paint":{"put":{"tags":["scenarios"],"summary":"Update Scenario Paint","description":"Update scenario painting data.","operationId":"update_scenario_paint_api_scenarios__scenario_id__paint_put","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Paint Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scenarios/{scenario_id}/yield":{"get":{"tags":["scenarios"],"summary":"Get Scenario Yield","description":"The yield of each site (Milestone E1): floor area gross and net, homes by bedrooms, people, jobs, coverage,\nFAR, and car spaces against Clause 52.06. `parking=false` skips the Clause 52.06 maps (faster).","operationId":"get_scenario_yield_api_scenarios__scenario_id__yield_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}},{"name":"parking","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Parking"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scenarios/{scenario_id}/costs":{"get":{"tags":["scenarios"],"summary":"Get Scenario Costs","description":"What the design costs to build and permit (Milestone E2): build by home class (ABS $/m²), parking, fees and\ncontingency, the planning permit fee, the Metropolitan Planning Levy, the building permit and reform levies, and\nthe council's Clause 53.01 open space rate. Land, finance and taxes are the pro forma's (E3).","operationId":"get_scenario_costs_api_scenarios__scenario_id__costs_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scenarios/{scenario_id}/yield-bar":{"get":{"tags":["scenarios"],"summary":"Get Scenario Yield Bar","description":"The live yield bar in Build (Milestone E4): the key numbers of the design as it stands, with no \"run\" step.\nHomes, floor area, FAR, site coverage, car spaces against Clause 52.06, cost, sale value, and the residual land\nvalue (or, with your land price, the margin). Lookups are cached, so it answers in well under a second.","operationId":"get_scenario_yield_bar_api_scenarios__scenario_id__yield_bar_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}},{"name":"land_price","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Land Price"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scenarios/{scenario_id}/assumptions":{"get":{"tags":["scenarios"],"summary":"Get Scenario Assumptions","description":"What the analysis assumes for this scenario: the defaults, the scenario's own changes, and the sources.","operationId":"get_scenario_assumptions_api_scenarios__scenario_id__assumptions_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["scenarios"],"summary":"Set Scenario Assumptions","description":"Set the scenario's own household sizes and floor area per job (empty restores the defaults).","operationId":"set_scenario_assumptions_api_scenarios__scenario_id__assumptions_put","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scenarios/{scenario_id}/revision":{"get":{"tags":["scenarios"],"summary":"Scenario Revision Of","description":"The sites' revision and who changed them last (cheap, for open tabs to poll).","operationId":"scenario_revision_of_api_scenarios__scenario_id__revision_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scenarios/{scenario_id}/indicators":{"get":{"tags":["scenarios"],"summary":"Get Scenario Indicators","description":"Get calculated indicators for a scenario.","operationId":"get_scenario_indicators_api_scenarios__scenario_id__indicators_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}},{"name":"recalculate","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Recalculate"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scenarios/indicators/preview":{"post":{"tags":["scenarios"],"summary":"Preview Indicators","description":"The quick indicators for sites that aren't saved in a scenario: {painted_areas: [...]} in, the same\nindicators as /{scenario_id}/indicators out. Nothing is saved. For visitors trying UrbanMind without an\naccount (guest mode), within services/guest_limits.py's limits.","operationId":"preview_indicators_api_scenarios_indicators_preview_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/scenarios/{scenario_id}/baseline-comparison":{"get":{"tags":["scenarios"],"summary":"Get Baseline Comparison","description":"Get baseline (Census) vs proposed (scenario) comparison.\n\nReturns Census 2021 demographic baseline for the scenario's location\nand compares it with the proposed development indicators.\n\nThis helps planners understand the impact of development on existing\ncommunity demographics, housing, and employment.","operationId":"get_baseline_comparison_api_scenarios__scenario_id__baseline_comparison_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scenarios/{scenario_id}/census-baseline":{"get":{"tags":["scenarios"],"summary":"Get Census Baseline","description":"Get just the Census baseline demographics for a scenario's location.\n\nThis returns the full Census 2021 demographic profile for the SA2\nboundary that contains the scenario's painted features.","operationId":"get_census_baseline_api_scenarios__scenario_id__census_baseline_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scenarios/{scenario_id}/transport-impact":{"get":{"tags":["scenarios"],"summary":"Get Transport Impact","description":"Calculate transport impacts for a scenario.\n\nArgs:\n    scenario_id: Scenario ID\n    location: Distance from CBD ('inner', 'middle', 'outer')\n\nReturns:\n    Transport impact metrics including trips, VKT, parking, emissions","operationId":"get_transport_impact_api_scenarios__scenario_id__transport_impact_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}},{"name":"location","in":"query","required":false,"schema":{"type":"string","default":"middle","title":"Location"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scenarios/{scenario_id}/export":{"get":{"tags":["scenarios"],"summary":"Export Scenario Geojson","description":"Export a scenario as a GeoJSON FeatureCollection.\n\nArgs:\n    scenario_id: Scenario ID\n\nReturns:\n    GeoJSON FeatureCollection with scenario metadata and painted features","operationId":"export_scenario_geojson_api_scenarios__scenario_id__export_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scenarios/import":{"post":{"tags":["scenarios"],"summary":"Import Scenario Geojson","description":"Import a scenario from a GeoJSON file.\n\nArgs:\n    project_id: Project ID to import into\n    file: GeoJSON file upload\n\nReturns:\n    Created Scenario object\n\nRaises:\n    400: Invalid GeoJSON structure\n    400: File too large (>10 MB)\n    400: Missing required development types\n    404: Project not found","operationId":"import_scenario_geojson_api_scenarios_import_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"project_id","in":"query","required":true,"schema":{"type":"integer","title":"Project Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_import_scenario_geojson_api_scenarios_import_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Scenario"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scenarios/template/excel":{"get":{"tags":["scenarios"],"summary":"Download Excel Template","description":"Download an Excel template for scenario import.\n\nThe template includes:\n- Instructions sheet with how to fill data\n- Development Types sheet with all available types\n- Scenario Data sheet for entering parcels\n\nReturns:\n    Excel file (.xlsx) for download","operationId":"download_excel_template_api_scenarios_template_excel_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/scenarios/import/excel":{"post":{"tags":["scenarios"],"summary":"Import Scenario Excel","description":"Import a scenario from an Excel file.\n\nThe Excel file should follow the template format with:\n- Row 1: scenario_name in the vacant_acres column\n- Row 2: scenario_description in the vacant_acres column\n- Row 3: Header separator (ignored)\n- Row 4+: Parcel data\n\nArgs:\n    project_id: Project ID to import into\n    file: Excel file upload (.xlsx)\n\nReturns:\n    Created Scenario object\n\nRaises:\n    400: Invalid Excel structure\n    400: File too large (>10 MB)\n    400: Missing required development types\n    404: Project not found","operationId":"import_scenario_excel_api_scenarios_import_excel_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"project_id","in":"query","required":true,"schema":{"type":"integer","title":"Project Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_import_scenario_excel_api_scenarios_import_excel_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Scenario"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scenarios/{scenario_id}/sites":{"post":{"tags":["scenarios"],"summary":"Add Scenario Site","description":"Add one site to a scenario, keeping the sites it has (the assistant's\npaint_area tool; the MCP server). Body: {dev_type, geometry (GeoJSON\npolygon, WGS84)}. Saved as a new revision by \"assistant\", so an open app\nreloads it.\n\nPUT /paint replaces the whole site list; calling it with one site, as\npaint_area used to, deleted every other site.","operationId":"add_scenario_site_api_scenarios__scenario_id__sites_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scenarios/{scenario_id}/sites/{site}":{"patch":{"tags":["scenarios"],"summary":"Edit Scenario Site","description":"Change one site of a scenario (the Assistant's edit_site; services/site_edit.py): resize (target_area_ha, grow_m,\nwidth_m/depth_m), retype (dev_type), take its buildings off (clear_buildings), or delete it (remove). The other\nsites are kept. A resize or new type removes the last fill; refill it with POST /api/master-plan/scenarios/{id}/\nfill-site (with counts for given buildings). Saved as a new revision by \"assistant\", so an open app reloads it.","operationId":"edit_scenario_site_api_scenarios__scenario_id__sites__site__patch","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}},{"name":"site","in":"path","required":true,"schema":{"type":"string","title":"Site"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Edit"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["scenarios"],"summary":"Delete Scenario Site","description":"Delete one site of a scenario, keeping the others (the Assistant's remove_site).","operationId":"delete_scenario_site_api_scenarios__scenario_id__sites__site__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}},{"name":"site","in":"path","required":true,"schema":{"type":"string","title":"Site"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scenarios/site-shape":{"post":{"tags":["scenarios"],"summary":"Site Shape","description":"A site's new outline for a shape edit ({geometry, edit}; services/site_edit.py), without saving anything: the\ndescribe box's preview and apply. Works without an account, within guest mode's limits.","operationId":"site_shape_api_scenarios_site_shape_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/guest/session":{"post":{"tags":["guest"],"summary":"Start Guest Session","description":"A guest user with one scenario, and its token (sent as X-Guest-Token from then on; shown once).","operationId":"start_guest_session_api_guest_session_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/guest/claim":{"post":{"tags":["guest"],"summary":"Claim Guest Session","description":"After sign-in: the guest's scenario becomes this account's (same id, results kept); the guest is deleted.","operationId":"claim_guest_session_api_guest_claim_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/development-types/":{"post":{"tags":["development-types"],"summary":"Create Development Type","description":"Create a new development type (admin only).","operationId":"create_development_type_api_development_types__post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevelopmentTypeCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevelopmentType"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["development-types"],"summary":"Read Development Types","description":"Get all development types.","operationId":"read_development_types_api_development_types__get","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DevelopmentType"},"title":"Response Read Development Types Api Development Types  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/development-types/{dev_type_id}":{"get":{"tags":["development-types"],"summary":"Read Development Type","description":"Get a specific development type by ID.","operationId":"read_development_type_api_development_types__dev_type_id__get","parameters":[{"name":"dev_type_id","in":"path","required":true,"schema":{"type":"integer","title":"Dev Type Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevelopmentType"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["development-types"],"summary":"Update Development Type","description":"Update a development type (admin only).","operationId":"update_development_type_api_development_types__dev_type_id__put","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"dev_type_id","in":"path","required":true,"schema":{"type":"integer","title":"Dev Type Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevelopmentTypeUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevelopmentType"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["development-types"],"summary":"Delete Development Type","description":"Soft delete a development type (admin only).","operationId":"delete_development_type_api_development_types__dev_type_id__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"dev_type_id","in":"path","required":true,"schema":{"type":"integer","title":"Dev Type Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/development-types/populate-nda":{"post":{"tags":["development-types"],"summary":"Populate Nda Values","description":"One-time endpoint to populate NDA (Net Developable Area) values\nfrom the reference JSON for all existing development types.\n\nPhase 4.19: NDA factors include street_percent, park_percent,\ncivic_percent, and redevelopment_rate.","operationId":"populate_nda_values_api_development_types_populate_nda_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Populate Nda Values Api Development Types Populate Nda Post"}}}}}}},"/api/building-prototypes/":{"post":{"tags":["building-prototypes"],"summary":"Create Building Prototype","description":"Create a new building prototype (admin only).","operationId":"create_building_prototype_api_building_prototypes__post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildingPrototypeCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildingPrototype"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["building-prototypes"],"summary":"Read Building Prototypes","description":"Get all building prototypes.","operationId":"read_building_prototypes_api_building_prototypes__get","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BuildingPrototype"},"title":"Response Read Building Prototypes Api Building Prototypes  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/building-prototypes/{prototype_id}":{"get":{"tags":["building-prototypes"],"summary":"Read Building Prototype","description":"Get a specific building prototype by ID.","operationId":"read_building_prototype_api_building_prototypes__prototype_id__get","parameters":[{"name":"prototype_id","in":"path","required":true,"schema":{"type":"integer","title":"Prototype Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildingPrototype"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["building-prototypes"],"summary":"Update Building Prototype","description":"Update a building prototype (admin only).","operationId":"update_building_prototype_api_building_prototypes__prototype_id__put","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"prototype_id","in":"path","required":true,"schema":{"type":"integer","title":"Prototype Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildingPrototypeUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildingPrototype"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["building-prototypes"],"summary":"Delete Building Prototype","description":"Soft delete a building prototype (admin only).","operationId":"delete_building_prototype_api_building_prototypes__prototype_id__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"prototype_id","in":"path","required":true,"schema":{"type":"integer","title":"Prototype Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analysis/results/{scenario_id}":{"get":{"tags":["analysis"],"summary":"List Saved Results","description":"Latest saved result per model for a scenario (owner, or public project).","operationId":"list_saved_results_api_analysis_results__scenario_id__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analysis/fiscal":{"post":{"tags":["analysis"],"summary":"Analyze Fiscal","description":"Fiscal impact (A2b): the council's rates, grants and service costs for the project from its own published\nfigures (LGPRF, VLGGC, ABS), contributions where an overlay applies, Infrastructure Victoria's\ninfrastructure costs for the setting, discounted at DTF's 7% real.","operationId":"analyze_fiscal_api_analysis_fiscal_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/analysis/transport":{"post":{"tags":["analysis"],"summary":"Analyze Transport","description":"Transport impact (A2b): vehicle trips from TfNSW's 2024 guide (and the RTA 2002 guide for industry),\ntravel by mode from VISTA, residents' driving from Census cars per dwelling and ABS SMVU, emissions\nfrom the National Greenhouse Accounts, and Clause 52.06 (VC277) dwelling parking.","operationId":"analyze_transport_api_analysis_transport_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/analysis/green-infrastructure":{"post":{"tags":["analysis"],"summary":"Analyze Green Infrastructure","description":"Green Infrastructure (A2b): each painted site against the Victorian standards: stormwater quality (EPA\n1739.1 via Clauses 55.05-1 / 58.03-8 / 53.18, impervious area from Melbourne Water), canopy cover (Clause\n55.02-7 or 58.03-5 against existing Vicmap canopy plus the trees planted in the design) and public open space\n(the council's Clause 53.01).","operationId":"analyze_green_infrastructure_api_analysis_green_infrastructure_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/analysis/redevelopment-timing":{"post":{"tags":["analysis"],"summary":"Analyze Redevelopment Timing","description":"Run redevelopment timing analysis - identifies parcels ready for redevelopment.\n\nPHASE 4.12 ENHANCED: Now includes Heritage Victoria data to identify\nheritage-restricted parcels that cannot be demolished.","operationId":"analyze_redevelopment_timing_api_analysis_redevelopment_timing_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/analysis/housing-balance":{"post":{"tags":["analysis"],"summary":"Analyze Housing Balance","description":"Run housing balance analysis - affordability, diversity, tenure mix.\n\nPHASE 4.12 ENHANCED: Now includes Census G02 income data for real\naffordability calculations based on actual area median income.\n\nPHASE 4.14 ENHANCED: Now includes Census G33/G38/G40 for detailed\nincome distribution, rent levels, mortgage payments, and tenure mix.","operationId":"analyze_housing_balance_api_analysis_housing_balance_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/analysis/location-efficiency":{"post":{"tags":["analysis"],"summary":"Analyze Location Efficiency","description":"Location efficiency (A2b): Walk Score's method on street-network distances (OpenStreetMap), DTP's\nPTAL for public transport, and Plan Melbourne's daily needs within walking distance (Vicmap).","operationId":"analyze_location_efficiency_api_analysis_location_efficiency_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/analysis/seven-d":{"post":{"tags":["analysis"],"summary":"Analyze Seven D","description":"Seven D (A2b): the built-environment D variables, each measured (shared base, OpenStreetMap\nstreets, Vicmap features of interest, PTV GTFS, the Car Parking Requirement Maps, ABS Census)\nand set against a stated benchmark.","operationId":"analyze_seven_d_api_analysis_seven_d_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/analysis/land-use-mix":{"post":{"tags":["analysis"],"summary":"Analyze Land Use Mix","description":"Land Use Mix (A2b): the mix of the plan's floor space by use as the land-use-mix index (-sum p ln p / ln 5,\nfive fixed classes), with jobs per dwelling and the site's zone purpose beside it.","operationId":"analyze_land_use_mix_api_analysis_land_use_mix_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/analysis/feasibility":{"post":{"tags":["analysis"],"summary":"Analyze Feasibility","description":"Development Feasibility (A2b): the residual land value of the plan's homes at the target margin on cost:\nValuer-General suburb medians, ABS build costs, GST margin scheme, SRO duty; the other assumptions are options.\nOptions: land_price (optional) and FEASIBILITY_OPTIONS.","operationId":"analyze_feasibility_api_analysis_feasibility_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/analysis/embodied-carbon":{"post":{"tags":["analysis"],"summary":"Analyze Embodied Carbon","description":"Embodied Carbon (A2b): upfront carbon (A1-A5) of what is proposed, by building type, from Infrastructure\nAustralia 2024 Table 56 (low/mid/high), on the shared scenario breakdown. Sites with buildings also get a\nbreakdown from their BIM model (B3: element quantities x NABERS v2026.3 material factors; services/bim_carbon.py);\nthe headline stays IA's per-m2 total. Option: the reduction the design achieves (planned_reduction_pct, from an LCA),\nset against Green Star Buildings' 10/20/40% tiers.","operationId":"analyze_embodied_carbon_api_analysis_embodied_carbon_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/analysis/biodiversity":{"post":{"tags":["analysis"],"summary":"Analyze Biodiversity","description":"Biodiversity (A2b): a site screen. DEECA native vegetation (2005 and pre-1750 EVCs) clipped to the site,\nAtlas of Living Australia species within 1 km, Vicmap tree canopy, scored on Singapore Index bands where a\nsite-scale analogue exists; Clause 52.17, listed species and environmental overlays as constraints.","operationId":"analyze_biodiversity_api_analysis_biodiversity_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/analysis/urban-heat":{"post":{"tags":["analysis"],"summary":"Analyze Urban Heat","description":"Urban heat (A2c) on the V8 model: radiant heat and the feels-like temperature (UTCI) on the site's ground on\nV8's hottest measured day, today and with the plan's trees. Outside V8's measured area: not measured, no number.","operationId":"analyze_urban_heat_api_analysis_urban_heat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/analysis/twenty-min-neighbourhood":{"post":{"tags":["analysis"],"summary":"Analyze Twenty Min Neighbourhood","description":"20-Minute Neighbourhood Composite Assessment.\n\nEvaluates 10 Plan Melbourne criteria to determine if a location\nmeets the 20-minute neighbourhood standard — all daily needs\naccessible within a 20-minute walk.\n\nPhase 4.23.1","operationId":"analyze_twenty_min_neighbourhood_api_analysis_twenty_min_neighbourhood_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/analysis/cost-benefit":{"post":{"tags":["analysis"],"summary":"Analyze Cost Benefit","description":"Cost-Benefit (A2b): an incremental, location-based externality appraisal against the same households living at\nGreater Melbourne averages: car km avoided and extra walking, valued with ATAP and Victoria's emissions values,\n7% real over 30 years. Transfers are excluded; the buildings' own carbon is shown as context.","operationId":"analyze_cost_benefit_api_analysis_cost_benefit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/analysis/social-equity":{"post":{"tags":["analysis"],"summary":"Analyze Social Equity","description":"Social Equity (A2b): need against provision. Who lives in the area (ABS Census 2021, six groups against\nVictoria, and the SEIFA IRSD position), and whether the site meets the 20-Minute hallmarks those groups\nrely on, with the affordable and social homes set in Housing Balance.","operationId":"analyze_social_equity_api_analysis_social_equity_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/analysis/flood-risk":{"post":{"tags":["analysis"],"summary":"Analyze Flood Risk","description":"Flood Risk (A2b): the flood controls covering the site (Vicmap Planning: LSIO, SBO, FO, RFO, FMO, UFZ, FMZ),\nthe existing buildings in them, and what each control means. No open source gives flood depths, so no dollar\ndamage is estimated.","operationId":"analyze_flood_risk_api_analysis_flood_risk_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/analysis/climate-projections":{"post":{"tags":["analysis"],"summary":"Analyze Climate Projections","description":"Climate Projections (A2b): the Victorian Climate Projections 2024 for the site's region as published (low and high\nemissions, 2050/2070/2090, median and range), with hot days, sea-level rise and design rainfall uplift. The region\nis the site's council's; when the council isn't read, a site in Greater Melbourne's SA4s is Greater Melbourne.","operationId":"analyze_climate_projections_api_analysis_climate_projections_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/analysis/building-stock":{"post":{"tags":["analysis"],"summary":"Analyze Building Stock","description":"Building Stock (A2b): the buildings on the sites now, rated by the energy standard of the era they were\nbuilt in. Construction years from the City of Melbourne's CLUE survey where it covers the site, else the\nera the user sets (Existing buildings: Built); unknown eras are listed, not scored.","operationId":"analyze_building_stock_api_analysis_building_stock_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/analysis/energy-hardship":{"post":{"tags":["analysis"],"summary":"Analyze Energy Hardship","description":"Energy Hardship (A2b): the area's ABS SEIFA 2021 IRSD position among Victoria's SA2s (no published\narea-level energy hardship index exists), with the energy-specific measures shown beside it.","operationId":"analyze_energy_hardship_api_analysis_energy_hardship_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/analysis/cool-rooms":{"post":{"tags":["analysis"],"summary":"Analyze Cool Rooms","description":"Cool Rooms (A2b): the nearest public cool place (Vicmap Features of Interest, of the kinds the Victorian\nHeatwave Planning Guide names), the heat-vulnerable people around the site (Census 2021 against Victoria,\nIRSD position), and whether the plan could host a cool room.","operationId":"analyze_cool_rooms_api_analysis_cool_rooms_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/analysis/uhi-project-impact":{"post":{"tags":["analysis"],"summary":"Analyze Uhi Project Impact","description":"UHI Project Impact (A2c): a tree-planting project over the drawn area at the canopy cover set, before and after,\non the V8 heat model. Other surfaces aren't measured. Outside V8's measured area: not measured, no number.","operationId":"analyze_uhi_project_impact_api_analysis_uhi_project_impact_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/analysis/retrofit-vs-rebuild":{"post":{"tags":["analysis"],"summary":"Analyze Retrofit Rebuild","description":"Retrofit vs Rebuild (A2b): a breakeven test on the buildings standing on the sites (dated as in Building\nStock): the measured SV retrofit for pre-2005 homes against the rebuild's upfront carbon (IA 2024) and cost (ABS).","operationId":"analyze_retrofit_rebuild_api_analysis_retrofit_vs_rebuild_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/analysis/asset-priority":{"post":{"tags":["analysis"],"summary":"Analyze Asset Priority","description":"Asset Priority (A2b): the existing buildings by climate risk, using the Infrastructure Victoria / Arup (2026)\nexposure x vulnerability method (flood, and heat from BoM days over 35 °C), with the area's disadvantage shown beside it.","operationId":"analyze_asset_priority_api_analysis_asset_priority_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/analysis/net-zero-precinct":{"post":{"tags":["analysis"],"summary":"Analyze Net Zero Precinct","description":"Net Zero Precinct (A2b): a carbon account of the proposed development: upfront carbon (IA 2024), operating\ncarbon each year to 2045 on Victoria's decarbonising grid (all-electric), less rooftop solar on homes, beside\nVictoria's targets. Replaces the earlier weighted composite of other models.","operationId":"analyze_net_zero_precinct_api_analysis_net_zero_precinct_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/analysis/certification-eligibility":{"post":{"tags":["analysis"],"summary":"Analyze Certification Eligibility","description":"Certification (A2b): the proposal against Victorian planning-scheme standards with published numbers (C7, C13,\nB5-1, B2-7; 12.06-1S and 53.03 as context), with Green Star Communities v2 draft thresholds shown indicatively.","operationId":"analyze_certification_eligibility_api_analysis_certification_eligibility_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/share/":{"post":{"tags":["sharing"],"summary":"Create Share Link","description":"Create a new share link for a scenario.\n\nArgs:\n    share_data: ShareLinkCreate with scenario_id, is_public, expires_in_days\n\nReturns:\n    Created ShareLink with unique token","operationId":"create_share_link_api_share__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareLinkCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareLink"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/share/scenario/{scenario_id}":{"get":{"tags":["sharing"],"summary":"Get Scenario Share Links","description":"Get all share links for a scenario.\n\nArgs:\n    scenario_id: Scenario ID\n\nReturns:\n    List of ShareLinks for the scenario","operationId":"get_scenario_share_links_api_share_scenario__scenario_id__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ShareLink"},"title":"Response Get Scenario Share Links Api Share Scenario  Scenario Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/share/view/{token}":{"get":{"tags":["sharing"],"summary":"Get Shared Scenario","description":"Get a scenario by share token.\n\nA public link opens for anyone with the token. A private link opens only\nfor a signed-in user who can read the scenario (its owner, or anyone when\nthe project is public). It also tracks view count and last access time.\n\nArgs:\n    token: Share link token\n\nReturns:\n    SharedScenarioView with scenario data (read-only)","operationId":"get_shared_scenario_api_share_view__token__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharedScenarioView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/share/{share_id}":{"put":{"tags":["sharing"],"summary":"Update Share Link","description":"Update a share link (activate/deactivate, change expiration).\n\nArgs:\n    share_id: Share link ID\n    update_data: Fields to update\n\nReturns:\n    Updated ShareLink","operationId":"update_share_link_api_share__share_id__put","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"share_id","in":"path","required":true,"schema":{"type":"integer","title":"Share Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareLinkUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareLink"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["sharing"],"summary":"Delete Share Link","description":"Delete a share link (permanently revoke access).\n\nArgs:\n    share_id: Share link ID\n\nReturns:\n    Success message","operationId":"delete_share_link_api_share__share_id__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"share_id","in":"path","required":true,"schema":{"type":"integer","title":"Share 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/share/{share_id}/deactivate":{"post":{"tags":["sharing"],"summary":"Deactivate Share Link","description":"Deactivate a share link (soft delete - keeps history).\n\nArgs:\n    share_id: Share link ID\n\nReturns:\n    Deactivated ShareLink","operationId":"deactivate_share_link_api_share__share_id__deactivate_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"share_id","in":"path","required":true,"schema":{"type":"integer","title":"Share Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareLink"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/share/{share_id}/reactivate":{"post":{"tags":["sharing"],"summary":"Reactivate Share Link","description":"Reactivate a previously deactivated share link.\n\nArgs:\n    share_id: Share link ID\n\nReturns:\n    Reactivated ShareLink","operationId":"reactivate_share_link_api_share__share_id__reactivate_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"share_id","in":"path","required":true,"schema":{"type":"integer","title":"Share Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareLink"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/comments/":{"post":{"tags":["comments"],"summary":"Create Comment","description":"Create a new comment on a scenario.\n\nArgs:\n    comment_data: CommentCreate with scenario_id, content, optional location and parent_id\n\nReturns:\n    Created Comment","operationId":"create_comment_api_comments__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/comments/scenario/{scenario_id}":{"get":{"tags":["comments"],"summary":"Get Scenario Comments","description":"Get all comments for a scenario, organized as a tree structure.\n\nArgs:\n    scenario_id: Scenario ID\n    include_resolved: Whether to include resolved comments (default: True)\n\nReturns:\n    List of top-level comments with nested replies","operationId":"get_scenario_comments_api_comments_scenario__scenario_id__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}},{"name":"include_resolved","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Resolved"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CommentWithReplies"},"title":"Response Get Scenario Comments Api Comments Scenario  Scenario Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/comments/scenario/{scenario_id}/flat":{"get":{"tags":["comments"],"summary":"Get Scenario Comments Flat","description":"Get all comments for a scenario as a flat list.\n\nArgs:\n    scenario_id: Scenario ID\n    include_resolved: Whether to include resolved comments (default: True)\n\nReturns:\n    Flat list of comments ordered by creation time","operationId":"get_scenario_comments_flat_api_comments_scenario__scenario_id__flat_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}},{"name":"include_resolved","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Resolved"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Comment"},"title":"Response Get Scenario Comments Flat Api Comments Scenario  Scenario Id  Flat Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/comments/{comment_id}":{"get":{"tags":["comments"],"summary":"Get Comment","description":"Get a single comment by ID.\n\nArgs:\n    comment_id: Comment ID\n\nReturns:\n    Comment","operationId":"get_comment_api_comments__comment_id__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"comment_id","in":"path","required":true,"schema":{"type":"integer","title":"Comment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["comments"],"summary":"Update Comment","description":"Update a comment (edit content or mark as resolved).\n\nArgs:\n    comment_id: Comment ID\n    update_data: Fields to update\n\nReturns:\n    Updated Comment","operationId":"update_comment_api_comments__comment_id__put","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"comment_id","in":"path","required":true,"schema":{"type":"integer","title":"Comment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["comments"],"summary":"Delete Comment","description":"Delete a comment and all its replies.\n\nArgs:\n    comment_id: Comment ID\n\nReturns:\n    Success message","operationId":"delete_comment_api_comments__comment_id__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"comment_id","in":"path","required":true,"schema":{"type":"integer","title":"Comment 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/comments/{comment_id}/resolve":{"post":{"tags":["comments"],"summary":"Resolve Comment","description":"Mark a comment as resolved.\n\nArgs:\n    comment_id: Comment ID\n\nReturns:\n    Resolved Comment","operationId":"resolve_comment_api_comments__comment_id__resolve_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"comment_id","in":"path","required":true,"schema":{"type":"integer","title":"Comment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/comments/{comment_id}/unresolve":{"post":{"tags":["comments"],"summary":"Unresolve Comment","description":"Mark a comment as unresolved.\n\nArgs:\n    comment_id: Comment ID\n\nReturns:\n    Unresolved Comment","operationId":"unresolve_comment_api_comments__comment_id__unresolve_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"comment_id","in":"path","required":true,"schema":{"type":"integer","title":"Comment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/comments/scenario/{scenario_id}/count":{"get":{"tags":["comments"],"summary":"Get Comment Count","description":"Get the count of comments for a scenario.\n\nArgs:\n    scenario_id: Scenario ID\n\nReturns:\n    Comment count statistics","operationId":"get_comment_count_api_comments_scenario__scenario_id__count_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/versions/scenario/{scenario_id}":{"post":{"tags":["versions"],"summary":"Create Version","description":"Create a new version snapshot of a scenario.\n\nArgs:\n    scenario_id: The scenario to create a version for\n    change_type: Type of change (\"create\", \"update\", \"paint\", \"rollback\")\n    change_description: Human-readable description of the change\n    created_by_name: Name of user making the change (for dev mode)\n\nReturns:\n    The created version","operationId":"create_version_api_versions_scenario__scenario_id__post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}},{"name":"change_type","in":"query","required":false,"schema":{"type":"string","default":"update","title":"Change Type"}},{"name":"change_description","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Change Description"}},{"name":"created_by_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScenarioVersion"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["versions"],"summary":"Get Version History","description":"Get version history for a scenario.\n\nArgs:\n    scenario_id: The scenario to get versions for\n    limit: Maximum number of versions to return (default 20)\n    offset: Number of versions to skip (for pagination)\n\nReturns:\n    List of version summaries (without full scenario data)","operationId":"get_version_history_api_versions_scenario__scenario_id__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ScenarioVersionSummary"},"title":"Response Get Version History Api Versions Scenario  Scenario Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/versions/scenario/{scenario_id}/count":{"get":{"tags":["versions"],"summary":"Get Version Count","description":"Get the total count of versions for a scenario.\n\nReturns:\n    Version count statistics","operationId":"get_version_count_api_versions_scenario__scenario_id__count_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/versions/{version_id}/compare":{"get":{"tags":["versions"],"summary":"Compare With Now","description":"What changed between this version and the scenario now, in words (sites drawn, removed or changed: type, outline,\nbuildings, site elements), with the plan's headline figures then and now. Read-only.","operationId":"compare_with_now_api_versions__version_id__compare_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"integer","title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/versions/{version_id}":{"get":{"tags":["versions"],"summary":"Get Version","description":"Get a specific version by ID (includes full scenario data).\n\nArgs:\n    version_id: The version ID to retrieve\n\nReturns:\n    The full version including scenario data","operationId":"get_version_api_versions__version_id__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"integer","title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScenarioVersion"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["versions"],"summary":"Delete Version","description":"Delete a specific version.\n\nNote: Cannot delete if it's the only version for a scenario.\n\nArgs:\n    version_id: The version ID to delete\n\nReturns:\n    Success message","operationId":"delete_version_api_versions__version_id__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"integer","title":"Version 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/versions/rollback":{"post":{"tags":["versions"],"summary":"Rollback To Version","description":"Rollback a scenario to a specific version.\n\nThis will:\n1. Create a new version with the current state (before rollback)\n2. Restore the scenario to the specified version's state\n3. Create another version marking the rollback\n\nArgs:\n    request: RollbackRequest containing version_id and optional created_by_name\n\nReturns:\n    The new version created after rollback","operationId":"rollback_to_version_api_versions_rollback_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RollbackRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScenarioVersion"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/versions/scenario/{scenario_id}/latest":{"get":{"tags":["versions"],"summary":"Get Latest Version","description":"Get the latest version for a scenario.\n\nArgs:\n    scenario_id: The scenario to get the latest version for\n\nReturns:\n    The latest version including full scenario data","operationId":"get_latest_version_api_versions_scenario__scenario_id__latest_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScenarioVersion"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/versions/scenario/{scenario_id}/auto-save":{"post":{"tags":["versions"],"summary":"Auto Save Version","description":"Auto-save a version (called periodically by frontend).\nOnly creates a new version if the scenario data has changed.\n\nArgs:\n    scenario_id: The scenario to auto-save\n    created_by_name: Name of user (for dev mode)\n\nReturns:\n    The created version or existing latest version if no changes","operationId":"auto_save_version_api_versions_scenario__scenario_id__auto_save_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}},{"name":"created_by_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScenarioVersion"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/activity-logs/scenario/{scenario_id}":{"get":{"tags":["activity-logs"],"summary":"Get Scenario Activity Log","description":"Get activity log for a scenario with optional filtering and pagination.\n\nArgs:\n    scenario_id: Scenario ID\n    action_type: Optional filter by action type (e.g., \"paint\", \"comment\")\n    entity_type: Optional filter by entity type (e.g., \"scenario\", \"comment\")\n    limit: Maximum number of results (default 50, max 100)\n    offset: Number of results to skip (for pagination)\n\nReturns:\n    List of activity log entries, most recent first","operationId":"get_scenario_activity_log_api_activity_logs_scenario__scenario_id__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}},{"name":"action_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by action type","title":"Action Type"},"description":"Filter by action type"},{"name":"entity_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by entity type","title":"Entity Type"},"description":"Filter by entity type"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ActivityLogSummary"},"title":"Response Get Scenario Activity Log Api Activity Logs Scenario  Scenario Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["activity-logs"],"summary":"Clear Scenario Activity Log","description":"Clear all activity logs for a scenario.\nNote: This is destructive and should be used with caution.\n\nArgs:\n    scenario_id: Scenario ID\n\nReturns:\n    Success message with count of deleted entries","operationId":"clear_scenario_activity_log_api_activity_logs_scenario__scenario_id__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario 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/activity-logs/scenario/{scenario_id}/count":{"get":{"tags":["activity-logs"],"summary":"Get Activity Count","description":"Get activity count statistics for a scenario.\n\nArgs:\n    scenario_id: Scenario ID\n\nReturns:\n    Activity count statistics including breakdown by action and entity type","operationId":"get_activity_count_api_activity_logs_scenario__scenario_id__count_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityCount"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/activity-logs/{activity_id}":{"get":{"tags":["activity-logs"],"summary":"Get Activity","description":"Get a single activity log entry by ID.\n\nArgs:\n    activity_id: Activity log ID\n\nReturns:\n    Activity log entry with full details including metadata","operationId":"get_activity_api_activity_logs__activity_id__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"activity_id","in":"path","required":true,"schema":{"type":"integer","title":"Activity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityLog"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["activity-logs"],"summary":"Delete Activity","description":"Delete an activity log entry.\nNote: Generally activity logs should not be deleted for audit purposes.\n\nArgs:\n    activity_id: Activity log ID\n\nReturns:\n    Success message","operationId":"delete_activity_api_activity_logs__activity_id__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"activity_id","in":"path","required":true,"schema":{"type":"integer","title":"Activity 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/activity-logs/":{"post":{"tags":["activity-logs"],"summary":"Create Activity Log","description":"Create a new activity log entry manually.\nNote: Most activity logs are created automatically by other endpoints.\n\nArgs:\n    activity_data: Activity log data\n\nReturns:\n    Created activity log entry","operationId":"create_activity_log_api_activity_logs__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityLogCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityLog"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/ai/status":{"get":{"tags":["ai"],"summary":"Get Ai Status","description":"Get AI service status.\n\nReturns information about:\n- Whether AI is enabled\n- Available providers\n- Current model\n- Feature flags","operationId":"get_ai_status_api_ai_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIServiceStatus"}}}}}}},"/api/ai/rate-limit":{"get":{"tags":["ai"],"summary":"Get Rate Limit Status","description":"Get rate limit status for current user.\n\nReturns:\n- Whether requests are allowed\n- Remaining requests\n- When limit resets","operationId":"get_rate_limit_status_api_ai_rate_limit_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitStatus"}}}}}}},"/api/ai/providers":{"get":{"tags":["ai"],"summary":"List Providers","description":"List available AI providers.\n\nReturns information about each provider:\n- Name\n- Whether it's available (configured)\n- Description","operationId":"list_providers_api_ai_providers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/ai/quick-actions":{"get":{"tags":["ai"],"summary":"Get Quick Actions","description":"Get predefined quick actions for the chat interface.\n\nReturns a list of common planning questions users can click to ask.","operationId":"get_quick_actions_api_ai_quick_actions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuickActionsResponse"}}}}}}},"/api/ai/models":{"get":{"tags":["ai"],"summary":"List Available Models","description":"The models the assistant uses, in the order they are tried: the\nworkstation model, then the cloud model (services/llm_settings.py).","operationId":"list_available_models_api_ai_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/ai/chat":{"post":{"tags":["ai"],"summary":"Chat","description":"General chat endpoint for planning questions.\n\nAccepts a message and optional context (scenario data, analysis results).\nReturns an AI-generated response.\n\nRate limited:\n- Authenticated users: 100 requests/hour\n- Anonymous users: 20 requests/hour","operationId":"chat_api_ai_chat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ai/chat/stream":{"post":{"tags":["ai"],"summary":"Chat Stream","description":"Streaming chat endpoint for real-time responses.\n\nUses Server-Sent Events (SSE) to stream the response as it's generated.\nThis provides a better user experience for longer responses.\n\nReturns:\n- Content-Type: text/event-stream\n- Data format: SSE with JSON chunks","operationId":"chat_stream_api_ai_chat_stream_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ai/analyze/scenario/{scenario_id}":{"post":{"tags":["ai"],"summary":"Analyze Scenario","description":"Analyze a planning scenario with AI.\n\nFetches scenario data and runs AI analysis to provide:\n- Overall assessment\n- Recommendations\n- Potential concerns\n\nArgs:\n    scenario_id: ID of the scenario to analyze","operationId":"analyze_scenario_api_ai_analyze_scenario__scenario_id__post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScenarioAnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ai/analyze/transport/{scenario_id}":{"post":{"tags":["ai"],"summary":"Analyze Transport","description":"Analyze transport impacts for a scenario with AI.\n\nFetches scenario transport data and runs AI analysis to provide:\n- Transport assessment\n- Mode shift recommendations\n- VKT reduction strategies\n\nArgs:\n    scenario_id: ID of the scenario to analyze","operationId":"analyze_transport_api_ai_analyze_transport__scenario_id__post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransportAnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ai/insights":{"post":{"tags":["ai"],"summary":"Generate Analysis Insights","description":"Generate AI insights for analysis results.\n\nTakes analysis results from any of the 9 analysis types and generates:\n- Summary of the analysis\n- Key findings (3-5 bullet points)\n- Recommendations (3-5 actionable items)\n- Concerns/warnings (if any)\n- Opportunities (if any)\n\nSupports three audience types:\n- technical: For planning staff and consultants\n- elected: For councillors and decision-makers\n- community: Plain language for community members\n\nArgs:\n    analysis_type: Type of analysis (e.g., 'land-use-mix', 'transport')\n    analysis_results: The analysis results dictionary\n    scenario_name: Optional scenario name for context\n    audience: Target audience for the insights","operationId":"generate_analysis_insights_api_ai_insights_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisInsightsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisInsightsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ai/insights/jobs":{"post":{"tags":["ai"],"summary":"Start Analysis Insights Job","description":"Same as /insights, in the background: returns {job_id, status} at once. Poll GET /api/ai/jobs/{job_id} for\nstatus (running, done, failed) and result. The live model can take longer than the proxy keeps a request open.\nWith scenario_id from the scenario's owner, the explanation is saved with the result it explains.","operationId":"start_analysis_insights_job_api_ai_insights_jobs_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisInsightsRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/ai/explain":{"post":{"tags":["ai"],"summary":"Explain Indicators","description":"Generate plain-language explanation of planning indicators.\n\nAccepts indicator values and target audience to provide\naccessible explanations suitable for different stakeholders.\n\nArgs:\n    indicators: Dictionary of indicator names and values\n    audience: Target audience ('technical', 'elected', 'community')","operationId":"explain_indicators_api_ai_explain_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndicatorExplanationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndicatorExplanationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ai/suggest":{"post":{"tags":["ai"],"summary":"Suggest Development Types","description":"Get AI suggestions for appropriate development types.\n\nBased on parcel characteristics and context, suggests\nsuitable development types with justifications.\n\nArgs:\n    parcel_area_ha: Parcel area in hectares\n    location_context: Location context (CBD, suburban, etc.)\n    current_use: Current land use\n    zoning: Current zoning\n    transit_access: Transit access level\n    neighboring_uses: Neighboring land uses","operationId":"suggest_development_types_api_ai_suggest_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevelopmentSuggestionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevelopmentSuggestionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ai/report/section":{"post":{"tags":["ai"],"summary":"Generate Report Section","description":"Generate a single report section with AI.\n\nCreates professional planning report content for:\n- Executive summary\n- Methodology\n- Findings\n- Recommendations\n- Conclusion\n\nArgs:\n    scenario_id: ID of the scenario\n    section_type: Type of section to generate\n    analysis_results: Optional analysis results to include\n    audience: Target audience","operationId":"generate_report_section_api_ai_report_section_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportSectionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportSectionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/ai/report/full":{"post":{"tags":["ai"],"summary":"Generate Full Report","description":"Generate a full AI-written report with multiple sections.\n\nCreates a complete planning report with selected sections.\nEach section is generated sequentially to ensure coherence.\n\nArgs:\n    scenario_id: ID of the scenario\n    include_sections: List of sections to include\n    audience: Target audience\n    analysis_results: Optional analysis results to include","operationId":"generate_full_report_api_ai_report_full_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FullReportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FullReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/ai/report/pdf":{"post":{"tags":["ai"],"summary":"Generate Pdf Report Content","description":"Generate AI content for PDF reports.\n\nCreates comprehensive AI-generated content specifically formatted for PDF export:\n- Executive summary with context-aware analysis\n- Key findings based on analysis results\n- Actionable recommendations\n- Policy alignment commentary\n- Concerns and opportunities\n- Next steps\n\nSupports three audience types:\n- technical: For planning staff and consultants\n- elected: For councillors and decision-makers\n- community: Plain language for community members\n\nArgs:\n    scenario_id: ID of the scenario\n    analysis_type: Type of analysis (e.g., 'land-use-mix', 'transport')\n    analysis_results: The analysis results dictionary\n    scenario_name: Optional scenario name for context\n    audience: Target audience for the content\n    include_sections: List of sections to generate","operationId":"generate_pdf_report_content_api_ai_report_pdf_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIPDFReportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIPDFReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ai/parse-scenario":{"post":{"tags":["ai"],"summary":"Parse Scenario Description","description":"Build's \"Or describe it in words (AI)\": the planner's words -> draft sites, each a development type and, when\nthe words name them, the buildings on it (\"medium density with 30 townhouses and 10 houses\" is one site with\nthose buildings, which Fill places when it's added). The AI is shown the live catalogue of development and\nbuilding types; the type picked in Build is used when the words name none (services/scenario_words.py).","operationId":"parse_scenario_description_api_ai_parse_scenario_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScenarioParseRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScenarioParseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ai/parse-site-edit":{"post":{"tags":["ai"],"summary":"Parse Site Edit","description":"Build's describe box with a site selected: the planner's words -> a site edit (services/site_edit.py), shown as a\npreview before it's applied. Body: {text, site: {dev_type, area_ha, buildings}}. Common phrasings are read\nwithout the AI (services/site_edit_words.py); anything else goes to the AI with the catalogue.","operationId":"parse_site_edit_api_ai_parse_site_edit_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ai/strategic-fit/{scenario_id}":{"post":{"tags":["ai"],"summary":"Strategic Fit","description":"How the plan fits the Plan for Victoria (2025) actions a site plan can be judged against, judged by the AI only\non evidence the app holds (services/strategic_fit.py): the plan's figures, the Check findings the client sends\n(body.check: {zones, findings, rules_version}) and the current saved model results. Each answer carries the\nevidence it used and their sources. Body: {audience: technical | elected | community, check?}.","operationId":"strategic_fit_api_ai_strategic_fit__scenario_id__post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ai/strategic-fit/{scenario_id}/jobs":{"post":{"tags":["ai"],"summary":"Start Strategic Fit Job","description":"Same as /strategic-fit/{id}, in the background: returns {job_id, status} at once; poll GET /api/ai/jobs/{job_id}.","operationId":"start_strategic_fit_job_api_ai_strategic_fit__scenario_id__jobs_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ai/jobs/{job_id}":{"get":{"tags":["ai"],"summary":"Get Ai Job","description":"An AI job's state: status (running, done, failed), and result (the endpoint's usual response) or error.","operationId":"get_ai_job_api_ai_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Ai Job Api Ai Jobs  Job Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ai/scenarios/{scenario_id}/ai-propose":{"post":{"tags":["ai"],"summary":"Ai Propose","description":"Generate AI-powered development proposal for a scenario.\n\nTwo-stage pipeline:\n1. Rules engine generates 3 valid proposals (conservative/moderate/bold)\n2. LLM picks best proposal and explains reasoning\n\nIf LLM is unavailable, returns moderate proposal with generic reasoning.","operationId":"ai_propose_api_ai_scenarios__scenario_id__ai_propose_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}},{"name":"include_reasoning","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Reasoning"}},{"name":"force_dev_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Force Dev Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/buildings/bbox":{"get":{"tags":["buildings"],"summary":"Get buildings by bounding box","description":"Fetch Microsoft Building Footprints within a geographic bounding box.\n\n    The data comes from Microsoft's Global ML Building Footprints dataset,\n    which contains 5M+ Australian buildings detected from Bing Maps imagery.\n\n    Results are cached locally for 30 days to improve performance.","operationId":"get_buildings_by_bbox_api_buildings_bbox_get","parameters":[{"name":"minx","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"description":"West longitude (-180 to 180)","title":"Minx"},"description":"West longitude (-180 to 180)"},{"name":"miny","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"description":"South latitude (-90 to 90)","title":"Miny"},"description":"South latitude (-90 to 90)"},{"name":"maxx","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"description":"East longitude (-180 to 180)","title":"Maxx"},"description":"East longitude (-180 to 180)"},{"name":"maxy","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"description":"North latitude (-90 to 90)","title":"Maxy"},"description":"North latitude (-90 to 90)"},{"name":"max_buildings","in":"query","required":false,"schema":{"type":"integer","maximum":50000,"minimum":1,"description":"Maximum buildings to return","default":10000,"title":"Max Buildings"},"description":"Maximum buildings to return"},{"name":"min_confidence","in":"query","required":false,"schema":{"type":"number","maximum":1.0,"minimum":0.0,"description":"Minimum confidence score (0-1)","default":0.0,"title":"Min Confidence"},"description":"Minimum confidence score (0-1)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildingsResponse"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildingsErrorResponse"}}},"description":"Bad Request"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildingsErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/buildings/count":{"get":{"tags":["buildings"],"summary":"Count buildings in bounding box","description":"Get the count of buildings without returning full geometry data.","operationId":"count_buildings_api_buildings_count_get","parameters":[{"name":"minx","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"description":"West longitude","title":"Minx"},"description":"West longitude"},{"name":"miny","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"description":"South latitude","title":"Miny"},"description":"South latitude"},{"name":"maxx","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"description":"East longitude","title":"Maxx"},"description":"East longitude"},{"name":"maxy","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"description":"North latitude","title":"Maxy"},"description":"North latitude"},{"name":"min_confidence","in":"query","required":false,"schema":{"type":"number","maximum":1.0,"minimum":0.0,"description":"Minimum confidence score","default":0.0,"title":"Min Confidence"},"description":"Minimum confidence score"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildingsCountResponse"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildingsErrorResponse"}}},"description":"Bad Request"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildingsErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/buildings/cache/stats":{"get":{"tags":["buildings"],"summary":"Get cache statistics","description":"Get statistics about the local building footprints cache.","operationId":"get_cache_stats_api_buildings_cache_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildingsCacheStats"}}}}}}},"/api/buildings/cache":{"delete":{"tags":["buildings"],"summary":"Clear building cache","description":"Clear cached building tiles, optionally only those older than a specified number of days.","operationId":"clear_cache_api_buildings_cache_delete","parameters":[{"name":"older_than_days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Only clear tiles older than this many days. If not specified, clears all.","title":"Older Than Days"},"description":"Only clear tiles older than this many days. If not specified, clears all."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Clear Cache Api Buildings Cache Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/segmentation/status":{"get":{"tags":["segmentation"],"summary":"Get SAM service status","description":"Check the availability and configuration of the SAM segmentation service.","operationId":"get_service_status_api_segmentation_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SAMServiceStatus"}}}}}}},"/api/segmentation/text":{"post":{"tags":["segmentation"],"summary":"Segment by text prompt","description":"Detect and segment features using natural language text prompts.\n\n    Uses LangSAM (GroundingDINO + SAM) to find features matching the text description.\n\n    **Examples:**\n    - \"building\" - Detect all buildings\n    - \"parking lot\" - Detect parking areas\n    - \"swimming pool\" - Detect pools\n    - \"solar panel\" - Detect rooftop solar installations\n\n    **Process:**\n    1. Fetch satellite imagery for the bounding box\n    2. Run GroundingDINO to detect bounding boxes matching the text\n    3. Run SAM to refine detections to precise polygon masks\n    4. Convert masks to GeoJSON polygons\n\n    **Note:** First request may take longer due to model loading (~30s).\n    Subsequent requests use cached models.","operationId":"segment_by_text_api_segmentation_text_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TextSegmentationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SegmentationResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SegmentationErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SegmentationErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/segmentation/text/jobs":{"post":{"tags":["segmentation"],"summary":"Start a text-prompt detection in the background","description":"Same input as `/text`, but returns at once with a `job_id`. Poll\n    `GET /api/segmentation/jobs/{job_id}` for `status` (queued, running, done,\n    failed), the current `stage` (imagery, loading_model, waiting, finding,\n    outlining) with `done` of `total` steps, and `result` when done.\n\n    Use this from browsers: a detection can take one to three minutes, longer\n    than the proxy keeps a request open.","operationId":"start_text_job_api_segmentation_text_jobs_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TextSegmentationRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Start Text Job Api Segmentation Text Jobs Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/segmentation/jobs/{job_id}":{"get":{"tags":["segmentation"],"summary":"Progress and result of a detection job","operationId":"get_job_api_segmentation_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Job Api Segmentation Jobs  Job Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/segmentation/point":{"post":{"tags":["segmentation"],"summary":"Segment by point prompts","description":"Click-to-segment: Use point prompts to segment specific features.\n\n    Provide foreground points (label=1) on features you want to segment,\n    and optionally background points (label=0) to exclude areas.\n\n    **Process:**\n    1. Fetch satellite imagery for the bounding box\n    2. Convert geographic coordinates to pixel coordinates\n    3. Run SAM with point prompts\n    4. Convert result mask to GeoJSON polygon","operationId":"segment_by_points_api_segmentation_point_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PointSegmentationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SegmentationResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SegmentationErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SegmentationErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/segmentation/box":{"post":{"tags":["segmentation"],"summary":"Segment by box prompt","description":"Draw a rectangle to segment features within that area.\n\n    The box prompt tells SAM to segment the main object within the specified rectangle.\n\n    **Use case:** When you can see a building or feature and want to quickly\n    segment it by drawing a box around it.","operationId":"segment_by_box_api_segmentation_box_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoxSegmentationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SegmentationResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SegmentationErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SegmentationErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/segmentation/automatic":{"post":{"tags":["segmentation"],"summary":"Automatic segmentation","description":"Automatically segment all features in an image.\n\n    SAM generates masks for all detectable objects in the image without\n    requiring any prompts.\n\n    **Use case:** Get an overview of all buildings/features in an area,\n    then filter or select the ones you want.\n\n    **Warning:** This can return many features. Use min_area_sqm and\n    max_features to filter results.","operationId":"segment_automatic_api_segmentation_automatic_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutomaticSegmentationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SegmentationResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SegmentationErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SegmentationErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/segmentation/cache/stats":{"get":{"tags":["segmentation"],"summary":"Get cache statistics","description":"Get statistics about the SAM imagery and results cache.","operationId":"get_cache_stats_api_segmentation_cache_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Cache Stats Api Segmentation Cache Stats Get"}}}}}}},"/api/segmentation/cache":{"delete":{"tags":["segmentation"],"summary":"Clear SAM cache (admin)","description":"Clear cached imagery and segmentation results. Admins only: clearing removes imagery that running detections are reading.","operationId":"clear_cache_api_segmentation_cache_delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"older_than_hours","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Only clear files older than this many hours. If not specified, clears all.","title":"Older Than Hours"},"description":"Only clear files older than this many hours. If not specified, clears all."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Clear Cache Api Segmentation Cache Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/network/status":{"get":{"tags":["network","Network Analysis"],"summary":"Get Network Status","description":"Get network analysis service status.\n\nReturns information about OSMnx availability, cache status, and settings.","operationId":"get_network_status_api_network_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkServiceStatus"}}}}}}},"/api/network/isochrone":{"post":{"tags":["network","Network Analysis"],"summary":"Generate Isochrone","description":"Generate walking isochrones from a point.\n\nCreates polygons showing areas reachable within specified walking times.\nUses real street network data from OpenStreetMap.\n\n**Parameters:**\n- lat, lon: Center point coordinates\n- travel_times: List of travel times in minutes (default: [5, 10, 15, 20])\n- network_type: walk, bike, or drive (default: walk)\n\n**Returns:**\n- GeoJSON polygons for each travel time\n- Area calculations\n- Network statistics","operationId":"generate_isochrone_api_network_isochrone_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IsochroneRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IsochroneResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/network/walk-distance":{"get":{"tags":["network","Network Analysis"],"summary":"Calculate Walk Distance","description":"Calculate real walking distance between two points.\n\nUses actual street network routing to find the shortest walking path.\n\n**Parameters:**\n- lat1, lon1: Origin coordinates\n- lat2, lon2: Destination coordinates\n\n**Returns:**\n- Straight line distance\n- Real walking distance\n- Detour factor (walk distance / straight line)\n- Estimated walk time","operationId":"calculate_walk_distance_api_network_walk_distance_get","parameters":[{"name":"lat1","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"description":"Origin latitude","title":"Lat1"},"description":"Origin latitude"},{"name":"lon1","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"description":"Origin longitude","title":"Lon1"},"description":"Origin longitude"},{"name":"lat2","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"description":"Destination latitude","title":"Lat2"},"description":"Destination latitude"},{"name":"lon2","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"description":"Destination longitude","title":"Lon2"},"description":"Destination longitude"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalkDistanceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["network","Network Analysis"],"summary":"Calculate Walk Distance Post","description":"Calculate real walking distance between two points (POST version).\n\nSame as GET /walk-distance but accepts JSON body.","operationId":"calculate_walk_distance_post_api_network_walk_distance_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalkDistanceRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalkDistanceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/network/metrics":{"get":{"tags":["network","Network Analysis"],"summary":"Get Network Metrics","description":"Calculate network connectivity metrics for an area.\n\nAnalyzes the street network structure around a point.\n\n**Parameters:**\n- lat, lon: Center coordinates\n- radius_m: Analysis radius (100-5000m, default: 1000m)\n\n**Returns:**\n- Intersection density (per km²)\n- Average block length\n- Street density\n- Dead end count\n- Network circuity","operationId":"get_network_metrics_api_network_metrics_get","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"description":"Center latitude","title":"Lat"},"description":"Center latitude"},{"name":"lon","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"description":"Center longitude","title":"Lon"},"description":"Center longitude"},{"name":"radius_m","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":100,"description":"Analysis radius in meters","default":1000,"title":"Radius M"},"description":"Analysis radius in meters"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkMetricsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["network","Network Analysis"],"summary":"Get Network Metrics Post","description":"Calculate network connectivity metrics for an area (POST version).\n\nSame as GET /metrics but accepts JSON body.","operationId":"get_network_metrics_post_api_network_metrics_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkMetricsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkMetricsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/network/amenities":{"post":{"tags":["network","Network Analysis"],"summary":"Find Nearest Amenities","description":"Find nearest amenities and calculate real walking distances.\n\nSearches for amenities from OpenStreetMap and calculates\nactual walking distances using street network routing.\n\n**Parameters:**\n- lat, lon: Center coordinates\n- amenity_types: List of OSM amenity tags (e.g., supermarket, cafe, school)\n- max_distance_m: Maximum search radius (default: 2000m)\n\n**Returns:**\n- Nearest amenity of each type\n- Real walking distance\n- Estimated walk time","operationId":"find_nearest_amenities_api_network_amenities_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AmenityProximityRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AmenityProximityResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["network","Network Analysis"],"summary":"Find Nearest Amenities Get","description":"Find nearest amenities (GET version).\n\nSame as POST /amenities but uses query parameters.","operationId":"find_nearest_amenities_get_api_network_amenities_get","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"description":"Center latitude","title":"Lat"},"description":"Center latitude"},{"name":"lon","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"description":"Center longitude","title":"Lon"},"description":"Center longitude"},{"name":"amenity_types","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated amenity types","default":"supermarket,cafe,school,pharmacy","title":"Amenity Types"},"description":"Comma-separated amenity types"},{"name":"max_distance_m","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":100,"description":"Maximum search radius","default":2000,"title":"Max Distance M"},"description":"Maximum search radius"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AmenityProximityResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/network/cache/stats":{"get":{"tags":["network","Network Analysis"],"summary":"Get Cache Stats","description":"Get network cache statistics.\n\nReturns information about cached street networks.","operationId":"get_cache_stats_api_network_cache_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkCacheStats"}}}}}}},"/api/network/cache":{"delete":{"tags":["network","Network Analysis"],"summary":"Clear Cache","description":"Clear all cached networks.\n\nDeletes all cached street network files and clears memory cache.\nNetworks will be re-downloaded on next request.","operationId":"clear_cache_api_network_cache_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/schemas__network_schemas__CacheClearResponse"}}}}}}},"/api/census/status":{"get":{"tags":["census","Census"],"summary":"Get Census Status","description":"Get the status of the Census service.\n\nReturns:\n    Service availability, cache statistics, and available boundary types.","operationId":"get_census_status_api_census_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CensusServiceStatus"}}}}}}},"/api/census/boundaries/{boundary_type}":{"get":{"tags":["census","Census"],"summary":"Get Boundaries","description":"Get boundary geometries within a bounding box.\n\n**Boundary Types:**\n- `sa1`: Statistical Area Level 1 (smallest, 200-800 people)\n- `sa2`: Statistical Area Level 2 (community level, 3,000-25,000 people)\n- `sa3`: Statistical Area Level 3 (regional/labour markets)\n- `sa4`: Statistical Area Level 4 (large labour market regions)\n- `lga`: Local Government Area (council boundaries)\n- `gccsa`: Greater Capital City Statistical Area\n\n**Example:**\n```\nGET /api/census/boundaries/sa2?minx=144.9&miny=-37.85&maxx=145.0&maxy=-37.8\n```\n\nReturns a GeoJSON FeatureCollection with boundary polygons.","operationId":"get_boundaries_api_census_boundaries__boundary_type__get","parameters":[{"name":"boundary_type","in":"path","required":true,"schema":{"type":"string","title":"Boundary Type"}},{"name":"minx","in":"query","required":true,"schema":{"type":"number","description":"Minimum longitude (west)","title":"Minx"},"description":"Minimum longitude (west)"},{"name":"miny","in":"query","required":true,"schema":{"type":"number","description":"Minimum latitude (south)","title":"Miny"},"description":"Minimum latitude (south)"},{"name":"maxx","in":"query","required":true,"schema":{"type":"number","description":"Maximum longitude (east)","title":"Maxx"},"description":"Maximum longitude (east)"},{"name":"maxy","in":"query","required":true,"schema":{"type":"number","description":"Maximum latitude (north)","title":"Maxy"},"description":"Maximum latitude (north)"},{"name":"generalised","in":"query","required":false,"schema":{"type":"boolean","description":"Use generalised boundaries (faster)","default":true,"title":"Generalised"},"description":"Use generalised boundaries (faster)"},{"name":"victoria_only","in":"query","required":false,"schema":{"type":"boolean","description":"Filter to Victorian boundaries only","default":true,"title":"Victoria Only"},"description":"Filter to Victorian boundaries only"},{"name":"max_features","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"description":"Maximum features to return","default":500,"title":"Max Features"},"description":"Maximum features to return"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoundariesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/census/boundaries/code/{boundary_type}/{code}":{"get":{"tags":["census","Census"],"summary":"Get Boundary By Code","description":"Get a specific boundary by its code.\n\n**Example:**\n```\nGET /api/census/boundaries/code/sa2/206041164\n```\n\nReturns a single GeoJSON Feature or 404 if not found.","operationId":"get_boundary_by_code_api_census_boundaries_code__boundary_type___code__get","parameters":[{"name":"boundary_type","in":"path","required":true,"schema":{"type":"string","title":"Boundary Type"}},{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/census/demographics":{"post":{"tags":["census","Census"],"summary":"Get Demographics","description":"Get demographic information for boundaries within a bounding box.\n\nThis aggregates information from SA1 or SA2 boundaries that intersect\nthe specified area.\n\n**Note:** Full demographic data (population, age, income, etc.) requires\nCensus DataPacks integration. Currently returns boundary names and codes.\n\n**Example:**\n```json\n{\n    \"minx\": 144.9,\n    \"miny\": -37.85,\n    \"maxx\": 145.0,\n    \"maxy\": -37.8,\n    \"boundary_type\": \"sa2\"\n}\n```","operationId":"get_demographics_api_census_demographics_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemographicsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemographicsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/census/boundary-types":{"get":{"tags":["census","Census"],"summary":"List Boundary Types","description":"Get list of available boundary types.\n\nReturns information about each boundary type including:\n- Code (sa1, sa2, lga, etc.)\n- Full name\n- Description","operationId":"list_boundary_types_api_census_boundary_types_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/census/cache/stats":{"get":{"tags":["census","Census"],"summary":"Get Cache Stats","description":"Get cache statistics.\n\nReturns:\n    Cache directory, file count, total size, and memory cache items.","operationId":"get_cache_stats_api_census_cache_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CacheStatsResponse"}}}}}}},"/api/census/cache":{"delete":{"tags":["census","Census"],"summary":"Clear Cache","description":"Clear all cached census data.\n\nThis removes all cached boundary and demographic data.\nUse this if you need to force fresh data from the ABS API.","operationId":"clear_cache_api_census_cache_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/schemas__census_schemas__CacheClearResponse"}}}}}}},"/api/census/data/cache/stats":{"get":{"tags":["census","Census"],"summary":"Get Data Cache Stats","description":"Get ABS Data API cache statistics.\n\nReturns cache statistics for the demographic data cache.","operationId":"get_data_cache_stats_api_census_data_cache_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/census/data/{region_type}/{region_code}":{"get":{"tags":["census","Census"],"summary":"Get Census Data","description":"Get comprehensive Census 2021 demographic data for a region.\n\nThis fetches real demographic data from the ABS Data API including:\n- Population and age distribution\n- Median income, rent, mortgage\n- Dwelling structure and counts\n- Employment and labour force statistics\n\n**Parameters:**\n- `region_type`: Either \"sa2\" or \"lga\"\n- `region_code`: The SA2 or LGA code (e.g., \"212051325\" for Mulgrave SA2)\n\n**Example:**\n```\nGET /api/census/data/sa2/212051325\n```\n\nReturns comprehensive demographic data from Census 2021.","operationId":"get_census_data_api_census_data__region_type___region_code__get","parameters":[{"name":"region_type","in":"path","required":true,"schema":{"type":"string","title":"Region Type"}},{"name":"region_code","in":"path","required":true,"schema":{"type":"string","title":"Region Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/census/travel/status":{"get":{"tags":["census","Census"],"summary":"Get Travel Service Status","description":"Get the status of the Census Travel service.\n\nReturns:\n    Service availability and cache statistics.","operationId":"get_travel_service_status_api_census_travel_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TravelServiceStatus"}}}}}}},"/api/census/travel/{sa2_code}":{"get":{"tags":["census","Census"],"summary":"Get Transport Context","description":"Get comprehensive transport context for an SA2 region.\n\nThis combines Method of Travel to Work (G62) and Motor Vehicles per Dwelling (G34)\nCensus 2021 data to provide a complete picture of transport patterns in the area.\n\n**Parameters:**\n- `sa2_code`: 9-digit SA2 code (e.g., \"206041504\" for Melbourne CBD)\n\n**Returns:**\n- Mode splits by transport type (car, PT, active, WFH)\n- Vehicle ownership distribution\n- Transport sustainability score (0-100)\n\n**Example:**\n```\nGET /api/census/travel/206041504\n```\n\n**Use Cases:**\n- Transport Impact Analysis: Replace proxy mode splits with real data\n- Parking demand calculations: Use actual vehicle ownership rates\n- Sustainability assessments: Compare against benchmarks","operationId":"get_transport_context_api_census_travel__sa2_code__get","parameters":[{"name":"sa2_code","in":"path","required":true,"schema":{"type":"string","title":"Sa2 Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransportContextResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/census/travel/{sa2_code}/modes":{"get":{"tags":["census","Census"],"summary":"Get Travel To Work","description":"Get Method of Travel to Work data for an SA2 region.\n\nReturns Census 2021 G62 data showing how employed persons travel to work,\nincluding mode splits and work-from-home percentages.\n\n**Parameters:**\n- `sa2_code`: 9-digit SA2 code\n\n**Mode Categories:**\n- **Public Transport**: Train, bus, ferry, tram/light rail\n- **Private Vehicle**: Car driver, car passenger, truck, motorbike\n- **Active Transport**: Bicycle, walking\n- **Work from Home**: Worked at home\n- **Other**: Taxi, ride-share, other modes\n\n**Example:**\n```\nGET /api/census/travel/206041504/modes\n```","operationId":"get_travel_to_work_api_census_travel__sa2_code__modes_get","parameters":[{"name":"sa2_code","in":"path","required":true,"schema":{"type":"string","title":"Sa2 Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TravelToWorkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/census/travel/{sa2_code}/vehicles":{"get":{"tags":["census","Census"],"summary":"Get Vehicle Ownership","description":"Get Motor Vehicles per Dwelling data for an SA2 region.\n\nReturns Census 2021 G34 data showing the distribution of vehicle ownership\nacross private dwellings in the area.\n\n**Parameters:**\n- `sa2_code`: 9-digit SA2 code\n\n**Metrics Returned:**\n- Vehicle distribution: 0, 1, 2, 3, 4+ vehicles per dwelling\n- Average vehicles per dwelling\n- Zero-vehicle rate (percentage with no car)\n\n**Example:**\n```\nGET /api/census/travel/206041504/vehicles\n```\n\n**Use Cases:**\n- Parking demand calculations\n- Transport accessibility assessment\n- Car dependency analysis","operationId":"get_vehicle_ownership_api_census_travel__sa2_code__vehicles_get","parameters":[{"name":"sa2_code","in":"path","required":true,"schema":{"type":"string","title":"Sa2 Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VehicleOwnershipResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/census/housing/status":{"get":{"tags":["census","Census"],"summary":"Get Housing Service Status","description":"Get the status of the Census Housing Market service.\n\nReturns:\n    Service availability and cache statistics.","operationId":"get_housing_service_status_api_census_housing_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HousingServiceStatus"}}}}}}},"/api/census/housing/{sa2_code}":{"get":{"tags":["census","Census"],"summary":"Get Housing Market Context","description":"Get comprehensive housing market context for an SA2 region.\n\nThis combines multiple Census 2021 datasets to provide a complete picture\nof housing market conditions including income, tenure, affordability,\nand dwelling stock.\n\n**Parameters:**\n- `sa2_code`: 9-digit SA2 code (e.g., \"206041504\" for Melbourne CBD)\n\n**Data Included:**\n- Household Income (G33): Income distribution, median income\n- Tenure Mix (G37): Ownership vs rental, social housing rates\n- Mortgage Repayments (G38): Monthly repayment distribution\n- Rent (G40): Weekly rent distribution\n- Dwelling Structure (G41): House/apartment mix, bedroom counts\n- Housing Stress: 30% income threshold analysis\n- Affordability Index: Income to housing cost ratios\n\n**Example:**\n```\nGET /api/census/housing/206041504\n```\n\n**Use Cases:**\n- Housing Balance Analysis: Replace proxy values with real data\n- Development Feasibility: Use actual rent levels for yield calculations\n- Affordability Assessment: Calculate housing stress rates","operationId":"get_housing_market_context_api_census_housing__sa2_code__get","parameters":[{"name":"sa2_code","in":"path","required":true,"schema":{"type":"string","title":"Sa2 Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HousingMarketContextResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/census/housing/{sa2_code}/income":{"get":{"tags":["census","Census"],"summary":"Get Household Income","description":"Get Household Income (G33) data for an SA2 region.\n\nReturns Census 2021 G33 data showing household income distribution,\nincluding estimated median income and low-income household rates.\n\n**Parameters:**\n- `sa2_code`: 9-digit SA2 code\n\n**Metrics Returned:**\n- Median weekly/annual household income (estimated from brackets)\n- Income distribution by bracket\n- Low income household count (<$650/week)\n- Low income rate percentage\n\n**Example:**\n```\nGET /api/census/housing/206041504/income\n```","operationId":"get_household_income_api_census_housing__sa2_code__income_get","parameters":[{"name":"sa2_code","in":"path","required":true,"schema":{"type":"string","title":"Sa2 Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HouseholdIncomeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/census/housing/{sa2_code}/tenure":{"get":{"tags":["census","Census"],"summary":"Get Tenure Mix","description":"Get Tenure and Landlord Type (G37) data for an SA2 region.\n\nReturns Census 2021 G37 data showing housing tenure distribution,\nincluding home ownership rates and social housing levels.\n\n**Parameters:**\n- `sa2_code`: 9-digit SA2 code\n\n**Metrics Returned:**\n- Tenure mix: owned outright, mortgaged, rented, social housing\n- Home ownership rate (outright + mortgage)\n- Rental rate\n- Social housing rate and gap to 5% target\n\n**Example:**\n```\nGET /api/census/housing/206041504/tenure\n```\n\n**Use Cases:**\n- Housing diversity assessment\n- Social housing policy analysis\n- Tenure mix benchmarking","operationId":"get_tenure_mix_api_census_housing__sa2_code__tenure_get","parameters":[{"name":"sa2_code","in":"path","required":true,"schema":{"type":"string","title":"Sa2 Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenureMixResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/census/housing/{sa2_code}/mortgage":{"get":{"tags":["census","Census"],"summary":"Get Mortgage Repayments","description":"Get Mortgage Repayment (G38) data for an SA2 region.\n\nReturns Census 2021 G38 data showing monthly mortgage repayment\ndistribution for dwellings with a mortgage.\n\n**Parameters:**\n- `sa2_code`: 9-digit SA2 code\n\n**Metrics Returned:**\n- Median monthly/annual mortgage repayment\n- Total mortgaged dwellings\n- Repayment distribution by bracket\n\n**Example:**\n```\nGET /api/census/housing/206041504/mortgage\n```\n\n**Use Cases:**\n- Mortgage stress analysis\n- Development feasibility (affordability context)\n- Housing market benchmarking","operationId":"get_mortgage_repayments_api_census_housing__sa2_code__mortgage_get","parameters":[{"name":"sa2_code","in":"path","required":true,"schema":{"type":"string","title":"Sa2 Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MortgageRepaymentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/census/housing/{sa2_code}/rent":{"get":{"tags":["census","Census"],"summary":"Get Rent Payments","description":"Get Rent (G40) data for an SA2 region.\n\nReturns Census 2021 G40 data showing weekly rent distribution\nfor rented dwellings.\n\n**Parameters:**\n- `sa2_code`: 9-digit SA2 code\n\n**Metrics Returned:**\n- Median weekly/annual rent\n- Total rented dwellings\n- Rent distribution by bracket\n\n**Example:**\n```\nGET /api/census/housing/206041504/rent\n```\n\n**Use Cases:**\n- Rental affordability analysis\n- Development feasibility (yield calculations)\n- Investment property analysis","operationId":"get_rent_payments_api_census_housing__sa2_code__rent_get","parameters":[{"name":"sa2_code","in":"path","required":true,"schema":{"type":"string","title":"Sa2 Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RentPaymentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/census/housing/{sa2_code}/dwellings":{"get":{"tags":["census","Census"],"summary":"Get Dwelling Structure","description":"Get Dwelling Structure by Bedrooms (G41) data for an SA2 region.\n\nReturns Census 2021 G41 data showing the dwelling stock profile\nincluding structure types and bedroom counts.\n\n**Parameters:**\n- `sa2_code`: 9-digit SA2 code\n\n**Metrics Returned:**\n- Dwelling structure: houses, semi-detached, apartments by height\n- Bedroom distribution: 0-6+ bedrooms\n- Total dwellings\n\n**Example:**\n```\nGET /api/census/housing/206041504/dwellings\n```\n\n**Use Cases:**\n- Housing diversity analysis\n- Development matching (household size fit)\n- Dwelling stock benchmarking","operationId":"get_dwelling_structure_api_census_housing__sa2_code__dwellings_get","parameters":[{"name":"sa2_code","in":"path","required":true,"schema":{"type":"string","title":"Sa2 Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DwellingStructureResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/census/employment/status":{"get":{"tags":["census","Census"],"summary":"Get Employment Service Status","description":"Get the status of the Census Employment service.\n\nReturns:\n    Service availability and cache statistics.","operationId":"get_employment_service_status_api_census_employment_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmploymentServiceStatus"}}}}}}},"/api/census/employment/{sa2_code}":{"get":{"tags":["census","Census"],"summary":"Get Employment Context","description":"Get comprehensive employment context for an SA2 region.\n\nThis combines multiple Census 2021 datasets to provide a complete picture\nof employment, industry mix, occupation distribution, and qualifications.\n\n**Parameters:**\n- `sa2_code`: 9-digit SA2 code (e.g., \"206071140\" for Carlton North)\n\n**Data Included:**\n- Industry of Employment (G51): 19 ANZSIC industry divisions\n- Occupation (G57): 8 ANZSCO occupation groups\n- Qualifications (G43): Highest qualification attained\n- Labour Force Status (G46): Employment status distribution\n\n**Calculated Indicators:**\n- Sector Diversity Index: Shannon entropy (0-2.94)\n- Knowledge Worker %: Managers + Professionals\n- Labour Force Participation Rate\n- Unemployment Rate\n- Tertiary Qualified Percentage\n\n**Example:**\n```\nGET /api/census/employment/206071140\n```\n\n**Use Cases:**\n- Economic diversity analysis for development feasibility\n- Workforce profile for land use planning\n- Employment accessibility assessment","operationId":"get_employment_context_api_census_employment__sa2_code__get","parameters":[{"name":"sa2_code","in":"path","required":true,"schema":{"type":"string","title":"Sa2 Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmploymentContextResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/census/employment/{sa2_code}/industry":{"get":{"tags":["census","Census"],"summary":"Get Industry Mix","description":"Get Industry of Employment (G51) data for an SA2 region.\n\nReturns Census 2021 G51 data showing employment by industry division\nacross all 19 ANZSIC categories.\n\n**Parameters:**\n- `sa2_code`: 9-digit SA2 code\n\n**ANZSIC Industry Divisions:**\n- A: Agriculture, Forestry and Fishing\n- B: Mining\n- C: Manufacturing\n- D: Electricity, Gas, Water and Waste Services\n- E: Construction\n- F: Wholesale Trade\n- G: Retail Trade\n- H: Accommodation and Food Services\n- I: Transport, Postal and Warehousing\n- J: Information Media and Telecommunications\n- K: Financial and Insurance Services\n- L: Rental, Hiring and Real Estate Services\n- M: Professional, Scientific and Technical Services\n- N: Administrative and Support Services\n- O: Public Administration and Safety\n- P: Education and Training\n- Q: Health Care and Social Assistance\n- R: Arts and Recreation Services\n- S: Other Services\n\n**Example:**\n```\nGET /api/census/employment/206071140/industry\n```\n\n**Use Cases:**\n- Local economic profile analysis\n- Industry cluster identification\n- Economic resilience assessment","operationId":"get_industry_mix_api_census_employment__sa2_code__industry_get","parameters":[{"name":"sa2_code","in":"path","required":true,"schema":{"type":"string","title":"Sa2 Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndustryMixResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/census/employment/{sa2_code}/occupation":{"get":{"tags":["census","Census"],"summary":"Get Occupation Distribution","description":"Get Occupation (G57) data for an SA2 region.\n\nReturns Census 2021 G57 data showing employment by occupation group\nacross the 8 ANZSCO major groups.\n\n**Parameters:**\n- `sa2_code`: 9-digit SA2 code\n\n**ANZSCO Occupation Groups:**\n- 1: Managers (Knowledge Worker)\n- 2: Professionals (Knowledge Worker)\n- 3: Technicians and Trades Workers\n- 4: Community and Personal Service Workers\n- 5: Clerical and Administrative Workers\n- 6: Sales Workers\n- 7: Machinery Operators and Drivers\n- 8: Labourers\n\n**Knowledge Worker Calculation:**\nKnowledge Worker % = (Managers + Professionals) / Total Employed × 100\n\n**Example:**\n```\nGET /api/census/employment/206071140/occupation\n```\n\n**Use Cases:**\n- Workforce skill level assessment\n- Knowledge economy indicators\n- White collar vs blue collar analysis","operationId":"get_occupation_distribution_api_census_employment__sa2_code__occupation_get","parameters":[{"name":"sa2_code","in":"path","required":true,"schema":{"type":"string","title":"Sa2 Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OccupationDistributionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/census/employment/{sa2_code}/qualifications":{"get":{"tags":["census","Census"],"summary":"Get Qualifications","description":"Get Highest Educational Qualification (G43) data for an SA2 region.\n\nReturns Census 2021 G43 data showing the distribution of highest\neducational qualifications for persons aged 15+.\n\n**Parameters:**\n- `sa2_code`: 9-digit SA2 code\n\n**Qualification Levels:**\n- Postgraduate Degree (Masters, Doctorate)\n- Graduate Diploma/Certificate\n- Bachelor Degree\n- Advanced Diploma/Diploma\n- Certificate III/IV\n- Certificate I/II\n- Year 12 or equivalent\n- Year 11 or below\n- No educational attainment\n\n**Calculated Metrics:**\n- Tertiary Qualified %: Bachelor degree or higher\n- Skilled Workforce %: Certificate III or higher\n\n**Example:**\n```\nGET /api/census/employment/206071140/qualifications\n```\n\n**Use Cases:**\n- Education level assessment\n- Human capital indicators\n- Workforce qualification benchmarking","operationId":"get_qualifications_api_census_employment__sa2_code__qualifications_get","parameters":[{"name":"sa2_code","in":"path","required":true,"schema":{"type":"string","title":"Sa2 Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QualificationsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/census/employment/{sa2_code}/labour-force":{"get":{"tags":["census","Census"],"summary":"Get Labour Force","description":"Get Labour Force Status (G46) data for an SA2 region.\n\nReturns Census 2021 G46 data showing detailed labour force status\nfor persons aged 15+.\n\n**Parameters:**\n- `sa2_code`: 9-digit SA2 code\n\n**Labour Force Categories:**\n- Employed (full-time, part-time, away from work)\n- Unemployed (looking for work)\n- Not in Labour Force (NILF)\n\n**Calculated Rates:**\n- Participation Rate: (Employed + Unemployed) / Population 15+ × 100\n- Unemployment Rate: Unemployed / Labour Force × 100\n\n**Example:**\n```\nGET /api/census/employment/206071140/labour-force\n```\n\n**Use Cases:**\n- Labour market analysis\n- Economic participation assessment\n- Employment opportunity indicators","operationId":"get_labour_force_api_census_employment__sa2_code__labour_force_get","parameters":[{"name":"sa2_code","in":"path","required":true,"schema":{"type":"string","title":"Sa2 Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LabourForceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vicmap/status":{"get":{"tags":["vicmap","vicmap"],"summary":"Get Vicmap Status","description":"Check VicMap service status.\n\nReturns service availability and cache statistics.","operationId":"get_vicmap_status_api_vicmap_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/vicmap/lots":{"get":{"tags":["vicmap","vicmap"],"summary":"Lots In View","description":"The lots on title (Vicmap Parcel) in a small box, as GeoJSON, for drawing:\nsnapping to lot boundaries and picking a lot as a site. Each lot has its\nSPI (\"3\\PS123456\"), lot and plan, and whether it's a road parcel.","operationId":"lots_in_view_api_vicmap_lots_get","parameters":[{"name":"bbox","in":"query","required":true,"schema":{"type":"string","description":"minLon,minLat,maxLon,maxLat (at most 0.01° each way)","title":"Bbox"},"description":"minLon,minLat,maxLon,maxLat (at most 0.01° each way)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vicmap/parcels":{"post":{"tags":["vicmap","vicmap"],"summary":"Query Parcels","description":"Query property parcels within a geometry.\n\nReturns parcel count, total area, and property type breakdown.\nUseful for understanding existing land subdivision.","operationId":"query_parcels_api_vicmap_parcels_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParcelQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vicmap/addresses":{"post":{"tags":["vicmap","vicmap"],"summary":"Query Addresses","description":"Query address points within a geometry.\n\nAddress count serves as a proxy for existing dwelling count.\nReturns dwelling estimate, unit type breakdown, and sample addresses.","operationId":"query_addresses_api_vicmap_addresses_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddressQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vicmap/zones":{"post":{"tags":["vicmap","vicmap"],"summary":"Query Zones","description":"Query planning zones for a geometry.\n\nReturns zone codes, descriptions, and coverage percentages.\nUseful for understanding current zoning and density controls.","operationId":"query_zones_api_vicmap_zones_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZoneQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vicmap/overlays":{"post":{"tags":["vicmap","vicmap"],"summary":"Query Overlays","description":"Query planning overlays for a geometry.\n\nReturns overlay codes, descriptions, coverage percentages, and constraint analysis.\nOverlays include Heritage (HO), Design and Development (DDO), Environmental (ESO),\nBushfire (BMO), Flood (LSIO/SBO), and many more.\n\nPhase 4.5 - Victorian Planning Data Integration","operationId":"query_overlays_api_vicmap_overlays_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OverlayQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vicmap/overlay-info/{overlay_code}":{"get":{"tags":["vicmap","vicmap"],"summary":"Get Overlay Info","description":"Get information about a planning overlay code.\n\nProvides overlay description, category, and constraint implications.\nPhase 4.5 - Victorian Planning Data Integration","operationId":"get_overlay_info_api_vicmap_overlay_info__overlay_code__get","parameters":[{"name":"overlay_code","in":"path","required":true,"schema":{"type":"string","title":"Overlay Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vicmap/existing-conditions":{"post":{"tags":["vicmap","vicmap"],"summary":"Get Existing Conditions","description":"Get comprehensive existing conditions for a painted area.\n\nCombines parcel, address, and zone data to estimate:\n- Existing dwellings (from address count)\n- Existing population (dwellings × avg household size)\n- Existing employment (estimated from zone type)\n- Current zoning and land use\n\nThis provides accurate \"existing vs proposed\" baseline data\nfor scenario analysis, replacing SA2-level Census aggregates.","operationId":"get_existing_conditions_api_vicmap_existing_conditions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExistingConditionsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vicmap/zone-info/{zone_code}":{"get":{"tags":["vicmap","vicmap"],"summary":"Get Zone Info","description":"Get information about a planning zone code.\n\nProvides zone description and typical density/use characteristics.","operationId":"get_zone_info_api_vicmap_zone_info__zone_code__get","parameters":[{"name":"zone_code","in":"path","required":true,"schema":{"type":"string","title":"Zone Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vicmap/planning-constraints":{"post":{"tags":["vicmap","vicmap"],"summary":"Get Planning Constraints","description":"Get comprehensive planning constraints for an area.\n\nCombines zone, overlay, and heritage data to provide a complete\npicture of development constraints. Returns:\n- Planning zones and their implications\n- Planning overlays and constraint levels\n- Heritage places (Victorian Heritage Register + local)\n- Overall constraint assessment\n- Permit requirements summary\n\nThis is the primary endpoint for understanding what controls\napply to a development site.\n\nPhase 4.5 - Victorian Planning Data Integration","operationId":"get_planning_constraints_api_vicmap_planning_constraints_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanningConstraintsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vicmap/transport/status":{"get":{"tags":["vicmap","vicmap"],"summary":"Get Transport Status","description":"Check VicMap Transport service status.\n\nReturns service availability and endpoint information.\nPhase 4.17 - VicMap Transport Integration","operationId":"get_transport_status_api_vicmap_transport_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/vicmap/transport/stations":{"post":{"tags":["vicmap","vicmap"],"summary":"Query Stations","description":"Query rail/tram stations within a buffer of the given geometry.\n\nReturns train stations and tram stops with their locations.\nPhase 4.17 - VicMap Transport Integration","operationId":"query_stations_api_vicmap_transport_stations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransportQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vicmap/transport/nearest-station":{"post":{"tags":["vicmap","vicmap"],"summary":"Query Nearest Station","description":"Find the nearest rail/tram station to a point.\n\nReturns the nearest station with distance calculation.\nAlso returns nearest train station and nearest tram stop separately.\nPhase 4.17 - VicMap Transport Integration","operationId":"query_nearest_station_api_vicmap_transport_nearest_station_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NearestStationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vicmap/transport/roads":{"post":{"tags":["vicmap","vicmap"],"summary":"Query Road Network","description":"Query road network within a buffer of the given geometry.\n\nReturns road segments by classification (freeway, highway, arterial, etc.)\nwith connectivity analysis.\nPhase 4.17 - VicMap Transport Integration","operationId":"query_road_network_api_vicmap_transport_roads_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransportQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vicmap/transport/accessibility":{"post":{"tags":["vicmap","vicmap"],"summary":"Get Transport Accessibility","description":"Get comprehensive transport accessibility metrics for a painted area.\n\nCombines station proximity and road network data to calculate\nan overall transport accessibility score (0-100).\n\nReturns:\n- Accessibility score and rating\n- Nearby stations (train and tram)\n- Distance to nearest stations\n- Road network connectivity analysis\n- Factors influencing the score\n\nThis endpoint is used by the Location Efficiency analysis to\nreplace proxy transit distances with real data.\n\nPhase 4.17 - VicMap Transport Integration","operationId":"get_transport_accessibility_api_vicmap_transport_accessibility_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransportQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vicmap/planning-layer":{"post":{"tags":["vicmap","vicmap"],"summary":"Get Planning Layer","description":"Zones and overlays across a map view, for drawing (the planning-constraints route summarises one site).\nCache-first; each feature carries its code, name, council and family for colours.","operationId":"get_planning_layer_api_vicmap_planning_layer_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BboxLayerRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vicmap/transport/stops":{"post":{"tags":["vicmap","vicmap"],"summary":"Get Transit Stops Cached","description":"Train stations and tram stops in a bbox, from PTV's GTFS timetable data (the map and the assistant).\n\nIt used to read Vicmap Transport's rail network lines and count each rail segment as a \"station\".","operationId":"get_transit_stops_cached_api_vicmap_transport_stops_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BboxLayerRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vicmap/poi/nearby":{"post":{"tags":["vicmap","vicmap"],"summary":"Get Poi Cached","description":"Cache-first POI (Points of Interest) for map toggle rendering.\n\nReturns GeoJSON FeatureCollection of POI from PostGIS cache,\ngrouped by category. Response matches what poiStore.ts expects.\n\nPhase 4.20 — PostGIS Cache-First Map Layers","operationId":"get_poi_cached_api_vicmap_poi_nearby_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BboxLayerRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vicmap/poi/status":{"get":{"tags":["vicmap","vicmap"],"summary":"Get Poi Status","description":"Check VicMap POI service status.\n\nReturns service availability and endpoint information.\nPhase 4.18 - VicMap POI & Vegetation Integration","operationId":"get_poi_status_api_vicmap_poi_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/vicmap/poi/amenities":{"post":{"tags":["vicmap","vicmap"],"summary":"Query Amenities","description":"Query amenities within a buffer of the given geometry.\n\nReturns amenities grouped by category (education, health, shopping, etc.).\nPhase 4.18 - VicMap POI & Vegetation Integration","operationId":"query_amenities_api_vicmap_poi_amenities_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/POIQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vicmap/poi/nearest":{"post":{"tags":["vicmap","vicmap"],"summary":"Query Nearest Amenity","description":"Find the nearest amenity of a given category to a point.\n\nReturns the nearest amenity with distance calculation.\nPhase 4.18 - VicMap POI & Vegetation Integration","operationId":"query_nearest_amenity_api_vicmap_poi_nearest_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NearestAmenityRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vicmap/poi/accessibility":{"post":{"tags":["vicmap","vicmap"],"summary":"Get Poi Accessibility","description":"Get comprehensive amenity accessibility metrics for a painted area.\n\nCalculates distances to key amenity categories and walkability score.\nUsed by Location Efficiency analysis to replace proxy distances.\n\nPhase 4.18 - VicMap POI & Vegetation Integration","operationId":"get_poi_accessibility_api_vicmap_poi_accessibility_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/POIQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vicmap/vegetation/status":{"get":{"tags":["vicmap","vicmap"],"summary":"Get Vegetation Status","description":"Check VicMap Vegetation service status.\n\nReturns service availability and endpoint information.\nPhase 4.18 - VicMap POI & Vegetation Integration","operationId":"get_vegetation_status_api_vicmap_vegetation_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/vicmap/vegetation/trees":{"post":{"tags":["vicmap","vicmap"],"summary":"Query Trees","description":"Query trees within the given geometry.\n\nReturns tree count, canopy metrics, and height distribution.\nPhase 4.18 - VicMap POI & Vegetation Integration","operationId":"query_trees_api_vicmap_vegetation_trees_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VegetationQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vicmap/vegetation/canopy-coverage":{"post":{"tags":["vicmap","vicmap"],"summary":"Get Canopy Coverage","description":"Calculate tree canopy coverage for an area.\n\nReturns canopy coverage percentage and metrics.\nPhase 4.18 - VicMap POI & Vegetation Integration","operationId":"get_canopy_coverage_api_vicmap_vegetation_canopy_coverage_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VegetationQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vicmap/admin-boundaries":{"post":{"tags":["vicmap","vicmap"],"summary":"Get Admin Boundaries","description":"Get administrative boundaries (LGA, suburb, postcode, ward) for a geometry.\n\nQueries VicMap Admin service to identify which LGA, locality/suburb,\npostcode, and ward a painted area falls within.\n\nUsed by analysis pipeline to enrich results with location context.","operationId":"get_admin_boundaries_api_vicmap_admin_boundaries_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminBoundaryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vicmap/property-info":{"get":{"tags":["vicmap","vicmap"],"summary":"Get Property Info","description":"Get comprehensive property information for a point on the map.\nVicPlan-equivalent property identification — returns address, zones,\noverlays (with schedule links), LGA, constraint level, and VicPlan URL.\n\nPhase 4.18.1 — Property Information Panel\nPhase 4.18.2 — Zone Schedule Links\nPhase 4.18.3 — Overlay Detail Cards","operationId":"get_property_info_api_vicmap_property_info_get","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","description":"Latitude (WGS84)","title":"Lat"},"description":"Latitude (WGS84)"},{"name":"lng","in":"query","required":true,"schema":{"type":"number","description":"Longitude (WGS84)","title":"Lng"},"description":"Longitude (WGS84)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vicmap/vegetation/green-infrastructure":{"post":{"tags":["vicmap","vicmap"],"summary":"Get Green Infrastructure","description":"Get comprehensive green infrastructure metrics for a painted area.\n\nReturns canopy coverage, tree density, and green infrastructure score.\nUsed by Green Infrastructure analysis.\n\nPhase 4.18 - VicMap POI & Vegetation Integration","operationId":"get_green_infrastructure_api_vicmap_vegetation_green_infrastructure_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VegetationQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vicmap/spatial-layers":{"get":{"tags":["vicmap","vicmap"],"summary":"List Spatial Layers","description":"List all available Victorian spatial data layers.\nReturns layer metadata (id, name, description, category, color).\n\nPhase 4.18.5-10, 4.18.12","operationId":"list_spatial_layers_api_vicmap_spatial_layers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/vicmap/spatial-layers/{layer_id}":{"post":{"tags":["vicmap","vicmap"],"summary":"Get Spatial Layer","description":"Cache-first query for a Victorian spatial layer.\n\nChecks PostGIS cache (<100ms) first. On miss, fetches from VicMap\nArcGIS, stores in PostGIS, then returns. Subsequent requests for\nthe same area are instant (75-430x faster than direct ArcGIS calls).\n\nValid layer_ids:\n- aboriginal_heritage_sensitivity\n- registered_aboriginal_parties\n- bushfire_prone_areas\n- urban_growth_boundary\n- lga_boundaries\n- public_land\n\nPhase 4.20 — PostGIS Cache-First Refactoring","operationId":"get_spatial_layer_api_vicmap_spatial_layers__layer_id__post","parameters":[{"name":"layer_id","in":"path","required":true,"schema":{"type":"string","title":"Layer Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpatialLayerRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vicmap/spatial-layers-batch":{"post":{"tags":["vicmap","vicmap"],"summary":"Get Spatial Layers Batch","description":"Cache-first batch query for multiple Victorian spatial layers.\n\nAll layers are queried against PostGIS cache first (<100ms each).\nOn cache miss, fetches from external API, stores, then returns.\n\nPhase 4.20 — PostGIS Cache-First Refactoring","operationId":"get_spatial_layers_batch_api_vicmap_spatial_layers_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpatialLayerBatchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/valuation/status":{"get":{"tags":["valuation","valuation"],"summary":"Get Valuation Status","description":"Check valuation service status.\n\nReturns service availability and data source information.","operationId":"get_valuation_status_api_valuation_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/valuation/residential":{"post":{"tags":["valuation","valuation"],"summary":"Estimate Residential Value","description":"Estimate residential property value.\n\nCombines suburb median prices with construction cost estimation\nto provide CIV (Capital Improved Value) breakdown.\n\nReturns site value, improvement value, and total CIV with confidence score.","operationId":"estimate_residential_value_api_valuation_residential_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResidentialValuationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/valuation/commercial":{"post":{"tags":["valuation","valuation"],"summary":"Estimate Commercial Value","description":"Estimate commercial property value.\n\nUses zone-based land values and construction cost estimation\nfor retail, office, and hotel properties.\n\nReturns site value, improvement value, and total CIV with confidence score.","operationId":"estimate_commercial_value_api_valuation_commercial_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommercialValuationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/valuation/industrial":{"post":{"tags":["valuation","valuation"],"summary":"Estimate Industrial Value","description":"Estimate industrial property value.\n\nUses submarket-based land values and building type costs\nfor warehouse, factory, and logistics properties.\n\nReturns site value, improvement value, and total CIV with confidence score.","operationId":"estimate_industrial_value_api_valuation_industrial_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndustrialValuationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/valuation/feasibility":{"post":{"tags":["valuation","valuation"],"summary":"Estimate Development Feasibility","description":"Estimate development feasibility using Envision Tomorrow methodology.\n\nCalculates whether redevelopment is financially feasible based on\ncurrent property values and target development type.\n\nReturns feasibility score, achievable value per sqm, and recommendation.","operationId":"estimate_development_feasibility_api_valuation_feasibility_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevelopmentFeasibilityRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/valuation/scenario":{"post":{"tags":["valuation","valuation"],"summary":"Estimate Scenario Valuation","description":"Estimate total property values for a planning scenario.\n\nCalculates existing and proposed total values for a scenario area,\nproviding fiscal impact inputs for property tax revenue estimation.\n\nReturns existing value, proposed value, and net change.","operationId":"estimate_scenario_valuation_api_valuation_scenario_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScenarioValuationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/valuation/suburb/{suburb_name}":{"get":{"tags":["valuation","valuation"],"summary":"Get Suburb Prices","description":"Get median property prices for a suburb.\n\nReturns median house, unit, and land prices along with\ntransaction counts and historical price growth.","operationId":"get_suburb_prices_api_valuation_suburb__suburb_name__get","parameters":[{"name":"suburb_name","in":"path","required":true,"schema":{"type":"string","title":"Suburb Name"}},{"name":"postcode","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Postcode for disambiguation","title":"Postcode"},"description":"Postcode for disambiguation"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/valuation/suburb/{suburb_name}/history":{"get":{"tags":["valuation","valuation"],"summary":"Get Suburb Price History","description":"Get historical price data for a suburb.\n\nReturns yearly median prices, transaction counts, and CAGR.\nUseful for understanding long-term value trends.","operationId":"get_suburb_price_history_api_valuation_suburb__suburb_name__history_get","parameters":[{"name":"suburb_name","in":"path","required":true,"schema":{"type":"string","title":"Suburb Name"}},{"name":"property_type","in":"query","required":false,"schema":{"type":"string","description":"Property type: house, unit, land","default":"house","title":"Property Type"},"description":"Property type: house, unit, land"},{"name":"years","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"description":"Number of years of history","default":10,"title":"Years"},"description":"Number of years of history"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/valuation/lga/{lga_name}":{"get":{"tags":["valuation","valuation"],"summary":"Get Lga Statistics","description":"Get property statistics for a Local Government Area.\n\nReturns aggregated price statistics across all suburbs in the LGA.","operationId":"get_lga_statistics_api_valuation_lga__lga_name__get","parameters":[{"name":"lga_name","in":"path","required":true,"schema":{"type":"string","title":"Lga Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/valuation/config":{"get":{"tags":["valuation","valuation"],"summary":"Get Valuation Config","description":"Get current valuation configuration.\n\nReturns zone-based land values, construction costs, and other\nparameters used for property value estimation.","operationId":"get_valuation_config_api_valuation_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/heritage/status":{"get":{"tags":["heritage","heritage"],"summary":"Get Heritage Status","description":"Check Heritage Victoria API status.\n\nReturns service information and endpoints.","operationId":"get_heritage_status_api_heritage_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/heritage/near":{"post":{"tags":["heritage","heritage"],"summary":"Get Heritage Near","description":"Get heritage places near a coordinate.\n\nReturns heritage places within the specified radius.\nUseful for quick lookups based on a single point.","operationId":"get_heritage_near_api_heritage_near_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeritageNearRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/heritage/in-geometry":{"post":{"tags":["heritage","heritage"],"summary":"Get Heritage In Geometry","description":"Get heritage places within a geometry.\n\nReturns heritage places that fall within the specified polygon.\nMore accurate than radius-based search for irregular areas.\n\nPhase 4.5 - Victorian Planning Data Integration","operationId":"get_heritage_in_geometry_api_heritage_in_geometry_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeritageInGeometryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/heritage/place/{place_id}":{"get":{"tags":["heritage","heritage"],"summary":"Get Heritage Place Detail","description":"Get detailed information about a specific heritage place.\n\nReturns full details including statement of significance,\nhistory, description, and images.\n\nPhase 4.5 - Victorian Planning Data Integration","operationId":"get_heritage_place_detail_api_heritage_place__place_id__get","parameters":[{"name":"place_id","in":"path","required":true,"schema":{"type":"integer","title":"Place Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/heritage/register-types":{"get":{"tags":["heritage","heritage"],"summary":"Get Heritage Register Types","description":"Get information about heritage register types in Victoria.\n\nProvides descriptions of the different heritage registers\nand their significance levels.","operationId":"get_heritage_register_types_api_heritage_register_types_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/building-approvals/status":{"get":{"tags":["building-approvals","building-approvals"],"summary":"Get Service Status","description":"Get the status of the Building Approvals service.\n\nReturns:\n    Service availability, cache statistics, and supported dataflows.\n\nExample:\n    GET /api/building-approvals/status\n\nUse Cases:\n    - Health check for monitoring\n    - Cache inspection","operationId":"get_service_status_api_building_approvals_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildingApprovalsServiceStatus"}}}}}}},"/api/building-approvals/sa2/{sa2_code}":{"get":{"tags":["building-approvals","building-approvals"],"summary":"Get Approvals By Sa2","description":"Get dwelling approvals for an SA2 region.\n\nReturns dwelling approval counts by building type (houses, apartments,\ntownhouses), alterations, demolitions, and net new dwellings.\n\nParameters:\n    sa2_code: 9-digit SA2 code (e.g., \"206041504\" for Melbourne CBD)\n\nReturns:\n    Dwelling approval breakdown with dwelling mix percentages.\n\nExample:\n    GET /api/building-approvals/sa2/206041504\n\nUse Cases:\n    - Development Feasibility: Pipeline supply context\n    - Market analysis: Development activity levels","operationId":"get_approvals_by_sa2_api_building_approvals_sa2__sa2_code__get","parameters":[{"name":"sa2_code","in":"path","required":true,"schema":{"type":"string","title":"Sa2 Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildingApprovalsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/building-approvals/sa2/{sa2_code}/trend":{"get":{"tags":["building-approvals","building-approvals"],"summary":"Get Approvals Trend","description":"Get 12-month rolling trend analysis for an SA2 region.\n\nIncludes:\n- 12-month rolling totals (current vs prior year)\n- Trend direction: 'increasing' (>+10%), 'decreasing' (<-10%), 'stable'\n- Hot market flagging (>2x state average)\n- Activity score (0-100)\n- Dwelling type mix\n\nParameters:\n    sa2_code: 9-digit SA2 code\n\nReturns:\n    Trend analysis with market heat indicator and activity score.\n\nExample:\n    GET /api/building-approvals/sa2/206041504/trend\n\nUse Cases:\n    - Redevelopment Timing: Market demand signal\n    - Investment analysis: Hot market identification","operationId":"get_approvals_trend_api_building_approvals_sa2__sa2_code__trend_get","parameters":[{"name":"sa2_code","in":"path","required":true,"schema":{"type":"string","title":"Sa2 Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildingApprovalsTrendResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/building-approvals/sa2/{sa2_code}/pipeline":{"get":{"tags":["building-approvals","building-approvals"],"summary":"Get Development Pipeline","description":"Get development pipeline context for an SA2.\n\nReturns pipeline metrics including total approvals, net new dwellings,\ndwelling mix, market type, and activity score.\n\nParameters:\n    sa2_code: 9-digit SA2 code\n\nReturns:\n    Development pipeline metrics and market classification.\n\nExample:\n    GET /api/building-approvals/sa2/206041504/pipeline\n\nUse Cases:\n    - Development Feasibility: Supply context\n    - Redevelopment Timing: Market activity indicator","operationId":"get_development_pipeline_api_building_approvals_sa2__sa2_code__pipeline_get","parameters":[{"name":"sa2_code","in":"path","required":true,"schema":{"type":"string","title":"Sa2 Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/building-approvals/state/victoria":{"get":{"tags":["building-approvals","building-approvals"],"summary":"Get Victoria State Approvals","description":"Get Victoria state-level building approvals.\n\nReturns total new residential approvals for Victoria (state code 2).\nUsed for benchmarking SA2-level data against state averages.\n\nReturns:\n    State total approvals and metadata.\n\nExample:\n    GET /api/building-approvals/state/victoria\n\nUse Cases:\n    - Hot market calculation: State average baseline\n    - Trend analysis: State-level context","operationId":"get_victoria_state_approvals_api_building_approvals_state_victoria_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/building-approvals/sa2/{sa2_code}/heat":{"get":{"tags":["building-approvals","building-approvals"],"summary":"Get Market Heat Indicator","description":"Get hot market indicator for an SA2.\n\nCompares SA2 approvals to Victoria state average.\nHot market: SA2 approvals > 2x state average per SA2.\n\nParameters:\n    sa2_code: 9-digit SA2 code\n\nReturns:\n    Heat indicator with ratio and level classification.\n\nExample:\n    GET /api/building-approvals/sa2/206041504/heat\n\nHeat Levels:\n    - hot: >= 2x state average\n    - warm: >= 1.5x state average\n    - average: 0.75x - 1.5x state average\n    - cool: 0.5x - 0.75x state average\n    - cold: < 0.5x state average","operationId":"get_market_heat_indicator_api_building_approvals_sa2__sa2_code__heat_get","parameters":[{"name":"sa2_code","in":"path","required":true,"schema":{"type":"string","title":"Sa2 Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gtfs/status":{"get":{"tags":["gtfs","gtfs"],"summary":"Get Service Status","description":"Get the status of the GTFS service.\n\nReturns:\n    Service availability, data freshness, stop/route counts.\n\nExample:\n    GET /api/gtfs/status\n\nUse Cases:\n    - Health check for monitoring\n    - Data freshness inspection\n    - Verify GTFS data is loaded","operationId":"get_service_status_api_gtfs_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GTFSServiceStatus"}}}}}}},"/api/gtfs/stops":{"get":{"tags":["gtfs","gtfs"],"summary":"Get Stops Near Point","description":"Get all transit stops within a radius of a point.\n\nParameters:\n    lat: Latitude of the query point\n    lon: Longitude of the query point\n    radius: Search radius in meters (100-5000, default 800)\n\nReturns:\n    List of stops sorted by distance, with route type information.\n\nExample:\n    GET /api/gtfs/stops?lat=-37.8183&lon=144.9671&radius=400\n\nUse Cases:\n    - Find transit options near a location\n    - Populate map markers\n    - Walk score calculations","operationId":"get_stops_near_point_api_gtfs_stops_get","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","description":"Latitude of query point","title":"Lat"},"description":"Latitude of query point"},{"name":"lon","in":"query","required":true,"schema":{"type":"number","description":"Longitude of query point","title":"Lon"},"description":"Longitude of query point"},{"name":"radius","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":100,"description":"Search radius in meters","default":800,"title":"Radius"},"description":"Search radius in meters"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StopsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gtfs/stops/{stop_id}":{"get":{"tags":["gtfs","gtfs"],"summary":"Get Stop Details","description":"Get detailed information about a specific stop.\n\nParameters:\n    stop_id: GTFS stop identifier\n\nReturns:\n    Stop details, current frequency, and routes serving the stop.\n\nExample:\n    GET /api/gtfs/stops/19842\n\nUse Cases:\n    - Display stop information in popup\n    - Show service frequency for a stop\n    - List routes at a stop","operationId":"get_stop_details_api_gtfs_stops__stop_id__get","parameters":[{"name":"stop_id","in":"path","required":true,"schema":{"type":"string","title":"Stop Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StopDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gtfs/stops/{stop_id}/frequency":{"get":{"tags":["gtfs","gtfs"],"summary":"Get Stop Frequency","description":"Get service frequency for a stop at a specific time.\n\nParameters:\n    stop_id: GTFS stop identifier\n    day_type: weekday, saturday, or sunday\n    time_window: peak_am (7-9), midday (9-15), peak_pm (15-18), evening (18-22), night (22-7)\n\nReturns:\n    Services per hour, route count, and frequency rating.\n\nExample:\n    GET /api/gtfs/stops/19842/frequency?day_type=weekday&time_window=peak_am\n\nUse Cases:\n    - Display frequency in transit layer\n    - Calculate transit scores\n    - Time-of-day accessibility analysis","operationId":"get_stop_frequency_api_gtfs_stops__stop_id__frequency_get","parameters":[{"name":"stop_id","in":"path","required":true,"schema":{"type":"string","title":"Stop Id"}},{"name":"day_type","in":"query","required":false,"schema":{"type":"string","description":"Day type: weekday, saturday, sunday","default":"weekday","title":"Day Type"},"description":"Day type: weekday, saturday, sunday"},{"name":"time_window","in":"query","required":false,"schema":{"type":"string","description":"Time window: peak_am, midday, peak_pm, evening, night","default":"peak_am","title":"Time Window"},"description":"Time window: peak_am, midday, peak_pm, evening, night"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StopFrequency"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gtfs/stops/{stop_id}/routes":{"get":{"tags":["gtfs","gtfs"],"summary":"Get Routes At Stop","description":"Get all routes serving a specific stop.\n\nParameters:\n    stop_id: GTFS stop identifier\n\nReturns:\n    List of routes with names, types, and colors.\n\nExample:\n    GET /api/gtfs/stops/19842/routes\n\nUse Cases:\n    - Show route badges on stop popup\n    - Analyze route coverage","operationId":"get_routes_at_stop_api_gtfs_stops__stop_id__routes_get","parameters":[{"name":"stop_id","in":"path","required":true,"schema":{"type":"string","title":"Stop Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoutesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gtfs/accessibility":{"post":{"tags":["gtfs","gtfs"],"summary":"Calculate Transit Accessibility","description":"Calculate comprehensive transit accessibility for a polygon.\n\nRequest Body:\n    geometry: GeoJSON Polygon geometry\n\nReturns:\n    Transit score (0-100), stop counts, frequency breakdown by mode,\n    and route diversity metrics.\n\nExample:\n    POST /api/gtfs/accessibility\n    {\"geometry\": {\"type\": \"Polygon\", \"coordinates\": [[[lon, lat], ...]]}}\n\nUse Cases:\n    - Location Efficiency analysis integration\n    - Transit score for painted scenarios\n    - Multi-modal accessibility assessment","operationId":"calculate_transit_accessibility_api_gtfs_accessibility_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/schemas__gtfs_schemas__GeometryInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransitAccessibility"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gtfs/routes":{"get":{"tags":["gtfs","gtfs"],"summary":"Get All Routes","description":"Get all routes, optionally filtered by type.\n\nParameters:\n    route_type: Optional filter (0=Tram, 1=Subway, 2=Rail, 3=Bus)\n\nReturns:\n    List of routes matching the filter.\n\nExample:\n    GET /api/gtfs/routes\n    GET /api/gtfs/routes?route_type=2  # Train routes only\n\nUse Cases:\n    - Populate route selector\n    - Filter map by transit mode","operationId":"get_all_routes_api_gtfs_routes_get","parameters":[{"name":"route_type","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by route type (0=Tram, 2=Rail, 3=Bus)","title":"Route Type"},"description":"Filter by route type (0=Tram, 2=Rail, 3=Bus)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoutesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gtfs/routes/{route_id}":{"get":{"tags":["gtfs","gtfs"],"summary":"Get Route Details","description":"Get details for a specific route.\n\nParameters:\n    route_id: GTFS route identifier\n\nReturns:\n    Route details including name, type, and color.\n\nExample:\n    GET /api/gtfs/routes/1-hbd-mjp-66\n\nUse Cases:\n    - Display route information\n    - Color-code map features by route","operationId":"get_route_details_api_gtfs_routes__route_id__get","parameters":[{"name":"route_id","in":"path","required":true,"schema":{"type":"string","title":"Route Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GTFSRoute"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gtfs/coverage":{"post":{"tags":["gtfs","gtfs"],"summary":"Analyze Route Coverage","description":"Analyze route coverage for a polygon area.\n\nRequest Body:\n    geometry: GeoJSON Polygon geometry\n\nReturns:\n    Route coverage statistics including unique routes,\n    stops per route type, and coverage density.\n\nExample:\n    POST /api/gtfs/coverage\n    {\"geometry\": {\"type\": \"Polygon\", \"coordinates\": [[[lon, lat], ...]]}}\n\nUse Cases:\n    - Service coverage analysis\n    - Identify transit deserts\n    - Network planning support","operationId":"analyze_route_coverage_api_gtfs_coverage_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/schemas__gtfs_schemas__GeometryInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projections/status":{"get":{"tags":["projections","projections"],"summary":"Get Service Status","description":"Get the status of the VIF projection service.\n\nReturns:\n    Service availability, data freshness, area counts.\n\nExample:\n    GET /api/projections/status\n\nUse Cases:\n    - Health check for monitoring\n    - Data freshness inspection\n    - Verify VIF data is loaded","operationId":"get_service_status_api_projections_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectionServiceStatus"}}}}}}},"/api/projections/sa2/{sa2_code}":{"get":{"tags":["projections","projections"],"summary":"Get Sa2 Projection","description":"Get population projection for a specific SA2.\n\nParameters:\n    sa2_code: 9-digit SA2 code (e.g., \"206071140\" for Carlton North - Princes Hill)\n\nReturns:\n    Population, household, and dwelling projections for 2021, 2026, 2031 and 2036,\n    with growth metrics and classification.\n\nExample:\n    GET /api/projections/sa2/206071140\n\nUse Cases:\n    - Show growth context for a scenario location\n    - Calculate dwelling demand alignment\n    - Assess development feasibility in growth areas","operationId":"get_sa2_projection_api_projections_sa2__sa2_code__get","parameters":[{"name":"sa2_code","in":"path","required":true,"schema":{"type":"string","title":"Sa2 Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SA2ProjectionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projections/sa2/{sa2_code}/growth":{"get":{"tags":["projections","projections"],"summary":"Get Sa2 Growth Metrics","description":"Get growth metrics only for a specific SA2.\n\nParameters:\n    sa2_code: 9-digit SA2 code\n\nReturns:\n    Growth rate, classification, and population change metrics.\n\nExample:\n    GET /api/projections/sa2/206071140/growth\n\nUse Cases:\n    - Quick growth classification check\n    - Compare growth rates across areas","operationId":"get_sa2_growth_metrics_api_projections_sa2__sa2_code__growth_get","parameters":[{"name":"sa2_code","in":"path","required":true,"schema":{"type":"string","title":"Sa2 Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrowthMetrics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projections/lga/{lga_code}":{"get":{"tags":["projections","projections"],"summary":"Get Lga Projection","description":"Get population projection for a specific LGA.\n\nParameters:\n    lga_code: LGA code or name (e.g., \"27350\" or \"Yarra\")\n\nReturns:\n    Population, household, and dwelling projections for 2021, 2026, 2031 and 2036,\n    with growth metrics.\n\nExample:\n    GET /api/projections/lga/27350\n    GET /api/projections/lga/Yarra\n\nUse Cases:\n    - Council-level growth analysis\n    - Compare growth across municipalities","operationId":"get_lga_projection_api_projections_lga__lga_code__get","parameters":[{"name":"lga_code","in":"path","required":true,"schema":{"type":"string","title":"Lga Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LGAProjectionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projections/scenario-context":{"post":{"tags":["projections","projections"],"summary":"Get Scenario Projection Context","description":"Get projection context for a scenario geometry.\n\nRequest Body:\n    geometry: GeoJSON Point or Polygon geometry\n    proposed_dwellings: Optional number of dwellings in scenario\n\nReturns:\n    Projection data for the SA2 containing the geometry,\n    plus dwelling demand analysis if proposed_dwellings provided.\n\nExample:\n    POST /api/projections/scenario-context\n    {\n        \"geometry\": {\"type\": \"Point\", \"coordinates\": [144.97, -37.80]},\n        \"proposed_dwellings\": 150\n    }\n\nUse Cases:\n    - Integration with Development Feasibility analysis\n    - Show growth context in scenario results\n    - Calculate dwelling demand alignment","operationId":"get_scenario_projection_context_api_projections_scenario_context_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScenarioProjectionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScenarioProjectionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projections/growth-areas":{"get":{"tags":["projections","projections"],"summary":"Get High Growth Areas","description":"Get list of high-growth SA2 areas.\n\nParameters:\n    min_growth_rate: Minimum annual growth rate to include (default 1.5%)\n\nReturns:\n    List of SA2s with growth rate above threshold, sorted by growth rate.\n\nExample:\n    GET /api/projections/growth-areas?min_growth_rate=2.0\n\nUse Cases:\n    - Identify development opportunity areas\n    - Target areas for infrastructure investment\n    - Planning priority setting","operationId":"get_high_growth_areas_api_projections_growth_areas_get","parameters":[{"name":"min_growth_rate","in":"query","required":false,"schema":{"type":"number","description":"Minimum annual growth rate (%)","default":1.5,"title":"Min Growth Rate"},"description":"Minimum annual growth rate (%)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/walkability/status":{"get":{"tags":["walkability","walkability"],"summary":"Get Service Status","description":"Get Walkability service status.\n\nReturns availability, version info, cache statistics, and supported amenity categories.","operationId":"get_service_status_api_walkability_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalkabilityServiceStatus"}}}}}}},"/api/walkability/score":{"post":{"tags":["walkability","walkability"],"summary":"Calculate Walkability","description":"Calculate walkability score for a geometry using Walk Score methodology.\n\nThe walkability score (0-100) is calculated based on:\n- Network walking distance to nearby amenities (not straight-line)\n- Weighted by amenity importance (grocery stores weighted higher)\n- Linear decay from maximum walkable distance\n\n**Amenity Categories & Weights:**\n- Grocery (3.0): Supermarkets, grocers - max 1600m\n- Parks (1.0): Parks, playgrounds - max 1200m\n- Schools (1.0): Schools, kindergartens - max 1600m\n- Restaurants (0.75): Restaurants, cafes - max 1200m\n- Shopping (0.5): Convenience stores, retail - max 1200m\n- Coffee (0.5): Cafes - max 800m\n- Banks (0.5): Banks, ATMs - max 1200m\n- Libraries (0.5): Libraries - max 1600m\n- Fitness (0.5): Gyms, sports centres - max 1200m\n\n**Walk Score Ratings:**\n- 90-100: Walker's Paradise (daily errands do not require a car)\n- 70-89: Very Walkable (most errands can be accomplished on foot)\n- 50-69: Somewhat Walkable (some errands can be accomplished on foot)\n- 25-49: Car-Dependent (most errands require a car)\n- 0-24: Almost All Errands Require a Car\n\n**Parameters:**\n- geometry: GeoJSON Point, Polygon, or MultiPolygon\n- detail_level: \"quick\" (4 categories) or \"standard\" (all 9 categories)","operationId":"calculate_walkability_api_walkability_score_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/schemas__walkability_schemas__GeometryInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalkabilityResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/walkability/accessibility-detail":{"post":{"tags":["walkability","walkability"],"summary":"Get Detailed Accessibility","description":"Get detailed accessibility for a specific amenity category.\n\nReturns individual POI locations with network walking distances.\nUseful for understanding which specific amenities are accessible.\n\n**Available Categories:**\ngrocery, restaurants, shopping, coffee, banks, parks, schools, libraries, fitness\n\n**Parameters:**\n- geometry: GeoJSON geometry for the location\n- category: Amenity category name\n- max_distance: Maximum search distance in meters (100-5000, default 1600)","operationId":"get_detailed_accessibility_api_walkability_accessibility_detail_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryAccessibilityInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DetailedAccessibilityResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/walkability/categories":{"get":{"tags":["walkability","walkability"],"summary":"Get Amenity Categories","description":"Get list of available amenity categories with their configuration.\n\nReturns category names, weights (for Walk Score calculation),\nmaximum search distances, and OSM tag mappings.","operationId":"get_amenity_categories_api_walkability_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoriesResponse"}}}}}}},"/api/walkability/cache/stats":{"get":{"tags":["walkability","walkability"],"summary":"Get Cache Stats","description":"Get cache statistics.\n\nShows number of cached networks, amenities, and total cache size.","operationId":"get_cache_stats_api_walkability_cache_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/schemas__walkability_schemas__CacheStats"}}}}}}},"/api/walkability/cache":{"delete":{"tags":["walkability","walkability"],"summary":"Clear Cache","description":"Clear all cached walkability data.\n\nRemoves cached street networks and amenity data.\nNext request will trigger fresh download from OpenStreetMap.","operationId":"clear_cache_api_walkability_cache_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClearCacheResult"}}}}}}},"/api/data-catalogue/":{"get":{"tags":["data-catalogue"],"summary":"Get Data Catalogue","description":"Return the complete data catalogue.","operationId":"get_data_catalogue_api_data_catalogue__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/data-catalogue/summary":{"get":{"tags":["data-catalogue"],"summary":"Get Data Catalogue Summary","description":"Return a summary of data sources by category.","operationId":"get_data_catalogue_summary_api_data_catalogue_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/data-assets/scan":{"post":{"tags":["data-assets"],"summary":"Scan And Register Assets","description":"Scan ml/urban_heat/data/ and register all files as data assets.","operationId":"scan_and_register_assets_api_data_assets_scan_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/data-assets/":{"get":{"tags":["data-assets"],"summary":"List Data Assets","description":"List all tracked data assets, optionally filtered.","operationId":"list_data_assets_api_data_assets__get","parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/data-assets/stats":{"get":{"tags":["data-assets"],"summary":"Get Asset Stats","description":"Summary statistics about tracked data assets.","operationId":"get_asset_stats_api_data_assets_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/overture/buildings":{"get":{"tags":["overture-maps"],"summary":"Overture Maps buildings with heights","description":"Fetch building footprints with height and class data from Overture Maps. Max bbox size: 0.1 degrees (~11km). Data cached for 30 days.","operationId":"get_overture_buildings_api_overture_buildings_get","parameters":[{"name":"minx","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"description":"West longitude","title":"Minx"},"description":"West longitude"},{"name":"miny","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"description":"South latitude","title":"Miny"},"description":"South latitude"},{"name":"maxx","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"description":"East longitude","title":"Maxx"},"description":"East longitude"},{"name":"maxy","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"description":"North latitude","title":"Maxy"},"description":"North latitude"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20000,"minimum":1,"description":"Max features","default":5000,"title":"Limit"},"description":"Max features"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/overture/places":{"get":{"tags":["overture-maps"],"summary":"Overture Maps POIs/places","description":"Fetch points of interest from Overture Maps (shops, restaurants, services). Max bbox size: 0.1 degrees (~11km).","operationId":"get_overture_places_api_overture_places_get","parameters":[{"name":"minx","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"title":"Minx"}},{"name":"miny","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"title":"Miny"}},{"name":"maxx","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"title":"Maxx"}},{"name":"maxy","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"title":"Maxy"}},{"name":"categories","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated category filter","title":"Categories"},"description":"Comma-separated category filter"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"default":2000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/overture/transport":{"get":{"tags":["overture-maps"],"summary":"Overture Maps transport segments","description":"Fetch road network segments from Overture Maps. Max bbox size: 0.1 degrees (~11km).","operationId":"get_overture_transport_api_overture_transport_get","parameters":[{"name":"minx","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"title":"Minx"}},{"name":"miny","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"title":"Miny"}},{"name":"maxx","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"title":"Maxx"}},{"name":"maxy","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"title":"Maxy"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":15000,"minimum":1,"default":3000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/overture/status":{"get":{"tags":["overture-maps"],"summary":"Overture Maps service health check","description":"Check DuckDB availability, extension status, and cache statistics.","operationId":"get_overture_status_api_overture_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/overture/cache/stats":{"get":{"tags":["overture-maps"],"summary":"Overture cache statistics","operationId":"get_overture_cache_stats_api_overture_cache_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/overture/cache":{"delete":{"tags":["overture-maps"],"summary":"Clear Overture cache","operationId":"clear_overture_cache_api_overture_cache_delete","parameters":[{"name":"older_than_days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Only clear entries older than N days","title":"Older Than Days"},"description":"Only clear entries older than N days"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/arcgis-catalog/search":{"get":{"tags":["arcgis-catalog"],"summary":"Search public ArcGIS services","description":"Full-text search across name, description, tags, and provider. Filter by category, state, geometry type, and featured status.","operationId":"search_catalog_api_arcgis_catalog_search_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search query","title":"Q"},"description":"Search query"},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Category filter (planning, environment, transport, etc.)","title":"Category"},"description":"Category filter (planning, environment, transport, etc.)"},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"State filter (VIC, NSW, QLD, SA, WA, TAS, NT, ACT, National)","title":"State"},"description":"State filter (VIC, NSW, QLD, SA, WA, TAS, NT, ACT, National)"},{"name":"geometry_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Geometry type (polygon, line, point)","title":"Geometry Type"},"description":"Geometry type (polygon, line, point)"},{"name":"featured","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Featured services only","title":"Featured"},"description":"Featured services only"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/arcgis-catalog/categories":{"get":{"tags":["arcgis-catalog"],"summary":"List catalog categories with counts","operationId":"get_categories_api_arcgis_catalog_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/arcgis-catalog/states":{"get":{"tags":["arcgis-catalog"],"summary":"List available states with service counts","operationId":"get_states_api_arcgis_catalog_states_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/arcgis-catalog/featured":{"get":{"tags":["arcgis-catalog"],"summary":"Featured Australian planning data services","operationId":"get_featured_api_arcgis_catalog_featured_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/arcgis-catalog/stats":{"get":{"tags":["arcgis-catalog"],"summary":"Catalog statistics","operationId":"get_stats_api_arcgis_catalog_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/arcgis-catalog/service/{service_id}":{"get":{"tags":["arcgis-catalog"],"summary":"Get service details by ID","operationId":"get_service_api_arcgis_catalog_service__service_id__get","parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"string","title":"Service Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/arcgis-catalog/service/{service_id}/probe":{"get":{"tags":["arcgis-catalog"],"summary":"Test if a cataloged ArcGIS service is available","operationId":"probe_service_api_arcgis_catalog_service__service_id__probe_get","parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"string","title":"Service Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/arcgis-catalog/service/{service_id}/features":{"get":{"tags":["arcgis-catalog"],"summary":"Fetch GeoJSON features from a cataloged ArcGIS service (CORS proxy)","description":"Proxies ArcGIS FeatureServer queries through the backend to avoid CORS issues. Returns GeoJSON FeatureCollection.","operationId":"get_service_features_api_arcgis_catalog_service__service_id__features_get","parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"string","title":"Service Id"}},{"name":"minx","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"description":"West longitude","title":"Minx"},"description":"West longitude"},{"name":"miny","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"description":"South latitude","title":"Miny"},"description":"South latitude"},{"name":"maxx","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"description":"East longitude","title":"Maxx"},"description":"East longitude"},{"name":"maxy","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"description":"North latitude","title":"Maxy"},"description":"North latitude"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"default":1000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cache/layers/{layer_id}":{"get":{"tags":["cache","cache"],"summary":"Get Cached Layer","description":"Cache-first spatial layer query.\n\nChecks PostGIS cache first (<100ms). On cache miss, fetches from\nexternal API, stores in PostGIS, then returns. Subsequent requests\nfor the same area are instant.","operationId":"get_cached_layer_api_cache_layers__layer_id__get","parameters":[{"name":"layer_id","in":"path","required":true,"schema":{"type":"string","title":"Layer Id"}},{"name":"minx","in":"query","required":true,"schema":{"type":"number","description":"Minimum longitude","title":"Minx"},"description":"Minimum longitude"},{"name":"miny","in":"query","required":true,"schema":{"type":"number","description":"Minimum latitude","title":"Miny"},"description":"Minimum latitude"},{"name":"maxx","in":"query","required":true,"schema":{"type":"number","description":"Maximum longitude","title":"Maxx"},"description":"Maximum longitude"},{"name":"maxy","in":"query","required":true,"schema":{"type":"number","description":"Maximum latitude","title":"Maxy"},"description":"Maximum latitude"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cache/stats":{"get":{"tags":["cache","cache"],"summary":"Get Cache Stats","description":"Cache coverage and freshness statistics per layer.\n\nReturns tile count, feature count, oldest/newest fetch times,\nand last refresh date for each of the 14 layers.","operationId":"get_cache_stats_api_cache_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/cache/layers":{"get":{"tags":["cache","cache"],"summary":"List Available Layers","description":"List all 14 cacheable layers with their configuration.\n\nReturns layer IDs, TTL, source type, and geometry type.","operationId":"list_available_layers_api_cache_layers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/cache/warm":{"post":{"tags":["cache","cache"],"summary":"Warm Cache","description":"Pre-populate cache for all layers within a radius.\n\nRuns in the background so the response is immediate.\nCheck /api/cache/stats to monitor progress.","operationId":"warm_cache_api_cache_warm_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WarmRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/cache/refresh/{layer_id}":{"post":{"tags":["cache","cache"],"summary":"Refresh Layer","description":"Trigger incremental refresh for a single layer.\n\nFor layers supporting editDate (VicMap ArcGIS), only fetches\nfeatures changed since the last refresh. For others, re-fetches\nall cached tiles.","operationId":"refresh_layer_api_cache_refresh__layer_id__post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"layer_id","in":"path","required":true,"schema":{"type":"string","title":"Layer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cache/refresh-all":{"post":{"tags":["cache","cache"],"summary":"Refresh All Layers","description":"Trigger refresh of all stale layers.\n\nLayers older than max_age_hours will be incrementally refreshed.\nSet max_age_hours=0 to force-refresh everything.","operationId":"refresh_all_layers_api_cache_refresh_all_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshRequest","default":{"max_age_hours":0}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/cache/expired":{"delete":{"tags":["cache","cache"],"summary":"Cleanup Expired","description":"Remove expired cache entries from all tables.\n\nDeletes features and metadata entries past their TTL.\nReturns count of deleted records.","operationId":"cleanup_expired_api_cache_expired_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/cache/freshness":{"get":{"tags":["cache","cache"],"summary":"Check Freshness","description":"Lightweight check if external sources have new data.\n\nFor VicMap layers with editDate support, queries the external API\nwith returnCountOnly=true to check for updates without downloading.","operationId":"check_freshness_api_cache_freshness_get","parameters":[{"name":"layer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Check specific layer (null = all)","title":"Layer Id"},"description":"Check specific layer (null = all)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cache/coverage":{"get":{"tags":["cache","cache"],"summary":"Get Cache Coverage","description":"Get GeoJSON of cached areas per layer (for debug visualization).\n\nReturns a FeatureCollection showing which tiles/areas have been cached\nand their freshness status.","operationId":"get_cache_coverage_api_cache_coverage_get","parameters":[{"name":"layer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Specific layer (null = all)","title":"Layer Id"},"description":"Specific layer (null = all)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/keys/":{"get":{"tags":["api-keys"],"summary":"List API keys","description":"List all API keys for the current user (keys are masked).","operationId":"list_keys_api_keys__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/APIKeyResponse"},"type":"array","title":"Response List Keys Api Keys  Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["api-keys"],"summary":"Generate API key","description":"Generate a new API key. The raw key is returned only once — save it securely.","operationId":"create_api_key_api_keys__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKeyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/keys/{key_id}":{"delete":{"tags":["api-keys"],"summary":"Revoke API key","description":"Revoke (deactivate) an API key. Cannot be undone.","operationId":"revoke_key_api_keys__key_id__delete","security":[{"OAuth2PasswordBearer":[]}],"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/webhooks/events":{"get":{"tags":["webhooks"],"summary":"List webhook events","description":"List all available webhook event types.","operationId":"list_events_api_webhooks_events_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/webhooks/":{"get":{"tags":["webhooks"],"summary":"List webhooks","description":"List all webhook subscriptions for the current user.","operationId":"list_webhooks_api_webhooks__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/WebhookResponse"},"type":"array","title":"Response List Webhooks Api Webhooks  Get"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]},"post":{"tags":["webhooks"],"summary":"Register webhook","description":"Register a new webhook endpoint. The signing secret is returned only once.","operationId":"register_webhook_api_webhooks__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/webhooks/{webhook_id}":{"patch":{"tags":["webhooks"],"summary":"Toggle webhook","description":"Enable or disable a webhook.","operationId":"toggle_webhook_endpoint_api_webhooks__webhook_id__patch","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"integer","title":"Webhook Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToggleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["webhooks"],"summary":"Delete webhook","description":"Delete a webhook subscription permanently.","operationId":"delete_webhook_endpoint_api_webhooks__webhook_id__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"integer","title":"Webhook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/spatial-agent/query":{"post":{"tags":["spatial-agent"],"summary":"Ask the spatial agent (streaming)","description":"Send a natural language question. Returns SSE stream of events.","operationId":"agent_query_api_spatial_agent_query_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/spatial-agent/query/sync":{"post":{"tags":["spatial-agent"],"summary":"Ask the spatial agent (non-streaming)","description":"Non-streaming version — returns all events as JSON.","operationId":"agent_query_sync_api_spatial_agent_query_sync_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/spatial-agent/runs/{run_id}/stop":{"post":{"tags":["spatial-agent"],"summary":"Stop a running answer","description":"Stop a run the page started (the run id comes first in its stream).","operationId":"stop_agent_run_api_spatial_agent_runs__run_id__stop_post","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/spatial-agent/workflows":{"get":{"tags":["spatial-agent"],"summary":"List available structured workflows","description":"The structured workflows, optionally only those for one scope.","operationId":"list_workflows_api_spatial_agent_workflows_get","parameters":[{"name":"scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"site or workspace","title":"Scope"},"description":"site or workspace"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/spatial-agent/workflows/{workflow_id}/run":{"post":{"tags":["spatial-agent"],"summary":"Execute a structured workflow (streaming)","description":"Execute a structured workflow by ID. Returns SSE stream of events.","operationId":"run_workflow_api_spatial_agent_workflows__workflow_id__run_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"string","title":"Workflow Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRunRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/spatial-agent/conversations":{"post":{"tags":["spatial-agent"],"summary":"Create a new conversation","description":"Create a new agent conversation session.","operationId":"create_conv_api_spatial_agent_conversations_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["spatial-agent"],"summary":"List conversations","description":"List the user's recent agent conversations.","operationId":"list_conversations_api_spatial_agent_conversations_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/spatial-agent/conversations/{conv_id}/messages":{"get":{"tags":["spatial-agent"],"summary":"Get conversation messages","description":"Get all messages in a conversation (verifies user ownership).","operationId":"get_messages_api_spatial_agent_conversations__conv_id__messages_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"integer","title":"Conv Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/spatial-agent/conversations/{conv_id}":{"delete":{"tags":["spatial-agent"],"summary":"Delete a conversation","description":"Delete a conversation and all its messages.","operationId":"delete_conv_api_spatial_agent_conversations__conv_id__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"integer","title":"Conv Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/spatial-agent/tools":{"get":{"tags":["spatial-agent"],"summary":"List available agent tools","operationId":"list_tools_api_spatial_agent_tools_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/spatial-agent/tools/schema":{"get":{"tags":["spatial-agent"],"summary":"Get OpenAI-compatible function schemas","operationId":"get_tool_schemas_api_spatial_agent_tools_schema_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/spatial-agent/suggestions":{"get":{"tags":["spatial-agent"],"summary":"Get query suggestions","operationId":"get_suggestions_api_spatial_agent_suggestions_get","parameters":[{"name":"scenario_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scenario Id"}},{"name":"scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cadastral-chat/layers":{"get":{"tags":["cadastral-chat"],"summary":"List available cadastral layers","description":"Return registered cadastral layers + minimal metadata. The\nfrontend Layer Catalogue Rail consumes this to show what the agent\ncan talk about.","operationId":"get_layers_api_cadastral_chat_layers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/cadastral-chat/layers/{layer_name}/schema":{"get":{"tags":["cadastral-chat"],"summary":"Describe a single layer's queryable fields","operationId":"get_layer_schema_api_cadastral_chat_layers__layer_name__schema_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"layer_name","in":"path","required":true,"schema":{"type":"string","title":"Layer Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cadastral-chat/layers/{layer_name}/features":{"get":{"tags":["cadastral-chat"],"summary":"GeoJSON features of a layer within a bbox (persistent map layers)","description":"Serve one cadastral layer's geometry for the current map viewport,\nso parcels/zones/easements can be drawn as a standing, browsable layer\n(the layer controller) rather than only as ephemeral chat results.\n\nThe bbox + limit keep big layers (parcels ~63k) from dumping at once;\nthe frontend re-fetches on pan/zoom.","operationId":"get_layer_features_api_cadastral_chat_layers__layer_name__features_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"layer_name","in":"path","required":true,"schema":{"type":"string","title":"Layer Name"}},{"name":"bbox","in":"query","required":true,"schema":{"type":"string","description":"Viewport as 'west,south,east,north' in EPSG:4326.","title":"Bbox"},"description":"Viewport as 'west,south,east,north' in EPSG:4326."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"default":2000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cadastral-chat/parcel-edges":{"post":{"tags":["cadastral-chat"],"summary":"Per-edge length (m) + bearing (DMS) for a parcel polygon","description":"Measure each boundary edge of a parcel — grid length in metres and\ngrid bearing in D°M'S° (MGA Zone 55), the figures a survey/boundary\nplan shows. Returns the edge list plus GeoJSON for highlighting the\nsegments and labelling their midpoints.","operationId":"parcel_edges_api_cadastral_chat_parcel_edges_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParcelEdgesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/cadastral-chat/query":{"post":{"tags":["cadastral-chat"],"summary":"Ask the Layer Chat agent (sync)","description":"Send a natural-language question. Returns the final answer plus\nevery tool call / result the agent made along the way.\n\n`map_payloads` carries one payload per geometry-returning tool call\nin this turn — the frontend registers each as its own ephemeral\nmap layer. The deprecated singular `map_payload` field mirrors\nthe last entry for backwards compatibility.","operationId":"cadastral_query_api_cadastral_chat_query_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CadastralQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CadastralQueryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/cadastral-chat/conversations":{"get":{"tags":["cadastral-chat"],"summary":"List Layer Chat conversations","operationId":"list_conversations_api_cadastral_chat_conversations_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["cadastral-chat"],"summary":"Create an empty Layer Chat conversation","operationId":"create_conversation_api_cadastral_chat_conversations_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CadastralConversationCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cadastral-chat/conversations/{conv_id}/messages":{"get":{"tags":["cadastral-chat"],"summary":"Get all messages in a Layer Chat conversation","operationId":"get_messages_api_cadastral_chat_conversations__conv_id__messages_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"integer","title":"Conv Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cadastral-chat/conversations/{conv_id}":{"delete":{"tags":["cadastral-chat"],"summary":"Delete a Layer Chat conversation","operationId":"delete_conversation_api_cadastral_chat_conversations__conv_id__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"integer","title":"Conv Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cadastral-chat/feedback":{"post":{"tags":["cadastral-chat"],"summary":"Record a thumbs-up / thumbs-down on an assistant message","description":"Record (or update) the current user's rating of an assistant\nmessage. The UNIQUE (message_id, user_id) constraint means a second\nclick replaces the prior rating rather than inserting a duplicate.\n\nThe message must (a) exist, (b) be an assistant turn, and (c) belong\nto a conversation owned by the caller. Anything else returns 404 —\nwe never leak ownership of foreign rows.","operationId":"submit_feedback_api_cadastral_chat_feedback_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/cadastral-chat/feedback/recent":{"get":{"tags":["cadastral-chat"],"summary":"(admin) Recent feedback rows for curation","description":"Admin-only feed used by the manual curation flow in Phase 1.8b.\n\nJoins each feedback row to its assistant message + the immediately\npreceding user question so a curator has the context they need\nwithout a follow-up call.","operationId":"list_recent_feedback_api_cadastral_chat_feedback_recent_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter to -1 (downvotes) or 1 (upvotes). Omit for both.","title":"Rating"},"description":"Filter to -1 (downvotes) or 1 (upvotes). Omit for both."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FeedbackRecentRow"},"title":"Response List Recent Feedback Api Cadastral Chat Feedback Recent Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cadastral-chat/lessons":{"post":{"tags":["cadastral-chat"],"summary":"(admin) Create a curated lesson the agent will read","operationId":"create_lesson_api_cadastral_chat_lessons_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LessonCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LessonResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["cadastral-chat"],"summary":"(admin) List curated lessons","operationId":"list_lessons_api_cadastral_chat_lessons_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"include_inactive","in":"query","required":false,"schema":{"type":"boolean","description":"Include soft-disabled lessons.","default":false,"title":"Include Inactive"},"description":"Include soft-disabled lessons."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LessonResponse"},"title":"Response List Lessons Api Cadastral Chat Lessons Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cadastral-chat/lessons/{lesson_id}":{"patch":{"tags":["cadastral-chat"],"summary":"(admin) Update or soft-disable a lesson","operationId":"update_lesson_api_cadastral_chat_lessons__lesson_id__patch","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"lesson_id","in":"path","required":true,"schema":{"type":"integer","title":"Lesson Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LessonUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LessonResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/master-plan/topology-audit":{"post":{"tags":["master-plan"],"summary":"Topology Audit","description":"Run topology audit on scenario features.\n\nAccepts either a scenario_id (reads from DB) or raw features array.","operationId":"topology_audit_api_master_plan_topology_audit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopologyAuditRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopologyAuditResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/master-plan/rule-audit":{"post":{"tags":["master-plan"],"summary":"Rule Audit","description":"Run planning compliance rule audit.\n\nAccepts either a scenario_id or raw parcels/buildings/roads arrays.\nPhase 2: Automatically queries Melbourne Water, EPA, VicRoads for constraint checks.","operationId":"rule_audit_api_master_plan_rule_audit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleAuditRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleAuditResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/master-plan/scores":{"post":{"tags":["master-plan"],"summary":"Master Plan Scores","description":"Calculate Green City, 20-Minute Neighbourhood and Approval Readiness scores.\n\nIf topology_health or rule_compliance are not provided, runs the audits first.","operationId":"master_plan_scores_api_master_plan_scores_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MasterPlanScoresRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MasterPlanScoresResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/master-plan/scores/{scenario_id}":{"get":{"tags":["master-plan"],"summary":"Get Master Plan Scores","description":"Get cached master plan scores (re-computes if not cached).","operationId":"get_master_plan_scores_api_master_plan_scores__scenario_id__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MasterPlanScoresResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/master-plan/import/shapefile":{"post":{"tags":["master-plan"],"summary":"Import Shapefile","description":"Import a scenario from a Shapefile (.zip containing .shp, .shx, .dbf, .prj).\nPreserves all original shapefile attributes for Precinct Audit compatibility.","operationId":"import_shapefile_api_master_plan_import_shapefile_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"project_id","in":"query","required":true,"schema":{"type":"integer","title":"Project Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_import_shapefile_api_master_plan_import_shapefile_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShapefileImportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/master-plan/scenarios/{scenario_id}/generate-parcels":{"post":{"tags":["master-plan"],"summary":"Generate Parcels Psp","description":"Generate a Precinct Structure Plan parcel layer from a buildings layer.\n\nSource buildings come from `request.buildings` if provided, otherwise\nfrom the scenario's painted_areas (treating them as building footprints).\n\nCalls VicMap to fetch real cadastral parcels intersecting the precinct\nextent, then spatially joins each building to its containing parcel.\nAggregated building stats (count, total roof area, max height) are\nattached to each parcel so they survive into audit/scoring.\n\nReturns parcels as a GeoJSON FeatureCollection — the caller drops them\nstraight into the Parcel Layer (PSP) slot of the Precinct Audit panel.\nThe source scenario is left untouched; persistence happens via the\nnormal scenario sync once the user picks an analysis source.","operationId":"generate_parcels_psp_api_master_plan_scenarios__scenario_id__generate_parcels_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateParcelsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateParcelsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/master-plan/scenarios/{scenario_id}/massing":{"get":{"tags":["master-plan"],"summary":"Get Scenario Massing","description":"Return a GeoJSON FeatureCollection of painted areas with height + colour\nproperties suitable for MapLibre `fill-extrusion` rendering.\n\nHeights come from each painted area's explicit `height_m` if present,\notherwise from a per-dev_type fallback (RES_LOW=6m, RES_HIGH=30m, etc).\nOpen-space / zero-height parcels are excluded so they don't obscure the\nbasemap.","operationId":"get_scenario_massing_api_master_plan_scenarios__scenario_id__massing_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Scenario Massing Api Master Plan Scenarios  Scenario Id  Massing Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/master-plan/scenarios/{scenario_id}/siting":{"get":{"tags":["master-plan"],"summary":"Get Scenario Siting","description":"Check the buildings the 3D view draws against Victorian siting rules:\nsetbacks, site coverage, permeability, garden area and height, using each\nsite's zone. Returns per-site results by building type (with the clause\nbehind every limit) and a GeoJSON of buildable envelopes, flagging\nbuildings that don't fit.","operationId":"get_scenario_siting_api_master_plan_scenarios__scenario_id__siting_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Scenario Siting Api Master Plan Scenarios  Scenario Id  Siting Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/master-plan/fill-site":{"post":{"tags":["master-plan"],"summary":"Fill Site","description":"Suggest buildings for a site from its development type's building mix,\nlaid out around what's kept on it (drawn roads, paths, parking, gardens,\nretained trees, kept buildings): lots front onto the drawn roads, and\nnew local streets are drawn where land has none. Each home is sized to\nits lot's limits in the site's zone (storeys, setbacks, coverage,\npermeability, garden area), so the filled site passes the Check; homes\nthat can't be are left out and the result says how many fitted. Houses\nand townhouses come with their lots (driveway, garage, front garden,\npath, backyard). Everything returned is marked `filled`; nothing is\nsaved here.\n\nWorks without an account (guest mode: try before signing in), within services/guest_limits.py's limits.","operationId":"fill_site_api_master_plan_fill_site_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FillSiteRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Fill Site Api Master Plan Fill Site Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/master-plan/fill-site/options":{"post":{"tags":["master-plan"],"summary":"Fill Site Options","description":"A few different Fill layouts for one site (Milestone E2b), to compare and keep as schemes: the type's mix, each\nof its main building types on its own, and new streets turned across the site. Layouts that come out the same are\ndropped. Each option has its buildings and elements (as /fill-site gives them) and its numbers worked out on the\nsite alone, without saving: homes, floor area, FAR, coverage, car spaces against Clause 52.06, cost, value and\nthe residual land value (services/yield_numbers.py). Nothing is saved.","operationId":"fill_site_options_api_master_plan_fill_site_options_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FillSiteRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Fill Site Options Api Master Plan Fill Site Options Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/master-plan/site-numbers":{"post":{"tags":["master-plan"],"summary":"Site Numbers","description":"The key numbers of several designs for one site (Milestone E2c: comparing a site's schemes), each worked out on\nthe site alone without saving, as the yield bar works them out (services/yield_numbers.py). Returns\n{numbers: {scheme id: numbers or null}}.","operationId":"site_numbers_api_master_plan_site_numbers_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteNumbersRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Site Numbers Api Master Plan Site Numbers Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/master-plan/scenarios/{scenario_id}/sites/{site}/ifc":{"get":{"tags":["master-plan"],"summary":"Site Ifc","description":"A site's buildings as one georeferenced IFC4 model (Milestone B2), made by the CAD service with BimCraft: walls,\nfloors, roofs, a door to the street and windows, on the site's MGA grid. `site` counts from 1. The model's wall\nquantities come back in the X-UrbanMind-Quantities header (JSON).","operationId":"site_ifc_api_master_plan_scenarios__scenario_id__sites__site__ifc_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}},{"name":"site","in":"path","required":true,"schema":{"type":"integer","title":"Site"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/master-plan/scenarios/{scenario_id}/fill-site":{"post":{"tags":["master-plan"],"summary":"Fill Scenario Site","description":"Fill a site of a saved scenario and save it (the assistant's fill_site\ntool; the MCP server): the same layout, lot limits, lot kits and street\ndressing as the Fill button, replacing only the site's last fill. Saved\nas a new revision by \"assistant\", so an open app reloads the site.","operationId":"fill_scenario_site_api_master_plan_scenarios__scenario_id__fill_site_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FillScenarioSiteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Fill Scenario Site Api Master Plan Scenarios  Scenario Id  Fill Site Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/precinct-audits/":{"post":{"tags":["precinct-audits","precinct-audits"],"summary":"Create Precinct Audit","description":"Create a new precinct audit owned by the current user.","operationId":"create_precinct_audit_api_precinct_audits__post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrecinctAuditCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrecinctAuditDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["precinct-audits","precinct-audits"],"summary":"List Precinct Audits","description":"List the current user's precinct audits, newest-first.","operationId":"list_precinct_audits_api_precinct_audits__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by scenario","title":"Scenario Id"},"description":"Filter by scenario"},{"name":"include_archived","in":"query","required":false,"schema":{"type":"boolean","description":"Include archived audits","default":false,"title":"Include Archived"},"description":"Include archived audits"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrecinctAuditList"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/precinct-audits/{audit_id}":{"get":{"tags":["precinct-audits","precinct-audits"],"summary":"Get Precinct Audit","description":"Load a single audit (with full payload) owned by the current user.","operationId":"get_precinct_audit_api_precinct_audits__audit_id__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"audit_id","in":"path","required":true,"schema":{"type":"integer","title":"Audit Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrecinctAuditDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["precinct-audits","precinct-audits"],"summary":"Update Precinct Audit","description":"Partial update — only provided fields are touched. The full panel\nsnapshot can be replaced via `payload`; passing `payload: null`\nexplicitly clears it. Status transitions are validated by the\nPydantic enum on the request body.","operationId":"update_precinct_audit_api_precinct_audits__audit_id__put","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"audit_id","in":"path","required":true,"schema":{"type":"integer","title":"Audit Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrecinctAuditUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrecinctAuditDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["precinct-audits","precinct-audits"],"summary":"Archive Precinct Audit","description":"Soft delete: flip status to 'archived'. The row is preserved so it\ncan be recovered (Phase 4.5 Track C will surface this in the History\ntab). Already-archived rows return 204 idempotently.","operationId":"archive_precinct_audit_api_precinct_audits__audit_id__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"audit_id","in":"path","required":true,"schema":{"type":"integer","title":"Audit Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/precinct-audits/{audit_id}/versions":{"get":{"tags":["precinct-audits","precinct-audits"],"summary":"List Audit Versions","description":"List all versions of an audit, newest version_number first.","operationId":"list_audit_versions_api_precinct_audits__audit_id__versions_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"audit_id","in":"path","required":true,"schema":{"type":"integer","title":"Audit Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrecinctAuditVersionList"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/precinct-audits/{audit_id}/versions/{version_number}":{"get":{"tags":["precinct-audits","precinct-audits"],"summary":"Get Audit Version","description":"Fetch a specific version with its full payload snapshot.","operationId":"get_audit_version_api_precinct_audits__audit_id__versions__version_number__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"audit_id","in":"path","required":true,"schema":{"type":"integer","title":"Audit Id"}},{"name":"version_number","in":"path","required":true,"schema":{"type":"integer","title":"Version Number"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrecinctAuditVersionDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/precinct-audits/{audit_id}/restore/{version_number}":{"post":{"tags":["precinct-audits","precinct-audits"],"summary":"Restore Audit Version","description":"Restore the audit's live `payload` from the snapshot of `version_number`.\n\nCreates a NEW version row capturing the restore (parent_version_id\npoints at the source) so the timeline records the action and can be\nre-restored if the user changes their mind. Never mutates an\nexisting version row.","operationId":"restore_audit_version_api_precinct_audits__audit_id__restore__version_number__post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"audit_id","in":"path","required":true,"schema":{"type":"integer","title":"Audit Id"}},{"name":"version_number","in":"path","required":true,"schema":{"type":"integer","title":"Version Number"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrecinctAuditDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/export/shapefile":{"post":{"tags":["export"],"summary":"Export Shapefile","description":"Export scenario painted areas as a zipped Shapefile.","operationId":"export_shapefile_api_export_shapefile_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/export/dxf":{"post":{"tags":["export"],"summary":"Export Dxf","description":"Export scenario painted areas as an AutoCAD DXF, layered by dev_type.","operationId":"export_dxf_api_export_dxf_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/export/site-dxf":{"post":{"tags":["export"],"summary":"Export Site Dxf","description":"The 2D site plan as a DXF in MGA2020 metres: one layer per kind (buildings by use, ground by surface,\nparking spaces, new lots, trees, fences, the site boundary, context lots, labels). Guests can export too:\nthe drawing comes with the request and nothing is read or stored.","operationId":"export_site_dxf_api_export_site_dxf_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteDxfRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/analysis/bulk-rank":{"post":{"tags":["bulk-rank"],"summary":"Bulk Rank","operationId":"bulk_rank_api_analysis_bulk_rank_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkRankRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Bulk Rank Api Analysis Bulk Rank Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/melbourne-water/waterways":{"get":{"tags":["melbourne-water"],"summary":"Get Waterways","description":"Get waterway centrelines intersecting a scenario's painted areas.","operationId":"get_waterways_api_melbourne_water_waterways_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scenario Id"}},{"name":"minx","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Minx"}},{"name":"miny","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Miny"}},{"name":"maxx","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Maxx"}},{"name":"maxy","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Maxy"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Waterways Api Melbourne Water Waterways Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/melbourne-water/sewerage-mains":{"get":{"tags":["melbourne-water"],"summary":"Get Sewerage Mains","description":"Get sewerage mains intersecting a scenario's painted areas.","operationId":"get_sewerage_mains_api_melbourne_water_sewerage_mains_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scenario Id"}},{"name":"minx","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Minx"}},{"name":"miny","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Miny"}},{"name":"maxx","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Maxx"}},{"name":"maxy","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Maxy"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Sewerage Mains Api Melbourne Water Sewerage Mains Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/melbourne-water/water-supply-mains":{"get":{"tags":["melbourne-water"],"summary":"Get Water Supply Mains","description":"Get water supply mains intersecting a scenario's painted areas.","operationId":"get_water_supply_mains_api_melbourne_water_water_supply_mains_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scenario Id"}},{"name":"minx","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Minx"}},{"name":"miny","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Miny"}},{"name":"maxx","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Maxx"}},{"name":"maxy","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Maxy"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Water Supply Mains Api Melbourne Water Water Supply Mains Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/melbourne-water/catchments":{"get":{"tags":["melbourne-water"],"summary":"Get Catchments","description":"Get subcatchment polygons intersecting a scenario's painted areas.","operationId":"get_catchments_api_melbourne_water_catchments_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scenario Id"}},{"name":"minx","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Minx"}},{"name":"miny","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Miny"}},{"name":"maxx","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Maxx"}},{"name":"maxy","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Maxy"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Catchments Api Melbourne Water Catchments Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/melbourne-water/retarding-basins":{"get":{"tags":["melbourne-water"],"summary":"Get Retarding Basins","description":"Get retarding basin assets intersecting a scenario's painted areas.","operationId":"get_retarding_basins_api_melbourne_water_retarding_basins_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scenario Id"}},{"name":"minx","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Minx"}},{"name":"miny","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Miny"}},{"name":"maxx","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Maxx"}},{"name":"maxy","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Maxy"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Retarding Basins Api Melbourne Water Retarding Basins Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/melbourne-water/all":{"get":{"tags":["melbourne-water"],"summary":"Get All Infrastructure","description":"Get all Melbourne Water infrastructure for a scenario in parallel.","operationId":"get_all_infrastructure_api_melbourne_water_all_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scenario Id"}},{"name":"minx","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Minx"}},{"name":"miny","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Miny"}},{"name":"maxx","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Maxx"}},{"name":"maxy","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Maxy"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"array","items":{"type":"object","additionalProperties":true}},"title":"Response Get All Infrastructure Api Melbourne Water All Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/epa/contaminated-land":{"get":{"tags":["epa-victoria"],"summary":"Get Contaminated Land","description":"Get contaminated land sites (Priority Sites Register) intersecting a scenario.","operationId":"get_contaminated_land_api_epa_contaminated_land_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scenario Id"}},{"name":"minx","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Minx"}},{"name":"miny","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Miny"}},{"name":"maxx","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Maxx"}},{"name":"maxy","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Maxy"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Contaminated Land Api Epa Contaminated Land Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/epa/contaminated-land/near":{"get":{"tags":["epa-victoria"],"summary":"Get Contaminated Land Near Point","description":"Get contaminated land sites within a radius of a point.","operationId":"get_contaminated_land_near_point_api_epa_contaminated_land_near_get","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","description":"Latitude","title":"Lat"},"description":"Latitude"},{"name":"lon","in":"query","required":true,"schema":{"type":"number","description":"Longitude","title":"Lon"},"description":"Longitude"},{"name":"radius_m","in":"query","required":false,"schema":{"type":"number","description":"Search radius in metres","default":1000,"title":"Radius M"},"description":"Search radius in metres"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vicroads/traffic-volumes":{"get":{"tags":["vicroads"],"summary":"Get Traffic Volumes","description":"Get AADT traffic volume segments intersecting a scenario's painted areas.","operationId":"get_traffic_volumes_api_vicroads_traffic_volumes_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scenario Id"}},{"name":"minx","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Minx"}},{"name":"miny","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Miny"}},{"name":"maxx","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Maxx"}},{"name":"maxy","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Maxy"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Traffic Volumes Api Vicroads Traffic Volumes Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vicroads/traffic-volumes/stats":{"get":{"tags":["vicroads"],"summary":"Get Traffic Volume Stats","description":"Get summary statistics for traffic volumes in a scenario area.","operationId":"get_traffic_volume_stats_api_vicroads_traffic_volumes_stats_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scenario Id"}},{"name":"minx","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Minx"}},{"name":"miny","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Miny"}},{"name":"maxx","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Maxx"}},{"name":"maxy","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Maxy"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Traffic Volume Stats Api Vicroads Traffic Volumes Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/regulations/search":{"get":{"tags":["Regulations"],"summary":"Search Regulations","operationId":"search_regulations_api_regulations_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":300,"description":"Words or a clause number (r.79, 55.02-5, H4P3)","title":"Q"},"description":"Words or a clause number (r.79, 55.02-5, H4P3)"},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"building-regs, ncc, planning, or a source id","title":"Source"},"description":"building-regs, ncc, planning, or a source id"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"default":8,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/regulations/clause/{source}/{clause_id}":{"get":{"tags":["Regulations"],"summary":"Get Clause","operationId":"get_clause_api_regulations_clause__source___clause_id__get","parameters":[{"name":"source","in":"path","required":true,"schema":{"type":"string","title":"Source"}},{"name":"clause_id","in":"path","required":true,"schema":{"type":"string","title":"Clause Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/regulations/sources":{"get":{"tags":["Regulations"],"summary":"List Sources","operationId":"list_sources_api_regulations_sources_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/check/scenarios/{scenario_id}":{"get":{"tags":["check"],"summary":"Check Scenario","description":"Check a scenario against every rule we hold. Returns findings (each with a\nstatus, severity, measured value, limit, clause, source, and the sites and\nbuildings it concerns), a summary, and the siting envelopes for the map.\nIndicative only: not a planning decision.","operationId":"check_scenario_api_check_scenarios__scenario_id__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}},{"name":"facts","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Confirmed facts, JSON: {\"sites\": {\"0\": {\"dwellings\": 3, \"car_spaces\": 4}}}","title":"Facts"},"description":"Confirmed facts, JSON: {\"sites\": {\"0\": {\"dwellings\": 3, \"car_spaces\": 4}}}"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Check Scenario Api Check Scenarios  Scenario Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/check/scenarios/{scenario_id}/reports":{"post":{"tags":["check"],"summary":"Create Report","description":"Share the Check as a read-only report: runs the Check now (with the given\nfacts) and keeps that result under a link anyone can open. Only the\nscenario's owner can share it; the link can be turned off.","operationId":"create_report_api_check_scenarios__scenario_id__reports_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Report Api Check Scenarios  Scenario Id  Reports Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["check"],"summary":"List Reports","description":"The scenario's active report links (owner only).","operationId":"list_reports_api_check_scenarios__scenario_id__reports_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Reports Api Check Scenarios  Scenario Id  Reports Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/check/reports/{token}":{"delete":{"tags":["check"],"summary":"Revoke Report","description":"Turn a report link off (the scenario's owner).","operationId":"revoke_report_api_check_reports__token__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Revoke Report Api Check Reports  Token  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["check"],"summary":"Get Report","description":"A shared Check report, for anyone with the link. No sign-in.","operationId":"get_report_api_check_reports__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Report Api Check Reports  Token  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/design-models":{"get":{"tags":["design-models"],"summary":"List Models","operationId":"list_models_api_design_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Models Api Design Models Get"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]},"post":{"tags":["design-models"],"summary":"Upload Model","operationId":"upload_model_api_design_models_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_model_api_design_models_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Upload Model Api Design Models Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/design-models/{model_id}.glb":{"get":{"tags":["design-models"],"summary":"Get Model","operationId":"get_model_api_design_models__model_id__glb_get","parameters":[{"name":"model_id","in":"path","required":true,"schema":{"type":"string","title":"Model Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/design-models/{model_id}/rooms":{"put":{"tags":["design-models"],"summary":"Put Rooms","operationId":"put_rooms_api_design_models__model_id__rooms_put","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"model_id","in":"path","required":true,"schema":{"type":"string","title":"Model Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Rooms Api Design Models  Model Id  Rooms Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["design-models"],"summary":"Get Rooms","operationId":"get_rooms_api_design_models__model_id__rooms_get","parameters":[{"name":"model_id","in":"path","required":true,"schema":{"type":"string","title":"Model Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/design-models/{model_id}":{"delete":{"tags":["design-models"],"summary":"Remove Model","operationId":"remove_model_api_design_models__model_id__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"model_id","in":"path","required":true,"schema":{"type":"string","title":"Model Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Remove Model Api Design Models  Model Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pointclouds":{"get":{"tags":["pointclouds"],"summary":"List Captures","operationId":"list_captures_api_pointclouds_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Captures Api Pointclouds Get"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]},"post":{"tags":["pointclouds"],"summary":"Start Upload","operationId":"start_upload_api_pointclouds_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadStart"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Start Upload Api Pointclouds Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/pointclouds/city/cover":{"post":{"tags":["pointclouds"],"summary":"City Cover","description":"Whether the City of Melbourne's 2018 capture covers a site, and how many of its tiles that takes.","operationId":"city_cover_api_pointclouds_city_cover_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteOnly"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response City Cover Api Pointclouds City Cover Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pointclouds/city":{"post":{"tags":["pointclouds"],"summary":"Start City","description":"A capture of a City of Melbourne site from the City's 2018 point cloud: only the tiles the site needs.","operationId":"start_city_api_pointclouds_city_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteOnly"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Start City Api Pointclouds City Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/pointclouds/{pc_id}/chunks/{index}":{"put":{"tags":["pointclouds"],"summary":"Put Chunk","operationId":"put_chunk_api_pointclouds__pc_id__chunks__index__put","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"pc_id","in":"path","required":true,"schema":{"type":"string","title":"Pc Id"}},{"name":"index","in":"path","required":true,"schema":{"type":"integer","title":"Index"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Chunk Api Pointclouds  Pc Id  Chunks  Index  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pointclouds/{pc_id}/finish":{"post":{"tags":["pointclouds"],"summary":"Finish","operationId":"finish_api_pointclouds__pc_id__finish_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"pc_id","in":"path","required":true,"schema":{"type":"string","title":"Pc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Finish Api Pointclouds  Pc Id  Finish Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pointclouds/{pc_id}/crs":{"post":{"tags":["pointclouds"],"summary":"Give Crs","operationId":"give_crs_api_pointclouds__pc_id__crs_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"pc_id","in":"path","required":true,"schema":{"type":"string","title":"Pc Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrsChoice"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Give Crs Api Pointclouds  Pc Id  Crs Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pointclouds/{pc_id}":{"get":{"tags":["pointclouds"],"summary":"Get Capture","description":"A capture's state and summary: public by id, so a shared scenario can draw it.","operationId":"get_capture_api_pointclouds__pc_id__get","parameters":[{"name":"pc_id","in":"path","required":true,"schema":{"type":"string","title":"Pc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Capture Api Pointclouds  Pc Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["pointclouds"],"summary":"Remove","operationId":"remove_api_pointclouds__pc_id__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"pc_id","in":"path","required":true,"schema":{"type":"string","title":"Pc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Remove Api Pointclouds  Pc Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pointclouds/{pc_id}/cloud.copc.laz":{"get":{"tags":["pointclouds"],"summary":"Get Cloud","operationId":"get_cloud_api_pointclouds__pc_id__cloud_copc_laz_get","parameters":[{"name":"pc_id","in":"path","required":true,"schema":{"type":"string","title":"Pc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pointclouds/{pc_id}/{what}.geojson":{"get":{"tags":["pointclouds"],"summary":"Get Measure","description":"What was measured from a capture (P2): contours, spot levels or trees, GeoJSON in longitude/latitude.","operationId":"get_measure_api_pointclouds__pc_id___what__geojson_get","parameters":[{"name":"pc_id","in":"path","required":true,"schema":{"type":"string","title":"Pc Id"}},{"name":"what","in":"path","required":true,"schema":{"type":"string","title":"What"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/com-context/trees":{"post":{"tags":["com-context"],"summary":"Council Trees","description":"Council trees on the site and within 20 m of it, with their tree protection zones (AS 4970). Public data.","operationId":"council_trees_api_com_context_trees_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteOnly"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Council Trees Api Com Context Trees Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/units/layout":{"post":{"tags":["units"],"summary":"Units Layout","description":"The building's units: the summary (homes by type, units per floor, corridor, core, mix) and the rooms.","operationId":"units_layout_api_units_layout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnitsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Units Layout Api Units Layout Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/units/measures":{"post":{"tags":["units"],"summary":"Units Measures","description":"What each home gets: hours of sun on its living room and balcony, and how far it looks out (Milestone M1).","operationId":"units_measures_api_units_measures_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeasuresRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Units Measures Api Units Measures Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/units/surroundings":{"post":{"tags":["units"],"summary":"Units Surroundings","description":"What a walk through a home sees: the buildings around, the parks and the sun (Milestone M4).","operationId":"units_surroundings_api_units_surroundings_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeasuresRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Units Surroundings Api Units Surroundings Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/units/render/usage":{"get":{"tags":["units"],"summary":"Render Usage","description":"How many illustrative pictures the user has left this month.","operationId":"render_usage_api_units_render_usage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Render Usage Api Units Render Usage Get"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/units/render":{"post":{"tags":["units"],"summary":"Render View","description":"An illustrative picture of a view (Milestone M5): signed-in, a limit each month, labelled in the image. A failed try\nisn't counted. The view goes to the model's provider.","operationId":"render_view_api_units_render_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenderRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Render View Api Units Render Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/units/sheets":{"post":{"tags":["units"],"summary":"Create Sheet","description":"Share a building's sales sheets by link: its homes as saved now, measured now. Only the scenario's owner can.","operationId":"create_sheet_api_units_sheets_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SheetCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Sheet Api Units Sheets Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/units/sheets/{token}":{"get":{"tags":["units"],"summary":"Get Sheet","description":"A building's sales sheets, for anyone with the link. No sign-in.","operationId":"get_sheet_api_units_sheets__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Sheet Api Units Sheets  Token  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["units"],"summary":"Turn Off Sheet","description":"Turn a link off. Only the scenario's owner can.","operationId":"turn_off_sheet_api_units_sheets__token__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Turn Off Sheet Api Units Sheets  Token  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/units/check":{"post":{"tags":["units"],"summary":"Units Check","description":"One unit's rooms against the inside standards, as the plan's edited (Milestone U2c).","operationId":"units_check_api_units_check_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnitCheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Units Check Api Units Check Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/units/mix":{"get":{"tags":["units"],"summary":"Units Mix","description":"The default unit mix at a place: the City of Melbourne's completed developments near it, else the City's.","operationId":"units_mix_api_units_mix_get","parameters":[{"name":"lon","in":"query","required":true,"schema":{"type":"number","title":"Lon"}},{"name":"lat","in":"query","required":true,"schema":{"type":"number","title":"Lat"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Units Mix Api Units Mix Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/library":{"get":{"tags":["library"],"summary":"List Items","operationId":"list_items_api_library_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Items Api Library Get"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]},"post":{"tags":["library"],"summary":"Add Item","operationId":"add_item_api_library_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LibraryItemIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Add Item Api Library Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/library/{item_id}":{"put":{"tags":["library"],"summary":"Update Item","operationId":"update_item_api_library__item_id__put","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LibraryItemPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Item Api Library  Item Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["library"],"summary":"Update Item","operationId":"update_item_api_library__item_id__patch","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LibraryItemPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Item Api Library  Item Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["library"],"summary":"Remove Item","description":"Remove it from the library; its 3D model goes too, unless something you placed still draws with it.","operationId":"remove_item_api_library__item_id__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Remove Item Api Library  Item Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/connect/scenarios/{scenario_id}/sites/{area_id}/buildings/{link}":{"put":{"tags":["connect"],"summary":"Upsert Linked Building","operationId":"upsert_linked_building_api_connect_scenarios__scenario_id__sites__area_id__buildings__link__put","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}},{"name":"area_id","in":"path","required":true,"schema":{"type":"string","title":"Area Id"}},{"name":"link","in":"path","required":true,"schema":{"type":"string","title":"Link"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedBuilding"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Upsert Linked Building Api Connect Scenarios  Scenario Id  Sites  Area Id  Buildings  Link  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["connect"],"summary":"Remove Linked Building","operationId":"remove_linked_building_api_connect_scenarios__scenario_id__sites__area_id__buildings__link__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}},{"name":"area_id","in":"path","required":true,"schema":{"type":"string","title":"Area Id"}},{"name":"link","in":"path","required":true,"schema":{"type":"string","title":"Link"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Remove Linked Building Api Connect Scenarios  Scenario Id  Sites  Area Id  Buildings  Link  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/connect/scenarios/{scenario_id}/sites/{area_id}/package":{"get":{"tags":["connect"],"summary":"Site Package","description":"The lot and its surroundings for a design tool, in metres around the lot's centroid.","operationId":"site_package_api_connect_scenarios__scenario_id__sites__area_id__package_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}},{"name":"area_id","in":"path","required":true,"schema":{"type":"string","title":"Area Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Site Package Api Connect Scenarios  Scenario Id  Sites  Area Id  Package Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/connect/scenarios/{scenario_id}/buildings/{link}/check":{"get":{"tags":["connect"],"summary":"Linked Building Check","description":"The Check for one linked building: its own findings and its site's, problems first.","operationId":"linked_building_check_api_connect_scenarios__scenario_id__buildings__link__check_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}},{"name":"link","in":"path","required":true,"schema":{"type":"string","title":"Link"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Linked Building Check Api Connect Scenarios  Scenario Id  Buildings  Link  Check Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/summary":{"get":{"tags":["admin"],"summary":"Summary","description":"The counts at the top of the page, and the sidebar's waiting number.","operationId":"summary_api_admin_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Summary Api Admin Summary Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/admin/accounts":{"get":{"tags":["admin"],"summary":"Accounts","description":"Accounts, newest first. Guests are counted in the summary, not listed.","operationId":"accounts_api_admin_accounts_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"enum":["pending","active","off"],"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Accounts Api Admin Accounts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/accounts/{user_id}/approve":{"post":{"tags":["admin"],"summary":"Approve","operationId":"approve_api_admin_accounts__user_id__approve_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Approve Api Admin Accounts  User Id  Approve Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/accounts/{user_id}/turn-off":{"post":{"tags":["admin"],"summary":"Turn Off","description":"Also how a waiting account is declined: nothing is deleted, and it can be turned on again.","operationId":"turn_off_api_admin_accounts__user_id__turn_off_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Turn Off Api Admin Accounts  User Id  Turn Off Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/accounts/{user_id}/turn-on":{"post":{"tags":["admin"],"summary":"Turn On","operationId":"turn_on_api_admin_accounts__user_id__turn_on_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Turn On Api Admin Accounts  User Id  Turn On Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/accounts/{user_id}/role":{"put":{"tags":["admin"],"summary":"Set Role","operationId":"set_role_api_admin_accounts__user_id__role_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleChange"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Set Role Api Admin Accounts  User Id  Role Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/accounts/{user_id}/picture-limit":{"put":{"tags":["admin"],"summary":"Set Picture Limit","operationId":"set_picture_limit_api_admin_accounts__user_id__picture_limit_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PictureLimit"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Picture Limit Api Admin Accounts  User Id  Picture Limit Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/accounts/{user_id}/reset-password":{"post":{"tags":["admin"],"summary":"Reset Password","description":"A temporary password, shown to the admin once and never kept. They must change it at their next sign-in.","operationId":"reset_password_api_admin_accounts__user_id__reset_password_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Reset Password Api Admin Accounts  User Id  Reset Password Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/accounts/{user_id}/sign-out":{"post":{"tags":["admin"],"summary":"Sign Out Everywhere","operationId":"sign_out_everywhere_api_admin_accounts__user_id__sign_out_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"boolean"},"title":"Response Sign Out Everywhere Api Admin Accounts  User Id  Sign Out Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/activity":{"get":{"tags":["admin"],"summary":"Activity","description":"Who did what and when: sign-ins and admin actions, and what's done to scenarios. Newest first.","operationId":"activity_api_admin_activity_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"User Id"}},{"name":"kind","in":"query","required":false,"schema":{"enum":["all","accounts","scenarios"],"type":"string","default":"all","title":"Kind"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Activity Api Admin Activity Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/usage":{"get":{"tags":["admin"],"summary":"Usage","description":"Requests and people per day, and the routes most used, slowest and failing. Everyone, or one person.","operationId":"usage_api_admin_usage_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":30,"title":"Days"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Usage Api Admin Usage Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/study-areas/councils":{"get":{"tags":["study-areas"],"summary":"Councils","description":"The councils that can be studied, with their Plan for Victoria housing targets.","operationId":"councils_api_study_areas_councils_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Councils Api Study Areas Councils Get"}}}}}}},"/api/study-areas/":{"get":{"tags":["study-areas"],"summary":"My Areas","operationId":"my_areas_api_study_areas__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response My Areas Api Study Areas  Get"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]},"post":{"tags":["study-areas"],"summary":"Start","operationId":"start_api_study_areas__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewStudyArea"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Start Api Study Areas  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/study-areas/{area_id}":{"get":{"tags":["study-areas"],"summary":"One","operationId":"one_api_study_areas__area_id__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"area_id","in":"path","required":true,"schema":{"type":"integer","title":"Area Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response One Api Study Areas  Area Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["study-areas"],"summary":"Remove","operationId":"remove_api_study_areas__area_id__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"area_id","in":"path","required":true,"schema":{"type":"integer","title":"Area Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Remove Api Study Areas  Area Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/study-areas/{area_id}/results":{"post":{"tags":["study-areas"],"summary":"Results","description":"Suitability, capacity and allocation for these choices, which are kept with the area.","operationId":"results_api_study_areas__area_id__results_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"area_id","in":"path","required":true,"schema":{"type":"integer","title":"Area Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Choices"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Results Api Study Areas  Area Id  Results Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["study-areas"],"summary":"Saved Results","operationId":"saved_results_api_study_areas__area_id__results_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"area_id","in":"path","required":true,"schema":{"type":"integer","title":"Area Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Saved Results Api Study Areas  Area Id  Results Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/study-areas/{area_id}/lots":{"get":{"tags":["study-areas"],"summary":"Lots In View","description":"The lots in view, as polygons with their results, when the map is zoomed in.","operationId":"lots_in_view_api_study_areas__area_id__lots_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"area_id","in":"path","required":true,"schema":{"type":"integer","title":"Area Id"}},{"name":"minx","in":"query","required":true,"schema":{"type":"number","title":"Minx"}},{"name":"miny","in":"query","required":true,"schema":{"type":"number","title":"Miny"}},{"name":"maxx","in":"query","required":true,"schema":{"type":"number","title":"Maxx"}},{"name":"maxy","in":"query","required":true,"schema":{"type":"number","title":"Maxy"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Lots In View Api Study Areas  Area Id  Lots Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/study-areas/{area_id}/to-scenario":{"post":{"tags":["study-areas"],"summary":"To Scenario","description":"Allocated lots become a scenario, to Fill, Check and analyse.","operationId":"to_scenario_api_study_areas__area_id__to_scenario_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"area_id","in":"path","required":true,"schema":{"type":"integer","title":"Area Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToScenario"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response To Scenario Api Study Areas  Area Id  To Scenario Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/study-areas/{area_id}/download.csv":{"get":{"tags":["study-areas"],"summary":"Download Csv","description":"Every lot with its results, one row each, with its inside point in EPSG:4326.","operationId":"download_csv_api_study_areas__area_id__download_csv_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"area_id","in":"path","required":true,"schema":{"type":"integer","title":"Area Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/study-areas/{area_id}/download.geojson":{"get":{"tags":["study-areas"],"summary":"Download Geojson","description":"Every lot with its polygon and results, in EPSG:4326.","operationId":"download_geojson_api_study_areas__area_id__download_geojson_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"area_id","in":"path","required":true,"schema":{"type":"integer","title":"Area Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/existing":{"post":{"tags":["existing"],"summary":"Existing For Site","description":"{geometry: GeoJSON polygon in WGS84} in; estimates with their sources out. Nothing is saved.","operationId":"existing_for_site_api_existing_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/existing/buildings":{"post":{"tags":["existing"],"summary":"Existing Buildings For Site","description":"The footprints standing on a site now, for the map, as GeoJSON in WGS84. Nothing is saved.","operationId":"existing_buildings_for_site_api_existing_buildings_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/cad/health":{"get":{"tags":["cad"],"summary":"Cad Health","description":"Whether the CAD service is up and which engine versions it runs.","operationId":"cad_health_api_cad_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/stormwater/ifd":{"post":{"tags":["stormwater"],"summary":"Read Ifd","description":"Read a BoM IFD table (the CSV from 'Download as CSV'); fits per AEP, and how far its cell is from the site.","operationId":"read_ifd_api_stormwater_ifd_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IfdUpload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Read Ifd Api Stormwater Ifd Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/stormwater/scenarios/{scenario_id}/sites/{site}/design":{"post":{"tags":["stormwater"],"summary":"Design Site","description":"Lay out and design a site's minor stormwater network (IDM v5.6 clause 16); site counts from 1.","operationId":"design_site_api_stormwater_scenarios__scenario_id__sites__site__design_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}},{"name":"site","in":"path","required":true,"schema":{"type":"integer","title":"Site"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DesignRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Design Site Api Stormwater Scenarios  Scenario Id  Sites  Site  Design Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stormwater/sewer-values":{"get":{"tags":["stormwater"],"summary":"Sewer Values","description":"The sewer design values (B4b) the Sewer card starts from: each with its source, and which are placeholders.","operationId":"sewer_values_api_stormwater_sewer_values_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Sewer Values Api Stormwater Sewer Values Get"}}}}}}},"/api/stormwater/scenarios/{scenario_id}/sites/{site}/sewer":{"post":{"tags":["stormwater"],"summary":"Design Sewer","description":"Lay out and design a site's gravity sewer (B4b): maintenance holes and mains along its streets, each building's\nequivalent population at the nearest hole, sized by the WSA 02 flow method with sourced, changeable values\n(services/sewer.py). Site counts from 1. Nothing is saved.","operationId":"design_sewer_api_stormwater_scenarios__scenario_id__sites__site__sewer_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"integer","title":"Scenario Id"}},{"name":"site","in":"path","required":true,"schema":{"type":"integer","title":"Site"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SewerRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Design Sewer Api Stormwater Scenarios  Scenario Id  Sites  Site  Sewer Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"summary":"Root","description":"Root endpoint.","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AIPDFReportContent":{"properties":{"executive_summary":{"type":"string","title":"Executive Summary","default":""},"key_findings":{"items":{"type":"string"},"type":"array","title":"Key Findings","default":[]},"recommendations":{"items":{"type":"string"},"type":"array","title":"Recommendations","default":[]},"concerns":{"items":{"type":"string"},"type":"array","title":"Concerns","default":[]},"opportunities":{"items":{"type":"string"},"type":"array","title":"Opportunities","default":[]},"policy_alignment":{"type":"string","title":"Policy Alignment","default":""},"next_steps":{"items":{"type":"string"},"type":"array","title":"Next Steps","default":[]}},"type":"object","title":"AIPDFReportContent","description":"AI-generated content for PDF report."},"AIPDFReportRequest":{"properties":{"scenario_id":{"type":"integer","title":"Scenario Id","description":"ID of the scenario"},"analysis_type":{"type":"string","title":"Analysis Type","description":"Type of analysis (e.g., 'land-use-mix', 'transport')"},"analysis_results":{"additionalProperties":true,"type":"object","title":"Analysis Results","description":"The analysis results"},"scenario_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scenario Name","description":"Name of the scenario"},"audience":{"$ref":"#/components/schemas/AudienceType","description":"Target audience","default":"technical"},"include_sections":{"items":{"type":"string"},"type":"array","title":"Include Sections","description":"Sections to generate AI content for","default":["executive_summary","key_findings","recommendations","policy_alignment"]}},"type":"object","required":["scenario_id","analysis_type","analysis_results"],"title":"AIPDFReportRequest","description":"Request for AI-enhanced PDF report content."},"AIPDFReportResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"analysis_type":{"type":"string","title":"Analysis Type"},"audience":{"type":"string","title":"Audience","default":""},"content":{"anyOf":[{"$ref":"#/components/schemas/AIPDFReportContent"},{"type":"null"}]},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"model":{"type":"string","title":"Model","default":""},"provider":{"type":"string","title":"Provider","default":""},"cached":{"type":"boolean","title":"Cached","default":false}},"type":"object","required":["success","analysis_type"],"title":"AIPDFReportResponse","description":"Response containing AI-generated PDF report content."},"AIServiceStatus":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"primary_provider":{"type":"string","title":"Primary Provider"},"providers":{"additionalProperties":{"$ref":"#/components/schemas/ProviderStatus"},"type":"object","title":"Providers"},"model":{"type":"string","title":"Model"},"caching_enabled":{"type":"boolean","title":"Caching Enabled"},"streaming_enabled":{"type":"boolean","title":"Streaming Enabled"}},"type":"object","required":["enabled","primary_provider","providers","model","caching_enabled","streaming_enabled"],"title":"AIServiceStatus","description":"Overall AI service status."},"APIKeyResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"tier":{"type":"string","title":"Tier"},"is_active":{"type":"boolean","title":"Is Active"},"request_count":{"type":"integer","title":"Request Count"},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used At"},"created_at":{"type":"string","title":"Created At"},"rate_limit":{"type":"integer","title":"Rate Limit"}},"type":"object","required":["id","name","key_prefix","tier","is_active","request_count","created_at","rate_limit"],"title":"APIKeyResponse"},"ActivityCount":{"properties":{"scenario_id":{"type":"integer","title":"Scenario Id"},"total":{"type":"integer","title":"Total"},"by_action_type":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Action Type"},"by_entity_type":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Entity Type"}},"type":"object","required":["scenario_id","total","by_action_type","by_entity_type"],"title":"ActivityCount","description":"Activity count statistics."},"ActivityLog":{"properties":{"action_type":{"type":"string","title":"Action Type"},"action_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action Description"},"entity_type":{"type":"string","title":"Entity Type"},"entity_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Entity Id"},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details"},"created_by_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By Name"},"id":{"type":"integer","title":"Id"},"scenario_id":{"type":"integer","title":"Scenario Id"},"created_by_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created By Id"},"ip_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ip Address"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["action_type","entity_type","id","scenario_id","created_at"],"title":"ActivityLog"},"ActivityLogCreate":{"properties":{"action_type":{"type":"string","title":"Action Type"},"action_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action Description"},"entity_type":{"type":"string","title":"Entity Type"},"entity_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Entity Id"},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details"},"created_by_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By Name"},"scenario_id":{"type":"integer","title":"Scenario Id"}},"type":"object","required":["action_type","entity_type","scenario_id"],"title":"ActivityLogCreate"},"ActivityLogSummary":{"properties":{"id":{"type":"integer","title":"Id"},"scenario_id":{"type":"integer","title":"Scenario Id"},"action_type":{"type":"string","title":"Action Type"},"action_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action Description"},"entity_type":{"type":"string","title":"Entity Type"},"entity_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Entity Id"},"created_by_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By Name"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details"}},"type":"object","required":["id","scenario_id","action_type","entity_type","created_at"],"title":"ActivityLogSummary","description":"Lightweight activity log for list views."},"ActivityScore":{"properties":{"score":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Score","description":"Activity score 0-100"},"rating":{"type":"string","title":"Rating","description":"Rating: 'Very Active', 'Active', 'Moderate', 'Slow', 'Inactive'"},"factors":{"items":{"type":"string"},"type":"array","title":"Factors","description":"Contributing factors to the score","default":[]}},"type":"object","required":["score","rating"],"title":"ActivityScore","description":"Development activity assessment score."},"AddressQueryRequest":{"properties":{"geometry":{"$ref":"#/components/schemas/routers__vicmap__GeometryInput","description":"GeoJSON geometry for spatial query"},"primary_only":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Primary Only","description":"Only count primary addresses","default":true}},"type":"object","required":["geometry"],"title":"AddressQueryRequest","description":"Request for address query."},"AdminBoundaryRequest":{"properties":{"geometry":{"$ref":"#/components/schemas/routers__vicmap__GeometryInput","description":"GeoJSON geometry to query"}},"type":"object","required":["geometry"],"title":"AdminBoundaryRequest","description":"Request for admin boundary lookup."},"AffordabilityIndex":{"properties":{"rental_affordability_index":{"type":"number","title":"Rental Affordability Index","description":"Income to rent ratio","default":0},"mortgage_affordability_index":{"type":"number","title":"Mortgage Affordability Index","description":"Income to mortgage ratio","default":0},"rent_to_income_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rent To Income Ratio","description":"Rent as % of income"},"mortgage_to_income_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mortgage To Income Ratio","description":"Mortgage as % of income"},"overall_score":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Overall Score","description":"Affordability score (0-100)","default":50},"rating":{"type":"string","title":"Rating","description":"Affordability rating","default":"Moderate"}},"type":"object","title":"AffordabilityIndex","description":"Housing affordability index metrics."},"AgentQueryRequest":{"properties":{"message":{"type":"string","title":"Message","description":"Natural language query"},"scenario_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scenario Id","description":"Current scenario context"},"project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Project Id","description":"Ask about this whole workspace (project) instead of one scenario"},"conversation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Conversation Id","description":"Conversation ID to continue (omit to auto-create)"},"conversation_history":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Conversation History","description":"Previous messages for context (used if no conversation_id)"}},"type":"object","required":["message"],"title":"AgentQueryRequest"},"AlterationsData":{"properties":{"alterations_creating_dwellings":{"type":"integer","title":"Alterations Creating Dwellings","description":"Alterations that create new dwellings","default":0},"conversions":{"type":"integer","title":"Conversions","description":"Building conversions","default":0},"total_alterations":{"type":"integer","title":"Total Alterations","description":"Total alterations including conversions","default":0}},"type":"object","title":"AlterationsData","description":"Alterations and conversions data."},"AmenityProximityRequest":{"properties":{"lat":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Lat","description":"Center latitude"},"lon":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Lon","description":"Center longitude"},"amenity_types":{"items":{"type":"string"},"type":"array","title":"Amenity Types","description":"OSM amenity types to search","default":["supermarket","cafe","school","pharmacy","restaurant","bank"]},"max_distance_m":{"type":"integer","maximum":5000.0,"minimum":100.0,"title":"Max Distance M","description":"Maximum search distance in meters","default":2000}},"type":"object","required":["lat","lon"],"title":"AmenityProximityRequest","description":"Request for amenity proximity analysis."},"AmenityProximityResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"center":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Center"},"search_radius_m":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Search Radius M"},"amenities":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/AmenityResult"},"type":"object"},{"type":"null"}],"title":"Amenities"},"processing_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Processing Time Ms"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["success"],"title":"AmenityProximityResponse","description":"Response for amenity proximity analysis."},"AmenityResult":{"properties":{"found":{"type":"boolean","title":"Found"},"count":{"type":"integer","title":"Count"},"nearest":{"anyOf":[{"$ref":"#/components/schemas/NearestAmenity"},{"type":"null"}]},"all":{"anyOf":[{"items":{"$ref":"#/components/schemas/NearestAmenity"},"type":"array"},{"type":"null"}],"title":"All"}},"type":"object","required":["found","count"],"title":"AmenityResult","description":"Result for a single amenity type."},"AnalysisInsightsRequest":{"properties":{"analysis_type":{"type":"string","title":"Analysis Type","description":"Type of analysis (e.g., 'land-use-mix', 'transport', 'fiscal')"},"analysis_results":{"additionalProperties":true,"type":"object","title":"Analysis Results","description":"The analysis results to generate insights for"},"scenario_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scenario Name","description":"Name of the scenario"},"audience":{"$ref":"#/components/schemas/AudienceType","description":"Target audience for insights","default":"technical"},"scenario_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scenario Id","description":"Save the explanation with this scenario's saved result (the owner only, and only if the result is still the same)"}},"type":"object","required":["analysis_type","analysis_results"],"title":"AnalysisInsightsRequest","description":"Request for AI-generated insights on analysis results."},"AnalysisInsightsResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"analysis_type":{"type":"string","title":"Analysis Type"},"summary":{"type":"string","title":"Summary","default":""},"key_findings":{"items":{"type":"string"},"type":"array","title":"Key Findings","default":[]},"recommendations":{"items":{"type":"string"},"type":"array","title":"Recommendations","default":[]},"concerns":{"items":{"type":"string"},"type":"array","title":"Concerns","default":[]},"opportunities":{"items":{"type":"string"},"type":"array","title":"Opportunities","default":[]},"audience":{"type":"string","title":"Audience","default":""},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"model":{"type":"string","title":"Model","default":""},"provider":{"type":"string","title":"Provider","default":""},"cached":{"type":"boolean","title":"Cached","default":false}},"type":"object","required":["success","analysis_type"],"title":"AnalysisInsightsResponse","description":"Response containing AI-generated insights."},"AnalysisRequest":{"properties":{"scenario_id":{"type":"integer","title":"Scenario Id"},"parameters":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Parameters"}},"type":"object","required":["scenario_id"],"title":"AnalysisRequest"},"AnalysisResponse":{"properties":{"scenario_id":{"type":"integer","title":"Scenario Id"},"results":{"additionalProperties":true,"type":"object","title":"Results"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"}},"type":"object","required":["scenario_id","results","timestamp"],"title":"AnalysisResponse"},"AreaInfo":{"properties":{"code":{"type":"string","title":"Code","description":"Area code (e.g., SA2 code)"},"name":{"type":"string","title":"Name","description":"Area name"}},"type":"object","required":["code","name"],"title":"AreaInfo","description":"Basic information about a statistical area."},"AudienceType":{"type":"string","enum":["technical","elected","community"],"title":"AudienceType","description":"Target audience for explanations."},"AutomaticSegmentationRequest":{"properties":{"bbox":{"$ref":"#/components/schemas/BoundingBoxCoords","description":"Bounding box for imagery"},"model_type":{"$ref":"#/components/schemas/SAMModelType","default":"vit_b"},"points_per_side":{"type":"integer","maximum":64.0,"minimum":4.0,"title":"Points Per Side","description":"Points per side for automatic mask generation","default":16},"pred_iou_thresh":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Pred Iou Thresh","description":"Predicted IoU threshold for filtering masks","default":0.8},"stability_score_thresh":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Stability Score Thresh","description":"Stability score threshold for filtering masks","default":0.85},"min_area_sqm":{"type":"number","minimum":0.0,"title":"Min Area Sqm","default":10.0},"max_features":{"type":"integer","maximum":5000.0,"minimum":1.0,"title":"Max Features","default":500},"zoom_level":{"type":"integer","maximum":21.0,"minimum":15.0,"title":"Zoom Level","default":18},"imagery_source":{"type":"string","title":"Imagery Source","default":"Satellite"}},"type":"object","required":["bbox"],"title":"AutomaticSegmentationRequest","description":"Request for automatic segmentation of entire image."},"BboxLayerRequest":{"properties":{"minx":{"type":"number","title":"Minx","description":"Minimum longitude"},"miny":{"type":"number","title":"Miny","description":"Minimum latitude"},"maxx":{"type":"number","title":"Maxx","description":"Maximum longitude"},"maxy":{"type":"number","title":"Maxy","description":"Maximum latitude"}},"type":"object","required":["minx","miny","maxx","maxy"],"title":"BboxLayerRequest","description":"Request for a bbox-based layer query."},"Body_import_scenario_excel_api_scenarios_import_excel_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_import_scenario_excel_api_scenarios_import_excel_post"},"Body_import_scenario_geojson_api_scenarios_import_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_import_scenario_geojson_api_scenarios_import_post"},"Body_import_shapefile_api_master_plan_import_shapefile_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_import_shapefile_api_master_plan_import_shapefile_post"},"Body_login_for_access_token_api_auth_login_post":{"properties":{"grant_type":{"anyOf":[{"type":"string","pattern":"^password$"},{"type":"null"}],"title":"Grant Type"},"username":{"type":"string","title":"Username"},"password":{"type":"string","format":"password","title":"Password"},"scope":{"type":"string","title":"Scope","default":""},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"format":"password","title":"Client Secret"}},"type":"object","required":["username","password"],"title":"Body_login_for_access_token_api_auth_login_post"},"Body_upload_model_api_design_models_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"name":{"type":"string","title":"Name","default":""},"source_format":{"type":"string","title":"Source Format","default":"gltf"},"triangles":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Triangles"}},"type":"object","required":["file"],"title":"Body_upload_model_api_design_models_post"},"BoundariesResponse":{"properties":{"type":{"type":"string","title":"Type","default":"FeatureCollection"},"features":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Features"},"metadata":{"$ref":"#/components/schemas/BoundaryMetadata"}},"type":"object","required":["features","metadata"],"title":"BoundariesResponse","description":"Response containing boundary features."},"BoundaryMetadata":{"properties":{"boundary_type":{"type":"string","title":"Boundary Type"},"boundary_name":{"type":"string","title":"Boundary Name"},"description":{"type":"string","title":"Description"},"bbox":{"items":{"type":"number"},"type":"array","title":"Bbox"},"feature_count":{"type":"integer","title":"Feature Count"},"generalised":{"type":"boolean","title":"Generalised"},"victoria_only":{"type":"boolean","title":"Victoria Only"},"timestamp":{"type":"string","title":"Timestamp"}},"type":"object","required":["boundary_type","boundary_name","description","bbox","feature_count","generalised","victoria_only","timestamp"],"title":"BoundaryMetadata","description":"Metadata about boundary query results."},"BoundaryTypeInfo":{"properties":{"code":{"type":"string","title":"Code","description":"Boundary type code (e.g., 'sa1', 'sa2', 'lga')"},"name":{"type":"string","title":"Name","description":"Full name of the boundary type"},"description":{"type":"string","title":"Description","description":"Description of what this boundary represents"}},"type":"object","required":["code","name","description"],"title":"BoundaryTypeInfo","description":"Information about a boundary type."},"BoundingBoxCoords":{"properties":{"minx":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Minx","description":"West longitude (-180 to 180)"},"miny":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Miny","description":"South latitude (-90 to 90)"},"maxx":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Maxx","description":"East longitude (-180 to 180)"},"maxy":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Maxy","description":"North latitude (-90 to 90)"}},"type":"object","required":["minx","miny","maxx","maxy"],"title":"BoundingBoxCoords","description":"Bounding box coordinates for imagery fetch."},"BoxPrompt":{"properties":{"minx":{"type":"number","title":"Minx","description":"West longitude of box"},"miny":{"type":"number","title":"Miny","description":"South latitude of box"},"maxx":{"type":"number","title":"Maxx","description":"East longitude of box"},"maxy":{"type":"number","title":"Maxy","description":"North latitude of box"}},"type":"object","required":["minx","miny","maxx","maxy"],"title":"BoxPrompt","description":"Box coordinates for area-based segmentation."},"BoxSegmentationRequest":{"properties":{"bbox":{"$ref":"#/components/schemas/BoundingBoxCoords","description":"Bounding box for imagery fetch"},"box_prompt":{"$ref":"#/components/schemas/BoxPrompt","description":"Box within which to segment"},"model_type":{"$ref":"#/components/schemas/SAMModelType","default":"vit_b"},"zoom_level":{"type":"integer","maximum":21.0,"minimum":15.0,"title":"Zoom Level","default":18},"imagery_source":{"type":"string","title":"Imagery Source","default":"Satellite"}},"type":"object","required":["bbox","box_prompt"],"title":"BoxSegmentationRequest","description":"Request for box-based segmentation."},"BuildingApprovalsResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the request was successful"},"sa2_code":{"type":"string","title":"Sa2 Code","description":"9-digit SA2 code"},"new_approvals":{"anyOf":[{"$ref":"#/components/schemas/DwellingApprovalsByType"},{"type":"null"}],"description":"New dwelling approvals by type"},"alterations":{"anyOf":[{"$ref":"#/components/schemas/AlterationsData"},{"type":"null"}],"description":"Alteration approvals"},"demolitions":{"anyOf":[{"$ref":"#/components/schemas/DemolitionsData"},{"type":"null"}],"description":"Demolition data"},"net_new_dwellings":{"type":"integer","title":"Net New Dwellings","description":"Net new dwellings","default":0},"dwelling_mix":{"anyOf":[{"$ref":"#/components/schemas/DwellingMix"},{"type":"null"}],"description":"Dwelling type percentages"},"source":{"type":"string","title":"Source","description":"Data source","default":"ABS Building Approvals (BA_SA2)"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note","description":"Additional notes about the data"},"timestamp":{"type":"string","title":"Timestamp","description":"Response timestamp ISO format"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if unsuccessful"}},"type":"object","required":["success","sa2_code","timestamp"],"title":"BuildingApprovalsResponse","description":"Response model for dwelling approvals by SA2."},"BuildingApprovalsServiceStatus":{"properties":{"available":{"type":"boolean","title":"Available","description":"Whether service is available"},"abs_api_reachable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Abs Api Reachable","description":"ABS API connectivity"},"cache_stats":{"anyOf":[{"$ref":"#/components/schemas/schemas__building_approvals_schemas__CacheStats"},{"type":"null"}],"description":"Cache statistics"},"supported_dataflows":{"items":{"type":"string"},"type":"array","title":"Supported Dataflows","description":"Supported ABS dataflows","default":["BA_SA2"]},"victoria_sa2_count":{"type":"integer","title":"Victoria Sa2 Count","description":"Approximate number of SA2s in Victoria","default":479},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if unavailable"}},"type":"object","required":["available"],"title":"BuildingApprovalsServiceStatus","description":"Status of the Building Approvals service."},"BuildingApprovalsTrendResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the request was successful"},"sa2_code":{"type":"string","title":"Sa2 Code","description":"9-digit SA2 code"},"trend_analysis":{"anyOf":[{"$ref":"#/components/schemas/TrendAnalysis"},{"type":"null"}],"description":"12-month rolling trend"},"market_heat":{"anyOf":[{"$ref":"#/components/schemas/MarketHeatIndicator"},{"type":"null"}],"description":"Hot market indicator"},"activity_score":{"anyOf":[{"$ref":"#/components/schemas/ActivityScore"},{"type":"null"}],"description":"Development activity score"},"dwelling_mix":{"anyOf":[{"$ref":"#/components/schemas/DwellingMix"},{"type":"null"}],"description":"Dwelling type percentages"},"market_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market Type","description":"Market type classification"},"source":{"type":"string","title":"Source","description":"Data source","default":"ABS Building Approvals (BA_SA2)"},"timestamp":{"type":"string","title":"Timestamp","description":"Response timestamp ISO format"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if unsuccessful"}},"type":"object","required":["success","sa2_code","timestamp"],"title":"BuildingApprovalsTrendResponse","description":"Response model for trend analysis endpoint."},"BuildingPrototype":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"development_type_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Development Type Id"},"gross_floor_area":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Gross Floor Area"},"site_area":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Site Area"},"building_height":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Building Height"},"num_storeys":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Num Storeys"},"num_units":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Num Units"},"unit_types":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Unit Types"},"parking_spaces":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Parking Spaces"},"water_demand":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Water Demand"},"wastewater_generation":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Wastewater Generation"},"stormwater_runoff":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Stormwater Runoff"},"site_coverage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Site Coverage"},"avg_unit_size_sqm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Unit Size Sqm"},"pct_residential":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pct Residential"},"pct_retail":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pct Retail"},"pct_office":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pct Office"},"pct_industrial":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pct Industrial"},"construction_cost_sqm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Construction Cost Sqm"},"id":{"type":"integer","title":"Id"},"is_active":{"type":"boolean","title":"Is Active","default":true},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["code","name","id","created_at"],"title":"BuildingPrototype"},"BuildingPrototypeCreate":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"development_type_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Development Type Id"},"gross_floor_area":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Gross Floor Area"},"site_area":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Site Area"},"building_height":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Building Height"},"num_storeys":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Num Storeys"},"num_units":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Num Units"},"unit_types":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Unit Types"},"parking_spaces":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Parking Spaces"},"water_demand":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Water Demand"},"wastewater_generation":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Wastewater Generation"},"stormwater_runoff":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Stormwater Runoff"},"site_coverage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Site Coverage"},"avg_unit_size_sqm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Unit Size Sqm"},"pct_residential":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pct Residential"},"pct_retail":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pct Retail"},"pct_office":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pct Office"},"pct_industrial":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pct Industrial"},"construction_cost_sqm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Construction Cost Sqm"}},"type":"object","required":["code","name"],"title":"BuildingPrototypeCreate"},"BuildingPrototypeUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"development_type_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Development Type Id"},"gross_floor_area":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Gross Floor Area"},"site_area":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Site Area"},"building_height":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Building Height"},"num_storeys":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Num Storeys"},"num_units":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Num Units"},"unit_types":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Unit Types"},"parking_spaces":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Parking Spaces"},"water_demand":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Water Demand"},"wastewater_generation":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Wastewater Generation"},"stormwater_runoff":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Stormwater Runoff"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"BuildingPrototypeUpdate"},"BuildingsCacheStats":{"properties":{"tile_count":{"type":"integer","title":"Tile Count","description":"Number of cached tiles"},"total_size_mb":{"type":"number","title":"Total Size Mb","description":"Total cache size in MB"},"oldest_tile_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Oldest Tile Date","description":"Date of oldest cached tile"},"newest_tile_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Newest Tile Date","description":"Date of newest cached tile"},"cache_directory":{"type":"string","title":"Cache Directory","description":"Path to cache directory"}},"type":"object","required":["tile_count","total_size_mb","cache_directory"],"title":"BuildingsCacheStats","description":"Statistics about the buildings cache."},"BuildingsCountResponse":{"properties":{"count":{"type":"integer","title":"Count","description":"Number of buildings in bounding box"},"bbox":{"items":{"type":"number"},"type":"array","title":"Bbox","description":"Bounding box queried"},"cached":{"type":"boolean","title":"Cached","description":"Whether count was from cache"}},"type":"object","required":["count","bbox","cached"],"title":"BuildingsCountResponse","description":"Response for building count endpoint."},"BuildingsErrorResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"error":{"type":"string","title":"Error","description":"Error message"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code","description":"Error code"},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details","description":"Additional details"}},"type":"object","required":["error"],"title":"BuildingsErrorResponse","description":"Error response for buildings API."},"BuildingsMetadata":{"properties":{"total_count":{"type":"integer","title":"Total Count","description":"Total number of buildings returned"},"bbox":{"items":{"type":"number"},"type":"array","title":"Bbox","description":"Bounding box [minx, miny, maxx, maxy]"},"quadkeys_fetched":{"items":{"type":"string"},"type":"array","title":"Quadkeys Fetched","description":"List of quad keys that were fetched"},"cached":{"type":"boolean","title":"Cached","description":"Whether data was served from cache"},"fetch_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fetch Time Ms","description":"Time taken to fetch data in milliseconds"},"truncated":{"type":"boolean","title":"Truncated","description":"Whether results were truncated due to max_buildings limit","default":false}},"type":"object","required":["total_count","bbox","cached"],"title":"BuildingsMetadata","description":"Metadata about the buildings response."},"BuildingsResponse":{"properties":{"type":{"type":"string","title":"Type","default":"FeatureCollection"},"features":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Features","description":"Array of GeoJSON building features"},"metadata":{"$ref":"#/components/schemas/BuildingsMetadata"}},"type":"object","required":["metadata"],"title":"BuildingsResponse","description":"GeoJSON FeatureCollection response with buildings."},"BulkRankRequest":{"properties":{"parcels":{"additionalProperties":true,"type":"object","title":"Parcels","description":"GeoJSON FeatureCollection of candidate parcels"},"dev_type":{"type":"string","title":"Dev Type","description":"Target development type (e.g. RES_LOW, COM_OFF)","default":"RES_MED"},"weights":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Weights","description":"Per-criterion weights; defaults if absent"},"context":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Context","description":"Pre-fetched constraint layers keyed by name"}},"type":"object","required":["parcels"],"title":"BulkRankRequest"},"CacheStatsResponse":{"properties":{"cache_dir":{"type":"string","title":"Cache Dir"},"file_count":{"type":"integer","title":"File Count"},"total_size_mb":{"type":"number","title":"Total Size Mb"},"memory_cache_items":{"type":"integer","title":"Memory Cache Items"}},"type":"object","required":["cache_dir","file_count","total_size_mb","memory_cache_items"],"title":"CacheStatsResponse","description":"Cache statistics response."},"CadastralConversationCreate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"scenario_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scenario Id"}},"type":"object","title":"CadastralConversationCreate"},"CadastralQueryRequest":{"properties":{"message":{"type":"string","title":"Message","description":"Natural-language question."},"conversation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Conversation Id","description":"Conversation to continue. Omit to auto-create one."},"scenario_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scenario Id","description":"Optional Scenario context."},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model","description":"Optional OpenRouter model id override. Defaults to $CADASTRAL_AGENT_MODEL or anthropic/claude-sonnet-4.6."}},"type":"object","required":["message"],"title":"CadastralQueryRequest"},"CadastralQueryResponse":{"properties":{"answer":{"type":"string","title":"Answer"},"conversation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Conversation Id"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"tool_calls":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Tool Calls"},"tool_results":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Tool Results"},"map_payloads":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Map Payloads","default":[]},"map_payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Map Payload"},"turn_id":{"type":"integer","title":"Turn Id"},"assistant_message_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Assistant Message Id"}},"type":"object","required":["answer","conversation_id","model","tool_calls","tool_results","turn_id"],"title":"CadastralQueryResponse"},"CategoriesResponse":{"properties":{"categories":{"items":{"$ref":"#/components/schemas/CategoryConfig"},"type":"array","title":"Categories"}},"type":"object","required":["categories"],"title":"CategoriesResponse","description":"List of available amenity categories."},"CategoryAccessibilityInput":{"properties":{"geometry":{"additionalProperties":true,"type":"object","title":"Geometry","description":"GeoJSON geometry"},"category":{"type":"string","title":"Category","description":"Amenity category (grocery, restaurants, etc.)"},"max_distance":{"type":"integer","maximum":5000.0,"minimum":100.0,"title":"Max Distance","description":"Maximum search distance in meters","default":1600}},"type":"object","required":["geometry","category"],"title":"CategoryAccessibilityInput","description":"Input for detailed category accessibility."},"CategoryConfig":{"properties":{"name":{"type":"string","title":"Name"},"weight":{"type":"number","title":"Weight","description":"Category weight in Walk Score calculation"},"max_distance":{"type":"integer","title":"Max Distance","description":"Maximum search distance in meters"},"osm_tags":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object","title":"Osm Tags","description":"OSM tag mappings"}},"type":"object","required":["name","weight","max_distance","osm_tags"],"title":"CategoryConfig","description":"Configuration for an amenity category."},"CategorySplits":{"properties":{"public_transport":{"$ref":"#/components/schemas/ModeSplitDetail","description":"Train, bus, ferry, tram combined"},"private_vehicle":{"$ref":"#/components/schemas/ModeSplitDetail","description":"Car driver/passenger, truck, motorbike"},"active_transport":{"$ref":"#/components/schemas/ModeSplitDetail","description":"Bicycle and walking"},"work_from_home":{"$ref":"#/components/schemas/ModeSplitDetail","description":"Worked at home"},"taxi_rideshare":{"$ref":"#/components/schemas/ModeSplitDetail","description":"Taxi and ride-share services"},"other":{"$ref":"#/components/schemas/ModeSplitDetail","description":"Other transport modes"}},"type":"object","required":["public_transport","private_vehicle","active_transport","work_from_home","taxi_rideshare","other"],"title":"CategorySplits","description":"Aggregated mode splits by category."},"CensusServiceStatus":{"properties":{"available":{"type":"boolean","title":"Available","description":"Whether the ABS API is reachable"},"last_check":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Check","description":"ISO timestamp of last availability check"},"cached":{"type":"boolean","title":"Cached","description":"Whether this status was from cache","default":false},"response_time_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Response Time Ms","description":"API response time in milliseconds"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if unavailable"},"cache_stats":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Cache Stats","description":"Cache statistics"},"available_boundary_types":{"anyOf":[{"items":{"$ref":"#/components/schemas/BoundaryTypeInfo"},"type":"array"},{"type":"null"}],"title":"Available Boundary Types","description":"List of available boundary types"}},"type":"object","required":["available"],"title":"CensusServiceStatus","description":"Status of the Census service."},"CenterPoint":{"properties":{"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"}},"type":"object","required":["lat","lon"],"title":"CenterPoint","description":"Center point coordinates."},"ChatContext":{"properties":{"scenario_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scenario Id"},"scenario_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scenario Name"},"total_population":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Population"},"total_dwellings":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Dwellings"},"total_employment":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Employment"},"total_area_ha":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Area Ha"},"analysis_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Analysis Type"},"analysis_results":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Analysis Results"},"guide_section":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Guide Section"},"guide_markdown":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Guide Markdown"}},"type":"object","title":"ChatContext","description":"Context to include with chat messages."},"ChatMessage":{"properties":{"role":{"$ref":"#/components/schemas/MessageRole"},"content":{"type":"string","title":"Content"},"timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Timestamp"}},"type":"object","required":["role","content"],"title":"ChatMessage","description":"A single chat message."},"ChatRequest":{"properties":{"message":{"type":"string","maxLength":10000,"minLength":1,"title":"Message","description":"User's message"},"context":{"anyOf":[{"$ref":"#/components/schemas/ChatContext"},{"type":"null"}],"description":"Optional context for the conversation"},"history":{"anyOf":[{"items":{"$ref":"#/components/schemas/ChatMessage"},"type":"array"},{"type":"null"}],"title":"History","description":"Previous messages for multi-turn conversation"},"use_cache":{"type":"boolean","title":"Use Cache","description":"Whether to use cached responses","default":true}},"type":"object","required":["message"],"title":"ChatRequest","description":"Request for AI chat endpoint."},"ChatResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message","default":""},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"model":{"type":"string","title":"Model","default":""},"provider":{"type":"string","title":"Provider","default":""},"cached":{"type":"boolean","title":"Cached","default":false},"usage":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Usage"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"}},"type":"object","required":["success"],"title":"ChatResponse","description":"Response from AI chat endpoint."},"Choices":{"properties":{"weights":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Weights"},"uptake":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Uptake"},"total_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Total Kind"},"total":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total"},"exclude_review":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Exclude Review"},"locks":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Locks"},"excluded":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Excluded"}},"type":"object","title":"Choices"},"ClaimRequest":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"ClaimRequest"},"ClearCacheResult":{"properties":{"success":{"type":"boolean","title":"Success"},"files_removed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Files Removed"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["success"],"title":"ClearCacheResult","description":"Cache clearing result."},"Comment":{"properties":{"content":{"type":"string","title":"Content"},"location":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Location"},"author_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Name"},"id":{"type":"integer","title":"Id"},"scenario_id":{"type":"integer","title":"Scenario Id"},"parent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Id"},"author_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Author Id"},"is_resolved":{"type":"boolean","title":"Is Resolved","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["content","id","scenario_id","created_at"],"title":"Comment"},"CommentCreate":{"properties":{"content":{"type":"string","title":"Content"},"location":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Location"},"author_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Name"},"scenario_id":{"type":"integer","title":"Scenario Id"},"parent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Id"}},"type":"object","required":["content","scenario_id"],"title":"CommentCreate"},"CommentUpdate":{"properties":{"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"is_resolved":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Resolved"}},"type":"object","title":"CommentUpdate"},"CommentWithReplies":{"properties":{"content":{"type":"string","title":"Content"},"location":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Location"},"author_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Name"},"id":{"type":"integer","title":"Id"},"scenario_id":{"type":"integer","title":"Scenario Id"},"parent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Id"},"author_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Author Id"},"is_resolved":{"type":"boolean","title":"Is Resolved","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"replies":{"items":{"$ref":"#/components/schemas/CommentWithReplies"},"type":"array","title":"Replies","default":[]}},"type":"object","required":["content","id","scenario_id","created_at"],"title":"CommentWithReplies","description":"Comment with nested replies."},"CommercialValuationRequest":{"properties":{"zone_code":{"type":"string","title":"Zone Code","description":"Planning zone code (e.g., 'C1Z', 'C2Z', 'ACZ')"},"gfa_sqm":{"type":"number","title":"Gfa Sqm","description":"Gross floor area in square meters"},"land_area_sqm":{"type":"number","title":"Land Area Sqm","description":"Land area in square meters"},"property_type":{"type":"string","title":"Property Type","description":"Property type: retail, office, hotel","default":"retail"},"location_ring":{"type":"string","title":"Location Ring","description":"Location ring: cbd, inner, middle, outer","default":"middle"},"quality":{"type":"string","title":"Quality","description":"Quality level for the property type","default":"standard_fitout"}},"type":"object","required":["zone_code","gfa_sqm","land_area_sqm"],"title":"CommercialValuationRequest","description":"Request for commercial property valuation."},"CompositeScoreSchema":{"properties":{"name":{"type":"string","title":"Name"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score"},"breakdown":{"items":{"$ref":"#/components/schemas/ScoreBreakdownSchema"},"type":"array","title":"Breakdown"},"rating":{"type":"string","title":"Rating","default":""},"coverage":{"type":"string","title":"Coverage","default":""},"source":{"type":"string","title":"Source","default":""}},"type":"object","required":["name"],"title":"CompositeScoreSchema"},"ConversationCreate":{"properties":{"scenario_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scenario Id","description":"Link to a scenario"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"Conversation title"}},"type":"object","title":"ConversationCreate"},"CreateKeyRequest":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"Friendly name for this key"},"tier":{"type":"string","title":"Tier","description":"Access tier: free (100/hr) or standard (1000/hr)","default":"free"}},"type":"object","required":["name"],"title":"CreateKeyRequest"},"CreateKeyResponse":{"properties":{"key":{"type":"string","title":"Key"},"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"tier":{"type":"string","title":"Tier"},"rate_limit":{"type":"integer","title":"Rate Limit"},"message":{"type":"string","title":"Message","default":"Save this key — it will not be shown again."}},"type":"object","required":["key","id","name","key_prefix","tier","rate_limit"],"title":"CreateKeyResponse"},"CreateWebhookRequest":{"properties":{"url":{"type":"string","title":"Url","description":"HTTPS endpoint URL to receive webhook payloads"},"events":{"items":{"type":"string"},"type":"array","title":"Events","description":"Events to subscribe to: scenario.created, scenario.updated, scenario.deleted, paint.updated, analysis.completed, analysis.failed"},"description":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Description"}},"type":"object","required":["url","events"],"title":"CreateWebhookRequest"},"CrsChoice":{"properties":{"source_srs":{"type":"string","title":"Source Srs"},"heights":{"type":"string","title":"Heights","default":"file"}},"type":"object","required":["source_srs"],"title":"CrsChoice"},"DemographicsRequest":{"properties":{"minx":{"type":"number","title":"Minx","description":"Minimum longitude"},"miny":{"type":"number","title":"Miny","description":"Minimum latitude"},"maxx":{"type":"number","title":"Maxx","description":"Maximum longitude"},"maxy":{"type":"number","title":"Maxy","description":"Maximum latitude"},"boundary_type":{"type":"string","title":"Boundary Type","description":"Boundary level for aggregation: sa1 or sa2","default":"sa2"}},"type":"object","required":["minx","miny","maxx","maxy"],"title":"DemographicsRequest","description":"Request for demographics within a bounding box."},"DemographicsResponse":{"properties":{"boundary_type":{"type":"string","title":"Boundary Type"},"boundary_name":{"type":"string","title":"Boundary Name"},"bbox":{"items":{"type":"number"},"type":"array","title":"Bbox"},"area_count":{"type":"integer","title":"Area Count"},"areas":{"items":{"$ref":"#/components/schemas/AreaInfo"},"type":"array","title":"Areas"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"timestamp":{"type":"string","title":"Timestamp"}},"type":"object","required":["boundary_type","boundary_name","bbox","area_count","areas","timestamp"],"title":"DemographicsResponse","description":"Response containing demographic information for an area."},"DemolitionsData":{"properties":{"dwelling_demolitions":{"type":"integer","title":"Dwelling Demolitions","description":"Number of dwelling demolitions","default":0}},"type":"object","title":"DemolitionsData","description":"Demolition data."},"DesignRequest":{"properties":{"ifd":{"additionalProperties":true,"type":"object","title":"Ifd"},"aep_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Aep Pct"},"council":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Council"},"overrides":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Overrides"},"edits":{"anyOf":[{"additionalProperties":{"additionalProperties":true,"type":"object"},"type":"object"},{"type":"null"}],"title":"Edits"}},"type":"object","required":["ifd"],"title":"DesignRequest"},"DetailedAccessibilityResult":{"properties":{"success":{"type":"boolean","title":"Success"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"total_found":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Found","description":"Total POIs found within distance"},"pois":{"items":{"$ref":"#/components/schemas/POIDetail"},"type":"array","title":"Pois","description":"List of POIs with distances"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["success"],"title":"DetailedAccessibilityResult","description":"Detailed accessibility for a specific category."},"DevelopmentFeasibilityRequest":{"properties":{"current_land_value":{"type":"number","title":"Current Land Value","description":"Current land value in AUD"},"current_improvement_value":{"type":"number","title":"Current Improvement Value","description":"Current improvement value in AUD"},"parcel_sqm":{"type":"number","title":"Parcel Sqm","description":"Parcel area in square meters"},"target_development_type":{"type":"string","title":"Target Development Type","description":"Target development type: residential_rental, residential_owner, retail, office, industrial, hotel"},"appreciation_rate":{"type":"number","title":"Appreciation Rate","description":"Assumed annual appreciation rate (default 3%)","default":0.03}},"type":"object","required":["current_land_value","current_improvement_value","parcel_sqm","target_development_type"],"title":"DevelopmentFeasibilityRequest","description":"Request for development feasibility analysis."},"DevelopmentSuggestion":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"justification":{"type":"string","title":"Justification"},"suitability_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Suitability Score"}},"type":"object","required":["code","name","justification"],"title":"DevelopmentSuggestion","description":"A single development type suggestion."},"DevelopmentSuggestionRequest":{"properties":{"parcel_area_ha":{"type":"number","exclusiveMinimum":0.0,"title":"Parcel Area Ha","description":"Parcel area in hectares"},"location_context":{"type":"string","title":"Location Context","description":"Location context (CBD, activity_centre, suburban, greenfield)","default":"suburban"},"current_use":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Use","description":"Current land use"},"zoning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zoning","description":"Current zoning"},"transit_access":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transit Access","description":"Transit access level (high, moderate, low)","default":"moderate"},"neighboring_uses":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Neighboring Uses","description":"Neighboring land uses"}},"type":"object","required":["parcel_area_ha"],"title":"DevelopmentSuggestionRequest","description":"Request for development type suggestions."},"DevelopmentSuggestionResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"suggestions":{"items":{"$ref":"#/components/schemas/DevelopmentSuggestion"},"type":"array","title":"Suggestions","default":[]},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"model":{"type":"string","title":"Model","default":""},"provider":{"type":"string","title":"Provider","default":""}},"type":"object","required":["success"],"title":"DevelopmentSuggestionResponse","description":"Response from development suggestion."},"DevelopmentType":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"category":{"type":"string","title":"Category"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"dwelling_density":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Dwelling Density"},"population_density":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Population Density"},"employment_density":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Employment Density"},"floor_space_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Floor Space Ratio"},"building_height":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Building Height"},"land_cost_per_ha":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Land Cost Per Ha"},"construction_cost_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Construction Cost Per M2"},"rental_yield":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rental Yield"},"sale_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sale Price Per M2"},"trip_generation_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Trip Generation Rate"},"mode_split":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Mode Split"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"redevelopment_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Redevelopment Rate"},"street_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Street Percent"},"park_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Park Percent"},"civic_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Civic Percent"},"building_mix":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Building Mix"},"id":{"type":"integer","title":"Id"},"is_active":{"type":"boolean","title":"Is Active","default":true},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["code","name","category","id","created_at"],"title":"DevelopmentType"},"DevelopmentTypeCreate":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"category":{"type":"string","title":"Category"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"dwelling_density":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Dwelling Density"},"population_density":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Population Density"},"employment_density":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Employment Density"},"floor_space_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Floor Space Ratio"},"building_height":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Building Height"},"land_cost_per_ha":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Land Cost Per Ha"},"construction_cost_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Construction Cost Per M2"},"rental_yield":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rental Yield"},"sale_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sale Price Per M2"},"trip_generation_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Trip Generation Rate"},"mode_split":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Mode Split"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"redevelopment_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Redevelopment Rate"},"street_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Street Percent"},"park_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Park Percent"},"civic_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Civic Percent"},"building_mix":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Building Mix"}},"type":"object","required":["code","name","category"],"title":"DevelopmentTypeCreate"},"DevelopmentTypeUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"dwelling_density":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Dwelling Density"},"population_density":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Population Density"},"employment_density":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Employment Density"},"floor_space_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Floor Space Ratio"},"building_height":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Building Height"},"land_cost_per_ha":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Land Cost Per Ha"},"construction_cost_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Construction Cost Per M2"},"rental_yield":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rental Yield"},"sale_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sale Price Per M2"},"trip_generation_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Trip Generation Rate"},"mode_split":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Mode Split"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"DevelopmentTypeUpdate"},"DwellingApprovalsByType":{"properties":{"houses":{"type":"integer","title":"Houses","description":"Detached houses approved","default":0},"semi_detached":{"type":"integer","title":"Semi Detached","description":"Townhouses/semi-detached total","default":0},"semi_detached_1_storey":{"type":"integer","title":"Semi Detached 1 Storey","description":"1-storey semi-detached","default":0},"semi_detached_2_storey":{"type":"integer","title":"Semi Detached 2 Storey","description":"2+ storey semi-detached","default":0},"apartments_total":{"type":"integer","title":"Apartments Total","description":"Total apartments approved","default":0},"apartments_low_rise":{"type":"integer","title":"Apartments Low Rise","description":"1-3 storey apartments","default":0},"apartments_mid_rise":{"type":"integer","title":"Apartments Mid Rise","description":"4-8 storey apartments","default":0},"apartments_high_rise":{"type":"integer","title":"Apartments High Rise","description":"9+ storey apartments","default":0},"other_residential":{"type":"integer","title":"Other Residential","description":"Other residential types","default":0},"total_residential":{"type":"integer","title":"Total Residential","description":"Total residential approvals","default":0}},"type":"object","title":"DwellingApprovalsByType","description":"Dwelling approvals breakdown by building type."},"DwellingDemandAnalysis":{"properties":{"projected_dwelling_demand":{"type":"integer","title":"Projected Dwelling Demand","description":"Total projected dwelling demand to 2036"},"proposed_dwellings":{"type":"integer","title":"Proposed Dwellings","description":"Dwellings proposed in scenario"},"demand_met_pct":{"type":"number","title":"Demand Met Pct","description":"Percentage of demand met by proposal"},"dwelling_gap":{"type":"integer","title":"Dwelling Gap","description":"Gap: positive=undersupply, negative=oversupply"},"demand_rating":{"type":"string","title":"Demand Rating","description":"Rating: Exceeds demand, Meets demand, Below demand"},"alignment_message":{"type":"string","title":"Alignment Message","description":"Human-readable alignment summary"}},"type":"object","required":["projected_dwelling_demand","proposed_dwellings","demand_met_pct","dwelling_gap","demand_rating","alignment_message"],"title":"DwellingDemandAnalysis","description":"Dwelling demand vs proposed supply analysis."},"DwellingMix":{"properties":{"houses_pct":{"type":"number","title":"Houses Pct","description":"Houses percentage of total","default":0.0},"semi_detached_pct":{"type":"number","title":"Semi Detached Pct","description":"Semi-detached/townhouse percentage","default":0.0},"apartments_pct":{"type":"number","title":"Apartments Pct","description":"Apartments percentage of total","default":0.0}},"type":"object","title":"DwellingMix","description":"Percentage breakdown of dwelling types."},"DwellingStockProfile":{"properties":{"by_structure":{"additionalProperties":{"$ref":"#/components/schemas/DwellingStructureItem"},"type":"object","title":"By Structure","description":"Breakdown by structure type","default":{}},"by_bedrooms":{"additionalProperties":{"$ref":"#/components/schemas/DwellingStructureItem"},"type":"object","title":"By Bedrooms","description":"Breakdown by bedroom count","default":{}},"total_dwellings":{"type":"integer","title":"Total Dwellings","description":"Total dwellings","default":0}},"type":"object","title":"DwellingStockProfile","description":"Dwelling stock breakdown by structure and bedrooms."},"DwellingStructureItem":{"properties":{"count":{"type":"integer","title":"Count","description":"Number of dwellings"},"percentage":{"type":"number","title":"Percentage","description":"Percentage of total"}},"type":"object","required":["count","percentage"],"title":"DwellingStructureItem","description":"Single dwelling structure category."},"DwellingStructureResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the query was successful"},"sa2_code":{"type":"string","title":"Sa2 Code","description":"SA2 region code"},"dwelling_stock":{"anyOf":[{"$ref":"#/components/schemas/DwellingStockProfile"},{"type":"null"}],"description":"Dwelling stock profile"},"source":{"type":"string","title":"Source","description":"Data source","default":"ABS Census 2021 G41"},"timestamp":{"type":"string","title":"Timestamp","description":"Query timestamp"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if unsuccessful"}},"type":"object","required":["success","sa2_code","timestamp"],"title":"DwellingStructureResponse","description":"Response for Dwelling Structure by Bedrooms (G41) data."},"EmploymentContextResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the query was successful"},"sa2_code":{"type":"string","title":"Sa2 Code","description":"SA2 region code"},"sa2_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sa2 Name","description":"SA2 region name"},"industry_mix":{"anyOf":[{"$ref":"#/components/schemas/IndustryMixResponse"},{"type":"null"}],"description":"Industry of Employment (G51) data"},"occupation_distribution":{"anyOf":[{"$ref":"#/components/schemas/OccupationDistributionResponse"},{"type":"null"}],"description":"Occupation (G57) data"},"qualifications":{"anyOf":[{"$ref":"#/components/schemas/QualificationsResponse"},{"type":"null"}],"description":"Highest Qualification (G43) data"},"labour_force":{"anyOf":[{"$ref":"#/components/schemas/LabourForceResponse"},{"type":"null"}],"description":"Labour Force Status (G46) data"},"employment_indicators":{"anyOf":[{"$ref":"#/components/schemas/EmploymentIndicators"},{"type":"null"}],"description":"Calculated employment indicators"},"data_source":{"type":"string","title":"Data Source","description":"Data source","default":"ABS Census 2021"},"tables_used":{"items":{"type":"string"},"type":"array","title":"Tables Used","description":"Census tables used","default":["G43","G46","G51","G57"]},"timestamp":{"type":"string","title":"Timestamp","description":"Query timestamp"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if unsuccessful"}},"type":"object","required":["success","sa2_code","timestamp"],"title":"EmploymentContextResponse","description":"Comprehensive employment context for an SA2."},"EmploymentIndicators":{"properties":{"sector_diversity_index":{"anyOf":[{"$ref":"#/components/schemas/SectorDiversityIndex"},{"type":"null"}],"description":"Sector diversity based on Shannon entropy"},"knowledge_worker_percentage":{"anyOf":[{"$ref":"#/components/schemas/KnowledgeWorkerIndicator"},{"type":"null"}],"description":"Knowledge worker indicator"},"labour_force_participation":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Labour Force Participation","description":"Labour force participation rate"},"unemployment_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Unemployment Rate","description":"Unemployment rate"},"tertiary_qualified_percentage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Tertiary Qualified Percentage","description":"Percentage with bachelor degree or higher"}},"type":"object","title":"EmploymentIndicators","description":"Combined employment indicators for an SA2."},"EmploymentServiceStatus":{"properties":{"available":{"type":"boolean","title":"Available","description":"Whether the service is operational"},"cache_stats":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Cache Stats","description":"Cache statistics"},"supported_dataflows":{"items":{"type":"string"},"type":"array","title":"Supported Dataflows","description":"Supported ABS dataflows","default":["C21_G43_SA2","C21_G46_SA2","C21_G51_SA2","C21_G57_SA2"]},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if unavailable"}},"type":"object","required":["available"],"title":"EmploymentServiceStatus","description":"Status of the Census Employment service."},"ExistingConditionsRequest":{"properties":{"geometry":{"$ref":"#/components/schemas/routers__vicmap__GeometryInput","description":"GeoJSON geometry of painted area"},"avg_household_size":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Household Size","description":"Average household size for population estimation","default":2.5}},"type":"object","required":["geometry"],"title":"ExistingConditionsRequest","description":"Request for existing conditions analysis."},"ExportRequest":{"properties":{"scenario_id":{"type":"integer","title":"Scenario Id"},"layer":{"type":"string","title":"Layer","default":"parcels"},"crs":{"type":"string","title":"Crs","default":"EPSG:4326"},"rule_audit":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Rule Audit"},"scores":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Scores"}},"type":"object","required":["scenario_id"],"title":"ExportRequest"},"FeedbackCreate":{"properties":{"message_id":{"type":"integer","title":"Message Id","description":"agent_messages.id being rated."},"rating":{"type":"integer","enum":[-1,1],"title":"Rating","description":"1 = thumbs up (good), -1 = thumbs down (bad)."},"comment":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Comment","description":"Optional free-text reason. Only rendered to admins; never echoed back to other users."}},"type":"object","required":["message_id","rating"],"title":"FeedbackCreate","description":"User-submitted thumbs-up / thumbs-down on an assistant message."},"FeedbackRecentRow":{"properties":{"id":{"type":"integer","title":"Id"},"message_id":{"type":"integer","title":"Message Id"},"conversation_id":{"type":"integer","title":"Conversation Id"},"user_id":{"type":"integer","title":"User Id"},"rating":{"type":"integer","title":"Rating"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"user_question":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Question"},"assistant_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assistant Answer"}},"type":"object","required":["id","message_id","conversation_id","user_id","rating","comment","created_at","user_question","assistant_answer"],"title":"FeedbackRecentRow","description":"Single row in the admin curation feed."},"FeedbackResponse":{"properties":{"id":{"type":"integer","title":"Id"},"message_id":{"type":"integer","title":"Message Id"},"rating":{"type":"integer","title":"Rating"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated":{"type":"boolean","title":"Updated","description":"True when an existing thumb was replaced; False when this was the user's first rating of the message."}},"type":"object","required":["id","message_id","rating","comment","created_at","updated"],"title":"FeedbackResponse","description":"Returned after a successful POST /feedback."},"FillScenarioSiteRequest":{"properties":{"site":{"type":"string","title":"Site"},"types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Types"},"max_buildings":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Buildings"},"counts":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Counts"},"use_my_houses":{"type":"boolean","title":"Use My Houses","default":false},"fence_style":{"type":"string","title":"Fence Style","default":"paling"},"front_fence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Front Fence"},"dress_streets":{"type":"boolean","title":"Dress Streets","default":true}},"type":"object","required":["site"],"title":"FillScenarioSiteRequest"},"FillSiteRequest":{"properties":{"dev_type":{"type":"string","title":"Dev Type"},"geometry":{"additionalProperties":true,"type":"object","title":"Geometry"},"vacant_acres":{"type":"number","title":"Vacant Acres","default":0},"developed_acres":{"type":"number","title":"Developed Acres","default":0},"elements":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Elements","default":[]},"buildings":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Buildings","default":[]},"types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Types"},"counts":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Counts"},"library_houses":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Library Houses","default":[]},"fence_style":{"type":"string","title":"Fence Style","default":"paling"},"front_fence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Front Fence"},"front_setback_extra_m":{"type":"number","title":"Front Setback Extra M","default":0.0}},"type":"object","required":["dev_type","geometry"],"title":"FillSiteRequest"},"FrequencyBreakdown":{"properties":{"train":{"type":"number","title":"Train","description":"Train services per hour","default":0},"tram":{"type":"number","title":"Tram","description":"Tram services per hour","default":0},"bus":{"type":"number","title":"Bus","description":"Bus services per hour","default":0}},"type":"object","title":"FrequencyBreakdown","description":"Frequency breakdown by route type."},"FullReportRequest":{"properties":{"scenario_id":{"type":"integer","title":"Scenario Id"},"include_sections":{"items":{"$ref":"#/components/schemas/ReportSectionType"},"type":"array","title":"Include Sections","default":["executive_summary","findings","recommendations"]},"audience":{"$ref":"#/components/schemas/AudienceType","default":"technical"},"analysis_results":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Analysis Results"}},"type":"object","required":["scenario_id"],"title":"FullReportRequest","description":"Request for full AI-generated report."},"FullReportResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"sections":{"additionalProperties":{"type":"string"},"type":"object","title":"Sections","default":{}},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"model":{"type":"string","title":"Model","default":""},"provider":{"type":"string","title":"Provider","default":""}},"type":"object","required":["success"],"title":"FullReportResponse","description":"Response from full report generation."},"GTFSRoute":{"properties":{"route_id":{"type":"string","title":"Route Id","description":"Unique route identifier"},"route_short_name":{"type":"string","title":"Route Short Name","description":"Short route name (e.g., '96', 'Hurstbridge')"},"route_long_name":{"type":"string","title":"Route Long Name","description":"Full route name"},"route_type":{"type":"integer","title":"Route Type","description":"Route type code"},"route_type_name":{"type":"string","title":"Route Type Name","description":"Route type name (Train, Tram, Bus)"},"route_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Route Color","description":"Route color hex code"}},"type":"object","required":["route_id","route_short_name","route_long_name","route_type","route_type_name"],"title":"GTFSRoute","description":"Represents a GTFS route."},"GTFSServiceStatus":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether service is operational"},"gtfs_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gtfs Version","description":"GTFS data version date"},"last_updated":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Updated","description":"Last download timestamp"},"data_freshness_days":{"type":"integer","title":"Data Freshness Days","description":"Days since last update","default":0},"stops_count":{"type":"integer","title":"Stops Count","description":"Number of stops loaded","default":0},"routes_count":{"type":"integer","title":"Routes Count","description":"Number of routes loaded","default":0},"frequency_cache_built":{"type":"boolean","title":"Frequency Cache Built","description":"Whether frequency cache is built","default":false},"source":{"type":"string","title":"Source","description":"Data source name","default":"PTV GTFS"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if failed"}},"type":"object","required":["success"],"title":"GTFSServiceStatus","description":"GTFS service status and data freshness."},"GTFSStop":{"properties":{"stop_id":{"type":"string","title":"Stop Id","description":"Unique stop identifier"},"stop_name":{"type":"string","title":"Stop Name","description":"Stop name"},"stop_lat":{"type":"number","title":"Stop Lat","description":"Stop latitude"},"stop_lon":{"type":"number","title":"Stop Lon","description":"Stop longitude"},"route_type":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Route Type","description":"Primary route type (0=Tram, 2=Rail, 3=Bus)"},"route_type_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Route Type Name","description":"Route type name"},"wheelchair_boarding":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Wheelchair Boarding","description":"Wheelchair accessibility (0=unknown, 1=yes, 2=no)","default":0},"distance_m":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Distance M","description":"Distance from query point in meters"},"routes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Routes","description":"Route IDs serving this stop"}},"type":"object","required":["stop_id","stop_name","stop_lat","stop_lon"],"title":"GTFSStop","description":"Represents a GTFS stop/station."},"GenerateParcelsRequest":{"properties":{"buildings":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Buildings","description":"Optional building features (GeoJSON). If omitted, painted_areas on the scenario are used."}},"type":"object","title":"GenerateParcelsRequest","description":"Caller may either reuse buildings already painted on the scenario\n(default) or supply an explicit FeatureCollection of building footprints."},"GenerateParcelsResponse":{"properties":{"parcels":{"additionalProperties":true,"type":"object","title":"Parcels","description":"GeoJSON FeatureCollection of generated parcels with merged VicMap + building attributes."},"parcel_count":{"type":"integer","title":"Parcel Count"},"matched_buildings":{"type":"integer","title":"Matched Buildings"},"unmatched_buildings":{"type":"integer","title":"Unmatched Buildings"},"extent_geometry":{"additionalProperties":true,"type":"object","title":"Extent Geometry"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"}},"type":"object","required":["parcels","parcel_count","matched_buildings","unmatched_buildings","extent_geometry"],"title":"GenerateParcelsResponse","description":"Returns the generated parcels as a GeoJSON FeatureCollection so the\nfrontend can drop them straight into the Parcel Layer (PSP) slot."},"GrowthMetrics":{"properties":{"base_year":{"type":"integer","title":"Base Year","description":"Year growth is measured from (2026)"},"current_population":{"type":"integer","title":"Current Population","description":"Base year population"},"projected_population_2031":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Projected Population 2031","description":"Projected population 2031"},"projected_population_2036":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Projected Population 2036","description":"Projected population 2036"},"population_change":{"type":"integer","title":"Population Change","description":"Absolute population change (base year to 2036)"},"population_change_pct":{"type":"number","title":"Population Change Pct","description":"Percentage population change"},"annual_growth_rate":{"type":"number","title":"Annual Growth Rate","description":"Compound annual growth rate (%)"},"growth_classification":{"type":"string","title":"Growth Classification","description":"Growth category: Very High, High, Moderate, Low, Declining"},"current_households":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current Households","description":"Base year households"},"projected_households_2036":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Projected Households 2036","description":"Projected households 2036"},"household_change":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Household Change","description":"Absolute household change"},"current_dwellings":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current Dwellings","description":"Base year dwellings"},"projected_dwellings_2036":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Projected Dwellings 2036","description":"Projected dwellings 2036"},"dwelling_demand":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Dwelling Demand","description":"Additional dwellings required"},"dwelling_demand_annual":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Dwelling Demand Annual","description":"Dwellings needed per year"},"avg_household_size_current":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Household Size Current","description":"Current persons per household"},"avg_household_size_2036":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Household Size 2036","description":"Projected persons per household 2036"}},"type":"object","required":["base_year","current_population","population_change","population_change_pct","annual_growth_rate","growth_classification"],"title":"GrowthMetrics","description":"Calculated growth metrics for an area."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HeritageInGeometryRequest":{"properties":{"geometry":{"$ref":"#/components/schemas/routers__heritage__GeometryInput","description":"GeoJSON geometry of search area"},"max_results":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":1.0},{"type":"null"}],"title":"Max Results","description":"Maximum number of results","default":100}},"type":"object","required":["geometry"],"title":"HeritageInGeometryRequest","description":"Request for heritage places within a geometry."},"HeritageNearRequest":{"properties":{"latitude":{"type":"number","title":"Latitude","description":"Latitude of center point"},"longitude":{"type":"number","title":"Longitude","description":"Longitude of center point"},"radius_km":{"anyOf":[{"type":"number","maximum":5.0,"minimum":0.1},{"type":"null"}],"title":"Radius Km","description":"Search radius in kilometers (0.1-5.0)","default":1.0},"max_results":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":1.0},{"type":"null"}],"title":"Max Results","description":"Maximum number of results","default":50}},"type":"object","required":["latitude","longitude"],"title":"HeritageNearRequest","description":"Request for heritage places near a point."},"HouseholdIncomeResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the query was successful"},"sa2_code":{"type":"string","title":"Sa2 Code","description":"SA2 region code"},"median_weekly_income":{"type":"integer","title":"Median Weekly Income","description":"Estimated median weekly income","default":0},"median_annual_income":{"type":"integer","title":"Median Annual Income","description":"Estimated median annual income","default":0},"total_households":{"type":"integer","title":"Total Households","description":"Total households with stated income","default":0},"income_distribution":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/IncomeDistributionItem"},"type":"object"},{"type":"null"}],"title":"Income Distribution","description":"Income distribution by bracket"},"low_income_households":{"type":"integer","title":"Low Income Households","description":"Households with income <$650/week","default":0},"low_income_rate":{"type":"number","title":"Low Income Rate","description":"Percentage of low income households","default":0},"source":{"type":"string","title":"Source","description":"Data source","default":"ABS Census 2021 G33"},"timestamp":{"type":"string","title":"Timestamp","description":"Query timestamp"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if unsuccessful"}},"type":"object","required":["success","sa2_code","timestamp"],"title":"HouseholdIncomeResponse","description":"Response for Household Income (G33) data."},"HousingMarketContextResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the query was successful"},"sa2_code":{"type":"string","title":"Sa2 Code","description":"SA2 region code"},"household_income":{"anyOf":[{"$ref":"#/components/schemas/HouseholdIncomeResponse"},{"type":"null"}],"description":"Income data"},"tenure_mix":{"anyOf":[{"$ref":"#/components/schemas/TenureMixResponse"},{"type":"null"}],"description":"Tenure mix data"},"mortgage":{"anyOf":[{"$ref":"#/components/schemas/MortgageRepaymentResponse"},{"type":"null"}],"description":"Mortgage data"},"rent":{"anyOf":[{"$ref":"#/components/schemas/RentPaymentResponse"},{"type":"null"}],"description":"Rent data"},"dwelling_structure":{"anyOf":[{"$ref":"#/components/schemas/DwellingStructureResponse"},{"type":"null"}],"description":"Dwelling data"},"housing_stress":{"anyOf":[{"$ref":"#/components/schemas/HousingStressMetrics"},{"type":"null"}],"description":"Housing stress analysis"},"affordability_index":{"anyOf":[{"$ref":"#/components/schemas/AffordabilityIndex"},{"type":"null"}],"description":"Affordability metrics"},"source":{"type":"string","title":"Source","description":"Data sources","default":"ABS Census 2021 G33/G37/G38/G40/G41"},"timestamp":{"type":"string","title":"Timestamp","description":"Query timestamp"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if unsuccessful"}},"type":"object","required":["success","sa2_code","timestamp"],"title":"HousingMarketContextResponse","description":"Comprehensive housing market context for an SA2."},"HousingServiceStatus":{"properties":{"available":{"type":"boolean","title":"Available","description":"Whether the service is operational"},"cache_stats":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Cache Stats","description":"Cache statistics"},"supported_dataflows":{"items":{"type":"string"},"type":"array","title":"Supported Dataflows","description":"Supported ABS dataflows","default":["C21_G33_SA2","C21_G37_SA2","C21_G38_SA2","C21_G40_SA2","C21_G41_SA2"]},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if unavailable"}},"type":"object","required":["available"],"title":"HousingServiceStatus","description":"Status of the Census Housing service."},"HousingStressMetrics":{"properties":{"rental_stress_rate":{"type":"number","title":"Rental Stress Rate","description":"% renters paying >30% income","default":0},"mortgage_stress_rate":{"type":"number","title":"Mortgage Stress Rate","description":"% mortgagees paying >30% income","default":0},"overall_stress_rate":{"type":"number","title":"Overall Stress Rate","description":"Overall housing stress rate","default":0},"rental_stress_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rental Stress Count","description":"Number of stressed renters"},"mortgage_stress_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Mortgage Stress Count","description":"Number of stressed mortgagees"},"total_renters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Renters","description":"Total renters"},"total_mortgagees":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Mortgagees","description":"Total mortgagees"},"income_threshold_weekly":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Income Threshold Weekly","description":"30% income threshold (weekly)"},"income_threshold_monthly":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Income Threshold Monthly","description":"30% income threshold (monthly)"},"methodology":{"type":"string","title":"Methodology","description":"Stress calculation methodology","default":"30% of gross household income threshold"}},"type":"object","title":"HousingStressMetrics","description":"Housing stress analysis metrics."},"IfdUpload":{"properties":{"csv":{"type":"string","title":"Csv"},"lon":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lon"},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"}},"type":"object","required":["csv"],"title":"IfdUpload"},"IncomeDistributionItem":{"properties":{"count":{"type":"integer","title":"Count","description":"Number of households in this bracket"},"percentage":{"type":"number","title":"Percentage","description":"Percentage of total households"}},"type":"object","required":["count","percentage"],"title":"IncomeDistributionItem","description":"Single income bracket in distribution."},"IndicatorExplanationRequest":{"properties":{"indicators":{"additionalProperties":true,"type":"object","title":"Indicators","description":"Dictionary of indicator names and values"},"audience":{"$ref":"#/components/schemas/AudienceType","description":"Target audience for explanation","default":"technical"}},"type":"object","required":["indicators"],"title":"IndicatorExplanationRequest","description":"Request for indicator explanation."},"IndicatorExplanationResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"explanation":{"type":"string","title":"Explanation","default":""},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"audience":{"type":"string","title":"Audience","default":""},"model":{"type":"string","title":"Model","default":""},"provider":{"type":"string","title":"Provider","default":""},"cached":{"type":"boolean","title":"Cached","default":false}},"type":"object","required":["success"],"title":"IndicatorExplanationResponse","description":"Response from indicator explanation."},"IndustrialValuationRequest":{"properties":{"zone_code":{"type":"string","title":"Zone Code","description":"Industrial zone code (e.g., 'IN1Z', 'IN2Z', 'IN3Z')"},"building_footprint_sqm":{"type":"number","title":"Building Footprint Sqm","description":"Building footprint in square meters"},"land_area_sqm":{"type":"number","title":"Land Area Sqm","description":"Land area in square meters"},"suburb":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suburb","description":"Suburb for submarket determination"},"building_type":{"type":"string","title":"Building Type","description":"Building type: warehouse_basic, warehouse_standard, warehouse_high_clearance, factory_light, factory_heavy, logistics_automated, cold_storage","default":"warehouse_standard"}},"type":"object","required":["zone_code","building_footprint_sqm","land_area_sqm"],"title":"IndustrialValuationRequest","description":"Request for industrial property valuation."},"IndustryItem":{"properties":{"code":{"type":"string","title":"Code","description":"ANZSIC industry code (A-S)"},"name":{"type":"string","title":"Name","description":"Industry name"},"count":{"type":"integer","title":"Count","description":"Number of workers in this industry"},"percentage":{"type":"number","title":"Percentage","description":"Percentage of total employed"}},"type":"object","required":["code","name","count","percentage"],"title":"IndustryItem","description":"Single industry in the mix."},"IndustryMixResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the query was successful"},"sa2_code":{"type":"string","title":"Sa2 Code","description":"SA2 region code"},"top_industries":{"items":{"$ref":"#/components/schemas/IndustryItem"},"type":"array","title":"Top Industries","description":"Top 5 industries by employment","default":[]},"all_industries":{"additionalProperties":{"$ref":"#/components/schemas/IndustryItem"},"type":"object","title":"All Industries","description":"All 19 ANZSIC industry divisions","default":{}},"total_employed":{"type":"integer","title":"Total Employed","description":"Total employed persons","default":0},"source":{"type":"string","title":"Source","description":"Data source","default":"ABS Census 2021 G51"},"timestamp":{"type":"string","title":"Timestamp","description":"Query timestamp"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if unsuccessful"}},"type":"object","required":["success","sa2_code","timestamp"],"title":"IndustryMixResponse","description":"Response for Industry of Employment (G51) data."},"IsochronePolygon":{"properties":{"travel_time_minutes":{"type":"integer","title":"Travel Time Minutes"},"geometry":{"additionalProperties":true,"type":"object","title":"Geometry"},"area_sqm":{"type":"number","title":"Area Sqm"},"area_sqkm":{"type":"number","title":"Area Sqkm"},"node_count":{"type":"integer","title":"Node Count"},"edge_count":{"type":"integer","title":"Edge Count"}},"type":"object","required":["travel_time_minutes","geometry","area_sqm","area_sqkm","node_count","edge_count"],"title":"IsochronePolygon","description":"Single isochrone polygon."},"IsochroneRequest":{"properties":{"lat":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Lat","description":"Center latitude"},"lon":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Lon","description":"Center longitude"},"travel_times":{"items":{"type":"integer"},"type":"array","maxItems":6,"minItems":1,"title":"Travel Times","description":"Travel times in minutes","default":[5,10,15,20]},"network_type":{"type":"string","title":"Network Type","description":"Network type: walk, bike, or drive","default":"walk"}},"type":"object","required":["lat","lon"],"title":"IsochroneRequest","description":"Request for isochrone generation."},"IsochroneResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"center":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Center"},"network_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Network Type"},"walk_speed_kmh":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Walk Speed Kmh"},"isochrones":{"items":{"$ref":"#/components/schemas/IsochronePolygon"},"type":"array","title":"Isochrones","default":[]},"processing_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Processing Time Ms"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["success"],"title":"IsochroneResponse","description":"Response for isochrone generation."},"KnowledgeWorkerIndicator":{"properties":{"value":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Value","description":"Knowledge worker percentage"},"count":{"type":"integer","title":"Count","description":"Number of knowledge workers","default":0},"total_employed":{"type":"integer","title":"Total Employed","description":"Total employed for calculation","default":0},"rating":{"type":"string","title":"Rating","description":"Rating (Low, Below Average, Average, Above Average, High, Very High)"},"interpretation":{"type":"string","title":"Interpretation","description":"Human-readable interpretation"}},"type":"object","required":["value","rating","interpretation"],"title":"KnowledgeWorkerIndicator","description":"Knowledge worker percentage indicator."},"LGAProjectionResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the request was successful"},"lga_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lga Code","description":"LGA code"},"lga_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lga Name","description":"LGA name"},"growth_metrics":{"anyOf":[{"$ref":"#/components/schemas/GrowthMetrics"},{"type":"null"}],"description":"Calculated growth metrics"},"projection_timeline":{"anyOf":[{"items":{"$ref":"#/components/schemas/PopulationDataPoint"},"type":"array"},{"type":"null"}],"title":"Projection Timeline","description":"Year-by-year projections"},"source":{"type":"string","title":"Source","description":"Data source identifier","default":"VIF2023"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if unsuccessful"}},"type":"object","required":["success"],"title":"LGAProjectionResponse","description":"LGA level projection response."},"LabourForceItem":{"properties":{"name":{"type":"string","title":"Name","description":"Labour force status name"},"count":{"type":"integer","title":"Count","description":"Number of persons in this status"},"percentage":{"type":"number","title":"Percentage","description":"Percentage of total population 15+"}},"type":"object","required":["name","count","percentage"],"title":"LabourForceItem","description":"Single labour force status category."},"LabourForceResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the query was successful"},"sa2_code":{"type":"string","title":"Sa2 Code","description":"SA2 region code"},"labour_force_status":{"additionalProperties":{"$ref":"#/components/schemas/LabourForceItem"},"type":"object","title":"Labour Force Status","description":"Labour force status distribution","default":{}},"total_population_15_plus":{"type":"integer","title":"Total Population 15 Plus","description":"Total population 15+","default":0},"employed_count":{"type":"integer","title":"Employed Count","description":"Total employed","default":0},"unemployed_count":{"type":"integer","title":"Unemployed Count","description":"Total unemployed","default":0},"labour_force_count":{"type":"integer","title":"Labour Force Count","description":"Total in labour force","default":0},"participation_rate":{"type":"number","title":"Participation Rate","description":"Labour force participation rate","default":0},"unemployment_rate":{"type":"number","title":"Unemployment Rate","description":"Unemployment rate","default":0},"source":{"type":"string","title":"Source","description":"Data source","default":"ABS Census 2021 G46"},"timestamp":{"type":"string","title":"Timestamp","description":"Query timestamp"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if unsuccessful"}},"type":"object","required":["success","sa2_code","timestamp"],"title":"LabourForceResponse","description":"Response for Labour Force Status (G46) data."},"LessonCreate":{"properties":{"polarity":{"type":"integer","enum":[-1,1],"title":"Polarity","description":"1 = recommend this approach, -1 = warn against it."},"lesson":{"type":"string","maxLength":280,"title":"Lesson","description":"One-line directive injected verbatim into the prompt."},"trigger_keywords":{"items":{"type":"string"},"type":"array","title":"Trigger Keywords","description":"Lowercase keywords matched (set-overlap) against the user's question. A lesson with no keywords never fires."},"trigger_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trigger Summary","description":"One-line note on what users typically ask."},"source_question":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Question","description":"The original question that taught us this."},"source_tools":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Source Tools","description":"[{name, args}] tool sequence that worked/failed."}},"type":"object","required":["polarity","lesson"],"title":"LessonCreate","description":"Admin-authored lesson. polarity 1 = 'do this', -1 = 'avoid this'."},"LessonResponse":{"properties":{"id":{"type":"integer","title":"Id"},"mode":{"type":"string","title":"Mode"},"polarity":{"type":"integer","title":"Polarity"},"lesson":{"type":"string","title":"Lesson"},"trigger_keywords":{"items":{"type":"string"},"type":"array","title":"Trigger Keywords"},"trigger_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trigger Summary"},"source_question":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Question"},"times_applied":{"type":"integer","title":"Times Applied"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","mode","polarity","lesson","trigger_summary","source_question","times_applied","is_active","created_at"],"title":"LessonResponse","description":"A curated lesson as returned by the admin endpoints."},"LessonUpdate":{"properties":{"polarity":{"anyOf":[{"type":"integer","enum":[-1,1]},{"type":"null"}],"title":"Polarity"},"lesson":{"anyOf":[{"type":"string","maxLength":280},{"type":"null"}],"title":"Lesson"},"trigger_keywords":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Trigger Keywords"},"trigger_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trigger Summary"},"source_question":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Question"},"source_tools":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Source Tools"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"LessonUpdate","description":"Partial update. Any omitted field is left unchanged.\n\nSet `is_active=False` to soft-disable a stale lesson without losing\nits `times_applied` telemetry (plan §6)."},"LibraryItemIn":{"properties":{"model_id":{"type":"string","pattern":"^[0-9a-f]{32}$","title":"Model Id"},"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"kind":{"type":"string","title":"Kind"},"footprint":{"items":{"items":{"type":"number"},"type":"array"},"type":"array","title":"Footprint","description":"Ring of [x, y] metres around the footprint's centroid (x east, y north)"},"area_m2":{"type":"number","maximum":1000000.0,"exclusiveMinimum":0.0,"title":"Area M2"},"height_m":{"anyOf":[{"type":"number","maximum":1000.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Height M"},"storeys":{"anyOf":[{"type":"integer","maximum":200.0,"minimum":1.0},{"type":"null"}],"title":"Storeys"},"thumbnail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail"},"source":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Source"}},"type":"object","required":["model_id","name","kind","footprint","area_m2"],"title":"LibraryItemIn"},"LibraryItemPatch":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Name"},"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"}},"type":"object","title":"LibraryItemPatch"},"LinkedBuilding":{"properties":{"prototype":{"type":"string","title":"Prototype","description":"Building type to count it as (a prototype code)"},"footprint":{"additionalProperties":true,"type":"object","title":"Footprint","description":"GeoJSON Polygon, WGS84"},"storeys":{"type":"integer","maximum":200.0,"minimum":1.0,"title":"Storeys"},"height_m":{"anyOf":[{"type":"number","maximum":600.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Height M"},"dwellings":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Dwellings"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model","description":"Stored 3D model id (/api/design-models)"},"yaw":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Yaw"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"The design file's name"},"tool":{"type":"string","title":"Tool","description":"sketchup, revit, ...","default":"other"},"doc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc","description":"The design file's own id"}},"type":"object","required":["prototype","footprint","storeys"],"title":"LinkedBuilding"},"MarketHeatIndicator":{"properties":{"is_hot_market":{"type":"boolean","title":"Is Hot Market","description":"True if approvals > 2x state average per SA2"},"heat_ratio":{"type":"number","title":"Heat Ratio","description":"Ratio of SA2 approvals to state average"},"heat_level":{"type":"string","title":"Heat Level","description":"Heat level: 'hot', 'warm', 'average', 'cool', 'cold'"},"state_average_approvals":{"type":"integer","title":"State Average Approvals","description":"State average approvals per SA2"},"sa2_approvals":{"type":"integer","title":"Sa2 Approvals","description":"This SA2's total approvals"}},"type":"object","required":["is_hot_market","heat_ratio","heat_level","state_average_approvals","sa2_approvals"],"title":"MarketHeatIndicator","description":"Hot market flagging based on state average comparison."},"MasterPlanScoresRequest":{"properties":{"scenario_id":{"type":"integer","title":"Scenario Id"},"topology_health":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Topology Health"},"rule_compliance":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rule Compliance"}},"type":"object","required":["scenario_id"],"title":"MasterPlanScoresRequest"},"MasterPlanScoresResponse":{"properties":{"green_city":{"$ref":"#/components/schemas/CompositeScoreSchema"},"fifteen_minute_city":{"$ref":"#/components/schemas/CompositeScoreSchema"},"approval_readiness":{"$ref":"#/components/schemas/CompositeScoreSchema"}},"type":"object","required":["green_city","fifteen_minute_city","approval_readiness"],"title":"MasterPlanScoresResponse"},"MeasuresRequest":{"properties":{"building":{"additionalProperties":true,"type":"object","title":"Building","description":"A placed building, as for /layout"},"others":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Others","description":"The site's other buildings: footprint and storeys"},"site":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Site","description":"The site (GeoJSON): existing buildings mostly on it count as cleared"}},"type":"object","required":["building"],"title":"MeasuresRequest"},"MessageResponse":{"properties":{"message":{"type":"string","title":"Message"}},"type":"object","required":["message"],"title":"MessageResponse"},"MessageRole":{"type":"string","enum":["user","assistant","system"],"title":"MessageRole","description":"Chat message roles."},"ModeSplitDetail":{"properties":{"count":{"type":"integer","title":"Count","description":"Number of workers using this mode"},"percentage":{"type":"number","title":"Percentage","description":"Percentage of total workers"}},"type":"object","required":["count","percentage"],"title":"ModeSplitDetail","description":"Detail for a single transport mode."},"MortgageDistributionItem":{"properties":{"count":{"type":"integer","title":"Count","description":"Number of dwellings in this bracket"},"percentage":{"type":"number","title":"Percentage","description":"Percentage of total"}},"type":"object","required":["count","percentage"],"title":"MortgageDistributionItem","description":"Single mortgage bracket in distribution."},"MortgageRepaymentResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the query was successful"},"sa2_code":{"type":"string","title":"Sa2 Code","description":"SA2 region code"},"median_monthly_mortgage":{"type":"integer","title":"Median Monthly Mortgage","description":"Estimated median monthly repayment","default":0},"median_annual_mortgage":{"type":"integer","title":"Median Annual Mortgage","description":"Estimated median annual repayment","default":0},"total_mortgaged_dwellings":{"type":"integer","title":"Total Mortgaged Dwellings","description":"Total dwellings with mortgage","default":0},"mortgage_distribution":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/MortgageDistributionItem"},"type":"object"},{"type":"null"}],"title":"Mortgage Distribution","description":"Mortgage repayment distribution by bracket"},"source":{"type":"string","title":"Source","description":"Data source","default":"ABS Census 2021 G38"},"timestamp":{"type":"string","title":"Timestamp","description":"Query timestamp"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if unsuccessful"}},"type":"object","required":["success","sa2_code","timestamp"],"title":"MortgageRepaymentResponse","description":"Response for Mortgage Repayment (G38) data."},"NearestAmenity":{"properties":{"name":{"type":"string","title":"Name"},"distance_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Distance M"},"walk_time_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Walk Time Min"},"location":{"additionalProperties":{"type":"number"},"type":"object","title":"Location"}},"type":"object","required":["name","location"],"title":"NearestAmenity","description":"Information about nearest amenity."},"NearestAmenityRequest":{"properties":{"lat":{"type":"number","title":"Lat","description":"Latitude of search point"},"lon":{"type":"number","title":"Lon","description":"Longitude of search point"},"category":{"type":"string","title":"Category","description":"Amenity category to search"},"max_distance_meters":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Distance Meters","description":"Maximum search radius in meters","default":3000}},"type":"object","required":["lat","lon","category"],"title":"NearestAmenityRequest","description":"Request for nearest amenity query."},"NearestStationRequest":{"properties":{"lat":{"type":"number","title":"Lat","description":"Latitude of search point"},"lon":{"type":"number","title":"Lon","description":"Longitude of search point"},"max_distance_meters":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Distance Meters","description":"Maximum search radius in meters","default":5000}},"type":"object","required":["lat","lon"],"title":"NearestStationRequest","description":"Request for nearest station query."},"NetworkCacheStats":{"properties":{"cache_dir":{"type":"string","title":"Cache Dir"},"cached_networks":{"type":"integer","title":"Cached Networks"},"cache_size_mb":{"type":"number","title":"Cache Size Mb"},"memory_cached":{"type":"integer","title":"Memory Cached"},"oldest_cache_days":{"type":"integer","title":"Oldest Cache Days"},"newest_cache_days":{"type":"integer","title":"Newest Cache Days"},"cache_ttl_days":{"type":"integer","title":"Cache Ttl Days"}},"type":"object","required":["cache_dir","cached_networks","cache_size_mb","memory_cached","oldest_cache_days","newest_cache_days","cache_ttl_days"],"title":"NetworkCacheStats","description":"Network cache statistics."},"NetworkMetrics":{"properties":{"node_count":{"type":"integer","title":"Node Count","description":"Number of nodes in network"},"edge_count":{"type":"integer","title":"Edge Count","description":"Number of edges in network"},"intersection_count":{"type":"integer","title":"Intersection Count","description":"Number of intersections (degree > 2)"},"dead_end_count":{"type":"integer","title":"Dead End Count","description":"Number of dead ends (degree = 1)"},"intersection_density_per_sqkm":{"type":"number","title":"Intersection Density Per Sqkm","description":"Intersections per km²"},"average_edge_length_m":{"type":"number","title":"Average Edge Length M","description":"Average street segment length"},"total_street_length_km":{"type":"number","title":"Total Street Length Km","description":"Total street length in km"},"street_density_km_per_sqkm":{"type":"number","title":"Street Density Km Per Sqkm","description":"Street km per km²"},"average_node_degree":{"type":"number","title":"Average Node Degree","description":"Average connections per node"},"circuity_avg":{"type":"number","title":"Circuity Avg","description":"Average route circuity (1.0 = direct)"}},"type":"object","required":["node_count","edge_count","intersection_count","dead_end_count","intersection_density_per_sqkm","average_edge_length_m","total_street_length_km","street_density_km_per_sqkm","average_node_degree","circuity_avg"],"title":"NetworkMetrics","description":"Network connectivity metrics."},"NetworkMetricsRequest":{"properties":{"lat":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Lat","description":"Center latitude"},"lon":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Lon","description":"Center longitude"},"radius_m":{"type":"integer","maximum":5000.0,"minimum":100.0,"title":"Radius M","description":"Analysis radius in meters","default":1000}},"type":"object","required":["lat","lon"],"title":"NetworkMetricsRequest","description":"Request for network metrics calculation."},"NetworkMetricsResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"center":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Center"},"radius_m":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Radius M"},"area_sqkm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Area Sqkm"},"metrics":{"anyOf":[{"$ref":"#/components/schemas/NetworkMetrics"},{"type":"null"}]},"processing_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Processing Time Ms"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["success"],"title":"NetworkMetricsResponse","description":"Response for network metrics calculation."},"NetworkServiceStatus":{"properties":{"available":{"type":"boolean","title":"Available"},"osmnx_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Osmnx Version"},"cache_dir":{"type":"string","title":"Cache Dir"},"cached_networks":{"type":"integer","title":"Cached Networks"},"cache_size_mb":{"type":"number","title":"Cache Size Mb"},"walk_speed_kmh":{"type":"number","title":"Walk Speed Kmh"},"memory_cached_networks":{"type":"integer","title":"Memory Cached Networks"}},"type":"object","required":["available","cache_dir","cached_networks","cache_size_mb","walk_speed_kmh","memory_cached_networks"],"title":"NetworkServiceStatus","description":"Network service status information."},"NetworkStats":{"properties":{"nodes":{"type":"integer","title":"Nodes"},"edges":{"type":"integer","title":"Edges"}},"type":"object","required":["nodes","edges"],"title":"NetworkStats","description":"Network statistics."},"NewStudyArea":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"council":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Council"},"geometry":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Geometry"}},"type":"object","title":"NewStudyArea"},"OccupationDistributionResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the query was successful"},"sa2_code":{"type":"string","title":"Sa2 Code","description":"SA2 region code"},"occupations":{"additionalProperties":{"$ref":"#/components/schemas/OccupationItem"},"type":"object","title":"Occupations","description":"All 8 ANZSCO occupation groups","default":{}},"total_employed":{"type":"integer","title":"Total Employed","description":"Total employed persons","default":0},"knowledge_worker_count":{"type":"integer","title":"Knowledge Worker Count","description":"Managers + Professionals count","default":0},"knowledge_worker_percentage":{"type":"number","title":"Knowledge Worker Percentage","description":"Knowledge worker percentage (Groups 1+2)","default":0},"source":{"type":"string","title":"Source","description":"Data source","default":"ABS Census 2021 G57"},"timestamp":{"type":"string","title":"Timestamp","description":"Query timestamp"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if unsuccessful"}},"type":"object","required":["success","sa2_code","timestamp"],"title":"OccupationDistributionResponse","description":"Response for Occupation (G57) data."},"OccupationItem":{"properties":{"code":{"type":"integer","title":"Code","description":"ANZSCO occupation code (1-8)"},"name":{"type":"string","title":"Name","description":"Occupation group name"},"count":{"type":"integer","title":"Count","description":"Number of workers in this occupation"},"percentage":{"type":"number","title":"Percentage","description":"Percentage of total employed"},"is_knowledge_worker":{"type":"boolean","title":"Is Knowledge Worker","description":"Whether this is a knowledge worker occupation"}},"type":"object","required":["code","name","count","percentage","is_knowledge_worker"],"title":"OccupationItem","description":"Single occupation group in the distribution."},"OverlayQueryRequest":{"properties":{"geometry":{"$ref":"#/components/schemas/routers__vicmap__GeometryInput","description":"GeoJSON geometry for spatial query"},"return_geometry":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Return Geometry","description":"Whether to return overlay geometries","default":false}},"type":"object","required":["geometry"],"title":"OverlayQueryRequest","description":"Request for overlay query."},"POIDetail":{"properties":{"name":{"type":"string","title":"Name"},"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"},"distance_m":{"type":"integer","title":"Distance M","description":"Network walking distance in meters"},"walk_time_min":{"type":"number","title":"Walk Time Min","description":"Estimated walking time in minutes"}},"type":"object","required":["name","lat","lon","distance_m","walk_time_min"],"title":"POIDetail","description":"Individual POI with distance information."},"POIQueryRequest":{"properties":{"geometry":{"$ref":"#/components/schemas/routers__vicmap__GeometryInput","description":"GeoJSON geometry for spatial query"},"buffer_meters":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Buffer Meters","description":"Search buffer radius in meters","default":1500},"categories":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Categories","description":"Filter by categories (education, health, shopping, recreation, community)"}},"type":"object","required":["geometry"],"title":"POIQueryRequest","description":"Request for POI query."},"ParcelEdgesRequest":{"properties":{"geometry":{"additionalProperties":true,"type":"object","title":"Geometry","description":"GeoJSON Polygon or MultiPolygon in EPSG:4326."}},"type":"object","required":["geometry"],"title":"ParcelEdgesRequest"},"ParcelQueryRequest":{"properties":{"geometry":{"$ref":"#/components/schemas/routers__vicmap__GeometryInput","description":"GeoJSON geometry for spatial query"},"return_geometry":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Return Geometry","description":"Whether to return parcel geometries","default":false}},"type":"object","required":["geometry"],"title":"ParcelQueryRequest","description":"Request for parcel query."},"ParsedScenarioFeature":{"properties":{"dev_type":{"type":"string","title":"Dev Type","description":"Development type code (e.g., 'RES_MED')"},"dev_type_name":{"type":"string","title":"Dev Type Name","description":"Human-readable development type name"},"area_hectares":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Area Hectares","description":"Requested area in hectares"},"area_sqm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Area Sqm","description":"Requested area in square meters"},"dwellings":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Dwellings","description":"Number of dwellings if specified"},"location_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Text","description":"Extracted location reference"},"raw_description":{"type":"string","title":"Raw Description","description":"Original description fragment"},"suggested_radius_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Suggested Radius M","description":"Calculated radius for circle geometry"},"buildings":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Buildings","description":"Buildings named for the site: building type code -> count"},"building_names":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Building Names","description":"Those building types' names"}},"type":"object","required":["dev_type","dev_type_name","raw_description"],"title":"ParsedScenarioFeature","description":"A single feature parsed from natural language description."},"PasswordChange":{"properties":{"current_password":{"type":"string","title":"Current Password"},"new_password":{"type":"string","maxLength":72,"minLength":8,"title":"New Password"}},"type":"object","required":["current_password","new_password"],"title":"PasswordChange"},"PictureLimit":{"properties":{"limit":{"anyOf":[{"type":"integer","maximum":10000.0,"minimum":0.0},{"type":"null"}],"title":"Limit"}},"type":"object","title":"PictureLimit"},"PlanLabelIn":{"properties":{"at":{"items":{"type":"number"},"type":"array","title":"At"},"text":{"type":"string","title":"Text"}},"type":"object","required":["at","text"],"title":"PlanLabelIn"},"PlanLayerIn":{"properties":{"id":{"type":"string","title":"Id"},"shapes":{"items":{"$ref":"#/components/schemas/PlanShapeIn"},"type":"array","title":"Shapes","default":[]}},"type":"object","required":["id"],"title":"PlanLayerIn"},"PlanShapeIn":{"properties":{"kind":{"type":"string","title":"Kind"},"rings":{"anyOf":[{"items":{"items":{"items":{"type":"number"},"type":"array"},"type":"array"},"type":"array"},{"type":"null"}],"title":"Rings"},"line":{"anyOf":[{"items":{"items":{"type":"number"},"type":"array"},"type":"array"},{"type":"null"}],"title":"Line"},"centre":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Centre"},"r":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"R"},"fill":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fill"},"stroke":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stroke"},"tag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag"},"z":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Z"}},"type":"object","required":["kind"],"title":"PlanShapeIn"},"PlanningConstraintsRequest":{"properties":{"geometry":{"$ref":"#/components/schemas/routers__vicmap__GeometryInput","description":"GeoJSON geometry of area to analyze"},"include_heritage":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Heritage","description":"Include Heritage Victoria database search","default":true}},"type":"object","required":["geometry"],"title":"PlanningConstraintsRequest","description":"Request for comprehensive planning constraints analysis."},"PointPrompt":{"properties":{"x":{"type":"number","title":"X","description":"Longitude of click point"},"y":{"type":"number","title":"Y","description":"Latitude of click point"},"label":{"type":"integer","title":"Label","description":"1 for foreground, 0 for background","default":1}},"type":"object","required":["x","y"],"title":"PointPrompt","description":"Point coordinates for click-to-segment."},"PointSegmentationRequest":{"properties":{"bbox":{"$ref":"#/components/schemas/BoundingBoxCoords","description":"Bounding box for imagery"},"points":{"items":{"$ref":"#/components/schemas/PointPrompt"},"type":"array","maxItems":20,"minItems":1,"title":"Points","description":"List of point prompts (foreground/background)"},"model_type":{"$ref":"#/components/schemas/SAMModelType","description":"SAM model variant to use","default":"vit_b"},"zoom_level":{"type":"integer","maximum":21.0,"minimum":15.0,"title":"Zoom Level","default":18},"imagery_source":{"type":"string","title":"Imagery Source","default":"Satellite"}},"type":"object","required":["bbox","points"],"title":"PointSegmentationRequest","description":"Request for point-based (click-to-segment) segmentation."},"PopulationDataPoint":{"properties":{"year":{"type":"integer","title":"Year","description":"Projection year"},"population":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Population","description":"Total population"},"households":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Households","description":"Total households"},"dwellings":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Dwellings","description":"Total dwellings"}},"type":"object","required":["year"],"title":"PopulationDataPoint","description":"Single year population projection data point."},"PrecinctAuditCreate":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"scenario_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scenario Id"},"payload":{"anyOf":[{"$ref":"#/components/schemas/PrecinctAuditPayload"},{"type":"null"}]}},"type":"object","required":["name"],"title":"PrecinctAuditCreate"},"PrecinctAuditDetail":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"scenario_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scenario Id"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Payload"}},"type":"object","required":["id","name","status","created_at","updated_at"],"title":"PrecinctAuditDetail","description":"Full shape including the panel snapshot."},"PrecinctAuditList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PrecinctAuditSummary"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"PrecinctAuditList"},"PrecinctAuditPayload":{"properties":{"buildings":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Buildings"},"parcels":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Parcels"},"roads":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Roads"},"topology_result":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Topology Result"},"rule_result":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Rule Result"},"scores_result":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Scores Result"},"analysis_layer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Analysis Layer"}},"type":"object","title":"PrecinctAuditPayload"},"PrecinctAuditSummary":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"scenario_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scenario Id"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","status","created_at","updated_at"],"title":"PrecinctAuditSummary","description":"Lightweight shape for the \"My Audits\" picker — no payload."},"PrecinctAuditUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"scenario_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scenario Id"},"status":{"anyOf":[{"type":"string","pattern":"^(draft|published|archived)$"},{"type":"null"}],"title":"Status"},"payload":{"anyOf":[{"$ref":"#/components/schemas/PrecinctAuditPayload"},{"type":"null"}]},"change_summary":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Change Summary"}},"type":"object","title":"PrecinctAuditUpdate","description":"All fields optional so callers can patch slices (e.g. just payload)."},"PrecinctAuditVersionDetail":{"properties":{"id":{"type":"integer","title":"Id"},"audit_id":{"type":"integer","title":"Audit Id"},"version_number":{"type":"integer","title":"Version Number"},"parent_version_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Version Id"},"change_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Change Summary"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"payload_snapshot":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Payload Snapshot"}},"type":"object","required":["id","audit_id","version_number","created_at"],"title":"PrecinctAuditVersionDetail","description":"Full version row with the payload snapshot."},"PrecinctAuditVersionList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PrecinctAuditVersionSummary"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"PrecinctAuditVersionList"},"PrecinctAuditVersionSummary":{"properties":{"id":{"type":"integer","title":"Id"},"audit_id":{"type":"integer","title":"Audit Id"},"version_number":{"type":"integer","title":"Version Number"},"parent_version_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Version Id"},"change_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Change Summary"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","audit_id","version_number","created_at"],"title":"PrecinctAuditVersionSummary","description":"Lightweight version row — no payload, for the History timeline."},"Project":{"properties":{"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_public":{"type":"boolean","title":"Is Public","default":false},"id":{"type":"integer","title":"Id"},"owner_id":{"type":"integer","title":"Owner Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"owner":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]}},"type":"object","required":["name","id","owner_id","created_at"],"title":"Project"},"ProjectCreate":{"properties":{"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_public":{"type":"boolean","title":"Is Public","default":false}},"type":"object","required":["name"],"title":"ProjectCreate"},"ProjectUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_public":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Public"}},"type":"object","title":"ProjectUpdate"},"ProjectionServiceStatus":{"properties":{"success":{"type":"boolean","title":"Success","description":"Service availability"},"vif_version":{"type":"string","title":"Vif Version","description":"VIF data version","default":"VIF2023"},"sa2_count":{"type":"integer","title":"Sa2 Count","description":"Number of SA2 areas loaded","default":0},"lga_count":{"type":"integer","title":"Lga Count","description":"Number of LGA areas loaded","default":0},"projection_years":{"items":{"type":"integer"},"type":"array","title":"Projection Years","description":"Available projection years"},"source":{"type":"string","title":"Source","description":"Data source","default":"Victorian Department of Transport and Planning"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if service unavailable"}},"type":"object","required":["success"],"title":"ProjectionServiceStatus","description":"VIF projection service status."},"ProviderStatus":{"properties":{"name":{"type":"string","title":"Name"},"available":{"type":"boolean","title":"Available"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"}},"type":"object","required":["name","available"],"title":"ProviderStatus","description":"Status of a single AI provider."},"QualificationItem":{"properties":{"name":{"type":"string","title":"Name","description":"Qualification level name"},"count":{"type":"integer","title":"Count","description":"Number of persons with this qualification"},"percentage":{"type":"number","title":"Percentage","description":"Percentage of total population 15+"}},"type":"object","required":["name","count","percentage"],"title":"QualificationItem","description":"Single qualification level in the distribution."},"QualificationsResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the query was successful"},"sa2_code":{"type":"string","title":"Sa2 Code","description":"SA2 region code"},"qualifications":{"additionalProperties":{"$ref":"#/components/schemas/QualificationItem"},"type":"object","title":"Qualifications","description":"Qualification level distribution","default":{}},"total_population_15_plus":{"type":"integer","title":"Total Population 15 Plus","description":"Total population 15+","default":0},"tertiary_qualified_count":{"type":"integer","title":"Tertiary Qualified Count","description":"Bachelor degree or higher count","default":0},"tertiary_qualified_percentage":{"type":"number","title":"Tertiary Qualified Percentage","description":"Percentage with bachelor degree or higher","default":0},"skilled_workforce_count":{"type":"integer","title":"Skilled Workforce Count","description":"Certificate III or higher count","default":0},"skilled_workforce_percentage":{"type":"number","title":"Skilled Workforce Percentage","description":"Percentage with Certificate III or higher","default":0},"source":{"type":"string","title":"Source","description":"Data source","default":"ABS Census 2021 G43"},"timestamp":{"type":"string","title":"Timestamp","description":"Query timestamp"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if unsuccessful"}},"type":"object","required":["success","sa2_code","timestamp"],"title":"QualificationsResponse","description":"Response for Highest Qualification (G43) data."},"QuickAction":{"properties":{"id":{"type":"string","title":"Id"},"label":{"type":"string","title":"Label"},"prompt":{"type":"string","title":"Prompt"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"category":{"type":"string","title":"Category","default":"general"}},"type":"object","required":["id","label","prompt"],"title":"QuickAction","description":"A predefined quick action for the chat interface."},"QuickActionsResponse":{"properties":{"actions":{"items":{"$ref":"#/components/schemas/QuickAction"},"type":"array","title":"Actions"}},"type":"object","required":["actions"],"title":"QuickActionsResponse","description":"List of available quick actions."},"RateLimitStatus":{"properties":{"allowed":{"type":"boolean","title":"Allowed"},"remaining":{"type":"integer","title":"Remaining"},"reset_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Reset Time"},"limit_per_hour":{"type":"integer","title":"Limit Per Hour"}},"type":"object","required":["allowed","remaining","limit_per_hour"],"title":"RateLimitStatus","description":"Rate limit status for a user."},"RefreshRequest":{"properties":{"max_age_hours":{"type":"integer","title":"Max Age Hours","description":"Only refresh layers older than this (0 = force all)","default":0}},"type":"object","title":"RefreshRequest","description":"Request to force-refresh a layer."},"RenderRequest":{"properties":{"image":{"type":"string","title":"Image","description":"A view from the app, as a data URL"},"kind":{"type":"string","pattern":"^(interior|exterior)$","title":"Kind"}},"type":"object","required":["image","kind"],"title":"RenderRequest"},"RentDistributionItem":{"properties":{"count":{"type":"integer","title":"Count","description":"Number of dwellings in this bracket"},"percentage":{"type":"number","title":"Percentage","description":"Percentage of total"}},"type":"object","required":["count","percentage"],"title":"RentDistributionItem","description":"Single rent bracket in distribution."},"RentPaymentResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the query was successful"},"sa2_code":{"type":"string","title":"Sa2 Code","description":"SA2 region code"},"median_weekly_rent":{"type":"integer","title":"Median Weekly Rent","description":"Estimated median weekly rent","default":0},"median_annual_rent":{"type":"integer","title":"Median Annual Rent","description":"Estimated median annual rent","default":0},"total_rented_dwellings":{"type":"integer","title":"Total Rented Dwellings","description":"Total rented dwellings","default":0},"rent_distribution":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/RentDistributionItem"},"type":"object"},{"type":"null"}],"title":"Rent Distribution","description":"Rent distribution by bracket"},"source":{"type":"string","title":"Source","description":"Data source","default":"ABS Census 2021 G40"},"timestamp":{"type":"string","title":"Timestamp","description":"Query timestamp"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if unsuccessful"}},"type":"object","required":["success","sa2_code","timestamp"],"title":"RentPaymentResponse","description":"Response for Rent (G40) data."},"ReportCreate":{"properties":{"facts":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Facts"}},"type":"object","title":"ReportCreate"},"ReportSectionRequest":{"properties":{"scenario_id":{"type":"integer","title":"Scenario Id"},"section_type":{"$ref":"#/components/schemas/ReportSectionType"},"analysis_results":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Analysis Results"},"audience":{"$ref":"#/components/schemas/AudienceType","default":"technical"}},"type":"object","required":["scenario_id","section_type"],"title":"ReportSectionRequest","description":"Request for report section generation."},"ReportSectionResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"section_type":{"type":"string","title":"Section Type"},"content":{"type":"string","title":"Content","default":""},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"model":{"type":"string","title":"Model","default":""},"provider":{"type":"string","title":"Provider","default":""}},"type":"object","required":["success","section_type"],"title":"ReportSectionResponse","description":"Response from report section generation."},"ReportSectionType":{"type":"string","enum":["executive_summary","methodology","findings","recommendations","conclusion"],"title":"ReportSectionType","description":"Types of report sections."},"ResidentialValuationRequest":{"properties":{"suburb":{"type":"string","title":"Suburb","description":"Suburb name (e.g., 'Richmond')"},"dwelling_type":{"type":"string","title":"Dwelling Type","description":"Type of dwelling: detached_house, townhouse, apartment_low_rise, apartment_mid_rise, apartment_high_rise"},"dwelling_size_sqm":{"type":"number","title":"Dwelling Size Sqm","description":"Internal floor area in square meters"},"land_area_sqm":{"type":"number","title":"Land Area Sqm","description":"Land area in square meters"},"quality":{"type":"string","title":"Quality","description":"Construction quality: budget, standard, quality, premium","default":"standard"},"building_age_years":{"type":"integer","title":"Building Age Years","description":"Age of building in years","default":0}},"type":"object","required":["suburb","dwelling_type","dwelling_size_sqm","land_area_sqm"],"title":"ResidentialValuationRequest","description":"Request for residential property valuation."},"RoleChange":{"properties":{"role":{"type":"string","enum":["admin","planner","viewer"],"title":"Role"}},"type":"object","required":["role"],"title":"RoleChange"},"RollbackRequest":{"properties":{"version_id":{"type":"integer","title":"Version Id"},"created_by_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By Name"}},"type":"object","required":["version_id"],"title":"RollbackRequest","description":"Request to rollback scenario to a specific version."},"RoutesResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether query succeeded"},"routes":{"items":{"$ref":"#/components/schemas/GTFSRoute"},"type":"array","title":"Routes","description":"List of routes"},"count":{"type":"integer","title":"Count","description":"Number of routes returned","default":0},"route_type_filter":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Route Type Filter","description":"Route type filter applied"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if failed"}},"type":"object","required":["success"],"title":"RoutesResponse","description":"Response for routes query."},"RuleAuditRequest":{"properties":{"scenario_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scenario Id"},"parcels":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Parcels"},"buildings":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Buildings"},"roads":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Roads"},"rules_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Rules Config"}},"type":"object","title":"RuleAuditRequest"},"RuleAuditResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/RuleResultSchema"},"type":"array","title":"Results"},"summary":{"additionalProperties":true,"type":"object","title":"Summary"},"compliance_score":{"type":"number","title":"Compliance Score","default":100.0},"compliance_status":{"additionalProperties":true,"type":"object","title":"Compliance Status"}},"type":"object","title":"RuleAuditResponse"},"RuleId":{"type":"string","enum":["height","coverage","setback","land_use_compatibility","road_access","parking_ratio","floor_area_ratio","flood_risk","contaminated_land","road_capacity","school_catchment","utilities_access","native_vegetation"],"title":"RuleId"},"RuleResultSchema":{"properties":{"rule_id":{"$ref":"#/components/schemas/RuleId"},"rule_name":{"type":"string","title":"Rule Name"},"passed":{"type":"boolean","title":"Passed"},"severity":{"$ref":"#/components/schemas/Severity"},"message":{"type":"string","title":"Message"},"feature_ids":{"items":{"type":"string"},"type":"array","title":"Feature Ids"},"expected":{"anyOf":[{},{"type":"null"}],"title":"Expected"},"actual":{"anyOf":[{},{"type":"null"}],"title":"Actual"},"details":{"additionalProperties":true,"type":"object","title":"Details"},"status":{"type":"string","title":"Status","default":"pass"}},"type":"object","required":["rule_id","rule_name","passed","severity","message"],"title":"RuleResultSchema"},"SA2ProjectionResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the request was successful"},"sa2_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sa2 Code","description":"SA2 code (9 digits)"},"sa2_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sa2 Name","description":"SA2 name"},"growth_metrics":{"anyOf":[{"$ref":"#/components/schemas/GrowthMetrics"},{"type":"null"}],"description":"Calculated growth metrics"},"projection_timeline":{"anyOf":[{"items":{"$ref":"#/components/schemas/PopulationDataPoint"},"type":"array"},{"type":"null"}],"title":"Projection Timeline","description":"Year-by-year projections"},"source":{"type":"string","title":"Source","description":"Data source identifier","default":"VIF2023"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if unsuccessful"}},"type":"object","required":["success"],"title":"SA2ProjectionResponse","description":"SA2 level projection response."},"SAMModelType":{"type":"string","enum":["vit_h","vit_l","vit_b","fast"],"title":"SAMModelType","description":"Available SAM model variants."},"SAMServiceStatus":{"properties":{"available":{"type":"boolean","title":"Available","description":"Whether SAM service is available"},"gpu_available":{"type":"boolean","title":"Gpu Available","description":"Whether GPU acceleration is available"},"device":{"type":"string","title":"Device","description":"Current device (cuda/cpu)"},"models_available":{"items":{"type":"string"},"type":"array","title":"Models Available","description":"List of available model types"},"langsam_available":{"type":"boolean","title":"Langsam Available","description":"Whether LangSAM (text) is available"},"text_model":{"type":"string","title":"Text Model","description":"SAM checkpoint used for text prompts (SAM_TEXT_MODEL)","default":"vit_b"},"text_model_loaded":{"type":"boolean","title":"Text Model Loaded","description":"Whether the text model is already in memory","default":false},"cache_directory":{"type":"string","title":"Cache Directory","description":"Cache directory path"},"cache_size_mb":{"type":"number","title":"Cache Size Mb","description":"Current cache size in MB"}},"type":"object","required":["available","gpu_available","device","models_available","langsam_available","cache_directory","cache_size_mb"],"title":"SAMServiceStatus","description":"Overall SAM service status."},"Scenario":{"properties":{"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"delivery_stage":{"type":"string","enum":["feasibility","design","operating"],"title":"Delivery Stage","default":"feasibility"},"id":{"type":"integer","title":"Id"},"project_id":{"type":"integer","title":"Project Id"},"scenario_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Scenario Data"},"indicators":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Indicators"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["name","id","project_id","created_at"],"title":"Scenario"},"ScenarioAnalysisResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"analysis":{"type":"string","title":"Analysis","default":""},"recommendations":{"items":{"type":"string"},"type":"array","title":"Recommendations","default":[]},"concerns":{"items":{"type":"string"},"type":"array","title":"Concerns","default":[]},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"model":{"type":"string","title":"Model","default":""},"provider":{"type":"string","title":"Provider","default":""},"cached":{"type":"boolean","title":"Cached","default":false}},"type":"object","required":["success"],"title":"ScenarioAnalysisResponse","description":"Response from scenario analysis."},"ScenarioCreate":{"properties":{"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"delivery_stage":{"type":"string","enum":["feasibility","design","operating"],"title":"Delivery Stage","default":"feasibility"}},"type":"object","required":["name"],"title":"ScenarioCreate"},"ScenarioParseRequest":{"properties":{"description":{"type":"string","maxLength":2000,"minLength":3,"title":"Description","description":"Natural language scenario description"},"scenario_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scenario Id","description":"Current scenario ID for context"},"map_center":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Map Center","description":"Current map center [lng, lat]"},"picked_dev_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Picked Dev Type","description":"The development type picked in Build, for sites whose words name none"},"existing_features_summary":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Existing Features Summary","description":"Summary of existing painted features for context"}},"type":"object","required":["description"],"title":"ScenarioParseRequest","description":"Request to parse natural language scenario description."},"ScenarioParseResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"features":{"items":{"$ref":"#/components/schemas/ParsedScenarioFeature"},"type":"array","title":"Features","default":[]},"requires_location_input":{"type":"boolean","title":"Requires Location Input","description":"True if user needs to click map to place features","default":false},"interpretation_summary":{"type":"string","title":"Interpretation Summary","description":"Plain language summary of interpretation","default":""},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"model":{"type":"string","title":"Model","default":""},"provider":{"type":"string","title":"Provider","default":""},"cached":{"type":"boolean","title":"Cached","default":false}},"type":"object","required":["success"],"title":"ScenarioParseResponse","description":"Response containing parsed scenario features."},"ScenarioProjectionRequest":{"properties":{"geometry":{"additionalProperties":true,"type":"object","title":"Geometry","description":"GeoJSON geometry (Point or Polygon)"},"proposed_dwellings":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Proposed Dwellings","description":"Number of dwellings proposed in scenario"}},"type":"object","required":["geometry"],"title":"ScenarioProjectionRequest","description":"Request for scenario-based projection context."},"ScenarioProjectionResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the request was successful"},"sa2_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sa2 Code","description":"SA2 code containing the scenario"},"sa2_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sa2 Name","description":"SA2 name"},"growth_metrics":{"anyOf":[{"$ref":"#/components/schemas/GrowthMetrics"},{"type":"null"}],"description":"Calculated growth metrics"},"dwelling_demand":{"anyOf":[{"$ref":"#/components/schemas/DwellingDemandAnalysis"},{"type":"null"}],"description":"Dwelling demand analysis if proposed_dwellings provided"},"projection_timeline":{"anyOf":[{"items":{"$ref":"#/components/schemas/PopulationDataPoint"},"type":"array"},{"type":"null"}],"title":"Projection Timeline","description":"Year-by-year projections"},"source":{"type":"string","title":"Source","description":"Data source identifier","default":"VIF2023"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if unsuccessful"}},"type":"object","required":["success"],"title":"ScenarioProjectionResponse","description":"Projection context for a scenario location."},"ScenarioUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"scenario_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Scenario Data"},"delivery_stage":{"anyOf":[{"type":"string","enum":["feasibility","design","operating"]},{"type":"null"}],"title":"Delivery Stage"}},"type":"object","title":"ScenarioUpdate"},"ScenarioValuationRequest":{"properties":{"suburb":{"type":"string","title":"Suburb","description":"Suburb for price reference"},"lga":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lga","description":"Local Government Area"},"area_sqm":{"type":"number","title":"Area Sqm","description":"Total area in square meters"},"total_dwellings":{"type":"integer","title":"Total Dwellings","description":"Proposed total dwelling count","default":0},"total_employment":{"type":"integer","title":"Total Employment","description":"Proposed total employment","default":0},"commercial_gfa_sqm":{"type":"number","title":"Commercial Gfa Sqm","description":"Proposed commercial GFA","default":0},"industrial_gfa_sqm":{"type":"number","title":"Industrial Gfa Sqm","description":"Proposed industrial GFA","default":0},"existing_dwellings":{"type":"integer","title":"Existing Dwellings","description":"Existing dwelling count","default":0},"existing_employment":{"type":"integer","title":"Existing Employment","description":"Existing employment count","default":0}},"type":"object","required":["suburb","area_sqm"],"title":"ScenarioValuationRequest","description":"Request for scenario-level valuation."},"ScenarioVersion":{"properties":{"change_type":{"type":"string","title":"Change Type"},"change_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Change Description"},"created_by_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By Name"},"id":{"type":"integer","title":"Id"},"scenario_id":{"type":"integer","title":"Scenario Id"},"version_number":{"type":"integer","title":"Version Number"},"scenario_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Scenario Data"},"indicators":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Indicators"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_by_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created By Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["change_type","id","scenario_id","version_number","created_at"],"title":"ScenarioVersion"},"ScenarioVersionSummary":{"properties":{"id":{"type":"integer","title":"Id"},"scenario_id":{"type":"integer","title":"Scenario Id"},"version_number":{"type":"integer","title":"Version Number"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"change_type":{"type":"string","title":"Change Type"},"change_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Change Description"},"created_by_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By Name"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"feature_count":{"type":"integer","title":"Feature Count","default":0}},"type":"object","required":["id","scenario_id","version_number","change_type","created_at"],"title":"ScenarioVersionSummary","description":"Lightweight version info for history list (without full scenario data)."},"SchemeIn":{"properties":{"id":{"type":"string","title":"Id"},"buildings":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Buildings","default":[]},"elements":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Elements","default":[]}},"type":"object","required":["id"],"title":"SchemeIn"},"ScoreBreakdownSchema":{"properties":{"component":{"type":"string","title":"Component"},"weight":{"type":"number","title":"Weight"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score"},"raw_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Raw Value"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"target":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Target"},"measured":{"type":"boolean","title":"Measured","default":true},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"}},"type":"object","required":["component","weight"],"title":"ScoreBreakdownSchema"},"SectorDiversityIndex":{"properties":{"value":{"type":"number","maximum":3.0,"minimum":0.0,"title":"Value","description":"Shannon entropy value"},"max_possible":{"type":"number","title":"Max Possible","description":"Maximum possible value (ln(19))","default":2.94},"normalized":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Normalized","description":"Normalized score (0-1)"},"rating":{"type":"string","title":"Rating","description":"Diversity rating (Low, Moderate, High, Very High)"},"interpretation":{"type":"string","title":"Interpretation","description":"Human-readable interpretation"}},"type":"object","required":["value","normalized","rating","interpretation"],"title":"SectorDiversityIndex","description":"Sector diversity index based on Shannon entropy."},"SegmentationErrorResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"error":{"type":"string","title":"Error","description":"Error message"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code","description":"Error code"},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details","description":"Additional details"}},"type":"object","required":["error"],"title":"SegmentationErrorResponse","description":"Error response for segmentation API."},"SegmentationMetadata":{"properties":{"total_features":{"type":"integer","title":"Total Features","description":"Total number of features detected"},"bbox":{"items":{"type":"number"},"type":"array","title":"Bbox","description":"Bounding box [minx, miny, maxx, maxy]"},"mode":{"$ref":"#/components/schemas/SegmentationMode","description":"Segmentation mode used"},"model_type":{"type":"string","title":"Model Type","description":"SAM model variant used"},"text_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text Prompt","description":"Text prompt if text mode"},"processing_time_ms":{"type":"integer","title":"Processing Time Ms","description":"Processing time in milliseconds"},"imagery_source":{"type":"string","title":"Imagery Source","description":"Imagery source used"},"zoom_level":{"type":"integer","title":"Zoom Level","description":"Zoom level used"},"image_size_pixels":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Image Size Pixels","description":"Image size [width, height]"},"truncated":{"type":"boolean","title":"Truncated","description":"Whether results were truncated","default":false}},"type":"object","required":["total_features","bbox","mode","model_type","processing_time_ms","imagery_source","zoom_level"],"title":"SegmentationMetadata","description":"Metadata about the segmentation response."},"SegmentationMode":{"type":"string","enum":["text","point","box","automatic"],"title":"SegmentationMode","description":"Segmentation mode options."},"SegmentationResponse":{"properties":{"type":{"type":"string","title":"Type","default":"FeatureCollection"},"features":{"items":{"$ref":"#/components/schemas/SegmentedFeature"},"type":"array","title":"Features","description":"Array of GeoJSON segmented features"},"metadata":{"$ref":"#/components/schemas/SegmentationMetadata"}},"type":"object","required":["metadata"],"title":"SegmentationResponse","description":"GeoJSON FeatureCollection response with segmented features."},"SegmentedFeature":{"properties":{"type":{"type":"string","title":"Type","default":"Feature"},"geometry":{"additionalProperties":true,"type":"object","title":"Geometry","description":"GeoJSON Polygon geometry"},"properties":{"$ref":"#/components/schemas/SegmentedFeatureProperties"}},"type":"object","required":["geometry","properties"],"title":"SegmentedFeature","description":"A single segmented feature as GeoJSON Feature."},"SegmentedFeatureProperties":{"properties":{"feature_id":{"type":"string","title":"Feature Id","description":"Unique identifier for the feature"},"confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Confidence","description":"Detection confidence"},"area_sqm":{"type":"number","title":"Area Sqm","description":"Area in square meters"},"area_hectares":{"type":"number","title":"Area Hectares","description":"Area in hectares"},"perimeter_m":{"type":"number","title":"Perimeter M","description":"Perimeter in meters"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label","description":"Detected label (for text prompts)"},"centroid":{"items":{"type":"number"},"type":"array","title":"Centroid","description":"Centroid [lng, lat]"},"source":{"type":"string","title":"Source","description":"Source of detection","default":"sam"}},"type":"object","required":["feature_id","confidence","area_sqm","area_hectares","perimeter_m","centroid"],"title":"SegmentedFeatureProperties","description":"Properties of a segmented feature."},"Severity":{"type":"string","enum":["critical","warning","info"],"title":"Severity"},"SewerRequest":{"properties":{"overrides":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Overrides"},"edits":{"anyOf":[{"additionalProperties":{"additionalProperties":true,"type":"object"},"type":"object"},{"type":"null"}],"title":"Edits"}},"type":"object","title":"SewerRequest"},"ShapefileImportResponse":{"properties":{"scenario":{"additionalProperties":true,"type":"object","title":"Scenario"},"features_imported":{"type":"integer","title":"Features Imported"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"}},"type":"object","required":["scenario","features_imported"],"title":"ShapefileImportResponse"},"ShareLink":{"properties":{"id":{"type":"integer","title":"Id"},"scenario_id":{"type":"integer","title":"Scenario Id"},"token":{"type":"string","title":"Token"},"is_public":{"type":"boolean","title":"Is Public"},"is_active":{"type":"boolean","title":"Is Active"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"view_count":{"type":"integer","title":"View Count"},"last_accessed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Accessed At"},"created_by_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created By Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","scenario_id","token","is_public","is_active","view_count","created_at"],"title":"ShareLink"},"ShareLinkCreate":{"properties":{"is_public":{"type":"boolean","title":"Is Public","default":true},"expires_in_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expires In Days"},"scenario_id":{"type":"integer","title":"Scenario Id"}},"type":"object","required":["scenario_id"],"title":"ShareLinkCreate"},"ShareLinkUpdate":{"properties":{"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"expires_in_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expires In Days"}},"type":"object","title":"ShareLinkUpdate"},"SharedScenarioView":{"properties":{"scenario_id":{"type":"integer","title":"Scenario Id"},"scenario_name":{"type":"string","title":"Scenario Name"},"scenario_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scenario Description"},"project_name":{"type":"string","title":"Project Name"},"scenario_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Scenario Data"},"indicators":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Indicators"},"is_expired":{"type":"boolean","title":"Is Expired","default":false},"share_token":{"type":"string","title":"Share Token"},"analyses":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Analyses","default":[]},"viewer_can_edit":{"type":"boolean","title":"Viewer Can Edit","default":false}},"type":"object","required":["scenario_id","scenario_name","project_name","share_token"],"title":"SharedScenarioView","description":"Read-only view of a shared scenario."},"SheetBrand":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Name"},"contact":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Contact"},"colour":{"anyOf":[{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},{"type":"null"}],"title":"Colour"},"logo":{"anyOf":[{"type":"string","maxLength":400000,"pattern":"^data:image/(png|jpeg);base64,[A-Za-z0-9+/=]+$"},{"type":"null"}],"title":"Logo"},"pictures":{"items":{"type":"string","maxLength":1500000,"pattern":"^data:image/jpeg;base64,[A-Za-z0-9+/=]+$"},"type":"array","maxItems":3,"title":"Pictures"}},"type":"object","title":"SheetBrand"},"SheetCreate":{"properties":{"scenario_id":{"type":"integer","title":"Scenario Id"},"building_id":{"type":"string","maxLength":200,"title":"Building Id"},"title":{"anyOf":[{"type":"string","maxLength":160},{"type":"null"}],"title":"Title"},"brand":{"anyOf":[{"$ref":"#/components/schemas/SheetBrand"},{"type":"null"}]}},"type":"object","required":["scenario_id","building_id"],"title":"SheetCreate"},"SiteDxfRequest":{"properties":{"layers":{"items":{"$ref":"#/components/schemas/PlanLayerIn"},"type":"array","title":"Layers"},"labels":{"items":{"$ref":"#/components/schemas/PlanLabelIn"},"type":"array","title":"Labels","default":[]},"label_height":{"type":"number","maximum":10.0,"exclusiveMinimum":0.0,"title":"Label Height","description":"Text height in metres: a floor plan's are smaller","default":1.0}},"type":"object","required":["layers"],"title":"SiteDxfRequest","description":"utils/sitePlan.ts's layers, with points in lng/lat (GDA2020 ≈ WGS84 at plan accuracy)."},"SiteNumbersRequest":{"properties":{"dev_type":{"type":"string","title":"Dev Type"},"geometry":{"additionalProperties":true,"type":"object","title":"Geometry"},"vacant_acres":{"type":"number","title":"Vacant Acres","default":0},"developed_acres":{"type":"number","title":"Developed Acres","default":0},"schemes":{"items":{"$ref":"#/components/schemas/SchemeIn"},"type":"array","title":"Schemes"}},"type":"object","required":["dev_type","geometry","schemes"],"title":"SiteNumbersRequest"},"SiteOnly":{"properties":{"site":{"items":{"items":{"type":"number"},"type":"array"},"type":"array","title":"Site","description":"The site's outline, [lon, lat] pairs"}},"type":"object","required":["site"],"title":"SiteOnly"},"SpatialLayerBatchRequest":{"properties":{"geometry":{"$ref":"#/components/schemas/routers__vicmap__GeometryInput","description":"GeoJSON geometry to query within"},"return_geometry":{"type":"boolean","title":"Return Geometry","description":"Whether to return feature geometries for map display","default":true},"layer_ids":{"items":{"type":"string"},"type":"array","title":"Layer Ids","description":"Layer IDs to query (empty = all layers)","default":[]}},"type":"object","required":["geometry"],"title":"SpatialLayerBatchRequest","description":"Request for querying multiple Victorian spatial layers."},"SpatialLayerRequest":{"properties":{"geometry":{"$ref":"#/components/schemas/routers__vicmap__GeometryInput","description":"GeoJSON geometry to query within"},"return_geometry":{"type":"boolean","title":"Return Geometry","description":"Whether to return feature geometries for map display","default":true}},"type":"object","required":["geometry"],"title":"SpatialLayerRequest","description":"Request for querying a Victorian spatial layer."},"StopDetailResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether query succeeded"},"stop":{"anyOf":[{"$ref":"#/components/schemas/GTFSStop"},{"type":"null"}],"description":"Stop details"},"frequency":{"anyOf":[{"$ref":"#/components/schemas/StopFrequency"},{"type":"null"}],"description":"Current frequency"},"routes":{"items":{"$ref":"#/components/schemas/GTFSRoute"},"type":"array","title":"Routes","description":"Routes serving this stop"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if failed"}},"type":"object","required":["success"],"title":"StopDetailResponse","description":"Detailed response for a single stop."},"StopFrequency":{"properties":{"stop_id":{"type":"string","title":"Stop Id","description":"Stop identifier"},"stop_name":{"type":"string","title":"Stop Name","description":"Stop name"},"day_type":{"type":"string","title":"Day Type","description":"Day type (weekday, saturday, sunday)"},"time_window":{"type":"string","title":"Time Window","description":"Time window (peak_am, midday, peak_pm, evening, night)"},"frequency_per_hour":{"type":"number","title":"Frequency Per Hour","description":"Services per hour"},"route_count":{"type":"integer","title":"Route Count","description":"Number of routes serving this stop","default":0},"routes":{"items":{"type":"string"},"type":"array","title":"Routes","description":"Route IDs"},"frequency_rating":{"type":"string","title":"Frequency Rating","description":"Rating (Very High, High, Medium, Low, Very Low)"}},"type":"object","required":["stop_id","stop_name","day_type","time_window","frequency_per_hour","frequency_rating"],"title":"StopFrequency","description":"Service frequency at a stop."},"StopsResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether query succeeded"},"stops":{"items":{"$ref":"#/components/schemas/GTFSStop"},"type":"array","title":"Stops","description":"List of stops"},"count":{"type":"integer","title":"Count","description":"Number of stops returned","default":0},"query":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Query","description":"Query parameters used"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if failed"}},"type":"object","required":["success"],"title":"StopsResponse","description":"Response for stops query."},"SustainabilityScore":{"properties":{"score":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Score","description":"Sustainability score (0-100)"},"rating":{"type":"string","title":"Rating","description":"Rating label (Excellent, Good, Moderate, etc.)"},"factors":{"items":{"type":"string"},"type":"array","title":"Factors","description":"Key factors affecting the score","default":[]}},"type":"object","required":["score","rating"],"title":"SustainabilityScore","description":"Transport sustainability score based on mode splits and vehicle ownership."},"TenureMixDetail":{"properties":{"owned_outright":{"$ref":"#/components/schemas/TenureMixItem","description":"Owned outright"},"owned_mortgage":{"$ref":"#/components/schemas/TenureMixItem","description":"Owned with mortgage"},"rented_total":{"$ref":"#/components/schemas/TenureMixItem","description":"Total rented"},"social_housing":{"$ref":"#/components/schemas/TenureMixItem","description":"State housing authority"},"private_rental":{"$ref":"#/components/schemas/TenureMixItem","description":"Private rental market"},"other":{"$ref":"#/components/schemas/TenureMixItem","description":"Other tenure types"},"total_dwellings":{"type":"integer","title":"Total Dwellings","description":"Total dwellings"}},"type":"object","required":["owned_outright","owned_mortgage","rented_total","social_housing","private_rental","other","total_dwellings"],"title":"TenureMixDetail","description":"Detailed tenure mix breakdown."},"TenureMixItem":{"properties":{"count":{"type":"integer","title":"Count","description":"Number of dwellings"},"percentage":{"type":"number","title":"Percentage","description":"Percentage of total"}},"type":"object","required":["count","percentage"],"title":"TenureMixItem","description":"Single tenure type in mix."},"TenureMixResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the query was successful"},"sa2_code":{"type":"string","title":"Sa2 Code","description":"SA2 region code"},"tenure_mix":{"anyOf":[{"$ref":"#/components/schemas/TenureMixDetail"},{"type":"null"}],"description":"Detailed tenure breakdown"},"home_ownership_rate":{"type":"number","title":"Home Ownership Rate","description":"Percentage owning (outright + mortgage)","default":0},"rental_rate":{"type":"number","title":"Rental Rate","description":"Percentage renting","default":0},"social_housing_rate":{"type":"number","title":"Social Housing Rate","description":"Percentage in social housing","default":0},"social_housing_gap":{"type":"number","title":"Social Housing Gap","description":"Gap to 5% target","default":0},"social_housing_target":{"type":"number","title":"Social Housing Target","description":"Social housing target (%)","default":5.0},"source":{"type":"string","title":"Source","description":"Data source","default":"ABS Census 2021 G37"},"timestamp":{"type":"string","title":"Timestamp","description":"Query timestamp"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if unsuccessful"}},"type":"object","required":["success","sa2_code","timestamp"],"title":"TenureMixResponse","description":"Response for Tenure and Landlord Type (G37) data."},"TextSegmentationRequest":{"properties":{"bbox":{"$ref":"#/components/schemas/BoundingBoxCoords","description":"Bounding box for imagery"},"text_prompt":{"type":"string","maxLength":200,"minLength":1,"title":"Text Prompt","description":"Text prompt describing features to detect (e.g., 'building', 'parking lot')"},"box_threshold":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Box Threshold","description":"Detection confidence threshold for bounding boxes","default":0.3},"text_threshold":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Text Threshold","description":"Text similarity threshold","default":0.25},"min_area_sqm":{"type":"number","minimum":0.0,"title":"Min Area Sqm","description":"Minimum area in square meters to include","default":10.0},"max_features":{"type":"integer","maximum":5000.0,"minimum":1.0,"title":"Max Features","description":"Maximum number of features to return","default":500},"zoom_level":{"type":"integer","maximum":21.0,"minimum":15.0,"title":"Zoom Level","description":"Zoom level for imagery fetch (higher = more detail)","default":18},"imagery_source":{"type":"string","title":"Imagery Source","description":"Imagery source: 'Satellite', 'Bing', 'Google', 'ESRI'","default":"Satellite"}},"type":"object","required":["bbox","text_prompt"],"title":"TextSegmentationRequest","description":"Request for text-based segmentation using LangSAM."},"ToScenario":{"properties":{"project_id":{"type":"integer","title":"Project Id"},"lot_ids":{"items":{"type":"string"},"type":"array","title":"Lot Ids"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"type":"object","required":["project_id","lot_ids"],"title":"ToScenario"},"ToggleRequest":{"properties":{"active":{"type":"boolean","title":"Active"}},"type":"object","required":["active"],"title":"ToggleRequest"},"Token":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type"},"must_change_password":{"type":"boolean","title":"Must Change Password","default":false}},"type":"object","required":["access_token","token_type"],"title":"Token"},"TopologyAuditRequest":{"properties":{"scenario_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scenario Id"},"features":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Features"},"sliver_threshold":{"type":"number","title":"Sliver Threshold","default":1.0},"gap_threshold":{"type":"number","title":"Gap Threshold","default":10.0}},"type":"object","title":"TopologyAuditRequest"},"TopologyAuditResponse":{"properties":{"violations":{"items":{"$ref":"#/components/schemas/TopologyViolationSchema"},"type":"array","title":"Violations"},"summary":{"additionalProperties":true,"type":"object","title":"Summary"},"health_score":{"type":"number","title":"Health Score","default":100.0}},"type":"object","title":"TopologyAuditResponse"},"TopologyViolationSchema":{"properties":{"type":{"$ref":"#/components/schemas/ViolationType"},"severity":{"$ref":"#/components/schemas/Severity"},"message":{"type":"string","title":"Message"},"feature_ids":{"items":{"type":"string"},"type":"array","title":"Feature Ids"},"geometry":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Geometry"},"details":{"additionalProperties":true,"type":"object","title":"Details"}},"type":"object","required":["type","severity","message"],"title":"TopologyViolationSchema"},"TransitAccessibility":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether calculation succeeded"},"centroid":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Centroid","description":"Centroid coordinates"},"stops_within_400m":{"type":"integer","title":"Stops Within 400M","description":"Number of stops within 400m (5 min walk)","default":0},"stops_within_800m":{"type":"integer","title":"Stops Within 800M","description":"Number of stops within 800m (10 min walk)","default":0},"train_stations":{"items":{"$ref":"#/components/schemas/GTFSStop"},"type":"array","title":"Train Stations","description":"Nearby train stations"},"tram_stops":{"items":{"$ref":"#/components/schemas/GTFSStop"},"type":"array","title":"Tram Stops","description":"Nearby tram stops"},"bus_stops":{"items":{"$ref":"#/components/schemas/GTFSStop"},"type":"array","title":"Bus Stops","description":"Nearby bus stops"},"peak_frequency":{"type":"number","title":"Peak Frequency","description":"Combined peak hour services per hour","default":0},"off_peak_frequency":{"type":"number","title":"Off Peak Frequency","description":"Combined off-peak services per hour","default":0},"route_diversity":{"type":"integer","title":"Route Diversity","description":"Number of unique routes within 800m","default":0},"transit_score":{"type":"number","title":"Transit Score","description":"Transit score (0-100)","default":0},"transit_rating":{"type":"string","title":"Transit Rating","description":"Rating (Excellent, Good, Moderate, Limited, Minimal)","default":"Minimal"},"frequency_breakdown":{"$ref":"#/components/schemas/FrequencyBreakdown","description":"Frequency breakdown by transit type"},"data_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Data Source","description":"Data source information"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if failed"}},"type":"object","required":["success"],"title":"TransitAccessibility","description":"Comprehensive transit accessibility for a location."},"TransportAnalysisResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"analysis":{"type":"string","title":"Analysis","default":""},"recommendations":{"items":{"type":"string"},"type":"array","title":"Recommendations","default":[]},"concerns":{"items":{"type":"string"},"type":"array","title":"Concerns","default":[]},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"model":{"type":"string","title":"Model","default":""},"provider":{"type":"string","title":"Provider","default":""},"cached":{"type":"boolean","title":"Cached","default":false}},"type":"object","required":["success"],"title":"TransportAnalysisResponse","description":"Response from transport analysis."},"TransportContextResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the query was successful"},"sa2_code":{"type":"string","title":"Sa2 Code","description":"SA2 region code"},"sa2_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sa2 Name","description":"The SA2's name (ABS), e.g. Reservoir - North West"},"travel_to_work":{"anyOf":[{"$ref":"#/components/schemas/TravelToWorkResponse"},{"type":"null"}],"description":"Method of Travel to Work data"},"vehicle_ownership":{"anyOf":[{"$ref":"#/components/schemas/VehicleOwnershipResponse"},{"type":"null"}],"description":"Motor Vehicles per Dwelling data"},"sustainability_score":{"anyOf":[{"$ref":"#/components/schemas/SustainabilityScore"},{"type":"null"}],"description":"Retired: no longer computed"},"source":{"type":"string","title":"Source","description":"Data sources","default":"ABS Census 2021 G62/G34"},"timestamp":{"type":"string","title":"Timestamp","description":"Query timestamp"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if unsuccessful"}},"type":"object","required":["success","sa2_code","timestamp"],"title":"TransportContextResponse","description":"Combined travel and vehicle ownership context for an SA2."},"TransportQueryRequest":{"properties":{"geometry":{"$ref":"#/components/schemas/routers__vicmap__GeometryInput","description":"GeoJSON geometry for spatial query"},"buffer_meters":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Buffer Meters","description":"Search buffer radius in meters","default":2000}},"type":"object","required":["geometry"],"title":"TransportQueryRequest","description":"Request for transport accessibility query."},"TravelServiceStatus":{"properties":{"available":{"type":"boolean","title":"Available","description":"Whether the service is operational"},"cache_stats":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Cache Stats","description":"Cache statistics"},"supported_dataflows":{"items":{"type":"string"},"type":"array","title":"Supported Dataflows","description":"Supported ABS dataflows","default":["C21_G62_SA2","C21_G34_SA2"]},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if unavailable"}},"type":"object","required":["available"],"title":"TravelServiceStatus","description":"Status of the Census Travel service."},"TravelToWorkResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the query was successful"},"sa2_code":{"type":"string","title":"Sa2 Code","description":"SA2 region code"},"mode_splits":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/ModeSplitDetail"},"type":"object"},{"type":"null"}],"title":"Mode Splits","description":"Individual mode percentages"},"category_splits":{"anyOf":[{"$ref":"#/components/schemas/CategorySplits"},{"type":"null"}],"description":"Aggregated category percentages"},"total_workers":{"type":"integer","title":"Total Workers","description":"Total employed persons who travelled to work","default":0},"work_from_home":{"type":"integer","title":"Work From Home","description":"Number who worked from home","default":0},"did_not_go_to_work":{"type":"integer","title":"Did Not Go To Work","description":"Number who did not go to work","default":0},"source":{"type":"string","title":"Source","description":"Data source","default":"ABS Census 2021 G62"},"timestamp":{"type":"string","title":"Timestamp","description":"Query timestamp"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if unsuccessful"}},"type":"object","required":["success","sa2_code","timestamp"],"title":"TravelToWorkResponse","description":"Response for Method of Travel to Work (G62) data."},"TrendAnalysis":{"properties":{"current_12m_total":{"type":"integer","title":"Current 12M Total","description":"Most recent 12-month total approvals"},"previous_12m_total":{"type":"integer","title":"Previous 12M Total","description":"Prior 12-month total approvals"},"change_count":{"type":"integer","title":"Change Count","description":"Absolute change in approvals"},"change_pct":{"type":"number","title":"Change Pct","description":"Percentage change year-over-year"},"trend":{"type":"string","title":"Trend","description":"Trend direction: 'increasing', 'decreasing', or 'stable'"},"confidence":{"type":"string","title":"Confidence","description":"Data quality confidence level","default":"moderate"}},"type":"object","required":["current_12m_total","previous_12m_total","change_count","change_pct","trend"],"title":"TrendAnalysis","description":"12-month rolling trend analysis for building approvals."},"UnitCheckRequest":{"properties":{"rooms":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Rooms","description":"One unit's rooms: name, kind, ring, windows, doors, fixtures (metres)"},"clause":{"type":"string","pattern":"^5[78]$","title":"Clause","description":"57 or 58","default":"58"}},"type":"object","required":["rooms"],"title":"UnitCheckRequest"},"UnitsRequest":{"properties":{"building":{"additionalProperties":true,"type":"object","title":"Building","description":"A placed building: prototype, footprint (GeoJSON, WGS84), storeys, and optionally units {mix, corridor, swaps}"},"with_rooms":{"type":"boolean","title":"With Rooms","description":"Include the rooms (the floor plans); false for the summary only","default":true}},"type":"object","required":["building"],"title":"UnitsRequest"},"UploadStart":{"properties":{"name":{"type":"string","maxLength":255,"title":"Name"},"size":{"type":"integer","title":"Size"},"site":{"items":{"items":{"type":"number"},"type":"array"},"type":"array","title":"Site","description":"The site's outline, [lon, lat] pairs"},"heights":{"type":"string","title":"Heights","default":"file"},"source_srs":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Srs"}},"type":"object","required":["name","size","site"],"title":"UploadStart"},"User":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"username":{"type":"string","title":"Username"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"is_active":{"type":"boolean","title":"Is Active","default":true},"is_superuser":{"type":"boolean","title":"Is Superuser","default":false},"role":{"type":"string","enum":["admin","planner","viewer"],"title":"Role","default":"planner"},"id":{"type":"integer","title":"Id"},"status":{"type":"string","title":"Status","default":"active"},"must_change_password":{"type":"boolean","title":"Must Change Password","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["email","username","id","created_at"],"title":"User"},"UserCreate":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"username":{"type":"string","title":"Username"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"password":{"type":"string","maxLength":72,"minLength":8,"title":"Password"}},"type":"object","required":["email","username","password"],"title":"UserCreate","description":"Self-registration input. Role and privilege flags are not accepted\nhere; they are set server-side and changed only by an admin."},"UserRoleUpdate":{"properties":{"role":{"type":"string","enum":["admin","planner","viewer"],"title":"Role"}},"type":"object","required":["role"],"title":"UserRoleUpdate","description":"Schema for updating user role (admin only)."},"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"},"VegetationQueryRequest":{"properties":{"geometry":{"$ref":"#/components/schemas/routers__vicmap__GeometryInput","description":"GeoJSON geometry for spatial query"},"include_details":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Details","description":"Include individual tree details","default":false}},"type":"object","required":["geometry"],"title":"VegetationQueryRequest","description":"Request for vegetation/tree query."},"VehicleDistribution":{"properties":{"count":{"type":"integer","title":"Count","description":"Number of dwellings"},"percentage":{"type":"number","title":"Percentage","description":"Percentage of total dwellings"}},"type":"object","required":["count","percentage"],"title":"VehicleDistribution","description":"Distribution of motor vehicles per dwelling."},"VehicleOwnershipResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the query was successful"},"sa2_code":{"type":"string","title":"Sa2 Code","description":"SA2 region code"},"vehicle_distribution":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/VehicleDistribution"},"type":"object"},{"type":"null"}],"title":"Vehicle Distribution","description":"Vehicles per dwelling breakdown"},"total_dwellings":{"type":"integer","title":"Total Dwellings","description":"Total private dwellings","default":0},"avg_vehicles_per_dwelling":{"type":"number","title":"Avg Vehicles Per Dwelling","description":"Average vehicles per dwelling","default":0},"zero_vehicle_rate":{"type":"number","title":"Zero Vehicle Rate","description":"Percentage of dwellings with no vehicles","default":0},"source":{"type":"string","title":"Source","description":"Data source","default":"ABS Census 2021 G34"},"timestamp":{"type":"string","title":"Timestamp","description":"Query timestamp"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if unsuccessful"}},"type":"object","required":["success","sa2_code","timestamp"],"title":"VehicleOwnershipResponse","description":"Response for Motor Vehicles per Dwelling (G34) data."},"ViolationType":{"type":"string","enum":["overlap","sliver","gap","self_intersection","duplicate_vertices"],"title":"ViolationType"},"WalkDistanceRequest":{"properties":{"lat1":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Lat1","description":"Origin latitude"},"lon1":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Lon1","description":"Origin longitude"},"lat2":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Lat2","description":"Destination latitude"},"lon2":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Lon2","description":"Destination longitude"}},"type":"object","required":["lat1","lon1","lat2","lon2"],"title":"WalkDistanceRequest","description":"Request for walk distance calculation."},"WalkDistanceResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"origin":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Origin"},"destination":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Destination"},"straight_line_distance_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Straight Line Distance M"},"walk_distance_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Walk Distance M"},"detour_factor":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Detour Factor"},"walk_time_minutes":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Walk Time Minutes"},"route_node_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Route Node Count"},"processing_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Processing Time Ms"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["success"],"title":"WalkDistanceResponse","description":"Response for walk distance calculation."},"WalkabilityResult":{"properties":{"success":{"type":"boolean","title":"Success"},"walkability_score":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Walkability Score","description":"Overall walkability score 0-100"},"walkability_rating":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Walkability Rating","description":"Rating: Walker's Paradise, Very Walkable, etc."},"category_scores":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Category Scores","description":"Scores per amenity category"},"category_distances":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"object"},{"type":"null"}],"title":"Category Distances","description":"Distance to nearest per category (meters)"},"category_counts":{"anyOf":[{"additionalProperties":{"additionalProperties":{"type":"integer"},"type":"object"},"type":"object"},{"type":"null"}],"title":"Category Counts","description":"Counts at 400m, 800m, 1200m"},"center_point":{"anyOf":[{"$ref":"#/components/schemas/CenterPoint"},{"type":"null"}]},"network_stats":{"anyOf":[{"$ref":"#/components/schemas/NetworkStats"},{"type":"null"}]},"processing_time_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Processing Time Seconds"},"methodology":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Methodology","description":"Scoring methodology used","default":"Walk Score"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Data source","default":"OSMnx + OSM"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["success"],"title":"WalkabilityResult","description":"Walkability calculation result."},"WalkabilityServiceStatus":{"properties":{"available":{"type":"boolean","title":"Available"},"osmnx_available":{"type":"boolean","title":"Osmnx Available"},"osmnet_available":{"type":"boolean","title":"Osmnet Available"},"osmnx_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Osmnx Version"},"cache_dir":{"type":"string","title":"Cache Dir"},"cached_networks":{"type":"integer","title":"Cached Networks"},"cached_amenities":{"type":"integer","title":"Cached Amenities"},"cache_size_mb":{"type":"number","title":"Cache Size Mb"},"memory_cached_networks":{"type":"integer","title":"Memory Cached Networks"},"amenity_categories":{"items":{"type":"string"},"type":"array","title":"Amenity Categories"}},"type":"object","required":["available","osmnx_available","osmnet_available","cache_dir","cached_networks","cached_amenities","cache_size_mb","memory_cached_networks","amenity_categories"],"title":"WalkabilityServiceStatus","description":"Service status response."},"WarmRequest":{"properties":{"center_lat":{"type":"number","title":"Center Lat","description":"Center latitude (default: Melbourne CBD)","default":-37.8136},"center_lon":{"type":"number","title":"Center Lon","description":"Center longitude (default: Melbourne CBD)","default":144.9631},"radius_km":{"type":"number","maximum":50.0,"minimum":0.5,"title":"Radius Km","description":"Radius in km","default":5.0},"layers":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Layers","description":"Layer IDs to warm (null = all 14)"}},"type":"object","title":"WarmRequest","description":"Request to pre-populate cache for an area."},"WebhookResponse":{"properties":{"id":{"type":"integer","title":"Id"},"url":{"type":"string","title":"Url"},"events":{"items":{"type":"string"},"type":"array","title":"Events"},"is_active":{"type":"boolean","title":"Is Active"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"delivery_count":{"type":"integer","title":"Delivery Count"},"failure_count":{"type":"integer","title":"Failure Count"},"last_delivered_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Delivered At"},"created_at":{"type":"string","title":"Created At"},"secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret"}},"type":"object","required":["id","url","events","is_active","delivery_count","failure_count","created_at"],"title":"WebhookResponse"},"WorkflowRunRequest":{"properties":{"params":{"additionalProperties":true,"type":"object","title":"Params","description":"Workflow parameters (e.g. location)"},"scenario_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scenario Id","description":"Current scenario context"},"project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Project Id","description":"The workspace, for workspace workflows"},"conversation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Conversation Id","description":"Conversation to continue"}},"type":"object","title":"WorkflowRunRequest"},"ZoneQueryRequest":{"properties":{"geometry":{"$ref":"#/components/schemas/routers__vicmap__GeometryInput","description":"GeoJSON geometry for spatial query"}},"type":"object","required":["geometry"],"title":"ZoneQueryRequest","description":"Request for zone query."},"routers__heritage__GeometryInput":{"properties":{"type":{"type":"string","title":"Type","description":"Geometry type (Polygon, MultiPolygon)"},"coordinates":{"items":{},"type":"array","title":"Coordinates","description":"GeoJSON coordinates array"}},"type":"object","required":["type","coordinates"],"title":"GeometryInput","description":"GeoJSON geometry input for spatial queries."},"routers__vicmap__GeometryInput":{"properties":{"type":{"type":"string","title":"Type","description":"Geometry type (Polygon, MultiPolygon)"},"coordinates":{"items":{},"type":"array","title":"Coordinates","description":"GeoJSON coordinates array"}},"type":"object","required":["type","coordinates"],"title":"GeometryInput","description":"GeoJSON geometry input for spatial queries."},"schemas__building_approvals_schemas__CacheStats":{"properties":{"cache_dir":{"type":"string","title":"Cache Dir","description":"Cache directory path"},"file_count":{"type":"integer","title":"File Count","description":"Number of cached files","default":0},"total_size_bytes":{"type":"integer","title":"Total Size Bytes","description":"Total cache size in bytes","default":0},"memory_items":{"type":"integer","title":"Memory Items","description":"Items in memory cache","default":0}},"type":"object","required":["cache_dir"],"title":"CacheStats","description":"Cache statistics."},"schemas__census_schemas__CacheClearResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"files_removed":{"type":"integer","title":"Files Removed"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","files_removed","message"],"title":"CacheClearResponse","description":"Response after clearing cache."},"schemas__gtfs_schemas__GeometryInput":{"properties":{"geometry":{"additionalProperties":true,"type":"object","title":"Geometry","description":"GeoJSON Polygon geometry"}},"type":"object","required":["geometry"],"title":"GeometryInput","description":"GeoJSON geometry input for polygon queries."},"schemas__network_schemas__CacheClearResponse":{"properties":{"deleted_files":{"type":"integer","title":"Deleted Files"},"cleared_memory":{"type":"boolean","title":"Cleared Memory"}},"type":"object","required":["deleted_files","cleared_memory"],"title":"CacheClearResponse","description":"Response for cache clear operation."},"schemas__walkability_schemas__CacheStats":{"properties":{"networks_cached":{"type":"integer","title":"Networks Cached"},"amenities_cached":{"type":"integer","title":"Amenities Cached"},"total_size_mb":{"type":"number","title":"Total Size Mb"},"memory_networks":{"type":"integer","title":"Memory Networks"}},"type":"object","required":["networks_cached","amenities_cached","total_size_mb","memory_networks"],"title":"CacheStats","description":"Cache statistics."},"schemas__walkability_schemas__GeometryInput":{"properties":{"geometry":{"additionalProperties":true,"type":"object","title":"Geometry","description":"GeoJSON geometry (Point, Polygon, MultiPolygon)"},"detail_level":{"type":"string","title":"Detail Level","description":"'quick' or 'standard'","default":"standard"}},"type":"object","required":["geometry"],"title":"GeometryInput","description":"Input geometry for walkability calculation."}},"securitySchemes":{"OAuth2PasswordBearer":{"type":"oauth2","flows":{"password":{"scopes":{},"tokenUrl":"/api/auth/login"}}},"APIKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key"}}}}