{ "openapi": "3.0.3", "info": { "title": "InvestMoz zone foundation API", "version": "2026-09-28", "description": "Implemented local routes only. Session cookies and CSRF; no bearer protocol invented. Admin: verified manager with confirmed MFA; legal/GIS/publish actions also require configured designated role. 30 requests/minute for management; public API uses application throttle. Approval in the portal is documentary review, not an administrative act. API v1 remains compatible and adds optional zee_id/zfi_id/park_id filters. Response schemas are deliberately open pending full contract typing." }, "paths": { "/api/v2/investment/admin/legal-sources": { "get": { "operationId": "InvestmentLegalSourceController_index_0", "summary": "InvestmentLegalSourceController@index", "parameters": [], "security": [ { "laravelSession": [] } ], "responses": { "200": { "description": "Success. JSON; paginated lists. Private management responses use Cache-Control: private, no-store.", "content": { "application/json": { "schema": { "type": "object" } } } }, "403": { "description": "Missing manager/MFA/designated role or self-review." }, "404": { "description": "Not found or not publicly visible." }, "409": { "description": "Stale version or duplicate relation." }, "419": { "description": "Session/CSRF validation failed." }, "422": { "description": "Invalid data, source, geometry, overlap or workflow." }, "429": { "description": "Rate limit exceeded." } } }, "post": { "operationId": "InvestmentLegalSourceController_store_1", "summary": "InvestmentLegalSourceController@store", "parameters": [], "security": [ { "laravelSession": [] } ], "responses": { "201": { "description": "Success. JSON; paginated lists. Private management responses use Cache-Control: private, no-store.", "content": { "application/json": { "schema": { "type": "object" } } } }, "403": { "description": "Missing manager/MFA/designated role or self-review." }, "404": { "description": "Not found or not publicly visible." }, "409": { "description": "Stale version or duplicate relation." }, "419": { "description": "Session/CSRF validation failed." }, "422": { "description": "Invalid data, source, geometry, overlap or workflow." }, "429": { "description": "Rate limit exceeded." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/LegalSource" } } } } } }, "/api/v2/investment/admin/legal-sources/{id}/{action}": { "post": { "operationId": "InvestmentLegalSourceController_transition_2", "summary": "InvestmentLegalSourceController@transition", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }, { "name": "action", "in": "path", "required": true, "schema": { "type": "string", "enum": ["validate", "revoke"] } } ], "security": [ { "laravelSession": [] } ], "responses": { "200": { "description": "Success. JSON; paginated lists. Private management responses use Cache-Control: private, no-store.", "content": { "application/json": { "schema": { "type": "object" } } } }, "403": { "description": "Missing manager/MFA/designated role or self-review." }, "404": { "description": "Not found or not publicly visible." }, "409": { "description": "Stale version or duplicate relation." }, "419": { "description": "Session/CSRF validation failed." }, "422": { "description": "Invalid data, source, geometry, overlap or workflow." }, "429": { "description": "Rate limit exceeded." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Version" } } } } } }, "/api/v2/investment/admin/zone-attachments/{id}/{action}": { "post": { "operationId": "InvestmentZoneAttachmentController_review_3", "summary": "InvestmentZoneAttachmentController@review", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }, { "name": "action", "in": "path", "required": true, "schema": { "type": "string", "enum": [ "review", "select-public", "withdraw-public" ] } } ], "security": [ { "laravelSession": [] } ], "responses": { "200": { "description": "Success. JSON; paginated lists. Private management responses use Cache-Control: private, no-store.", "content": { "application/json": { "schema": { "type": "object" } } } }, "403": { "description": "Missing manager/MFA/designated role or self-review." }, "404": { "description": "Not found or not publicly visible." }, "409": { "description": "Stale version or duplicate relation." }, "419": { "description": "Session/CSRF validation failed." }, "422": { "description": "Invalid data, source, geometry, overlap or workflow." }, "429": { "description": "Rate limit exceeded." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "version_no": { "type": "integer", "minimum": 1 }, "decision": { "type": "string", "enum": ["reviewed", "rejected"] }, "rights_status": { "type": "string", "enum": [ "pending", "confirmed", "restricted" ] }, "rights_basis": { "type": "string", "nullable": true }, "personal_data_status": { "type": "string", "enum": ["none", "present", "unknown"] } }, "required": ["version_no"] } } } } } }, "/api/v2/investment/admin/zone-geometries/{id}/{action}": { "post": { "operationId": "InvestmentZoneGeometryController_review_4", "summary": "InvestmentZoneGeometryController@review", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }, { "name": "action", "in": "path", "required": true, "schema": { "type": "string", "enum": ["validate", "revoke"] } } ], "security": [ { "laravelSession": [] } ], "responses": { "200": { "description": "Success. JSON; paginated lists. Private management responses use Cache-Control: private, no-store.", "content": { "application/json": { "schema": { "type": "object" } } } }, "403": { "description": "Missing manager/MFA/designated role or self-review." }, "404": { "description": "Not found or not publicly visible." }, "409": { "description": "Stale version or duplicate relation." }, "419": { "description": "Session/CSRF validation failed." }, "422": { "description": "Invalid data, source, geometry, overlap or workflow." }, "429": { "description": "Rate limit exceeded." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Version" } } } } } }, "/api/v2/investment/admin/zone-links/{id}/{action}": { "post": { "operationId": "InvestmentZoneLinkController_transition_5", "summary": "InvestmentZoneLinkController@transition", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }, { "name": "action", "in": "path", "required": true, "schema": { "type": "string", "enum": ["validate", "revoke"] } } ], "security": [ { "laravelSession": [] } ], "responses": { "200": { "description": "Success. JSON; paginated lists. Private management responses use Cache-Control: private, no-store.", "content": { "application/json": { "schema": { "type": "object" } } } }, "403": { "description": "Missing manager/MFA/designated role or self-review." }, "404": { "description": "Not found or not publicly visible." }, "409": { "description": "Stale version or duplicate relation." }, "419": { "description": "Session/CSRF validation failed." }, "422": { "description": "Invalid data, source, geometry, overlap or workflow." }, "429": { "description": "Rate limit exceeded." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Version" } } } } } }, "/api/v2/investment/admin/zone-locations/{id}/validate": { "post": { "operationId": "InvestmentZoneController_validateLocation_6", "summary": "InvestmentZoneController@validateLocation", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } } ], "security": [ { "laravelSession": [] } ], "responses": { "201": { "description": "Success. JSON; paginated lists. Private management responses use Cache-Control: private, no-store.", "content": { "application/json": { "schema": { "type": "object" } } } }, "403": { "description": "Missing manager/MFA/designated role or self-review." }, "404": { "description": "Not found or not publicly visible." }, "409": { "description": "Stale version or duplicate relation." }, "419": { "description": "Session/CSRF validation failed." }, "422": { "description": "Invalid data, source, geometry, overlap or workflow." }, "429": { "description": "Rate limit exceeded." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Zone" } } } } } }, "/api/v2/investment/admin/zone-relations/{id}/{action}": { "post": { "operationId": "InvestmentZoneRelationController_review_7", "summary": "InvestmentZoneRelationController@review", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }, { "name": "action", "in": "path", "required": true, "schema": { "type": "string", "enum": ["validate", "revoke"] } } ], "security": [ { "laravelSession": [] } ], "responses": { "200": { "description": "Success. JSON; paginated lists. Private management responses use Cache-Control: private, no-store.", "content": { "application/json": { "schema": { "type": "object" } } } }, "403": { "description": "Missing manager/MFA/designated role or self-review." }, "404": { "description": "Not found or not publicly visible." }, "409": { "description": "Stale version or duplicate relation." }, "419": { "description": "Session/CSRF validation failed." }, "422": { "description": "Invalid data, source, geometry, overlap or workflow." }, "429": { "description": "Rate limit exceeded." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Version" } } } } } }, "/api/v2/investment/admin/zones": { "get": { "operationId": "InvestmentZoneController_index_8", "summary": "InvestmentZoneController@index", "parameters": [ { "name": "q", "in": "query", "schema": { "type": "string", "maxLength": 120 } }, { "name": "category", "in": "query", "schema": { "type": "string", "enum": ["zee", "zfi", "industrial_park"] } }, { "name": "physical_category", "in": "query", "schema": { "type": "string" } }, { "name": "legal_regime", "in": "query", "schema": { "type": "string" } }, { "name": "development_status", "in": "query", "schema": { "type": "string" } }, { "name": "availability_status", "in": "query", "schema": { "type": "string" } }, { "name": "activity", "in": "query", "schema": { "type": "string" } }, { "name": "province_id", "in": "query", "schema": { "type": "string", "format": "uuid" } }, { "name": "district_id", "in": "query", "schema": { "type": "string", "format": "uuid" } }, { "name": "admin_post_id", "in": "query", "schema": { "type": "string", "format": "uuid" } }, { "name": "locality_id", "in": "query", "schema": { "type": "string", "format": "uuid" } }, { "name": "page", "in": "query", "schema": { "type": "integer", "minimum": 1 } } ], "security": [ { "laravelSession": [] } ], "responses": { "200": { "description": "Success. JSON; paginated lists. Private management responses use Cache-Control: private, no-store.", "content": { "application/json": { "schema": { "type": "object" } } } }, "403": { "description": "Missing manager/MFA/designated role or self-review." }, "404": { "description": "Not found or not publicly visible." }, "409": { "description": "Stale version or duplicate relation." }, "419": { "description": "Session/CSRF validation failed." }, "422": { "description": "Invalid data, source, geometry, overlap or workflow." }, "429": { "description": "Rate limit exceeded." } } }, "post": { "operationId": "InvestmentZoneController_save_9", "summary": "InvestmentZoneController@save", "parameters": [], "security": [ { "laravelSession": [] } ], "responses": { "201": { "description": "Success. JSON; paginated lists. Private management responses use Cache-Control: private, no-store.", "content": { "application/json": { "schema": { "type": "object" } } } }, "403": { "description": "Missing manager/MFA/designated role or self-review." }, "404": { "description": "Not found or not publicly visible." }, "409": { "description": "Stale version or duplicate relation." }, "419": { "description": "Session/CSRF validation failed." }, "422": { "description": "Invalid data, source, geometry, overlap or workflow." }, "429": { "description": "Rate limit exceeded." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Zone" } } } } } }, "/api/v2/investment/admin/zones/{id}": { "get": { "operationId": "InvestmentZoneController_show_10", "summary": "InvestmentZoneController@show", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } } ], "security": [ { "laravelSession": [] } ], "responses": { "200": { "description": "Success. JSON; paginated lists. Private management responses use Cache-Control: private, no-store.", "content": { "application/json": { "schema": { "type": "object" } } } }, "403": { "description": "Missing manager/MFA/designated role or self-review." }, "404": { "description": "Not found or not publicly visible." }, "409": { "description": "Stale version or duplicate relation." }, "419": { "description": "Session/CSRF validation failed." }, "422": { "description": "Invalid data, source, geometry, overlap or workflow." }, "429": { "description": "Rate limit exceeded." } } }, "put": { "operationId": "InvestmentZoneController_save_11", "summary": "InvestmentZoneController@save", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } } ], "security": [ { "laravelSession": [] } ], "responses": { "200": { "description": "Success. JSON; paginated lists. Private management responses use Cache-Control: private, no-store.", "content": { "application/json": { "schema": { "type": "object" } } } }, "403": { "description": "Missing manager/MFA/designated role or self-review." }, "404": { "description": "Not found or not publicly visible." }, "409": { "description": "Stale version or duplicate relation." }, "419": { "description": "Session/CSRF validation failed." }, "422": { "description": "Invalid data, source, geometry, overlap or workflow." }, "429": { "description": "Rate limit exceeded." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Zone" } } } } } }, "/api/v2/investment/admin/zones/{id}/attachments": { "post": { "operationId": "InvestmentZoneAttachmentController_store_12", "summary": "InvestmentZoneAttachmentController@store", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } } ], "security": [ { "laravelSession": [] } ], "responses": { "201": { "description": "Success. JSON; paginated lists. Private management responses use Cache-Control: private, no-store.", "content": { "application/json": { "schema": { "type": "object" } } } }, "403": { "description": "Missing manager/MFA/designated role or self-review." }, "404": { "description": "Not found or not publicly visible." }, "409": { "description": "Stale version or duplicate relation." }, "419": { "description": "Session/CSRF validation failed." }, "422": { "description": "Invalid data, source, geometry, overlap or workflow." }, "429": { "description": "Rate limit exceeded." } }, "requestBody": { "required": true, "content": { "multipart/form-data": { "schema": { "type": "object", "properties": { "file": { "type": "string", "format": "binary" }, "kind": { "type": "string", "enum": [ "legal_instrument", "map", "photo", "study", "other" ] }, "caption": { "type": "string", "maxLength": 255 }, "source_reference": { "type": "string", "minLength": 5, "maxLength": 2000 }, "source_date": { "type": "string", "format": "date", "nullable": true }, "rights_status": { "type": "string", "enum": [ "pending", "confirmed", "restricted" ] }, "rights_basis": { "type": "string", "nullable": true } }, "required": [ "file", "kind", "caption", "source_reference", "rights_status" ] } } } } } }, "/api/v2/investment/admin/zones/{id}/geometries": { "post": { "operationId": "InvestmentZoneGeometryController_store_13", "summary": "InvestmentZoneGeometryController@store", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } } ], "security": [ { "laravelSession": [] } ], "responses": { "201": { "description": "Success. JSON; paginated lists. Private management responses use Cache-Control: private, no-store.", "content": { "application/json": { "schema": { "type": "object" } } } }, "403": { "description": "Missing manager/MFA/designated role or self-review." }, "404": { "description": "Not found or not publicly visible." }, "409": { "description": "Stale version or duplicate relation." }, "419": { "description": "Session/CSRF validation failed." }, "422": { "description": "Invalid data, source, geometry, overlap or workflow." }, "429": { "description": "Rate limit exceeded." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Geometry" } } } } } }, "/api/v2/investment/admin/zones/{id}/links": { "post": { "operationId": "InvestmentZoneLinkController_store_14", "summary": "InvestmentZoneLinkController@store", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } } ], "security": [ { "laravelSession": [] } ], "responses": { "201": { "description": "Success. JSON; paginated lists. Private management responses use Cache-Control: private, no-store.", "content": { "application/json": { "schema": { "type": "object" } } } }, "403": { "description": "Missing manager/MFA/designated role or self-review." }, "404": { "description": "Not found or not publicly visible." }, "409": { "description": "Stale version or duplicate relation." }, "419": { "description": "Session/CSRF validation failed." }, "422": { "description": "Invalid data, source, geometry, overlap or workflow." }, "429": { "description": "Rate limit exceeded." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Link" } } } } } }, "/api/v2/investment/admin/zones/{id}/relations": { "post": { "operationId": "InvestmentZoneRelationController_store_15", "summary": "InvestmentZoneRelationController@store", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } } ], "security": [ { "laravelSession": [] } ], "responses": { "201": { "description": "Success. JSON; paginated lists. Private management responses use Cache-Control: private, no-store.", "content": { "application/json": { "schema": { "type": "object" } } } }, "403": { "description": "Missing manager/MFA/designated role or self-review." }, "404": { "description": "Not found or not publicly visible." }, "409": { "description": "Stale version or duplicate relation." }, "419": { "description": "Session/CSRF validation failed." }, "422": { "description": "Invalid data, source, geometry, overlap or workflow." }, "429": { "description": "Rate limit exceeded." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Relation" } } } } } }, "/api/v2/investment/admin/zones/{id}/revisions": { "get": { "operationId": "InvestmentZoneController_revisions_16", "summary": "InvestmentZoneController@revisions", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } } ], "security": [ { "laravelSession": [] } ], "responses": { "200": { "description": "Success. JSON; paginated lists. Private management responses use Cache-Control: private, no-store.", "content": { "application/json": { "schema": { "type": "object" } } } }, "403": { "description": "Missing manager/MFA/designated role or self-review." }, "404": { "description": "Not found or not publicly visible." }, "409": { "description": "Stale version or duplicate relation." }, "419": { "description": "Session/CSRF validation failed." }, "422": { "description": "Invalid data, source, geometry, overlap or workflow." }, "429": { "description": "Rate limit exceeded." } } } }, "/api/v2/investment/admin/zones/{id}/{action}": { "post": { "operationId": "InvestmentZoneController_transition_17", "summary": "InvestmentZoneController@transition", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }, { "name": "action", "in": "path", "required": true, "schema": { "type": "string", "enum": ["publish", "suspend"] } } ], "security": [ { "laravelSession": [] } ], "responses": { "200": { "description": "Success. JSON; paginated lists. Private management responses use Cache-Control: private, no-store.", "content": { "application/json": { "schema": { "type": "object" } } } }, "403": { "description": "Missing manager/MFA/designated role or self-review." }, "404": { "description": "Not found or not publicly visible." }, "409": { "description": "Stale version or duplicate relation." }, "419": { "description": "Session/CSRF validation failed." }, "422": { "description": "Invalid data, source, geometry, overlap or workflow." }, "429": { "description": "Rate limit exceeded." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Version" } } } } } }, "/api/v2/investment/zone-map": { "get": { "operationId": "InvestmentZoneGeometryController_map_18", "summary": "InvestmentZoneGeometryController@map", "parameters": [ { "name": "zone_id", "in": "query", "schema": { "type": "string", "format": "uuid" } }, { "name": "bbox[]", "in": "query", "style": "form", "explode": true, "schema": { "type": "array", "minItems": 4, "maxItems": 4, "items": { "type": "number" } }, "description": "west,south,east,north; no antimeridian wrap." } ], "security": [], "responses": { "200": { "description": "Success. JSON; paginated lists. Private management responses use Cache-Control: private, no-store.", "content": { "application/json": { "schema": { "type": "object" } } } }, "403": { "description": "Missing manager/MFA/designated role or self-review." }, "404": { "description": "Not found or not publicly visible." }, "409": { "description": "Stale version or duplicate relation." }, "419": { "description": "Session/CSRF validation failed." }, "422": { "description": "Invalid data, source, geometry, overlap or workflow." }, "429": { "description": "Rate limit exceeded." } } } }, "/api/v2/investment/zones": { "get": { "operationId": "InvestmentZoneController_index_19", "summary": "InvestmentZoneController@index", "parameters": [ { "name": "q", "in": "query", "schema": { "type": "string", "maxLength": 120 } }, { "name": "category", "in": "query", "schema": { "type": "string", "enum": ["zee", "zfi", "industrial_park"] } }, { "name": "physical_category", "in": "query", "schema": { "type": "string" } }, { "name": "legal_regime", "in": "query", "schema": { "type": "string" } }, { "name": "development_status", "in": "query", "schema": { "type": "string" } }, { "name": "availability_status", "in": "query", "schema": { "type": "string" } }, { "name": "activity", "in": "query", "schema": { "type": "string" } }, { "name": "province_id", "in": "query", "schema": { "type": "string", "format": "uuid" } }, { "name": "district_id", "in": "query", "schema": { "type": "string", "format": "uuid" } }, { "name": "admin_post_id", "in": "query", "schema": { "type": "string", "format": "uuid" } }, { "name": "locality_id", "in": "query", "schema": { "type": "string", "format": "uuid" } }, { "name": "page", "in": "query", "schema": { "type": "integer", "minimum": 1 } } ], "security": [], "responses": { "200": { "description": "Success. JSON; paginated lists. Private management responses use Cache-Control: private, no-store.", "content": { "application/json": { "schema": { "type": "object" } } } }, "403": { "description": "Missing manager/MFA/designated role or self-review." }, "404": { "description": "Not found or not publicly visible." }, "409": { "description": "Stale version or duplicate relation." }, "419": { "description": "Session/CSRF validation failed." }, "422": { "description": "Invalid data, source, geometry, overlap or workflow." }, "429": { "description": "Rate limit exceeded." } } } }, "/api/v2/investment/zones/export.csv": { "get": { "operationId": "InvestmentZoneController_export_20", "summary": "InvestmentZoneController@export", "parameters": [ { "name": "q", "in": "query", "schema": { "type": "string", "maxLength": 120 } }, { "name": "category", "in": "query", "schema": { "type": "string", "enum": ["zee", "zfi", "industrial_park"] } }, { "name": "physical_category", "in": "query", "schema": { "type": "string" } }, { "name": "legal_regime", "in": "query", "schema": { "type": "string" } }, { "name": "development_status", "in": "query", "schema": { "type": "string" } }, { "name": "availability_status", "in": "query", "schema": { "type": "string" } }, { "name": "activity", "in": "query", "schema": { "type": "string" } }, { "name": "province_id", "in": "query", "schema": { "type": "string", "format": "uuid" } }, { "name": "district_id", "in": "query", "schema": { "type": "string", "format": "uuid" } }, { "name": "admin_post_id", "in": "query", "schema": { "type": "string", "format": "uuid" } }, { "name": "locality_id", "in": "query", "schema": { "type": "string", "format": "uuid" } }, { "name": "page", "in": "query", "schema": { "type": "integer", "minimum": 1 } } ], "security": [], "responses": { "200": { "description": "CSV filtered with the same server-side criteria as the public zone list.", "content": { "text/csv": { "schema": { "type": "string", "format": "binary" } } } }, "403": { "description": "Missing manager/MFA/designated role or self-review." }, "404": { "description": "Not found or not publicly visible." }, "409": { "description": "Stale version or duplicate relation." }, "419": { "description": "Session/CSRF validation failed." }, "422": { "description": "Invalid data, source, geometry, overlap or workflow." }, "429": { "description": "Rate limit exceeded." } } } }, "/api/v2/investment/zones/{id}": { "get": { "operationId": "InvestmentZoneController_show_21", "summary": "InvestmentZoneController@show", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } } ], "security": [], "responses": { "200": { "description": "Success. JSON; paginated lists. Private management responses use Cache-Control: private, no-store.", "content": { "application/json": { "schema": { "type": "object" } } } }, "403": { "description": "Missing manager/MFA/designated role or self-review." }, "404": { "description": "Not found or not publicly visible." }, "409": { "description": "Stale version or duplicate relation." }, "419": { "description": "Session/CSRF validation failed." }, "422": { "description": "Invalid data, source, geometry, overlap or workflow." }, "429": { "description": "Rate limit exceeded." } } } }, "/management/investment/zones": { "get": { "operationId": "InvestmentZoneController_index_22", "summary": "InvestmentZoneController@index", "parameters": [ { "name": "q", "in": "query", "schema": { "type": "string", "maxLength": 120 } }, { "name": "category", "in": "query", "schema": { "type": "string", "enum": ["zee", "zfi", "industrial_park"] } }, { "name": "physical_category", "in": "query", "schema": { "type": "string" } }, { "name": "legal_regime", "in": "query", "schema": { "type": "string" } }, { "name": "development_status", "in": "query", "schema": { "type": "string" } }, { "name": "availability_status", "in": "query", "schema": { "type": "string" } }, { "name": "activity", "in": "query", "schema": { "type": "string" } }, { "name": "province_id", "in": "query", "schema": { "type": "string", "format": "uuid" } }, { "name": "district_id", "in": "query", "schema": { "type": "string", "format": "uuid" } }, { "name": "admin_post_id", "in": "query", "schema": { "type": "string", "format": "uuid" } }, { "name": "locality_id", "in": "query", "schema": { "type": "string", "format": "uuid" } }, { "name": "page", "in": "query", "schema": { "type": "integer", "minimum": 1 } } ], "security": [ { "laravelSession": [] } ], "responses": { "200": { "description": "Success. JSON; paginated lists. Private management responses use Cache-Control: private, no-store.", "content": { "application/json": { "schema": { "type": "object" } } } }, "403": { "description": "Missing manager/MFA/designated role or self-review." }, "404": { "description": "Not found or not publicly visible." }, "409": { "description": "Stale version or duplicate relation." }, "419": { "description": "Session/CSRF validation failed." }, "422": { "description": "Invalid data, source, geometry, overlap or workflow." }, "429": { "description": "Rate limit exceeded." } } } }, "/management/investment/zones/{id}": { "get": { "operationId": "InvestmentZoneController_show_23", "summary": "InvestmentZoneController@show", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } } ], "security": [ { "laravelSession": [] } ], "responses": { "200": { "description": "Success. JSON; paginated lists. Private management responses use Cache-Control: private, no-store.", "content": { "application/json": { "schema": { "type": "object" } } } }, "403": { "description": "Missing manager/MFA/designated role or self-review." }, "404": { "description": "Not found or not publicly visible." }, "409": { "description": "Stale version or duplicate relation." }, "419": { "description": "Session/CSRF validation failed." }, "422": { "description": "Invalid data, source, geometry, overlap or workflow." }, "429": { "description": "Rate limit exceeded." } } } }, "/management/investment/zones/{zone}/attachments/{attachment}": { "get": { "operationId": "InvestmentZoneAttachmentController_downloadPrivate_24", "summary": "InvestmentZoneAttachmentController@downloadPrivate", "parameters": [ { "name": "zone", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }, { "name": "attachment", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } } ], "security": [ { "laravelSession": [] } ], "responses": { "200": { "description": "Success. JSON; paginated lists. Private management responses use Cache-Control: private, no-store.", "content": { "application/json": { "schema": { "type": "object" } } } }, "403": { "description": "Missing manager/MFA/designated role or self-review." }, "404": { "description": "Not found or not publicly visible." }, "409": { "description": "Stale version or duplicate relation." }, "419": { "description": "Session/CSRF validation failed." }, "422": { "description": "Invalid data, source, geometry, overlap or workflow." }, "429": { "description": "Rate limit exceeded." } } } }, "/zonas": { "get": { "operationId": "InvestmentZoneController_index_25", "summary": "InvestmentZoneController@index", "parameters": [], "security": [], "responses": { "200": { "description": "Success. JSON; paginated lists. Private management responses use Cache-Control: private, no-store.", "content": { "application/json": { "schema": { "type": "object" } } } }, "403": { "description": "Missing manager/MFA/designated role or self-review." }, "404": { "description": "Not found or not publicly visible." }, "409": { "description": "Stale version or duplicate relation." }, "419": { "description": "Session/CSRF validation failed." }, "422": { "description": "Invalid data, source, geometry, overlap or workflow." }, "429": { "description": "Rate limit exceeded." } } } }, "/zonas/{id}": { "get": { "operationId": "InvestmentZoneController_show_26", "summary": "InvestmentZoneController@show", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } } ], "security": [], "responses": { "200": { "description": "Success. JSON; paginated lists. Private management responses use Cache-Control: private, no-store.", "content": { "application/json": { "schema": { "type": "object" } } } }, "403": { "description": "Missing manager/MFA/designated role or self-review." }, "404": { "description": "Not found or not publicly visible." }, "409": { "description": "Stale version or duplicate relation." }, "419": { "description": "Session/CSRF validation failed." }, "422": { "description": "Invalid data, source, geometry, overlap or workflow." }, "429": { "description": "Rate limit exceeded." } } } }, "/zonas/{zone}/anexos/{attachment}": { "get": { "operationId": "InvestmentZoneAttachmentController_downloadPublic_27", "summary": "InvestmentZoneAttachmentController@downloadPublic", "parameters": [ { "name": "zone", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }, { "name": "attachment", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } } ], "security": [], "responses": { "200": { "description": "Success. JSON; paginated lists. Private management responses use Cache-Control: private, no-store.", "content": { "application/json": { "schema": { "type": "object" } } } }, "403": { "description": "Missing manager/MFA/designated role or self-review." }, "404": { "description": "Not found or not publicly visible." }, "409": { "description": "Stale version or duplicate relation." }, "419": { "description": "Session/CSRF validation failed." }, "422": { "description": "Invalid data, source, geometry, overlap or workflow." }, "429": { "description": "Rate limit exceeded." } } } } }, "components": { "securitySchemes": { "laravelSession": { "type": "apiKey", "in": "cookie", "name": "laravel_session", "description": "Actual session cookie name is configured by Laravel. Send X-XSRF-TOKEN from the session; no credentials embedded." } }, "schemas": { "Version": { "type": "object", "properties": { "version_no": { "type": "integer", "minimum": 1 } }, "required": ["version_no"] }, "Zone": { "type": "object", "properties": { "version_no": { "type": "integer", "minimum": 1 }, "code": { "type": "string", "maxLength": 80 }, "category": { "type": "string", "enum": ["zee", "zfi", "industrial_park", "pending"] }, "physical_category": { "type": "string", "enum": [ "economic_zone", "industrial_park", "agro_industrial_park", "industrial_logistics_park", "industrial_free_zone", "integrated_tourism_area", "other", "unknown" ] }, "legal_regime": { "type": "string", "enum": [ "zee", "zfi", "general", "pending", "not_applicable" ] }, "development_status": { "type": "string", "enum": [ "announced", "planned", "in_development", "partially_operational", "operational", "suspended", "unknown" ] }, "availability_status": { "type": "string", "enum": [ "confirmed", "unavailable", "reported_unverified", "not_informed" ] }, "area_components": { "type": "array", "items": { "type": "object" } }, "source_evidence": { "type": "array", "items": { "type": "object" } }, "name": { "type": "string", "maxLength": 255 }, "name_en": { "type": "string", "nullable": true }, "description": { "type": "string", "nullable": true }, "description_en": { "type": "string", "nullable": true }, "province": { "type": "string", "nullable": true }, "district": { "type": "string", "nullable": true }, "operator_id": { "type": "string", "format": "uuid", "nullable": true }, "legal_source_id": { "type": "string", "format": "uuid", "nullable": true } }, "required": ["code", "category", "name"], "description": "PUT requires version_no. Save withdraws publication and requires a new independent review. No official status inferred from category." }, "LegalSource": { "type": "object", "properties": { "title": { "type": "string" }, "url": { "type": "string", "format": "uri", "description": "HTTPS reference only; no remote download." }, "diploma": { "type": "string" }, "article": { "type": "string" }, "competent_entity": { "type": "string" }, "valid_from": { "type": "string", "format": "date" }, "valid_until": { "type": "string", "format": "date", "nullable": true } }, "required": [ "title", "url", "diploma", "article", "competent_entity", "valid_from" ] }, "Link": { "type": "object", "properties": { "opportunity_id": { "type": "integer", "minimum": 1 }, "association_type": { "type": "string", "enum": [ "official", "influence", "proximity", "potential", "historical" ] }, "role": { "type": "string", "enum": [ "primary", "beneficiary", "served", "enabled", "dependent", "related", "potential", "historical" ] }, "source_reference": { "type": "string", "minLength": 10, "maxLength": 2000 }, "justification": { "type": "string", "minLength": 10, "maxLength": 3000 }, "legal_source_id": { "type": "string", "format": "uuid", "nullable": true }, "valid_from": { "type": "string", "format": "date" }, "valid_until": { "type": "string", "format": "date", "nullable": true }, "priority": { "type": "integer", "minimum": 0, "maximum": 100 }, "is_primary": { "type": "boolean" } }, "required": [ "opportunity_id", "association_type", "role", "source_reference", "justification", "valid_from" ], "description": "Official association requires legal_source_id. Creates or reuses UUID mapping for existing opportunity; duplicate zone-item pair returns 409. Potential remains potential after review." }, "Relation": { "type": "object", "properties": { "cluster_id": { "type": "string", "format": "uuid", "nullable": true }, "corridor_id": { "type": "string", "format": "uuid", "nullable": true }, "project_id": { "type": "string", "format": "uuid", "nullable": true }, "association_type": { "type": "string", "enum": [ "official", "influence", "proximity", "potential", "historical" ] }, "role": { "type": "string", "enum": [ "primary", "beneficiary", "served", "enabled", "dependent", "related", "potential", "historical" ] }, "source_reference": { "type": "string", "minLength": 10, "maxLength": 2000 }, "justification": { "type": "string", "minLength": 10, "maxLength": 3000 }, "legal_source_id": { "type": "string", "format": "uuid", "nullable": true }, "valid_from": { "type": "string", "format": "date" }, "valid_until": { "type": "string", "format": "date", "nullable": true }, "priority": { "type": "integer", "minimum": 0, "maximum": 100 }, "is_primary": { "type": "boolean" } }, "required": [ "association_type", "role", "source_reference", "justification", "valid_from" ], "description": "Exactly one of cluster_id, corridor_id, project_id. Official association requires legal_source_id. Unique zone-target pair; duplicate returns 409." }, "Geometry": { "type": "object", "properties": { "geometry": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "Point", "LineString", "Polygon", "MultiPolygon" ] }, "coordinates": { "type": "array", "items": {} } }, "required": ["type", "coordinates"] }, "purpose": { "type": "string", "enum": [ "official_perimeter", "influence", "site", "alternative" ] }, "legal_source_id": { "type": "string", "format": "uuid", "nullable": true }, "source_reference": { "type": "string" }, "validating_entity": { "type": "string" }, "observed_at": { "type": "string", "format": "date" } }, "required": [ "geometry", "purpose", "source_reference", "validating_entity", "observed_at" ], "description": "GeoJSON geometry in EPSG:4326, 2D, valid, nonempty, max 200000 encoded bytes. Official perimeter requires Polygon/MultiPolygon and legal source. No status inferred from geometry." } } } }