Files
Investidor-V2/docs/investmoz/unification/openapi.json
T
nala 6a76aac80f
tests / ci (push) Canceled after 0s
versao compilada 1
2026-10-16 09:17:28 +02:00

5490 lines
216 KiB
JSON

{
"openapi": "3.0.3",
"info": {
"title": "InvestMoz — descoberta e manifestações",
"version": "1.1.0-QA-classification",
"description": "Contrato local 27/09/2026. Sessão web Laravel, email verificado e CSRF; não usa bearer independente. Accept: application/json. Respostas privadas no-store. Estados de atendimento: received,in_review,contacted,closed. API pública usa throttle api da aplicação; limites específicos indicados por operação. O middleware Laravel 13 aceita origem same-origin comprovada ou token CSRF válido; clientes devem enviar o token. Pedidos cross-site sem token são recusados. Pesquisa, referências, sugestão, mapa, comparação, exportação e favoritos partilham 60 pedidos/minuto por IP. Delta 15/10/2026: classificação multidimensional preparada apenas em QA; as novas operações e parâmetros abaixo identificados por x-qa-only NÃO estão ativos por esta documentação."
},
"servers": [
{
"url": "/api/v1/investment"
}
],
"security": [],
"paths": {
"/search": {
"get": {
"summary": "Pesquisar oportunidades publicadas com filtros em intersecção.",
"responses": {
"200": {
"description": "Sucesso",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Page"
}
}
}
},
"401": {
"description": "Sem sessão",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "Email não verificado / sem manage-portal",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Registo ausente ou invisível",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"409": {
"description": "Versão desactualizada / pedido submetido",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"419": {
"description": "Sessão / CSRF expirado",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"422": {
"description": "Validação",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"429": {
"description": "Limite de pedidos",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
},
"parameters": [
{
"name": "q",
"in": "query",
"schema": {
"type": "string",
"maxLength": 120
}
},
{
"name": "sector",
"in": "query",
"schema": {
"type": "string"
}
},
{
"name": "province",
"in": "query",
"schema": {
"type": "string"
}
},
{
"name": "district",
"in": "query",
"schema": {
"type": "string"
}
},
{
"name": "cluster_id",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "corridor_id",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "project_id",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "geo_location_id",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "education",
"in": "query",
"schema": {
"type": "boolean"
}
},
{
"name": "maturity_level",
"in": "query",
"schema": {
"type": "integer",
"minimum": 1,
"maximum": 6
}
},
{
"name": "facets",
"in": "query",
"schema": {
"type": "array",
"items": {
"type": "integer"
},
"maxItems": 20
}
},
{
"name": "min_amount",
"in": "query",
"schema": {
"type": "number",
"minimum": 0
}
},
{
"name": "max_amount",
"in": "query",
"schema": {
"type": "number",
"minimum": 0
}
},
{
"name": "currency",
"in": "query",
"schema": {
"type": "string",
"enum": [
"MZN",
"USD",
"EUR",
"ZAR"
]
}
},
{
"name": "before",
"in": "query",
"schema": {
"type": "string",
"format": "date"
}
},
{
"name": "sort",
"in": "query",
"schema": {
"type": "string",
"enum": [
"recent",
"title",
"amount_asc",
"amount_desc"
]
}
},
{
"name": "per_page",
"in": "query",
"schema": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"default": 12
}
},
{
"name": "page",
"in": "query",
"schema": {
"type": "integer",
"minimum": 1
}
},
{
"name": "zee_id",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
},
"description": "Current validated public association. AND with other filters."
},
{
"name": "zfi_id",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
},
"description": "Current validated public association. AND with other filters."
},
{
"name": "park_id",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
},
"description": "Current validated public association. AND with other filters."
},
{
"name": "dimension",
"in": "query",
"schema": {
"type": "string",
"enum": [
"cluster",
"corridor",
"zee",
"zfi"
]
},
"description": "Require a visible association in the selected dimension, preserving other filters."
},
{
"name": "view",
"in": "query",
"schema": {
"type": "string",
"enum": [
"grid",
"list",
"map",
"combined"
]
},
"description": "Presentation state retained in URL; does not alter permission checks."
},
{
"in": "query",
"name": "association_type",
"required": false,
"schema": {
"type": "string",
"enum": [
"corridor",
"location",
"cluster",
"project",
"chain",
"park",
"zone",
"sector",
"activity"
]
},
"x-qa-only": true
},
{
"in": "query",
"name": "association_target",
"required": false,
"schema": {
"type": "string",
"maxLength": 80
},
"x-qa-only": true
},
{
"in": "query",
"name": "association_state",
"required": false,
"schema": {
"type": "string",
"enum": [
"draft",
"preliminary",
"in_validation",
"confirmed",
"rejected",
"archived",
"revoked"
]
},
"x-qa-only": true
},
{
"in": "query",
"name": "association_purpose",
"required": false,
"schema": {
"type": "string"
},
"x-qa-only": true
},
{
"in": "query",
"name": "authority_id",
"required": false,
"schema": {
"type": "string",
"format": "uuid"
},
"x-qa-only": true
},
{
"in": "query",
"name": "chain_id",
"required": false,
"schema": {
"type": "string",
"format": "uuid"
},
"x-qa-only": true
},
{
"in": "query",
"name": "subsector_id",
"required": false,
"schema": {
"type": "string",
"format": "uuid"
},
"x-qa-only": true
},
{
"in": "query",
"name": "category",
"required": false,
"schema": {
"type": "string",
"enum": [
"investment_project",
"real_estate",
"land_rights",
"business_sale",
"business_partnership",
"franchise",
"concession",
"financing",
"supply",
"other"
]
},
"x-qa-only": true
},
{
"in": "query",
"name": "publication_state",
"required": false,
"schema": {
"type": "string",
"enum": [
"published"
]
},
"x-qa-only": true
}
],
"description": "Min/max exigem currency; max >= min. Sem câmbio. Facetas: facets[]=1&facets[]=2. Ordenação monetária agrupada por moeda. Novos filtros QA: AND entre critérios; tipo/alvo/estado/finalidade na mesma associação; cadeia, atividade e entidade podem constar de outras relações da mesma oportunidade. Somente projeção editorial pública e alvos consultáveis. Map matched_count usa a mesma consulta. Filtros antigos dos pivôs continuam a representar vínculos anteriores, sem conversão automática."
}
},
"/references": {
"get": {
"summary": "Opções activas e territórios públicos.",
"responses": {
"200": {
"description": "Sucesso",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/References"
}
}
}
},
"401": {
"description": "Sem sessão",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "Email não verificado / sem manage-portal",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Registo ausente ou invisível",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"409": {
"description": "Versão desactualizada / pedido submetido",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"419": {
"description": "Sessão / CSRF expirado",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"422": {
"description": "Validação",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"429": {
"description": "Limite de pedidos",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/opportunities/{slug}": {
"get": {
"summary": "Ficha publicada e contexto.",
"responses": {
"200": {
"description": "Sucesso",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Detail"
}
}
}
},
"401": {
"description": "Sem sessão",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "Email não verificado / sem manage-portal",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Registo ausente ou invisível",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"409": {
"description": "Versão desactualizada / pedido submetido",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"419": {
"description": "Sessão / CSRF expirado",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"422": {
"description": "Validação",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"429": {
"description": "Limite de pedidos",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
},
"parameters": [
{
"name": "slug",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]
}
},
"/suggest": {
"get": {
"summary": "Sugestões a partir de dois caracteres; até cinco de cada tipo.",
"responses": {
"200": {
"description": "Sucesso",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"opportunities": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"title": {
"type": "string"
},
"slug": {
"type": "string"
}
}
}
},
"territorial": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"title": {
"type": "string"
}
}
}
}
}
}
}
}
},
"401": {
"description": "Sem sessão",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "Email não verificado / sem manage-portal",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Registo ausente ou invisível",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"409": {
"description": "Versão desactualizada / pedido submetido",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"419": {
"description": "Sessão / CSRF expirado",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"422": {
"description": "Validação",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"429": {
"description": "Limite de pedidos",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
},
"parameters": [
{
"name": "q",
"in": "query",
"schema": {
"type": "string",
"maxLength": 120
}
},
{
"name": "sector",
"in": "query",
"schema": {
"type": "string"
}
},
{
"name": "province",
"in": "query",
"schema": {
"type": "string"
}
},
{
"name": "district",
"in": "query",
"schema": {
"type": "string"
}
},
{
"name": "cluster_id",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "corridor_id",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "project_id",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "geo_location_id",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "education",
"in": "query",
"schema": {
"type": "boolean"
}
},
{
"name": "maturity_level",
"in": "query",
"schema": {
"type": "integer",
"minimum": 1,
"maximum": 6
}
},
{
"name": "facets",
"in": "query",
"schema": {
"type": "array",
"items": {
"type": "integer"
},
"maxItems": 20
}
},
{
"name": "min_amount",
"in": "query",
"schema": {
"type": "number",
"minimum": 0
}
},
{
"name": "max_amount",
"in": "query",
"schema": {
"type": "number",
"minimum": 0
}
},
{
"name": "currency",
"in": "query",
"schema": {
"type": "string",
"enum": [
"MZN",
"USD",
"EUR",
"ZAR"
]
}
},
{
"name": "before",
"in": "query",
"schema": {
"type": "string",
"format": "date"
}
},
{
"name": "sort",
"in": "query",
"schema": {
"type": "string",
"enum": [
"recent",
"title",
"amount_asc",
"amount_desc"
]
}
},
{
"name": "per_page",
"in": "query",
"schema": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"default": 12
}
},
{
"name": "page",
"in": "query",
"schema": {
"type": "integer",
"minimum": 1
}
},
{
"name": "zee_id",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
},
"description": "Current validated public association. AND with other filters."
},
{
"name": "zfi_id",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
},
"description": "Current validated public association. AND with other filters."
},
{
"name": "park_id",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
},
"description": "Current validated public association. AND with other filters."
},
{
"name": "dimension",
"in": "query",
"schema": {
"type": "string",
"enum": [
"cluster",
"corridor",
"zee",
"zfi"
]
},
"description": "Require a visible association in the selected dimension, preserving other filters."
},
{
"name": "view",
"in": "query",
"schema": {
"type": "string",
"enum": [
"grid",
"list",
"map",
"combined"
]
},
"description": "Presentation state retained in URL; does not alter permission checks."
},
{
"in": "query",
"name": "association_type",
"required": false,
"schema": {
"type": "string",
"enum": [
"corridor",
"location",
"cluster",
"project",
"chain",
"park",
"zone",
"sector",
"activity"
]
},
"x-qa-only": true
},
{
"in": "query",
"name": "association_target",
"required": false,
"schema": {
"type": "string",
"maxLength": 80
},
"x-qa-only": true
},
{
"in": "query",
"name": "association_state",
"required": false,
"schema": {
"type": "string",
"enum": [
"draft",
"preliminary",
"in_validation",
"confirmed",
"rejected",
"archived",
"revoked"
]
},
"x-qa-only": true
},
{
"in": "query",
"name": "association_purpose",
"required": false,
"schema": {
"type": "string"
},
"x-qa-only": true
},
{
"in": "query",
"name": "authority_id",
"required": false,
"schema": {
"type": "string",
"format": "uuid"
},
"x-qa-only": true
},
{
"in": "query",
"name": "chain_id",
"required": false,
"schema": {
"type": "string",
"format": "uuid"
},
"x-qa-only": true
},
{
"in": "query",
"name": "subsector_id",
"required": false,
"schema": {
"type": "string",
"format": "uuid"
},
"x-qa-only": true
},
{
"in": "query",
"name": "category",
"required": false,
"schema": {
"type": "string",
"enum": [
"investment_project",
"real_estate",
"land_rights",
"business_sale",
"business_partnership",
"franchise",
"concession",
"financing",
"supply",
"other"
]
},
"x-qa-only": true
},
{
"in": "query",
"name": "publication_state",
"required": false,
"schema": {
"type": "string",
"enum": [
"published"
]
},
"x-qa-only": true
}
],
"description": " Novos filtros QA: AND entre critérios; tipo/alvo/estado/finalidade na mesma associação; cadeia, atividade e entidade podem constar de outras relações da mesma oportunidade. Somente projeção editorial pública e alvos consultáveis. Map matched_count usa a mesma consulta. Filtros antigos dos pivôs continuam a representar vínculos anteriores, sem conversão automática."
}
},
"/map": {
"get": {
"summary": "Até mil pontos públicos WGS84, com filtros.",
"responses": {
"200": {
"description": "Sucesso",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Map"
}
}
}
},
"401": {
"description": "Sem sessão",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "Email não verificado / sem manage-portal",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Registo ausente ou invisível",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"409": {
"description": "Versão desactualizada / pedido submetido",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"419": {
"description": "Sessão / CSRF expirado",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"422": {
"description": "Validação",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"429": {
"description": "Limite de pedidos",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
},
"parameters": [
{
"name": "q",
"in": "query",
"schema": {
"type": "string",
"maxLength": 120
}
},
{
"name": "sector",
"in": "query",
"schema": {
"type": "string"
}
},
{
"name": "province",
"in": "query",
"schema": {
"type": "string"
}
},
{
"name": "district",
"in": "query",
"schema": {
"type": "string"
}
},
{
"name": "cluster_id",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "corridor_id",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "project_id",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "geo_location_id",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "education",
"in": "query",
"schema": {
"type": "boolean"
}
},
{
"name": "maturity_level",
"in": "query",
"schema": {
"type": "integer",
"minimum": 1,
"maximum": 6
}
},
{
"name": "facets",
"in": "query",
"schema": {
"type": "array",
"items": {
"type": "integer"
},
"maxItems": 20
}
},
{
"name": "min_amount",
"in": "query",
"schema": {
"type": "number",
"minimum": 0
}
},
{
"name": "max_amount",
"in": "query",
"schema": {
"type": "number",
"minimum": 0
}
},
{
"name": "currency",
"in": "query",
"schema": {
"type": "string",
"enum": [
"MZN",
"USD",
"EUR",
"ZAR"
]
}
},
{
"name": "before",
"in": "query",
"schema": {
"type": "string",
"format": "date"
}
},
{
"name": "sort",
"in": "query",
"schema": {
"type": "string",
"enum": [
"recent",
"title",
"amount_asc",
"amount_desc"
]
}
},
{
"name": "per_page",
"in": "query",
"schema": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"default": 12
}
},
{
"name": "page",
"in": "query",
"schema": {
"type": "integer",
"minimum": 1
}
},
{
"name": "zee_id",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
},
"description": "Current validated public association. AND with other filters."
},
{
"name": "zfi_id",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
},
"description": "Current validated public association. AND with other filters."
},
{
"name": "park_id",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
},
"description": "Current validated public association. AND with other filters."
},
{
"name": "dimension",
"in": "query",
"schema": {
"type": "string",
"enum": [
"cluster",
"corridor",
"zee",
"zfi"
]
},
"description": "Require a visible association in the selected dimension, preserving other filters."
},
{
"name": "view",
"in": "query",
"schema": {
"type": "string",
"enum": [
"grid",
"list",
"map",
"combined"
]
},
"description": "Presentation state retained in URL; does not alter permission checks."
},
{
"in": "query",
"name": "association_type",
"required": false,
"schema": {
"type": "string",
"enum": [
"corridor",
"location",
"cluster",
"project",
"chain",
"park",
"zone",
"sector",
"activity"
]
},
"x-qa-only": true
},
{
"in": "query",
"name": "association_target",
"required": false,
"schema": {
"type": "string",
"maxLength": 80
},
"x-qa-only": true
},
{
"in": "query",
"name": "association_state",
"required": false,
"schema": {
"type": "string",
"enum": [
"draft",
"preliminary",
"in_validation",
"confirmed",
"rejected",
"archived",
"revoked"
]
},
"x-qa-only": true
},
{
"in": "query",
"name": "association_purpose",
"required": false,
"schema": {
"type": "string"
},
"x-qa-only": true
},
{
"in": "query",
"name": "authority_id",
"required": false,
"schema": {
"type": "string",
"format": "uuid"
},
"x-qa-only": true
},
{
"in": "query",
"name": "chain_id",
"required": false,
"schema": {
"type": "string",
"format": "uuid"
},
"x-qa-only": true
},
{
"in": "query",
"name": "subsector_id",
"required": false,
"schema": {
"type": "string",
"format": "uuid"
},
"x-qa-only": true
},
{
"in": "query",
"name": "category",
"required": false,
"schema": {
"type": "string",
"enum": [
"investment_project",
"real_estate",
"land_rights",
"business_sale",
"business_partnership",
"franchise",
"concession",
"financing",
"supply",
"other"
]
},
"x-qa-only": true
},
{
"in": "query",
"name": "publication_state",
"required": false,
"schema": {
"type": "string",
"enum": [
"published"
]
},
"x-qa-only": true
}
],
"description": " Novos filtros QA: AND entre critérios; tipo/alvo/estado/finalidade na mesma associação; cadeia, atividade e entidade podem constar de outras relações da mesma oportunidade. Somente projeção editorial pública e alvos consultáveis. Map matched_count usa a mesma consulta. Filtros antigos dos pivôs continuam a representar vínculos anteriores, sem conversão automática."
}
},
"/compare": {
"get": {
"summary": "Comparar até quatro oportunidades publicadas.",
"responses": {
"200": {
"description": "Sucesso",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"records": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Detail"
}
}
}
}
}
}
},
"401": {
"description": "Sem sessão",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "Email não verificado / sem manage-portal",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Registo ausente ou invisível",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"409": {
"description": "Versão desactualizada / pedido submetido",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"419": {
"description": "Sessão / CSRF expirado",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"422": {
"description": "Validação",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"429": {
"description": "Limite de pedidos",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
},
"parameters": [
{
"name": "ids",
"in": "query",
"required": true,
"description": "Enviar ids[]=1&ids[]=2",
"schema": {
"type": "array",
"items": {
"type": "integer"
},
"minItems": 1,
"maxItems": 4,
"uniqueItems": true
}
}
]
}
},
"/export": {
"get": {
"summary": "CSV UTF-8 com BOM; até mil resultados; fórmulas neutralizadas.",
"responses": {
"200": {
"description": "CSV separado por ponto e vírgula",
"content": {
"text/csv": {
"schema": {
"type": "string"
}
}
}
},
"401": {
"description": "Sem sessão",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "Email não verificado / sem manage-portal",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Registo ausente ou invisível",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"409": {
"description": "Versão desactualizada / pedido submetido",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"419": {
"description": "Sessão / CSRF expirado",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"422": {
"description": "Validação",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"429": {
"description": "Limite de pedidos",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
},
"parameters": [
{
"name": "q",
"in": "query",
"schema": {
"type": "string",
"maxLength": 120
}
},
{
"name": "sector",
"in": "query",
"schema": {
"type": "string"
}
},
{
"name": "province",
"in": "query",
"schema": {
"type": "string"
}
},
{
"name": "district",
"in": "query",
"schema": {
"type": "string"
}
},
{
"name": "cluster_id",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "corridor_id",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "project_id",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "geo_location_id",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "education",
"in": "query",
"schema": {
"type": "boolean"
}
},
{
"name": "maturity_level",
"in": "query",
"schema": {
"type": "integer",
"minimum": 1,
"maximum": 6
}
},
{
"name": "facets",
"in": "query",
"schema": {
"type": "array",
"items": {
"type": "integer"
},
"maxItems": 20
}
},
{
"name": "min_amount",
"in": "query",
"schema": {
"type": "number",
"minimum": 0
}
},
{
"name": "max_amount",
"in": "query",
"schema": {
"type": "number",
"minimum": 0
}
},
{
"name": "currency",
"in": "query",
"schema": {
"type": "string",
"enum": [
"MZN",
"USD",
"EUR",
"ZAR"
]
}
},
{
"name": "before",
"in": "query",
"schema": {
"type": "string",
"format": "date"
}
},
{
"name": "sort",
"in": "query",
"schema": {
"type": "string",
"enum": [
"recent",
"title",
"amount_asc",
"amount_desc"
]
}
},
{
"name": "per_page",
"in": "query",
"schema": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"default": 12
}
},
{
"name": "page",
"in": "query",
"schema": {
"type": "integer",
"minimum": 1
}
},
{
"name": "zee_id",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
},
"description": "Current validated public association. AND with other filters."
},
{
"name": "zfi_id",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
},
"description": "Current validated public association. AND with other filters."
},
{
"name": "park_id",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
},
"description": "Current validated public association. AND with other filters."
},
{
"name": "dimension",
"in": "query",
"schema": {
"type": "string",
"enum": [
"cluster",
"corridor",
"zee",
"zfi"
]
},
"description": "Require a visible association in the selected dimension, preserving other filters."
},
{
"name": "view",
"in": "query",
"schema": {
"type": "string",
"enum": [
"grid",
"list",
"map",
"combined"
]
},
"description": "Presentation state retained in URL; does not alter permission checks."
},
{
"in": "query",
"name": "association_type",
"required": false,
"schema": {
"type": "string",
"enum": [
"corridor",
"location",
"cluster",
"project",
"chain",
"park",
"zone",
"sector",
"activity"
]
},
"x-qa-only": true
},
{
"in": "query",
"name": "association_target",
"required": false,
"schema": {
"type": "string",
"maxLength": 80
},
"x-qa-only": true
},
{
"in": "query",
"name": "association_state",
"required": false,
"schema": {
"type": "string",
"enum": [
"draft",
"preliminary",
"in_validation",
"confirmed",
"rejected",
"archived",
"revoked"
]
},
"x-qa-only": true
},
{
"in": "query",
"name": "association_purpose",
"required": false,
"schema": {
"type": "string"
},
"x-qa-only": true
},
{
"in": "query",
"name": "authority_id",
"required": false,
"schema": {
"type": "string",
"format": "uuid"
},
"x-qa-only": true
},
{
"in": "query",
"name": "chain_id",
"required": false,
"schema": {
"type": "string",
"format": "uuid"
},
"x-qa-only": true
},
{
"in": "query",
"name": "subsector_id",
"required": false,
"schema": {
"type": "string",
"format": "uuid"
},
"x-qa-only": true
},
{
"in": "query",
"name": "category",
"required": false,
"schema": {
"type": "string",
"enum": [
"investment_project",
"real_estate",
"land_rights",
"business_sale",
"business_partnership",
"franchise",
"concession",
"financing",
"supply",
"other"
]
},
"x-qa-only": true
},
{
"in": "query",
"name": "publication_state",
"required": false,
"schema": {
"type": "string",
"enum": [
"published"
]
},
"x-qa-only": true
}
],
"description": " Novos filtros QA: AND entre critérios; tipo/alvo/estado/finalidade na mesma associação; cadeia, atividade e entidade podem constar de outras relações da mesma oportunidade. Somente projeção editorial pública e alvos consultáveis. Map matched_count usa a mesma consulta. Filtros antigos dos pivôs continuam a representar vínculos anteriores, sem conversão automática."
}
},
"/favourites/{id}": {
"post": {
"summary": "Guardar/retirar favorito próprio.",
"responses": {
"200": {
"description": "Sucesso",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"saved": {
"type": "boolean"
}
}
}
}
}
},
"401": {
"description": "Sem sessão",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "Email não verificado / sem manage-portal",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Registo ausente ou invisível",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"409": {
"description": "Versão desactualizada / pedido submetido",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"419": {
"description": "Sessão / CSRF expirado",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"422": {
"description": "Validação",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"429": {
"description": "Limite de pedidos",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
},
"security": [
{
"session": [],
"csrf": []
}
],
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "integer"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"saved": {
"type": "boolean"
}
},
"required": [
"saved"
]
}
}
}
}
}
},
"/submissions": {
"get": {
"summary": "Manifestações próprias (20/página) e favoritos publicados.",
"responses": {
"200": {
"description": "Sucesso",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"submissions": {
"type": "object",
"properties": {},
"description": "Paginator Laravel: data, total, current_page, next_page_url, prev_page_url; linhas com id,status,version,created_at,reference,request_status."
},
"favourites": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Opportunity"
}
}
}
}
}
}
},
"401": {
"description": "Sem sessão",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "Email não verificado / sem manage-portal",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Registo ausente ou invisível",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"409": {
"description": "Versão desactualizada / pedido submetido",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"419": {
"description": "Sessão / CSRF expirado",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"422": {
"description": "Validação",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"429": {
"description": "Limite de pedidos",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
},
"security": [
{
"session": []
}
],
"parameters": [
{
"name": "page",
"in": "query",
"schema": {
"type": "integer"
}
}
]
},
"post": {
"summary": "Criar rascunho próprio; no máximo um destino publicado; 10/min.",
"responses": {
"201": {
"description": "Sucesso",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"version": {
"type": "integer"
}
}
}
}
}
},
"401": {
"description": "Sem sessão",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "Email não verificado / sem manage-portal",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Registo ausente ou invisível",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"409": {
"description": "Versão desactualizada / pedido submetido",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"419": {
"description": "Sessão / CSRF expirado",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"422": {
"description": "Validação",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"429": {
"description": "Limite de pedidos",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
},
"security": [
{
"session": [],
"csrf": []
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"opportunity_id": {
"type": "integer",
"nullable": true
},
"dossier_id": {
"type": "string",
"format": "uuid",
"nullable": true
},
"company_id": {
"type": "string",
"format": "uuid",
"nullable": true,
"description": "Declaração de empresa do próprio utilizador, usada para pré-preenchimento."
},
"zone_id": {
"type": "string",
"format": "uuid",
"nullable": true,
"description": "Published zone origin; may combine with a publicly associated opportunity, not with dossier_id or company_id."
},
"intent": {
"type": "string",
"enum": [
"interest",
"dossier",
"meeting"
],
"description": "Required with zone_id. Reuses the existing draft for this user, zone version, opportunity and intent."
}
}
}
}
}
}
}
},
"/submissions/{id}": {
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"format": "uuid"
}
}
],
"get": {
"summary": "Consultar pedido próprio ou, com manage-portal, pedido em atendimento.",
"responses": {
"200": {
"description": "Sucesso",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"submission": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"version": {
"type": "integer"
},
"status": {
"type": "string"
},
"payload": {
"$ref": "#/components/schemas/Payload"
}
}
},
"needs": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Need"
}
},
"references": {
"$ref": "#/components/schemas/References"
},
"attachments": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"file_name": {
"type": "string"
}
}
}
},
"events": {
"type": "array",
"items": {
"type": "object",
"properties": {
"action": {
"type": "string"
},
"version": {
"type": "integer"
},
"created_at": {
"type": "string",
"format": "date-time"
}
}
}
},
"receipt": {
"type": "object",
"properties": {
"reference": {
"type": "string"
},
"status": {
"type": "string"
}
},
"nullable": true
},
"messages": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"sender_role": {
"type": "string",
"enum": [
"investor",
"support"
]
},
"body": {
"type": "string"
},
"created_at": {
"type": "string",
"format": "date-time"
}
}
}
},
"revisions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"version": {
"type": "integer"
},
"created_at": {
"type": "string",
"format": "date-time"
}
}
}
}
}
}
}
}
},
"401": {
"description": "Sem sessão",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "Email não verificado / sem manage-portal",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Registo ausente ou invisível",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"409": {
"description": "Versão desactualizada / pedido submetido",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"419": {
"description": "Sessão / CSRF expirado",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"422": {
"description": "Validação",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"429": {
"description": "Limite de pedidos",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
},
"security": [
{
"session": []
}
]
},
"put": {
"summary": "Guardar rascunho próprio com versão optimista; 30/min.",
"responses": {
"200": {
"description": "Sucesso",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Version"
}
}
}
},
"401": {
"description": "Sem sessão",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "Email não verificado / sem manage-portal",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Registo ausente ou invisível",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"409": {
"description": "Versão desactualizada / pedido submetido",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"419": {
"description": "Sessão / CSRF expirado",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"422": {
"description": "Validação",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"429": {
"description": "Limite de pedidos",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
},
"security": [
{
"session": [],
"csrf": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Draft"
}
}
}
}
}
},
"/submissions/{id}/submit": {
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"format": "uuid"
}
}
],
"post": {
"summary": "Submeter atomicamente; reenvio devolve protocolo e estado existentes; 10/min.",
"responses": {
"200": {
"description": "Sucesso",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"reference": {
"type": "string"
},
"status": {
"type": "string"
}
}
}
}
}
},
"401": {
"description": "Sem sessão",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "Email não verificado / sem manage-portal",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Registo ausente ou invisível",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"409": {
"description": "Versão desactualizada / pedido submetido",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"419": {
"description": "Sessão / CSRF expirado",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"422": {
"description": "Validação",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"429": {
"description": "Limite de pedidos",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
},
"security": [
{
"session": [],
"csrf": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Draft"
}
}
}
},
"description": "Somente titular. Exige campos finais e consentimento. Um recibo e uma outbox de CRM; sem activação de conector externo."
}
},
"/submissions/{id}/attachments": {
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"format": "uuid"
}
}
],
"post": {
"summary": "Carregar anexo privado em rascunho; 10/min.",
"responses": {
"200": {
"description": "Sucesso",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Version"
}
}
}
},
"401": {
"description": "Sem sessão",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "Email não verificado / sem manage-portal",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Registo ausente ou invisível",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"409": {
"description": "Versão desactualizada / pedido submetido",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"419": {
"description": "Sessão / CSRF expirado",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"422": {
"description": "Validação",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"429": {
"description": "Limite de pedidos",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
},
"security": [
{
"session": [],
"csrf": []
}
],
"requestBody": {
"required": true,
"content": {
"multipart/form-data": {
"schema": {
"type": "object",
"properties": {
"version": {
"type": "integer"
},
"file": {
"type": "string",
"format": "binary",
"description": "PDF/TXT até 10 MiB; máximo dez anexos."
}
},
"required": [
"version",
"file"
]
}
}
}
}
}
},
"/submissions/{id}/attachments/{attachment}": {
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "attachment",
"in": "path",
"required": true,
"schema": {
"type": "string",
"format": "uuid"
}
}
],
"get": {
"summary": "Download privado após validar titular/gestor, caminho, estado e checksum.",
"responses": {
"200": {
"description": "Attachment; no-store, nosniff",
"content": {
"application/octet-stream": {
"schema": {
"type": "string",
"format": "binary"
}
}
}
},
"401": {
"description": "Sem sessão",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "Email não verificado / sem manage-portal",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Registo ausente ou invisível",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"409": {
"description": "Versão desactualizada / pedido submetido",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"419": {
"description": "Sessão / CSRF expirado",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"422": {
"description": "Validação",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"429": {
"description": "Limite de pedidos",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
},
"security": [
{
"session": []
}
]
}
},
"/admin/opportunities/{id}/context": {
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "integer"
}
}
],
"put": {
"summary": "Gestor altera contexto; devolve oportunidade a rascunho.",
"responses": {
"200": {
"description": "Sucesso",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Version"
}
}
}
},
"401": {
"description": "Sem sessão",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "Email não verificado / sem manage-portal",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Registo ausente ou invisível",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"409": {
"description": "Versão desactualizada / pedido submetido",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"419": {
"description": "Sessão / CSRF expirado",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"422": {
"description": "Validação",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"429": {
"description": "Limite de pedidos",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
},
"security": [
{
"session": [],
"csrf": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ContextInput"
}
}
}
},
"description": "manage-portal obrigatório. version=0 antes da criação do perfil. Opções activas, entidades não eliminadas. Não publica."
}
},
"/admin/references": {
"post": {
"summary": "Gestor cria/actualiza opção; grupo e código estáveis.",
"responses": {
"200": {
"description": "Sucesso",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"id": {
"type": "integer"
}
}
}
}
}
},
"401": {
"description": "Sem sessão",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "Email não verificado / sem manage-portal",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Registo ausente ou invisível",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"409": {
"description": "Versão desactualizada / pedido submetido",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"419": {
"description": "Sessão / CSRF expirado",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"422": {
"description": "Validação",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"429": {
"description": "Limite de pedidos",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
},
"security": [
{
"session": [],
"csrf": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Option"
}
}
}
},
"description": "manage-portal obrigatório. Grupo existente; Outro mantém actividade e requires_description. Sem eliminação histórica."
}
},
"/admin/references/{id}": {
"post": {
"summary": "Gestor cria/actualiza opção; grupo e código estáveis.",
"responses": {
"200": {
"description": "Sucesso",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"id": {
"type": "integer"
}
}
}
}
}
},
"401": {
"description": "Sem sessão",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "Email não verificado / sem manage-portal",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Registo ausente ou invisível",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"409": {
"description": "Versão desactualizada / pedido submetido",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"419": {
"description": "Sessão / CSRF expirado",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"422": {
"description": "Validação",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"429": {
"description": "Limite de pedidos",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
},
"security": [
{
"session": [],
"csrf": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Option"
}
}
}
},
"description": "manage-portal obrigatório. Grupo existente; Outro mantém actividade e requires_description. Sem eliminação histórica."
},
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "integer"
}
}
]
},
"/profile": {
"get": {
"summary": "Perfil privado e empresas declaradas do titular.",
"security": [
{
"session": []
}
],
"responses": {
"200": {
"description": "Sucesso",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"account": {
"$ref": "#/components/schemas/InvestorAccount"
},
"companies": {
"type": "array",
"items": {
"$ref": "#/components/schemas/CompanyDeclaration"
}
}
}
}
}
}
},
"401": {
"description": "Sem sessão",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "Email não verificado / sem manage-portal",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Registo ausente ou invisível",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"409": {
"description": "Versão desactualizada / pedido submetido",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"419": {
"description": "Sessão / CSRF expirado",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"422": {
"description": "Validação",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"429": {
"description": "Limite de pedidos",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
},
"put": {
"summary": "Guardar perfil privado com versão; 20/min.",
"security": [
{
"session": [],
"csrf": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/InvestorAccount"
}
}
}
},
"description": "version=0 inicialmente. Campos desconhecidos recusados; não altera nome/email nem concede representação de empresa.",
"responses": {
"200": {
"description": "Sucesso",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Version"
}
}
}
},
"401": {
"description": "Sem sessão",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "Email não verificado / sem manage-portal",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Registo ausente ou invisível",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"409": {
"description": "Versão desactualizada / pedido submetido",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"419": {
"description": "Sessão / CSRF expirado",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"422": {
"description": "Validação",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"429": {
"description": "Limite de pedidos",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/companies": {
"post": {
"summary": "Guardar declaração privada de empresa; 20/min.",
"security": [
{
"session": [],
"csrf": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CompanyDeclaration"
}
}
}
},
"description": "Titular apenas. Máximo vinte declarações; versão zero para criar. Não cria memberships nem altera organizações canónicas.",
"responses": {
"200": {
"description": "Sucesso",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"version": {
"type": "integer"
}
}
}
}
}
},
"401": {
"description": "Sem sessão",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "Email não verificado / sem manage-portal",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Registo ausente ou invisível",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"409": {
"description": "Versão desactualizada / pedido submetido",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"419": {
"description": "Sessão / CSRF expirado",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"422": {
"description": "Validação",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"429": {
"description": "Limite de pedidos",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/companies/{id}": {
"post": {
"summary": "Guardar declaração privada de empresa; 20/min.",
"security": [
{
"session": [],
"csrf": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CompanyDeclaration"
}
}
}
},
"description": "Titular apenas. Máximo vinte declarações; versão zero para criar. Não cria memberships nem altera organizações canónicas.",
"responses": {
"200": {
"description": "Sucesso",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"version": {
"type": "integer"
}
}
}
}
}
},
"401": {
"description": "Sem sessão",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "Email não verificado / sem manage-portal",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Registo ausente ou invisível",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"409": {
"description": "Versão desactualizada / pedido submetido",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"419": {
"description": "Sessão / CSRF expirado",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"422": {
"description": "Validação",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"429": {
"description": "Limite de pedidos",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
},
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"format": "uuid"
}
}
]
},
"/notifications": {
"get": {
"summary": "Notificações próprias, vinte por página, e contagem não lida.",
"security": [
{
"session": []
}
],
"parameters": [
{
"name": "page",
"in": "query",
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "Sucesso",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"unread": {
"type": "integer"
},
"notifications": {
"type": "object",
"properties": {},
"description": "Paginator Laravel com data: id,submission_id,kind,payload,read_at,created_at. Tipos received,status,message. Sem email externo."
}
}
}
}
}
},
"401": {
"description": "Sem sessão",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "Email não verificado / sem manage-portal",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Registo ausente ou invisível",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"409": {
"description": "Versão desactualizada / pedido submetido",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"419": {
"description": "Sessão / CSRF expirado",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"422": {
"description": "Validação",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"429": {
"description": "Limite de pedidos",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/notifications/{id}/read": {
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"format": "uuid"
}
}
],
"post": {
"summary": "Marcar notificação própria como lida; idempotente.",
"security": [
{
"session": [],
"csrf": []
}
],
"responses": {
"200": {
"description": "Sucesso",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"read": {
"type": "boolean"
}
}
}
}
}
},
"401": {
"description": "Sem sessão",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "Email não verificado / sem manage-portal",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Registo ausente ou invisível",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"409": {
"description": "Versão desactualizada / pedido submetido",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"419": {
"description": "Sessão / CSRF expirado",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"422": {
"description": "Validação",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"429": {
"description": "Limite de pedidos",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/submissions/{id}/messages": {
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"format": "uuid"
}
}
],
"post": {
"summary": "Mensagem privada em pedido submetido; 10/min.",
"security": [
{
"session": [],
"csrf": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"client_key": {
"type": "string",
"format": "uuid"
},
"body": {
"type": "string",
"minLength": 3,
"maxLength": 5000
}
},
"required": [
"client_key",
"body"
]
}
}
}
},
"description": "Titular ou gestor. Mesma chave e texto devolvem a mensagem existente. Chave reutilizada com texto diferente:409. Texto encriptado; auditoria sem corpo. Cria notificações internas para a outra parte.",
"responses": {
"200": {
"description": "Sucesso",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
}
}
}
}
}
},
"401": {
"description": "Sem sessão",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "Email não verificado / sem manage-portal",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Registo ausente ou invisível",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"409": {
"description": "Versão desactualizada / pedido submetido",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"419": {
"description": "Sessão / CSRF expirado",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"422": {
"description": "Validação",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"429": {
"description": "Limite de pedidos",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/submissions/{id}/revisions/{version}": {
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "version",
"in": "path",
"required": true,
"schema": {
"type": "integer",
"minimum": 1
}
}
],
"get": {
"summary": "Consultar versão histórica encriptada do pedido.",
"security": [
{
"session": []
}
],
"description": "Titular ou gestor actual. Só versões gravadas após esta extensão. Não altera nem restaura automaticamente o pedido; no-store.",
"responses": {
"200": {
"description": "Sucesso",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"version": {
"type": "integer"
},
"snapshot": {
"type": "object",
"properties": {
"payload": {
"$ref": "#/components/schemas/Payload"
},
"status": {
"type": "string"
},
"needs": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Need"
}
},
"attachment_ids": {
"type": "array",
"items": {
"type": "string",
"format": "uuid"
}
}
}
}
}
}
}
}
},
"401": {
"description": "Sem sessão",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "Email não verificado / sem manage-portal",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Registo ausente ou invisível",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"409": {
"description": "Versão desactualizada / pedido submetido",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"419": {
"description": "Sessão / CSRF expirado",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"422": {
"description": "Validação",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"429": {
"description": "Limite de pedidos",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/admin/interests/{interest}/status": {
"parameters": [
{
"name": "interest",
"in": "path",
"required": true,
"schema": {
"type": "integer"
}
}
],
"patch": {
"summary": "Gestor actualiza estado de atendimento e notifica o titular quando muda.",
"security": [
{
"session": [],
"csrf": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"status"
],
"properties": {
"status": {
"type": "string",
"enum": [
"received",
"in_review",
"contacted",
"closed"
]
}
}
}
}
}
},
"responses": {
"200": {
"description": "Sucesso",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"reference": {
"type": "string"
},
"status": {
"type": "string"
}
}
}
}
}
},
"401": {
"description": "Sem sessão",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "Email não verificado / sem manage-portal",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Registo ausente ou invisível",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"409": {
"description": "Versão desactualizada / pedido submetido",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"419": {
"description": "Sessão / CSRF expirado",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"422": {
"description": "Validação",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"429": {
"description": "Limite de pedidos",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
},
"description": "Exige manage-portal. Alteração transaccional com auditoria. Repetir o mesmo estado não cria outra notificação."
}
},
"/minhas-oportunidades/{id}/classification": {
"servers": [
{
"url": "/"
}
],
"get": {
"x-qa-only": true,
"summary": "Recuperar associações, metadados e versões anteriores autorizadas",
"description": "Sessão web Laravel verificada; autorização view do mesmo cadastro. Resposta Cache-Control private,no-store. Sem novo papel. Candidatos a duplicação limitados ao âmbito já autorizado e a título exato; nenhuma fusão.",
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "integer",
"minimum": 1
}
}
],
"responses": {
"200": {
"description": "Sucesso"
},
"401": {
"description": "Sessão necessária"
},
"403": {
"description": "Âmbito, responsabilidade, MFA ou independência insuficientes"
},
"404": {
"description": "Registo inexistente"
},
"409": {
"description": "Versão ou associação mudou"
},
"422": {
"description": "Campos ou fundamento insuficientes"
}
}
}
},
"/minhas-oportunidades/{id}/classification/review": {
"servers": [
{
"url": "/"
}
],
"post": {
"x-qa-only": true,
"summary": "Decidir confirmação de uma associação, sem transição editorial",
"description": "Validador no âmbito da oportunidade; technical_reviewer ou legal_reviewer para dimensão regulatória, MFA efetiva e independência já aprovados. CSRF. Um 200 não publica a relação nem concede ato externo. Hash da relação e versão documental vinculam a decisão. Versão anterior publicada pode ser revogada após correção privada.",
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "integer",
"minimum": 1
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"etag",
"hash",
"state",
"reason"
],
"properties": {
"etag": {
"type": "string",
"minLength": 64,
"maxLength": 64
},
"hash": {
"type": "string",
"minLength": 64,
"maxLength": 64
},
"state": {
"type": "string",
"enum": [
"in_validation",
"confirmed",
"rejected",
"archived",
"revoked"
]
},
"reason": {
"type": "string",
"minLength": 20,
"maxLength": 1000
}
}
}
}
}
},
"responses": {
"200": {
"description": "Sucesso"
},
"401": {
"description": "Sessão necessária"
},
"403": {
"description": "Âmbito, responsabilidade, MFA ou independência insuficientes"
},
"404": {
"description": "Registo inexistente"
},
"409": {
"description": "Versão ou associação mudou"
},
"422": {
"description": "Campos ou fundamento insuficientes"
}
}
}
}
},
"components": {
"securitySchemes": {
"session": {
"type": "apiKey",
"in": "cookie",
"name": "laravel_session",
"description": "Nome configurável SESSION_COOKIE; autenticar pelo fluxo web."
},
"csrf": {
"type": "apiKey",
"in": "header",
"name": "X-XSRF-TOKEN",
"description": "Valor descodificado do cookie XSRF-TOKEN."
}
},
"schemas": {
"Error": {
"type": "object",
"properties": {
"message": {
"type": "string"
},
"errors": {
"type": "object",
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
},
"Version": {
"type": "object",
"properties": {
"version": {
"type": "integer"
}
}
},
"Entity": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"name": {
"type": "string"
}
}
},
"Option": {
"type": "object",
"required": [
"group",
"code",
"label",
"active",
"requires_description",
"sort_order"
],
"properties": {
"id": {
"type": "integer"
},
"group": {
"type": "string"
},
"code": {
"type": "string",
"maxLength": 80,
"pattern": "^[a-zA-Z0-9_-]+$"
},
"label": {
"type": "string",
"maxLength": 200
},
"active": {
"type": "boolean"
},
"requires_description": {
"type": "boolean"
},
"sort_order": {
"type": "integer",
"minimum": 0,
"maximum": 10000
}
}
},
"Payload": {
"type": "object",
"additionalProperties": false,
"properties": {
"full_name": {
"type": "string",
"nullable": true,
"maxLength": 150
},
"email": {
"type": "string",
"nullable": true,
"maxLength": 150
},
"phone": {
"type": "string",
"nullable": true
},
"country": {
"type": "string",
"nullable": true
},
"organisation": {
"type": "string",
"nullable": true
},
"representative_role": {
"type": "string",
"nullable": true
},
"experience": {
"type": "string",
"nullable": true
},
"investment_capacity": {
"type": "string",
"nullable": true
},
"sector": {
"type": "string",
"nullable": true
},
"objective": {
"type": "string",
"maxLength": 5000,
"nullable": true
},
"currency": {
"type": "string",
"nullable": true
},
"horizon": {
"type": "string",
"nullable": true
},
"location": {
"type": "string",
"nullable": true
},
"other_details": {
"type": "string",
"nullable": true
},
"contact_consent": {
"type": "boolean"
},
"estimated_amount": {
"type": "number",
"minimum": 0,
"nullable": true
},
"profile_id": {
"type": "integer",
"nullable": true
},
"participation_id": {
"type": "integer",
"nullable": true
},
"partnership_id": {
"type": "integer",
"nullable": true
},
"cluster_ids": {
"type": "array",
"items": {
"type": "string",
"format": "uuid"
},
"maxItems": 20,
"uniqueItems": true
},
"corridor_ids": {
"type": "array",
"items": {
"type": "string",
"format": "uuid"
},
"maxItems": 20,
"uniqueItems": true
},
"project_ids": {
"type": "array",
"items": {
"type": "string",
"format": "uuid"
},
"maxItems": 30,
"uniqueItems": true
}
},
"description": "Para submeter: full_name, email, country, profile_id, sector, objective, participation_id e horizon obrigatórios; contact_consent=true. Moeda obrigatória com montante. Outro exige other_details. Opções activas do grupo correcto. Drafts permit incomplete name, email and objective. Submission requires a name of at least 3 characters, RFC email and objective of at least 20 characters."
},
"Draft": {
"type": "object",
"required": [
"version",
"payload"
],
"properties": {
"version": {
"type": "integer",
"minimum": 1
},
"payload": {
"$ref": "#/components/schemas/Payload"
},
"needs": {
"type": "array",
"maxItems": 40,
"items": {
"$ref": "#/components/schemas/Need"
}
}
}
},
"Need": {
"type": "object",
"additionalProperties": false,
"required": [
"category_id",
"option_id",
"details"
],
"properties": {
"category_id": {
"type": "integer"
},
"option_id": {
"type": "integer"
},
"unit_id": {
"type": "integer",
"nullable": true
},
"priority_id": {
"type": "integer",
"nullable": true
},
"quantity": {
"type": "number",
"nullable": true,
"minimum": 0,
"maximum": 999999999999
},
"deadline": {
"type": "string",
"format": "date",
"nullable": true
},
"details": {
"type": "object",
"additionalProperties": false,
"required": [
"description"
],
"properties": {
"description": {
"type": "string",
"nullable": false,
"maxLength": 2000,
"minLength": 3
},
"location": {
"type": "string",
"nullable": true,
"maxLength": 2000
},
"observations": {
"type": "string",
"nullable": true,
"maxLength": 2000
},
"qualification": {
"type": "string",
"nullable": true,
"maxLength": 2000
},
"specialty": {
"type": "string",
"nullable": true,
"maxLength": 2000
},
"experience": {
"type": "string",
"nullable": true,
"maxLength": 2000
},
"certifications": {
"type": "string",
"nullable": true,
"maxLength": 2000
},
"availability": {
"type": "string",
"nullable": true,
"maxLength": 2000
},
"institution": {
"type": "string",
"nullable": true,
"maxLength": 2000
},
"training_mode": {
"type": "string",
"nullable": true,
"maxLength": 2000
},
"duration": {
"type": "string",
"nullable": true,
"maxLength": 2000
},
"status": {
"type": "string",
"nullable": true,
"maxLength": 2000
}
}
}
}
},
"Opportunity": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"title": {
"type": "string"
},
"slug": {
"type": "string"
},
"reference": {
"type": "string"
},
"summary": {
"type": "string",
"nullable": true
},
"province": {
"type": "string",
"nullable": true
},
"district": {
"type": "string",
"nullable": true
},
"estimated_investment_amount": {
"type": "string",
"nullable": true,
"example": "1500000.00"
},
"estimated_investment_currency": {
"type": "string"
},
"maturity_label": {
"type": "string",
"nullable": true
},
"status": {
"type": "string"
},
"sector": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"name": {
"type": "string"
},
"slug": {
"type": "string"
}
}
}
}
},
"Page": {
"type": "object",
"properties": {
"current_page": {
"type": "integer"
},
"per_page": {
"type": "integer"
},
"total": {
"type": "integer"
},
"last_page": {
"type": "integer"
},
"next_page_url": {
"type": "string",
"nullable": true
},
"prev_page_url": {
"type": "string",
"nullable": true
},
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Opportunity"
}
}
}
},
"ContextInput": {
"type": "object",
"required": [
"version",
"is_education",
"source_reference"
],
"properties": {
"version": {
"type": "integer",
"minimum": 0
},
"is_education": {
"type": "boolean"
},
"source_reference": {
"type": "string",
"minLength": 10,
"maxLength": 2000
},
"business_model": {
"type": "string",
"maxLength": 5000,
"nullable": true
},
"requirements": {
"type": "string",
"maxLength": 10000,
"nullable": true
},
"risks": {
"type": "string",
"maxLength": 5000,
"nullable": true
},
"target_date": {
"type": "string",
"format": "date",
"nullable": true
},
"facets": {
"type": "array",
"maxItems": 100,
"items": {
"type": "integer"
},
"uniqueItems": true
},
"clusters": {
"type": "array",
"maxItems": 100,
"items": {
"type": "string",
"format": "uuid"
},
"uniqueItems": true
},
"corridors": {
"type": "array",
"maxItems": 100,
"items": {
"type": "string",
"format": "uuid"
},
"uniqueItems": true
},
"projects": {
"type": "array",
"maxItems": 100,
"items": {
"type": "string",
"format": "uuid"
},
"uniqueItems": true
},
"locations": {
"type": "array",
"maxItems": 100,
"items": {
"type": "string",
"format": "uuid"
},
"uniqueItems": true
}
}
},
"Context": {
"type": "object",
"properties": {
"profile": {
"type": "object",
"nullable": true,
"properties": {
"version": {
"type": "integer",
"minimum": 0
},
"is_education": {
"type": "boolean"
},
"source_reference": {
"type": "string",
"minLength": 10,
"maxLength": 2000
},
"business_model": {
"type": "string",
"maxLength": 5000,
"nullable": true
},
"requirements": {
"type": "string",
"maxLength": 10000,
"nullable": true
},
"risks": {
"type": "string",
"maxLength": 5000,
"nullable": true
},
"target_date": {
"type": "string",
"format": "date",
"nullable": true
},
"facets": {
"type": "array",
"maxItems": 100,
"items": {
"type": "integer"
},
"uniqueItems": true
},
"clusters": {
"type": "array",
"maxItems": 100,
"items": {
"type": "string",
"format": "uuid"
},
"uniqueItems": true
},
"corridors": {
"type": "array",
"maxItems": 100,
"items": {
"type": "string",
"format": "uuid"
},
"uniqueItems": true
},
"projects": {
"type": "array",
"maxItems": 100,
"items": {
"type": "string",
"format": "uuid"
},
"uniqueItems": true
},
"locations": {
"type": "array",
"maxItems": 100,
"items": {
"type": "string",
"format": "uuid"
},
"uniqueItems": true
}
}
},
"facets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"group": {
"type": "string"
},
"label": {
"type": "string"
}
}
}
},
"clusters": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Entity"
}
},
"corridors": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Entity"
}
},
"projects": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Entity"
}
},
"locations": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Entity"
}
}
}
},
"References": {
"type": "object",
"properties": {
"options": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Option"
}
},
"sectors": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"name": {
"type": "string"
},
"slug": {
"type": "string"
}
}
}
},
"clusters": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Entity"
}
},
"corridors": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Entity"
}
},
"projects": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Entity"
}
},
"locations": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Entity"
}
}
}
},
"Detail": {
"type": "object",
"properties": {
"record": {
"$ref": "#/components/schemas/Opportunity"
},
"context": {
"$ref": "#/components/schemas/Context"
}
}
},
"Map": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"FeatureCollection"
]
},
"limit": {
"type": "integer",
"enum": [
1000
]
},
"features": {
"type": "array",
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"Feature"
]
},
"geometry": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"Point"
]
},
"coordinates": {
"type": "array",
"minItems": 2,
"maxItems": 2,
"items": {
"type": "number"
}
}
}
},
"properties": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"title": {
"type": "string"
},
"location": {
"type": "string"
},
"url": {
"type": "string"
}
}
}
}
}
}
}
},
"InvestorAccount": {
"type": "object",
"properties": {
"version": {
"type": "integer"
},
"payload": {
"type": "object",
"properties": {
"phone": {
"type": "string",
"nullable": true
},
"country": {
"type": "string",
"nullable": true
},
"sector": {
"type": "string",
"nullable": true
},
"experience": {
"type": "string",
"nullable": true
},
"investment_capacity": {
"type": "string",
"nullable": true
}
}
}
},
"required": [
"version",
"payload"
]
},
"CompanyDeclaration": {
"type": "object",
"properties": {
"version": {
"type": "integer"
},
"payload": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"country": {
"type": "string"
},
"registration": {
"type": "string"
},
"sector": {
"type": "string"
},
"role": {
"type": "string"
},
"description": {
"type": "string"
}
},
"required": [
"name",
"country",
"role"
],
"additionalProperties": false
}
},
"required": [
"version",
"payload"
]
}
}
}
}