Files
Investidor-V2/docs/investmoz/zones/openapi.json
T
nala 1106509116
tests / ci (push) Canceled after 0s
vrsao 2
2026-10-08 14:02:01 +02:00

2410 lines
92 KiB
JSON

{
"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."
}
}
}
}