{ "openapi": "3.0.0", "info": { "title": "Olie API", "version": "1.0.0", "description": "# Introdução 👋\n\nOlá! Esta é a documentação oficial da API da [olie.ai](https://olie.ai/). Aqui você encontra as referências e exemplos de uso dos nossos endpoints.\n\nPara uma visão completa, recomendamos fortemente que você leia a [documentação oficial](https://docs.olie.ai/api-reference/introduction). Lá estão detalhados tópicos essenciais como [autenticação](https://docs.olie.ai/api-reference/introduction/authentication), [estrutura de respostas](https://docs.olie.ai/api-reference/general/response-structure), [paginação](https://docs.olie.ai/api-reference/general/pagination) e outros guias de integração.\n\nNo Postman, esta coleção foca nas informações específicas de cada requisição (endpoints, parâmetros e exemplos), servindo como apoio rápido para testes e desenvolvimento.\n" }, "servers": [ { "url": "https://api.olie.ai" } ], "paths": { "/api/management/projects/{id}/restore": { "get": { "summary": "Restaurar um projeto", "responses": { "200": { "description": "Resposta de sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." } }, "description": "Confirmação de que a operação foi concluída.", "required": [ "response" ] }, "example": { "response": "" } } } }, "401": { "description": "Não autorizado", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." } }, "required": [ "response", "message", "error" ] }, "example": { "response": "", "message": "", "error": "" } } } }, "404": { "description": "Não encontrado", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." } }, "required": [ "response", "message", "error" ] }, "example": { "response": false, "message": "project_model_not_found", "error": "No query results for model [App\\Models\\Project] :id" } } } } }, "tags": [ "projects", "Projetos" ], "description": "Restaura um projeto que foi deletado, devolvendo-o às listagens com todos os vínculos que tinha." }, "parameters": [ { "name": "id", "in": "path", "required": true, "description": "ID (UUID) do projeto deletado.", "schema": { "type": "string", "format": "uuid" }, "example": "{{project_id}}" } ] }, "/api/management/projects/{id}/media": { "get": { "summary": "Listar conteúdos do projeto", "parameters": [ { "name": "page", "in": "query", "description": "Número da página a ser retornada. Começa em 1", "schema": { "type": "integer" }, "example": 1 }, { "name": "perPage", "in": "query", "description": "Quantidade de itens exibidos por página. Define o tamanho da página de resultados", "schema": { "type": "integer" }, "example": 30 }, { "name": "filter", "in": "query", "description": "Filtro aplicado ao resultado. Valores possíveis: logs, content, default.", "schema": { "type": "string" }, "example": "default" } ], "responses": { "200": { "description": "Lista de conteúdos do projeto retornada com sucesso", "content": { "application/json": { "schema": { "description": "Esquema de um conteúdo", "title": "Resposta de conteúdo", "type": "object", "properties": { "response": { "type": "boolean", "example": true }, "meta": { "type": "object", "title": "Informações de Paginação", "description": "Metadados de paginação", "properties": { "current_page": { "type": "integer", "example": 1 }, "from": { "type": "integer", "example": 1 }, "last_page": { "type": "integer", "example": 19 }, "per_page": { "type": "integer", "example": 30 }, "to": { "type": "integer", "example": 30 }, "total": { "type": "integer", "example": 546 } } }, "medias": { "type": "array", "items": { "title": "Media", "type": "object", "properties": { "id": { "type": "string", "format": "uuid" }, "name": { "type": "string" }, "technical_name": { "type": "string" }, "type": { "type": "integer" }, "extension": { "type": "string" }, "text": { "type": "string" }, "file_url": { "type": "string", "format": "uri" }, "log": { "type": "string" }, "user_id": { "type": "string", "format": "uuid" }, "frame_id": { "type": "string", "format": "uuid" }, "project_id": { "type": "string", "format": "uuid" }, "channel_id": { "type": "string", "description": "ID (UUID) do canal, quando o conteúdo veio de uma conversa.", "format": "uuid" }, "direction": { "type": "string", "description": "Direção do conteúdo no canal (entrada ou saída), quando aplicável." }, "origin": { "type": "string", "description": "Origem do conteúdo (ex.: integração ou compositor interno)." }, "external_message_id": { "type": "string", "description": "ID da mensagem na integração externa, quando houver." }, "task_id": { "type": "string", "description": "ID (UUID) da tarefa vinculada, quando o conteúdo pertence a uma tarefa.", "format": "uuid" }, "delivery_error": { "type": "string", "description": "Erro de entrega na integração, quando o envio falhou." }, "created_at": { "type": "string", "format": "date-time" }, "updated_at": { "type": "string", "format": "date-time" }, "deleted_at": { "type": "string", "format": "date-time" }, "user": { "type": "object" }, "project": { "type": "object", "description": "Projeto relacionado, quando carregado." } } } } } }, "example": { "response": "", "meta": { "current_page": "", "from": "", "last_page": "", "per_page": "", "to": "", "total": "" }, "medias": [ { "id": "", "name": "", "technical_name": "", "type": "", "extension": "", "text": "", "file_url": "", "log": "", "user_id": "", "frame_id": "", "project_id": "", "channel_id": null, "direction": null, "origin": null, "external_message_id": null, "task_id": null, "delivery_error": null, "created_at": "", "updated_at": "", "deleted_at": "", "user": {} }, { "id": "", "name": "", "technical_name": "", "type": "", "extension": "", "text": "", "file_url": "", "log": "", "user_id": "", "frame_id": "", "project_id": "", "channel_id": null, "direction": null, "origin": null, "external_message_id": null, "task_id": null, "delivery_error": null, "created_at": "", "updated_at": "", "deleted_at": "", "user": {} } ] } } } }, "401": { "description": "Não autorizado", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "example": false }, "message": { "type": "string", "example": "unauthorized" }, "error": { "type": "string", "example": "Unauthenticated." } } }, "example": { "response": "", "message": "", "error": "" } } } } }, "tags": [ "projects", "{id}", "medias" ], "description": "Retorna uma lista de conteúdos do projeto com base nos filtros fornecidos." }, "parameters": [ { "name": "id", "in": "path", "required": true, "description": "ID (UUID) do projeto.", "schema": { "type": "string", "format": "uuid" }, "example": "{{project_id}}" } ], "post": { "summary": "Listar conteúdos do projeto", "parameters": [ { "name": "page", "in": "query", "description": "Página desejada. Padrão `1`.", "schema": { "type": "integer" }, "example": 0 }, { "name": "perPage", "in": "query", "description": "Itens por página. Padrão `30`, máximo `100`.", "schema": { "type": "integer" }, "example": 0 }, { "name": "filter", "in": "query", "required": true, "description": "O que retornar: `default` (tudo, padrão), `content` (apenas conteúdos enviados por pessoas) ou `logs` (apenas registros de atividade).", "deprecated": false, "schema": { "type": "string" }, "example": "" }, { "name": "search", "in": "query", "description": "Termo buscado no texto do conteúdo.", "schema": { "type": "string" }, "example": "" }, { "name": "channel_id", "in": "query", "description": "ID (UUID) do canal cuja conversa deve ser retornada. Sem ele, apenas os conteúdos internos aparecem.", "schema": { "type": "string" }, "example": "" } ], "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "description": "Lista paginada de conteúdos.", "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "meta": { "type": "object", "description": "Dados da paginação.", "properties": { "current_page": { "type": "integer", "description": "Página retornada." }, "from": { "type": "integer", "description": "Posição do primeiro item da página no total." }, "to": { "type": "integer", "description": "Posição do último item da página no total." }, "last_page": { "type": "integer", "description": "Número da última página." }, "per_page": { "type": "integer", "description": "Itens por página." }, "total": { "type": "integer", "description": "Total de itens encontrados." } } }, "medias": { "type": "array", "description": "Conteúdos da página.", "items": { "description": "Conteúdo do projeto.", "type": "object", "properties": { "id": { "type": "string", "description": "ID (UUID) do conteúdo.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do conteúdo ou do arquivo." }, "technical_name": { "type": "string", "description": "Nome interno usado no armazenamento." }, "type": { "type": "integer", "description": "Tipo do conteúdo: 1 texto, 2 arquivo, 3 áudio." }, "extension": { "type": "string", "description": "Extensão do arquivo, quando houver." }, "text": { "type": "string", "description": "Texto enviado, quando houver." }, "file_url": { "type": "string", "description": "Endereço para baixar o arquivo, quando houver." }, "log": { "type": "string", "description": "Conteúdo do registro de atividade, quando a entrada for um log." }, "user_id": { "type": "string", "description": "Usuário que enviou o conteúdo.", "format": "uuid" }, "frame_id": { "type": "string", "description": "ID (UUID) da conta dona do conteúdo.", "format": "uuid" }, "project_id": { "type": "string", "description": "Projeto que recebeu o conteúdo.", "format": "uuid" }, "channel_id": { "type": "string", "description": "ID (UUID) do canal, quando o conteúdo veio de uma conversa.", "format": "uuid" }, "direction": { "type": "string", "description": "Direção do conteúdo no canal (entrada ou saída), quando aplicável." }, "origin": { "type": "string", "description": "Origem do conteúdo (ex.: integração ou compositor interno)." }, "external_message_id": { "type": "string", "description": "ID da mensagem na integração externa, quando houver." }, "task_id": { "type": "string", "description": "ID (UUID) da tarefa vinculada, quando o conteúdo pertence a uma tarefa.", "format": "uuid" }, "delivery_error": { "type": "string", "description": "Erro de entrega na integração, quando o envio falhou." }, "created_at": { "type": "string", "description": "Data do envio.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data em que o conteúdo foi removido.", "format": "date-time" }, "user": { "type": "object", "description": "Quem enviou o conteúdo." }, "project": { "type": "object", "description": "Projeto relacionado, quando carregado." } } } } }, "required": [ "response", "medias" ] }, "example": { "response": true, "meta": { "current_page": 1, "from": 1, "to": 2, "last_page": 1, "per_page": 30, "total": 2 }, "medias": [ { "id": "019e1a44-2f6d-70bb-9d21-64c0a3e91f77", "name": "proposta-comercial", "technical_name": "proposta-comercial.019e1a44", "type": 2, "extension": "pdf", "text": null, "file_url": "https://cdn.olie.ai/frames/projects/proposta-comercial.pdf", "log": null, "user_id": "019c1e87-63f4-71dd-a4e3-6eaea0619c2f", "frame_id": "019c75de-532c-7047-9563-daf1448ca963", "project_id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "channel_id": null, "direction": null, "origin": null, "external_message_id": null, "task_id": null, "delivery_error": null, "created_at": "2026-08-18T14:02:11.000000Z", "updated_at": "2026-08-18T14:02:11.000000Z", "deleted_at": null, "user": { "id": "019c1e87-63f4-71dd-a4e3-6eaea0619c2f", "name": "Ana Souza", "avatar_url": null } }, { "id": "019e1a41-0b8c-71f2-a6c4-1de9f5307a10", "name": "description.9f2a1c", "technical_name": "description.9f2a1c", "type": 1, "extension": null, "text": "Cliente aprovou o escopo na reunião de hoje.", "file_url": null, "log": null, "user_id": "019c1e87-63f4-71dd-a4e3-6eaea0619c2f", "frame_id": "019c75de-532c-7047-9563-daf1448ca963", "project_id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "channel_id": null, "direction": null, "origin": null, "external_message_id": null, "task_id": null, "delivery_error": null, "created_at": "2026-08-18T13:47:35.000000Z", "updated_at": "2026-08-18T13:47:35.000000Z", "deleted_at": null, "user": { "id": "019c1e87-63f4-71dd-a4e3-6eaea0619c2f", "name": "Ana Souza", "avatar_url": null } } ] } } } }, "401": { "description": "Não autorizado", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." } }, "required": [ "response", "message", "error" ] }, "example": { "response": false, "message": "unauthorized", "error": "Unauthenticated." } } } } }, "tags": [ "projects", "Conteúdos e arquivos" ], "description": "Lista os conteúdos de um projeto — textos, arquivos, áudios e registros de atividade — do mais recente para o mais antigo, com paginação.\n\nSem `channel_id`, apenas os conteúdos internos são retornados; informe o ID de um canal para ver a conversa trocada por ele. Consulte [Paginação](https://docs.olie.ai/api-reference/general/pagination)." } }, "/api/management/projects/{project}/step-metrics": { "get": { "tags": [ "projects", "Métricas e previsão" ], "summary": "Obter métricas de etapas do projeto", "description": "Retorna, para cada etapa dos funis em que o projeto está cadastrado, o tempo que ele já passou ali — a soma de todas as passagens encerradas, em segundos. Passagens ainda em curso não entram na conta, e etapas por onde o projeto nunca passou vêm com zero.\n\nPara as métricas do funil como um todo, veja [Métricas do funil](https://docs.olie.ai/guides/funnels/metrics).", "operationId": "obterMTricasComputadasDasEtapasDeUmProjetoEspecFicoNoFunil", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "description": "Tempo do projeto por etapa.", "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "metrics": { "type": "array", "description": "Uma entrada por etapa dos funis do projeto.", "items": { "description": "Métrica de uma etapa.", "type": "object", "properties": { "step_id": { "type": "integer", "description": "ID da etapa." }, "max_time": { "type": "object", "description": "Tempo somado de todas as passagens encerradas pela etapa.", "properties": { "value": { "type": "integer", "description": "Tempo acumulado pelo projeto na etapa." }, "unit": { "type": "string", "description": "Unidade do valor. Sempre `seconds`." } } } } } } }, "required": [ "response", "metrics" ] }, "example": { "response": true, "metrics": [ { "step_id": 123, "max_time": { "value": 0, "unit": "seconds", "meta_data": null } }, { "step_id": 124, "max_time": { "value": 0, "unit": "seconds", "meta_data": null } }, { "step_id": 125, "max_time": { "value": 0, "unit": "seconds", "meta_data": null } }, { "step_id": 126, "max_time": { "value": 0, "unit": "seconds", "meta_data": null } }, { "step_id": 127, "max_time": { "value": 0, "unit": "seconds", "meta_data": null } }, { "step_id": 128, "max_time": { "value": 0, "unit": "seconds", "meta_data": null } }, { "step_id": 129, "max_time": { "value": 0, "unit": "seconds", "meta_data": null } }, { "step_id": 130, "max_time": { "value": 0, "unit": "seconds", "meta_data": null } } ] } } } } } }, "parameters": [ { "name": "project", "in": "path", "required": true, "description": "ID (UUID) do projeto.", "schema": { "type": "string" }, "example": "{{project_id}}" } ] }, "/api/management/projects/{project}/files": { "get": { "tags": [ "projects", "Conteúdos e arquivos" ], "summary": "Listar arquivos do projeto", "description": "Retorna todos os arquivos ligados ao projeto em um único conjunto: os enviados como conteúdo (no próprio projeto ou em suas tarefas) e os anexados em respostas de formulários. Não tem paginação.", "operationId": "listarTodosOsArquivosAssociadosAUmProjeto", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "description": "Arquivos do projeto.", "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "files": { "type": "array", "description": "Arquivos reunidos de todas as origens.", "items": { "description": "Arquivo do projeto.", "type": "object", "properties": { "name": { "type": "string", "description": "Nome do arquivo." }, "extension": { "type": "string", "description": "Extensão do arquivo." }, "file_url": { "type": "string", "description": "Endereço para baixar o arquivo." }, "type": { "type": "integer", "description": "Sempre 2: arquivo." }, "technical_name": { "type": "string", "description": "Nome interno usado no armazenamento." }, "created_at": { "type": "string", "description": "Data do envio.", "format": "date-time" }, "origin": { "type": "string", "description": "De onde o arquivo veio, quando ele foi anexado em um formulário." } } } } }, "required": [ "response", "files" ] }, "example": { "response": true, "files": [ { "name": "contrato-assinado", "extension": "pdf", "file_url": "https://cdn.olie.ai/frames/forms/contrato-assinado.pdf", "type": 2, "technical_name": "contrato-assinado", "created_at": "2026-08-12T09:15:00.000000Z", "origin": "form_answers" }, { "id": "019e1a44-2f6d-70bb-9d21-64c0a3e91f77", "name": "proposta-comercial", "technical_name": "proposta-comercial.019e1a44", "type": 2, "extension": "pdf", "text": null, "file_url": "https://cdn.olie.ai/frames/projects/proposta-comercial.pdf", "log": null, "user_id": "019c1e87-63f4-71dd-a4e3-6eaea0619c2f", "frame_id": "019c75de-532c-7047-9563-daf1448ca963", "project_id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "task_id": null, "created_at": "2026-08-18T14:02:11.000000Z", "updated_at": "2026-08-18T14:02:11.000000Z", "deleted_at": null, "user": { "id": "019c1e87-63f4-71dd-a4e3-6eaea0619c2f", "name": "Ana Souza", "avatar_url": null } } ] } } } } } }, "parameters": [ { "name": "project", "in": "path", "required": true, "description": "ID (UUID) do projeto.", "schema": { "type": "string" }, "example": "{{project_id}}" } ] }, "/api/management/projects/{project}/clone": { "post": { "tags": [ "projects", "Cópia e compartilhamento" ], "summary": "Clonar um projeto", "description": "Cria uma cópia de um projeto existente. Cada parte do projeto é copiada de forma independente: cliente, funis, etiquetas, checklists, respostas de formulários, conteúdos, fórum, grupos e responsáveis só entram no clone quando a opção correspondente é enviada como `true`.\n\nQuem só pode criar projetos a partir de modelos não escolhe as opções: nesse caso o clone é sempre completo, com todas as partes copiadas.", "operationId": "clonarUmProjeto", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "description": "Projeto retornado pela operação.", "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "project": { "type": "object", "description": "Projeto.", "properties": { "id": { "type": "string", "description": "ID (UUID) do projeto.", "format": "uuid" }, "frame_id": { "type": "string", "description": "ID (UUID) da conta dona do projeto.", "format": "uuid" }, "code": { "type": "string", "description": "Código do projeto, formado pelo prefixo e por um número sequencial." }, "name": { "type": "string", "description": "Nome do projeto." }, "description": { "type": "string", "description": "Descrição do projeto." }, "status": { "type": "integer", "description": "Situação: 1 em andamento, 2 concluído, 3 arquivado, 4 parado." }, "impact": { "type": "integer", "description": "Grau de impacto, de 1 a 10." }, "budget": { "type": "number", "description": "Orçamento do projeto." }, "is_template": { "type": "boolean", "description": "Indica se o projeto é um modelo." }, "parent_id": { "type": "string", "description": "ID do projeto pai, quando este é um subprojeto.", "format": "uuid" }, "customer_id": { "type": "string", "description": "ID do cliente vinculado.", "format": "uuid" }, "contact_id": { "type": "string", "description": "ID do contato vinculado.", "format": "uuid" }, "created_by": { "type": "string", "description": "ID do usuário que criou o projeto.", "format": "uuid" }, "created_at": { "type": "string", "description": "Data de criação.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data em que foi enviado para a lixeira.", "format": "date-time" } } } }, "required": [ "response", "project" ] }, "example": { "response": true, "project": { "id": "019e1c02-77aa-7391-b0d5-5e4a2f8c6b13", "frame_id": "019c75de-532c-7047-9563-daf1448ca963", "code": "SC-14", "name": "Shopping Center — Fase 2", "description": "Obra completa do empreendimento", "status": 1, "impact": 9, "budget": 340000, "is_template": false, "parent_id": null, "customer_id": null, "contact_id": null, "created_by": "019c1e87-63f4-71dd-a4e3-6eaea0619c2f", "created_at": "2026-08-19T11:20:44.000000Z", "updated_at": "2026-08-19T11:20:44.000000Z" } } } } } }, "requestBody": { "content": { "application/json": { "schema": { "description": "O que deve ser copiado para o novo projeto.", "type": "object", "properties": { "name": { "type": "string", "description": "Nome do novo projeto. Sem ele, o nome do original é mantido." }, "prefix": { "type": "string", "description": "Prefixo usado no código do novo projeto." }, "description": { "type": "string", "description": "Descrição do novo projeto." }, "form_answers_content": { "type": "array", "description": "Respostas de formulário a gravar no clone.", "items": { "description": "Resposta de formulário." } }, "customer": { "type": "boolean", "description": "Copia o cliente e o contato vinculados." }, "funnels": { "type": "boolean", "description": "Copia os funis e as etapas em que o projeto está." }, "clone_tags": { "type": "boolean", "description": "Copia as etiquetas de funil." }, "checklists": { "type": "boolean", "description": "Copia os checklists das etapas." }, "clone_form_answers": { "type": "boolean", "description": "Copia as respostas dos formulários." }, "medias": { "type": "boolean", "description": "Copia os conteúdos enviados no projeto." }, "medias_mention": { "type": "boolean", "description": "Mantém as menções dentro dos conteúdos copiados." }, "forum": { "type": "boolean", "description": "Copia as conversas do fórum." }, "loose_checklists": { "type": "boolean", "description": "Copia os checklists avulsos." }, "loose_form_answers": { "type": "boolean", "description": "Copia os formulários avulsos e suas respostas." }, "clone_groups": { "type": "boolean", "description": "Copia os grupos de projeto." }, "clone_assignees": { "type": "boolean", "description": "Copia os responsáveis e seguidores." } } }, "example": { "name": "Nome do novo projeto", "prefix": "PRJ", "description": "Descrição do novo projeto", "customer": true, "funnels": true, "clone_tags": true, "checklists": true, "clone_form_answers": true, "form_answers_content": null, "medias": false, "medias_mention": false, "forum": false, "loose_checklists": true, "loose_form_answers": true, "clone_groups": true, "clone_assignees": true } } } } }, "parameters": [ { "name": "project", "in": "path", "required": true, "description": "ID (UUID) do projeto.", "schema": { "type": "string" }, "example": "{{project_id}}" } ] }, "/api/management/projects/{project}/share": { "post": { "tags": [ "projects", "Cópia e compartilhamento" ], "summary": "Compartilhar um projeto", "description": "Liga ou desliga o compartilhamento público de um projeto e define o que o link exibe. Ao ligar, um token de compartilhamento é gerado (ou reaproveitado, se já existir); ao desligar, o token é descartado e o link deixa de funcionar.\n\nUse `refresh` para invalidar o link atual e gerar um novo. A ativação e a desativação ficam registradas no histórico do projeto.", "operationId": "compartilharProjeto", "responses": { "200": { "description": "Compartilhamento ativado", "content": { "application/json": { "schema": { "description": "Estado do compartilhamento após a alteração.", "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "result": { "type": "object", "description": "Projeto com a configuração de compartilhamento aplicada.", "properties": { "id": { "type": "string", "description": "ID (UUID) do projeto.", "format": "uuid" }, "frame_id": { "type": "string", "description": "ID (UUID) da conta dona do projeto.", "format": "uuid" }, "code": { "type": "string", "description": "Código do projeto." }, "name": { "type": "string", "description": "Nome do projeto." }, "share_token": { "type": "string", "description": "Token do link público. `null` quando o compartilhamento está desligado." }, "share_settings": { "type": "object", "description": "O que o link público exibe." }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" } } } }, "required": [ "response", "result" ] }, "examples": { "Compartilhamento ativado": { "value": { "response": true, "result": { "id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "frame_id": "019c75de-532c-7047-9563-daf1448ca963", "code": "SC-1", "name": "Shopping Center", "share_token": "hV3q8Zt1LpXk9RbNsA6y", "share_settings": { "attributes": [ "name", "status", "description", "funnels" ] }, "updated_at": "2026-08-19T11:31:07.000000Z" } } }, "Compartilhamento desativado": { "value": { "response": true, "result": { "id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "frame_id": "019c75de-532c-7047-9563-daf1448ca963", "code": "SC-1", "name": "Shopping Center", "share_token": null, "share_settings": { "attributes": [] }, "updated_at": "2026-08-19T11:34:52.000000Z" } } } } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "enabled": { "type": "boolean", "description": "`true` liga o compartilhamento; `false` desliga e descarta o link." }, "refresh": { "type": "boolean", "description": "`true` gera um link novo, invalidando o anterior." }, "settings": { "type": "object", "properties": { "attributes": { "type": "array", "description": "Blocos visíveis no link: `status`, `budget`, `name`, `description`, `impact`, `customer`, `form_answers`, `tasks`, `funnels`, `media` e `users`.", "items": { "type": "string", "description": "Nome do bloco exibido." } } }, "description": "O que o link público exibe." } }, "description": "Configuração do compartilhamento.", "required": [ "enabled", "settings" ] }, "example": { "enabled": true, "refresh": false, "settings": { "attributes": [ "name", "status", "description" ] } } } } } }, "parameters": [ { "name": "project", "in": "path", "required": true, "description": "ID (UUID) do projeto.", "schema": { "type": "string" }, "example": "{{project_id}}" } ] }, "/api/management/projects/{project}/hierarchy/children": { "get": { "tags": [ "projects", "Hierarquia" ], "summary": "Listar os filhos de um projeto", "description": "Retorna os projetos filhos diretos de um projeto, cada um com a contagem dos próprios filhos, e também o projeto pai do projeto consultado (quando houver). Não desce além do primeiro nível — para a árvore inteira, use a rota de árvore da hierarquia.\n\nConceitos e regras em [Hierarquia de projetos](https://docs.olie.ai/guides/projects/project-hierarchy).", "operationId": "listarTodosOsProjetosFilhosDeUmProjeto", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "description": "Filhos diretos e pai do projeto.", "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "children": { "type": "array", "description": "Filhos diretos do projeto.", "items": { "description": "Projeto filho.", "type": "object", "properties": { "id": { "type": "string", "description": "ID (UUID) do projeto filho.", "format": "uuid" }, "code": { "type": "string", "description": "Código do projeto." }, "name": { "type": "string", "description": "Nome do projeto." }, "status": { "type": "integer", "description": "Situação do projeto." }, "parent_id": { "type": "string", "description": "ID do projeto pai.", "format": "uuid" }, "impact": { "type": "integer", "description": "Grau de impacto." }, "budget": { "type": "number", "description": "Orçamento." }, "children_count": { "type": "integer", "description": "Filhos diretos deste projeto." } } } }, "parent": { "type": "object", "description": "Projeto pai do projeto consultado, quando existe." } }, "required": [ "response", "children" ] }, "example": { "response": true, "children": [ { "id": "019e0f21-4b3c-71a8-8f0e-9c2d5a7b1e40", "code": "SC-2", "name": "Fundação", "status": 1, "parent_id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "impact": 6, "budget": 120000, "children_count": 2 }, { "id": "019e0f22-8c11-7233-b5a1-77d0c9e41a02", "code": "SC-3", "name": "Estrutura", "status": 1, "parent_id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "impact": 7, "budget": 340000, "children_count": 0 } ], "parent": null } } } } }, "parameters": [ { "name": "trashed", "in": "query", "description": "`true` considera também os projetos na lixeira.", "schema": { "type": "string" }, "example": "" }, { "name": "template", "in": "query", "description": "`true` considera os modelos de projeto.", "schema": { "type": "string" }, "example": "" } ] }, "parameters": [ { "name": "project", "in": "path", "required": true, "description": "ID (UUID) do projeto.", "schema": { "type": "string" }, "example": "{{project_id}}" } ] }, "/api/management/projects/{project}/hierarchy/tree": { "get": { "tags": [ "projects", "Hierarquia" ], "summary": "Obter a árvore da hierarquia", "description": "Retorna a árvore completa a partir do projeto informado — filhos, netos e bisnetos — com o nível de cada um, se é raiz ou folha, as estatísticas da estrutura e o caminho (breadcrumb) até o projeto atual.\n\nA plataforma permite até quatro níveis de profundidade; veja [Hierarquia de projetos](https://docs.olie.ai/guides/projects/project-hierarchy).", "operationId": "listarARvoreCompletaDeHierarquiaDeUmProjeto", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "description": "Árvore completa a partir do projeto.", "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "data": { "type": "object", "description": "Árvore da hierarquia.", "properties": { "current_project": { "type": "object", "description": "Projeto consultado.", "properties": { "id": { "type": "string", "description": "ID (UUID) do projeto consultado.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do projeto." }, "breadcrumb": { "type": "string", "description": "Caminho da raiz até o projeto, separado por `>`." } } }, "hierarchy_tree": { "type": "array", "description": "Projeto consultado e todos os seus descendentes.", "items": { "description": "Nó da árvore.", "type": "object", "properties": { "id": { "type": "string", "description": "ID (UUID) do projeto.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do projeto." }, "description": { "type": "string", "description": "Descrição do projeto." }, "status": { "type": "integer", "description": "Situação do projeto." }, "parent_id": { "type": "string", "description": "ID do projeto pai.", "format": "uuid" }, "level": { "type": "integer", "description": "Nível na árvore, começando em 0." }, "is_root": { "type": "boolean", "description": "Indica que o projeto não tem pai." }, "is_leaf": { "type": "boolean", "description": "Indica que o projeto não tem filhos." }, "children_count": { "type": "integer", "description": "Filhos diretos." } } } }, "stats": { "type": "object", "description": "Números da posição do projeto na hierarquia.", "properties": { "level": { "type": "integer", "description": "Nível do projeto na árvore, começando em 0 na raiz." }, "depth": { "type": "integer", "description": "Quantos níveis existem abaixo do projeto." }, "children_count": { "type": "integer", "description": "Filhos diretos." }, "descendants_count": { "type": "integer", "description": "Total de descendentes em todos os níveis." }, "is_root": { "type": "boolean", "description": "Indica que o projeto não tem pai." }, "is_leaf": { "type": "boolean", "description": "Indica que o projeto não tem filhos." } } } } } }, "required": [ "response", "data" ] }, "example": { "response": true, "data": { "current_project": { "id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "name": "Shopping Center", "breadcrumb": "Shopping Center" }, "hierarchy_tree": [ { "id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "name": "Shopping Center", "description": "Obra completa do empreendimento", "status": 1, "parent_id": null, "level": 0, "is_root": true, "is_leaf": false, "children_count": 2 }, { "id": "019e0f21-4b3c-71a8-8f0e-9c2d5a7b1e40", "name": "Fundação", "description": "Serviços de fundação", "status": 1, "parent_id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "level": 1, "is_root": false, "is_leaf": false, "children_count": 1 }, { "id": "019e0f23-1a5e-7460-9c33-2b7f8de10c55", "name": "Escavação", "description": null, "status": 2, "parent_id": "019e0f21-4b3c-71a8-8f0e-9c2d5a7b1e40", "level": 2, "is_root": false, "is_leaf": true, "children_count": 0 } ], "stats": { "level": 0, "depth": 2, "children_count": 2, "descendants_count": 3, "is_root": true, "is_leaf": false } } } } } } } }, "parameters": [ { "name": "project", "in": "path", "required": true, "description": "ID (UUID) do projeto.", "schema": { "type": "string" }, "example": "{{project_id}}" } ] }, "/api/management/projects/{project}/hierarchy/stats": { "get": { "tags": [ "projects", "Hierarquia" ], "summary": "Obter estatísticas da hierarquia", "description": "Retorna os números da posição do projeto na estrutura: quantidade de irmãos e de ancestrais, estatísticas da árvore, o caminho até o projeto e a hierarquia a que ele pertence.\n\nConceitos e regras em [Hierarquia de projetos](https://docs.olie.ai/guides/projects/project-hierarchy).", "operationId": "listarEstatSticasDaHierarquiaDeUmProjeto", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "data": { "type": "object", "properties": { "project_id": { "type": "string", "description": "ID (UUID) do projeto consultado.", "format": "uuid" }, "project_name": { "type": "string", "description": "Nome do projeto." }, "stats": { "type": "object", "properties": { "level": { "type": "integer", "description": "Nível do projeto na árvore, começando em 0 na raiz." }, "depth": { "type": "integer", "description": "Quantos níveis existem abaixo do projeto." }, "children_count": { "type": "integer", "description": "Filhos diretos." }, "descendants_count": { "type": "integer", "description": "Total de descendentes em todos os níveis." }, "is_root": { "type": "boolean", "description": "Indica que o projeto não tem pai." }, "is_leaf": { "type": "boolean", "description": "Indica que o projeto não tem filhos." } }, "description": "Números da posição do projeto na hierarquia." }, "siblings_count": { "type": "integer", "description": "Projetos que dividem o mesmo pai." }, "ancestors_count": { "type": "integer", "description": "Projetos acima na estrutura." }, "hierarchy_breadcrumb": { "type": "string", "description": "Caminho da raiz até o projeto, separado por `>`." }, "hierarchy": { "type": "array", "description": "Caminho da raiz até o projeto, do mais alto ao mais baixo.", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "ID (UUID) do projeto.", "format": "uuid" }, "code": { "type": "string", "description": "Código do projeto." }, "name": { "type": "string", "description": "Nome do projeto." } }, "description": "Projeto do caminho." } } }, "description": "Estatísticas da hierarquia." } }, "description": "Números da hierarquia do projeto.", "required": [ "response", "data" ] }, "example": { "response": true, "data": { "project_id": "019e0f21-4b3c-71a8-8f0e-9c2d5a7b1e40", "project_name": "Fundação", "stats": { "level": 1, "depth": 1, "children_count": 1, "descendants_count": 1, "is_root": false, "is_leaf": false }, "siblings_count": 1, "ancestors_count": 1, "hierarchy_breadcrumb": "Shopping Center > Fundação", "hierarchy": [ { "id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "code": "SC-1", "name": "Shopping Center" }, { "id": "019e0f21-4b3c-71a8-8f0e-9c2d5a7b1e40", "code": "SC-2", "name": "Fundação" } ] } } } } } } }, "parameters": [ { "name": "project", "in": "path", "required": true, "description": "ID (UUID) do projeto.", "schema": { "type": "string" }, "example": "{{project_id}}" } ] }, "/api/management/projects/{project}/hierarchy/analytics": { "get": { "tags": [ "projects", "Hierarquia" ], "summary": "Obter análises dos descendentes", "description": "Consolida em um único retorno os números de todos os projetos abaixo do projeto informado — financeiro, tarefas, funis e pessoas envolvidas — para uma visão macro da estrutura.\n\nProjetos sem nenhum descendente respondem com erro, já que não há o que consolidar.", "operationId": "listarAnLisesAgregadasDeTodosOsProjetosDescendentes", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "description": "Análises agregadas da hierarquia.", "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "data": { "type": "object", "description": "Números consolidados dos descendentes.", "properties": { "budget": { "type": "object", "description": "Números financeiros.", "properties": { "total_budget": { "type": "number", "description": "Soma dos orçamentos." }, "average_budget": { "type": "number", "description": "Média dos orçamentos maiores que zero." }, "budget_distribution": { "type": "object", "description": "Quantidade de projetos por valor de orçamento." }, "projects_with_budget": { "type": "integer", "description": "Projetos com orçamento." }, "projects_without_budget": { "type": "integer", "description": "Projetos sem orçamento." }, "budget_range": { "type": "object", "description": "Faixa de orçamento.", "properties": { "min": { "type": "number", "description": "Menor orçamento." }, "max": { "type": "number", "description": "Maior orçamento." } } } } }, "funnels": { "type": "object", "description": "Números de funis.", "properties": { "total_funnels": { "type": "integer", "description": "Funis distintos usados pelos descendentes." }, "average_funnels_per_project": { "type": "number", "description": "Média de funis por projeto." }, "funnels_per_project": { "type": "object", "description": "Quantidade de funis por projeto." }, "projects_per_step": { "type": "object", "description": "Quantidade de projetos por etapa." }, "projects_with_funnels": { "type": "integer", "description": "Projetos em algum funil." }, "projects_without_funnels": { "type": "integer", "description": "Projetos fora de qualquer funil." } } }, "users": { "type": "object", "description": "Números de pessoas.", "properties": { "total_users": { "type": "integer", "description": "Pessoas distintas envolvidas." }, "total_user_assignments": { "type": "integer", "description": "Total de vínculos de pessoas com projetos." }, "average_users_per_project": { "type": "number", "description": "Média de pessoas por projeto." }, "users_by_role": { "type": "object", "description": "Quantidade de vínculos por papel." }, "users_per_project": { "type": "object", "description": "Quantidade de pessoas por projeto." }, "projects_with_users": { "type": "integer", "description": "Projetos com alguém vinculado." }, "projects_without_users": { "type": "integer", "description": "Projetos sem ninguém vinculado." } } }, "status": { "type": "object", "description": "Distribuição por situação.", "properties": { "by_status": { "type": "object", "description": "Quantidade de projetos por situação." }, "total_projects": { "type": "integer", "description": "Total de projetos considerados." }, "status_distribution_percentage": { "type": "object", "description": "Percentual de projetos por situação." } } }, "impact": { "type": "object", "description": "Distribuição por impacto.", "properties": { "by_impact": { "type": "object", "description": "Quantidade de projetos por grau de impacto." }, "average_impact": { "type": "number", "description": "Impacto médio." }, "impact_range": { "type": "object", "description": "Faixa de impacto.", "properties": { "min": { "type": "number", "description": "Menor impacto." }, "max": { "type": "number", "description": "Maior impacto." } } }, "high_impact_projects": { "type": "integer", "description": "Projetos com impacto 8 ou mais." }, "medium_impact_projects": { "type": "integer", "description": "Projetos com impacto de 4 a 7." }, "low_impact_projects": { "type": "integer", "description": "Projetos com impacto 3 ou menos." } } }, "hierarchy": { "type": "object", "description": "Formato da estrutura.", "properties": { "total_levels": { "type": "integer", "description": "Níveis ocupados pela estrutura." }, "level_distribution": { "type": "object", "description": "Quantidade de projetos por nível." }, "leaf_projects": { "type": "integer", "description": "Projetos sem filhos." }, "branch_projects": { "type": "integer", "description": "Projetos com filhos." }, "branch_to_leaf_ratio": { "type": "number", "description": "Relação entre projetos com e sem filhos." }, "average_children_per_branch": { "type": "number", "description": "Média de filhos por projeto que tem filhos." } } }, "timeline": { "type": "object", "description": "Evolução no tempo.", "properties": { "recent_projects": { "type": "object", "description": "Projetos criados por janela de tempo.", "properties": { "last_30_days": { "type": "integer", "description": "Criados nos últimos 30 dias." }, "last_90_days": { "type": "integer", "description": "Criados nos últimos 90 dias." }, "last_365_days": { "type": "integer", "description": "Criados nos últimos 365 dias." } } }, "recently_updated": { "type": "integer", "description": "Projetos alterados recentemente." }, "monthly_creation_trend": { "type": "object", "description": "Projetos criados por mês, no formato AAAA-MM." }, "oldest_project_age_days": { "type": "integer", "description": "Idade do projeto mais antigo, em dias." }, "newest_project_age_days": { "type": "integer", "description": "Idade do projeto mais novo, em dias." } } } } } }, "required": [ "response", "data" ] }, "example": { "response": true, "data": { "budget": { "total_budget": 460000, "average_budget": 230000, "budget_distribution": { "120000": 1, "340000": 1 }, "projects_with_budget": 2, "projects_without_budget": 1, "budget_range": { "min": 0, "max": 340000 } }, "funnels": { "total_funnels": 1, "average_funnels_per_project": 0.67, "funnels_per_project": { "019e0f21-4b3c-71a8-8f0e-9c2d5a7b1e40": 1 }, "projects_per_step": { "181": 1 }, "projects_with_funnels": 1, "projects_without_funnels": 2 }, "users": { "total_users": 2, "total_user_assignments": 3, "average_users_per_project": 1, "users_by_role": { "assignee": 2, "follower": 1 }, "users_per_project": { "019e0f21-4b3c-71a8-8f0e-9c2d5a7b1e40": 2 }, "projects_with_users": 2, "projects_without_users": 1 }, "status": { "by_status": { "1": 2, "2": 1 }, "total_projects": 3, "status_distribution_percentage": { "1": 66.67, "2": 33.33 } }, "impact": { "by_impact": { "6": 1, "7": 1, "9": 1 }, "average_impact": 7.33, "impact_range": { "min": 6, "max": 9 }, "high_impact_projects": 1, "medium_impact_projects": 2, "low_impact_projects": 0 }, "hierarchy": { "total_levels": 2, "level_distribution": { "1": 2, "2": 1 }, "leaf_projects": 2, "branch_projects": 1, "branch_to_leaf_ratio": 0.5, "average_children_per_branch": 1 }, "timeline": { "recent_projects": { "last_30_days": 1, "last_90_days": 2, "last_365_days": 3 }, "recently_updated": 2, "monthly_creation_trend": { "2026-06": 1, "2026-07": 1, "2026-08": 1 }, "oldest_project_age_days": 74, "newest_project_age_days": 3 } } } } } }, "422": { "description": "Projeto sem descendentes", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." } }, "required": [ "response", "message", "error" ] }, "example": { "response": false, "message": "no_descendants_for_analytics", "error": "No descendants found for project" } } } } } }, "parameters": [ { "name": "project", "in": "path", "required": true, "description": "ID (UUID) do projeto.", "schema": { "type": "string" }, "example": "{{project_id}}" } ] }, "/api/management/projects/{project}/hierarchy/attach-child": { "post": { "tags": [ "projects", "Hierarquia" ], "summary": "Vincular um projeto filho", "description": "Torna um projeto existente filho direto do projeto informado. O vínculo é recusado quando criaria um ciclo, quando o projeto seria pai de si mesmo ou quando ultrapassaria o limite de quatro níveis de profundidade.\n\nRegras completas em [Hierarquia de projetos](https://docs.olie.ai/guides/projects/project-hierarchy).", "operationId": "vincularProjetoComoFilhoDeOutroProjeto", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "description": "Confirmação do vínculo pai-filho.", "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "data": { "type": "object", "description": "Vínculo criado.", "properties": { "parent": { "type": "object", "description": "Identificação resumida de um projeto.", "properties": { "id": { "type": "string", "description": "ID (UUID) do projeto.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do projeto." } } }, "child": { "type": "object", "description": "Identificação resumida de um projeto.", "properties": { "id": { "type": "string", "description": "ID (UUID) do projeto.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do projeto." } } }, "new_hierarchy_breadcrumb": { "type": "string", "description": "Novo caminho do filho, da raiz até ele." } } } }, "required": [ "response", "data" ] }, "example": { "response": true, "data": { "parent": { "id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "name": "Shopping Center" }, "child": { "id": "019e0f21-4b3c-71a8-8f0e-9c2d5a7b1e40", "name": "Fundação" }, "new_hierarchy_breadcrumb": "Shopping Center > Fundação" } } } } }, "422": { "description": "Vínculo inválido", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." } }, "required": [ "response", "message", "error" ] }, "example": { "response": false, "message": "invalid_parent_child_relationship", "error": "Cannot attach child: would create invalid hierarchy (loop, depth limit, or self-reference)" } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "child_id": { "type": "string", "description": "ID (UUID) do projeto que passa a ser filho.", "format": "uuid" } }, "description": "Projeto a vincular como filho.", "required": [ "child_id" ] }, "example": { "child_id": null } } } } }, "parameters": [ { "name": "project", "in": "path", "required": true, "description": "ID (UUID) do projeto.", "schema": { "type": "string" }, "example": "{{project_id}}" } ] }, "/api/management/projects/{project}/hierarchy/detach-child/{child}": { "delete": { "tags": [ "projects", "Hierarquia" ], "summary": "Desvincular um projeto filho", "description": "Desfaz o vínculo entre um projeto pai e um de seus filhos diretos. O projeto desvinculado passa a ser raiz e mantém a própria descendência intacta. Se o projeto informado não for filho direto daquele pai, a operação é recusada.", "operationId": "removerARelaODeHierarquiaEntreUmProjetoPaiESeuProjetoFilho", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "description": "Confirmação da desvinculação.", "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "data": { "type": "object", "description": "Vínculo desfeito.", "properties": { "former_parent": { "type": "object", "description": "Identificação resumida de um projeto.", "properties": { "id": { "type": "string", "description": "ID (UUID) do projeto.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do projeto." } } }, "detached_child": { "type": "object", "description": "Projeto desvinculado.", "properties": { "id": { "type": "string", "description": "ID (UUID) do projeto desvinculado.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do projeto." }, "is_root": { "type": "boolean", "description": "Sempre true: o projeto passou a ser raiz." } } } } } }, "required": [ "response", "data" ] }, "example": { "response": true, "data": { "former_parent": { "id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "name": "Shopping Center" }, "detached_child": { "id": "019e0f21-4b3c-71a8-8f0e-9c2d5a7b1e40", "name": "Fundação", "is_root": true } } } } } }, "422": { "description": "Projeto não é filho deste pai", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." } }, "required": [ "response", "message", "error" ] }, "example": { "response": false, "message": "invalid_parent_child_relationship", "error": "The specified project is not a child of this project" } } } } } }, "parameters": [ { "name": "project", "in": "path", "required": true, "description": "ID (UUID) do projeto.", "schema": { "type": "string" }, "example": "{{project_id}}" }, { "name": "child", "in": "path", "required": true, "description": "ID (UUID) do projeto filho a desvincular.", "schema": { "type": "string" }, "example": "" } ] }, "/api/management/projects/{project}/hierarchy/move-to-parent": { "put": { "tags": [ "projects", "Hierarquia" ], "summary": "Mover um projeto para outro pai", "description": "Muda o projeto de lugar na estrutura, colocando-o sob outro pai. Enviar `new_parent_id` como `null` promove o projeto a raiz.\n\nA movimentação é recusada quando criaria um ciclo ou quando a subárvore do projeto ultrapassaria o limite de quatro níveis de profundidade — veja [Hierarquia de projetos](https://docs.olie.ai/guides/projects/project-hierarchy).", "operationId": "moverUmProjetoParaSerFilhoDeOutroProjeto", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "description": "Confirmação da movimentação.", "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "data": { "type": "object", "description": "Resultado da movimentação.", "properties": { "project": { "type": "object", "description": "Identificação resumida de um projeto.", "properties": { "id": { "type": "string", "description": "ID (UUID) do projeto.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do projeto." } } }, "old_parent": { "type": "object", "description": "Pai anterior, quando havia." }, "new_parent": { "type": "object", "description": "Novo pai. `null` quando o projeto virou raiz." }, "new_hierarchy_breadcrumb": { "type": "string", "description": "Novo caminho do projeto, da raiz até ele." }, "is_root": { "type": "boolean", "description": "Indica se o projeto ficou na raiz." } } } }, "required": [ "response", "data" ] }, "example": { "response": true, "data": { "project": { "id": "019e0f21-4b3c-71a8-8f0e-9c2d5a7b1e40", "name": "Fundação" }, "old_parent": { "id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "name": "Shopping Center" }, "new_parent": { "id": "019e0f22-8c11-7233-b5a1-77d0c9e41a02", "name": "Estrutura" }, "new_hierarchy_breadcrumb": "Shopping Center > Estrutura > Fundação", "is_root": false } } } } } }, "requestBody": { "content": { "application/json": { "schema": { "description": "Novo pai do projeto.", "type": "object", "properties": { "new_parent_id": { "type": "string", "description": "ID (UUID) do novo pai. `null` promove o projeto a raiz.", "format": "uuid" } } }, "example": { "new_parent_id": null } } } } }, "parameters": [ { "name": "project", "in": "path", "required": true, "description": "ID (UUID) do projeto.", "schema": { "type": "string" }, "example": "{{project_id}}" } ] }, "/api/management/projects/{project}/hierarchy/promote-to-root": { "put": { "tags": [ "projects", "Hierarquia" ], "summary": "Promover um projeto a raiz", "description": "Desliga o projeto de seu pai, deixando-o como raiz de uma nova estrutura. Os filhos do projeto acompanham a mudança e mantêm as posições relativas entre si. Projetos que já são raiz respondem com erro.", "operationId": "removerUmProjetoDeSuaHierarquiaAtual", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "description": "Confirmação da promoção a raiz.", "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "data": { "type": "object", "description": "Resultado da promoção.", "properties": { "project": { "type": "object", "description": "Projeto promovido.", "properties": { "id": { "type": "string", "description": "ID (UUID) do projeto.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do projeto." }, "is_root": { "type": "boolean", "description": "Sempre true: o projeto passou a ser raiz." } } }, "former_parent": { "type": "object", "description": "Identificação resumida de um projeto.", "properties": { "id": { "type": "string", "description": "ID (UUID) do projeto.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do projeto." } } } } } }, "required": [ "response", "data" ] }, "example": { "response": true, "data": { "project": { "id": "019e0f21-4b3c-71a8-8f0e-9c2d5a7b1e40", "name": "Fundação", "is_root": true }, "former_parent": { "id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "name": "Shopping Center" } } } } } }, "422": { "description": "Projeto já é raiz", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Descrição do motivo da recusa." } }, "description": "Erro sem identificador de código.", "required": [ "response", "message" ] }, "example": { "response": false, "message": "Project is already at root level" } } } } } }, "parameters": [ { "name": "project", "in": "path", "required": true, "description": "ID (UUID) do projeto.", "schema": { "type": "string" }, "example": "{{project_id}}" } ] }, "/api/management/projects/{project}/loose-checklist": { "get": { "tags": [ "projects", "Checklists avulsos" ], "summary": "Listar checklists avulsos do projeto", "description": "Lista os checklists avulsos do projeto, ordenados pela posição do item. Cada item já inclui o responsável atribuído, o usuário que marcou como concluído e o prazo de conclusão (`completion_deadline`), quando houver.", "operationId": "listarTodosOsChecklistsAvulsosAssociadosAUmProjeto", "responses": { "200": { "description": "Sucesso", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "Content-Encoding": { "schema": { "type": "string" }, "example": "gzip" }, "Date": { "schema": { "type": "string" }, "example": "Thu, 14 May 2026 19:40:20 GMT" }, "Referrer-Policy": { "schema": { "type": "string" }, "example": "strict-origin-when-cross-origin" }, "Server": { "schema": { "type": "string" }, "example": "nginx" }, "Strict-Transport-Security": { "schema": { "type": "string" }, "example": "max-age=31536000; includeSubDomains" }, "Vary": { "schema": { "type": "string" }, "example": "Accept-Encoding" }, "X-Content-Type-Options": { "schema": { "type": "string" }, "example": "nosniff" }, "X-Frame-Options": { "schema": { "type": "string" }, "example": "SAMEORIGIN" }, "X-Ratelimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-Ratelimit-Remaining": { "schema": { "type": "integer" }, "example": 158 }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" } }, "content": { "application/json": { "schema": { "description": "Checklists avulsos do projeto.", "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "loose_checklists": { "type": "array", "description": "Itens ordenados pela posição.", "items": { "description": "Item de checklist avulso.", "type": "object", "properties": { "id": { "type": "string", "description": "ID (UUID) do item.", "format": "uuid" }, "name": { "type": "string", "description": "Texto do item." }, "order": { "type": "integer", "description": "Posição do item na lista." }, "completed_at": { "type": "string", "description": "Data em que o item foi concluído.", "format": "date-time" }, "completion_deadline": { "type": "string", "description": "Prazo de conclusão do item.", "format": "date-time" }, "project_id": { "type": "string", "description": "Projeto dono do item.", "format": "uuid" }, "author": { "type": "object", "description": "Responsável pelo item." }, "checked_by": { "type": "object", "description": "Quem marcou o item como concluído." }, "created_at": { "type": "string", "description": "Data de criação.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" }, "author_id": { "type": "string", "description": "Responsável pelo item.", "format": "uuid" }, "checked_by_id": { "type": "string", "description": "Usuário que marcou o item como concluído.", "format": "uuid" } } } } }, "required": [ "response", "loose_checklists" ] }, "example": { "response": true, "loose_checklists": [ { "id": "019e27ab-5064-71f9-aed4-78e0728a42d0", "name": "Fazer deploy", "completed_at": null, "completion_deadline": "2026-12-31 18:00:00", "author_id": null, "checked_by_id": null, "project_id": "019e27a5-d444-713b-ac3c-50c01d4ebbab", "created_at": "2026-05-14T18:06:39.000000Z", "updated_at": "2026-05-14T19:04:43.000000Z", "order": 0, "checked_by": null, "author": null }, { "id": "019e27a9-2b1b-7095-955a-3b0cc8bdabeb", "name": "Limpar o estoque", "completed_at": null, "completion_deadline": null, "author_id": null, "checked_by_id": null, "project_id": "019e27a5-d444-713b-ac3c-50c01d4ebbab", "created_at": "2026-05-14T18:04:18.000000Z", "updated_at": "2026-05-14T19:04:43.000000Z", "order": 1, "checked_by": null, "author": null } ] } } } } }, "parameters": [ { "name": "Authorization", "in": "header", "description": "Sanctum Personal Access Token do tenant", "schema": { "type": "string" }, "example": "Bearer {{token}}" } ] }, "post": { "tags": [ "projects", "Checklists avulsos" ], "summary": "Criar checklist avulso no projeto", "description": "Cria um novo item de checklist avulso no projeto. O item entra no fim da lista — a posição é atribuída automaticamente pelo servidor.", "operationId": "criarUmNovoItemDeChecklistAvulsoParaUmProjeto", "responses": { "200": { "description": "Sucesso", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "Content-Encoding": { "schema": { "type": "string" }, "example": "gzip" }, "Date": { "schema": { "type": "string" }, "example": "Thu, 14 May 2026 18:04:18 GMT" }, "Referrer-Policy": { "schema": { "type": "string" }, "example": "strict-origin-when-cross-origin" }, "Server": { "schema": { "type": "string" }, "example": "nginx" }, "Strict-Transport-Security": { "schema": { "type": "string" }, "example": "max-age=31536000; includeSubDomains" }, "Vary": { "schema": { "type": "string" }, "example": "Accept-Encoding" }, "X-Content-Type-Options": { "schema": { "type": "string" }, "example": "nosniff" }, "X-Frame-Options": { "schema": { "type": "string" }, "example": "SAMEORIGIN" }, "X-Ratelimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-Ratelimit-Remaining": { "schema": { "type": "integer" }, "example": 158 }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." } }, "description": "Confirmação de que a operação foi concluída.", "required": [ "response" ] }, "example": { "response": true } } } } }, "parameters": [ { "name": "Authorization", "in": "header", "schema": { "type": "string" }, "example": "Bearer {{token}}" } ], "requestBody": { "content": { "application/json": { "schema": { "description": "Novo item de checklist avulso.", "type": "object", "properties": { "name": { "type": "string", "maxLength": 255, "description": "Texto do item de checklist." }, "completed_at": { "type": "string", "description": "Data de conclusão. Se informado sem `checked_by_id`, o servidor atribui o usuário autenticado.", "format": "date-time" }, "completion_deadline": { "type": "string", "description": "Prazo de conclusão do item. `null` deixa sem prazo.", "format": "date-time" }, "author_id": { "type": "string", "description": "Usuário responsável pelo item.", "format": "uuid" }, "checked_by_id": { "type": "string", "description": "Usuário que marcou o item como concluído.", "format": "uuid" } }, "required": [ "name" ] }, "example": { "name": "Fazer deploy", "completed_at": null, "completion_deadline": "2026-12-31 18:00:00", "author_id": null, "checked_by_id": null } } } } }, "parameters": [ { "name": "project", "in": "path", "required": true, "description": "ID (UUID) do projeto.", "schema": { "type": "string" }, "example": "{{project_id}}" } ] }, "/api/management/projects/{project}/loose-checklist/{loose_checklist}": { "put": { "tags": [ "projects", "Checklists avulsos" ], "summary": "Atualizar checklist avulso", "description": "Atualiza um item de checklist avulso. Todos os campos do body são opcionais — envie apenas o que deve mudar.\n\nAtribuir um novo responsável (`author_id`) notifica o usuário escolhido. Alterar `order` reposiciona o item na lista; os itens vizinhos são deslocados automaticamente. Enviar `completion_deadline: null` remove o prazo; omitir o campo mantém o valor atual.", "operationId": "atualizarUmItemDeChecklistAvulso", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." } }, "description": "Confirmação de que a operação foi concluída.", "required": [ "response" ] }, "example": { "response": true } } } } }, "parameters": [ { "name": "Authorization", "in": "header", "schema": { "type": "string" }, "example": "Bearer {{token}}" } ], "requestBody": { "content": { "application/json": { "schema": { "description": "Campos a alterar no item. Todos são opcionais.", "type": "object", "properties": { "name": { "type": "string", "maxLength": 255, "description": "Texto do item de checklist." }, "completed_at": { "type": "string", "description": "Data de conclusão. `null` desmarca o item.", "format": "date-time" }, "completion_deadline": { "type": "string", "description": "Prazo de conclusão do item. `null` remove o prazo.", "format": "date-time" }, "author_id": { "type": "string", "description": "Usuário responsável pelo item.", "format": "uuid" }, "checked_by_id": { "type": "string", "description": "Usuário que marcou o item como concluído.", "format": "uuid" }, "order": { "type": "integer", "minimum": 0, "description": "Nova posição do item na lista." } } }, "example": { "name": "Fazer deploy", "completed_at": null, "completion_deadline": "2026-12-31 18:00:00", "author_id": null, "checked_by_id": null, "order": 0 } } } } }, "delete": { "tags": [ "projects", "Checklists avulsos" ], "summary": "Remover checklist avulso do projeto", "description": "Remove um item de checklist avulso do projeto. Os itens posteriores na lista têm sua ordem ajustada automaticamente.", "operationId": "removerUmItemDeChecklistAvulsoDeUmProjeto", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." } }, "description": "Confirmação de que a operação foi concluída.", "required": [ "response" ] }, "example": { "response": true } } } } }, "parameters": [ { "name": "Authorization", "in": "header", "schema": { "type": "string" }, "example": "Bearer {{token}}" } ] }, "parameters": [ { "name": "project", "in": "path", "required": true, "description": "ID (UUID) do projeto.", "schema": { "type": "string" }, "example": "{{project_id}}" }, { "name": "loose_checklist", "in": "path", "required": true, "description": "ID (UUID) do item de checklist avulso.", "schema": { "type": "string" }, "example": "" } ] }, "/api/management/projects/{project}/loose-forms": { "get": { "tags": [ "projects", "Formulários avulsos" ], "summary": "Listar formulários avulsos do projeto", "description": "Retorna os formulários avulsos vinculados ao projeto, cada um acompanhado da definição do formulário correspondente. Formulários avulsos são anexados ao projeto sob demanda, sem depender da etapa em que ele está.", "operationId": "listarFormulRiosAvulsosAssociadosAUmProjeto", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "description": "Formulários avulsos do projeto.", "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "loose_forms": { "type": "array", "description": "Formulários avulsos do projeto.", "items": { "description": "Formulário avulso vinculado ao projeto.", "type": "object", "properties": { "id": { "type": "integer", "description": "ID do vínculo entre o projeto e o formulário." }, "project_id": { "type": "string", "description": "Projeto dono do vínculo.", "format": "uuid" }, "form_id": { "type": "integer", "description": "Formulário vinculado." }, "frame_id": { "type": "string", "description": "ID (UUID) da conta dona do vínculo.", "format": "uuid" }, "created_at": { "type": "string", "description": "Data do vínculo.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" }, "form": { "type": "object", "description": "Formulário.", "properties": { "id": { "type": "integer", "description": "ID do formulário." }, "title": { "type": "string", "description": "Nome do formulário." }, "frame_id": { "type": "string", "description": "ID (UUID) da conta dona do formulário.", "format": "uuid" }, "created_at": { "type": "string", "description": "Data de criação.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data em que o formulário foi removido.", "format": "date-time" } } } } } } }, "required": [ "response", "loose_forms" ] }, "example": { "response": true, "loose_forms": [ { "id": 412, "project_id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "form_id": 119, "frame_id": "019c75de-532c-7047-9563-daf1448ca963", "created_at": "2026-08-14T10:22:03.000000Z", "updated_at": "2026-08-14T10:22:03.000000Z", "form": { "id": 119, "title": "Vistoria técnica", "frame_id": "019c75de-532c-7047-9563-daf1448ca963", "created_at": "2026-02-03T08:00:00.000000Z", "updated_at": "2026-02-03T08:00:00.000000Z", "deleted_at": null } } ] } } } } } }, "post": { "tags": [ "projects", "Formulários avulsos" ], "summary": "Vincular um formulário avulso", "description": "Anexa um formulário existente ao projeto como formulário avulso, deixando-o disponível para resposta independentemente da etapa. O mesmo formulário pode ser anexado mais de uma vez, gerando vínculos distintos.", "operationId": "vinculaUmFormulRioAvulsoAUmProjeto", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "description": "Vínculo criado.", "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "loose_form": { "type": "object", "description": "Formulário avulso vinculado ao projeto.", "properties": { "id": { "type": "integer", "description": "ID do vínculo entre o projeto e o formulário." }, "project_id": { "type": "string", "description": "Projeto dono do vínculo.", "format": "uuid" }, "form_id": { "type": "integer", "description": "Formulário vinculado." }, "frame_id": { "type": "string", "description": "ID (UUID) da conta dona do vínculo.", "format": "uuid" }, "created_at": { "type": "string", "description": "Data do vínculo.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" }, "form": { "type": "object", "description": "Formulário.", "properties": { "id": { "type": "integer", "description": "ID do formulário." }, "title": { "type": "string", "description": "Nome do formulário." }, "frame_id": { "type": "string", "description": "ID (UUID) da conta dona do formulário.", "format": "uuid" }, "created_at": { "type": "string", "description": "Data de criação.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data em que o formulário foi removido.", "format": "date-time" } } } } } }, "required": [ "response", "loose_form" ] }, "example": { "response": true, "loose_form": { "id": 412, "project_id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "form_id": 119, "frame_id": "019c75de-532c-7047-9563-daf1448ca963", "created_at": "2026-08-14T10:22:03.000000Z", "updated_at": "2026-08-14T10:22:03.000000Z", "form": { "id": 119, "title": "Vistoria técnica", "frame_id": "019c75de-532c-7047-9563-daf1448ca963", "created_at": "2026-02-03T08:00:00.000000Z", "updated_at": "2026-02-03T08:00:00.000000Z", "deleted_at": null } } } } } }, "404": { "description": "Formulário não encontrado", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." } }, "required": [ "response", "message", "error" ] }, "example": { "response": false, "message": "form_model_not_found", "error": "No query results for model [App\\\\Models\\\\Form] 999999" } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "id": { "type": "integer", "description": "ID do formulário a anexar ao projeto." } }, "description": "Formulário a vincular.", "required": [ "id" ] }, "example": { "id": null } } } } }, "parameters": [ { "name": "project", "in": "path", "required": true, "description": "ID (UUID) do projeto.", "schema": { "type": "string" }, "example": "{{project_id}}" } ] }, "/api/management/projects/{project}/loose-forms/{loose_form}": { "delete": { "tags": [ "projects", "Formulários avulsos" ], "summary": "Desvincular um formulário avulso", "description": "Remove o vínculo entre o projeto e um formulário avulso. O formulário em si continua existindo e pode ser anexado novamente.", "operationId": "desvinculaUmFormulRioAvulsoDeUmProjeto", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." } }, "description": "Confirmação de que a operação foi concluída.", "required": [ "response" ] }, "example": { "response": true } } } } } }, "parameters": [ { "name": "project", "in": "path", "required": true, "description": "ID (UUID) do projeto.", "schema": { "type": "string" }, "example": "{{project_id}}" }, { "name": "loose_form", "in": "path", "required": true, "description": "ID do vínculo entre o projeto e o formulário avulso.", "schema": { "type": "string" }, "example": "" } ] }, "/api/management/projects/{id}": { "get": { "summary": "Obter um projeto", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "description": "Detalhe completo de um projeto.", "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "project": { "type": "object", "description": "Projeto com todos os dados relacionados.", "properties": { "id": { "type": "string", "description": "ID (UUID) do projeto.", "format": "uuid" }, "code": { "type": "string", "description": "Código do projeto." }, "name": { "type": "string", "description": "Nome do projeto." }, "description": { "type": "string", "description": "Descrição do projeto." }, "status": { "type": "integer", "description": "Situação: 1 em andamento, 2 concluído, 3 arquivado, 4 parado." }, "impact": { "type": "integer", "description": "Grau de impacto, de 1 a 10." }, "budget": { "type": "number", "description": "Orçamento do projeto." }, "is_template": { "type": "boolean", "description": "Indica se o projeto é um modelo." }, "parent_id": { "type": "string", "description": "ID do projeto pai.", "format": "uuid" }, "children_count": { "type": "integer", "description": "Quantidade de projetos filhos diretos." }, "customer": { "type": "object", "description": "Cliente vinculado." }, "contact": { "type": "object", "description": "Contato vinculado." }, "funnels": { "type": "array", "description": "Funis em que o projeto está, com etapas, etiquetas, status e anexos.", "items": { "description": "Funil do projeto.", "type": "object" } }, "funnel_steps": { "type": "array", "description": "Etapas que o projeto ocupa no momento.", "items": { "description": "Etapa ocupada.", "type": "object" } }, "loose_checklists": { "type": "array", "description": "Checklists avulsos do projeto.", "items": { "description": "Item de checklist avulso.", "type": "object" } }, "loose_forms": { "type": "array", "description": "Formulários avulsos do projeto.", "items": { "description": "Formulário avulso.", "type": "object" } }, "users": { "type": "array", "description": "Pessoas ligadas ao projeto, com o papel de cada uma.", "items": { "description": "Usuário do projeto.", "type": "object" } }, "created_at": { "type": "string", "description": "Data de criação.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" } } } }, "required": [ "response", "project" ] }, "example": { "response": true, "project": { "id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "parent_id": null, "old_id": null, "code": "TS-4", "name": "Aprovar layout final", "description": "Aprovação do layout antes do envio à gráfica.", "impact": 8, "frame_id": "019def40-4c60-726c-b30f-1ecf669b009a", "created_at": "2026-05-09T22:28:57.000000Z", "updated_at": "2026-05-09T22:28:59.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "status": 1, "budget": 1500, "is_template": false, "created_by": "019def40-491f-70cd-9d0a-91b43fa4f10e", "deleted_at": null, "children_count": 0, "form": null, "executors": [ { "id": "019def40-491f-70cd-9d0a-91b43fa4f10e", "user": "Test User", "hourly_rate": 50, "elapsed": 0, "elapsed_amount": 0, "expected": 28800, "expected_amount": 400 } ], "customer": null, "contact": null, "funnels": [ { "id": 35, "name": "Aprovação de Criativos", "prefix": "TS", "order": 2, "condition": "active", "allow_multi_step": false, "show_cost_info": true, "business_area_id": null, "form_id": null, "frame_id": "019def40-4c60-726c-b30f-1ecf669b009a", "created_at": "2026-05-09T22:10:27.000000Z", "updated_at": "2026-05-09T22:10:27.000000Z", "deleted_at": null, "funnel_config_template_id": null, "allow_execution": true, "project_term": null, "pivot": { "project_id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "project_funnel_id": 35, "id": 301, "statuses_at": null, "statuses_by": null, "funnel_status_id": null, "forecast_date": null, "realized_forecast_date": null, "created_at": "2026-05-09T22:28:57.000000Z", "forecast_date_update_count": 0 }, "steps": [ { "id": 131, "name": "Briefing", "project_funnel_id": 35, "sensation_amount": 0, "step_forward_id": null, "step_backward_id": null, "order": 1, "help_text": null, "form_id": null, "sort_config": null, "allow_execution": true, "show_customer_form": false, "show_contact_form": false, "hide_customer_form_when_linked": false, "hide_contact_form_when_linked": false, "created_at": "2026-05-09T22:10:27.000000Z", "updated_at": "2026-05-09T22:10:27.000000Z", "deleted_at": null, "checklists": [], "attachments": [], "form": null }, { "id": 133, "name": "Revisão", "project_funnel_id": 35, "sensation_amount": 0, "step_forward_id": null, "step_backward_id": null, "order": 2, "help_text": null, "form_id": null, "sort_config": null, "allow_execution": true, "show_customer_form": false, "show_contact_form": false, "hide_customer_form_when_linked": false, "hide_contact_form_when_linked": false, "created_at": "2026-05-09T22:10:27.000000Z", "updated_at": "2026-05-11T17:29:32.000000Z", "deleted_at": null, "checklists": [], "attachments": [], "form": null } ], "form": null, "tags": [ { "id": 1, "name": "Urgente", "color": "#ff8d92", "project_funnel_id": 35, "deleted_at": null } ], "funnel_status": [ { "id": 1, "name": "Concluído", "color": "#7fd87d", "project_funnel_id": 35, "is_conclusive": true, "created_at": "2026-05-09T22:10:27.000000Z", "updated_at": "2026-05-09T22:10:27.000000Z", "deleted_at": null }, { "id": 2, "name": "Em andamento", "color": "#ffe66a", "project_funnel_id": 35, "is_conclusive": false, "created_at": "2026-05-09T22:10:27.000000Z", "updated_at": "2026-05-09T22:10:27.000000Z", "deleted_at": null } ], "attachments": [] } ], "project_checklists": [ { "id": "019e27a9-2b1b-7095-955a-3b0cc8bdabeb", "name": "Limpar o estoque", "completed_at": null, "author_id": "019def40-491f-70cd-9d0a-91b43fa4f10e", "checked_by_id": null, "project_id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "created_at": "2026-05-14T18:04:18.000000Z", "updated_at": "2026-05-14T19:04:43.000000Z", "order": 0 }, { "id": "019e27ab-5064-71f9-aed4-78e0728a42d0", "name": "Fazer deploy", "completed_at": "2026-05-14T19:00:00.000000Z", "author_id": "019def40-491f-70cd-9d0a-91b43fa4f10e", "checked_by_id": "019def40-491f-70cd-9d0a-91b43fa4f10e", "project_id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "created_at": "2026-05-14T18:06:39.000000Z", "updated_at": "2026-05-14T19:04:43.000000Z", "order": 1 } ], "funnel_steps": [ { "id": 131, "name": "Briefing", "project_funnel_id": 35, "sensation_amount": 0, "step_forward_id": null, "step_backward_id": null, "order": 1, "help_text": null, "form_id": null, "sort_config": null, "allow_execution": true, "show_customer_form": false, "show_contact_form": false, "hide_customer_form_when_linked": false, "hide_contact_form_when_linked": false, "created_at": "2026-05-09T22:10:27.000000Z", "updated_at": "2026-05-09T22:10:27.000000Z", "deleted_at": null, "pivot": { "project_id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "funnel_step_id": 131, "id": 351, "order": 0, "created_at": "2026-05-09T22:28:59.000000Z" }, "funnel_step_blockings": [] } ], "step_form": [], "checklists": [], "tags": [ { "id": 1, "name": "Urgente", "color": "#ff8d92", "project_funnel_id": 35, "deleted_at": null, "pivot": { "project_id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "funnel_tag_id": 1, "id": 1 } } ], "merged_project": null, "loose_forms": [], "forum": null, "groups": [], "users": [ { "id": "019def40-491f-70cd-9d0a-91b43fa4f10e", "name": "Test User", "avatar_url": "https://api.dicebear.com/9.x/avataaars/svg?seed=olie-tester&size=80", "pivot": { "project_id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "user_id": "019def40-491f-70cd-9d0a-91b43fa4f10e", "role": "creator", "created_at": "2026-05-09T22:28:57.000000Z", "updated_at": "2026-05-09T22:28:57.000000Z" } } ], "children": [], "parent": null, "frame": { "id": "019def40-4c60-726c-b30f-1ecf669b009a", "old_id": null, "name": "OlieDev Company", "type": "2", "read_only_until": null, "status": 1, "subdomain": "devframe", "frame_billing_data_id": "019df979-ee1d-71a9-8d84-08ad22537c8f", "model_forms": null, "logo_img": null, "cockpit_access": 0 } } } } } }, "401": { "description": "Não autenticado", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." } }, "required": [ "response", "message", "error" ] }, "example": { "response": false, "message": "unauthorized", "error": "Unauthenticated." } } } }, "403": { "description": "Sem permissão", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." }, "permission": { "type": "string", "description": "Permissão exigida e não concedida ao usuário autenticado." } }, "required": [ "response", "message", "error" ] }, "example": { "response": false, "message": "permission_required", "error": "User does not have the right permissions.", "permission": "projects.view.019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf" } } } }, "404": { "description": "Projeto não encontrado", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." } }, "required": [ "response", "message", "error" ] }, "example": { "response": false, "message": "project_model_not_found", "error": "No query results for model [App\\Models\\Project] 00000000-0000-0000-0000-000000000000" } } } } }, "tags": [ "projects", "Projetos" ], "description": "Retorna os detalhes completos de um projeto pelo seu ID. O retorno inclui dados do próprio projeto, cliente e contato associados, funis em que o projeto está cadastrado (com todas as etapas, etiquetas, status e anexos), etapas atuais ocupadas, checklists avulsos, formulários respondidos do objeto projeto, grupos de projeto, usuários do projeto (criador e atribuídos), hierarquia (pai e filhos), executores envolvidos, etc.", "parameters": [ { "name": "is_template", "in": "query", "description": "`true` busca entre os modelos de projeto em vez dos projetos comuns.", "schema": { "type": "string" }, "example": "" } ] }, "parameters": [ { "name": "id", "in": "path", "required": true, "description": "ID (UUID) do projeto.", "schema": { "type": "string" }, "example": "{{project_id}}" } ], "put": { "summary": "Editar um projeto", "responses": { "200": { "description": "Editado com sucesso", "headers": { "Date": { "schema": { "type": "string" }, "example": "Tue, 16 Dec 2025 18:49:13 GMT" }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" }, "Connection": { "schema": { "type": "string" }, "example": "keep-alive" }, "Cache-Control": { "schema": { "type": "string" }, "example": "private, must-revalidate" }, "pragma": { "schema": { "type": "string" }, "example": "no-cache" }, "expires": { "schema": { "type": "integer" }, "example": -1 }, "X-RateLimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-RateLimit-Remaining": { "schema": { "type": "integer" }, "example": 159 }, "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" } }, "content": { "application/json": { "schema": { "description": "Projeto retornado pela operação.", "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "project": { "type": "object", "description": "Projeto.", "properties": { "id": { "type": "string", "description": "ID (UUID) do projeto.", "format": "uuid" }, "frame_id": { "type": "string", "description": "ID (UUID) da conta dona do projeto.", "format": "uuid" }, "code": { "type": "string", "description": "Código do projeto, formado pelo prefixo e por um número sequencial." }, "name": { "type": "string", "description": "Nome do projeto." }, "description": { "type": "string", "description": "Descrição do projeto." }, "status": { "type": "integer", "description": "Situação: 1 em andamento, 2 concluído, 3 arquivado, 4 parado." }, "impact": { "type": "integer", "description": "Grau de impacto, de 1 a 10." }, "budget": { "type": "number", "description": "Orçamento do projeto." }, "is_template": { "type": "boolean", "description": "Indica se o projeto é um modelo." }, "parent_id": { "type": "string", "description": "ID do projeto pai, quando este é um subprojeto.", "format": "uuid" }, "customer_id": { "type": "string", "description": "ID do cliente vinculado.", "format": "uuid" }, "contact_id": { "type": "string", "description": "ID do contato vinculado.", "format": "uuid" }, "created_by": { "type": "string", "description": "ID do usuário que criou o projeto.", "format": "uuid" }, "created_at": { "type": "string", "description": "Data de criação.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data em que foi enviado para a lixeira.", "format": "date-time" } } } }, "required": [ "response", "project" ] }, "example": { "response": true, "project": { "id": "019b277f-e453-733d-a00e-6d26d444008b", "parent_id": null, "old_id": null, "code": "P-83", "name": "Laboratório Hawkins", "description": "Companhia de energia da cidade de Hawkins", "impact": 5, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-16T14:10:51.000000Z", "updated_at": "2025-12-16T18:49:13.000000Z", "customer_id": "019b277d-c615-723f-a1dd-f03940bce866", "contact_id": 12597, "share_token": null, "share_settings": null, "merged_id": null, "status": 1, "budget": 950000, "is_template": false, "created_by": "019aeaa3-2370-731c-9008-be759795f449", "deleted_at": null, "form_answers": [ { "id": 2130, "label": "Texto curto", "answer": null, "model": "Project", "answered_by": null, "updated_at": "2025-12-16T14:45:52.000000Z" }, { "id": 2131, "label": "Texto longo", "answer": null, "model": "Project", "answered_by": null, "updated_at": "2025-12-16T14:45:52.000000Z" } ], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "old_id": null, "name": "OlieDev Company ", "type": "work", "status": 1, "subdomain": "devframe", "frame_billing_data_id": null, "model_forms": [ { "id": 377, "class": "App\\Models\\Project" } ], "logo_img": null, "cockpit_access": 0 } } } } } }, "401": { "description": "Não autorizado", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." } }, "required": [ "response", "message", "error" ] }, "example": { "response": "", "message": "", "error": "" } } } }, "404": { "description": "Model não encontrada", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." } }, "required": [ "response", "message", "error" ] }, "example": { "response": "", "message": "", "error": "" } } } }, "422": { "description": "Erro de validação ou hierarquia inválida", "headers": { "Date": { "schema": { "type": "string" }, "example": "Tue, 16 Dec 2025 18:52:00 GMT" }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" }, "Connection": { "schema": { "type": "string" }, "example": "keep-alive" }, "Cache-Control": { "schema": { "type": "string" }, "example": "private, must-revalidate" }, "X-RateLimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-RateLimit-Remaining": { "schema": { "type": "integer" }, "example": 158 }, "pragma": { "schema": { "type": "string" }, "example": "no-cache" }, "expires": { "schema": { "type": "integer" }, "example": -1 }, "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." }, "validation": { "type": "object", "description": "Mapa de campo para as mensagens de validação daquele campo.", "properties": {} } }, "required": [ "response", "message", "error" ] }, "examples": { "Erro de validação": { "value": { "response": false, "message": "validation_errors", "error": "The descrição must be a string. (and 1 more error)", "validation": { "description": [ "The descrição must be a string." ], "impact": [ "The impact must not be greater than 10." ] } } }, "Relação pai-filho inválida": { "summary": "invalid_parent_child_relationship", "description": "Retornado quando o parent_id informado criaria ciclo, auto-referência ou ultrapassaria o limite de profundidade da hierarquia. Mesmo slug usado pelos endpoints de hierarquia (attach-child / move-to-parent).", "value": { "response": false, "message": "invalid_parent_child_relationship", "error": "Cannot save project: would create an invalid hierarchy (loop, depth limit, or self-reference)" } } } } } } }, "tags": [ "projects", "Projetos" ], "description": "Atualiza os dados de um projeto existente. Todos os campos são opcionais — envie apenas o que deve mudar. Vínculos (funis, etiquetas, grupos, filhos) são alterados pelas listas `to_add` e `to_rem`; o que não é citado permanece como está.", "requestBody": { "content": { "application/json": { "schema": { "description": "Campos a alterar. Todos são opcionais; o que não for enviado permanece como está.", "type": "object", "properties": { "name": { "type": "string", "description": "Nome do projeto. Até 191 caracteres." }, "description": { "type": "string", "description": "Descrição do projeto." }, "impact": { "type": "integer", "minimum": 1, "maximum": 10, "description": "Grau de impacto, de 1 a 10." }, "contact_id": { "type": "string", "description": "ID do contato a vincular. `null` remove o vínculo.", "format": "uuid" }, "customer_id": { "type": "string", "description": "ID do cliente a vincular. `null` remove o vínculo.", "format": "uuid" }, "status": { "type": "integer", "enum": [ 1, 2, 3, 4 ], "description": "Situação: 1 em andamento, 2 concluído, 3 arquivado, 4 parado." }, "budget": { "type": "number", "description": "Orçamento do projeto." }, "is_template": { "type": "boolean", "description": "`true` transforma o projeto em modelo." }, "parent_id": { "type": "string", "description": "ID do projeto pai. `null` deixa o projeto na raiz.", "format": "uuid" }, "funnels": { "type": "object", "description": "Funis em que o projeto entra ou de que sai.", "properties": { "to_add": { "type": "array", "description": "IDs a vincular.", "items": { "type": "integer", "description": "ID a vincular." } }, "to_rem": { "type": "array", "description": "IDs a desvincular.", "items": { "type": "integer", "description": "ID a desvincular." } } } }, "groups": { "type": "object", "description": "Grupos de projeto a vincular ou desvincular.", "properties": { "to_add": { "type": "array", "description": "IDs a vincular.", "items": { "type": "string", "description": "ID a vincular." } }, "to_rem": { "type": "array", "description": "IDs a desvincular.", "items": { "type": "string", "description": "ID a desvincular." } } } }, "tags": { "type": "object", "description": "Etiquetas de funil a aplicar ou remover.", "properties": { "to_add": { "type": "array", "description": "IDs a vincular.", "items": { "type": "integer", "description": "ID a vincular." } }, "to_rem": { "type": "array", "description": "IDs a desvincular.", "items": { "type": "integer", "description": "ID a desvincular." } } } }, "childrens": { "type": "object", "description": "Projetos filhos a vincular ou desvincular.", "properties": { "to_add": { "type": "array", "description": "IDs a vincular.", "items": { "type": "string", "description": "ID a vincular." } }, "to_rem": { "type": "array", "description": "IDs a desvincular.", "items": { "type": "string", "description": "ID a desvincular." } } } }, "users": { "type": "array", "description": "Pessoas a incluir ou retirar do projeto.", "items": { "description": "Vínculo de um usuário com o projeto.", "type": "object", "properties": { "user_id": { "type": "string", "description": "ID (UUID) do usuário.", "format": "uuid" }, "role": { "type": "string", "description": "Papel no projeto: `assignee` (responsável) ou `follower` (seguidor)." }, "action": { "type": "string", "description": "`add` inclui o usuário; `remove` o retira." } } } }, "forecast_dates": { "type": "array", "description": "Datas de previsão por funil.", "items": { "description": "Data prevista do projeto em um funil.", "type": "object", "properties": { "date": { "type": "string", "description": "Data prevista no formato AAAA-MM-DD.", "format": "date" }, "project_funnel_id": { "type": "integer", "description": "ID do funil a que a previsão se refere." } } } }, "funnel_status": { "type": "object", "description": "Status do projeto dentro de um funil.", "properties": { "project_funnel_id": { "type": "integer", "description": "ID do funil." }, "funnel_status_id": { "type": "integer", "description": "ID do status a aplicar." } } }, "form_answers": { "type": "array", "description": "Respostas de formulário do projeto.", "items": { "description": "Resposta de um campo de formulário.", "type": "object", "properties": { "id": { "type": "integer", "description": "ID do campo do formulário." }, "answer": { "type": "string", "description": "Resposta do campo." } } } } } }, "example": { "name": "Nome do projeto", "description": "Descrição detalhada do projeto", "impact": 5, "contact_id": null, "customer_id": null, "status": 1, "budget": 25000, "is_template": false, "parent_id": null, "funnels": { "to_add": [], "to_rem": [] }, "groups": { "to_add": [], "to_rem": [] }, "tags": { "to_add": [], "to_rem": [] }, "users": [ { "user_id": null, "role": "assignee", "action": "add" } ], "childrens": { "to_add": [], "to_rem": [] }, "forecast_dates": [ { "date": "2026-09-01", "project_funnel_id": null } ], "funnel_status": { "project_funnel_id": null, "funnel_status_id": null }, "form_answers": [ { "id": null, "answer": "Resposta do campo" } ] } } } } }, "delete": { "summary": "Deletar um projeto", "responses": { "200": { "description": "Resposta de sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." } }, "description": "Confirmação de que a operação foi concluída.", "required": [ "response" ] }, "example": { "response": "" } } } }, "401": { "description": "Não autorizado", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." } }, "required": [ "response", "message", "error" ] }, "example": { "response": "", "message": "", "error": "" } } } }, "404": { "description": "Model não encontrada", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." } }, "required": [ "response", "message", "error" ] }, "example": { "response": "", "message": "", "error": "" } } } } }, "tags": [ "projects", "Projetos" ], "description": "Deleta um projeto pelo ID. A exclusão é lógica: o projeto sai das listagens, passa a ser encontrado com `trashed=true` e pode voltar pelo endpoint de restauração." } }, "/api/management/projects/merge": { "post": { "tags": [ "projects", "Cópia e compartilhamento" ], "summary": "Mesclar projetos", "description": "Une dois ou mais projetos em um só. O resultado é um **projeto novo**, criado a partir do projeto principal (`majority`), que recebe os funis, conteúdos, fórum e tarefas de todos os demais.\n\nOs projetos de origem — inclusive o principal — são arquivados e removidos das listagens ao final, com o histórico registrando a mesclagem. Projetos já mesclados anteriormente não podem ser mesclados de novo.", "operationId": "mesclarProjetos", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "description": "Projeto retornado pela operação.", "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "project": { "type": "object", "description": "Projeto.", "properties": { "id": { "type": "string", "description": "ID (UUID) do projeto.", "format": "uuid" }, "frame_id": { "type": "string", "description": "ID (UUID) da conta dona do projeto.", "format": "uuid" }, "code": { "type": "string", "description": "Código do projeto, formado pelo prefixo e por um número sequencial." }, "name": { "type": "string", "description": "Nome do projeto." }, "description": { "type": "string", "description": "Descrição do projeto." }, "status": { "type": "integer", "description": "Situação: 1 em andamento, 2 concluído, 3 arquivado, 4 parado." }, "impact": { "type": "integer", "description": "Grau de impacto, de 1 a 10." }, "budget": { "type": "number", "description": "Orçamento do projeto." }, "is_template": { "type": "boolean", "description": "Indica se o projeto é um modelo." }, "parent_id": { "type": "string", "description": "ID do projeto pai, quando este é um subprojeto.", "format": "uuid" }, "customer_id": { "type": "string", "description": "ID do cliente vinculado.", "format": "uuid" }, "contact_id": { "type": "string", "description": "ID do contato vinculado.", "format": "uuid" }, "created_by": { "type": "string", "description": "ID do usuário que criou o projeto.", "format": "uuid" }, "created_at": { "type": "string", "description": "Data de criação.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data em que foi enviado para a lixeira.", "format": "date-time" } } } }, "required": [ "response", "project" ] }, "example": { "response": true, "project": { "id": "019e1c19-3b40-7002-8a71-0f6d2c94e5aa", "frame_id": "019c75de-532c-7047-9563-daf1448ca963", "code": "SC-15", "name": "Shopping Center", "description": "Obra completa do empreendimento", "status": 1, "impact": 9, "budget": 340000, "merged_id": null, "created_by": "019c1e87-63f4-71dd-a4e3-6eaea0619c2f", "created_at": "2026-08-19T11:40:02.000000Z", "updated_at": "2026-08-19T11:40:02.000000Z" } } } } }, "422": { "description": "Projetos insuficientes", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." }, "validation": { "type": "object", "description": "Mapa de campo para as mensagens de validação daquele campo.", "properties": {} } }, "required": [ "response", "message", "error", "validation" ] }, "example": { "response": false, "message": "validation_errors", "error": "You must select at least 2 projects", "validation": { "projects": [ "You must select at least 2 projects" ] } } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "projects": { "type": "array", "description": "Projetos a mesclar. Pelo menos dois, incluindo o principal.", "items": { "type": "string", "description": "ID (UUID) de um projeto a mesclar.", "format": "uuid" } }, "majority": { "type": "string", "description": "ID (UUID) do projeto principal, que serve de base para o resultado.", "format": "uuid" } }, "description": "Projetos que serão unidos.", "required": [ "projects", "majority" ] }, "example": { "projects": [], "majority": null } } } } } }, "/api/management/projects/ids": { "post": { "tags": [ "projects", "Projetos" ], "summary": "Listar IDs de projetos", "description": "Retorna somente os IDs dos projetos que correspondem aos filtros enviados, sem paginação e sem os demais dados do projeto. Útil para aplicar uma ação em lote sobre todo o resultado de uma busca.\n\nOs filtros usam o mesmo formato da [busca avançada](https://docs.olie.ai/api-reference/general/advanced-search).", "operationId": "listarIdsDeProjetos", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "project_ids": { "type": "array", "description": "IDs encontrados.", "items": { "type": "string", "description": "ID (UUID) de um projeto que atende aos filtros.", "format": "uuid" } } }, "description": "IDs dos projetos filtrados.", "required": [ "response", "project_ids" ] }, "example": { "response": true, "project_ids": [ "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "019e0f22-8c11-7233-b5a1-77d0c9e41a02", "019e0f23-1a5e-7460-9c33-2b7f8de10c55" ] } } } } }, "requestBody": { "content": { "application/json": { "schema": { "description": "Filtros que definem o conjunto de projetos.", "type": "object", "properties": { "filters": { "type": "array", "description": "Filtros aplicados à busca.", "items": { "description": "Um filtro da busca avançada.", "type": "object", "properties": { "field": { "type": "string", "description": "Campo a filtrar." }, "operator": { "type": "string", "enum": [ "equals", "not_equals", "contains", "not_contains", "greater_than", "greater_than_or_equals", "less_than", "less_than_or_equals", "is_null", "is_not_null" ], "description": "Operador da comparação." }, "logical_operator": { "type": "string", "description": "Como o filtro se junta ao anterior: `and` (padrão) ou `or`." }, "arguments": { "type": "array", "description": "Argumentos extras exigidos por alguns filtros.", "items": { "description": "Argumento do filtro." } } }, "required": [ "field", "operator" ] } } } }, "example": { "filters": [] } } } } } }, "/api/management/get-projects-by-forecast-dates": { "post": { "tags": [ "projects", "Métricas e previsão" ], "summary": "Listar projetos por data de previsão", "description": "Agrupa os projetos de um funil pelos meses de previsão informados. Para cada par ano/mês a resposta traz os projetos com data prevista naquele mês, a contagem e a soma dos orçamentos — é o que alimenta a visão de calendário do funil.\n\nAceita os mesmos filtros da [busca avançada](https://docs.olie.ai/api-reference/general/advanced-search), aplicados a todos os meses da consulta.", "operationId": "obterProjetosPorDatasDePrevisO", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "description": "Projetos agrupados por mês de previsão.", "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "dates_with_projects": { "type": "array", "description": "Um grupo por mês consultado, na ordem enviada.", "items": { "description": "Projetos de um mês.", "type": "object", "properties": { "date": { "type": "object", "description": "Mês a que o grupo se refere.", "properties": { "year": { "type": "integer", "description": "Ano consultado." }, "month": { "type": "integer", "description": "Mês consultado." } } }, "projects": { "type": "array", "description": "Projetos com previsão naquele mês.", "items": { "description": "Projeto.", "type": "object", "properties": { "id": { "type": "string", "description": "ID (UUID) do projeto.", "format": "uuid" }, "frame_id": { "type": "string", "description": "ID (UUID) da conta dona do projeto.", "format": "uuid" }, "code": { "type": "string", "description": "Código do projeto, formado pelo prefixo e por um número sequencial." }, "name": { "type": "string", "description": "Nome do projeto." }, "description": { "type": "string", "description": "Descrição do projeto." }, "status": { "type": "integer", "description": "Situação: 1 em andamento, 2 concluído, 3 arquivado, 4 parado." }, "impact": { "type": "integer", "description": "Grau de impacto, de 1 a 10." }, "budget": { "type": "number", "description": "Orçamento do projeto." }, "is_template": { "type": "boolean", "description": "Indica se o projeto é um modelo." }, "parent_id": { "type": "string", "description": "ID do projeto pai, quando este é um subprojeto.", "format": "uuid" }, "customer_id": { "type": "string", "description": "ID do cliente vinculado.", "format": "uuid" }, "contact_id": { "type": "string", "description": "ID do contato vinculado.", "format": "uuid" }, "created_by": { "type": "string", "description": "ID do usuário que criou o projeto.", "format": "uuid" }, "created_at": { "type": "string", "description": "Data de criação.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data em que foi enviado para a lixeira.", "format": "date-time" } } } }, "projects_count": { "type": "integer", "description": "Quantidade de projetos no mês." }, "projects_budget": { "type": "number", "description": "Soma dos orçamentos do mês." } } } } }, "required": [ "response", "dates_with_projects" ] }, "example": { "response": true, "dates_with_projects": [ { "date": { "year": 2026, "month": 9 }, "projects": [ { "id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "code": "SC-1", "name": "Shopping Center", "status": 1, "impact": 9, "budget": 340000, "forecast_date": "2026-09-14" } ], "projects_count": 1, "projects_budget": 340000 }, { "date": { "year": 2026, "month": 10 }, "projects": [], "projects_count": 0, "projects_budget": 0 } ] } } } }, "422": { "description": "Validação falhou", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." }, "validation": { "type": "object", "description": "Mapa de campo para as mensagens de validação daquele campo.", "properties": {} } }, "required": [ "response", "message", "error", "validation" ] }, "example": { "response": false, "message": "validation_errors", "error": "O campo project funnel id é obrigatório. (and 1 more error)", "validation": { "project_funnel_id": [ "O campo project funnel id é obrigatório." ], "dates": [ "O campo dates é obrigatório." ] } } } } } }, "requestBody": { "content": { "application/json": { "schema": { "description": "Funil e meses da consulta.", "type": "object", "properties": { "project_funnel_id": { "type": "integer", "description": "ID do funil consultado." }, "dates": { "type": "array", "description": "Meses a consultar.", "items": { "description": "Mês consultado.", "type": "object", "properties": { "year": { "type": "integer", "description": "Ano da previsão." }, "month": { "type": "integer", "minimum": 1, "maximum": 12, "description": "Mês da previsão, de 1 a 12." } } } }, "filters": { "type": "array", "description": "Filtros aplicados aos projetos de todos os meses.", "items": { "description": "Um filtro da busca avançada.", "type": "object", "properties": { "field": { "type": "string", "description": "Campo a filtrar." }, "operator": { "type": "string", "enum": [ "equals", "not_equals", "contains", "not_contains", "greater_than", "greater_than_or_equals", "less_than", "less_than_or_equals", "is_null", "is_not_null" ], "description": "Operador da comparação." }, "logical_operator": { "type": "string", "description": "Como o filtro se junta ao anterior: `and` (padrão) ou `or`." }, "arguments": { "type": "array", "description": "Argumentos extras exigidos por alguns filtros.", "items": { "description": "Argumento do filtro." } } }, "required": [ "field", "operator" ] } } }, "required": [ "project_funnel_id", "dates" ] }, "example": { "project_funnel_id": null, "dates": [ { "year": 2026, "month": 9 } ], "filters": [] } } } } } }, "/api/management/save-media": { "post": { "summary": "Enviar um conteúdo no projeto", "responses": { "200": { "description": "Conteúdo enviado a vários projetos", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "Date": { "schema": { "type": "string" }, "example": "Thu, 15 Jan 2026 19:01:51 GMT" }, "X-Ratelimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-Ratelimit-Remaining": { "schema": { "type": "integer" }, "example": 154 }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" } }, "content": { "application/json": { "schema": { "description": "Conteúdos criados quando o envio atinge vários projetos.", "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "medias": { "type": "array", "description": "Conteúdos criados, um por projeto.", "items": { "description": "Conteúdo do projeto.", "type": "object", "properties": { "id": { "type": "string", "description": "ID (UUID) do conteúdo.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do conteúdo ou do arquivo." }, "technical_name": { "type": "string", "description": "Nome interno usado no armazenamento." }, "type": { "type": "integer", "description": "Tipo do conteúdo: 1 texto, 2 arquivo, 3 áudio." }, "extension": { "type": "string", "description": "Extensão do arquivo, quando houver." }, "text": { "type": "string", "description": "Texto enviado, quando houver." }, "file_url": { "type": "string", "description": "Endereço para baixar o arquivo, quando houver." }, "log": { "type": "string", "description": "Conteúdo do registro de atividade, quando a entrada for um log." }, "user_id": { "type": "string", "description": "Usuário que enviou o conteúdo.", "format": "uuid" }, "frame_id": { "type": "string", "description": "ID (UUID) da conta dona do conteúdo.", "format": "uuid" }, "project_id": { "type": "string", "description": "Projeto que recebeu o conteúdo.", "format": "uuid" }, "created_at": { "type": "string", "description": "Data do envio.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data em que o conteúdo foi removido.", "format": "date-time" }, "user": { "type": "object", "description": "Quem enviou o conteúdo." } } } } }, "required": [ "response", "medias" ] }, "example": { "response": true, "medias": [ { "user_id": "019b329a-3f1f-7198-89e5-008dc4e2bd60", "type": 1, "frame_id": "019b329a-4346-7064-bba3-e7c19057cda4", "project_id": "019bbcd3-2249-7357-ac43-8ab6209ec54c", "name": "description.4fea17cab04852a3b32d401766a84d5e", "technical_name": "description.4fea17cab04852a3b32d401766a84d5e", "text": "Cada porta pode ser uma porta para outro mundo.", "id": "019bc309-175d-7211-9524-29646278c39f", "updated_at": "2026-01-15T19:01:51.000000Z", "created_at": "2026-01-15T19:01:51.000000Z", "user": { "id": "019b329a-3f1f-7198-89e5-008dc4e2bd60", "old_id": null, "name": "Test User", "description": "Nostrum debitis pariatur dolorum sapiente.", "email": "tester@olie.ai", "avatar_url": "https://via.placeholder.com/124x124.png/00eebb?text=vero", "status": 1, "lang": "en", "email_verified_at": "2025-12-18 14:55:28" } }, { "user_id": "019b329a-3f1f-7198-89e5-008dc4e2bd60", "type": 1, "frame_id": "019b329a-4346-7064-bba3-e7c19057cda4", "project_id": "019bc2c3-5404-707f-be4d-9690f6bb8179", "name": "description.4fea17cab04852a3b32d401766a84d5e", "technical_name": "description.4fea17cab04852a3b32d401766a84d5e", "text": "Cada porta pode ser uma porta para outro mundo.", "id": "019bc309-1777-71e5-98c3-bff91d787182", "updated_at": "2026-01-15T19:01:51.000000Z", "created_at": "2026-01-15T19:01:51.000000Z", "user": { "id": "019b329a-3f1f-7198-89e5-008dc4e2bd60", "old_id": null, "name": "Test User", "description": "Nostrum debitis pariatur dolorum sapiente.", "email": "tester@olie.ai", "avatar_url": "https://via.placeholder.com/124x124.png/00eebb?text=vero", "status": 1, "lang": "en", "email_verified_at": "2025-12-18 14:55:28" } } ] } } } }, "201": { "description": "Conteúdo enviado com sucesso", "content": { "application/json": { "schema": { "description": "Conteúdo criado quando um único projeto recebe o envio.", "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "media": { "type": "object", "description": "Conteúdo do projeto.", "properties": { "id": { "type": "string", "description": "ID (UUID) do conteúdo.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do conteúdo ou do arquivo." }, "technical_name": { "type": "string", "description": "Nome interno usado no armazenamento." }, "type": { "type": "integer", "description": "Tipo do conteúdo: 1 texto, 2 arquivo, 3 áudio." }, "extension": { "type": "string", "description": "Extensão do arquivo, quando houver." }, "text": { "type": "string", "description": "Texto enviado, quando houver." }, "file_url": { "type": "string", "description": "Endereço para baixar o arquivo, quando houver." }, "log": { "type": "string", "description": "Conteúdo do registro de atividade, quando a entrada for um log." }, "user_id": { "type": "string", "description": "Usuário que enviou o conteúdo.", "format": "uuid" }, "frame_id": { "type": "string", "description": "ID (UUID) da conta dona do conteúdo.", "format": "uuid" }, "project_id": { "type": "string", "description": "Projeto que recebeu o conteúdo.", "format": "uuid" }, "created_at": { "type": "string", "description": "Data do envio.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data em que o conteúdo foi removido.", "format": "date-time" }, "user": { "type": "object", "description": "Quem enviou o conteúdo." } } } }, "required": [ "response", "media" ] }, "example": { "response": true, "media": { "user_id": "019b329a-3f1f-7198-89e5-008dc4e2bd60", "type": 1, "frame_id": "019b329a-4346-7064-bba3-e7c19057cda4", "project_id": "019bbcd3-2249-7357-ac43-8ab6209ec54c", "name": "description.46767bcea2ed5b93a9e55717177d08f0", "technical_name": "description.46767bcea2ed5b93a9e55717177d08f0", "text": "Amigos não mentem", "id": "019bc2e1-e52e-72f5-a30c-f2a6c563188c", "updated_at": "2026-01-15T18:19:02.000000Z", "created_at": "2026-01-15T18:19:02.000000Z", "user": { "id": "019b329a-3f1f-7198-89e5-008dc4e2bd60", "old_id": null, "name": "Test User", "description": "Nostrum debitis pariatur dolorum sapiente.", "email": "tester@olie.ai", "avatar_url": "https://via.placeholder.com/124x124.png/00eebb?text=vero", "status": 1, "lang": "en", "email_verified_at": "2025-12-18 14:55:28" } } } } } }, "422": { "description": "Erro de validação", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "Date": { "schema": { "type": "string" }, "example": "Thu, 15 Jan 2026 18:21:37 GMT" }, "X-Ratelimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-Ratelimit-Remaining": { "schema": { "type": "integer" }, "example": 150 }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." }, "validation": { "type": "object", "description": "Mapa de campo para as mensagens de validação daquele campo.", "properties": {} } }, "required": [ "response", "message", "error", "validation" ] }, "example": { "response": false, "message": "validation_errors", "error": "The texto field is required when type is 1.", "validation": { "text": [ "The texto field is required when type is 1." ] } } } } } }, "tags": [ "projects", "Conteúdos e arquivos" ], "description": "Envia um conteúdo — texto, áudio ou arquivo — para um ou mais projetos. Cada projeto informado recebe uma entrada própria: quando mais de uma é criada, a resposta traz `medias` (lista) no lugar de `media` (objeto).\n\nÁudio e arquivos são enviados como `multipart/form-data`. Menções escritas no texto disparam as notificações correspondentes — veja [Menções](https://docs.olie.ai/guides/fundamentals/mentions). Projetos que já foram mesclados não aceitam novos conteúdos.", "requestBody": { "content": { "application/json": { "schema": { "description": "Conteúdo a enviar.", "type": "object", "properties": { "type": { "type": "integer", "enum": [ 1, 2, 3 ], "description": "Tipo do conteúdo: 1 texto, 2 arquivo, 3 áudio.", "x-markdownDescription": "Tipo a usar" }, "project_ids": { "type": "array", "description": "Projetos que recebem o conteúdo.", "items": { "type": "string", "description": "ID (UUID) do projeto que recebe o conteúdo.", "format": "uuid" } }, "text": { "type": "string", "description": "Texto do conteúdo. Obrigatório no tipo 1. Até 50.000 caracteres." }, "file": { "type": "array", "description": "Arquivos enviados. Obrigatório no tipo 2 (multipart/form-data).", "items": { "description": "Arquivo enviado." } }, "channel_id": { "type": "string", "description": "Canal pelo qual o conteúdo é enviado. Sem ele, o conteúdo fica interno.", "format": "uuid" }, "channel_name": { "type": "string", "description": "Nome do canal, alternativa a `channel_id`. Os dois não podem vir juntos." }, "task_id": { "type": "string", "description": "Tarefa que recebe o conteúdo, quando o envio é de uma tarefa.", "format": "uuid" } }, "required": [ "type" ] }, "example": { "type": 1, "project_ids": [ "00000000-0000-0000-0000-000000000000" ], "text": "Texto a ser enviado", "file[0]": "", "audio": "" } } } } } }, "/api/management/projects": { "get": { "summary": "Listar projetos", "parameters": [ { "name": "page", "in": "query", "required": false, "description": "Página desejada. Padrão `1`.", "schema": { "type": "integer", "default": 1, "minLength": 1 }, "example": 0 }, { "name": "perPage", "in": "query", "required": false, "description": "Itens por página. Padrão `30`, máximo `100`.", "schema": { "type": "integer", "default": 30, "minLength": 1, "maxLength": 100 }, "example": 0 }, { "name": "search", "in": "query", "required": false, "description": "Termo buscado no nome ou no código do projeto.", "schema": { "type": "string", "default": "" }, "example": "" }, { "name": "id", "in": "query", "description": "ID (UUID) de um projeto específico. Quando informado, `search` é ignorado.", "schema": { "type": "string" }, "example": "" }, { "name": "trashed", "in": "query", "required": false, "description": "`true` retorna apenas os projetos na lixeira.", "schema": { "type": "boolean", "default": "" }, "example": false }, { "name": "template", "in": "query", "required": false, "description": "`true` retorna apenas os modelos de projeto.", "schema": { "type": "boolean", "default": "" }, "example": false }, { "name": "sort", "in": "query", "required": false, "description": "Campo de ordenação. Padrão `created_at`.", "schema": { "type": "string", "default": "" }, "example": "" }, { "name": "direction", "in": "query", "required": false, "description": "Direção da ordenação: `asc` ou `desc` (padrão).", "schema": { "type": "string", "enum": [ "asc", "desc" ] }, "example": "" } ], "responses": { "200": { "description": "Sucesso", "headers": { "Date": { "schema": { "type": "string" }, "example": "Tue, 16 Dec 2025 12:23:39 GMT" }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" }, "Connection": { "schema": { "type": "string" }, "example": "keep-alive" }, "Cache-Control": { "schema": { "type": "string" }, "example": "private, must-revalidate" }, "pragma": { "schema": { "type": "string" }, "example": "no-cache" }, "expires": { "schema": { "type": "integer" }, "example": -1 }, "X-RateLimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-RateLimit-Remaining": { "schema": { "type": "integer" }, "example": 158 }, "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" } }, "content": { "application/json": { "schema": { "description": "Lista paginada de projetos.", "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "meta": { "type": "object", "description": "Dados da paginação.", "properties": { "current_page": { "type": "integer", "description": "Página retornada." }, "from": { "type": "integer", "description": "Posição do primeiro item da página no total." }, "to": { "type": "integer", "description": "Posição do último item da página no total." }, "last_page": { "type": "integer", "description": "Número da última página." }, "per_page": { "type": "integer", "description": "Itens por página." }, "total": { "type": "integer", "description": "Total de itens encontrados." } } }, "projects": { "type": "array", "description": "Projetos encontrados.", "items": { "description": "Projeto.", "type": "object", "properties": { "id": { "type": "string", "description": "ID (UUID) do projeto.", "format": "uuid" }, "frame_id": { "type": "string", "description": "ID (UUID) da conta dona do projeto.", "format": "uuid" }, "code": { "type": "string", "description": "Código do projeto, formado pelo prefixo e por um número sequencial." }, "name": { "type": "string", "description": "Nome do projeto." }, "description": { "type": "string", "description": "Descrição do projeto." }, "status": { "type": "integer", "description": "Situação: 1 em andamento, 2 concluído, 3 arquivado, 4 parado." }, "impact": { "type": "integer", "description": "Grau de impacto, de 1 a 10." }, "budget": { "type": "number", "description": "Orçamento do projeto." }, "is_template": { "type": "boolean", "description": "Indica se o projeto é um modelo." }, "parent_id": { "type": "string", "description": "ID do projeto pai, quando este é um subprojeto.", "format": "uuid" }, "customer_id": { "type": "string", "description": "ID do cliente vinculado.", "format": "uuid" }, "contact_id": { "type": "string", "description": "ID do contato vinculado.", "format": "uuid" }, "created_by": { "type": "string", "description": "ID do usuário que criou o projeto.", "format": "uuid" }, "created_at": { "type": "string", "description": "Data de criação.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data em que foi enviado para a lixeira.", "format": "date-time" }, "merged_project": { "type": "object", "description": "Projeto resultante de um merge, quando carregado." } } } } }, "required": [ "response", "projects" ] }, "example": { "projects": [ { "id": "019b140c-235d-73ee-96df-3d2afbf7d13d", "old_id": null, "code": "P-80", "name": "Demogorgon", "description": "Criação rápida", "impact": 10, "parent_id": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-12T19:31:38.000000Z", "updated_at": "2025-12-12T19:31:38.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 1, "budget": 0, "is_template": false, "created_by": "019aeaa3-2370-731c-9008-be759795f449", "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [ { "id": 665, "name": "Educação Corporativa", "pivot": { "project_id": "019b140c-235d-73ee-96df-3d2afbf7d13d", "project_funnel_id": 665, "id": 42806, "statuses_at": null, "statuses_by": null, "funnel_status_id": null, "forecast_date": null, "realized_forecast_date": null, "created_at": "2025-12-12T19:31:38.000000Z", "forecast_date_update_count": 0 }, "tags": [] } ], "funnel_steps": [ { "id": 3808, "name": "Gestão de Mudanças", "project_funnel_id": 665, "sensation_amount": 25, "step_forward_id": null, "step_backward_id": null, "order": 40, "help_text": null, "form_id": null, "sort_config": null, "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-04T18:33:09.000000Z", "pivot": { "project_id": "019b140c-235d-73ee-96df-3d2afbf7d13d", "funnel_step_id": 3808, "id": 144232, "order": 0, "created_at": "2025-12-12T19:31:38.000000Z" }, "funnel_step_blockings": [] } ], "tags": [], "groups": [], "users": [ { "id": "019aeaa3-2370-731c-9008-be759795f449", "name": "Test User", "avatar_url": "https://via.placeholder.com/124x124.png/003388?text=facilis", "pivot": { "project_id": "019b140c-235d-73ee-96df-3d2afbf7d13d", "user_id": "019aeaa3-2370-731c-9008-be759795f449", "role": "creator", "created_at": "2025-12-12T19:31:38.000000Z", "updated_at": "2025-12-12T19:31:38.000000Z" } } ], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019b140b-e38e-7207-8016-9bfe6fa1d02f", "old_id": null, "code": "P-79", "name": "Demogorgon", "description": "Criação rápida", "impact": 10, "parent_id": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-12T19:31:22.000000Z", "updated_at": "2025-12-12T19:31:22.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 1, "budget": 0, "is_template": false, "created_by": "019aeaa3-2370-731c-9008-be759795f449", "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [ { "id": "019aeaa3-2370-731c-9008-be759795f449", "name": "Test User", "avatar_url": "https://via.placeholder.com/124x124.png/003388?text=facilis", "pivot": { "project_id": "019b140b-e38e-7207-8016-9bfe6fa1d02f", "user_id": "019aeaa3-2370-731c-9008-be759795f449", "role": "creator", "created_at": "2025-12-12T19:31:22.000000Z", "updated_at": "2025-12-12T19:31:22.000000Z" } } ], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019b140a-4503-7141-9e4f-bc720d0f09a3", "old_id": null, "code": "P-78", "name": "Demogorgon", "description": "Criação rápida", "impact": 10, "parent_id": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-12T19:29:36.000000Z", "updated_at": "2025-12-12T19:29:36.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 1, "budget": 0, "is_template": false, "created_by": "019aeaa3-2370-731c-9008-be759795f449", "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [ { "id": "019aeaa3-2370-731c-9008-be759795f449", "name": "Test User", "avatar_url": "https://via.placeholder.com/124x124.png/003388?text=facilis", "pivot": { "project_id": "019b140a-4503-7141-9e4f-bc720d0f09a3", "user_id": "019aeaa3-2370-731c-9008-be759795f449", "role": "creator", "created_at": "2025-12-12T19:29:36.000000Z", "updated_at": "2025-12-12T19:29:36.000000Z" } } ], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019b1409-4dab-71a4-b8b9-6ca95843e23f", "old_id": null, "code": "P-77", "name": "dwadaw", "description": "Criação rápida", "impact": 10, "parent_id": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-12T19:28:32.000000Z", "updated_at": "2025-12-12T19:28:32.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 1, "budget": 0, "is_template": false, "created_by": "019aeaa3-2370-731c-9008-be759795f449", "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [ { "id": "019aeaa3-2370-731c-9008-be759795f449", "name": "Test User", "avatar_url": "https://via.placeholder.com/124x124.png/003388?text=facilis", "pivot": { "project_id": "019b1409-4dab-71a4-b8b9-6ca95843e23f", "user_id": "019aeaa3-2370-731c-9008-be759795f449", "role": "creator", "created_at": "2025-12-12T19:28:32.000000Z", "updated_at": "2025-12-12T19:28:32.000000Z" } } ], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019b1404-ad0c-73ed-a279-990911f8c308", "old_id": null, "code": "P-76", "name": "dawijdapwdjaiodjawdoijwdpoaiwjdaiowjdwopdijawpiodajwdoiawjdopawijdaowidjawopdijawdiajwdawijdapwdjaiodjawdoijwdpoaiwjdaiowjdwopdijawpiodajwdoiawjdopawijdaowidjawopdijawdiajwdawijdapwdjaiodjawd", "description": "Criação rápida", "impact": 10, "parent_id": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-12T19:23:29.000000Z", "updated_at": "2025-12-12T19:23:29.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 1, "budget": 0, "is_template": false, "created_by": "019aeaa3-2370-731c-9008-be759795f449", "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [ { "id": "019aeaa3-2370-731c-9008-be759795f449", "name": "Test User", "avatar_url": "https://via.placeholder.com/124x124.png/003388?text=facilis", "pivot": { "project_id": "019b1404-ad0c-73ed-a279-990911f8c308", "user_id": "019aeaa3-2370-731c-9008-be759795f449", "role": "creator", "created_at": "2025-12-12T19:23:29.000000Z", "updated_at": "2025-12-12T19:23:29.000000Z" } } ], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019b1404-9ffe-719c-8a9d-08cbd2e94e59", "old_id": null, "code": "P-75", "name": "dawijdapwdjaiodjawdoijwdpoaiwjdaiowjdwopdijawpiodajwdoiawjdopawijdaowidjawopdijawdiajwdawijdapwdjaiodjawdoijwdpoaiwjdaiowjdwopdijawpiodajwdoiawjdopawijdaowidjawopdijawdiajwdawijdapwdjaiodjawd", "description": "Criação rápida", "impact": 10, "parent_id": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-12T19:23:26.000000Z", "updated_at": "2025-12-12T19:23:26.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 1, "budget": 0, "is_template": false, "created_by": "019aeaa3-2370-731c-9008-be759795f449", "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [ { "id": "019aeaa3-2370-731c-9008-be759795f449", "name": "Test User", "avatar_url": "https://via.placeholder.com/124x124.png/003388?text=facilis", "pivot": { "project_id": "019b1404-9ffe-719c-8a9d-08cbd2e94e59", "user_id": "019aeaa3-2370-731c-9008-be759795f449", "role": "creator", "created_at": "2025-12-12T19:23:26.000000Z", "updated_at": "2025-12-12T19:23:26.000000Z" } } ], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019b1404-56b1-70f4-bfc8-8d17d8329811", "old_id": null, "code": "P-74", "name": "teste", "description": "Criação rápida", "impact": 10, "parent_id": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-12T19:23:07.000000Z", "updated_at": "2025-12-12T19:23:07.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 1, "budget": 0, "is_template": false, "created_by": "019aeaa3-2370-731c-9008-be759795f449", "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [ { "id": "019aeaa3-2370-731c-9008-be759795f449", "name": "Test User", "avatar_url": "https://via.placeholder.com/124x124.png/003388?text=facilis", "pivot": { "project_id": "019b1404-56b1-70f4-bfc8-8d17d8329811", "user_id": "019aeaa3-2370-731c-9008-be759795f449", "role": "creator", "created_at": "2025-12-12T19:23:07.000000Z", "updated_at": "2025-12-12T19:23:07.000000Z" } } ], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019b0dc7-34e0-7312-93b1-841c61594f44", "old_id": null, "code": "P-73", "name": "dawdadwaadw", "description": "Criação rápida", "impact": 10, "parent_id": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-11T14:18:37.000000Z", "updated_at": "2025-12-11T14:18:37.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 1, "budget": 0, "is_template": false, "created_by": "019aeaa3-2370-731c-9008-be759795f449", "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [ { "id": 667, "name": "Inovação", "pivot": { "project_id": "019b0dc7-34e0-7312-93b1-841c61594f44", "project_funnel_id": 667, "id": 42805, "statuses_at": null, "statuses_by": null, "funnel_status_id": null, "forecast_date": null, "realized_forecast_date": null, "created_at": "2025-12-11T14:18:37.000000Z", "forecast_date_update_count": 0 }, "tags": [] } ], "funnel_steps": [ { "id": 3817, "name": "Desenvolvimento Conceitual", "project_funnel_id": 667, "sensation_amount": 87, "step_forward_id": null, "step_backward_id": null, "order": 2, "help_text": null, "form_id": null, "sort_config": { "field": "budget", "arguments": [], "direction": "desc" }, "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-11T14:33:58.000000Z", "pivot": { "project_id": "019b0dc7-34e0-7312-93b1-841c61594f44", "funnel_step_id": 3817, "id": 144213, "order": 15, "created_at": "2025-12-11T14:18:40.000000Z" }, "funnel_step_blockings": [] } ], "tags": [], "groups": [], "users": [ { "id": "019aeaa3-2370-731c-9008-be759795f449", "name": "Test User", "avatar_url": "https://via.placeholder.com/124x124.png/003388?text=facilis", "pivot": { "project_id": "019b0dc7-34e0-7312-93b1-841c61594f44", "user_id": "019aeaa3-2370-731c-9008-be759795f449", "role": "creator", "created_at": "2025-12-11T14:18:37.000000Z", "updated_at": "2025-12-11T14:18:37.000000Z" } } ], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019b0dc7-25a9-70f0-a448-e76c6478cb23", "old_id": null, "code": "P-72", "name": "dasdadwa", "description": "Criação rápida", "impact": 10, "parent_id": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-11T14:18:33.000000Z", "updated_at": "2025-12-11T14:18:33.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 1, "budget": 0, "is_template": false, "created_by": "019aeaa3-2370-731c-9008-be759795f449", "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [ { "id": 667, "name": "Inovação", "pivot": { "project_id": "019b0dc7-25a9-70f0-a448-e76c6478cb23", "project_funnel_id": 667, "id": 42804, "statuses_at": null, "statuses_by": null, "funnel_status_id": null, "forecast_date": null, "realized_forecast_date": null, "created_at": "2025-12-11T14:18:33.000000Z", "forecast_date_update_count": 0 }, "tags": [] } ], "funnel_steps": [ { "id": 3817, "name": "Desenvolvimento Conceitual", "project_funnel_id": 667, "sensation_amount": 87, "step_forward_id": null, "step_backward_id": null, "order": 2, "help_text": null, "form_id": null, "sort_config": { "field": "budget", "arguments": [], "direction": "desc" }, "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-11T14:33:58.000000Z", "pivot": { "project_id": "019b0dc7-25a9-70f0-a448-e76c6478cb23", "funnel_step_id": 3817, "id": 144214, "order": 14, "created_at": "2025-12-11T14:18:43.000000Z" }, "funnel_step_blockings": [] } ], "tags": [], "groups": [], "users": [ { "id": "019aeaa3-2370-731c-9008-be759795f449", "name": "Test User", "avatar_url": "https://via.placeholder.com/124x124.png/003388?text=facilis", "pivot": { "project_id": "019b0dc7-25a9-70f0-a448-e76c6478cb23", "user_id": "019aeaa3-2370-731c-9008-be759795f449", "role": "creator", "created_at": "2025-12-11T14:18:33.000000Z", "updated_at": "2025-12-11T14:18:33.000000Z" } }, { "id": "019aeaa3-2370-731c-9008-be759795f449", "name": "Test User", "avatar_url": "https://via.placeholder.com/124x124.png/003388?text=facilis", "pivot": { "project_id": "019b0dc7-25a9-70f0-a448-e76c6478cb23", "user_id": "019aeaa3-2370-731c-9008-be759795f449", "role": "assignee", "created_at": "2025-12-11T14:32:52.000000Z", "updated_at": "2025-12-11T14:32:52.000000Z" } } ], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b747-726b-9918-97f1111156ef", "old_id": null, "code": "P-57", "name": "Escobar Ltda. qui - enim", "description": "Aut at iure et praesentium maiores rerum deserunt. Veniam rerum autem et eos. Ut facere commodi voluptates eius iure voluptatem enim.", "impact": 6, "parent_id": "019aeaa3-b735-716f-8a34-bf32802b5bd8", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-04T18:33:09.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 3, "budget": 743419.28, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [ { "id": 667, "name": "Inovação", "pivot": { "project_id": "019aeaa3-b747-726b-9918-97f1111156ef", "project_funnel_id": 667, "id": 42755, "statuses_at": null, "statuses_by": null, "funnel_status_id": null, "forecast_date": null, "realized_forecast_date": null, "created_at": null, "forecast_date_update_count": 0 }, "tags": [] } ], "funnel_steps": [ { "id": 3817, "name": "Desenvolvimento Conceitual", "project_funnel_id": 667, "sensation_amount": 87, "step_forward_id": null, "step_backward_id": null, "order": 2, "help_text": null, "form_id": null, "sort_config": { "field": "budget", "arguments": [], "direction": "desc" }, "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-11T14:33:58.000000Z", "pivot": { "project_id": "019aeaa3-b747-726b-9918-97f1111156ef", "funnel_step_id": 3817, "id": 144185, "order": 5, "created_at": "2025-12-11T14:11:07.000000Z" }, "funnel_step_blockings": [] } ], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b7c7-7356-9ef1-124acc528805", "old_id": null, "code": "P-64", "name": "Escobar Ltda. qui - tempora - et", "description": "Sint perferendis accusamus consequatur qui et sapiente accusantium. Rerum enim sed placeat aut sapiente soluta nam. Repellat consequuntur facilis occaecati at quae quisquam.", "impact": 1, "parent_id": "019aeaa3-b756-7227-a837-f1f768ba17ed", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-04T18:33:09.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 1, "budget": 124176.36, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [ { "id": 666, "name": "Inovação", "pivot": { "project_id": "019aeaa3-b7c7-7356-9ef1-124acc528805", "project_funnel_id": 666, "id": 42752, "statuses_at": null, "statuses_by": null, "funnel_status_id": null, "forecast_date": null, "realized_forecast_date": null, "created_at": null, "forecast_date_update_count": 0 }, "tags": [] } ], "funnel_steps": [ { "id": 3814, "name": "Criação de Prototipagem", "project_funnel_id": 666, "sensation_amount": 50, "step_forward_id": null, "step_backward_id": null, "order": 45, "help_text": null, "form_id": null, "sort_config": null, "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-04T18:33:09.000000Z", "pivot": { "project_id": "019aeaa3-b7c7-7356-9ef1-124acc528805", "funnel_step_id": 3814, "id": 144129, "order": 0, "created_at": "2025-12-04T18:33:09.000000Z" }, "funnel_step_blockings": [] } ], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b756-7227-a837-f1f768ba17ed", "old_id": null, "code": "P-58", "name": "Escobar Ltda. qui - tempora", "description": "Ea facilis quia sed quas et quae velit. Id facilis necessitatibus a eum modi est hic. A vero ut et quisquam impedit. Voluptas quia deserunt animi dignissimos et cumque sed.", "impact": 10, "parent_id": "019aeaa3-b735-716f-8a34-bf32802b5bd8", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-04T18:33:09.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 4, "budget": 151973.02, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [ { "id": 666, "name": "Inovação", "pivot": { "project_id": "019aeaa3-b756-7227-a837-f1f768ba17ed", "project_funnel_id": 666, "id": 42751, "statuses_at": null, "statuses_by": null, "funnel_status_id": null, "forecast_date": null, "realized_forecast_date": null, "created_at": null, "forecast_date_update_count": 0 }, "tags": [] } ], "funnel_steps": [ { "id": 3814, "name": "Criação de Prototipagem", "project_funnel_id": 666, "sensation_amount": 50, "step_forward_id": null, "step_backward_id": null, "order": 45, "help_text": null, "form_id": null, "sort_config": null, "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-04T18:33:09.000000Z", "pivot": { "project_id": "019aeaa3-b756-7227-a837-f1f768ba17ed", "funnel_step_id": 3814, "id": 144128, "order": 0, "created_at": "2025-12-04T18:33:09.000000Z" }, "funnel_step_blockings": [] } ], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b77e-708f-ae9d-66763cbb6f6d", "old_id": null, "code": "P-60", "name": "Escobar Ltda. qui - enim - et", "description": "Est voluptas amet et corrupti molestias. Tempora est voluptatem culpa hic. Corporis vitae quia dolor neque repudiandae dolorem.", "impact": 5, "parent_id": "019aeaa3-b747-726b-9918-97f1111156ef", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-04T18:33:09.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 4, "budget": 972764.55, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [ { "id": 667, "name": "Inovação", "pivot": { "project_id": "019aeaa3-b77e-708f-ae9d-66763cbb6f6d", "project_funnel_id": 667, "id": 42763, "statuses_at": null, "statuses_by": null, "funnel_status_id": null, "forecast_date": null, "realized_forecast_date": null, "created_at": null, "forecast_date_update_count": 0 }, "tags": [] } ], "funnel_steps": [ { "id": 3815, "name": "Reestruturação Operacional", "project_funnel_id": 667, "sensation_amount": 32, "step_forward_id": null, "step_backward_id": null, "order": 1, "help_text": null, "form_id": null, "sort_config": null, "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-11T14:13:14.000000Z", "pivot": { "project_id": "019aeaa3-b77e-708f-ae9d-66763cbb6f6d", "funnel_step_id": 3815, "id": 144226, "order": 5, "created_at": "2025-12-12T17:07:53.000000Z" }, "funnel_step_blockings": [] } ], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b85d-72bb-8cfd-cb980ca952f3", "old_id": null, "code": "P-71", "name": "Escobar Ltda. qui - tempora - reprehenderit - tempora", "description": "Animi quo molestias id fugiat deserunt. Modi voluptates autem eveniet aut ut. Quia fugit nemo omnis et dolorem. Hic expedita nulla occaecati.", "impact": 5, "parent_id": "019aeaa3-b838-7164-a45c-a9cf880dd9c6", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-04T18:33:09.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 2, "budget": 785931.65, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b84b-72c8-9bde-11fdf8a454a0", "old_id": null, "code": "P-70", "name": "Escobar Ltda. qui - tempora - expedita - aliquid", "description": "Esse excepturi accusamus accusamus ut ut aspernatur. Vero perspiciatis debitis est rerum. Dolor neque natus sed quasi distinctio vero.", "impact": 7, "parent_id": "019aeaa3-b829-7324-8cde-03743354e0db", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-04T18:33:09.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 4, "budget": 538057.72, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b838-7164-a45c-a9cf880dd9c6", "old_id": null, "code": "P-69", "name": "Escobar Ltda. qui - tempora - reprehenderit", "description": "Odit culpa voluptatibus quo consequatur ducimus. Officia similique doloribus voluptatibus adipisci sint consectetur voluptas explicabo.", "impact": 9, "parent_id": "019aeaa3-b76a-704e-bea9-78b2ffa18c75", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-04T18:33:09.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 1, "budget": 392328.69, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b829-7324-8cde-03743354e0db", "old_id": null, "code": "P-68", "name": "Escobar Ltda. qui - tempora - expedita", "description": "Eaque voluptas repellendus est. Non occaecati quae saepe. Dolores delectus est est temporibus mollitia dolores repudiandae. Omnis quia nobis iure est. Dolores officia id itaque nesciunt reiciendis.", "impact": 6, "parent_id": "019aeaa3-b76a-704e-bea9-78b2ffa18c75", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-04T18:33:09.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 3, "budget": 376134.95, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b817-72d5-b6c4-117b4f0fce3f", "old_id": null, "code": "P-67", "name": "Escobar Ltda. qui - tempora - cupiditate - eaque", "description": "Et aliquid sed velit qui harum quas vel. Dolor ipsum magni alias qui repellendus expedita sit. Tenetur totam repellendus nulla et. Fugit ratione et voluptates fugiat odio.", "impact": 3, "parent_id": "019aeaa3-b7ee-7052-b936-5fa0923dff73", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-04T18:33:09.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 4, "budget": 586101.4, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b802-72de-9db9-022b465fa7cd", "old_id": null, "code": "P-66", "name": "Escobar Ltda. qui - tempora - et - deleniti", "description": "Qui quisquam dolores sit voluptatem voluptatem. Harum ut quo non qui quod cum fugit. Ut et recusandae quia dicta nostrum.", "impact": 10, "parent_id": "019aeaa3-b7c7-7356-9ef1-124acc528805", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-04T18:33:09.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 3, "budget": 844116.34, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b79f-7136-9b03-4b3522635da0", "old_id": null, "code": "P-62", "name": "Escobar Ltda. qui - enim - et - nam", "description": "Id ut enim est. Aut dolorum et quo deleniti fuga. Consequatur corporis magni odit voluptas qui ut sit. Molestias pariatur ut natus temporibus ut in aliquid.", "impact": 6, "parent_id": "019aeaa3-b77e-708f-ae9d-66763cbb6f6d", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-04T18:33:09.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 2, "budget": 414516.2, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b735-716f-8a34-bf32802b5bd8", "old_id": null, "code": "P-56", "name": "Escobar Ltda. qui", "description": "Sunt eos optio placeat repellendus expedita natus. Eligendi ullam adipisci quis autem. Ducimus sit earum eaque sit possimus recusandae ab.", "impact": 7, "parent_id": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-04T18:33:09.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 1, "budget": 735533.87, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b725-7280-bd62-f6db9b4259db", "old_id": null, "code": "P-55", "name": "Projeto Complexo Raiz - nihil - et - aut", "description": "Sit harum quasi officiis assumenda deleniti vel aspernatur. Hic commodi soluta quia officia. Ex id et dignissimos ut non.", "impact": 7, "parent_id": "019aeaa3-b68d-7105-b1cd-0e8409271926", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-04T18:33:09.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 2, "budget": 806353.5, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [ { "id": 666, "name": "Inovação", "pivot": { "project_id": "019aeaa3-b725-7280-bd62-f6db9b4259db", "project_funnel_id": 666, "id": 42748, "statuses_at": null, "statuses_by": null, "funnel_status_id": null, "forecast_date": null, "realized_forecast_date": null, "created_at": null, "forecast_date_update_count": 0 }, "tags": [] } ], "funnel_steps": [ { "id": 3814, "name": "Criação de Prototipagem", "project_funnel_id": 666, "sensation_amount": 50, "step_forward_id": null, "step_backward_id": null, "order": 45, "help_text": null, "form_id": null, "sort_config": null, "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-04T18:33:09.000000Z", "pivot": { "project_id": "019aeaa3-b725-7280-bd62-f6db9b4259db", "funnel_step_id": 3814, "id": 144125, "order": 0, "created_at": "2025-12-04T18:33:09.000000Z" }, "funnel_step_blockings": [] } ], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b6f9-72ce-9a2a-3eb06f384ab5", "old_id": null, "code": "P-54", "name": "Projeto Complexo Raiz - nihil - molestias - culpa", "description": "Voluptas ut perspiciatis quia harum vitae iure. Deserunt ea sed sit et non eos. Ex earum voluptatem voluptatem delectus a excepturi.", "impact": 2, "parent_id": "019aeaa3-b67e-7149-9966-0c55b4b9b2a8", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-04T18:33:09.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 3, "budget": 45691.3, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [ { "id": 665, "name": "Educação Corporativa", "pivot": { "project_id": "019aeaa3-b6f9-72ce-9a2a-3eb06f384ab5", "project_funnel_id": 665, "id": 42739, "statuses_at": null, "statuses_by": null, "funnel_status_id": null, "forecast_date": null, "realized_forecast_date": null, "created_at": null, "forecast_date_update_count": 0 }, "tags": [] } ], "funnel_steps": [ { "id": 3808, "name": "Gestão de Mudanças", "project_funnel_id": 665, "sensation_amount": 25, "step_forward_id": null, "step_backward_id": null, "order": 40, "help_text": null, "form_id": null, "sort_config": null, "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-04T18:33:09.000000Z", "pivot": { "project_id": "019aeaa3-b6f9-72ce-9a2a-3eb06f384ab5", "funnel_step_id": 3808, "id": 144116, "order": 0, "created_at": "2025-12-04T18:33:09.000000Z" }, "funnel_step_blockings": [] } ], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b6e8-7270-918b-84772673fec7", "old_id": null, "code": "P-53", "name": "Projeto Complexo Raiz - quibusdam - mollitia", "description": "Et eum deleniti praesentium aut autem. Et necessitatibus omnis at inventore. Laboriosam quisquam blanditiis et et. Quo voluptatem sit et voluptas.", "impact": 6, "parent_id": "019aeaa3-b66d-7088-9f8f-1a4d1b01e774", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-04T18:33:09.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 1, "budget": 874936.31, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b6da-7025-a386-e1862820e450", "old_id": null, "code": "P-52", "name": "Projeto Complexo Raiz - quibusdam - asperiores", "description": "Sunt officia quo ducimus. Sint repellendus repellat illum facilis sit sed nihil ut. Repudiandae voluptatem id recusandae quis.", "impact": 6, "parent_id": "019aeaa3-b66d-7088-9f8f-1a4d1b01e774", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-04T18:33:09.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 2, "budget": 626667.46, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b6c9-700f-a885-eadd8e635941", "old_id": null, "code": "P-51", "name": "Projeto Complexo Raiz - mollitia - expedita", "description": "Aspernatur voluptates est adipisci odit ad. Quo eaque est et perspiciatis rerum. Ut fuga vel repudiandae est. Modi adipisci et provident nam dolore optio numquam. Debitis ea quis ea est voluptatem.", "impact": 2, "parent_id": "019aeaa3-b660-7270-b47d-46e094729100", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-04T18:33:09.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 4, "budget": 178639.31, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b6bb-728c-8191-01283e2623b0", "old_id": null, "code": "P-50", "name": "Projeto Complexo Raiz - mollitia - et", "description": "Nulla dolor sed fugit sed ea eos ex. Corporis inventore saepe nobis expedita molestiae repellendus. Dicta corporis et voluptatem beatae voluptatem inventore inventore id.", "impact": 8, "parent_id": "019aeaa3-b660-7270-b47d-46e094729100", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-04T18:33:09.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 1, "budget": 925757.89, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b6ab-7139-9f43-0b8133dcc038", "old_id": null, "code": "P-49", "name": "Projeto Complexo Raiz - sint - sint", "description": "Sunt minima aut eos dicta impedit nihil atque. Corporis dignissimos id voluptas est occaecati et libero est. Nisi quis beatae unde quia. Ex quo quia recusandae ipsa qui eligendi.", "impact": 10, "parent_id": "019aeaa3-b650-71b5-ac4b-3465d17cf219", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-04T18:33:09.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 2, "budget": 656502.58, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [ { "id": 667, "name": "Inovação", "pivot": { "project_id": "019aeaa3-b6ab-7139-9f43-0b8133dcc038", "project_funnel_id": 667, "id": 42766, "statuses_at": null, "statuses_by": null, "funnel_status_id": null, "forecast_date": null, "realized_forecast_date": null, "created_at": null, "forecast_date_update_count": 0 }, "tags": [] } ], "funnel_steps": [ { "id": 3817, "name": "Desenvolvimento Conceitual", "project_funnel_id": 667, "sensation_amount": 87, "step_forward_id": null, "step_backward_id": null, "order": 2, "help_text": null, "form_id": null, "sort_config": { "field": "budget", "arguments": [], "direction": "desc" }, "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-11T14:33:58.000000Z", "pivot": { "project_id": "019aeaa3-b6ab-7139-9f43-0b8133dcc038", "funnel_step_id": 3817, "id": 144188, "order": 7, "created_at": "2025-12-11T14:14:06.000000Z" }, "funnel_step_blockings": [] } ], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b69d-70b8-b7ae-cbed424cd04d", "old_id": null, "code": "P-48", "name": "Projeto Complexo Raiz - sint - dolores", "description": "Quas velit aut earum cupiditate. Qui at quaerat neque aperiam voluptatem. Nobis illum ducimus quae placeat et et. Voluptas recusandae quia deserunt quia.", "impact": 1, "parent_id": "019aeaa3-b650-71b5-ac4b-3465d17cf219", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-04T18:33:09.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 3, "budget": 842332.7, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b68d-7105-b1cd-0e8409271926", "old_id": null, "code": "P-47", "name": "Projeto Complexo Raiz - nihil - et", "description": "Cupiditate qui eveniet rem in tenetur. Quis consequuntur sit ea et. Et sit aut ut explicabo. Reiciendis cumque quidem quo cupiditate ut.", "impact": 1, "parent_id": "019aeaa3-b642-7107-88a9-fbf40c7028d0", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-04T18:33:09.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 1, "budget": 324996.46, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null } ], "meta": { "current_page": 1, "from": 1, "last_page": 3, "per_page": 30, "to": 30, "total": 78 }, "response": true } } } }, "401": { "description": "Não autorizado", "headers": { "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" }, "Connection": { "schema": { "type": "string" }, "example": "keep-alive" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "access-control-allow-origin": { "schema": { "type": "string" }, "example": "*" }, "access-control-expose-headers": { "schema": { "type": "string" }, "example": "*" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." } }, "required": [ "response", "message", "error" ] }, "example": { "response": false, "message": "unauthorized", "error": "Unauthenticated." } } } } }, "tags": [ "projects", "Projetos" ], "description": "Esta rota é normalmente utilizada para campos de autocomplete, e buscas mais simples, pois é uma rota que entrega menos informações que uma busca avançada. Se você estiver buscando encontrar projetos baseado em um conjunto de filtros avançados e específicos, considere usar a busca avançada.\n\nPossui paginação e aceita alguns filtros via query params, consulte:\n\n- [Filtro básico](https://docs.olie.ai/api-reference/general/basic-filters)\n- [Paginação](https://docs.olie.ai/api-reference/general/pagination)" }, "post": { "summary": "Criar um projeto", "responses": { "200": { "description": "Sucesso", "headers": { "Date": { "schema": { "type": "string" }, "example": "Tue, 16 Dec 2025 12:57:45 GMT" }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" }, "Connection": { "schema": { "type": "string" }, "example": "keep-alive" }, "Cache-Control": { "schema": { "type": "string" }, "example": "private, must-revalidate" }, "pragma": { "schema": { "type": "string" }, "example": "no-cache" }, "expires": { "schema": { "type": "integer" }, "example": -1 }, "X-RateLimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-RateLimit-Remaining": { "schema": { "type": "integer" }, "example": 158 }, "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" } }, "content": { "application/json": { "schema": { "description": "Projeto retornado pela operação.", "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "project": { "type": "object", "description": "Projeto.", "properties": { "id": { "type": "string", "description": "ID (UUID) do projeto.", "format": "uuid" }, "frame_id": { "type": "string", "description": "ID (UUID) da conta dona do projeto.", "format": "uuid" }, "code": { "type": "string", "description": "Código do projeto, formado pelo prefixo e por um número sequencial." }, "name": { "type": "string", "description": "Nome do projeto." }, "description": { "type": "string", "description": "Descrição do projeto." }, "status": { "type": "integer", "description": "Situação: 1 em andamento, 2 concluído, 3 arquivado, 4 parado." }, "impact": { "type": "integer", "description": "Grau de impacto, de 1 a 10." }, "budget": { "type": "number", "description": "Orçamento do projeto." }, "is_template": { "type": "boolean", "description": "Indica se o projeto é um modelo." }, "parent_id": { "type": "string", "description": "ID do projeto pai, quando este é um subprojeto.", "format": "uuid" }, "customer_id": { "type": "string", "description": "ID do cliente vinculado.", "format": "uuid" }, "contact_id": { "type": "string", "description": "ID do contato vinculado.", "format": "uuid" }, "created_by": { "type": "string", "description": "ID do usuário que criou o projeto.", "format": "uuid" }, "created_at": { "type": "string", "description": "Data de criação.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data em que foi enviado para a lixeira.", "format": "date-time" } } } }, "required": [ "response", "project" ] }, "example": { "response": true, "project": { "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "status": 3, "impact": 5, "description": "Eveniet modi inventore laboriosam voluptatum consectetur officia. Et vel blanditiis dolor neque tenetur nam nobis fuga. Eum sequi quis accusamus dolorem ut.", "name": "molestiae consequatur ad", "contact_id": null, "customer_id": null, "budget": 25000, "is_template": false, "code": "P-82", "id": "019b273c-f7c4-71ac-97b5-b96d95512130", "created_by": "019aeaa3-2370-731c-9008-be759795f449", "updated_at": "2025-12-16T12:57:45.000000Z", "created_at": "2025-12-16T12:57:45.000000Z", "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "old_id": null, "name": "OlieDev Company ", "type": "work", "status": 1, "subdomain": "devframe", "frame_billing_data_id": null, "model_forms": null, "logo_img": null, "cockpit_access": 0 }, "form_answers": [ { "id": 1, "label": "eos quod", "answer": "Resposta do campo", "model": "Project", "answered_by": "019bc286-5e87-7168-965d-720b922f8187", "updated_at": "2026-01-15T17:17:16.000000Z" }, { "id": 2, "label": "deleniti veniam", "answer": "Resposta do campo", "model": "Project", "answered_by": "019bc286-5e87-7168-965d-720b922f8187", "updated_at": "2026-01-15T17:17:16.000000Z" }, { "id": 3, "label": "dolorem fugiat", "answer": null, "model": "Project", "answered_by": "019bc286-5e87-7168-965d-720b922f8187", "updated_at": "2026-01-15T17:17:16.000000Z" }, { "id": 4, "label": "sequi qui", "answer": null, "model": "Project", "answered_by": "019bc286-5e87-7168-965d-720b922f8187", "updated_at": "2026-01-15T17:17:16.000000Z" } ] } } } } }, "401": { "description": "Não autorizado", "headers": { "Date": { "schema": { "type": "string" }, "example": "Thu, 11 Dec 2025 23:54:15 GMT" }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" }, "Connection": { "schema": { "type": "string" }, "example": "keep-alive" }, "access-control-allow-origin": { "schema": { "type": "string" }, "example": "*" }, "access-control-expose-headers": { "schema": { "type": "string" }, "example": "*" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." } }, "required": [ "response", "message", "error" ] }, "example": { "response": false, "message": "unauthorized", "error": "Unauthenticated." } } } }, "422": { "description": "Erro de validação", "headers": { "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" }, "Connection": { "schema": { "type": "string" }, "example": "keep-alive" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." }, "validation": { "type": "object", "description": "Mapa de campo para as mensagens de validação daquele campo.", "properties": {} } }, "required": [ "response", "message", "error", "validation" ] }, "example": { "response": false, "message": "validation_errors", "error": "O campo nome é obrigatório. (and 3 more errors)", "validation": { "name": [ "O campo nome é obrigatório." ], "description": [ "O campo descrição deve ser uma string." ], "impact": [ "O campo impact não pode ser superior a 10." ], "status": [ "O status selecionado é inválido." ] } } } } } }, "tags": [ "projects", "Projetos" ], "description": "Cria um novo projeto com os dados fornecidos.", "requestBody": { "content": { "application/json": { "schema": { "description": "Dados do novo projeto.", "type": "object", "properties": { "name": { "type": "string", "description": "Nome do projeto. Até 191 caracteres." }, "description": { "type": "string", "description": "Descrição do projeto." }, "impact": { "type": "integer", "minimum": 1, "maximum": 10, "description": "Grau de impacto, de 1 a 10." }, "contact_id": { "type": "string", "description": "ID do contato a vincular. `null` remove o vínculo.", "format": "uuid" }, "customer_id": { "type": "string", "description": "ID do cliente a vincular. `null` remove o vínculo.", "format": "uuid" }, "status": { "type": "integer", "enum": [ 1, 2, 3, 4 ], "description": "Situação: 1 em andamento, 2 concluído, 3 arquivado, 4 parado." }, "budget": { "type": "number", "description": "Orçamento do projeto." }, "is_template": { "type": "boolean", "description": "`true` transforma o projeto em modelo." }, "parent_id": { "type": "string", "description": "ID do projeto pai. `null` deixa o projeto na raiz.", "format": "uuid" }, "funnels": { "type": "object", "description": "Funis em que o projeto entra ou de que sai.", "properties": { "to_add": { "type": "array", "description": "IDs a vincular.", "items": { "type": "integer", "description": "ID a vincular." } }, "to_rem": { "type": "array", "description": "IDs a desvincular.", "items": { "type": "integer", "description": "ID a desvincular." } } } }, "groups": { "type": "object", "description": "Grupos de projeto a vincular ou desvincular.", "properties": { "to_add": { "type": "array", "description": "IDs a vincular.", "items": { "type": "string", "description": "ID a vincular." } }, "to_rem": { "type": "array", "description": "IDs a desvincular.", "items": { "type": "string", "description": "ID a desvincular." } } } }, "tags": { "type": "object", "description": "Etiquetas de funil a aplicar ou remover.", "properties": { "to_add": { "type": "array", "description": "IDs a vincular.", "items": { "type": "integer", "description": "ID a vincular." } }, "to_rem": { "type": "array", "description": "IDs a desvincular.", "items": { "type": "integer", "description": "ID a desvincular." } } } }, "childrens": { "type": "object", "description": "Projetos filhos a vincular ou desvincular.", "properties": { "to_add": { "type": "array", "description": "IDs a vincular.", "items": { "type": "string", "description": "ID a vincular." } }, "to_rem": { "type": "array", "description": "IDs a desvincular.", "items": { "type": "string", "description": "ID a desvincular." } } } }, "users": { "type": "array", "description": "Pessoas a incluir ou retirar do projeto.", "items": { "description": "Vínculo de um usuário com o projeto.", "type": "object", "properties": { "user_id": { "type": "string", "description": "ID (UUID) do usuário.", "format": "uuid" }, "role": { "type": "string", "description": "Papel no projeto: `assignee` (responsável) ou `follower` (seguidor)." }, "action": { "type": "string", "description": "`add` inclui o usuário; `remove` o retira." } } } }, "forecast_dates": { "type": "array", "description": "Datas de previsão por funil.", "items": { "description": "Data prevista do projeto em um funil.", "type": "object", "properties": { "date": { "type": "string", "description": "Data prevista no formato AAAA-MM-DD.", "format": "date" }, "project_funnel_id": { "type": "integer", "description": "ID do funil a que a previsão se refere." } } } }, "funnel_status": { "type": "object", "description": "Status do projeto dentro de um funil.", "properties": { "project_funnel_id": { "type": "integer", "description": "ID do funil." }, "funnel_status_id": { "type": "integer", "description": "ID do status a aplicar." } } }, "form_answers": { "type": "array", "description": "Respostas de formulário do projeto.", "items": { "description": "Resposta de um campo de formulário.", "type": "object", "properties": { "id": { "type": "integer", "description": "ID do campo do formulário." }, "answer": { "type": "string", "description": "Resposta do campo." } } } }, "prefix": { "type": "string", "description": "Prefixo usado no código do projeto." } }, "required": [ "name" ] }, "example": { "name": "Nome do projeto", "description": "Descrição detalhada do projeto", "impact": 5, "contact_id": null, "customer_id": null, "status": 1, "budget": 25000, "is_template": false, "prefix": "PRJ", "parent_id": null, "funnels": { "to_add": [], "to_rem": [] }, "groups": { "to_add": [], "to_rem": [] }, "tags": { "to_add": [], "to_rem": [] }, "users": [ { "user_id": null, "role": "assignee", "action": "add" } ], "childrens": { "to_add": [], "to_rem": [] }, "forecast_dates": [ { "date": "2026-09-01", "project_funnel_id": null } ], "funnel_status": { "project_funnel_id": null, "funnel_status_id": null }, "form_answers": [ { "id": null, "answer": "Resposta do campo" } ] } } } } } }, "/api/management/projects/search": { "post": { "summary": "Busca avançada de projetos", "parameters": [ { "name": "withPercentage", "in": "query", "description": "`true` acrescenta a cada projeto o percentual de conclusão, a data estimada de término e os dados do cliente.", "schema": { "type": "boolean" }, "example": false } ], "responses": { "200": { "description": "Sucesso", "headers": { "Date": { "schema": { "type": "string" }, "example": "Tue, 16 Dec 2025 14:13:43 GMT" }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" }, "Connection": { "schema": { "type": "string" }, "example": "keep-alive" }, "Cache-Control": { "schema": { "type": "string" }, "example": "private, must-revalidate" }, "pragma": { "schema": { "type": "string" }, "example": "no-cache" }, "expires": { "schema": { "type": "integer" }, "example": -1 }, "X-RateLimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-RateLimit-Remaining": { "schema": { "type": "integer" }, "example": 158 }, "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" } }, "content": { "application/json": { "schema": { "description": "Lista paginada de projetos.", "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "meta": { "type": "object", "description": "Dados da paginação.", "properties": { "current_page": { "type": "integer", "description": "Página retornada." }, "from": { "type": "integer", "description": "Posição do primeiro item da página no total." }, "to": { "type": "integer", "description": "Posição do último item da página no total." }, "last_page": { "type": "integer", "description": "Número da última página." }, "per_page": { "type": "integer", "description": "Itens por página." }, "total": { "type": "integer", "description": "Total de itens encontrados." } } }, "projects": { "type": "array", "description": "Projetos encontrados.", "items": { "description": "Projeto.", "type": "object", "properties": { "id": { "type": "string", "description": "ID (UUID) do projeto.", "format": "uuid" }, "frame_id": { "type": "string", "description": "ID (UUID) da conta dona do projeto.", "format": "uuid" }, "code": { "type": "string", "description": "Código do projeto, formado pelo prefixo e por um número sequencial." }, "name": { "type": "string", "description": "Nome do projeto." }, "description": { "type": "string", "description": "Descrição do projeto." }, "status": { "type": "integer", "description": "Situação: 1 em andamento, 2 concluído, 3 arquivado, 4 parado." }, "impact": { "type": "integer", "description": "Grau de impacto, de 1 a 10." }, "budget": { "type": "number", "description": "Orçamento do projeto." }, "is_template": { "type": "boolean", "description": "Indica se o projeto é um modelo." }, "parent_id": { "type": "string", "description": "ID do projeto pai, quando este é um subprojeto.", "format": "uuid" }, "customer_id": { "type": "string", "description": "ID do cliente vinculado.", "format": "uuid" }, "contact_id": { "type": "string", "description": "ID do contato vinculado.", "format": "uuid" }, "created_by": { "type": "string", "description": "ID do usuário que criou o projeto.", "format": "uuid" }, "created_at": { "type": "string", "description": "Data de criação.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data em que foi enviado para a lixeira.", "format": "date-time" }, "merged_project": { "type": "object", "description": "Projeto resultante de um merge, quando carregado." } } } } }, "required": [ "response", "projects" ] }, "example": { "projects": [ { "id": "019aeaa3-b2d5-71f6-84c5-322f66c1a406", "old_id": null, "code": "P-1", "name": "Paz-Sepúlveda assumenda", "description": "Nemo nemo porro ut sed. Nostrum nihil iste ab. Qui minus aliquid id iusto. Omnis quis velit suscipit dolores tenetur odio non culpa.", "impact": 3, "parent_id": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:08.000000Z", "updated_at": "2025-12-04T18:33:08.000000Z", "customer_id": "019aeaa3-afaa-7294-b6f9-c9ab2653c84e", "contact_id": 12560, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 1, "budget": 990014.63, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": { "id": "019aeaa3-afaa-7294-b6f9-c9ab2653c84e", "name": "Customer Name Example", "parent_id": null, "parent": null }, "contact": { "id": 12560, "name": "Contact Name Example", "role": "blanditiis", "email": "email@example.org", "phone": "+5591999990000", "description": "Omnis molestias qui nobis voluptas quis sunt sapiente neque.", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:07.000000Z", "updated_at": "2025-12-04T18:33:07.000000Z", "deleted_at": null, "customers": [] }, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b2e4-7033-955b-13959cf7ce81", "old_id": null, "code": "P-2", "name": "Toledo e Barros et", "description": "Placeat nulla possimus enim quam quis fugiat aut nam. Aut ea sed consequatur consequatur expedita ea similique. Aut qui quas ipsa culpa sunt.", "impact": 8, "parent_id": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:08.000000Z", "updated_at": "2025-12-04T18:33:08.000000Z", "customer_id": "019aeaa3-b015-700c-8318-9821b94d6d32", "contact_id": 12551, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 4, "budget": 336598.07, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": { "id": "019aeaa3-b015-700c-8318-9821b94d6d32", "name": "Nome do cliente", "parent_id": null, "parent": null }, "contact": { "id": 12551, "name": "Nome do contato", "role": "doloribus", "email": "email@example.org", "phone": "+5591999990000", "description": "Hic error ut sunt aut qui dolorem porro. Repellat qui aut eos debitis.", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:07.000000Z", "updated_at": "2025-12-04T18:33:07.000000Z", "deleted_at": null, "customers": [ { "id": "019aeaa3-af8b-71d8-bb89-e65353073ee3", "name": "Nome do cliente", "pivot": { "contact_id": 12551, "customer_id": "019aeaa3-af8b-71d8-bb89-e65353073ee3" } }, { "id": "019aeaa3-afb2-709a-ae6b-28fd68cdb8b7", "name": "Nome do cliente", "pivot": { "contact_id": 12551, "customer_id": "019aeaa3-afb2-709a-ae6b-28fd68cdb8b7" } }, { "id": "019aeaa3-aff3-70d7-9c56-4333b119fd61", "name": "Nome do cliente", "pivot": { "contact_id": 12551, "customer_id": "019aeaa3-aff3-70d7-9c56-4333b119fd61" } } ] }, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b2ee-70c5-a5dd-5bdb5159eeec", "old_id": null, "code": "P-3", "name": "Esteves e Filhos in", "description": "Tempora cumque consequatur voluptas. Minima sapiente ea in soluta suscipit. Molestiae ut sed laboriosam veniam possimus. Et accusamus qui fugiat delectus.", "impact": 1, "parent_id": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:08.000000Z", "updated_at": "2025-12-04T18:33:08.000000Z", "customer_id": "019aeaa3-b015-700c-8318-9821b94d6d32", "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 4, "budget": 970388.83, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": { "id": "019aeaa3-b015-700c-8318-9821b94d6d32", "name": "Nome do cliente", "parent_id": null, "parent": null }, "contact": null, "funnels": [ { "id": 666, "name": "Inovação", "pivot": { "project_id": "019aeaa3-b2ee-70c5-a5dd-5bdb5159eeec", "project_funnel_id": 666, "id": 42750, "statuses_at": null, "statuses_by": null, "funnel_status_id": null, "forecast_date": null, "realized_forecast_date": null, "created_at": null, "forecast_date_update_count": 0 }, "tags": [] } ], "funnel_steps": [ { "id": 3814, "name": "Criação de Prototipagem", "project_funnel_id": 666, "sensation_amount": 50, "step_forward_id": null, "step_backward_id": null, "order": 45, "help_text": null, "form_id": null, "sort_config": null, "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-04T18:33:09.000000Z", "pivot": { "project_id": "019aeaa3-b2ee-70c5-a5dd-5bdb5159eeec", "funnel_step_id": 3814, "id": 144127, "order": 0, "created_at": "2025-12-04T18:33:09.000000Z" }, "funnel_step_blockings": [] } ], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b2f9-7304-a344-b05bed96c9d9", "old_id": null, "code": "P-4", "name": "Rodrigues S.A. non", "description": "Sint impedit voluptatem earum omnis quisquam. Aut eum recusandae et dicta velit dolores eius. Tempore voluptas a velit. Nostrum possimus et rerum.", "impact": 5, "parent_id": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:08.000000Z", "updated_at": "2025-12-04T18:33:08.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 4, "budget": 707596.04, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b304-7324-bdfe-e23c45c0eb00", "old_id": null, "code": "P-5", "name": "Vasques-Santacruz vitae", "description": "Natus incidunt facere eum rerum eum. Vel consequatur aut molestiae magni corrupti voluptatibus. Dignissimos consequatur consequatur et et omnis.", "impact": 7, "parent_id": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:08.000000Z", "updated_at": "2025-12-04T18:33:08.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 1, "budget": 657683.24, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [ { "id": 665, "name": "Educação Corporativa", "pivot": { "project_id": "019aeaa3-b304-7324-bdfe-e23c45c0eb00", "project_funnel_id": 665, "id": 42740, "statuses_at": null, "statuses_by": null, "funnel_status_id": null, "forecast_date": null, "realized_forecast_date": null, "created_at": null, "forecast_date_update_count": 0 }, "tags": [] } ], "funnel_steps": [ { "id": 3808, "name": "Gestão de Mudanças", "project_funnel_id": 665, "sensation_amount": 25, "step_forward_id": null, "step_backward_id": null, "order": 40, "help_text": null, "form_id": null, "sort_config": null, "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-04T18:33:09.000000Z", "pivot": { "project_id": "019aeaa3-b304-7324-bdfe-e23c45c0eb00", "funnel_step_id": 3808, "id": 144117, "order": 0, "created_at": "2025-12-04T18:33:09.000000Z" }, "funnel_step_blockings": [] } ], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b30f-7114-9609-14d3ad82342f", "old_id": null, "code": "P-6", "name": "Teles-Perez voluptas", "description": "Corrupti ut quos laudantium maxime sunt officia dolores. Ut labore sit delectus voluptatem. Et sed ea vel dolor aut sit.", "impact": 4, "parent_id": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:08.000000Z", "updated_at": "2025-12-04T18:33:08.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 3, "budget": 942876.45, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b318-70e7-9806-482b56f78338", "old_id": null, "code": "P-7", "name": "Leon e Faria sint", "description": "At itaque aliquid voluptatem dolore harum qui iste. Dolor cumque asperiores autem voluptatem debitis. Vel modi sint consequuntur dolore vitae et ab.", "impact": 2, "parent_id": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:08.000000Z", "updated_at": "2025-12-04T18:33:08.000000Z", "customer_id": null, "contact_id": 12540, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 1, "budget": 402351.89, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": { "id": 12540, "name": "Nome do contato", "role": "repudiandae", "email": "email@example.org", "phone": "+5591999990000", "description": "Aperiam quam quaerat necessitatibus et nostrum ea harum.", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:07.000000Z", "updated_at": "2025-12-04T18:33:07.000000Z", "deleted_at": null, "customers": [] }, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b325-7088-8892-15bcbb1d4942", "old_id": null, "code": "P-8", "name": "Nome do projeto", "description": "Dolorum ducimus non provident saepe. Vel veritatis sed ex temporibus dolore numquam neque vel. Vitae repellat eligendi fugit ut.", "impact": 1, "parent_id": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:08.000000Z", "updated_at": "2025-12-04T18:33:08.000000Z", "customer_id": "019aeaa3-afba-7085-bdd4-a0107165c261", "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 4, "budget": 505013.5, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": { "id": "019aeaa3-afba-7085-bdd4-a0107165c261", "name": "Dr. Talita Assunção", "parent_id": null, "parent": null }, "contact": null, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b330-72ab-9b23-ee58ffda374d", "old_id": null, "code": "P-9", "name": "Salas e Leon reiciendis", "description": "Qui dolor sunt cupiditate aliquam. Et ut animi incidunt veritatis.", "impact": 1, "parent_id": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:08.000000Z", "updated_at": "2025-12-04T18:33:08.000000Z", "customer_id": "019aeaa3-afaa-7294-b6f9-c9ab2653c84e", "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 2, "budget": 846712.4, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": { "id": "019aeaa3-afaa-7294-b6f9-c9ab2653c84e", "name": "Customer Name Example", "parent_id": null, "parent": null }, "contact": null, "funnels": [ { "id": 665, "name": "Educação Corporativa", "pivot": { "project_id": "019aeaa3-b330-72ab-9b23-ee58ffda374d", "project_funnel_id": 665, "id": 42738, "statuses_at": null, "statuses_by": null, "funnel_status_id": null, "forecast_date": null, "realized_forecast_date": null, "created_at": null, "forecast_date_update_count": 0 }, "tags": [] } ], "funnel_steps": [ { "id": 3808, "name": "Gestão de Mudanças", "project_funnel_id": 665, "sensation_amount": 25, "step_forward_id": null, "step_backward_id": null, "order": 40, "help_text": null, "form_id": null, "sort_config": null, "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-04T18:33:09.000000Z", "pivot": { "project_id": "019aeaa3-b330-72ab-9b23-ee58ffda374d", "funnel_step_id": 3808, "id": 144115, "order": 0, "created_at": "2025-12-04T18:33:09.000000Z" }, "funnel_step_blockings": [] } ], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b33a-7151-98c4-87119443e8b8", "old_id": null, "code": "P-10", "name": "Maldonado-Soto ut", "description": "Iste qui minus recusandae voluptas est possimus inventore adipisci. Qui laudantium eum ut recusandae ea. Ut enim saepe nihil iste. Exercitationem dolorem et est distinctio iste et quaerat est.", "impact": 2, "parent_id": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:08.000000Z", "updated_at": "2025-12-04T18:33:08.000000Z", "customer_id": "019aeaa3-afce-720f-b0d0-8f3031890129", "contact_id": 12534, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 4, "budget": 673359.37, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": { "id": "019aeaa3-afce-720f-b0d0-8f3031890129", "name": "Nome do cliente", "parent_id": null, "parent": null }, "contact": { "id": 12534, "name": "Nome do contato", "role": "esse", "email": "email@example.org", "phone": "+5591999990000", "description": "Dolores nobis similique tempora vero. Eos alias ut quis maxime aliquam.", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:07.000000Z", "updated_at": "2025-12-04T18:33:07.000000Z", "deleted_at": null, "customers": [ { "id": "019aeaa3-af8b-71d8-bb89-e65353073ee3", "name": "Nome do cliente", "pivot": { "contact_id": 12534, "customer_id": "019aeaa3-af8b-71d8-bb89-e65353073ee3" } } ] }, "funnels": [ { "id": 665, "name": "Educação Corporativa", "pivot": { "project_id": "019aeaa3-b33a-7151-98c4-87119443e8b8", "project_funnel_id": 665, "id": 42747, "statuses_at": null, "statuses_by": null, "funnel_status_id": null, "forecast_date": null, "realized_forecast_date": null, "created_at": null, "forecast_date_update_count": 0 }, "tags": [] } ], "funnel_steps": [ { "id": 3808, "name": "Gestão de Mudanças", "project_funnel_id": 665, "sensation_amount": 25, "step_forward_id": null, "step_backward_id": null, "order": 40, "help_text": null, "form_id": null, "sort_config": null, "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-04T18:33:09.000000Z", "pivot": { "project_id": "019aeaa3-b33a-7151-98c4-87119443e8b8", "funnel_step_id": 3808, "id": 144124, "order": 0, "created_at": "2025-12-04T18:33:09.000000Z" }, "funnel_step_blockings": [] } ], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b345-728c-8bab-8dcd2001b0c4", "old_id": null, "code": "P-11", "name": "Azevedo e Filhos autem", "description": "Ipsum magnam omnis consectetur dolor architecto beatae. Aut sed vero sint. A voluptatem expedita harum numquam. Quo esse accusamus omnis nam a neque ut.", "impact": 6, "parent_id": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:08.000000Z", "updated_at": "2025-12-04T18:33:08.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 3, "budget": 551319, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [ { "id": 665, "name": "Educação Corporativa", "pivot": { "project_id": "019aeaa3-b345-728c-8bab-8dcd2001b0c4", "project_funnel_id": 665, "id": 42744, "statuses_at": null, "statuses_by": null, "funnel_status_id": null, "forecast_date": null, "realized_forecast_date": null, "created_at": null, "forecast_date_update_count": 0 }, "tags": [] } ], "funnel_steps": [ { "id": 3808, "name": "Gestão de Mudanças", "project_funnel_id": 665, "sensation_amount": 25, "step_forward_id": null, "step_backward_id": null, "order": 40, "help_text": null, "form_id": null, "sort_config": null, "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-04T18:33:09.000000Z", "pivot": { "project_id": "019aeaa3-b345-728c-8bab-8dcd2001b0c4", "funnel_step_id": 3808, "id": 144121, "order": 0, "created_at": "2025-12-04T18:33:09.000000Z" }, "funnel_step_blockings": [] } ], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b350-71dd-a096-3b0571038cc0", "old_id": null, "code": "P-12", "name": "Aragão e Mendonça est", "description": "Error doloribus quaerat ex veniam qui illum consequatur. Necessitatibus nam officiis veniam voluptas voluptatem corporis. Sunt id quibusdam autem eum.", "impact": 1, "parent_id": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:08.000000Z", "updated_at": "2025-12-12T17:08:29.000000Z", "customer_id": null, "contact_id": 12545, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 1, "budget": 2.5, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": { "id": 12545, "name": "Dr. Elisa Medina", "role": "quaerat", "email": "email@example.org", "phone": "+5591999990000", "description": "Sunt id repellendus at dolores. Soluta minima magnam sed temporibus.", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:07.000000Z", "updated_at": "2025-12-04T18:33:07.000000Z", "deleted_at": null, "customers": [ { "id": "019aeaa3-af8b-71d8-bb89-e65353073ee3", "name": "Nome do cliente", "pivot": { "contact_id": 12545, "customer_id": "019aeaa3-af8b-71d8-bb89-e65353073ee3" } }, { "id": "019aeaa3-af96-71d3-aa82-ac0fb8ed5ee6", "name": "Juliana Oliveira Filho", "pivot": { "contact_id": 12545, "customer_id": "019aeaa3-af96-71d3-aa82-ac0fb8ed5ee6" } }, { "id": "019aeaa3-afc3-72a8-aca4-ff5d8687e31f", "name": "Denis Enzo Pedrosa Jr.", "pivot": { "contact_id": 12545, "customer_id": "019aeaa3-afc3-72a8-aca4-ff5d8687e31f" } } ] }, "funnels": [ { "id": 667, "name": "Inovação", "pivot": { "project_id": "019aeaa3-b350-71dd-a096-3b0571038cc0", "project_funnel_id": 667, "id": 42770, "statuses_at": null, "statuses_by": null, "funnel_status_id": null, "forecast_date": null, "realized_forecast_date": null, "created_at": null, "forecast_date_update_count": 0 }, "tags": [] } ], "funnel_steps": [ { "id": 3818, "name": "Planejamento Orçamentário", "project_funnel_id": 667, "sensation_amount": 49, "step_forward_id": null, "step_backward_id": null, "order": 3, "help_text": null, "form_id": null, "sort_config": null, "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-11T14:13:14.000000Z", "pivot": { "project_id": "019aeaa3-b350-71dd-a096-3b0571038cc0", "funnel_step_id": 3818, "id": 144231, "order": 0, "created_at": "2025-12-12T17:08:31.000000Z" }, "funnel_step_blockings": [] } ], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b35b-7064-be98-57b5ee358843", "old_id": null, "code": "P-13", "name": "Zambrano e Maldonado S.A. molestias", "description": "Animi dolores natus sapiente. Est aliquid enim voluptatem dolorum vero atque. Suscipit sed non eum dignissimos qui.", "impact": 3, "parent_id": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:08.000000Z", "updated_at": "2025-12-04T18:33:08.000000Z", "customer_id": null, "contact_id": 12560, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 1, "budget": 276114.81, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": { "id": 12560, "name": "Contact Name Example", "role": "blanditiis", "email": "email@example.org", "phone": "+5591999990000", "description": "Omnis molestias qui nobis voluptas quis sunt sapiente neque.", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:07.000000Z", "updated_at": "2025-12-04T18:33:07.000000Z", "deleted_at": null, "customers": [] }, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b365-70cb-8d2a-dc56d009c0e3", "old_id": null, "code": "P-14", "name": "Aguiar-Bezerra fugiat", "description": "Voluptatem ut enim voluptatem laudantium. Nobis ut autem officia maiores veniam quam sit velit. Error sunt dolores nisi facilis qui ipsum. Ab ab repellat ut omnis vero sit placeat.", "impact": 7, "parent_id": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:08.000000Z", "updated_at": "2025-12-04T18:33:08.000000Z", "customer_id": null, "contact_id": 12562, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 1, "budget": 419390.97, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": { "id": 12562, "name": "Dr. Luis Rosa Filho", "role": "sunt", "email": "email@example.org", "phone": "+5591999990000", "description": "Est eius dicta quod facere dolores ut quo.", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:07.000000Z", "updated_at": "2025-12-04T18:33:07.000000Z", "deleted_at": null, "customers": [] }, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b372-7239-9fc1-9dff67a223ff", "old_id": null, "code": "P-15", "name": "Dias Comercial Ltda. sunt", "description": "Perferendis rerum debitis hic quod dolorem. Doloribus consequuntur praesentium eum odio est. Facilis atque autem atque et.", "impact": 1, "parent_id": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:08.000000Z", "updated_at": "2025-12-04T18:33:08.000000Z", "customer_id": "019aeaa3-af8b-71d8-bb89-e65353073ee3", "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 2, "budget": 971235.1, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": { "id": "019aeaa3-af8b-71d8-bb89-e65353073ee3", "name": "Nome do cliente", "parent_id": null, "parent": null }, "contact": null, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b37d-7167-ba8d-ca4e7327edf8", "old_id": null, "code": "P-16", "name": "Pacheco e Santana voluptatem", "description": "Veritatis voluptate sit fugit maiores. Et similique mollitia rerum qui facilis possimus possimus. Id ut ut eaque ipsa. Officia quam quaerat excepturi deleniti ipsam.", "impact": 9, "parent_id": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:08.000000Z", "updated_at": "2025-12-04T18:33:08.000000Z", "customer_id": "019aeaa3-afce-720f-b0d0-8f3031890129", "contact_id": 12554, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 3, "budget": 563563.1, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": { "id": "019aeaa3-afce-720f-b0d0-8f3031890129", "name": "Nome do cliente", "parent_id": null, "parent": null }, "contact": { "id": 12554, "name": "Sara Maya Uchoa Neto", "role": "et", "email": "email@example.org", "phone": "+5591999990000", "description": "Itaque quo quo voluptates rerum ut eum saepe.", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:07.000000Z", "updated_at": "2025-12-04T18:33:07.000000Z", "deleted_at": null, "customers": [ { "id": "019aeaa3-afea-7332-9ec0-b1e89385f0a3", "name": "Dr. Ivana Matos Teles Neto", "pivot": { "contact_id": 12554, "customer_id": "019aeaa3-afea-7332-9ec0-b1e89385f0a3" } }, { "id": "019aeaa3-affb-73cc-afff-f5f2688a5659", "name": "Clara Faro Soto", "pivot": { "contact_id": 12554, "customer_id": "019aeaa3-affb-73cc-afff-f5f2688a5659" } }, { "id": "019aeaa3-b003-7298-8acb-29800025af3b", "name": "Edilson Maldonado Jr.", "pivot": { "contact_id": 12554, "customer_id": "019aeaa3-b003-7298-8acb-29800025af3b" } } ] }, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b388-709f-ba2c-99558d8b9926", "old_id": null, "code": "P-17", "name": "Marques-Aguiar aut", "description": "Cum quo enim corporis dolore molestiae. Ducimus voluptatum sequi alias quia nulla. Accusantium repellendus odit aut temporibus non. Non corporis maxime cum accusamus nam qui rerum.", "impact": 4, "parent_id": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:08.000000Z", "updated_at": "2025-12-04T18:33:08.000000Z", "customer_id": null, "contact_id": 12552, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 3, "budget": 207289.81, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": { "id": 12552, "name": "Srta. Léia Delatorre Sobrinho", "role": "aut", "email": "email@example.org", "phone": "+5591999990000", "description": "Architecto eaque sunt ab magnam maiores ut aut.", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:07.000000Z", "updated_at": "2025-12-04T18:33:07.000000Z", "deleted_at": null, "customers": [ { "id": "019aeaa3-afb2-709a-ae6b-28fd68cdb8b7", "name": "Nome do cliente", "pivot": { "contact_id": 12552, "customer_id": "019aeaa3-afb2-709a-ae6b-28fd68cdb8b7" } }, { "id": "019aeaa3-affb-73cc-afff-f5f2688a5659", "name": "Clara Faro Soto", "pivot": { "contact_id": 12552, "customer_id": "019aeaa3-affb-73cc-afff-f5f2688a5659" } }, { "id": "019aeaa3-b003-7298-8acb-29800025af3b", "name": "Edilson Maldonado Jr.", "pivot": { "contact_id": 12552, "customer_id": "019aeaa3-b003-7298-8acb-29800025af3b" } } ] }, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b494-72f9-95ae-f8a472700bb5", "old_id": null, "code": "P-18", "name": "(Root) Ortega Ltda. enim", "description": "Tempora voluptatem aperiam magni numquam. Facilis expedita quaerat id omnis. Inventore ad fugiat aut accusantium nesciunt enim. Sed quo velit minus architecto placeat est.", "impact": 3, "parent_id": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:08.000000Z", "updated_at": "2025-12-04T18:33:08.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 2, "budget": 128993.22, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [ { "id": 667, "name": "Inovação", "pivot": { "project_id": "019aeaa3-b494-72f9-95ae-f8a472700bb5", "project_funnel_id": 667, "id": 42756, "statuses_at": null, "statuses_by": null, "funnel_status_id": null, "forecast_date": null, "realized_forecast_date": null, "created_at": null, "forecast_date_update_count": 0 }, "tags": [] } ], "funnel_steps": [ { "id": 3817, "name": "Desenvolvimento Conceitual", "project_funnel_id": 667, "sensation_amount": 87, "step_forward_id": null, "step_backward_id": null, "order": 2, "help_text": null, "form_id": null, "sort_config": { "field": "budget", "arguments": [], "direction": "desc" }, "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-11T14:33:58.000000Z", "pivot": { "project_id": "019aeaa3-b494-72f9-95ae-f8a472700bb5", "funnel_step_id": 3817, "id": 144230, "order": 4, "created_at": "2025-12-12T17:08:04.000000Z" }, "funnel_step_blockings": [] } ], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b4a0-702e-83ab-1042f8fd23b0", "old_id": null, "code": "P-19", "name": "(Root) Medina S.A. et", "description": "Aut sunt voluptatem eum ducimus ipsum voluptates. Ad numquam et quaerat esse rerum assumenda. Ut ut consequatur est aut officiis. Corporis asperiores fugiat ut velit asperiores rem mollitia.", "impact": 8, "parent_id": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:08.000000Z", "updated_at": "2025-12-04T18:33:08.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 1, "budget": 389478.16, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b4ac-71cb-b90c-39c9032b4b93", "old_id": null, "code": "P-20", "name": "(Root) Correia e Roque Ltda. repudiandae", "description": "Ullam iste amet adipisci eius. Nihil maxime necessitatibus deleniti beatae. In odio et consequatur exercitationem. Laboriosam a dolore nostrum et labore quia eum.", "impact": 3, "parent_id": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:08.000000Z", "updated_at": "2025-12-04T18:33:08.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 3, "budget": 923726.28, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b4ba-71a6-8560-853a8526da81", "old_id": null, "code": "P-21", "name": "Projeto Hierárquico Principal", "description": "Rerum amet quia et sit voluptas. Porro omnis possimus nihil similique velit occaecati. A consequatur rem maiores quidem reiciendis ut alias dolorem.", "impact": 1, "parent_id": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:08.000000Z", "updated_at": "2025-12-04T18:33:08.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 4, "budget": 118440.4, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b4ca-71e2-af76-60fd1fce1cd8", "old_id": null, "code": "P-22", "name": "Projeto Hierárquico Principal - incidunt", "description": "Rem doloribus repellat eos est provident voluptatum. Occaecati a ipsum deserunt pariatur. Iste ex aut iure.", "impact": 10, "parent_id": "019aeaa3-b4ba-71a6-8560-853a8526da81", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:08.000000Z", "updated_at": "2025-12-04T18:33:08.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 1, "budget": 394028.34, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b4d7-71f1-a499-44aba4446db2", "old_id": null, "code": "P-23", "name": "Projeto Hierárquico Principal - accusantium", "description": "Qui voluptates fugit eos et rerum aut laudantium consequatur. Omnis sint reprehenderit iste magni reiciendis dolores ut. Amet aut tenetur quo est perferendis.", "impact": 9, "parent_id": "019aeaa3-b4ba-71a6-8560-853a8526da81", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:08.000000Z", "updated_at": "2025-12-04T18:33:08.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 2, "budget": 70737.15, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b4e6-7167-9b21-84fa4fad34ba", "old_id": null, "code": "P-24", "name": "Projeto Hierárquico Principal - adipisci", "description": "Illum rem cum nihil fuga exercitationem quis. Id officia et porro voluptates laboriosam. Qui pariatur reprehenderit et et quia. At consequuntur et fugiat reprehenderit debitis adipisci amet.", "impact": 5, "parent_id": "019aeaa3-b4ba-71a6-8560-853a8526da81", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:08.000000Z", "updated_at": "2025-12-04T18:33:08.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 4, "budget": 857204.35, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [ { "id": 667, "name": "Inovação", "pivot": { "project_id": "019aeaa3-b4e6-7167-9b21-84fa4fad34ba", "project_funnel_id": 667, "id": 42757, "statuses_at": null, "statuses_by": null, "funnel_status_id": null, "forecast_date": null, "realized_forecast_date": null, "created_at": null, "forecast_date_update_count": 0 }, "tags": [] } ], "funnel_steps": [ { "id": 3817, "name": "Desenvolvimento Conceitual", "project_funnel_id": 667, "sensation_amount": 87, "step_forward_id": null, "step_backward_id": null, "order": 2, "help_text": null, "form_id": null, "sort_config": { "field": "budget", "arguments": [], "direction": "desc" }, "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-11T14:33:58.000000Z", "pivot": { "project_id": "019aeaa3-b4e6-7167-9b21-84fa4fad34ba", "funnel_step_id": 3817, "id": 144134, "order": 2, "created_at": "2025-12-04T18:33:09.000000Z" }, "funnel_step_blockings": [] } ], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b4f9-732c-b15e-e2bbe40e8065", "old_id": null, "code": "P-25", "name": "Projeto Hierárquico Principal - incidunt - sed", "description": "Est dolores consequatur consequatur eligendi enim. Quia harum libero sint ut perferendis aspernatur et. Dolorem illo magnam et voluptates minima ad ut.", "impact": 2, "parent_id": "019aeaa3-b4ca-71e2-af76-60fd1fce1cd8", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:08.000000Z", "updated_at": "2025-12-04T18:33:08.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 2, "budget": 151571.28, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [ { "id": 666, "name": "Inovação", "pivot": { "project_id": "019aeaa3-b4f9-732c-b15e-e2bbe40e8065", "project_funnel_id": 666, "id": 42753, "statuses_at": null, "statuses_by": null, "funnel_status_id": null, "forecast_date": null, "realized_forecast_date": null, "created_at": null, "forecast_date_update_count": 0 }, "tags": [] }, { "id": 667, "name": "Inovação", "pivot": { "project_id": "019aeaa3-b4f9-732c-b15e-e2bbe40e8065", "project_funnel_id": 667, "id": 42759, "statuses_at": null, "statuses_by": null, "funnel_status_id": null, "forecast_date": null, "realized_forecast_date": null, "created_at": null, "forecast_date_update_count": 0 }, "tags": [] } ], "funnel_steps": [ { "id": 3814, "name": "Criação de Prototipagem", "project_funnel_id": 666, "sensation_amount": 50, "step_forward_id": null, "step_backward_id": null, "order": 45, "help_text": null, "form_id": null, "sort_config": null, "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-04T18:33:09.000000Z", "pivot": { "project_id": "019aeaa3-b4f9-732c-b15e-e2bbe40e8065", "funnel_step_id": 3814, "id": 144130, "order": 15, "created_at": "2025-12-04T18:33:09.000000Z" }, "funnel_step_blockings": [] }, { "id": 3817, "name": "Desenvolvimento Conceitual", "project_funnel_id": 667, "sensation_amount": 87, "step_forward_id": null, "step_backward_id": null, "order": 2, "help_text": null, "form_id": null, "sort_config": { "field": "budget", "arguments": [], "direction": "desc" }, "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-11T14:33:58.000000Z", "pivot": { "project_id": "019aeaa3-b4f9-732c-b15e-e2bbe40e8065", "funnel_step_id": 3817, "id": 144215, "order": 11, "created_at": "2025-12-11T14:33:36.000000Z" }, "funnel_step_blockings": [] } ], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b509-7282-af78-a14202c6c236", "old_id": null, "code": "P-26", "name": "Projeto Hierárquico Principal - incidunt - nihil", "description": "Voluptatum doloremque et eos. Enim nam id fugiat doloribus. Est corrupti a mollitia est fuga omnis nobis. Itaque in blanditiis dolore amet. Eos distinctio enim quis vel iusto.", "impact": 6, "parent_id": "019aeaa3-b4ca-71e2-af76-60fd1fce1cd8", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:08.000000Z", "updated_at": "2025-12-04T18:33:08.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 4, "budget": 873077.55, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [ { "id": 667, "name": "Inovação", "pivot": { "project_id": "019aeaa3-b509-7282-af78-a14202c6c236", "project_funnel_id": 667, "id": 42762, "statuses_at": null, "statuses_by": null, "funnel_status_id": null, "forecast_date": null, "realized_forecast_date": null, "created_at": null, "forecast_date_update_count": 0 }, "tags": [] } ], "funnel_steps": [ { "id": 3817, "name": "Desenvolvimento Conceitual", "project_funnel_id": 667, "sensation_amount": 87, "step_forward_id": null, "step_backward_id": null, "order": 2, "help_text": null, "form_id": null, "sort_config": { "field": "budget", "arguments": [], "direction": "desc" }, "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-11T14:33:58.000000Z", "pivot": { "project_id": "019aeaa3-b509-7282-af78-a14202c6c236", "funnel_step_id": 3817, "id": 144139, "order": 1, "created_at": "2025-12-04T18:33:09.000000Z" }, "funnel_step_blockings": [] } ], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b51b-72f1-a7e8-d7821a2a98d8", "old_id": null, "code": "P-27", "name": "Projeto Hierárquico Principal - incidunt - sed - amet", "description": "Incidunt beatae non dolor voluptas. Nulla quis totam aperiam ut itaque. Harum numquam corrupti dolores ad illum maxime.", "impact": 8, "parent_id": "019aeaa3-b4f9-732c-b15e-e2bbe40e8065", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:08.000000Z", "updated_at": "2025-12-04T18:33:08.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 4, "budget": 633662.3, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b52c-71c5-b7e4-fdab5a502b71", "old_id": null, "code": "P-28", "name": "Projeto Hierárquico Principal - incidunt - nihil - iusto", "description": "Ea excepturi iure et beatae occaecati dolorum. Ut accusantium dignissimos distinctio vel aut facere. Deserunt eum aliquam amet sunt ab. Adipisci id corrupti fuga quaerat sit illo.", "impact": 9, "parent_id": "019aeaa3-b509-7282-af78-a14202c6c236", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:08.000000Z", "updated_at": "2025-12-04T18:33:08.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 1, "budget": 997619.02, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b53d-72ff-bfdb-d94173d9234a", "old_id": null, "code": "P-29", "name": "Projeto Hierárquico Principal - accusantium - numquam", "description": "Impedit velit blanditiis sint quisquam sunt. Sapiente ut recusandae quis eos at molestiae ab et. Reiciendis ad ipsam aut voluptatum quaerat.", "impact": 5, "parent_id": "019aeaa3-b4d7-71f1-a499-44aba4446db2", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:08.000000Z", "updated_at": "2025-12-04T18:33:08.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 2, "budget": 93584.8, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [ { "id": 667, "name": "Inovação", "pivot": { "project_id": "019aeaa3-b53d-72ff-bfdb-d94173d9234a", "project_funnel_id": 667, "id": 42761, "statuses_at": null, "statuses_by": null, "funnel_status_id": null, "forecast_date": null, "realized_forecast_date": null, "created_at": null, "forecast_date_update_count": 0 }, "tags": [] } ], "funnel_steps": [ { "id": 3817, "name": "Desenvolvimento Conceitual", "project_funnel_id": 667, "sensation_amount": 87, "step_forward_id": null, "step_backward_id": null, "order": 2, "help_text": null, "form_id": null, "sort_config": { "field": "budget", "arguments": [], "direction": "desc" }, "created_at": "2025-12-04T18:33:09.000000Z", "updated_at": "2025-12-11T14:33:58.000000Z", "pivot": { "project_id": "019aeaa3-b53d-72ff-bfdb-d94173d9234a", "funnel_step_id": 3817, "id": 144228, "order": 8, "created_at": "2025-12-12T17:08:03.000000Z" }, "funnel_step_blockings": [] } ], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null }, { "id": "019aeaa3-b550-71a6-8566-25d68eaaa389", "old_id": null, "code": "P-30", "name": "Projeto Hierárquico Principal - accusantium - non", "description": "Voluptas ipsum tempora et inventore est voluptatum provident. Est aut saepe voluptatem culpa non esse. Ab ipsum eum voluptatem laudantium. Officiis cupiditate quia perferendis omnis quia.", "impact": 8, "parent_id": "019aeaa3-b4d7-71f1-a499-44aba4446db2", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:08.000000Z", "updated_at": "2025-12-04T18:33:08.000000Z", "customer_id": null, "contact_id": null, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 3, "budget": 947843.18, "is_template": false, "created_by": null, "deleted_at": null, "form_answers": [], "tasks": [], "customer": null, "contact": null, "funnels": [], "funnel_steps": [], "tags": [], "groups": [], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company ", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null } ], "meta": { "current_page": 1, "from": 1, "last_page": 3, "per_page": 30, "to": 30, "total": 81 }, "response": true } } } }, "401": { "description": "Não autorizado", "headers": { "Date": { "schema": { "type": "string" }, "example": "Tue, 16 Dec 2025 14:15:28 GMT" }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" }, "Connection": { "schema": { "type": "string" }, "example": "keep-alive" }, "Cache-Control": { "schema": { "type": "string" }, "example": "private, must-revalidate" }, "pragma": { "schema": { "type": "string" }, "example": "no-cache" }, "expires": { "schema": { "type": "integer" }, "example": -1 }, "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." } }, "required": [ "response", "message", "error" ] }, "example": { "response": false, "message": "unauthorized", "error": "Unauthenticated." } } } }, "422": { "description": "Filtro inválido", "headers": { "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" }, "Connection": { "schema": { "type": "string" }, "example": "keep-alive" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." }, "validation": { "type": "object", "description": "Mapa de campo para as mensagens de validação daquele campo.", "properties": {} } }, "required": [ "response", "message", "error", "validation" ] }, "example": { "response": false, "message": "validation_errors", "error": "O campo nonExistsFilterField selecionado é inválido.", "validation": { "field": [ "O campo nonExistsFilterField selecionado é inválido." ] }, "file": null, "stacktrace": null } } } } }, "tags": [ "projects", "Projetos" ], "description": "Retorna uma lista de projetos, com alguns detalhes adicionais.\n\nConsulte:\n\n- [Busca avançada](https://docs.olie.ai/api-reference/general/advanced-search)\n- [Paginação](https://docs.olie.ai/api-reference/general/pagination)", "requestBody": { "content": { "application/json": { "schema": { "description": "Critérios da busca avançada.", "type": "object", "properties": { "filters": { "type": "array", "description": "Filtros aplicados à busca.", "items": { "description": "Um filtro da busca avançada.", "type": "object", "properties": { "field": { "type": "string", "description": "Campo a filtrar." }, "operator": { "type": "string", "enum": [ "equals", "not_equals", "contains", "not_contains", "greater_than", "greater_than_or_equals", "less_than", "less_than_or_equals", "is_null", "is_not_null" ], "description": "Operador da comparação." }, "logical_operator": { "type": "string", "description": "Como o filtro se junta ao anterior: `and` (padrão) ou `or`." }, "arguments": { "type": "array", "description": "Argumentos extras exigidos por alguns filtros.", "items": { "description": "Argumento do filtro." } } }, "required": [ "field", "operator" ] } }, "sorting": { "type": "array", "description": "Ordenações aplicadas, na ordem de prioridade.", "items": { "description": "Regra de ordenação.", "type": "object", "properties": { "field": { "type": "string", "description": "Campo de ordenação." }, "direction": { "type": "string", "enum": [ "asc", "desc" ], "description": "Direção da ordenação." } } } }, "page": { "type": "integer", "description": "Página desejada. Padrão 1." }, "perPage": { "type": "integer", "description": "Itens por página. Padrão 30, máximo 100." } } }, "example": { "filters": [], "sorting": [], "page": 1, "perPage": 30 } } } } } }, "/api/management/projects/quick-store": { "post": { "summary": "Criação rápida", "responses": { "200": { "description": "Sucesso", "headers": { "Date": { "schema": { "type": "string" }, "example": "Fri, 12 Dec 2025 19:29:36 GMT" }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" }, "Connection": { "schema": { "type": "string" }, "example": "keep-alive" }, "Cache-Control": { "schema": { "type": "string" }, "example": "private, must-revalidate" }, "pragma": { "schema": { "type": "string" }, "example": "no-cache" }, "expires": { "schema": { "type": "integer" }, "example": -1 }, "X-RateLimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-RateLimit-Remaining": { "schema": { "type": "integer" }, "example": 159 }, "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" } }, "content": { "application/json": { "schema": { "description": "Projeto retornado pela operação.", "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "project": { "type": "object", "description": "Projeto.", "properties": { "id": { "type": "string", "description": "ID (UUID) do projeto.", "format": "uuid" }, "frame_id": { "type": "string", "description": "ID (UUID) da conta dona do projeto.", "format": "uuid" }, "code": { "type": "string", "description": "Código do projeto, formado pelo prefixo e por um número sequencial." }, "name": { "type": "string", "description": "Nome do projeto." }, "description": { "type": "string", "description": "Descrição do projeto." }, "status": { "type": "integer", "description": "Situação: 1 em andamento, 2 concluído, 3 arquivado, 4 parado." }, "impact": { "type": "integer", "description": "Grau de impacto, de 1 a 10." }, "budget": { "type": "number", "description": "Orçamento do projeto." }, "is_template": { "type": "boolean", "description": "Indica se o projeto é um modelo." }, "parent_id": { "type": "string", "description": "ID do projeto pai, quando este é um subprojeto.", "format": "uuid" }, "customer_id": { "type": "string", "description": "ID do cliente vinculado.", "format": "uuid" }, "contact_id": { "type": "string", "description": "ID do contato vinculado.", "format": "uuid" }, "created_by": { "type": "string", "description": "ID do usuário que criou o projeto.", "format": "uuid" }, "created_at": { "type": "string", "description": "Data de criação.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data em que foi enviado para a lixeira.", "format": "date-time" } } } }, "required": [ "response", "project" ] }, "example": { "response": true, "project": { "frame_id": "019c75de-532c-7047-9563-daf1448ca963", "status": 1, "impact": 10, "description": "Criação rápida", "name": "Nome do projeto", "contact_id": null, "customer_id": null, "code": "ZXC2HQA-22", "id": "019dd427-bb01-70ec-8f2e-c36442ac755f", "created_by": "019c75de-509e-711a-8933-175cb2514cc5", "updated_at": "2026-04-28T12:54:26.000000Z", "created_at": "2026-04-28T12:54:26.000000Z", "form_answers": [ { "id": 36, "label": "Link", "answer": null, "model": "Project", "answered_by": null, "updated_at": "2026-04-01T13:03:13.000000Z" }, { "id": 37, "label": "Link", "answer": null, "model": "Project", "answered_by": null, "updated_at": "2026-04-06T17:14:50.000000Z" } ], "frame": { "id": "019c75de-532c-7047-9563-daf1448ca963", "old_id": null, "name": "Olie Company", "type": "2", "status": 1, "subdomain": "olieframe", "frame_billing_data_id": null, "model_forms": [ { "id": 3, "class": "App\\Models\\FrameRelationship" }, { "id": 14, "class": "App\\Models\\Contact" }, { "id": 12, "class": "App\\Models\\Project" }, { "id": 13, "class": "App\\Models\\Customer" } ], "logo_img": null, "cockpit_access": 1 } } } } } }, "401": { "description": "Não autorizado", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "Date": { "schema": { "type": "string" }, "example": "Mon, 30 Mar 2026 17:03:31 GMT" }, "Referrer-Policy": { "schema": { "type": "string" }, "example": "strict-origin-when-cross-origin" }, "Server": { "schema": { "type": "string" }, "example": "nginx" }, "Strict-Transport-Security": { "schema": { "type": "string" }, "example": "max-age=31536000; includeSubDomains" }, "X-Content-Type-Options": { "schema": { "type": "string" }, "example": "nosniff" }, "X-Frame-Options": { "schema": { "type": "string" }, "example": "SAMEORIGIN" }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." } }, "required": [ "response", "message", "error" ] }, "example": { "response": false, "message": "unauthorized", "error": "Unauthenticated." } } } }, "422": { "description": "Campo inválido", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "Date": { "schema": { "type": "string" }, "example": "Mon, 30 Mar 2026 17:04:04 GMT" }, "Referrer-Policy": { "schema": { "type": "string" }, "example": "strict-origin-when-cross-origin" }, "Server": { "schema": { "type": "string" }, "example": "nginx" }, "Strict-Transport-Security": { "schema": { "type": "string" }, "example": "max-age=31536000; includeSubDomains" }, "X-Content-Type-Options": { "schema": { "type": "string" }, "example": "nosniff" }, "X-Frame-Options": { "schema": { "type": "string" }, "example": "SAMEORIGIN" }, "X-Ratelimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-Ratelimit-Remaining": { "schema": { "type": "integer" }, "example": 159 }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." }, "validation": { "type": "object", "description": "Mapa de campo para as mensagens de validação daquele campo.", "properties": {} } }, "required": [ "response", "message", "error", "validation" ] }, "example": { "response": false, "message": "validation_errors", "error": "O campo nome é obrigatório.", "validation": { "name": [ "O campo nome é obrigatório." ] } } } } } }, "tags": [ "projects", "Projetos" ], "description": "O endpoint de criação rápida de projetos permite criar um novo projeto com apenas as informações essenciais, que no endpoint de criação comum, são obrigatórias. Este método é ideal para criação rápida de projetos quando você não precisa configurar todos os detalhes imediatamente.", "requestBody": { "content": { "application/json": { "schema": { "description": "Dados mínimos para criar um projeto.", "type": "object", "properties": { "name": { "type": "string", "description": "Nome do projeto." }, "prefix": { "type": "string", "description": "Prefixo usado no código do projeto." }, "funnel_step_id": { "type": "integer", "description": "Etapa de funil em que o projeto já entra criado." }, "customer_id": { "type": "string", "description": "ID do cliente a vincular.", "format": "uuid" }, "contact_id": { "type": "string", "description": "ID do contato a vincular.", "format": "uuid" }, "from_project_template_id": { "type": "string", "description": "ID do modelo de projeto a usar como base.", "format": "uuid" } }, "required": [ "name" ] }, "example": { "name": "Nome do projeto", "prefix": "PRJ", "funnel_step_id": null, "customer_id": null, "contact_id": null, "from_project_template_id": null } } } } } }, "/api/management/project-funnel-link-toggle": { "post": { "tags": [ "project-funnels", "Vínculo com projetos" ], "summary": "Alternar vínculo do funil de projeto", "description": "Liga ou desliga o projeto do funil, conforme o estado atual: se ainda não estiver vinculado, vincula e já coloca o projeto na primeira etapa; se estiver, desvincula e remove o projeto de todas as etapas daquele funil. Funis inativos não aceitam vínculo. Ver [Mover projetos entre etapas](https://docs.olie.ai/guides/funnels/moving-projects).", "operationId": "alternarVNculoDoFunilDeProjeto", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." } }, "required": [ "response" ] }, "example": { "response": true } } } }, "422": { "description": "Funil inativo", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." }, "service": { "type": "string", "description": "Serviço que originou o erro." } }, "required": [ "response", "message", "error" ] }, "example": { "response": false, "service": "App\\Exceptions\\Services\\ProjectFunnel\\ToggleProjectFunnelLinkException", "message": "project_funnel_not_active", "error": "The project funnel is not active" } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "project_id": { "type": "string", "description": "ID (UUID) do projeto. Obrigatório.", "format": "uuid" }, "project_funnel_id": { "type": "integer", "description": "ID do funil." } }, "required": [ "project_id" ] }, "example": { "project_id": null, "project_funnel_id": null } } } } } }, "/api/management/update-project-funnel-status": { "post": { "tags": [ "project-funnels", "Vínculo com projetos" ], "summary": "Atualizar status do funil de projeto", "description": "Define o status do projeto dentro do funil — o marcador de desfecho, como ganho ou perdido. Enviar `status_id` nulo limpa o status. Status conclusivos encerram a participação do projeto no funil, e status configurados como bloqueio impedem a entrada nas etapas bloqueadas. Ver [Etiquetas, status e previsão](https://docs.olie.ai/guides/funnels/tags-and-status).", "operationId": "atualizarStatusDoFunilDeProjeto", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "project_funnel_assignment": { "type": "object", "description": "Vínculo do projeto com o funil, já atualizado.", "properties": { "id": { "type": "integer", "description": "ID do vínculo entre projeto e funil." }, "project_id": { "type": "string", "description": "ID (UUID) do projeto.", "format": "uuid" }, "project_funnel_id": { "type": "integer", "description": "ID do funil." }, "funnel_status_id": { "type": "integer", "description": "Status aplicado." }, "statuses_at": { "type": "string", "description": "Momento em que o status foi definido.", "format": "date-time" }, "statuses_by": { "type": "string", "description": "Usuário que definiu o status.", "format": "uuid" }, "forecast_date": { "type": "string", "description": "Data de previsão do projeto no funil.", "format": "date-time" }, "realized_forecast_date": { "type": "string", "description": "Data em que a previsão foi cumprida.", "format": "date-time" }, "forecast_date_update_count": { "type": "integer", "description": "Quantas vezes a previsão foi alterada." }, "created_at": { "type": "string", "description": "Data de criação do vínculo.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" } } } }, "required": [ "response", "project_funnel_assignment" ] }, "example": { "response": true, "project_funnel_assignment": { "id": 5120, "project_id": "9c2f1a44-3b2e-4a0f-9b7a-1c4c5f7e8d90", "project_funnel_id": 74, "funnel_status_id": 9, "statuses_at": "2026-08-19T11:07:44.000000Z", "statuses_by": "019c75de-509e-711a-8933-175cb2514cc5", "forecast_date": "2026-08-30T00:00:00.000000Z", "realized_forecast_date": null, "forecast_date_update_count": 1, "created_at": "2026-08-02T13:04:11.000000Z", "updated_at": "2026-08-19T11:07:44.000000Z" } } } } }, "422": { "description": "Validação falhou", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." }, "validation": { "type": "object", "description": "Mapa de campo para as mensagens de validação daquele campo.", "properties": {} } }, "required": [ "response", "message", "error", "validation" ] }, "example": { "response": false, "message": "validation_errors", "error": "The project id field is required. (and 1 more error)", "validation": { "project_id": [ "The project id field is required." ], "funnel_id": [ "The funnel id field is required." ] } } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "project_id": { "type": "string", "description": "ID (UUID) do projeto. Obrigatório.", "format": "uuid" }, "project_funnel_id": { "type": "integer", "description": "ID do funil. Obrigatório." }, "status_id": { "type": "integer", "description": "ID do status a aplicar. Nulo limpa o status do projeto no funil." } }, "required": [ "project_id", "project_funnel_id" ] }, "example": { "project_id": null, "project_funnel_id": null, "status_id": null } } } } } }, "/api/management/get-project-funnels": { "post": { "tags": [ "project-funnels", "Funis" ], "summary": "Obter um funil de projeto", "description": "Retorna a configuração completa de um funil: etapas com checklists, restrições, anexos, formulário e assistentes, além de etiquetas, status, bloqueios, projetos-modelo e área de negócio. Traz também a lista de usuários com acesso ao funil e, quando o autenticado é um usuário, a configuração de quadro dele. Ver [Criar e configurar um funil](https://docs.olie.ai/guides/funnels/creating-funnels) e [Etapas do funil](https://docs.olie.ai/guides/funnels/steps).", "operationId": "obterFunilDeProjeto", "responses": { "200": { "description": "Sucesso", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "Date": { "schema": { "type": "string" }, "example": "Thu, 15 Jan 2026 20:33:09 GMT" }, "X-Ratelimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-Ratelimit-Remaining": { "schema": { "type": "integer" }, "example": 159 }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "project_funnel": { "type": "object", "description": "Funil com a configuração completa.", "properties": { "id": { "type": "integer", "description": "ID do funil." }, "name": { "type": "string", "description": "Nome do funil." }, "prefix": { "type": "string", "description": "Prefixo usado no código dos projetos do funil." }, "order": { "type": "integer", "description": "Posição do funil na ordem de exibição." }, "condition": { "type": "string", "enum": [ "active", "inactive" ], "description": "Situação do funil." }, "allow_multi_step": { "type": "boolean", "description": "Indica se o projeto pode ocupar várias etapas ao mesmo tempo." }, "project_term": { "type": "object", "description": "Vocabulário do funil para o termo 'projeto'." }, "show_cost_info": { "type": "boolean", "description": "Indica se as informações de custo aparecem no funil." }, "allow_execution": { "type": "boolean", "description": "Indica se o funil permite cronometrar execução." }, "business_area_id": { "type": "integer", "description": "ID da área de negócio do funil." }, "form_id": { "type": "integer", "description": "ID do formulário de vínculo do funil." }, "funnel_config_template_id": { "type": "integer", "description": "Modelo de configuração de quadro em uso." }, "frame_id": { "type": "string", "description": "ID (UUID) da conta dona do funil.", "format": "uuid" }, "created_at": { "type": "string", "description": "Data de criação.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data de arquivamento, quando o funil está arquivado.", "format": "date-time" }, "steps": { "type": "array", "description": "Etapas do funil.", "items": { "description": "Etapa com checklists, restrições, anexos, formulário e assistentes.", "type": "object", "properties": {} } }, "tags": { "type": "array", "description": "Etiquetas do funil.", "items": { "description": "Etiqueta do funil com seus bloqueios de etapa.", "type": "object", "properties": {} } }, "funnel_status": { "type": "array", "description": "Status do funil.", "items": { "description": "Status do funil com seus bloqueios de etapa.", "type": "object", "properties": {} } }, "attachments": { "type": "array", "description": "Anexos do funil.", "items": { "description": "Anexo do funil.", "type": "object", "properties": {} } }, "template_projects": { "type": "array", "description": "Projetos-modelo vinculados ao funil.", "items": { "description": "Projeto-modelo do funil.", "type": "object", "properties": {} } }, "business_area": { "type": "object", "description": "Área de negócio do funil." }, "form": { "type": "object", "description": "Formulário de vínculo do funil." }, "access": { "type": "array", "description": "Usuários com acesso ao funil e o alcance de cada um.", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "ID (UUID) do usuário.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do usuário." }, "avatar_url": { "type": "string", "description": "Foto do usuário." }, "index_all": { "type": "boolean", "description": "Vê todos os projetos do funil." }, "index_assigned": { "type": "boolean", "description": "Vê os projetos em que está designado." }, "index_created": { "type": "boolean", "description": "Vê os projetos que criou." }, "role_based_step_change": { "type": "boolean", "description": "Pode mover projetos entre etapas pelo cargo." } } } } } }, "funnel_view_configs": { "description": "Configuração de quadro do usuário autenticado. Ausente quando o autenticado é uma aplicação.", "anyOf": [ { "type": "object" }, { "type": "array", "items": {} } ] } }, "required": [ "response", "project_funnel" ] }, "example": "{\n \"response\": true,\n \"project_funnel\": {\n \"id\": 74,\n \"name\": \"Desenvolvimento\",\n \"prefix\": \"DL\",\n \"order\": 0,\n \"condition\": \"active\",\n \"business_area_id\": 83,\n \"form_id\": 18,\n \"frame_id\": \"019b329a-4346-7064-bba3-e7c19057cda4\",\n \"created_at\": \"2026-01-09T20:51:29.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:29.000000Z\",\n \"deleted_at\": null,\n \"funnel_config_template_id\": null,\n \"access\": [],\n \"steps\": [\n {\n \"id\": 441,\n \"name\": \"Levantamento de Requisitos\",\n \"project_funnel_id\": 74,\n \"sensation_amount\": 0,\n \"step_forward_id\": null,\n \"step_backward_id\": null,\n \"order\": 1,\n \"help_text\": \"Entender o problema a ser resolvido\",\n \"form_id\": null,\n \"sort_config\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\",\n \"step_forward\": null,\n \"step_backward\": null,\n \"checklists\": [],\n \"restrictions\": [\n {\n \"id\": 190,\n \"name\": null,\n \"step_id\": 441,\n \"direction\": \"outgoing\",\n \"restriction_type\": \"step\",\n \"target_step_id\": 442,\n \"target_tag_id\": null,\n \"target_status_id\": null,\n \"target_saved_filter_id\": null,\n \"target_filter\": null,\n \"hierarchy_scope\": \"current\",\n \"hierarchy_depth\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\"\n }\n ],\n \"attachments\": [],\n \"form\": null,\n \"assistants\": []\n },\n {\n \"id\": 442,\n \"name\": \"Planejamento\",\n \"project_funnel_id\": 74,\n \"sensation_amount\": 0,\n \"step_forward_id\": null,\n \"step_backward_id\": null,\n \"order\": 2,\n \"help_text\": null,\n \"form_id\": null,\n \"sort_config\": {\n \"field\": \"impact\",\n \"arguments\": [],\n \"direction\": \"desc\"\n },\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\",\n \"step_forward\": null,\n \"step_backward\": null,\n \"checklists\": [],\n \"restrictions\": [\n {\n \"id\": 191,\n \"name\": null,\n \"step_id\": 442,\n \"direction\": \"outgoing\",\n \"restriction_type\": \"step\",\n \"target_step_id\": 443,\n \"target_tag_id\": null,\n \"target_status_id\": null,\n \"target_saved_filter_id\": null,\n \"target_filter\": null,\n \"hierarchy_scope\": \"current\",\n \"hierarchy_depth\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\"\n },\n {\n \"id\": 192,\n \"name\": null,\n \"step_id\": 442,\n \"direction\": \"outgoing\",\n \"restriction_type\": \"step\",\n \"target_step_id\": 444,\n \"target_tag_id\": null,\n \"target_status_id\": null,\n \"target_saved_filter_id\": null,\n \"target_filter\": null,\n \"hierarchy_scope\": \"current\",\n \"hierarchy_depth\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\"\n },\n {\n \"id\": 193,\n \"name\": null,\n \"step_id\": 442,\n \"direction\": \"incoming\",\n \"restriction_type\": \"step\",\n \"target_step_id\": 441,\n \"target_tag_id\": null,\n \"target_status_id\": null,\n \"target_saved_filter_id\": null,\n \"target_filter\": null,\n \"hierarchy_scope\": \"current\",\n \"hierarchy_depth\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\"\n },\n {\n \"id\": 194,\n \"name\": null,\n \"step_id\": 442,\n \"direction\": \"incoming\",\n \"restriction_type\": \"step\",\n \"target_step_id\": 444,\n \"target_tag_id\": null,\n \"target_status_id\": null,\n \"target_saved_filter_id\": null,\n \"target_filter\": null,\n \"hierarchy_scope\": \"current\",\n \"hierarchy_depth\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\"\n },\n {\n \"id\": 195,\n \"name\": null,\n \"step_id\": 442,\n \"direction\": \"incoming\",\n \"restriction_type\": \"step\",\n \"target_step_id\": 443,\n \"target_tag_id\": null,\n \"target_status_id\": null,\n \"target_saved_filter_id\": null,\n \"target_filter\": null,\n \"hierarchy_scope\": \"current\",\n \"hierarchy_depth\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\"\n },\n {\n \"id\": 196,\n \"name\": null,\n \"step_id\": 442,\n \"direction\": \"outgoing\",\n \"restriction_type\": \"step\",\n \"target_step_id\": 441,\n \"target_tag_id\": null,\n \"target_status_id\": null,\n \"target_saved_filter_id\": null,\n \"target_filter\": null,\n \"hierarchy_scope\": \"current\",\n \"hierarchy_depth\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\"\n }\n ],\n \"attachments\": [],\n \"form\": null,\n \"assistants\": [\n {\n \"id\": \"019ba487-5289-734a-ab6f-30fc0c22cf61\",\n \"name\": \"Gerador de branch\",\n \"active\": true,\n \"funnel_step_id\": 442,\n \"ai_agent_id\": \"019ba487-5276-7333-968f-90d353740216\",\n \"prompt\": \"Sugira um nome de branch para: \\\"\"\"{{project.name}}\"\"\\\"\",\n \"execute_on\": \"manual\",\n \"manual_execution_enabled\": false,\n \"result_as_media\": true,\n \"result_as_dynamic_form\": {\n \"edge_id\": 1,\n \"form_id\": 1,\n \"project_id\": \"{{project.id}}\",\n \"pivot_class\": \"App\\\\Models\\\\ProjectFunnelAssignment\",\n \"project_funnel_id\": 1\n },\n \"failure_funnel_step_id\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\",\n \"deleted_at\": null\n }\n ]\n },\n {\n \"id\": 443,\n \"name\": \"Design\",\n \"project_funnel_id\": 74,\n \"sensation_amount\": 0,\n \"step_forward_id\": null,\n \"step_backward_id\": null,\n \"order\": 3,\n \"help_text\": null,\n \"form_id\": null,\n \"sort_config\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\",\n \"step_forward\": null,\n \"step_backward\": null,\n \"checklists\": [],\n \"restrictions\": [\n {\n \"id\": 197,\n \"name\": null,\n \"step_id\": 443,\n \"direction\": \"incoming\",\n \"restriction_type\": \"step\",\n \"target_step_id\": 442,\n \"target_tag_id\": null,\n \"target_status_id\": null,\n \"target_saved_filter_id\": null,\n \"target_filter\": null,\n \"hierarchy_scope\": \"current\",\n \"hierarchy_depth\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\"\n },\n {\n \"id\": 198,\n \"name\": null,\n \"step_id\": 443,\n \"direction\": \"incoming\",\n \"restriction_type\": \"step\",\n \"target_step_id\": 444,\n \"target_tag_id\": null,\n \"target_status_id\": null,\n \"target_saved_filter_id\": null,\n \"target_filter\": null,\n \"hierarchy_scope\": \"current\",\n \"hierarchy_depth\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\"\n },\n {\n \"id\": 199,\n \"name\": null,\n \"step_id\": 443,\n \"direction\": \"outgoing\",\n \"restriction_type\": \"step\",\n \"target_step_id\": 444,\n \"target_tag_id\": null,\n \"target_status_id\": null,\n \"target_saved_filter_id\": null,\n \"target_filter\": null,\n \"hierarchy_scope\": \"current\",\n \"hierarchy_depth\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\"\n },\n {\n \"id\": 200,\n \"name\": null,\n \"step_id\": 443,\n \"direction\": \"outgoing\",\n \"restriction_type\": \"step\",\n \"target_step_id\": 442,\n \"target_tag_id\": null,\n \"target_status_id\": null,\n \"target_saved_filter_id\": null,\n \"target_filter\": null,\n \"hierarchy_scope\": \"current\",\n \"hierarchy_depth\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\"\n },\n {\n \"id\": 201,\n \"name\": null,\n \"step_id\": 443,\n \"direction\": \"incoming\",\n \"restriction_type\": \"filter\",\n \"target_step_id\": null,\n \"target_tag_id\": null,\n \"target_status_id\": null,\n \"target_saved_filter_id\": \"019ba487-4f91-72d0-82c1-ecd757e034ed\",\n \"target_filter\": null,\n \"hierarchy_scope\": \"current\",\n \"hierarchy_depth\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\"\n }\n ],\n \"attachments\": [],\n \"form\": null,\n \"assistants\": []\n },\n {\n \"id\": 444,\n \"name\": \"Desenvolvimento\",\n \"project_funnel_id\": 74,\n \"sensation_amount\": 0,\n \"step_forward_id\": null,\n \"step_backward_id\": null,\n \"order\": 4,\n \"help_text\": null,\n \"form_id\": null,\n \"sort_config\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\",\n \"step_forward\": null,\n \"step_backward\": null,\n \"checklists\": [],\n \"restrictions\": [\n {\n \"id\": 202,\n \"name\": null,\n \"step_id\": 444,\n \"direction\": \"incoming\",\n \"restriction_type\": \"step\",\n \"target_step_id\": 442,\n \"target_tag_id\": null,\n \"target_status_id\": null,\n \"target_saved_filter_id\": null,\n \"target_filter\": null,\n \"hierarchy_scope\": \"current\",\n \"hierarchy_depth\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\"\n },\n {\n \"id\": 203,\n \"name\": null,\n \"step_id\": 444,\n \"direction\": \"incoming\",\n \"restriction_type\": \"step\",\n \"target_step_id\": 443,\n \"target_tag_id\": null,\n \"target_status_id\": null,\n \"target_saved_filter_id\": null,\n \"target_filter\": null,\n \"hierarchy_scope\": \"current\",\n \"hierarchy_depth\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\"\n },\n {\n \"id\": 204,\n \"name\": null,\n \"step_id\": 444,\n \"direction\": \"incoming\",\n \"restriction_type\": \"step\",\n \"target_step_id\": 445,\n \"target_tag_id\": null,\n \"target_status_id\": null,\n \"target_saved_filter_id\": null,\n \"target_filter\": null,\n \"hierarchy_scope\": \"current\",\n \"hierarchy_depth\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\"\n },\n {\n \"id\": 205,\n \"name\": null,\n \"step_id\": 444,\n \"direction\": \"outgoing\",\n \"restriction_type\": \"step\",\n \"target_step_id\": 442,\n \"target_tag_id\": null,\n \"target_status_id\": null,\n \"target_saved_filter_id\": null,\n \"target_filter\": null,\n \"hierarchy_scope\": \"current\",\n \"hierarchy_depth\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\"\n },\n {\n \"id\": 206,\n \"name\": null,\n \"step_id\": 444,\n \"direction\": \"outgoing\",\n \"restriction_type\": \"step\",\n \"target_step_id\": 443,\n \"target_tag_id\": null,\n \"target_status_id\": null,\n \"target_saved_filter_id\": null,\n \"target_filter\": null,\n \"hierarchy_scope\": \"current\",\n \"hierarchy_depth\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\"\n },\n {\n \"id\": 207,\n \"name\": null,\n \"step_id\": 444,\n \"direction\": \"outgoing\",\n \"restriction_type\": \"step\",\n \"target_step_id\": 446,\n \"target_tag_id\": null,\n \"target_status_id\": null,\n \"target_saved_filter_id\": null,\n \"target_filter\": null,\n \"hierarchy_scope\": \"current\",\n \"hierarchy_depth\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\"\n },\n {\n \"id\": 208,\n \"name\": \"Atribua uma etiqueta que defina o item\",\n \"step_id\": 444,\n \"direction\": \"incoming\",\n \"restriction_type\": \"filter\",\n \"target_step_id\": null,\n \"target_tag_id\": null,\n \"target_status_id\": null,\n \"target_saved_filter_id\": \"019ba487-4f94-714b-aa68-49f59e07c9ce\",\n \"target_filter\": null,\n \"hierarchy_scope\": \"current\",\n \"hierarchy_depth\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\"\n }\n ],\n \"attachments\": [],\n \"form\": null,\n \"assistants\": []\n },\n {\n \"id\": 445,\n \"name\": \"Correção\",\n \"project_funnel_id\": 74,\n \"sensation_amount\": 0,\n \"step_forward_id\": null,\n \"step_backward_id\": null,\n \"order\": 5,\n \"help_text\": null,\n \"form_id\": null,\n \"sort_config\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\",\n \"step_forward\": null,\n \"step_backward\": null,\n \"checklists\": [],\n \"restrictions\": [\n {\n \"id\": 209,\n \"name\": null,\n \"step_id\": 445,\n \"direction\": \"incoming\",\n \"restriction_type\": \"step\",\n \"target_step_id\": 446,\n \"target_tag_id\": null,\n \"target_status_id\": null,\n \"target_saved_filter_id\": null,\n \"target_filter\": null,\n \"hierarchy_scope\": \"current\",\n \"hierarchy_depth\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\"\n },\n {\n \"id\": 210,\n \"name\": null,\n \"step_id\": 445,\n \"direction\": \"outgoing\",\n \"restriction_type\": \"step\",\n \"target_step_id\": 444,\n \"target_tag_id\": null,\n \"target_status_id\": null,\n \"target_saved_filter_id\": null,\n \"target_filter\": null,\n \"hierarchy_scope\": \"current\",\n \"hierarchy_depth\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\"\n },\n {\n \"id\": 211,\n \"name\": null,\n \"step_id\": 445,\n \"direction\": \"incoming\",\n \"restriction_type\": \"step\",\n \"target_step_id\": 447,\n \"target_tag_id\": null,\n \"target_status_id\": null,\n \"target_saved_filter_id\": null,\n \"target_filter\": null,\n \"hierarchy_scope\": \"current\",\n \"hierarchy_depth\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\"\n }\n ],\n \"attachments\": [],\n \"form\": null,\n \"assistants\": []\n },\n {\n \"id\": 446,\n \"name\": \"Testes\",\n \"project_funnel_id\": 74,\n \"sensation_amount\": 0,\n \"step_forward_id\": null,\n \"step_backward_id\": null,\n \"order\": 6,\n \"help_text\": null,\n \"form_id\": null,\n \"sort_config\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\",\n \"step_forward\": null,\n \"step_backward\": null,\n \"checklists\": [],\n \"restrictions\": [\n {\n \"id\": 212,\n \"name\": null,\n \"step_id\": 446,\n \"direction\": \"incoming\",\n \"restriction_type\": \"step\",\n \"target_step_id\": 444,\n \"target_tag_id\": null,\n \"target_status_id\": null,\n \"target_saved_filter_id\": null,\n \"target_filter\": null,\n \"hierarchy_scope\": \"current\",\n \"hierarchy_depth\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\"\n },\n {\n \"id\": 213,\n \"name\": null,\n \"step_id\": 446,\n \"direction\": \"outgoing\",\n \"restriction_type\": \"step\",\n \"target_step_id\": 447,\n \"target_tag_id\": null,\n \"target_status_id\": null,\n \"target_saved_filter_id\": null,\n \"target_filter\": null,\n \"hierarchy_scope\": \"current\",\n \"hierarchy_depth\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\"\n },\n {\n \"id\": 214,\n \"name\": null,\n \"step_id\": 446,\n \"direction\": \"outgoing\",\n \"restriction_type\": \"step\",\n \"target_step_id\": 445,\n \"target_tag_id\": null,\n \"target_status_id\": null,\n \"target_saved_filter_id\": null,\n \"target_filter\": null,\n \"hierarchy_scope\": \"current\",\n \"hierarchy_depth\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\"\n }\n ],\n \"attachments\": [],\n \"form\": null,\n \"assistants\": []\n },\n {\n \"id\": 447,\n \"name\": \"Finalizado\",\n \"project_funnel_id\": 74,\n \"sensation_amount\": 0,\n \"step_forward_id\": null,\n \"step_backward_id\": null,\n \"order\": 7,\n \"help_text\": null,\n \"form_id\": null,\n \"sort_config\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\",\n \"step_forward\": null,\n \"step_backward\": null,\n \"checklists\": [],\n \"restrictions\": [\n {\n \"id\": 215,\n \"name\": null,\n \"step_id\": 447,\n \"direction\": \"incoming\",\n \"restriction_type\": \"step\",\n \"target_step_id\": 446,\n \"target_tag_id\": null,\n \"target_status_id\": null,\n \"target_saved_filter_id\": null,\n \"target_filter\": null,\n \"hierarchy_scope\": \"current\",\n \"hierarchy_depth\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\"\n },\n {\n \"id\": 216,\n \"name\": null,\n \"step_id\": 447,\n \"direction\": \"outgoing\",\n \"restriction_type\": \"step\",\n \"target_step_id\": 445,\n \"target_tag_id\": null,\n \"target_status_id\": null,\n \"target_saved_filter_id\": null,\n \"target_filter\": null,\n \"hierarchy_scope\": \"current\",\n \"hierarchy_depth\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\"\n }\n ],\n \"attachments\": [],\n \"form\": null,\n \"assistants\": []\n }\n ],\n \"business_area\": {\n \"id\": 83,\n \"name\": \"Desenvolvimento de software\",\n \"order\": 4,\n \"frame_id\": \"019b329a-4346-7064-bba3-e7c19057cda4\",\n \"deleted_at\": null\n },\n \"attachments\": [],\n \"form\": {\n \"id\": 18,\n \"title\": \"Informações adicionais do desenvolvimento\"\n },\n \"template_projects\": [],\n \"tags\": [\n {\n \"id\": 22,\n \"name\": \"Função\",\n \"color\": \"#28a745\",\n \"project_funnel_id\": 74,\n \"deleted_at\": null,\n \"funnel_step_blockings\": []\n },\n {\n \"id\": 23,\n \"name\": \"Bug\",\n \"color\": \"#ff8d92\",\n \"project_funnel_id\": 74,\n \"deleted_at\": null,\n \"funnel_step_blockings\": []\n },\n {\n \"id\": 24,\n \"name\": \"Ajuste\",\n \"color\": \"#258aff\",\n \"project_funnel_id\": 74,\n \"deleted_at\": null,\n \"funnel_step_blockings\": []\n }\n ],\n \"funnel_status\": [\n {\n \"id\": 8,\n \"name\": \"Urgente\",\n \"color\": \"#dc3545\",\n \"project_funnel_id\": 74,\n \"is_conclusive\": false,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\",\n \"deleted_at\": null,\n \"funnel_step_blockings\": [\n {\n \"id\": 8,\n \"automation_bypass\": false,\n \"funnel_step_id\": 447,\n \"funnel_status_id\": 8,\n \"funnel_tag_id\": null,\n \"created_at\": \"2026-01-09T20:51:30.000000Z\",\n \"updated_at\": \"2026-01-09T20:51:30.000000Z\"\n }\n ]\n }\n ]\n },\n \"funnel_view_configs\": [\n {\n \"key\": \"card.weight\",\n \"value\": \"medium\",\n \"form_edge_id\": null\n },\n {\n \"key\": \"info.show.tags\",\n \"value\": true,\n \"form_edge_id\": null\n },\n {\n \"key\": \"info.show.task_summary\",\n \"value\": false,\n \"form_edge_id\": null\n },\n {\n \"key\": \"info.show.customer\",\n \"value\": false,\n \"form_edge_id\": null\n },\n {\n \"key\": \"info.show.contact\",\n \"value\": false,\n \"form_edge_id\": null\n },\n {\n \"key\": \"info.show.assigned_to\",\n \"value\": true,\n \"form_edge_id\": null\n },\n {\n \"key\": \"info.show.created_by\",\n \"value\": false,\n \"form_edge_id\": null\n },\n {\n \"key\": \"info.show.impact\",\n \"value\": false,\n \"form_edge_id\": null\n },\n {\n \"key\": \"info.show.status\",\n \"value\": true,\n \"form_edge_id\": null\n },\n {\n \"key\": \"info.show.budget\",\n \"value\": false,\n \"form_edge_id\": null\n },\n {\n \"key\": \"info.show.expected_cost\",\n \"value\": false,\n \"form_edge_id\": null\n },\n {\n \"key\": \"info.show.elapsed_cost\",\n \"value\": false,\n \"form_edge_id\": null\n },\n {\n \"key\": \"info.show.costs_per_user\",\n \"value\": false,\n \"form_edge_id\": null\n },\n {\n \"key\": \"info.show.created_at\",\n \"value\": false,\n \"form_edge_id\": null\n },\n {\n \"key\": \"info.show.description\",\n \"value\": false,\n \"form_edge_id\": null\n },\n {\n \"key\": \"info.show.forecast_date\",\n \"value\": false,\n \"form_edge_id\": null\n },\n {\n \"key\": \"info.show.groups\",\n \"value\": false,\n \"form_edge_id\": null\n },\n {\n \"key\": \"buttons.show_buttons_on_hover\",\n \"value\": false,\n \"form_edge_id\": null\n },\n {\n \"key\": \"buttons.show.content\",\n \"value\": true,\n \"form_edge_id\": null\n },\n {\n \"key\": \"buttons.show.funnel_tags\",\n \"value\": true,\n \"form_edge_id\": null\n },\n {\n \"key\": \"buttons.show.collect_data\",\n \"value\": true,\n \"form_edge_id\": null\n },\n {\n \"key\": \"buttons.show.checklists\",\n \"value\": true,\n \"form_edge_id\": null\n },\n {\n \"key\": \"buttons.show.files\",\n \"value\": true,\n \"form_edge_id\": null\n },\n {\n \"key\": \"buttons.show.forms\",\n \"value\": true,\n \"form_edge_id\": null\n },\n {\n \"key\": \"buttons.show.project_edit\",\n \"value\": true,\n \"form_edge_id\": null\n },\n {\n \"key\": \"buttons.show.hierarchy\",\n \"value\": true,\n \"form_edge_id\": null\n },\n {\n \"key\": \"buttons.show.forum\",\n \"value\": true,\n \"form_edge_id\": null\n },\n {\n \"key\": \"buttons.show.funnel_status\",\n \"value\": true,\n \"form_edge_id\": null\n },\n {\n \"key\": \"buttons.show.copy_link\",\n \"value\": true,\n \"form_edge_id\": null\n },\n {\n \"key\": \"df_project_funnel\",\n \"value\": true,\n \"form_edge_id\": 61\n },\n {\n \"key\": \"df_project_funnel\",\n \"value\": true,\n \"form_edge_id\": 62\n },\n {\n \"key\": \"df_project_funnel\",\n \"value\": true,\n \"form_edge_id\": 63\n }\n ]\n}" } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "project_funnel_id": { "type": "integer", "description": "ID do funil a carregar. Obrigatório." }, "include_automations": { "type": "boolean", "description": "Quando true, inclui as automações de cada etapa — desde que o usuário possa vê-las." }, "with_trashed_relations": { "type": "boolean", "description": "Quando true, inclui etiquetas e status excluídos, para exibir o histórico de projetos antigos." }, "offset": { "type": "integer", "description": "Reservado para paginação interna." } }, "required": [ "project_funnel_id" ] }, "example": { "project_funnel_id": null, "include_automations": false, "with_trashed_relations": false } } } } }, "get": { "summary": "Listar funis de projeto", "responses": { "200": { "description": "Sucesso", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "Date": { "schema": { "type": "string" }, "example": "Thu, 15 Jan 2026 20:29:44 GMT" }, "X-Ratelimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-Ratelimit-Remaining": { "schema": { "type": "integer" }, "example": 159 }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "project_funnels": { "type": "array", "description": "Funis visíveis ao usuário, na ordem de exibição.", "items": { "type": "object", "properties": { "id": { "type": "integer", "description": "ID do funil." }, "name": { "type": "string", "description": "Nome do funil." }, "prefix": { "type": "string", "description": "Prefixo usado no código dos projetos do funil." }, "frame_id": { "type": "string", "description": "ID (UUID) do frame.", "format": "uuid" }, "condition": { "type": "string", "enum": [ "active", "inactive" ], "description": "Situação do funil." }, "allow_multi_step": { "type": "boolean", "description": "Indica se o projeto pode ocupar várias etapas ao mesmo tempo." }, "project_term": { "type": "object", "description": "Vocabulário do funil para o termo 'projeto'." }, "show_cost_info": { "type": "boolean", "description": "Indica se as informações de custo aparecem no funil." }, "allow_execution": { "type": "boolean", "description": "Indica se o funil permite cronometrar execução." }, "business_area": { "type": "object", "description": "Área de negócio do funil.", "properties": { "id": { "type": "integer", "description": "ID da área de negócio." }, "name": { "type": "string", "description": "Nome da área de negócio." } } }, "business_area_id": { "type": "integer", "description": "ID da área de negócio do funil." }, "form_id": { "type": "integer", "description": "ID do formulário de vínculo do funil." }, "projects_count": { "type": "integer", "description": "Quantidade de projetos vinculados ao funil." }, "steps_count": { "type": "integer", "description": "Quantidade de etapas do funil." }, "tags_count": { "type": "integer", "description": "Quantidade de etiquetas do funil." }, "status_count": { "type": "integer", "description": "Quantidade de status do funil." }, "attachments_count": { "type": "integer", "description": "Quantidade de anexos do funil." }, "created_at": { "type": "string", "description": "Data de criação.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data de arquivamento, quando o funil está arquivado.", "format": "date-time" } } } } }, "required": [ "response", "project_funnels" ] }, "example": { "response": true, "project_funnels": [ { "id": 74, "name": "Desenvolvimento", "prefix": "DL19", "frame_id": "019b329a-4346-7064-bba3-e7c19057cda4", "condition": "active", "allow_multi_step": false, "project_term": null, "show_cost_info": true, "allow_execution": true, "business_area": { "id": 83, "name": "Desenvolvimento de software-1-2-3-4" }, "business_area_id": 83, "form_id": 18, "attachments_count": 0, "projects_count": 0, "status_count": 1, "steps_count": 7, "tags_count": 3, "created_at": "2026-01-09T20:51:29.000000Z", "updated_at": "2026-01-09T20:51:29.000000Z", "deleted_at": null }, { "id": 23, "name": "Captação de Recursos", "prefix": "CR", "frame_id": "019b329a-4346-7064-bba3-e7c19057cda4", "condition": "active", "allow_multi_step": false, "project_term": null, "show_cost_info": true, "allow_execution": true, "business_area": { "id": 10, "name": "Serviços Financeiros 69444026ba810" }, "business_area_id": 10, "form_id": null, "attachments_count": 0, "projects_count": 22, "status_count": 0, "steps_count": 8, "tags_count": 0, "created_at": "2025-12-18T17:55:50.000000Z", "updated_at": "2025-12-18T17:55:51.000000Z", "deleted_at": null }, { "id": 53, "name": "Auditoria", "prefix": "JIHJ10", "frame_id": "019b329a-4346-7064-bba3-e7c19057cda4", "condition": "active", "allow_multi_step": false, "project_term": null, "show_cost_info": true, "allow_execution": true, "business_area": null, "business_area_id": null, "form_id": null, "attachments_count": 0, "projects_count": 0, "status_count": 0, "steps_count": 6, "tags_count": 0, "created_at": "2026-01-09T20:39:32.000000Z", "updated_at": "2026-01-09T20:39:32.000000Z", "deleted_at": null }, { "id": 71, "name": "Vendas", "prefix": "VDS", "frame_id": "019b329a-4346-7064-bba3-e7c19057cda4", "condition": "active", "allow_multi_step": false, "project_term": null, "show_cost_info": true, "allow_execution": true, "business_area": null, "business_area_id": null, "form_id": null, "attachments_count": 0, "projects_count": 0, "status_count": 0, "steps_count": 7, "tags_count": 0, "created_at": "2026-01-09T20:51:29.000000Z", "updated_at": "2026-01-09T20:51:30.000000Z", "deleted_at": null } ] } } } } }, "tags": [ "project-funnels", "Funis" ], "description": "Lista os funis da conta na ordem de exibição definida pelo usuário, cada um com a área de negócio e as contagens de projetos, etapas, etiquetas, status e anexos. **Só retorna os funis ativos por padrão** — envie `filter[condition]=inactive` para os inativos e `filter[trashed]=with` ou `only` para incluir os arquivados. Funis que o usuário autenticado não tem permissão de ver são omitidos da lista. Ver [Criar e configurar um funil](https://docs.olie.ai/guides/funnels/creating-funnels) e [Filtros básicos](https://docs.olie.ai/api-reference/general/basic-filters).", "parameters": [ { "name": "search", "in": "query", "description": "Termo buscado no nome do funil. Ignorado quando `id` é informado.", "schema": { "type": "string" }, "example": "" }, { "name": "id", "in": "query", "description": "ID de um funil específico. Retorna apenas ele.", "schema": { "type": "string" }, "example": "" }, { "name": "filter[condition]", "in": "query", "description": "Situação do funil: `active` (padrão quando o parâmetro é omitido) ou `inactive`.", "schema": { "type": "string" }, "example": "" }, { "name": "filter[name]", "in": "query", "description": "Nome exato do funil.", "schema": { "type": "string" }, "example": "" }, { "name": "filter[business_area.id]", "in": "query", "description": "ID da área de negócio dona dos funis.", "schema": { "type": "string" }, "example": "" }, { "name": "filter[trashed]", "in": "query", "description": "Arquivados: `with` inclui, `only` retorna apenas eles, `without` (padrão) omite.", "schema": { "type": "string" }, "example": "" } ] } }, "/api/management/toggle-funnel-tag": { "post": { "tags": [ "project-funnels", "Vínculo com projetos" ], "summary": "Alternar vínculo de etiqueta do funil de um projeto", "description": "Aplica ou remove uma etiqueta do projeto, conforme o estado atual. A etiqueta precisa pertencer a um dos funis aos quais o projeto está vinculado. Etiquetas configuradas como bloqueio de etapa impedem o projeto de entrar nas etapas bloqueadas enquanto estiverem aplicadas. Ver [Etiquetas, status e previsão](https://docs.olie.ai/guides/funnels/tags-and-status).", "operationId": "alternarVNculoDeEtiquetaDoFunilDeUmProjeto", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." } }, "required": [ "response" ] }, "example": { "response": true } } } }, "422": { "description": "Etiqueta bloqueia a etapa atual", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." }, "service": { "type": "string", "description": "Serviço que originou o erro." }, "step_blockings": { "description": "Bloqueios encontrados. Vem vazio quando o bloqueio é detectado na aplicação da etiqueta.", "anyOf": [ { "type": "object" }, { "type": "array", "items": {} } ] } }, "required": [ "response", "message", "error" ] }, "example": { "response": false, "service": "App\\Exceptions\\Services\\ProjectFunnel\\FunnelStepBlocking\\FunnelStepBlockingException", "message": "blocked_by_existing_step_blocking", "error": "Blocked by existing step blocking", "step_blockings": [] } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "project_id": { "type": "string", "description": "ID (UUID) do projeto. Obrigatório.", "format": "uuid" }, "funnel_tag_id": { "type": "integer", "description": "ID da etiqueta do funil. Obrigatório." } }, "required": [ "project_id", "funnel_tag_id" ] }, "example": { "project_id": null, "funnel_tag_id": null } } } } } }, "/api/management/delete-funnel": { "post": { "tags": [ "project-funnels", "Ciclo de vida" ], "summary": "Arquivar um funil", "description": "Arquiva o funil, tirando-o das listagens do dia a dia sem apagar o histórico — a operação é reversível pelo endpoint de restauração. Só funciona com o funil vazio: havendo qualquer projeto vinculado, a requisição é recusada e o funil permanece como está. Ver [Criar e configurar um funil](https://docs.olie.ai/guides/funnels/creating-funnels).", "operationId": "arquivarFunil", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "project_funnel": { "type": "object", "description": "Funil de projeto.", "properties": { "id": { "type": "integer", "description": "ID do funil." }, "name": { "type": "string", "description": "Nome do funil." }, "prefix": { "type": "string", "description": "Prefixo usado no código dos projetos do funil." }, "order": { "type": "integer", "description": "Posição do funil na ordem de exibição." }, "condition": { "type": "string", "enum": [ "active", "inactive" ], "description": "Situação do funil." }, "allow_multi_step": { "type": "boolean", "description": "Indica se o projeto pode ocupar várias etapas ao mesmo tempo." }, "project_term": { "type": "object", "description": "Vocabulário do funil para o termo 'projeto'." }, "show_cost_info": { "type": "boolean", "description": "Indica se as informações de custo aparecem no funil." }, "allow_execution": { "type": "boolean", "description": "Indica se o funil permite cronometrar execução." }, "business_area_id": { "type": "integer", "description": "ID da área de negócio do funil." }, "form_id": { "type": "integer", "description": "ID do formulário de vínculo do funil." }, "funnel_config_template_id": { "type": "integer", "description": "Modelo de configuração de quadro em uso." }, "frame_id": { "type": "string", "description": "ID (UUID) da conta dona do funil.", "format": "uuid" }, "created_at": { "type": "string", "description": "Data de criação.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data de arquivamento, quando o funil está arquivado.", "format": "date-time" } } } }, "required": [ "response", "project_funnel" ] }, "example": { "response": true, "project_funnel": { "id": 74, "name": "Comercial", "prefix": "COM", "order": 0, "condition": "active", "allow_multi_step": false, "project_term": null, "show_cost_info": true, "allow_execution": true, "business_area_id": 83, "form_id": null, "funnel_config_template_id": null, "frame_id": "019b329a-4346-7064-bba3-e7c19057cda4", "created_at": "2026-01-09T20:51:29.000000Z", "updated_at": "2026-08-19T11:07:44.000000Z", "deleted_at": "2026-08-19T11:07:44.000000Z" } } } } }, "422": { "description": "Funil com projetos", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." } }, "required": [ "response", "message" ] }, "example": { "response": false, "message": "archive_funnel_error_message" } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "project_funnel_id": { "type": "integer", "description": "ID do funil. Obrigatório." } }, "required": [ "project_funnel_id" ] }, "example": { "project_funnel_id": null } } } } } }, "/api/management/restore-funnel": { "post": { "tags": [ "project-funnels", "Ciclo de vida" ], "summary": "Restaurar um funil", "description": "Traz de volta um funil arquivado, com a configuração que ele tinha. O funil volta a aparecer nas listagens e a aceitar projetos. Ver [Criar e configurar um funil](https://docs.olie.ai/guides/funnels/creating-funnels).", "operationId": "restaurarFunil", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "project_funnel": { "type": "object", "description": "Funil de projeto.", "properties": { "id": { "type": "integer", "description": "ID do funil." }, "name": { "type": "string", "description": "Nome do funil." }, "prefix": { "type": "string", "description": "Prefixo usado no código dos projetos do funil." }, "order": { "type": "integer", "description": "Posição do funil na ordem de exibição." }, "condition": { "type": "string", "enum": [ "active", "inactive" ], "description": "Situação do funil." }, "allow_multi_step": { "type": "boolean", "description": "Indica se o projeto pode ocupar várias etapas ao mesmo tempo." }, "project_term": { "type": "object", "description": "Vocabulário do funil para o termo 'projeto'." }, "show_cost_info": { "type": "boolean", "description": "Indica se as informações de custo aparecem no funil." }, "allow_execution": { "type": "boolean", "description": "Indica se o funil permite cronometrar execução." }, "business_area_id": { "type": "integer", "description": "ID da área de negócio do funil." }, "form_id": { "type": "integer", "description": "ID do formulário de vínculo do funil." }, "funnel_config_template_id": { "type": "integer", "description": "Modelo de configuração de quadro em uso." }, "frame_id": { "type": "string", "description": "ID (UUID) da conta dona do funil.", "format": "uuid" }, "created_at": { "type": "string", "description": "Data de criação.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data de arquivamento, quando o funil está arquivado.", "format": "date-time" } } } }, "required": [ "response", "project_funnel" ] }, "example": { "response": true, "project_funnel": { "id": 74, "name": "Comercial", "prefix": "COM", "order": 0, "condition": "active", "allow_multi_step": false, "project_term": null, "show_cost_info": true, "allow_execution": true, "business_area_id": 83, "form_id": null, "funnel_config_template_id": null, "frame_id": "019b329a-4346-7064-bba3-e7c19057cda4", "created_at": "2026-01-09T20:51:29.000000Z", "updated_at": "2026-08-19T11:07:44.000000Z", "deleted_at": null } } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "project_funnel_id": { "type": "integer", "description": "ID do funil. Obrigatório." } }, "required": [ "project_funnel_id" ] }, "example": { "project_funnel_id": null } } } } } }, "/api/management/clone-funnel": { "post": { "tags": [ "project-funnels", "Ciclo de vida" ], "summary": "Clonar um funil", "description": "Cria uma cópia do funil com toda a configuração — etapas, checklists, restrições, etiquetas, status, anexos, automações, assistentes, modelos de configurações de visualização, permissões e templates de projeto (sem trazer os projetos reais). Sem `name`, a cópia recebe o nome do original seguido de ` (Clone)`. Funis arquivados não podem ser clonados.\n\n**O que clonar:** cada categoria pode ser desligada individualmente pelas flags booleanas do corpo. Flag omitida ou `null` equivale a `true`, então uma chamada sem flags clona tudo.\n\n**Dependências forçadas:** algumas categorias são ligadas automaticamente quando outra depende delas. Se `automations`, `step_restrictions` ou `funnel_step_blockings` estiver `true`, então `funnel_tags` e `funnel_statuses` viram `true` mesmo que enviados como `false`. Se `automations` estiver `true`, `step_assistants` também vira `true`. Ou seja, desligar etiquetas/status só tem efeito quando os três primeiros estão `false`.\n\nO funil, as etapas, os vínculos de formulário e a área de negócio são sempre clonados e não têm flag. Formulários, agentes de IA e áreas de negócio são reaproveitados (não duplicados).\n\nVer [Criar e configurar um funil](https://docs.olie.ai/guides/funnels/creating-funnels).", "operationId": "clonarFunil", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "project_funnel": { "type": "object", "description": "Funil de projeto.", "properties": { "id": { "type": "integer", "description": "ID do funil." }, "name": { "type": "string", "description": "Nome do funil." }, "prefix": { "type": "string", "description": "Prefixo usado no código dos projetos do funil." }, "order": { "type": "integer", "description": "Posição do funil na ordem de exibição." }, "condition": { "type": "string", "enum": [ "active", "inactive" ], "description": "Situação do funil." }, "allow_multi_step": { "type": "boolean", "description": "Indica se o projeto pode ocupar várias etapas ao mesmo tempo." }, "project_term": { "type": "object", "description": "Vocabulário do funil para o termo 'projeto'." }, "show_cost_info": { "type": "boolean", "description": "Indica se as informações de custo aparecem no funil." }, "allow_execution": { "type": "boolean", "description": "Indica se o funil permite cronometrar execução." }, "business_area_id": { "type": "integer", "description": "ID da área de negócio do funil." }, "form_id": { "type": "integer", "description": "ID do formulário de vínculo do funil." }, "funnel_config_template_id": { "type": "integer", "description": "Modelo de configuração de quadro em uso." }, "frame_id": { "type": "string", "description": "ID (UUID) da conta dona do funil.", "format": "uuid" }, "created_at": { "type": "string", "description": "Data de criação.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data de arquivamento, quando o funil está arquivado.", "format": "date-time" } } } }, "required": [ "response", "project_funnel" ] }, "example": { "response": true, "project_funnel": { "id": 98, "name": "Comercial (Clone)", "prefix": "COMC", "order": 11, "condition": "active", "allow_multi_step": false, "project_term": null, "show_cost_info": true, "allow_execution": true, "business_area_id": 83, "form_id": null, "funnel_config_template_id": null, "frame_id": "019b329a-4346-7064-bba3-e7c19057cda4", "created_at": "2026-01-09T20:51:29.000000Z", "updated_at": "2026-08-19T11:07:44.000000Z", "deleted_at": null } } } } }, "422": { "description": "Funil arquivado, validação inválida ou falha parcial do clone", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso. `cant_clone_archived_project_funnel`: o funil de origem está arquivado. `funnel_clone_partial_failure`: não foi possível clonar este funil — nenhuma alteração foi feita, pois existem itens relacionados que impediram a clonagem. `funnel_clone_missing_funnel`: o funil clonado não foi localizado ao final do processo. `validation_errors`: corpo inválido.", "enum": [ "cant_clone_archived_project_funnel", "funnel_clone_partial_failure", "funnel_clone_missing_funnel", "validation_errors" ] } }, "required": [ "response", "message" ] }, "example": { "response": false, "message": "cant_clone_archived_project_funnel" } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "project_funnel_id": { "type": "integer", "description": "ID do funil a clonar. Obrigatório." }, "name": { "type": "string", "maxLength": 255, "description": "Nome do funil clonado. Sem ele, o nome vira o do original seguido de ` (Clone)`. Máximo de 255 caracteres." }, "automations": { "type": "boolean", "description": "Automações: copia as automações ligadas às etapas deste funil. Quando true, força `funnel_tags`, `funnel_statuses` e `step_assistants`. Padrão true.", "default": true }, "step_restrictions": { "type": "boolean", "description": "Restrições: copia as restrições das etapas. Quando true, força `funnel_tags` e `funnel_statuses`. Padrão true.", "default": true }, "step_assistants": { "type": "boolean", "description": "Assistentes: copia os vínculos de assistente nas etapas (os agentes existentes são reutilizados). Forçado para true quando `automations` é true. Padrão true.", "default": true }, "step_checklists": { "type": "boolean", "description": "Checklists: copia os checklists das etapas. Padrão true.", "default": true }, "funnel_step_blockings": { "type": "boolean", "description": "Bloqueio de etapas: copia os bloqueios de etapas das etiquetas/status do funil. Quando true, força `funnel_tags` e `funnel_statuses`. Padrão true.", "default": true }, "funnel_tags": { "type": "boolean", "description": "Etiquetas: copia as etiquetas do funil. Obrigatório enquanto automações, restrições ou bloqueios estiverem marcados — só tem efeito como false quando `automations`, `step_restrictions` e `funnel_step_blockings` estão todos false. Padrão true.", "default": true }, "funnel_statuses": { "type": "boolean", "description": "Status: copia os status do funil. Obrigatório enquanto automações, restrições ou bloqueios estiverem marcados — só tem efeito como false quando `automations`, `step_restrictions` e `funnel_step_blockings` estão todos false. Padrão true.", "default": true }, "funnel_attachments": { "type": "boolean", "description": "Anexos: copia anexos do funil e vínculos de anexo nas etapas. Padrão true.", "default": true }, "funnel_config_templates": { "type": "boolean", "description": "Modelos de configurações de visualização: copia modelos de configurações de visualização do funil. Padrão true.", "default": true }, "permissions": { "type": "boolean", "description": "Permissões: replica permissões de acesso do funil original para o clone. Padrão true.", "default": true }, "template_projects": { "type": "boolean", "description": "Templates de projeto: copia os vínculos com templates de projeto do funil original. Padrão true.", "default": true } }, "required": [ "project_funnel_id" ] }, "example": { "project_funnel_id": 97, "name": "Comercial (Clone)", "automations": false, "step_restrictions": true, "step_assistants": true, "step_checklists": true, "funnel_step_blockings": true, "funnel_tags": true, "funnel_statuses": true, "funnel_attachments": false, "funnel_config_templates": true, "permissions": true, "template_projects": false } } } } } }, "/api/management/project-funnels/reorder": { "post": { "tags": [ "project-funnels", "Funis" ], "summary": "Reordenar funis de projeto", "description": "Define a ordem de exibição dos funis da conta. A posição de cada funil é a posição dele no array enviado — o primeiro ID vira o primeiro funil da lista. Funis arquivados também podem ser reordenados. A ordem vale para toda a conta, não por usuário.", "operationId": "reordenarFunisDeProjeto", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." } }, "required": [ "response" ] }, "example": { "response": true } } } }, "422": { "description": "Validação falhou", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." }, "validation": { "type": "object", "description": "Mapa de campo para as mensagens de validação daquele campo.", "properties": {} } }, "required": [ "response", "message", "error", "validation" ] }, "example": { "response": false, "message": "validation_errors", "error": "The project funnel ids field is required.", "validation": { "project_funnel_ids": [ "The project funnel ids field is required." ] } } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "project_funnel_ids": { "type": "array", "description": "IDs dos funis na ordem desejada. Obrigatório.", "items": { "type": "integer", "description": "ID de um funil." } } }, "required": [ "project_funnel_ids" ] }, "example": { "project_funnel_ids": [] } } } } } }, "/api/management/project-funnel": { "post": { "tags": [ "project-funnels", "Funis" ], "summary": "Criar ou atualizar um funil de projeto", "description": "Salva o funil inteiro de uma vez — é o payload da tela de edição. Sem `id` cria um funil novo; com `id` substitui a configuração do funil existente. **O payload é a verdade final**: etapas, checklists, restrições, etiquetas e status que não vierem na requisição são removidos do funil. Itens que estouram o limite do plano não são criados e voltam listados em `objects_above_limit`, sem derrubar o resto do salvamento. Ver [Criar e configurar um funil](https://docs.olie.ai/guides/funnels/creating-funnels), [Etapas do funil](https://docs.olie.ai/guides/funnels/steps) e [Restrições e bloqueios](https://docs.olie.ai/guides/funnels/restrictions).", "operationId": "criarOuAtualizarFunilDeProjeto", "responses": { "200": { "description": "Sucesso", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "X-Content-Type-Options": { "schema": { "type": "string" }, "example": "nosniff" }, "X-Frame-Options": { "schema": { "type": "string" }, "example": "SAMEORIGIN" }, "X-Ratelimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-Ratelimit-Remaining": { "schema": { "type": "integer" }, "example": 159 } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "project_funnel": { "type": "object", "description": "Funil de projeto.", "properties": { "id": { "type": "integer", "description": "ID do funil." }, "name": { "type": "string", "description": "Nome do funil." }, "prefix": { "type": "string", "description": "Prefixo usado no código dos projetos do funil." }, "order": { "type": "integer", "description": "Posição do funil na ordem de exibição." }, "condition": { "type": "string", "enum": [ "active", "inactive" ], "description": "Situação do funil." }, "allow_multi_step": { "type": "boolean", "description": "Indica se o projeto pode ocupar várias etapas ao mesmo tempo." }, "project_term": { "type": "object", "description": "Vocabulário do funil para o termo 'projeto'." }, "show_cost_info": { "type": "boolean", "description": "Indica se as informações de custo aparecem no funil." }, "allow_execution": { "type": "boolean", "description": "Indica se o funil permite cronometrar execução." }, "business_area_id": { "type": "integer", "description": "ID da área de negócio do funil." }, "form_id": { "type": "integer", "description": "ID do formulário de vínculo do funil." }, "funnel_config_template_id": { "type": "integer", "description": "Modelo de configuração de quadro em uso." }, "frame_id": { "type": "string", "description": "ID (UUID) da conta dona do funil.", "format": "uuid" }, "created_at": { "type": "string", "description": "Data de criação.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data de arquivamento, quando o funil está arquivado.", "format": "date-time" } } }, "objects_above_limit": { "type": "array", "description": "Objetos barrados pelo limite do plano. Vazio quando tudo coube.", "items": { "type": "string", "description": "Tipo de objeto que não pôde ser criado por limite do plano, como `project_funnel`, `automation` ou `step_assistant`." } } }, "required": [ "response", "project_funnel" ] }, "example": { "response": true, "project_funnel": { "order": 11, "name": "Nome do funil", "condition": "active", "allow_multi_step": true, "show_cost_info": true, "frame_id": "019c75de-532c-7047-9563-daf1448ca963", "allow_execution": true, "prefix": "PREFIX2", "form_id": 7, "updated_at": "2026-03-16T16:34:43.000000Z", "created_at": "2026-03-16T16:34:43.000000Z", "id": 54, "business_area_id": 19, "business_area": { "id": 19, "name": "Área de negócio", "order": 0, "frame_id": "019c75de-532c-7047-9563-daf1448ca963", "deleted_at": null }, "steps": [ { "id": 240, "name": "Backlog", "project_funnel_id": 54, "sensation_amount": 50, "step_forward_id": null, "step_backward_id": null, "show_contact_form": false, "hide_contact_form_when_linked": false, "show_customer_form": false, "hide_customer_form_when_linked": false, "order": 1, "help_text": "Texto de ajuda da etapa", "form_id": 7, "sort_config": null, "allow_execution": true, "created_at": "2026-03-16T16:34:43.000000Z", "updated_at": "2026-03-16T16:34:43.000000Z", "deleted_at": null, "checklists": [ { "id": 4, "name": "Checklist 1", "info": "Texto informativo da checklist", "funnel_step_id": 240, "required": true, "order": 0 }, { "id": 5, "name": "Checklist 2", "info": null, "funnel_step_id": 240, "required": true, "order": 1 }, { "id": 6, "name": "Checklist 3", "info": null, "funnel_step_id": 240, "required": false, "order": 2 } ], "attachments": [ { "id": 1, "name": "Captura de tela de 2026-02-12 09-34-45.png", "technical_name": "", "extension": "png", "file_url": "https://olie-main-dev.s3.amazonaws.com/app/frames/019c75de-532c-7047-9563-daf1448ca963/funnel_attachments/EUCnLFRPVhJkpyq6GKDcmXNgI2S1j9HWs0AZ-captura-de-tela-de-2026-02-12-09-34-45.png", "popup_video": 0, "watch": false, "user_id": "019c75de-509e-711a-8933-175cb2514cc5", "frame_id": "019c75de-532c-7047-9563-daf1448ca963", "created_at": "2026-03-16T13:23:06.000000Z", "updated_at": "2026-03-16T13:23:06.000000Z", "deleted_at": null, "pivot": { "funnel_step_id": 240, "step_attachment_id": 1 } }, { "id": 2, "name": "Link Vídeo", "technical_name": "link_technical_name", "extension": "link", "file_url": "https://youtu.be/JOopR4MKbhI?si=HNIGI1bcPNXUuTVy", "popup_video": 1, "watch": true, "user_id": "019c75de-509e-711a-8933-175cb2514cc5", "frame_id": "019c75de-532c-7047-9563-daf1448ca963", "created_at": "2026-03-16T13:24:05.000000Z", "updated_at": "2026-03-16T13:25:13.000000Z", "deleted_at": null, "pivot": { "funnel_step_id": 240, "step_attachment_id": 2 } } ], "form": { "id": 7, "title": "Formulário para funil", "frame_id": "019c75de-532c-7047-9563-daf1448ca963", "created_at": "2026-03-16T13:12:12.000000Z", "updated_at": "2026-03-16T13:12:12.000000Z", "deleted_at": null }, "restrictions": [] }, { "id": 241, "name": "Em andamento", "project_funnel_id": 54, "sensation_amount": 0, "step_forward_id": null, "step_backward_id": null, "show_contact_form": false, "hide_contact_form_when_linked": false, "show_customer_form": false, "hide_customer_form_when_linked": false, "order": 2, "help_text": null, "form_id": null, "sort_config": null, "allow_execution": true, "created_at": "2026-03-16T16:34:43.000000Z", "updated_at": "2026-03-16T16:34:43.000000Z", "deleted_at": null, "checklists": [], "attachments": [], "form": null, "restrictions": [] }, { "id": 242, "name": "Concluído", "project_funnel_id": 54, "sensation_amount": 0, "step_forward_id": null, "step_backward_id": null, "show_contact_form": false, "hide_contact_form_when_linked": false, "show_customer_form": false, "hide_customer_form_when_linked": false, "order": 3, "help_text": null, "form_id": null, "sort_config": null, "allow_execution": true, "created_at": "2026-03-16T16:34:43.000000Z", "updated_at": "2026-03-16T16:34:43.000000Z", "deleted_at": null, "checklists": [], "attachments": [], "form": null, "restrictions": [] } ], "tags": [ { "id": 6, "name": "Nova etiqueta 1", "color": "#5e4ff8", "project_funnel_id": 54, "deleted_at": null }, { "id": 7, "name": "Nova etiqueta 2", "color": "#7fd87d", "project_funnel_id": 54, "deleted_at": null }, { "id": 8, "name": "Nova etiqueta 3", "color": "#5e4ff8", "project_funnel_id": 54, "deleted_at": null } ], "attachments": [], "funnel_status": [ { "id": 6, "name": "Novo status 1", "color": "#b59ef6", "project_funnel_id": 54, "is_conclusive": false, "created_at": "2026-03-16T16:34:43.000000Z", "updated_at": "2026-03-16T16:34:43.000000Z", "deleted_at": null }, { "id": 7, "name": "Novo status 2", "color": "#7fd87d", "project_funnel_id": 54, "is_conclusive": false, "created_at": "2026-03-16T16:34:43.000000Z", "updated_at": "2026-03-16T16:34:43.000000Z", "deleted_at": null }, { "id": 8, "name": "Novo status 3", "color": "#b59ef6", "project_funnel_id": 54, "is_conclusive": false, "created_at": "2026-03-16T16:34:43.000000Z", "updated_at": "2026-03-16T16:34:43.000000Z", "deleted_at": null } ] }, "objects_above_limit": [] } } } }, "401": { "description": "Não autorizado", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." } }, "required": [ "response", "message", "error" ] }, "example": { "response": false, "message": "unauthorized", "error": "Unauthenticated." } } } }, "422": { "description": "Etiquetas repetidas", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." } }, "required": [ "response", "message" ] }, "example": { "response": false, "message": "repeated_tags_are_not_allowed" } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "id": { "type": "integer", "description": "ID do funil a atualizar. Sem ele, um novo funil é criado." }, "name": { "type": "string", "description": "Nome do funil. Obrigatório e sem HTML." }, "prefix": { "type": "string", "description": "Prefixo do código dos projetos. Gerado a partir do nome quando não informado." }, "condition": { "type": "string", "enum": [ "active", "inactive" ], "description": "Situação do funil. Padrão `active`." }, "allow_multi_step": { "type": "boolean", "description": "Permite o projeto em várias etapas ao mesmo tempo." }, "allow_execution": { "type": "boolean", "description": "Permite cronometrar execução nos projetos do funil." }, "show_cost_info": { "type": "boolean", "description": "Exibe informações de custo. Padrão true." }, "project_term": { "type": "object", "description": "Vocabulário do funil para o termo 'projeto', no singular e no plural." }, "form": { "type": "object", "description": "Formulário de vínculo do funil.", "properties": { "id": { "type": "integer", "description": "ID do formulário. Nulo desvincula." } } }, "steps": { "type": "array", "description": "Etapas do funil, na ordem desejada. Obrigatório. Etapas ausentes são removidas.", "items": { "type": "object", "properties": { "id": { "type": "integer", "description": "ID da etapa a manter. Sem ele, a etapa é criada." }, "name": { "type": "string", "description": "Nome da etapa. Obrigatório e único dentro do funil." }, "help_text": { "type": "string", "description": "Texto de orientação exibido na etapa." }, "sensation_amount": { "type": "integer", "description": "Percentual de progresso que a etapa representa, de 0 a 100." }, "allow_execution": { "type": "boolean", "description": "Permite cronometrar execução na etapa." }, "show_customer_form": { "type": "boolean", "description": "Exibe o formulário do cliente ao mover o projeto para a etapa." }, "show_contact_form": { "type": "boolean", "description": "Exibe o formulário do contato ao mover o projeto para a etapa." }, "hide_customer_form_when_linked": { "type": "boolean", "description": "Não exibe o formulário do cliente quando já houver cliente vinculado." }, "hide_contact_form_when_linked": { "type": "boolean", "description": "Não exibe o formulário do contato quando já houver contato vinculado." }, "step_forward": { "type": "object", "description": "Etapa de avanço padrão.", "properties": { "name": { "type": "string", "description": "Nome da etapa de avanço." } } }, "step_backward": { "type": "object", "description": "Etapa de retrocesso padrão.", "properties": { "name": { "type": "string", "description": "Nome da etapa de retrocesso." } } }, "form": { "type": "object", "description": "Formulário da etapa.", "properties": { "id": { "type": "integer", "description": "ID do formulário. Nulo desvincula." } } }, "sort_config": { "type": "object", "description": "Ordenação automática dos cartões da etapa.", "properties": { "field": { "type": "string", "description": "Campo de ordenação. Obrigatório quando `sort_config` é enviado." }, "direction": { "type": "string", "enum": [ "asc", "desc" ], "description": "Sentido da ordenação. Obrigatório quando `sort_config` é enviado." }, "arguments": { "type": "array", "description": "Argumentos adicionais do campo.", "items": { "type": "string", "description": "Argumento extra do campo ordenado." } } } }, "checklists": { "type": "array", "description": "Itens de checklist da etapa. Itens ausentes são removidos.", "items": { "type": "object", "properties": { "id": { "type": "integer", "description": "ID do item a manter." }, "name": { "type": "string", "description": "Texto do item. Obrigatório." }, "info": { "type": "string", "description": "Orientação adicional." }, "required": { "type": "boolean", "description": "Impede a saída da etapa enquanto não for marcado." }, "order": { "type": "integer", "description": "Posição do item na lista." } }, "required": [ "name" ] } }, "restrictions": { "type": "array", "description": "Restrições da etapa. Restrições ausentes são removidas.", "items": { "type": "object", "properties": { "name": { "type": "string", "maxLength": 120, "description": "Nome da restrição." }, "direction": { "type": "string", "enum": [ "incoming", "outgoing" ], "description": "Se vale na entrada ou na saída da etapa. Obrigatório." }, "restriction_type": { "type": "string", "enum": [ "step", "status", "tag", "filter" ], "description": "O que a restrição avalia. Obrigatório." }, "target_step_id": { "type": "integer", "description": "Etapa avaliada. Obrigatório quando o tipo é `step`." }, "target_tag_id": { "type": "integer", "description": "Etiqueta avaliada. Obrigatório quando o tipo é `tag`." }, "target_status_id": { "type": "integer", "description": "Status avaliado. Obrigatório quando o tipo é `status`." }, "hierarchy_scope": { "type": "string", "enum": [ "current", "descendants", "ancestors", null ], "description": "Sobre quem a regra é avaliada: o próprio projeto, os filhos ou os pais." }, "hierarchy_depth": { "type": "integer", "minimum": 1, "maximum": 3, "description": "Quantos níveis da hierarquia considerar, de 1 a 3." } }, "required": [ "direction", "restriction_type" ] } }, "attachments": { "type": "array", "description": "Anexos vinculados à etapa.", "items": { "type": "object", "properties": { "id": { "type": "integer", "description": "ID do anexo de etapa a vincular." } } } } }, "required": [ "name" ] } }, "tags": { "type": "array", "description": "Etiquetas do funil. Nome e cor não podem se repetir no mesmo funil.", "items": { "type": "object", "properties": { "id": { "type": "integer", "description": "ID da etiqueta a manter." }, "name": { "type": "string", "description": "Nome da etiqueta." }, "color": { "type": "string", "description": "Cor em hexadecimal." }, "funnel_step_blockings": { "type": "array", "description": "Etapas bloqueadas enquanto o projeto tiver esta marcação.", "items": { "type": "object", "properties": { "funnel_step_id": { "type": "integer", "description": "Etapa que fica bloqueada. Obrigatório." }, "automation_bypass": { "type": "boolean", "description": "Quando true, automações podem mover o projeto mesmo com o bloqueio ativo." } }, "required": [ "funnel_step_id" ] } } } } }, "funnel_status": { "type": "array", "description": "Status do funil.", "items": { "type": "object", "properties": { "id": { "type": "integer", "description": "ID do status a manter." }, "name": { "type": "string", "description": "Nome do status." }, "color": { "type": "string", "description": "Cor em hexadecimal." }, "is_conclusive": { "type": "boolean", "description": "Marca o status como desfecho do projeto no funil." }, "funnel_step_blockings": { "type": "array", "description": "Etapas bloqueadas enquanto o projeto tiver esta marcação.", "items": { "type": "object", "properties": { "funnel_step_id": { "type": "integer", "description": "Etapa que fica bloqueada. Obrigatório." }, "automation_bypass": { "type": "boolean", "description": "Quando true, automações podem mover o projeto mesmo com o bloqueio ativo." } }, "required": [ "funnel_step_id" ] } } } } }, "access": { "type": "array", "description": "Acesso ao funil por usuário.", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "ID (UUID) do usuário.", "format": "uuid" }, "index_all": { "type": "boolean", "description": "Concede ver todos os projetos do funil." }, "index_assigned": { "type": "boolean", "description": "Concede ver os projetos em que está designado." }, "index_created": { "type": "boolean", "description": "Concede ver os projetos que criou." } } } }, "attachments": { "type": "array", "description": "Anexos do funil.", "items": { "type": "object", "properties": { "id": { "type": "integer", "description": "ID do anexo a vincular ao funil." } } } }, "template_projects": { "type": "array", "description": "Projetos-modelo oferecidos ao criar projetos neste funil.", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "ID (UUID) de um projeto-modelo da conta.", "format": "uuid" } } } } }, "required": [ "name", "steps" ] }, "example": { "id": null, "name": "", "prefix": null, "condition": "active", "allow_multi_step": false, "allow_execution": true, "show_cost_info": true, "project_term": null, "form": { "id": null }, "steps": [ { "id": null, "name": "", "help_text": null, "sensation_amount": 0, "allow_execution": true, "show_customer_form": false, "show_contact_form": false, "hide_customer_form_when_linked": false, "hide_contact_form_when_linked": false, "step_forward": { "name": "" }, "step_backward": { "name": "" }, "form": { "id": null }, "sort_config": { "field": "", "direction": "asc", "arguments": [] }, "checklists": [ { "id": null, "name": "", "info": null, "required": false, "order": 0 } ], "restrictions": [ { "name": null, "direction": "incoming", "restriction_type": "step", "target_step_id": null, "target_tag_id": null, "target_status_id": null, "hierarchy_scope": "current", "hierarchy_depth": 1 } ], "attachments": [ { "id": null } ] } ], "tags": [ { "id": null, "name": "", "color": "#E53935", "funnel_step_blockings": [ { "funnel_step_id": null, "automation_bypass": false } ] } ], "funnel_status": [ { "id": null, "name": "", "color": "#43A047", "is_conclusive": false, "funnel_step_blockings": [ { "funnel_step_id": null, "automation_bypass": false } ] } ], "access": [ { "id": null, "index_all": false, "index_assigned": true, "index_created": true } ], "attachments": [ { "id": null } ], "template_projects": [ { "id": null } ] } } } } } }, "/api/management/project-funnels/{project_funnel}": { "put": { "tags": [ "project-funnels", "Funis" ], "summary": "Definir modelo de configuração do funil", "description": "Define qual modelo de configuração de quadro o funil passa a usar. É o único campo que este endpoint altera — o restante da configuração do funil é salvo pelo endpoint de criação/edição. O modelo precisa pertencer ao próprio funil; enviar `null` desfaz a associação. Ver [Configuração do quadro](https://docs.olie.ai/guides/funnels/board-view).", "operationId": "atualizarFunilDeProjeto", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "funnel_config_template_id": { "type": "integer", "description": "ID do modelo de configuração de quadro do próprio funil. Nulo desfaz a associação." } } }, "examples": { "Atualizar funil de projeto": { "value": { "funnel_config_template_id": null } } } } } }, "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." } }, "required": [ "response" ] }, "example": { "response": true } } } }, "422": { "description": "Modelo de outro funil", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." }, "validation": { "type": "object", "description": "Mapa de campo para as mensagens de validação daquele campo.", "properties": {} } }, "required": [ "response", "message", "error", "validation" ] }, "example": { "response": false, "message": "validation_errors", "error": "The selected funnel config template id is invalid.", "validation": { "funnel_config_template_id": [ "The selected funnel config template id is invalid." ] } } } } } } }, "parameters": [ { "name": "project_funnel", "in": "path", "required": true, "description": "ID do funil de projeto.", "schema": { "type": "string" }, "example": "" } ] }, "/api/management/funnel-steps/{funnel_step_id}/projects": { "post": { "summary": "Vincular um projeto a uma etapa", "responses": { "200": { "description": "Sucesso", "headers": { "Date": { "schema": { "type": "string" }, "example": "Tue, 16 Dec 2025 14:24:13 GMT" }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" }, "Connection": { "schema": { "type": "string" }, "example": "keep-alive" }, "Cache-Control": { "schema": { "type": "string" }, "example": "private, must-revalidate" }, "pragma": { "schema": { "type": "string" }, "example": "no-cache" }, "expires": { "schema": { "type": "integer" }, "example": -1 }, "X-RateLimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-RateLimit-Remaining": { "schema": { "type": "integer" }, "example": 136 }, "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "project": { "type": "object", "description": "Projeto.", "properties": { "id": { "type": "string", "description": "ID (UUID) do projeto.", "format": "uuid" }, "parent_id": { "type": "string", "description": "ID do projeto pai, quando é um subprojeto.", "format": "uuid" }, "code": { "type": "string", "description": "Código do projeto, com o prefixo do funil." }, "name": { "type": "string", "description": "Nome do projeto." }, "description": { "type": "string", "description": "Descrição do projeto." }, "impact": { "type": "integer", "description": "Grau de impacto do projeto." }, "budget": { "type": "number", "description": "Orçamento do projeto." }, "frame_id": { "type": "string", "description": "ID (UUID) da conta dona do projeto.", "format": "uuid" }, "created_at": { "type": "string", "description": "Data de criação.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" } } } }, "required": [ "response", "project" ] }, "example": { "response": true, "project": { "id": "019b277f-e453-733d-a00e-6d26d444008b", "parent_id": null, "old_id": null, "code": "P-83", "name": "Laboratório Hawkins", "description": "Companhia de energia", "impact": 1, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-16T14:10:51.000000Z", "updated_at": "2025-12-16T14:10:51.000000Z", "customer_id": "019b277d-c615-723f-a1dd-f03940bce866", "contact_id": 12597, "share_token": null, "share_settings": null, "merged_id": null, "status": 1, "budget": 950000, "is_template": false, "created_by": "019aeaa3-2370-731c-9008-be759795f449", "deleted_at": null, "funnels": [], "funnel_steps": [], "tags": [] } } } } }, "401": { "description": "Não autorizado", "headers": { "Date": { "schema": { "type": "string" }, "example": "Tue, 16 Dec 2025 14:27:44 GMT" }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" }, "Connection": { "schema": { "type": "string" }, "example": "keep-alive" }, "Cache-Control": { "schema": { "type": "string" }, "example": "private, must-revalidate" }, "pragma": { "schema": { "type": "string" }, "example": "no-cache" }, "expires": { "schema": { "type": "integer" }, "example": -1 }, "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." } }, "required": [ "response", "message", "error" ] }, "example": { "response": false, "message": "unauthorized", "error": "Unauthenticated." } } } }, "422": { "description": "Projeto já vinculado à etapa", "headers": { "Date": { "schema": { "type": "string" }, "example": "Tue, 16 Dec 2025 14:28:34 GMT" }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" }, "Connection": { "schema": { "type": "string" }, "example": "keep-alive" }, "Cache-Control": { "schema": { "type": "string" }, "example": "private, must-revalidate" }, "X-RateLimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-RateLimit-Remaining": { "schema": { "type": "integer" }, "example": 159 }, "pragma": { "schema": { "type": "string" }, "example": "no-cache" }, "expires": { "schema": { "type": "integer" }, "example": -1 }, "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." }, "service": { "type": "string", "description": "Serviço que originou o erro." }, "requirements": { "type": "array", "description": "Requisitos não preenchidos que impediram a movimentação. Vazio nos demais erros.", "items": { "type": "object", "properties": { "step": { "type": "object", "description": "Etapa que tem o requisito pendente.", "properties": {} }, "required_edges": { "type": "array", "description": "Itens pendentes daquela etapa.", "items": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "checklist", "dynamic_form" ], "description": "Origem do requisito." }, "id": { "type": "integer", "description": "ID do item de checklist ou do campo de formulário." }, "name": { "type": "string", "description": "Texto do item ou rótulo do campo." } } } } } } } }, "required": [ "response", "message", "error" ] }, "example": { "response": false, "service": "App\\Exceptions\\Services\\ProjectFunnel\\FunnelSteps\\LinkProjectToFunnelStepException", "message": "project_already_linked_to_that_step", "error": "The project already is linked with that funnel step", "requirements": [] } } } } }, "tags": [ "funnel-steps", "Movimentação de projetos" ], "description": "Vincula um projeto a uma etapa do funil — o mesmo efeito de arrastar o cartão para a coluna. Antes de aceitar, a plataforma verifica, nessa ordem, se o funil está ativo e vinculado ao projeto, as restrições de entrada e saída, os requisitos pendentes da etapa de origem e os bloqueios por etiqueta ou status; qualquer recusa volta com o detalhe do que impediu. Use `unlink_others` para mover o projeto (desvinculando as demais etapas do funil) em vez de deixá-lo em etapas simultâneas. A sequência completa está em [Mover projetos entre etapas](https://docs.olie.ai/guides/funnels/moving-projects), e as regras em [Restrições e bloqueios](https://docs.olie.ai/guides/funnels/restrictions) e [Checklists e formulários obrigatórios](https://docs.olie.ai/guides/funnels/requirements).", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "project_id": { "type": "string", "description": "ID (UUID) do projeto a vincular. Obrigatório.", "format": "uuid" }, "unlink_others": { "type": "boolean", "description": "Quando true, desvincula o projeto das demais etapas do mesmo funil — o comportamento de mover o cartão. Também dispara a checagem de requisitos da etapa de origem." }, "force_funnel_link": { "type": "boolean", "description": "Quando true, vincula o projeto ao funil caso ainda não esteja vinculado, em vez de recusar com `project_funnel_not_linked_with_project`." } }, "required": [ "project_id" ] }, "example": { "project_id": null, "unlink_others": true, "force_funnel_link": false } } } } }, "parameters": [ { "name": "funnel_step_id", "in": "path", "required": true, "description": "ID da etapa do funil que receberá o projeto.", "schema": { "type": "string" }, "example": "" } ] }, "/api/management/project-bulk-step-move": { "post": { "tags": [ "funnel-steps", "Movimentação de projetos" ], "summary": "Mover múltiplos projetos de etapa", "description": "Aplica a mesma movimentação a vários projetos de uma vez, com as mesmas verificações da movimentação individual. Projetos que já estão na etapa de destino são ignorados sem erro; qualquer outra recusa — restrição, requisito pendente ou bloqueio — interrompe o lote no projeto em que ocorreu, e os projetos seguintes da lista não são processados. As verificações estão descritas em [Mover projetos entre etapas](https://docs.olie.ai/guides/funnels/moving-projects).", "operationId": "moverMLtiplosProjetosDeEtapa", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "projects": { "type": "array", "description": "Projetos processados, na ordem enviada.", "items": { "description": "Projeto.", "type": "object", "properties": { "id": { "type": "string", "description": "ID (UUID) do projeto.", "format": "uuid" }, "parent_id": { "type": "string", "description": "ID do projeto pai, quando é um subprojeto.", "format": "uuid" }, "code": { "type": "string", "description": "Código do projeto, com o prefixo do funil." }, "name": { "type": "string", "description": "Nome do projeto." }, "description": { "type": "string", "description": "Descrição do projeto." }, "impact": { "type": "integer", "description": "Grau de impacto do projeto." }, "budget": { "type": "number", "description": "Orçamento do projeto." }, "frame_id": { "type": "string", "description": "ID (UUID) da conta dona do projeto.", "format": "uuid" }, "created_at": { "type": "string", "description": "Data de criação.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" } } } } }, "required": [ "response", "projects" ] }, "example": { "response": true, "projects": [ { "id": "9c2f1a44-3b2e-4a0f-9b7a-1c4c5f7e8d90", "parent_id": null, "code": "COM-83", "name": "Implantação Laboratório Hawkins", "description": null, "impact": 1, "budget": 18500, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2026-08-02T13:04:11.000000Z", "updated_at": "2026-08-19T10:41:02.000000Z" }, { "id": "9c2f1a44-77b1-4e52-8d31-2a9f0c6b45ee", "parent_id": null, "code": "COM-91", "name": "Reforma da subestação", "description": null, "impact": 1, "budget": 18500, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2026-08-02T13:04:11.000000Z", "updated_at": "2026-08-19T10:41:02.000000Z" } ] } } } }, "422": { "description": "Validação falhou", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." }, "validation": { "type": "object", "description": "Mapa de campo para as mensagens de validação daquele campo.", "properties": {} } }, "required": [ "response", "message", "error", "validation" ] }, "example": { "response": false, "message": "validation_errors", "error": "The step id field is required.", "validation": { "step_id": [ "The step id field is required." ] } } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "project_ids": { "type": "array", "description": "Projetos a mover. Obrigatório.", "items": { "type": "string", "description": "ID (UUID) de um projeto.", "format": "uuid" } }, "step_id": { "type": "integer", "description": "ID da etapa de destino. Obrigatório." }, "unlink_others": { "type": "boolean", "description": "Quando true, desvincula cada projeto das demais etapas do mesmo funil." }, "force_funnel_link": { "type": "boolean", "description": "Quando true, vincula ao funil os projetos que ainda não estiverem vinculados." } }, "required": [ "project_ids", "step_id" ] }, "example": { "project_ids": [], "step_id": null, "unlink_others": true, "force_funnel_link": false } } } } } }, "/api/management/get-available-steps": { "get": { "tags": [ "funnel-steps", "Etapas" ], "summary": "Listar etapas disponíveis", "description": "Lista os funis da conta com suas etapas, etiquetas e status, para alimentar seletores de destino em telas de movimentação, automação e filtros. Os parâmetros `id` e `search` filtram etapas, etiquetas e status ao mesmo tempo e devolvem apenas os funis que tiverem alguma correspondência — `id` tem precedência sobre `search`. Os conceitos estão em [Etapas do funil](https://docs.olie.ai/guides/funnels/steps) e [Etiquetas, status e previsão](https://docs.olie.ai/guides/funnels/tags-and-status).", "operationId": "listarEtapasDisponVeis", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "funnels": { "type": "array", "description": "Funis da conta com etapas, etiquetas e status.", "items": { "type": "object", "properties": { "id": { "type": "integer", "description": "ID do funil." }, "name": { "type": "string", "description": "Nome do funil." }, "frame_id": { "type": "string", "description": "ID (UUID) da conta dona do funil.", "format": "uuid" }, "condition": { "type": "string", "enum": [ "active", "inactive" ], "description": "Situação do funil: `active` ou `inactive`." }, "allow_multi_step": { "type": "boolean", "description": "Indica se o funil permite o projeto em várias etapas ao mesmo tempo." }, "form_id": { "type": "integer", "description": "ID do formulário de vínculo do funil, quando houver." }, "allow_execution": { "type": "boolean", "description": "Indica se o funil permite cronometrar execução." }, "steps": { "type": "array", "description": "Etapas do funil que atenderam ao filtro.", "items": { "type": "object", "properties": { "id": { "type": "integer", "description": "ID da etapa." }, "name": { "type": "string", "description": "Nome da etapa." }, "project_funnel_id": { "type": "integer", "description": "ID do funil dono da etapa." }, "form_id": { "type": "integer", "description": "ID do formulário vinculado à etapa." }, "allow_execution": { "type": "boolean", "description": "Indica se a etapa permite cronometrar execução." }, "checklists": { "type": "array", "description": "Itens de checklist da etapa.", "items": { "type": "object", "properties": { "id": { "type": "integer", "description": "ID do item de checklist." }, "name": { "type": "string", "description": "Texto do item." }, "info": { "type": "string", "description": "Orientação adicional do item." }, "funnel_step_id": { "type": "integer", "description": "ID da etapa dona do item." }, "required": { "type": "boolean", "description": "Indica se o item impede a saída da etapa enquanto não for marcado." }, "order": { "type": "integer", "description": "Posição do item na lista." } } } } } } }, "tags": { "type": "array", "description": "Etiquetas do funil que atenderam ao filtro.", "items": { "type": "object", "properties": { "id": { "type": "integer", "description": "ID da etiqueta." }, "name": { "type": "string", "description": "Nome da etiqueta." }, "color": { "type": "string", "description": "Cor da etiqueta em hexadecimal." }, "project_funnel_id": { "type": "integer", "description": "ID do funil dono da etiqueta." } } } }, "funnel_status": { "type": "array", "description": "Status do funil que atenderam ao filtro.", "items": { "type": "object", "properties": { "id": { "type": "integer", "description": "ID do status." }, "name": { "type": "string", "description": "Nome do status." }, "color": { "type": "string", "description": "Cor do status em hexadecimal." }, "project_funnel_id": { "type": "integer", "description": "ID do funil dono do status." } } } } } } } }, "required": [ "response", "funnels" ] }, "example": { "response": true, "funnels": [ { "id": 12, "name": "Comercial", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "condition": "active", "allow_multi_step": false, "form_id": null, "allow_execution": true, "steps": [ { "id": 128, "name": "Qualificação", "project_funnel_id": 12, "form_id": null, "allow_execution": true, "checklists": [ { "id": 7, "name": "Confirmar orçamento com o cliente", "info": null, "funnel_step_id": 128, "required": true, "order": 1 } ] } ], "tags": [ { "id": 45, "name": "Urgente", "color": "#E53935", "project_funnel_id": 12 } ], "funnel_status": [ { "id": 9, "name": "Ganho", "color": "#43A047", "project_funnel_id": 12 } ] } ] } } } } }, "parameters": [ { "name": "search", "in": "query", "description": "Termo buscado no nome da etapa, da etiqueta e do status. Ignorado quando `id` é informado.", "schema": { "type": "string" }, "example": "" }, { "name": "id", "in": "query", "description": "ID de uma etapa, etiqueta ou status específico. Retorna somente o funil dono do item.", "schema": { "type": "string" }, "example": "" } ] } }, "/api/management/unlink-project-from-funnel-step": { "post": { "tags": [ "funnel-steps", "Movimentação de projetos" ], "summary": "Desvincular um projeto da etapa do funil", "description": "Desvincula um projeto de uma etapa específica do funil, removendo o card daquela etapa. Só é possível quando o projeto está vinculado a mais de uma etapa do mesmo funil: se aquela for a única, a operação é recusada. A desvinculação fica registrada no histórico de atividades do projeto. Ver [Mover projetos entre etapas](https://docs.olie.ai/guides/funnels/moving-projects).", "operationId": "desvincularProjetoDaEtapaDoFunil", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a desvinculação é concluída." } }, "required": [ "response" ] }, "example": { "response": true } } } }, "403": { "description": "Sem permissão", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." }, "permission": { "type": "string", "description": "Permissão exigida e não concedida ao usuário autenticado." } }, "required": [ "response", "message", "error" ] }, "example": { "response": false, "message": "permission_required", "error": "This action is unauthorized.", "permission": "projects.edit.9c2f1a44-3b2e-4a0f-9b7a-1c4c5f7e8d90" } } } }, "404": { "description": "Projeto não encontrado", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." } }, "required": [ "response", "message", "error" ] }, "example": { "response": false, "message": "project_model_not_found", "error": "No query results for model [App\\Models\\Project] 9c2f1a44-3b2e-4a0f-9b7a-1c4c5f7e8d90" } } } }, "422": { "description": "Única etapa vinculada", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." }, "service": { "type": "string", "description": "Serviço que originou o erro." } }, "required": [ "response", "message", "error" ] }, "examples": { "Única etapa vinculada": { "value": { "response": false, "service": "App\\Exceptions\\Services\\ProjectFunnel\\FunnelSteps\\UnlinkProjectFromFunnelStepException", "message": "cant_unlink_just_one_step", "error": "When projects has just one steps linked, it can't be unlinked" } }, "Validação falhou": { "value": { "response": false, "message": "validation_errors", "error": "The project id field is required. (and 1 more error)", "validation": { "project_id": [ "The project id field is required." ], "funnel_step_id": [ "The funnel step id field is required." ] } } } } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "project_id": { "type": "string", "description": "ID (UUID) do projeto que será desvinculado da etapa. Obrigatório.", "format": "uuid" }, "funnel_step_id": { "type": "integer", "description": "ID da etapa do funil da qual o projeto será desvinculado. Obrigatório." } }, "required": [ "project_id", "funnel_step_id" ] }, "example": { "project_id": null, "funnel_step_id": null } } } } } }, "/api/management/get-step-data": { "post": { "tags": [ "funnel-steps", "Etapas" ], "summary": "Obter dados da etapa", "description": "Carrega o conteúdo das colunas do quadro: para cada etapa informada, devolve os projetos visíveis ao usuário autenticado, já recortados por `offset`/`limit`, e o total de projetos da etapa. Com `is_counting` a resposta traz apenas os totalizadores da etapa — contagem e soma de orçamento — sem a lista de projetos, que é o modo usado para montar os cabeçalhos das colunas. O quadro está descrito em [Configuração do quadro](https://docs.olie.ai/guides/funnels/board-view) e o formato de `filters` segue [Busca avançada](https://docs.olie.ai/api-reference/general/advanced-search).", "operationId": "obterDadosDaEtapa", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "steps": { "type": "array", "description": "Etapas solicitadas, na ordem em que foram encontradas.", "items": { "type": "object", "properties": { "id": { "type": "integer", "description": "ID da etapa." }, "project_funnel_id": { "type": "integer", "description": "ID do funil dono da etapa." }, "sort_config": { "type": "object", "description": "Configuração de ordenação automática salva na etapa." }, "projects": { "type": "array", "description": "Projetos visíveis ao usuário no recorte pedido.", "items": { "description": "Projeto.", "type": "object", "properties": { "id": { "type": "string", "description": "ID (UUID) do projeto.", "format": "uuid" }, "parent_id": { "type": "string", "description": "ID do projeto pai, quando é um subprojeto.", "format": "uuid" }, "code": { "type": "string", "description": "Código do projeto, com o prefixo do funil." }, "name": { "type": "string", "description": "Nome do projeto." }, "description": { "type": "string", "description": "Descrição do projeto." }, "impact": { "type": "integer", "description": "Grau de impacto do projeto." }, "budget": { "type": "number", "description": "Orçamento do projeto." }, "frame_id": { "type": "string", "description": "ID (UUID) da conta dona do projeto.", "format": "uuid" }, "created_at": { "type": "string", "description": "Data de criação.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" } } } }, "projects_count": { "type": "integer", "description": "Total de projetos da etapa após filtros e permissões, ignorando `offset` e `limit`." } } } } }, "required": [ "response", "steps" ] }, "examples": { "Sucesso": { "value": { "response": true, "steps": [ { "id": 128, "project_funnel_id": 12, "sort_config": null, "projects": [ { "id": "9c2f1a44-3b2e-4a0f-9b7a-1c4c5f7e8d90", "parent_id": null, "code": "COM-83", "name": "Implantação Laboratório Hawkins", "description": "Migração do parque de energia", "budget": 18500, "impact": 1, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "children_count": 0, "customer": { "id": "019b277f-e453-733d-a00e-6d26d444008b", "name": "Hawkins Energia" }, "contact": null, "tags": [ { "id": 45, "name": "Urgente", "color": "#E53935" } ], "funnel_steps": [ { "id": 128, "name": "Qualificação" } ], "created_at": "2026-08-02T13:04:11.000000Z", "updated_at": "2026-08-14T09:22:47.000000Z" } ], "projects_count": 37 } ] } }, "Sucesso (apenas contagem)": { "value": { "response": true, "steps": [ { "id": 128, "project_funnel_id": 12, "sort_config": null, "projects_count": 37, "projects_budget": 412300 }, { "id": 129, "project_funnel_id": 12, "sort_config": null, "projects_count": 12, "projects_budget": 88750.5 } ] } } } } } }, "422": { "description": "Validação falhou", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." }, "validation": { "type": "object", "description": "Mapa de campo para as mensagens de validação daquele campo.", "properties": {} } }, "required": [ "response", "message", "error", "validation" ] }, "example": { "response": false, "message": "validation_errors", "error": "The steps field is required.", "validation": { "steps": [ "The steps field is required." ] } } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "steps": { "type": "array", "description": "Etapas a carregar. O `id` não pode se repetir.", "items": { "type": "object", "properties": { "id": { "type": "integer", "description": "ID da etapa a carregar." }, "offset": { "type": "integer", "minimum": 0, "description": "Quantidade de projetos a pular. Padrão 0." }, "limit": { "type": "integer", "description": "Quantidade máxima de projetos a retornar. Padrão 20." }, "sorting": { "type": "object", "description": "Ordenação dos projetos da etapa. Sem ela, a ordem é por data de criação decrescente.", "properties": { "field": { "type": "string", "description": "Campo de ordenação. Vazio desativa a ordenação." }, "direction": { "type": "string", "enum": [ "asc", "desc" ], "description": "Sentido da ordenação." }, "arguments": { "type": "array", "description": "Argumentos adicionais exigidos por campos compostos.", "items": { "type": "string", "description": "Argumento extra do campo ordenado." } } } } }, "required": [ "id" ] } }, "is_counting": { "type": "boolean", "description": "Quando true, retorna apenas os totalizadores da etapa, sem a lista de projetos." }, "filters": { "type": "array", "description": "Filtros aplicados aos projetos de todas as etapas informadas.", "items": { "description": "Filtro no formato da busca avançada: `field`, `operator`, `value`, `logical_operator` e `arguments`.", "type": "object", "properties": {} } }, "date_range": { "type": "object", "description": "Recorte pela data de entrada do projeto na etapa.", "properties": { "init": { "type": "string", "description": "Data inicial. Não pode ser futura. Padrão: 30 dias atrás.", "format": "date" }, "end": { "type": "string", "description": "Data final. Não pode ser futura nem anterior a `init`. Padrão: hoje.", "format": "date" } } } }, "required": [ "steps" ] }, "example": { "steps": [ { "id": null, "offset": 0, "limit": 20, "sorting": { "field": "", "direction": "desc" } } ], "is_counting": false, "filters": [], "date_range": { "init": null, "end": null } } } } } } }, "/api/management/get-step-attachments": { "get": { "tags": [ "funnel-steps", "Anexos" ], "summary": "Listar anexos de etapas", "description": "Lista todos os anexos de etapa cadastrados na conta — arquivos, links e vídeos — do mais recente para o mais antigo, com o usuário que enviou cada um. A lista não é recortada por etapa: ela é a biblioteca de onde os anexos são vinculados às etapas. O link de download de arquivo é temporário e expira. Ver [Anexos do funil e da etapa](https://docs.olie.ai/guides/funnels/attachments).", "operationId": "obterAnexosDaEtapa", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "attachments": { "type": "array", "description": "Anexos de etapa da conta, do mais recente para o mais antigo.", "items": { "type": "object", "properties": { "id": { "type": "integer", "description": "ID do anexo." }, "name": { "type": "string", "description": "Nome exibido do anexo." }, "technical_name": { "type": "string", "description": "Nome do arquivo no armazenamento." }, "extension": { "type": "string", "description": "Extensão do arquivo, ou `link` quando o anexo é um endereço externo." }, "file_url": { "type": "string", "description": "Endereço do arquivo. Para arquivos é um link temporário que expira; para `link`, o endereço cadastrado." }, "popup_video": { "type": "boolean", "description": "Indica se o vídeo abre automaticamente quando o projeto entra na etapa." }, "watch": { "type": "boolean", "description": "Indica se a visualização do vídeo é obrigatória." }, "user_id": { "type": "string", "description": "ID do usuário que enviou o anexo.", "format": "uuid" }, "frame_id": { "type": "string", "description": "ID (UUID) da conta dona do anexo.", "format": "uuid" }, "created_at": { "type": "string", "description": "Data de envio.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data de remoção, quando o anexo foi excluído.", "format": "date-time" }, "user": { "type": "object", "description": "Usuário que enviou o anexo.", "properties": { "id": { "type": "string", "description": "ID (UUID) do usuário.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do usuário." }, "avatar_url": { "type": "string", "description": "Endereço da foto do usuário." } } } } } } }, "required": [ "response", "attachments" ] }, "example": { "response": true, "attachments": [ { "id": 84, "name": "Como preencher a qualificação", "technical_name": "019b277f-e453-733d-a00e-6d26d444008b.mp4", "extension": "mp4", "file_url": "https://cdn.olie.ai/step-attachments/019b277f-e453-733d-a00e-6d26d444008b.mp4?expires=1755600000", "popup_video": true, "watch": true, "user_id": "019c75de-509e-711a-8933-175cb2514cc5", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2026-07-30T18:12:05.000000Z", "updated_at": "2026-08-11T14:03:44.000000Z", "deleted_at": null, "user": { "id": "019c75de-509e-711a-8933-175cb2514cc5", "name": "Equipe de Processos", "avatar_url": null } }, { "id": 82, "name": "Modelo de proposta comercial", "technical_name": "019b1f04-1c2a-7a3e-9f55-3d6b8e2a1c77.pdf", "extension": "pdf", "file_url": "https://cdn.olie.ai/step-attachments/019b1f04-1c2a-7a3e-9f55-3d6b8e2a1c77.pdf?expires=1755600000", "popup_video": false, "watch": false, "user_id": "019c75de-509e-711a-8933-175cb2514cc5", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2026-07-22T09:41:19.000000Z", "updated_at": "2026-07-22T09:41:19.000000Z", "deleted_at": null, "user": { "id": "019c75de-509e-711a-8933-175cb2514cc5", "name": "Equipe de Processos", "avatar_url": null } } ] } } } } } } }, "/api/management/update-required-step-attachment": { "post": { "tags": [ "funnel-steps", "Anexos" ], "summary": "Atualizar vídeo obrigatório da etapa", "description": "Marca ou desmarca um anexo de vídeo como de visualização obrigatória. Quando obrigatório, o vídeo abre sozinho para quem move o projeto para a etapa e a janela não pode ser dispensada enquanto a movimentação está em curso; a visualização fica registrada no histórico do projeto. Ver [Anexos do funil e da etapa](https://docs.olie.ai/guides/funnels/attachments).", "operationId": "atualizarVDeoObrigatRioDaEtapa", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." } }, "required": [ "response" ] }, "example": { "response": true } } } }, "404": { "description": "Anexo não encontrado", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." } }, "required": [ "response", "message", "error" ] }, "example": { "response": false, "message": "step_attachment_model_not_found", "error": "No query results for model [App\\Models\\StepAttachment] 999999" } } } }, "422": { "description": "Validação falhou", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." }, "validation": { "type": "object", "description": "Mapa de campo para as mensagens de validação daquele campo.", "properties": {} } }, "required": [ "response", "message", "error", "validation" ] }, "example": { "response": false, "message": "validation_errors", "error": "The id field is required. (and 1 more error)", "validation": { "id": [ "The id field is required." ], "watch": [ "The watch field is required." ] } } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "id": { "type": "integer", "description": "ID do anexo de etapa a atualizar. Obrigatório." }, "watch": { "type": "boolean", "description": "Define se a visualização passa a ser obrigatória. Obrigatório." } }, "required": [ "id", "watch" ] }, "example": { "id": null, "watch": true } } } } } }, "/api/management/steps/{step}/metrics": { "get": { "tags": [ "funnel-steps", "Etapas" ], "summary": "Obter métricas da etapa", "description": "Devolve as métricas de permanência da etapa calculadas sobre o histórico de transições: tempo médio, mínimo e máximo (em segundos) e a contagem de entradas. Cada métrica vem em três janelas — desde a criação da etapa, últimos 7 dias e últimos 30 dias. A leitura dos números e o que cada um indica sobre gargalos estão em [Métricas e tempo por etapa](https://docs.olie.ai/guides/funnels/metrics).", "operationId": "obterMTricasDaEtapa", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "metrics": { "type": "object", "description": "Métricas por janela: desde a criação da etapa, últimos 7 dias e últimos 30 dias.", "properties": { "all_time": { "type": "object", "description": "Métricas da janela.", "properties": { "average_time": { "type": "object", "description": "Tempo médio de permanência na etapa.", "properties": { "value": { "type": "number", "description": "Valor calculado." }, "unit": { "type": "string", "description": "Unidade do valor: `seconds` para tempos, `count` para contagens." }, "meta_data": { "type": "object", "description": "Dados auxiliares da métrica, quando houver." } }, "required": [ "value" ] }, "entry_count": { "type": "object", "description": "Quantidade de entradas na etapa.", "properties": { "value": { "type": "number", "description": "Valor calculado." }, "unit": { "type": "string", "description": "Unidade do valor: `seconds` para tempos, `count` para contagens." }, "meta_data": { "type": "object", "description": "Dados auxiliares da métrica, quando houver." } }, "required": [ "value" ] }, "max_time": { "type": "object", "description": "Maior tempo de permanência registrado.", "properties": { "value": { "type": "number", "description": "Valor calculado." }, "unit": { "type": "string", "description": "Unidade do valor: `seconds` para tempos, `count` para contagens." }, "meta_data": { "type": "object", "description": "Dados auxiliares da métrica, quando houver." } }, "required": [ "value" ] }, "min_time": { "type": "object", "description": "Menor tempo de permanência registrado.", "properties": { "value": { "type": "number", "description": "Valor calculado." }, "unit": { "type": "string", "description": "Unidade do valor: `seconds` para tempos, `count` para contagens." }, "meta_data": { "type": "object", "description": "Dados auxiliares da métrica, quando houver." } }, "required": [ "value" ] } } }, "last_seven_days": { "type": "object", "description": "Métricas da janela.", "properties": { "average_time": { "type": "object", "description": "Tempo médio de permanência na etapa.", "properties": { "value": { "type": "number", "description": "Valor calculado." }, "unit": { "type": "string", "description": "Unidade do valor: `seconds` para tempos, `count` para contagens." }, "meta_data": { "type": "object", "description": "Dados auxiliares da métrica, quando houver." } }, "required": [ "value" ] }, "entry_count": { "type": "object", "description": "Quantidade de entradas na etapa.", "properties": { "value": { "type": "number", "description": "Valor calculado." }, "unit": { "type": "string", "description": "Unidade do valor: `seconds` para tempos, `count` para contagens." }, "meta_data": { "type": "object", "description": "Dados auxiliares da métrica, quando houver." } }, "required": [ "value" ] }, "max_time": { "type": "object", "description": "Maior tempo de permanência registrado.", "properties": { "value": { "type": "number", "description": "Valor calculado." }, "unit": { "type": "string", "description": "Unidade do valor: `seconds` para tempos, `count` para contagens." }, "meta_data": { "type": "object", "description": "Dados auxiliares da métrica, quando houver." } }, "required": [ "value" ] }, "min_time": { "type": "object", "description": "Menor tempo de permanência registrado.", "properties": { "value": { "type": "number", "description": "Valor calculado." }, "unit": { "type": "string", "description": "Unidade do valor: `seconds` para tempos, `count` para contagens." }, "meta_data": { "type": "object", "description": "Dados auxiliares da métrica, quando houver." } }, "required": [ "value" ] } } }, "last_thirty_days": { "type": "object", "description": "Métricas da janela.", "properties": { "average_time": { "type": "object", "description": "Tempo médio de permanência na etapa.", "properties": { "value": { "type": "number", "description": "Valor calculado." }, "unit": { "type": "string", "description": "Unidade do valor: `seconds` para tempos, `count` para contagens." }, "meta_data": { "type": "object", "description": "Dados auxiliares da métrica, quando houver." } }, "required": [ "value" ] }, "entry_count": { "type": "object", "description": "Quantidade de entradas na etapa.", "properties": { "value": { "type": "number", "description": "Valor calculado." }, "unit": { "type": "string", "description": "Unidade do valor: `seconds` para tempos, `count` para contagens." }, "meta_data": { "type": "object", "description": "Dados auxiliares da métrica, quando houver." } }, "required": [ "value" ] }, "max_time": { "type": "object", "description": "Maior tempo de permanência registrado.", "properties": { "value": { "type": "number", "description": "Valor calculado." }, "unit": { "type": "string", "description": "Unidade do valor: `seconds` para tempos, `count` para contagens." }, "meta_data": { "type": "object", "description": "Dados auxiliares da métrica, quando houver." } }, "required": [ "value" ] }, "min_time": { "type": "object", "description": "Menor tempo de permanência registrado.", "properties": { "value": { "type": "number", "description": "Valor calculado." }, "unit": { "type": "string", "description": "Unidade do valor: `seconds` para tempos, `count` para contagens." }, "meta_data": { "type": "object", "description": "Dados auxiliares da métrica, quando houver." } }, "required": [ "value" ] } } } } } }, "required": [ "response", "metrics" ] }, "example": { "response": true, "metrics": { "all_time": { "average_time": { "value": 184320.5, "unit": "seconds", "meta_data": null }, "entry_count": { "value": 214, "unit": "count", "meta_data": null }, "max_time": { "value": 1209600, "unit": "seconds", "meta_data": null }, "min_time": { "value": 900, "unit": "seconds", "meta_data": null } }, "last_seven_days": { "average_time": { "value": 93600, "unit": "seconds", "meta_data": null }, "entry_count": { "value": 9, "unit": "count", "meta_data": null }, "max_time": { "value": 259200, "unit": "seconds", "meta_data": null }, "min_time": { "value": 3600, "unit": "seconds", "meta_data": null } }, "last_thirty_days": { "average_time": { "value": 127440, "unit": "seconds", "meta_data": null }, "entry_count": { "value": 41, "unit": "count", "meta_data": null }, "max_time": { "value": 604800, "unit": "seconds", "meta_data": null }, "min_time": { "value": 1800, "unit": "seconds", "meta_data": null } } } } } } }, "403": { "description": "Sem permissão", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." }, "permission": { "type": "string", "description": "Permissão exigida e não concedida ao usuário autenticado." } }, "required": [ "response", "message", "error" ] }, "example": { "response": false, "message": "permission_required", "error": "This action is unauthorized.", "permission": "project_funnels.see_step_metrics" } } } }, "404": { "description": "Etapa não encontrada", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." } }, "required": [ "response", "message", "error" ] }, "example": { "response": false, "message": "funnel_step_model_not_found", "error": "No query results for model [App\\Models\\FunnelStep] 999999" } } } } } }, "parameters": [ { "name": "step", "in": "path", "required": true, "description": "ID da etapa do funil.", "schema": { "type": "integer" }, "example": 0 } ] }, "/api/management/step-assistants/{step_assistant}/execute-manually": { "post": { "tags": [ "step-assistants", "Execução" ], "summary": "Executar um assistente manualmente", "description": "Dispara um assistente sob demanda para um projeto, sem depender da movimentação de etapa.\n\nSó vale para assistentes com gatilho `manual` ou com a execução manual habilitada; os demais respondem como não encontrado. O projeto precisa estar na etapa do assistente e ser visível para quem faz a chamada.\n\nA execução é assíncrona: a resposta apenas confirma o enfileiramento, e o resultado aparece no projeto e no histórico de execuções alguns instantes depois. Um assistente inativo não executa nada e ainda assim responde com sucesso.", "operationId": "executarAssistenteDeEtapaManualmente", "responses": { "200": { "description": "Enfileirado", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." } }, "description": "Confirmação de que a operação foi concluída.", "required": [ "response" ] }, "example": { "response": true } } } }, "404": { "description": "Assistente não aceita execução manual", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." } }, "required": [ "response", "message", "error" ] }, "example": { "response": false, "message": "step_assistant_model_not_found", "error": "No query results for model [App\\Models\\StepAssistant] c4e2a7d1-58b6-4f09-a3c7-1e9d24b7f065" } } } } }, "requestBody": { "content": { "application/json": { "schema": { "description": "Projeto alvo da execução manual.", "type": "object", "properties": { "project_id": { "type": "string", "description": "ID (UUID) do projeto sobre o qual o assistente será executado. Obrigatório. O projeto precisa estar na etapa do assistente.", "format": "uuid" } }, "required": [ "project_id" ] }, "example": { "project_id": null } } } } }, "parameters": [ { "name": "step_assistant", "in": "path", "required": true, "description": "ID (UUID) do assistente de etapa.", "schema": { "type": "string" }, "example": "" } ] }, "/api/management/steps/{step}/assistants/execution-logs": { "get": { "tags": [ "step-assistants", "Execução" ], "summary": "Listar execuções dos assistentes", "description": "Histórico de execuções de todos os assistentes de uma etapa, do mais recente para o mais antigo.\n\nCada registro traz o assistente, o projeto, a execução do agente de IA (com o texto devolvido e o modelo usado) e o desfecho de cada destino separadamente: a gravação como conteúdo do projeto e a gravação em campo de formulário têm campos próprios de status e de erro, porque uma pode dar certo e a outra falhar.\n\nAceita filtros e paginação por query params, consulte:\n\n- [Filtro básico](https://docs.olie.ai/api-reference/general/basic-filters)\n- [Paginação](https://docs.olie.ai/api-reference/general/pagination)\n\nOs campos de paginação (`current_page`, `per_page`, `total`, ...) vêm na raiz da resposta, ao lado de `data`, e não dentro de `meta` como no restante da API.", "operationId": "obterRegistrosDeExecuODosAssistentes", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "description": "Resposta paginada. Diferente do restante da API, os campos de paginação vêm na raiz, e não dentro de `meta`.", "type": "object", "properties": { "current_page": { "type": "integer", "description": "Página retornada." }, "data": { "type": "array", "description": "Execuções encontradas na página atual, da mais recente para a mais antiga.", "items": { "description": "Registro de uma execução de assistente.", "type": "object", "properties": { "id": { "type": "string", "description": "ID (UUID) do registro de execução.", "format": "uuid" }, "step_assistant_id": { "type": "string", "description": "ID (UUID) do assistente executado.", "format": "uuid" }, "project_id": { "type": "string", "description": "ID (UUID) do projeto sobre o qual o assistente rodou.", "format": "uuid" }, "agent_execution_id": { "type": "string", "description": "ID (UUID) da execução do agente de IA correspondente.", "format": "uuid" }, "status": { "type": "string", "enum": [ "pending", "success", "error" ], "description": "Situação da execução: `pending` em andamento, `success` concluída e `error` falhou." }, "result": { "type": "string", "description": "Texto devolvido pelo agente de IA." }, "media_result_status": { "type": "boolean", "description": "Resultado da gravação como conteúdo do projeto: `true` gravou, `false` falhou, `null` não se aplica." }, "media_result_error": { "type": "string", "description": "Motivo da falha ao gravar como conteúdo do projeto." }, "dynamic_form_result_status": { "type": "boolean", "description": "Resultado da gravação no campo de formulário: `true` gravou, `false` falhou, `null` não se aplica." }, "dynamic_form_result_error": { "type": "string", "description": "Motivo da falha ao gravar no campo de formulário." }, "execution_time": { "type": "string", "description": "Momento em que a execução foi encerrada.", "format": "date-time" }, "created_at": { "type": "string", "description": "Momento em que a execução foi enfileirada.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração do registro.", "format": "date-time" }, "step_assistant": { "type": "object", "description": "Assistente que gerou o registro.", "properties": { "id": { "type": "string", "description": "ID (UUID) do assistente.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do assistente." }, "ai_agent_id": { "type": "string", "description": "ID (UUID) do agente de IA usado.", "format": "uuid" } } }, "project": { "type": "object", "description": "Projeto sobre o qual o assistente rodou.", "properties": { "id": { "type": "string", "description": "ID (UUID) do projeto.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do projeto." }, "code": { "type": "string", "description": "Código do projeto." } } }, "agent_execution": { "type": "object", "description": "Execução do agente de IA correspondente.", "properties": { "id": { "type": "string", "description": "ID (UUID) da execução.", "format": "uuid" }, "status": { "type": "string", "enum": [ "pending", "completed", "failed" ], "description": "Situação da chamada ao modelo: `pending`, `completed` ou `failed`." }, "response": { "type": "string", "description": "Texto devolvido pelo modelo." }, "model": { "type": "string", "description": "Modelo de IA usado na execução." } } } } } }, "first_page_url": { "type": "string", "description": "Endereço da primeira página." }, "from": { "type": "integer", "description": "Posição do primeiro item da página no total." }, "last_page": { "type": "integer", "description": "Número da última página." }, "last_page_url": { "type": "string", "description": "Endereço da última página." }, "links": { "type": "array", "description": "Links de navegação prontos para uma barra de paginação.", "items": { "description": "Link de navegação.", "type": "object", "properties": { "url": { "type": "string", "description": "Endereço da página, ou `null` quando não há para onde ir." }, "label": { "type": "string", "description": "Rótulo do link, já traduzido." }, "page": { "type": "integer", "description": "Número da página do link." }, "active": { "type": "boolean", "description": "Indica se o link aponta para a página atual." } } } }, "next_page_url": { "type": "string", "description": "Endereço da próxima página, ou `null` na última." }, "path": { "type": "string", "description": "Endereço base usado para montar os links." }, "per_page": { "type": "integer", "description": "Itens por página." }, "prev_page_url": { "type": "string", "description": "Endereço da página anterior, ou `null` na primeira." }, "to": { "type": "integer", "description": "Posição do último item da página no total." }, "total": { "type": "integer", "description": "Total de itens encontrados." } }, "required": [ "current_page", "data", "per_page", "total" ] }, "example": { "current_page": 1, "data": [ { "id": "e1a90c37-2d64-4f8b-93a5-0b7c46d182ef", "step_assistant_id": "9f1c4b02-6f3a-4b8e-9d21-7c5e0a41b8d3", "project_id": "5d8b3e21-4c07-49f6-a1d3-96b8e70c2f54", "agent_execution_id": "b62f80d4-13c9-4e57-a08d-3f5216c9e7ab", "status": "success", "result": "O cliente pediu revisão do orçamento e aguarda retorno sobre o prazo de entrega.", "media_result_status": true, "media_result_error": null, "dynamic_form_result_status": null, "dynamic_form_result_error": null, "execution_time": "2026-08-18T16:44:09.000000Z", "created_at": "2026-08-18T16:44:02.000000Z", "updated_at": "2026-08-18T16:44:09.000000Z", "step_assistant": { "id": "9f1c4b02-6f3a-4b8e-9d21-7c5e0a41b8d3", "name": "Resumo do atendimento", "ai_agent_id": "2b7d94f6-0c31-4a85-b6e2-58f1c0d93a47" }, "project": { "id": "5d8b3e21-4c07-49f6-a1d3-96b8e70c2f54", "name": "Reforma da fachada", "code": "OBR-114" }, "agent_execution": { "id": "b62f80d4-13c9-4e57-a08d-3f5216c9e7ab", "status": "completed", "response": "O cliente pediu revisão do orçamento e aguarda retorno sobre o prazo de entrega.", "model": "claude-sonnet-5" } }, { "id": "4c72b8f0-9a15-4e63-b0d8-72e5931ac48f", "step_assistant_id": "c4e2a7d1-58b6-4f09-a3c7-1e9d24b7f065", "project_id": "5d8b3e21-4c07-49f6-a1d3-96b8e70c2f54", "agent_execution_id": "0a54e9b3-7c28-4d16-95f7-e83b104c6d29", "status": "error", "result": null, "media_result_status": null, "media_result_error": null, "dynamic_form_result_status": false, "dynamic_form_result_error": "No query results for model [App\\Models\\FormEdge] 2231", "execution_time": "2026-08-18T15:02:31.000000Z", "created_at": "2026-08-18T15:02:27.000000Z", "updated_at": "2026-08-18T15:02:31.000000Z", "step_assistant": { "id": "c4e2a7d1-58b6-4f09-a3c7-1e9d24b7f065", "name": "Classificar urgência", "ai_agent_id": "7a3f16c8-9e42-4d70-8b15-c2064ef3d891" }, "project": { "id": "5d8b3e21-4c07-49f6-a1d3-96b8e70c2f54", "name": "Reforma da fachada", "code": "OBR-114" }, "agent_execution": { "id": "0a54e9b3-7c28-4d16-95f7-e83b104c6d29", "status": "failed", "response": null, "model": "claude-sonnet-5" } } ], "first_page_url": "https://api.olie.ai/api/management/steps/312/assistants/execution-logs?page=1", "from": 1, "last_page": 1, "last_page_url": "https://api.olie.ai/api/management/steps/312/assistants/execution-logs?page=1", "links": [ { "url": null, "label": "« Anterior", "page": null, "active": false }, { "url": "https://api.olie.ai/api/management/steps/312/assistants/execution-logs?page=1", "label": "1", "page": 1, "active": true }, { "url": null, "label": "Próximo »", "page": null, "active": false } ], "next_page_url": null, "path": "https://api.olie.ai/api/management/steps/312/assistants/execution-logs", "per_page": 30, "prev_page_url": null, "to": 2, "total": 2 } } } } }, "parameters": [ { "name": "page", "in": "query", "description": "Página desejada. Padrão `1`.", "schema": { "type": "string" }, "example": "" }, { "name": "perPage", "in": "query", "description": "Itens por página. Padrão `30`, máximo `100`.", "schema": { "type": "string" }, "example": "" }, { "name": "filter[status]", "in": "query", "description": "Situação da execução: `pending`, `success` ou `error`.", "schema": { "type": "string" }, "example": "" }, { "name": "filter[step_assistant_id]", "in": "query", "description": "ID (UUID) do assistente cujas execuções devem ser retornadas.", "schema": { "type": "string" }, "example": "" } ] }, "parameters": [ { "name": "step", "in": "path", "required": true, "description": "ID da etapa do funil.", "schema": { "type": "string" }, "example": "" } ] }, "/api/management/step-assistants": { "get": { "tags": [ "step-assistants", "Assistentes" ], "summary": "Listar todos os assistentes de etapa", "description": "Lista os assistentes de etapa de todos os funis da conta, sem precisar percorrer etapa por etapa. É a visão usada pelo menu de [Assistentes de etapa](https://docs.olie.ai/guides/funnels/step-assistants).\n\nCada item já vem com a etapa e o agente de IA associados. Aceita filtros e paginação por query params, consulte:\n\n- [Filtro básico](https://docs.olie.ai/api-reference/general/basic-filters)\n- [Paginação](https://docs.olie.ai/api-reference/general/pagination)\n\nOs campos de paginação (`current_page`, `per_page`, `total`, ...) vêm na raiz da resposta, ao lado de `data`, e não dentro de `meta` como no restante da API.", "operationId": "listarTodosOsAssistentesDeEtapa", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "description": "Resposta paginada. Diferente do restante da API, os campos de paginação vêm na raiz, e não dentro de `meta`.", "type": "object", "properties": { "current_page": { "type": "integer", "description": "Página retornada." }, "data": { "type": "array", "description": "Assistentes encontrados na página atual.", "items": { "description": "Assistente de etapa com a etapa e o agente de IA associados.", "type": "object", "properties": { "id": { "type": "string", "description": "ID (UUID) do assistente.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do assistente, usado nas listas e nos registros de execução." }, "active": { "type": "boolean", "description": "Indica se o assistente está em operação. Inativo, ele nunca dispara." }, "funnel_step_id": { "type": "integer", "description": "ID da etapa do funil à qual o assistente pertence." }, "ai_agent_id": { "type": "string", "description": "ID (UUID) do agente de IA que executa a tarefa.", "format": "uuid" }, "prompt": { "type": "string", "description": "Instrução dada ao agente. Aceita a sintaxe avançada, com dados do projeto e da etapa." }, "execute_on": { "type": "string", "enum": [ "moved", "unlinked", "manual" ], "description": "Gatilho do assistente: `moved` ao entrar na etapa, `unlinked` ao sair dela e `manual` só sob demanda." }, "manual_execution_enabled": { "type": "boolean", "description": "Indica se o assistente também pode ser disparado sob demanda, mesmo tendo gatilho automático." }, "result_as_media": { "type": "boolean", "description": "Indica se o resultado é gravado como conteúdo do projeto." }, "result_as_dynamic_form": { "type": "object", "description": "Destino do resultado em campo de formulário dinâmico. `null` quando o assistente não grava em formulário.", "properties": { "pivot_class": { "type": "string", "description": "Classe do registro que guarda as respostas, no formato `App\\Models\\`. Define quais chaves de identificação abaixo são exigidas." }, "form_id": { "type": "integer", "description": "ID do formulário dinâmico que receberá a resposta." }, "edge_id": { "type": "integer", "description": "ID do campo do formulário que receberá o resultado gerado pelo assistente." }, "id": { "type": "string", "description": "Identificador do registro alvo, quando a classe se identifica por `id` (por exemplo `App\\Models\\Project`)." }, "project_id": { "type": "string", "description": "ID do projeto alvo, quando a classe se identifica pelo projeto." }, "funnel_step_id": { "type": "string", "description": "ID da etapa alvo, quando a classe se identifica pela etapa." }, "loose_form_id": { "type": "string", "description": "ID do formulário avulso alvo, quando a classe se identifica por ele." }, "project_funnel_id": { "type": "string", "description": "ID do funil alvo, quando a classe se identifica por ele." } } }, "failure_funnel_step_id": { "type": "integer", "description": "Etapa para onde o projeto é movido quando a execução falha. `null` deixa o projeto onde está." }, "created_at": { "type": "string", "description": "Data de criação.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data de exclusão, quando o assistente foi removido.", "format": "date-time" }, "funnel_step": { "type": "object", "description": "Etapa à qual o assistente pertence.", "properties": { "id": { "type": "integer", "description": "ID da etapa." }, "name": { "type": "string", "description": "Nome da etapa." }, "project_funnel_id": { "type": "integer", "description": "ID do funil dono da etapa. Presente apenas na listagem geral." } } }, "ai_agent": { "type": "object", "description": "Agente de IA que executa o assistente.", "properties": { "id": { "type": "string", "description": "ID (UUID) do agente de IA.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do agente de IA." } } } } } }, "first_page_url": { "type": "string", "description": "Endereço da primeira página." }, "from": { "type": "integer", "description": "Posição do primeiro item da página no total." }, "last_page": { "type": "integer", "description": "Número da última página." }, "last_page_url": { "type": "string", "description": "Endereço da última página." }, "links": { "type": "array", "description": "Links de navegação prontos para uma barra de paginação.", "items": { "description": "Link de navegação.", "type": "object", "properties": { "url": { "type": "string", "description": "Endereço da página, ou `null` quando não há para onde ir." }, "label": { "type": "string", "description": "Rótulo do link, já traduzido." }, "page": { "type": "integer", "description": "Número da página do link." }, "active": { "type": "boolean", "description": "Indica se o link aponta para a página atual." } } } }, "next_page_url": { "type": "string", "description": "Endereço da próxima página, ou `null` na última." }, "path": { "type": "string", "description": "Endereço base usado para montar os links." }, "per_page": { "type": "integer", "description": "Itens por página." }, "prev_page_url": { "type": "string", "description": "Endereço da página anterior, ou `null` na primeira." }, "to": { "type": "integer", "description": "Posição do último item da página no total." }, "total": { "type": "integer", "description": "Total de itens encontrados." } }, "required": [ "current_page", "data", "per_page", "total" ] }, "example": { "current_page": 1, "data": [ { "id": "9f1c4b02-6f3a-4b8e-9d21-7c5e0a41b8d3", "name": "Resumo do atendimento", "active": true, "funnel_step_id": 312, "ai_agent_id": "2b7d94f6-0c31-4a85-b6e2-58f1c0d93a47", "prompt": "Resuma em até cinco linhas o histórico de conversas do projeto e destaque o que ficou pendente.", "execute_on": "moved", "manual_execution_enabled": true, "result_as_media": true, "result_as_dynamic_form": null, "failure_funnel_step_id": 318, "created_at": "2026-07-28T14:12:03.000000Z", "updated_at": "2026-08-11T09:41:57.000000Z", "deleted_at": null, "funnel_step": { "id": 312, "name": "Triagem", "project_funnel_id": 47 }, "ai_agent": { "id": "2b7d94f6-0c31-4a85-b6e2-58f1c0d93a47", "name": "Analista de atendimento" } }, { "id": "c4e2a7d1-58b6-4f09-a3c7-1e9d24b7f065", "name": "Classificar urgência", "active": false, "funnel_step_id": 312, "ai_agent_id": "7a3f16c8-9e42-4d70-8b15-c2064ef3d891", "prompt": "Leia a descrição do projeto e responda apenas com uma das opções: baixa, média ou alta.", "execute_on": "manual", "manual_execution_enabled": false, "result_as_media": false, "result_as_dynamic_form": { "pivot_class": "App\\Models\\Project", "form_id": 118, "edge_id": 2231, "id": "{{project.id}}" }, "failure_funnel_step_id": null, "created_at": "2026-08-02T10:03:44.000000Z", "updated_at": "2026-08-02T10:03:44.000000Z", "deleted_at": null, "funnel_step": { "id": 312, "name": "Triagem", "project_funnel_id": 47 }, "ai_agent": { "id": "7a3f16c8-9e42-4d70-8b15-c2064ef3d891", "name": "Classificador" } } ], "first_page_url": "https://api.olie.ai/api/management/step-assistants?page=1", "from": 1, "last_page": 1, "last_page_url": "https://api.olie.ai/api/management/step-assistants?page=1", "links": [ { "url": null, "label": "« Anterior", "page": null, "active": false }, { "url": "https://api.olie.ai/api/management/step-assistants?page=1", "label": "1", "page": 1, "active": true }, { "url": null, "label": "Próximo »", "page": null, "active": false } ], "next_page_url": null, "path": "https://api.olie.ai/api/management/step-assistants", "per_page": 30, "prev_page_url": null, "to": 2, "total": 2 } } } } }, "parameters": [ { "name": "page", "in": "query", "description": "Página desejada. Padrão `1`.", "schema": { "type": "string" }, "example": "" }, { "name": "perPage", "in": "query", "description": "Itens por página. Padrão `30`, máximo `100`.", "schema": { "type": "string" }, "example": "" }, { "name": "filter[id]", "in": "query", "description": "ID (UUID) de um assistente específico. Aceita vários IDs separados por vírgula.", "schema": { "type": "string" }, "example": "" }, { "name": "filter[name]", "in": "query", "description": "Trecho do nome do assistente.", "schema": { "type": "string" }, "example": "" }, { "name": "filter[active]", "in": "query", "description": "`1` retorna apenas os ativos, `0` apenas os inativos.", "schema": { "type": "string" }, "example": "" }, { "name": "filter[funnel_step_id]", "in": "query", "description": "ID da etapa do funil à qual o assistente pertence.", "schema": { "type": "string" }, "example": "" }, { "name": "filter[ai_agent_id]", "in": "query", "description": "ID (UUID) do agente de IA que executa o assistente.", "schema": { "type": "string" }, "example": "" } ] } }, "/api/management/steps/{step}/assistants": { "get": { "tags": [ "step-assistants", "Assistentes" ], "summary": "Listar assistentes da etapa", "description": "Lista os assistentes de uma etapa específica, do mesmo formato da listagem geral e já restrita à etapa informada.\n\nAceita filtros e paginação por query params, consulte:\n\n- [Filtro básico](https://docs.olie.ai/api-reference/general/basic-filters)\n- [Paginação](https://docs.olie.ai/api-reference/general/pagination)\n\nOs campos de paginação (`current_page`, `per_page`, `total`, ...) vêm na raiz da resposta, ao lado de `data`, e não dentro de `meta` como no restante da API.", "operationId": "listarAssistentesDeUmaEtapaEspecFica", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "description": "Resposta paginada. Diferente do restante da API, os campos de paginação vêm na raiz, e não dentro de `meta`.", "type": "object", "properties": { "current_page": { "type": "integer", "description": "Página retornada." }, "data": { "type": "array", "description": "Assistentes encontrados na página atual.", "items": { "description": "Assistente de etapa com a etapa e o agente de IA associados.", "type": "object", "properties": { "id": { "type": "string", "description": "ID (UUID) do assistente.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do assistente, usado nas listas e nos registros de execução." }, "active": { "type": "boolean", "description": "Indica se o assistente está em operação. Inativo, ele nunca dispara." }, "funnel_step_id": { "type": "integer", "description": "ID da etapa do funil à qual o assistente pertence." }, "ai_agent_id": { "type": "string", "description": "ID (UUID) do agente de IA que executa a tarefa.", "format": "uuid" }, "prompt": { "type": "string", "description": "Instrução dada ao agente. Aceita a sintaxe avançada, com dados do projeto e da etapa." }, "execute_on": { "type": "string", "enum": [ "moved", "unlinked", "manual" ], "description": "Gatilho do assistente: `moved` ao entrar na etapa, `unlinked` ao sair dela e `manual` só sob demanda." }, "manual_execution_enabled": { "type": "boolean", "description": "Indica se o assistente também pode ser disparado sob demanda, mesmo tendo gatilho automático." }, "result_as_media": { "type": "boolean", "description": "Indica se o resultado é gravado como conteúdo do projeto." }, "result_as_dynamic_form": { "type": "object", "description": "Destino do resultado em campo de formulário dinâmico. `null` quando o assistente não grava em formulário.", "properties": { "pivot_class": { "type": "string", "description": "Classe do registro que guarda as respostas, no formato `App\\Models\\`. Define quais chaves de identificação abaixo são exigidas." }, "form_id": { "type": "integer", "description": "ID do formulário dinâmico que receberá a resposta." }, "edge_id": { "type": "integer", "description": "ID do campo do formulário que receberá o resultado gerado pelo assistente." }, "id": { "type": "string", "description": "Identificador do registro alvo, quando a classe se identifica por `id` (por exemplo `App\\Models\\Project`)." }, "project_id": { "type": "string", "description": "ID do projeto alvo, quando a classe se identifica pelo projeto." }, "funnel_step_id": { "type": "string", "description": "ID da etapa alvo, quando a classe se identifica pela etapa." }, "loose_form_id": { "type": "string", "description": "ID do formulário avulso alvo, quando a classe se identifica por ele." }, "project_funnel_id": { "type": "string", "description": "ID do funil alvo, quando a classe se identifica por ele." } } }, "failure_funnel_step_id": { "type": "integer", "description": "Etapa para onde o projeto é movido quando a execução falha. `null` deixa o projeto onde está." }, "created_at": { "type": "string", "description": "Data de criação.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data de exclusão, quando o assistente foi removido.", "format": "date-time" }, "funnel_step": { "type": "object", "description": "Etapa à qual o assistente pertence.", "properties": { "id": { "type": "integer", "description": "ID da etapa." }, "name": { "type": "string", "description": "Nome da etapa." }, "project_funnel_id": { "type": "integer", "description": "ID do funil dono da etapa. Presente apenas na listagem geral." } } }, "ai_agent": { "type": "object", "description": "Agente de IA que executa o assistente.", "properties": { "id": { "type": "string", "description": "ID (UUID) do agente de IA.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do agente de IA." } } } } } }, "first_page_url": { "type": "string", "description": "Endereço da primeira página." }, "from": { "type": "integer", "description": "Posição do primeiro item da página no total." }, "last_page": { "type": "integer", "description": "Número da última página." }, "last_page_url": { "type": "string", "description": "Endereço da última página." }, "links": { "type": "array", "description": "Links de navegação prontos para uma barra de paginação.", "items": { "description": "Link de navegação.", "type": "object", "properties": { "url": { "type": "string", "description": "Endereço da página, ou `null` quando não há para onde ir." }, "label": { "type": "string", "description": "Rótulo do link, já traduzido." }, "page": { "type": "integer", "description": "Número da página do link." }, "active": { "type": "boolean", "description": "Indica se o link aponta para a página atual." } } } }, "next_page_url": { "type": "string", "description": "Endereço da próxima página, ou `null` na última." }, "path": { "type": "string", "description": "Endereço base usado para montar os links." }, "per_page": { "type": "integer", "description": "Itens por página." }, "prev_page_url": { "type": "string", "description": "Endereço da página anterior, ou `null` na primeira." }, "to": { "type": "integer", "description": "Posição do último item da página no total." }, "total": { "type": "integer", "description": "Total de itens encontrados." } }, "required": [ "current_page", "data", "per_page", "total" ] }, "example": { "current_page": 1, "data": [ { "id": "9f1c4b02-6f3a-4b8e-9d21-7c5e0a41b8d3", "name": "Resumo do atendimento", "active": true, "funnel_step_id": 312, "ai_agent_id": "2b7d94f6-0c31-4a85-b6e2-58f1c0d93a47", "prompt": "Resuma em até cinco linhas o histórico de conversas do projeto e destaque o que ficou pendente.", "execute_on": "moved", "manual_execution_enabled": true, "result_as_media": true, "result_as_dynamic_form": null, "failure_funnel_step_id": 318, "created_at": "2026-07-28T14:12:03.000000Z", "updated_at": "2026-08-11T09:41:57.000000Z", "deleted_at": null, "funnel_step": { "id": 312, "name": "Triagem" }, "ai_agent": { "id": "2b7d94f6-0c31-4a85-b6e2-58f1c0d93a47", "name": "Analista de atendimento" } }, { "id": "c4e2a7d1-58b6-4f09-a3c7-1e9d24b7f065", "name": "Classificar urgência", "active": false, "funnel_step_id": 312, "ai_agent_id": "7a3f16c8-9e42-4d70-8b15-c2064ef3d891", "prompt": "Leia a descrição do projeto e responda apenas com uma das opções: baixa, média ou alta.", "execute_on": "manual", "manual_execution_enabled": false, "result_as_media": false, "result_as_dynamic_form": { "pivot_class": "App\\Models\\Project", "form_id": 118, "edge_id": 2231, "id": "{{project.id}}" }, "failure_funnel_step_id": null, "created_at": "2026-08-02T10:03:44.000000Z", "updated_at": "2026-08-02T10:03:44.000000Z", "deleted_at": null, "funnel_step": { "id": 312, "name": "Triagem" }, "ai_agent": { "id": "7a3f16c8-9e42-4d70-8b15-c2064ef3d891", "name": "Classificador" } } ], "first_page_url": "https://api.olie.ai/api/management/steps/312/assistants?page=1", "from": 1, "last_page": 1, "last_page_url": "https://api.olie.ai/api/management/steps/312/assistants?page=1", "links": [ { "url": null, "label": "« Anterior", "page": null, "active": false }, { "url": "https://api.olie.ai/api/management/steps/312/assistants?page=1", "label": "1", "page": 1, "active": true }, { "url": null, "label": "Próximo »", "page": null, "active": false } ], "next_page_url": null, "path": "https://api.olie.ai/api/management/steps/312/assistants", "per_page": 30, "prev_page_url": null, "to": 2, "total": 2 } } } } }, "parameters": [ { "name": "page", "in": "query", "description": "Página desejada. Padrão `1`.", "schema": { "type": "string" }, "example": "" }, { "name": "perPage", "in": "query", "description": "Itens por página. Padrão `30`, máximo `100`.", "schema": { "type": "string" }, "example": "" }, { "name": "filter[name]", "in": "query", "description": "Trecho do nome do assistente.", "schema": { "type": "string" }, "example": "" }, { "name": "filter[active]", "in": "query", "description": "`1` retorna apenas os ativos, `0` apenas os inativos.", "schema": { "type": "string" }, "example": "" }, { "name": "filter[funnel_step_id]", "in": "query", "description": "ID da etapa do funil. Redundante aqui, já que a etapa vem da URL.", "schema": { "type": "string" }, "example": "" }, { "name": "filter[ai_agent_id]", "in": "query", "description": "ID (UUID) do agente de IA que executa o assistente.", "schema": { "type": "string" }, "example": "" } ] }, "post": { "tags": [ "step-assistants", "Assistentes" ], "summary": "Criar um assistente da etapa", "description": "Cria um assistente na etapa. Se `active` for verdadeiro, ele já entra em operação e passa a disparar no gatilho escolhido em `execute_on`: ao entrar na etapa (`moved`), ao sair dela (`unlinked`) ou somente sob demanda (`manual`).\n\nÉ obrigatório indicar pelo menos um destino para o resultado: `result_as_media` grava como conteúdo do projeto e `result_as_dynamic_form` grava em um campo de formulário dinâmico. Os dois podem ser usados juntos.\n\nA etapa do assistente é a do corpo (`funnel_step_id`) — é ela que vale, e não a da URL.\n\nCada execução consome créditos de IA. Veja [Assistentes de etapa](https://docs.olie.ai/guides/funnels/step-assistants) e [Créditos de IA](https://docs.olie.ai/guides/billing/ai-credits).", "operationId": "criarAssistenteDaEtapa", "requestBody": { "content": { "application/json": { "schema": { "description": "Configuração do assistente. Pelo menos um destino de resultado é obrigatório: `result_as_media` ou `result_as_dynamic_form`.", "type": "object", "properties": { "name": { "type": "string", "description": "Nome do assistente. Obrigatório, até 255 caracteres." }, "active": { "type": "boolean", "description": "Define se o assistente entra em operação. Padrão `true`." }, "funnel_step_id": { "type": "integer", "description": "ID da etapa do funil à qual o assistente pertence. Obrigatório — é este campo que vale, e não o ID da URL." }, "ai_agent_id": { "type": "string", "description": "ID (UUID) do agente de IA que executa a tarefa. Obrigatório e precisa pertencer à mesma conta.", "format": "uuid" }, "prompt": { "type": "string", "description": "Instrução dada ao agente. Obrigatória. Aceita a sintaxe avançada, com dados do projeto e da etapa." }, "execute_on": { "type": "string", "enum": [ "moved", "unlinked", "manual" ], "description": "Gatilho do assistente: `moved` ao entrar na etapa, `unlinked` ao sair dela e `manual` só sob demanda." }, "manual_execution_enabled": { "type": "boolean", "description": "Permite disparar o assistente sob demanda mesmo com gatilho automático. Padrão `false`." }, "failure_funnel_step_id": { "type": "integer", "description": "Etapa para onde o projeto vai se a execução falhar. Precisa ser da mesma conta e diferente de `funnel_step_id`. `null` deixa o projeto onde está." }, "result_as_media": { "type": "boolean", "description": "Grava o resultado como conteúdo do projeto. Obrigatório quando `result_as_dynamic_form` não é enviado." }, "result_as_dynamic_form": { "type": "object", "description": "Grava o resultado em um campo de formulário dinâmico. Os identificadores são resolvidos a cada execução pela sintaxe avançada, então aceitam variáveis como `{{ project.id }}` e `{{ step.id }}` em vez de valores fixos. Obrigatório quando `result_as_media` não é enviado.", "properties": { "pivot_class": { "type": "string", "description": "Classe do registro que guarda as respostas, no formato `App\\Models\\`. Define quais chaves de identificação abaixo são exigidas." }, "form_id": { "type": "integer", "description": "ID do formulário dinâmico que receberá a resposta." }, "edge_id": { "type": "integer", "description": "ID do campo do formulário que receberá o resultado gerado pelo assistente." }, "id": { "type": "string", "description": "Identificador do registro alvo, quando a classe se identifica por `id` (por exemplo `App\\Models\\Project`)." }, "project_id": { "type": "string", "description": "ID do projeto alvo, quando a classe se identifica pelo projeto." }, "funnel_step_id": { "type": "string", "description": "ID da etapa alvo, quando a classe se identifica pela etapa." }, "loose_form_id": { "type": "string", "description": "ID do formulário avulso alvo, quando a classe se identifica por ele." }, "project_funnel_id": { "type": "string", "description": "ID do funil alvo, quando a classe se identifica por ele." } }, "required": [ "pivot_class", "form_id", "edge_id" ] } }, "required": [ "name", "funnel_step_id", "ai_agent_id", "prompt", "execute_on" ] }, "examples": { "Criar assistente da etapa": { "value": { "name": "Resumo do atendimento", "active": true, "funnel_step_id": null, "ai_agent_id": null, "prompt": "", "execute_on": "moved", "manual_execution_enabled": false, "failure_funnel_step_id": null, "result_as_media": true, "result_as_dynamic_form": null } } } } } }, "responses": { "201": { "description": "Criado", "content": { "application/json": { "schema": { "description": "Assistente gravado. A etapa e o agente de IA não vêm carregados nesta resposta.", "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "assistant": { "type": "object", "description": "Assistente de etapa.", "properties": { "id": { "type": "string", "description": "ID (UUID) do assistente.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do assistente, usado nas listas e nos registros de execução." }, "active": { "type": "boolean", "description": "Indica se o assistente está em operação. Inativo, ele nunca dispara." }, "funnel_step_id": { "type": "integer", "description": "ID da etapa do funil à qual o assistente pertence." }, "ai_agent_id": { "type": "string", "description": "ID (UUID) do agente de IA que executa a tarefa.", "format": "uuid" }, "prompt": { "type": "string", "description": "Instrução dada ao agente. Aceita a sintaxe avançada, com dados do projeto e da etapa." }, "execute_on": { "type": "string", "enum": [ "moved", "unlinked", "manual" ], "description": "Gatilho do assistente: `moved` ao entrar na etapa, `unlinked` ao sair dela e `manual` só sob demanda." }, "manual_execution_enabled": { "type": "boolean", "description": "Indica se o assistente também pode ser disparado sob demanda, mesmo tendo gatilho automático." }, "result_as_media": { "type": "boolean", "description": "Indica se o resultado é gravado como conteúdo do projeto." }, "result_as_dynamic_form": { "type": "object", "description": "Destino do resultado em campo de formulário dinâmico. `null` quando o assistente não grava em formulário.", "properties": { "pivot_class": { "type": "string", "description": "Classe do registro que guarda as respostas, no formato `App\\Models\\`. Define quais chaves de identificação abaixo são exigidas." }, "form_id": { "type": "integer", "description": "ID do formulário dinâmico que receberá a resposta." }, "edge_id": { "type": "integer", "description": "ID do campo do formulário que receberá o resultado gerado pelo assistente." }, "id": { "type": "string", "description": "Identificador do registro alvo, quando a classe se identifica por `id` (por exemplo `App\\Models\\Project`)." }, "project_id": { "type": "string", "description": "ID do projeto alvo, quando a classe se identifica pelo projeto." }, "funnel_step_id": { "type": "string", "description": "ID da etapa alvo, quando a classe se identifica pela etapa." }, "loose_form_id": { "type": "string", "description": "ID do formulário avulso alvo, quando a classe se identifica por ele." }, "project_funnel_id": { "type": "string", "description": "ID do funil alvo, quando a classe se identifica por ele." } } }, "failure_funnel_step_id": { "type": "integer", "description": "Etapa para onde o projeto é movido quando a execução falha. `null` deixa o projeto onde está." }, "created_at": { "type": "string", "description": "Data de criação.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data de exclusão, quando o assistente foi removido.", "format": "date-time" } } } }, "required": [ "response", "assistant" ] }, "examples": { "Criado": { "value": { "response": true, "assistant": { "id": "9f1c4b02-6f3a-4b8e-9d21-7c5e0a41b8d3", "name": "Resumo do atendimento", "active": true, "funnel_step_id": 312, "ai_agent_id": "2b7d94f6-0c31-4a85-b6e2-58f1c0d93a47", "prompt": "Resuma em até cinco linhas o histórico de conversas do projeto e destaque o que ficou pendente.", "execute_on": "moved", "manual_execution_enabled": true, "result_as_media": true, "result_as_dynamic_form": null, "failure_funnel_step_id": 318, "created_at": "2026-07-28T14:12:03.000000Z", "updated_at": "2026-08-11T09:41:57.000000Z", "deleted_at": null } } }, "Criado com resultado em campo de formulário": { "value": { "response": true, "assistant": { "id": "c4e2a7d1-58b6-4f09-a3c7-1e9d24b7f065", "name": "Classificar urgência", "active": true, "funnel_step_id": 312, "ai_agent_id": "7a3f16c8-9e42-4d70-8b15-c2064ef3d891", "prompt": "Leia a descrição do projeto e responda apenas com uma das opções: baixa, média ou alta.", "execute_on": "manual", "manual_execution_enabled": false, "result_as_media": false, "result_as_dynamic_form": { "pivot_class": "App\\Models\\Project", "form_id": 118, "edge_id": 2231, "id": "{{project.id}}" }, "failure_funnel_step_id": null, "created_at": "2026-08-02T10:03:44.000000Z", "updated_at": "2026-08-02T10:03:44.000000Z", "deleted_at": null } } } } } } }, "422": { "description": "Validação falhou", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." }, "validation": { "type": "object", "description": "Mapa de campo para as mensagens de validação daquele campo.", "properties": {} } }, "required": [ "response", "message", "error", "validation" ] }, "example": { "response": false, "message": "validation_errors", "error": "O campo ai agent id selecionado é inválido.", "validation": { "ai_agent_id": [ "O campo ai agent id selecionado é inválido." ] } } } } } } }, "parameters": [ { "name": "step", "in": "path", "required": true, "description": "ID da etapa do funil.", "schema": { "type": "string" }, "example": "" } ] }, "/api/management/steps/{step}/assistants/{assistant}": { "get": { "tags": [ "step-assistants", "Assistentes" ], "summary": "Obter um assistente da etapa", "description": "Retorna a configuração de um assistente, já com a etapa e o agente de IA associados.", "operationId": "obterAssistenteDaEtapa", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "description": "Assistente consultado.", "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "assistant": { "type": "object", "description": "Assistente de etapa com a etapa e o agente de IA associados.", "properties": { "id": { "type": "string", "description": "ID (UUID) do assistente.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do assistente, usado nas listas e nos registros de execução." }, "active": { "type": "boolean", "description": "Indica se o assistente está em operação. Inativo, ele nunca dispara." }, "funnel_step_id": { "type": "integer", "description": "ID da etapa do funil à qual o assistente pertence." }, "ai_agent_id": { "type": "string", "description": "ID (UUID) do agente de IA que executa a tarefa.", "format": "uuid" }, "prompt": { "type": "string", "description": "Instrução dada ao agente. Aceita a sintaxe avançada, com dados do projeto e da etapa." }, "execute_on": { "type": "string", "enum": [ "moved", "unlinked", "manual" ], "description": "Gatilho do assistente: `moved` ao entrar na etapa, `unlinked` ao sair dela e `manual` só sob demanda." }, "manual_execution_enabled": { "type": "boolean", "description": "Indica se o assistente também pode ser disparado sob demanda, mesmo tendo gatilho automático." }, "result_as_media": { "type": "boolean", "description": "Indica se o resultado é gravado como conteúdo do projeto." }, "result_as_dynamic_form": { "type": "object", "description": "Destino do resultado em campo de formulário dinâmico. `null` quando o assistente não grava em formulário.", "properties": { "pivot_class": { "type": "string", "description": "Classe do registro que guarda as respostas, no formato `App\\Models\\`. Define quais chaves de identificação abaixo são exigidas." }, "form_id": { "type": "integer", "description": "ID do formulário dinâmico que receberá a resposta." }, "edge_id": { "type": "integer", "description": "ID do campo do formulário que receberá o resultado gerado pelo assistente." }, "id": { "type": "string", "description": "Identificador do registro alvo, quando a classe se identifica por `id` (por exemplo `App\\Models\\Project`)." }, "project_id": { "type": "string", "description": "ID do projeto alvo, quando a classe se identifica pelo projeto." }, "funnel_step_id": { "type": "string", "description": "ID da etapa alvo, quando a classe se identifica pela etapa." }, "loose_form_id": { "type": "string", "description": "ID do formulário avulso alvo, quando a classe se identifica por ele." }, "project_funnel_id": { "type": "string", "description": "ID do funil alvo, quando a classe se identifica por ele." } } }, "failure_funnel_step_id": { "type": "integer", "description": "Etapa para onde o projeto é movido quando a execução falha. `null` deixa o projeto onde está." }, "created_at": { "type": "string", "description": "Data de criação.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data de exclusão, quando o assistente foi removido.", "format": "date-time" }, "funnel_step": { "type": "object", "description": "Etapa à qual o assistente pertence.", "properties": { "id": { "type": "integer", "description": "ID da etapa." }, "name": { "type": "string", "description": "Nome da etapa." }, "project_funnel_id": { "type": "integer", "description": "ID do funil dono da etapa. Presente apenas na listagem geral." } } }, "ai_agent": { "type": "object", "description": "Agente de IA que executa o assistente.", "properties": { "id": { "type": "string", "description": "ID (UUID) do agente de IA.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do agente de IA." } } } } } }, "required": [ "response", "assistant" ] }, "example": { "response": true, "assistant": { "id": "9f1c4b02-6f3a-4b8e-9d21-7c5e0a41b8d3", "name": "Resumo do atendimento", "active": true, "funnel_step_id": 312, "ai_agent_id": "2b7d94f6-0c31-4a85-b6e2-58f1c0d93a47", "prompt": "Resuma em até cinco linhas o histórico de conversas do projeto e destaque o que ficou pendente.", "execute_on": "moved", "manual_execution_enabled": true, "result_as_media": true, "result_as_dynamic_form": null, "failure_funnel_step_id": 318, "created_at": "2026-07-28T14:12:03.000000Z", "updated_at": "2026-08-11T09:41:57.000000Z", "deleted_at": null, "funnel_step": { "id": 312, "name": "Triagem" }, "ai_agent": { "id": "2b7d94f6-0c31-4a85-b6e2-58f1c0d93a47", "name": "Analista de atendimento" } } } } } }, "404": { "description": "Não encontrado", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." } }, "required": [ "response", "message", "error" ] }, "example": { "response": false, "message": "step_assistant_model_not_found", "error": "No query results for model [App\\Models\\StepAssistant] 9f1c4b02-6f3a-4b8e-9d21-7c5e0a41b8d3" } } } } } }, "put": { "tags": [ "step-assistants", "Assistentes" ], "summary": "Atualizar um assistente da etapa", "description": "Substitui a configuração do assistente. O corpo é o mesmo da criação e não aceita atualização parcial: `name`, `funnel_step_id`, `ai_agent_id`, `prompt` e `execute_on` precisam vir a cada requisição, e ao menos um destino de resultado continua obrigatório.\n\nEnviar `active: false` tira o assistente de operação sem apagar nada: a configuração e o histórico de execuções permanecem, mas ele deixa de disparar.", "operationId": "atualizarAssistenteDaEtapa", "requestBody": { "content": { "application/json": { "schema": { "description": "Configuração do assistente. Pelo menos um destino de resultado é obrigatório: `result_as_media` ou `result_as_dynamic_form`.", "type": "object", "properties": { "name": { "type": "string", "description": "Nome do assistente. Obrigatório, até 255 caracteres." }, "active": { "type": "boolean", "description": "Define se o assistente entra em operação. Padrão `true`." }, "funnel_step_id": { "type": "integer", "description": "ID da etapa do funil à qual o assistente pertence. Obrigatório — é este campo que vale, e não o ID da URL." }, "ai_agent_id": { "type": "string", "description": "ID (UUID) do agente de IA que executa a tarefa. Obrigatório e precisa pertencer à mesma conta.", "format": "uuid" }, "prompt": { "type": "string", "description": "Instrução dada ao agente. Obrigatória. Aceita a sintaxe avançada, com dados do projeto e da etapa." }, "execute_on": { "type": "string", "enum": [ "moved", "unlinked", "manual" ], "description": "Gatilho do assistente: `moved` ao entrar na etapa, `unlinked` ao sair dela e `manual` só sob demanda." }, "manual_execution_enabled": { "type": "boolean", "description": "Permite disparar o assistente sob demanda mesmo com gatilho automático. Padrão `false`." }, "failure_funnel_step_id": { "type": "integer", "description": "Etapa para onde o projeto vai se a execução falhar. Precisa ser da mesma conta e diferente de `funnel_step_id`. `null` deixa o projeto onde está." }, "result_as_media": { "type": "boolean", "description": "Grava o resultado como conteúdo do projeto. Obrigatório quando `result_as_dynamic_form` não é enviado." }, "result_as_dynamic_form": { "type": "object", "description": "Grava o resultado em um campo de formulário dinâmico. Os identificadores são resolvidos a cada execução pela sintaxe avançada, então aceitam variáveis como `{{ project.id }}` e `{{ step.id }}` em vez de valores fixos. Obrigatório quando `result_as_media` não é enviado.", "properties": { "pivot_class": { "type": "string", "description": "Classe do registro que guarda as respostas, no formato `App\\Models\\`. Define quais chaves de identificação abaixo são exigidas." }, "form_id": { "type": "integer", "description": "ID do formulário dinâmico que receberá a resposta." }, "edge_id": { "type": "integer", "description": "ID do campo do formulário que receberá o resultado gerado pelo assistente." }, "id": { "type": "string", "description": "Identificador do registro alvo, quando a classe se identifica por `id` (por exemplo `App\\Models\\Project`)." }, "project_id": { "type": "string", "description": "ID do projeto alvo, quando a classe se identifica pelo projeto." }, "funnel_step_id": { "type": "string", "description": "ID da etapa alvo, quando a classe se identifica pela etapa." }, "loose_form_id": { "type": "string", "description": "ID do formulário avulso alvo, quando a classe se identifica por ele." }, "project_funnel_id": { "type": "string", "description": "ID do funil alvo, quando a classe se identifica por ele." } }, "required": [ "pivot_class", "form_id", "edge_id" ] } }, "required": [ "name", "funnel_step_id", "ai_agent_id", "prompt", "execute_on" ] }, "examples": { "Atualizar assistente da etapa": { "value": { "name": "Resumo do atendimento", "active": true, "funnel_step_id": null, "ai_agent_id": null, "prompt": "", "execute_on": "moved", "manual_execution_enabled": false, "failure_funnel_step_id": null, "result_as_media": true, "result_as_dynamic_form": null } } } } } }, "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "description": "Assistente gravado. A etapa e o agente de IA não vêm carregados nesta resposta.", "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "assistant": { "type": "object", "description": "Assistente de etapa.", "properties": { "id": { "type": "string", "description": "ID (UUID) do assistente.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do assistente, usado nas listas e nos registros de execução." }, "active": { "type": "boolean", "description": "Indica se o assistente está em operação. Inativo, ele nunca dispara." }, "funnel_step_id": { "type": "integer", "description": "ID da etapa do funil à qual o assistente pertence." }, "ai_agent_id": { "type": "string", "description": "ID (UUID) do agente de IA que executa a tarefa.", "format": "uuid" }, "prompt": { "type": "string", "description": "Instrução dada ao agente. Aceita a sintaxe avançada, com dados do projeto e da etapa." }, "execute_on": { "type": "string", "enum": [ "moved", "unlinked", "manual" ], "description": "Gatilho do assistente: `moved` ao entrar na etapa, `unlinked` ao sair dela e `manual` só sob demanda." }, "manual_execution_enabled": { "type": "boolean", "description": "Indica se o assistente também pode ser disparado sob demanda, mesmo tendo gatilho automático." }, "result_as_media": { "type": "boolean", "description": "Indica se o resultado é gravado como conteúdo do projeto." }, "result_as_dynamic_form": { "type": "object", "description": "Destino do resultado em campo de formulário dinâmico. `null` quando o assistente não grava em formulário.", "properties": { "pivot_class": { "type": "string", "description": "Classe do registro que guarda as respostas, no formato `App\\Models\\`. Define quais chaves de identificação abaixo são exigidas." }, "form_id": { "type": "integer", "description": "ID do formulário dinâmico que receberá a resposta." }, "edge_id": { "type": "integer", "description": "ID do campo do formulário que receberá o resultado gerado pelo assistente." }, "id": { "type": "string", "description": "Identificador do registro alvo, quando a classe se identifica por `id` (por exemplo `App\\Models\\Project`)." }, "project_id": { "type": "string", "description": "ID do projeto alvo, quando a classe se identifica pelo projeto." }, "funnel_step_id": { "type": "string", "description": "ID da etapa alvo, quando a classe se identifica pela etapa." }, "loose_form_id": { "type": "string", "description": "ID do formulário avulso alvo, quando a classe se identifica por ele." }, "project_funnel_id": { "type": "string", "description": "ID do funil alvo, quando a classe se identifica por ele." } } }, "failure_funnel_step_id": { "type": "integer", "description": "Etapa para onde o projeto é movido quando a execução falha. `null` deixa o projeto onde está." }, "created_at": { "type": "string", "description": "Data de criação.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data de exclusão, quando o assistente foi removido.", "format": "date-time" } } } }, "required": [ "response", "assistant" ] }, "example": { "response": true, "assistant": { "id": "9f1c4b02-6f3a-4b8e-9d21-7c5e0a41b8d3", "name": "Resumo do atendimento", "active": false, "funnel_step_id": 312, "ai_agent_id": "2b7d94f6-0c31-4a85-b6e2-58f1c0d93a47", "prompt": "Resuma em até cinco linhas o histórico de conversas do projeto e destaque o que ficou pendente.", "execute_on": "moved", "manual_execution_enabled": true, "result_as_media": true, "result_as_dynamic_form": null, "failure_funnel_step_id": 318, "created_at": "2026-07-28T14:12:03.000000Z", "updated_at": "2026-08-19T11:07:22.000000Z", "deleted_at": null } } } } } } }, "delete": { "tags": [ "step-assistants", "Assistentes" ], "summary": "Deletar um assistente da etapa", "description": "Remove o assistente da etapa. A exclusão é lógica: ele para de disparar e some das listagens, mas o histórico de execuções continua acessível. Não há endpoint de restauração — para tirar um assistente de operação temporariamente, prefira desativá-lo pela edição.\n\nA resposta não tem corpo.", "operationId": "deletarAssistenteDaEtapa", "responses": { "204": { "description": "Removido", "content": { "application/json": { "schema": { "type": "object" }, "example": {} } } } } }, "parameters": [ { "name": "step", "in": "path", "required": true, "description": "ID da etapa do funil.", "schema": { "type": "string" }, "example": "" }, { "name": "assistant", "in": "path", "required": true, "description": "ID (UUID) do assistente de etapa.", "schema": { "type": "string" }, "example": "" } ] }, "/api/management/customers/search": { "post": { "tags": [ "customers", "search" ], "summary": "Busca avançada de clientes", "description": "Buscar clientes com filtros e critérios específicos. Leia [aqui sobre busca avançada](https://docs.olie.ai/api-reference/general/advanced-search).", "operationId": "buscaAvanAdaDeClientes", "responses": { "200": { "description": "Sucesso: Filtro por telefone", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "Date": { "schema": { "type": "string" }, "example": "Fri, 16 Jan 2026 18:11:44 GMT" }, "X-Ratelimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-Ratelimit-Remaining": { "schema": { "type": "integer" }, "example": 159 }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "customers": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "name": { "type": "string" }, "headquarter": { "type": "string" }, "company_name": { "type": "string" }, "document_type": { "type": "integer" }, "customer_type": { "type": "integer" }, "document": { "type": "string" }, "email": { "type": "string", "format": "email" }, "phone": { "type": "string" }, "address": { "type": "string" }, "status": { "type": "integer" }, "form_answers": { "type": "array", "items": {} }, "contacts": { "type": "array", "items": {} }, "frame_id": { "type": "string" }, "created_at": { "type": "string", "format": "date-time" }, "updated_at": { "type": "string", "format": "date-time" }, "created_by_user": { "type": "object", "properties": { "id": { "type": "string" }, "name": { "type": "string" }, "avatar_url": { "type": "string", "format": "uri" } } }, "created_by": { "type": "string" }, "contacts_count": { "type": "integer" }, "projects_count": { "type": "integer" }, "tags": { "type": "array", "items": {} } } } }, "meta": { "type": "object", "properties": { "current_page": { "type": "integer" }, "from": { "type": "integer" }, "last_page": { "type": "integer" }, "per_page": { "type": "integer" }, "to": { "type": "integer" }, "total": { "type": "integer" } } }, "response": { "type": "boolean" } } }, "example": { "customers": [ { "id": "019bc7f9-f586-7386-a27d-a070e8ae5ac2", "name": "Cliente Exemplo - Filial Rio Preto", "headquarter": "Cliente Exemplo - Filial Rio Preto", "branch": null, "company_name": "Cliente Exemplo Comércio LTDA", "document_type": 2, "customer_type": 1, "parent": null, "document": "12.345.678/0000-00", "main_activity": null, "email": "rp@clienteexemplo.com.br", "phone": "+5599999999999", "address": "Av. Exemplo, 456 - Campinas/SP", "description": null, "custom_fields": null, "status": 1, "form_answers": [], "contacts": [], "parent_id": null, "frame_id": "019b329a-4346-7064-bba3-e7c19057cda4", "created_at": "2026-01-16T18:03:25.000000Z", "updated_at": "2026-01-16T18:03:25.000000Z", "deleted_at": null, "created_by_user": { "id": "019b329a-3f1f-7198-89e5-008dc4e2bd60", "name": "Test User", "avatar_url": "https://via.placeholder.com/124x124.png/00eebb?text=vero" }, "created_by": "019b329a-3f1f-7198-89e5-008dc4e2bd60", "contacts_count": 0, "projects_count": 0, "tags": [] } ], "meta": { "current_page": 1, "from": 1, "last_page": 1, "per_page": 30, "to": 1, "total": 1 }, "response": true } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "filters": { "type": "array", "description": "Array de filtros a serem aplicados na busca", "items": { "type": "object", "properties": { "field": { "type": "string", "description": "Campo a ser filtrado. Consulte os campos disponíveis de cada modelo [rota de listagem de parâmetros `/api/management/system/params/{model_name}`](https://docs.olie.ai/api-reference/system/listar-par%C3%A2metros-dispon%C3%ADveis-para-filtragem-de-um-modelo)", "x-markdownDescription": "Campo a ser filtrado. Consulte os campos disponíveis de cada modelo [rota de listagem de parâmetros `/api/management/system/params/{model_name}`](https://docs.olie.ai/api-reference/system/listar-par%C3%A2metros-dispon%C3%ADveis-para-filtragem-de-um-modelo)" }, "operator": { "type": "string", "enum": [ "equals", "not_equals", "contains", "not_contains", "greater_than", "greater_than_or_equals", "less_than", "less_than_or_equals", "is_null", "is_not_null" ], "description": "Operador relacional a ser usado no filtro" }, "value": { "description": "Valor a ser filtrado (pode ser string, number, boolean, object com id, ou null)", "oneOf": [ { "type": "string" }, { "type": "number" }, { "type": "boolean" }, { "type": "object", "properties": { "id": { "type": "string" } }, "required": [ "id" ] } ] }, "logical_operator": { "type": "string", "enum": [ "and", "or" ], "description": "Operador lógico para combinar com outros filtros (padrão: 'and')", "default": "and" }, "arguments": { "type": "array", "description": "Argumentos adicionais para filtros especiais (ex: answer_pool requer edge_id)", "items": { "type": "object", "properties": { "argument_key": { "type": "string", "description": "Chave do argumento" }, "argument_value_id": { "type": "string", "description": "ID do valor do argumento" }, "argument_value_type": { "type": "string", "description": "Tipo do valor do argumento (classe do modelo)" } }, "required": [ "argument_key", "argument_value_id", "argument_value_type" ] } } }, "required": [ "field", "operator" ] } }, "sorting": { "type": "array", "description": "Array de ordenações a serem aplicadas", "items": { "type": "object", "properties": { "field": { "type": "string", "enum": [ "name", "status", "email", "company_name", "document", "customer_type", "main_activity", "address", "description", "created_at" ], "description": "Campo para ordenação" }, "direction": { "type": "string", "enum": [ "asc", "desc" ], "description": "Direção da ordenação" }, "arguments": { "type": "array", "description": "Argumentos adicionais para ordenações especiais", "items": { "type": "object" } } }, "required": [ "field", "direction" ] } }, "page": { "type": "integer", "minimum": 1, "description": "Número da página (paginação Laravel)", "default": 1 }, "per_page": { "type": "integer", "minimum": 1, "maximum": 100, "description": "Quantidade de itens por página", "default": 15 } } }, "example": { "filters": [ { "field": "name", "operator": "contains", "value": "Le" } ] } } } } } }, "/api/management/customers/{customer}/restore": { "post": { "tags": [ "customers", "restore" ], "summary": "Restaurar um cliente", "description": "Restaurar um cliente que foi arquivado anteriormente.", "operationId": "restaurarCliente", "responses": { "200": { "description": "Sucesso", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "Date": { "schema": { "type": "string" }, "example": "Thu, 15 Jan 2026 20:09:32 GMT" }, "X-Ratelimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-Ratelimit-Remaining": { "schema": { "type": "integer" }, "example": 157 }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" } } }, "example": { "response": true } } } } } }, "parameters": [ { "name": "customer", "in": "path", "required": true, "description": "UUID do cliente a restaurar", "schema": { "type": "string", "format": "uuid" }, "example": "019b329a-8ef0-71ac-8997-dc62f1486a70" } ] }, "/api/management/customers/{customer}/media": { "get": { "tags": [ "customers", "media" ], "summary": "Listar conteúdos de projetos associados ao cliente", "description": "Listar conteúdos de projetos associados ao cliente", "operationId": "listarConteDosDeProjetosAssociadosAoCliente", "responses": { "200": { "description": "Lista paginada de conteúdos dos projetos do cliente." } } }, "parameters": [ { "name": "customer", "in": "path", "required": true, "schema": { "type": "string" }, "example": "string" } ] }, "/api/management/customers/{customer}/project-medias": { "get": { "tags": [ "customers", "project-medias" ], "summary": "Listar conteúdos de projetos associados ao cliente com arquivos", "description": "Listar conteúdos de projetos associados ao cliente com arquivos", "operationId": "listarConteDosDeProjetosAssociadosAoClienteComArquivos", "responses": { "200": { "description": "200" } } }, "parameters": [ { "name": "customer", "in": "path", "required": true, "schema": { "type": "string" }, "example": "string" } ] }, "/api/management/customers": { "get": { "tags": [ "customers" ], "summary": "Listar clientes", "description": "Listar todos os clientes.", "operationId": "listarClientes", "responses": { "200": { "description": "Sucesso", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "Date": { "schema": { "type": "string" }, "example": "Fri, 16 Jan 2026 18:06:16 GMT" }, "X-Ratelimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-Ratelimit-Remaining": { "schema": { "type": "integer" }, "example": 159 }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "enum": [ true ], "description": "Indicador de sucesso da requisição" }, "customers": { "type": "array", "description": "Array com os objetos de clientes", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "Identificador único do cliente", "format": "uuid" }, "name": { "type": "string", "description": "Nome do cliente" }, "headquarter": { "type": "string", "description": "Nome da matriz (atributo computado)" }, "branch": { "type": "string", "description": "Nome da filial (atributo computado)" }, "company_name": { "type": "string", "description": "Razão social da empresa" }, "document_type": { "type": "integer", "enum": [ 1, 2 ], "description": "Tipo de documento: 1 = CPF, 2 = CNPJ" }, "customer_type": { "type": "integer", "enum": [ 1, 2 ], "description": "Tipo de cliente: 1 = Matriz, 2 = Filial" }, "parent": { "type": "object", "description": "Dados da matriz (apenas quando há relacionamento)", "properties": { "id": { "type": "string", "description": "ID da matriz", "format": "uuid" }, "name": { "type": "string", "description": "Nome da matriz" } } }, "document": { "type": "string", "description": "Número do CPF ou CNPJ" }, "main_activity": { "type": "string", "description": "Atividade principal da empresa" }, "email": { "type": "string", "description": "E-mail do cliente", "format": "email" }, "phone": { "type": "string", "description": "Telefone do cliente" }, "address": { "type": "string", "description": "Endereço do cliente" }, "description": { "type": "string", "description": "Descrição adicional do cliente" }, "custom_fields": { "type": "object", "description": "Campos personalizados" }, "status": { "type": "boolean", "description": "Status do cliente (true = ativo, false = inativo)" }, "form_answers": { "type": "array", "description": "Respostas de formulários dinâmicos", "items": {}, "default": [] }, "contacts": { "type": "array", "description": "Contatos vinculados ao cliente (apenas se carregado)", "items": { "type": "object" } }, "parent_id": { "type": "string", "description": "ID do cliente matriz (se for filial)", "format": "uuid" }, "frame_id": { "type": "string", "description": "ID do frame/organização", "format": "uuid" }, "created_at": { "type": "string", "description": "Data de criação do registro", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última atualização", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data de exclusão (soft delete)", "format": "date-time" }, "created_by": { "type": "integer", "description": "ID do usuário que criou o registro" }, "created_by_user": { "type": "object", "description": "Dados do usuário criador (apenas se carregado)", "properties": { "id": { "type": "integer", "description": "ID do usuário" }, "name": { "type": "string", "description": "Nome do usuário" }, "avatar_url": { "type": "string", "description": "URL do avatar do usuário" } } }, "contacts_count": { "type": "integer", "description": "Quantidade de contatos vinculados (apenas se contado)" }, "projects_count": { "type": "integer", "description": "Quantidade de projetos vinculados (apenas se contado)" }, "tags": { "type": "array", "description": "Tags vinculadas ao cliente (apenas se carregadas)", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "ID da tag", "format": "uuid" }, "name": { "type": "string", "description": "Nome da tag" }, "color": { "type": "string", "description": "Cor da tag em formato hexadecimal" } } } } }, "required": [ "id", "name", "document_type", "customer_type", "frame_id", "created_at", "updated_at" ] } }, "meta": { "type": "object", "description": "Metadados da paginação", "properties": { "current_page": { "type": "integer", "minimum": 1, "description": "Página atual" }, "from": { "type": "integer", "description": "Índice do primeiro item na página atual" }, "last_page": { "type": "integer", "minimum": 1, "description": "Número da última página" }, "per_page": { "type": "integer", "minimum": 1, "description": "Quantidade de itens por página" }, "to": { "type": "integer", "description": "Índice do último item na página atual" }, "total": { "type": "integer", "minimum": 0, "description": "Total de registros disponíveis" } }, "required": [ "current_page", "from", "last_page", "per_page", "to", "total" ] } }, "required": [ "response", "customers", "meta" ] }, "example": { "response": true, "customers": [ { "id": "9d4e5f6a-7b8c-9d0e-1f2a-3b4c5d6e7f8a", "name": "Cliente Exemplo LTDA", "headquarter": "Cliente Exemplo LTDA", "branch": null, "company_name": "Cliente Exemplo Comércio LTDA", "document_type": 2, "customer_type": 1, "document": "12.345.678/0001-90", "main_activity": "Comércio de produtos alimentícios", "email": "contato@clienteexemplo.com.br", "phone": "+5591999990000", "address": "Rua Exemplo, 123 - Centro - São Paulo/SP", "description": "Cliente do segmento de alimentação", "custom_fields": null, "status": true, "form_answers": [], "parent_id": null, "frame_id": "8c3d4e5f-6a7b-8c9d-0e1f-2a3b4c5d6e7f", "created_at": "2026-01-15T10:30:00.000000Z", "updated_at": "2026-01-15T10:30:00.000000Z", "deleted_at": null, "created_by": 123, "contacts_count": 2, "projects_count": 5 } ], "meta": { "current_page": 1, "from": 1, "last_page": 10, "per_page": 15, "to": 15, "total": 150 } } } } } } }, "post": { "tags": [ "customers" ], "summary": "Criar um cliente", "description": "Criar um novo cliente.", "operationId": "criarCliente", "responses": { "200": { "description": "Sucesso (CNPJ)", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "Date": { "schema": { "type": "string" }, "example": "Fri, 16 Jan 2026 18:03:26 GMT" }, "X-Ratelimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-Ratelimit-Remaining": { "schema": { "type": "integer" }, "example": 157 }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" } } }, "201": { "description": "Sucesso (CNPJ)", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "Date": { "schema": { "type": "string" }, "example": "Fri, 16 Jan 2026 18:03:26 GMT" }, "X-Ratelimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-Ratelimit-Remaining": { "schema": { "type": "integer" }, "example": 157 }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "customer": { "type": "object", "properties": { "id": { "type": "string" }, "name": { "type": "string" }, "headquarter": { "type": "string" }, "company_name": { "type": "string" }, "document_type": { "type": "integer" }, "customer_type": { "type": "integer" }, "document": { "type": "string" }, "email": { "type": "string", "format": "email" }, "phone": { "type": "string" }, "address": { "type": "string" }, "status": { "type": "boolean" }, "form_answers": { "type": "array", "items": {} }, "frame_id": { "type": "string" }, "created_at": { "type": "string", "format": "date-time" }, "updated_at": { "type": "string", "format": "date-time" }, "created_by": { "type": "string" } } }, "response": { "type": "boolean" } } }, "example": { "customer": { "id": "019bc7f9-f586-7386-a27d-a070e8ae5ac2", "name": "Cliente Exemplo - Filial Rio Preto", "headquarter": "Cliente Exemplo - Filial Rio Preto", "branch": null, "company_name": "Cliente Exemplo Comércio LTDA", "document_type": 2, "customer_type": 1, "document": "12.345.678/0000-00", "main_activity": null, "email": "rp@clienteexemplo.com.br", "phone": "+5591999990000", "address": "Av. Exemplo, 456 - Campinas/SP", "description": null, "custom_fields": null, "status": true, "form_answers": [], "parent_id": null, "frame_id": "019b329a-4346-7064-bba3-e7c19057cda4", "created_at": "2026-01-16T18:03:25.000000Z", "updated_at": "2026-01-16T18:03:25.000000Z", "deleted_at": null, "created_by": "019b329a-3f1f-7198-89e5-008dc4e2bd60" }, "response": true } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "name": { "type": "string", "maxLength": 255, "description": "Nome do contato" }, "role": { "type": "string", "description": "Cargo do contato" }, "email": { "type": "string", "maxLength": 254, "description": "E-mail do contato", "format": "email" }, "phone": { "type": "string", "maxLength": 30, "description": "Telefone do contato" }, "description": { "type": "string", "maxLength": 255, "description": "Descrição do contato" }, "customers": { "type": "object", "description": "Clientes vinculados ao contato. Envie to_add (clientes a adicionar) e to_rem (clientes a remover).", "properties": { "to_add": { "type": "array", "description": "IDs dos clientes a adicionar", "items": { "type": "string", "format": "uuid" } }, "to_rem": { "type": "array", "description": "IDs dos clientes a remover", "items": { "type": "string", "format": "uuid" } } }, "required": [ "to_add", "to_rem" ] }, "tags": { "type": "object", "description": "Etiquetas do contato. Envie to_add (etiquetas a adicionar) e to_rem (etiquetas a remover).", "properties": { "to_add": { "type": "array", "description": "Etiquetas a adicionar: use id para vincular etiqueta existente ou name (e opcionalmente color) para criar nova", "items": { "oneOf": [ { "type": "object", "properties": { "id": { "type": "string", "description": "ID da etiqueta existente", "format": "uuid" } }, "required": [ "id" ] }, { "type": "object", "properties": { "name": { "type": "string", "maxLength": 255, "description": "Nome da nova etiqueta" }, "color": { "type": "string", "pattern": "^#[0-9A-Fa-f]{6}$", "description": "Cor em hex (ex: #FF0000)" } }, "required": [ "name" ] } ] } }, "to_rem": { "type": "array", "description": "Etiquetas a remover", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "ID da etiqueta a remover", "format": "uuid" } }, "required": [ "id" ] } } }, "required": [ "to_add", "to_rem" ] }, "form_answers": { "type": "array", "description": "Respostas do formulário dinâmico", "items": { "type": "object", "properties": { "id": { "type": "integer", "description": "ID da pergunta do formulário (form_edge id)" }, "answer": { "type": "string", "description": "Resposta para a pergunta" } }, "required": [ "id", "answer" ] } } }, "required": [ "name" ] }, "example": { "name": "Cliente Exemplo - Filial Rio Preto", "document_type": 2, "customer_type": 1, "company_name": "Cliente Exemplo Comércio LTDA", "document": "12.345.678/0002-71", "email": "rp@clienteexemplo.com.br", "phone": "+5591999990000", "address": "Av. Exemplo, 456 - Campinas/SP", "status": true, "parent_id": null, "tags": { "to_add": [], "to_rem": [] } } } } } } }, "/api/management/customers/{customer}": { "get": { "tags": [ "customers" ], "summary": "Obter cliente específico", "description": "Retorna os detalhes de um cliente pelo ID.", "operationId": "obterClienteEspecifico", "parameters": [ { "name": "customer", "in": "path", "required": true, "description": "UUID do cliente", "schema": { "type": "string", "format": "uuid" } } ], "responses": { "200": { "description": "Cliente encontrado" }, "401": { "description": "Não autorizado" } } }, "put": { "tags": [ "customers" ], "summary": "Atualizar cliente", "description": "Atualiza os dados de um cliente existente. Todos os campos são opcionais; envie apenas os que deseja alterar.", "operationId": "atualizarCliente", "parameters": [ { "name": "customer", "in": "path", "required": true, "description": "UUID do cliente", "schema": { "type": "string", "format": "uuid" } } ], "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "name": { "type": "string", "maxLength": 255, "description": "Nome do cliente" }, "company_name": { "type": "string", "maxLength": 100 }, "document_type": { "type": "integer", "enum": [ 1, 2 ], "description": "1 = CPF, 2 = CNPJ" }, "customer_type": { "type": "integer", "enum": [ 1, 2 ], "description": "1 = Matriz, 2 = Filial" }, "document": { "type": "string", "maxLength": 40 }, "main_activity": { "type": "string", "maxLength": 255 }, "email": { "type": "string", "maxLength": 254, "format": "email" }, "phone": { "type": "string", "maxLength": 30 }, "address": { "type": "string", "maxLength": 255 }, "description": { "type": "string", "maxLength": 255 }, "status": { "type": "boolean" }, "parent_id": { "type": "string", "description": "ID do cliente matriz (obrigatório se customer_type = 2)", "format": "uuid" }, "form_answers": { "type": "array", "items": {} }, "tags": { "type": "object", "description": "Etiquetas do cliente. Envie to_add (etiquetas a adicionar) e to_rem (etiquetas a remover).", "properties": { "to_add": { "type": "array", "description": "Etiquetas a adicionar: use id para vincular etiqueta existente ou name (e opcionalmente color) para criar nova", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "ID da etiqueta existente", "format": "uuid" }, "name": { "type": "string", "description": "Nome da nova etiqueta" }, "color": { "type": "string", "description": "Cor em hex (ex: #FF0000)" } } } }, "to_rem": { "type": "array", "description": "Etiquetas a remover", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "ID da etiqueta a remover", "format": "uuid" } } } } } } } }, "example": { "name": "Cliente Atualizado", "email": "novo@email.com.br", "status": true, "tags": { "to_add": [], "to_rem": [] } } } }, "required": false }, "responses": { "200": { "description": "Cliente atualizado com sucesso" }, "401": { "description": "Não autorizado" } } }, "delete": { "tags": [ "customers" ], "summary": "Arquivar cliente", "description": "Arquivar cliente específico", "operationId": "arquivarCliente", "responses": { "200": { "description": "200", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "Date": { "schema": { "type": "string" }, "example": "Thu, 15 Jan 2026 20:08:38 GMT" }, "X-Ratelimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-Ratelimit-Remaining": { "schema": { "type": "integer" }, "example": 155 }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" } } }, "example": { "response": true } } } } } }, "parameters": [ { "name": "customer", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" }, "example": "70ced5b7-48f7-3efe-80c6-627cfd6dae17" } ] }, "/api/management/contacts/search": { "post": { "tags": [ "contacts", "search" ], "summary": "Busca avançada de contatos", "description": "Buscar contatos com filtros e critérios específicos. Leia [aqui sobre busca avançada](https://docs.olie.ai/api-reference/general/advanced-search).", "operationId": "buscaAvanAdaDeContatos", "responses": { "200": { "description": "Busca avançada de contatos", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "Date": { "schema": { "type": "string" }, "example": "Thu, 15 Jan 2026 19:50:33 GMT" }, "X-Ratelimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-Ratelimit-Remaining": { "schema": { "type": "integer" }, "example": 152 }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "contacts": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "integer" }, "name": { "type": "string" }, "role": { "type": "string" }, "email": { "type": "string", "format": "email" }, "phone": { "type": "string" }, "description": { "type": "string" }, "created_at": { "type": "string", "format": "date-time" }, "updated_at": { "type": "string", "format": "date-time" }, "frame_id": { "type": "string" }, "customers": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "name": { "type": "string" }, "pivot": { "type": "object", "properties": { "contact_id": { "type": "integer" }, "customer_id": { "type": "string" } } } } } }, "form_answers": { "type": "array", "items": {} }, "frame": { "type": "object", "properties": { "id": { "type": "string" }, "name": { "type": "string" } } } } } }, "meta": { "type": "object", "properties": { "current_page": { "type": "integer" }, "from": { "type": "integer" }, "last_page": { "type": "integer" }, "per_page": { "type": "integer" }, "to": { "type": "integer" }, "total": { "type": "integer" } } }, "response": { "type": "boolean" } } }, "example": { "contacts": [ { "id": 159, "name": "Thalia Pietra Lira", "role": "sunt", "email": "goncalves.malena@example.net", "phone": "+5599999999999", "description": "In aut et aliquam odio in aut. Sapiente modi dolorum sunt vitae.", "created_at": "2025-12-18T17:55:48.000000Z", "updated_at": "2025-12-18T17:55:48.000000Z", "deleted_at": null, "frame_id": "019b329a-4346-7064-bba3-e7c19057cda4", "customers": [ { "id": "019b329a-8ef0-71ac-8997-dc62f1486a70", "name": "Sra. Mariah Valentin Sobrinho", "pivot": { "contact_id": 159, "customer_id": "019b329a-8ef0-71ac-8997-dc62f1486a70" } }, { "id": "019b329a-8efa-70dd-ad42-60dd2431804b", "name": "Elias Montenegro", "pivot": { "contact_id": 159, "customer_id": "019b329a-8efa-70dd-ad42-60dd2431804b" } }, { "id": "019b329a-8f00-716b-9c61-0777df2c3714", "name": "Guilherme Thales Paz", "pivot": { "contact_id": 159, "customer_id": "019b329a-8f00-716b-9c61-0777df2c3714" } } ], "form_answers": [], "frame": { "id": "019b329a-4346-7064-bba3-e7c19057cda4", "name": "OlieDev Company " } }, { "id": 160, "name": "Ariane Valéria Alves", "role": "laboriosam", "email": "juliano67@example.com", "phone": "+5599999999999", "description": "Ratione quia consequatur nam unde consequatur.", "created_at": "2025-12-18T17:55:48.000000Z", "updated_at": "2025-12-18T17:55:48.000000Z", "deleted_at": null, "frame_id": "019b329a-4346-7064-bba3-e7c19057cda4", "customers": [ { "id": "019b329a-8ef0-71ac-8997-dc62f1486a70", "name": "Sra. Mariah Valentin Sobrinho", "pivot": { "contact_id": 160, "customer_id": "019b329a-8ef0-71ac-8997-dc62f1486a70" } }, { "id": "019b329a-8f00-716b-9c61-0777df2c3714", "name": "Guilherme Thales Paz", "pivot": { "contact_id": 160, "customer_id": "019b329a-8f00-716b-9c61-0777df2c3714" } } ], "form_answers": [], "frame": { "id": "019b329a-4346-7064-bba3-e7c19057cda4", "name": "OlieDev Company " } }, { "id": 161, "name": "Sra. Júlia Brito Deverso", "role": "eius", "email": "allison.fonseca@example.com", "phone": "+5599999999999", "description": "Qui id voluptatibus culpa praesentium qui.", "created_at": "2025-12-18T17:55:48.000000Z", "updated_at": "2025-12-18T17:55:48.000000Z", "deleted_at": null, "frame_id": "019b329a-4346-7064-bba3-e7c19057cda4", "customers": [], "form_answers": [], "frame": { "id": "019b329a-4346-7064-bba3-e7c19057cda4", "name": "OlieDev Company " } }, { "id": 162, "name": "Ricardo Sérgio Valente Neto", "role": "fugit", "email": "ohana36@example.com", "phone": "+5599999999999", "description": "Pariatur optio voluptatem sed eveniet eveniet.", "created_at": "2025-12-18T17:55:48.000000Z", "updated_at": "2025-12-18T17:55:48.000000Z", "deleted_at": null, "frame_id": "019b329a-4346-7064-bba3-e7c19057cda4", "customers": [ { "id": "019b329a-8efa-70dd-ad42-60dd2431804b", "name": "Elias Montenegro", "pivot": { "contact_id": 162, "customer_id": "019b329a-8efa-70dd-ad42-60dd2431804b" } } ], "form_answers": [], "frame": { "id": "019b329a-4346-7064-bba3-e7c19057cda4", "name": "OlieDev Company " } }, { "id": 163, "name": "Lia Samanta Valentin", "role": "accusamus", "email": "norma47@example.net", "phone": "+5599999999999", "description": "Veritatis et dolorum omnis voluptas officia temporibus architecto.", "created_at": "2025-12-18T17:55:48.000000Z", "updated_at": "2025-12-18T17:55:48.000000Z", "deleted_at": null, "frame_id": "019b329a-4346-7064-bba3-e7c19057cda4", "customers": [], "form_answers": [], "frame": { "id": "019b329a-4346-7064-bba3-e7c19057cda4", "name": "OlieDev Company " } }, { "id": 164, "name": "Elisa Renata Barreto", "role": "totam", "email": "valdez.wilson@example.com", "phone": "+5599999999999", "description": "At similique recusandae molestias fugit unde reiciendis.", "created_at": "2025-12-18T17:55:48.000000Z", "updated_at": "2025-12-18T17:55:48.000000Z", "deleted_at": null, "frame_id": "019b329a-4346-7064-bba3-e7c19057cda4", "customers": [ { "id": "019b329a-8efa-70dd-ad42-60dd2431804b", "name": "Elias Montenegro", "pivot": { "contact_id": 164, "customer_id": "019b329a-8efa-70dd-ad42-60dd2431804b" } } ], "form_answers": [], "frame": { "id": "019b329a-4346-7064-bba3-e7c19057cda4", "name": "OlieDev Company " } }, { "id": 165, "name": "Franco Abreu", "role": "nemo", "email": "qgalindo@example.org", "phone": "+5599999999999", "description": "Quaerat provident sint quia.", "created_at": "2025-12-18T17:55:48.000000Z", "updated_at": "2025-12-18T17:55:48.000000Z", "deleted_at": null, "frame_id": "019b329a-4346-7064-bba3-e7c19057cda4", "customers": [ { "id": "019b329a-8f00-716b-9c61-0777df2c3714", "name": "Guilherme Thales Paz", "pivot": { "contact_id": 165, "customer_id": "019b329a-8f00-716b-9c61-0777df2c3714" } } ], "form_answers": [], "frame": { "id": "019b329a-4346-7064-bba3-e7c19057cda4", "name": "OlieDev Company " } }, { "id": 166, "name": "Dr. Luiz Serna Filho", "role": "soluta", "email": "mares.sophie@example.org", "phone": "+5599999999999", "description": "Provident deleniti qui aspernatur velit repudiandae dolor.", "created_at": "2025-12-18T17:55:48.000000Z", "updated_at": "2025-12-18T17:55:48.000000Z", "deleted_at": null, "frame_id": "019b329a-4346-7064-bba3-e7c19057cda4", "customers": [], "form_answers": [], "frame": { "id": "019b329a-4346-7064-bba3-e7c19057cda4", "name": "OlieDev Company " } }, { "id": 167, "name": "Sr. Ricardo Benites", "role": "ullam", "email": "cesar.domingues@example.com", "phone": "+5599999999999", "description": "Est omnis assumenda laboriosam tenetur magnam deleniti aspernatur.", "created_at": "2025-12-18T17:55:48.000000Z", "updated_at": "2025-12-18T17:55:48.000000Z", "deleted_at": null, "frame_id": "019b329a-4346-7064-bba3-e7c19057cda4", "customers": [], "form_answers": [], "frame": { "id": "019b329a-4346-7064-bba3-e7c19057cda4", "name": "OlieDev Company " } }, { "id": 168, "name": "Flávio Emílio Quintana Neto", "role": "non", "email": "noemi.rico@example.org", "phone": "+5599999999999", "description": "Consectetur quidem et ducimus consequatur.", "created_at": "2025-12-18T17:55:48.000000Z", "updated_at": "2025-12-18T17:55:48.000000Z", "deleted_at": null, "frame_id": "019b329a-4346-7064-bba3-e7c19057cda4", "customers": [ { "id": "019b329a-8ef0-71ac-8997-dc62f1486a70", "name": "Sra. Mariah Valentin Sobrinho", "pivot": { "contact_id": 168, "customer_id": "019b329a-8ef0-71ac-8997-dc62f1486a70" } } ], "form_answers": [], "frame": { "id": "019b329a-4346-7064-bba3-e7c19057cda4", "name": "OlieDev Company " } }, { "id": 169, "name": "Henrique Marin da Rosa", "role": "est", "email": "pacheco.naiara@example.org", "phone": "+5599999999999", "description": "Non ea sapiente numquam tempore tenetur voluptate accusantium.", "created_at": "2025-12-18T17:55:48.000000Z", "updated_at": "2025-12-18T17:55:48.000000Z", "deleted_at": null, "frame_id": "019b329a-4346-7064-bba3-e7c19057cda4", "customers": [], "form_answers": [], "frame": { "id": "019b329a-4346-7064-bba3-e7c19057cda4", "name": "OlieDev Company " } }, { "id": 170, "name": "Maurício Dias Gil", "role": "natus", "email": "wpadrao@example.net", "phone": "+5599999999999", "description": "Officiis exercitationem ipsum nobis voluptates quia tempore labore.", "created_at": "2025-12-18T17:55:48.000000Z", "updated_at": "2025-12-18T17:55:48.000000Z", "deleted_at": null, "frame_id": "019b329a-4346-7064-bba3-e7c19057cda4", "customers": [ { "id": "019b329a-8efa-70dd-ad42-60dd2431804b", "name": "Elias Montenegro", "pivot": { "contact_id": 170, "customer_id": "019b329a-8efa-70dd-ad42-60dd2431804b" } }, { "id": "019b329a-8f07-71ca-bff1-ab68831f5b7b", "name": "Dr. Artur Verdugo", "pivot": { "contact_id": 170, "customer_id": "019b329a-8f07-71ca-bff1-ab68831f5b7b" } }, { "id": "019b329a-8f0f-7265-9d8d-a90f96671967", "name": "César Sepúlveda Mascarenhas Sobrinho", "pivot": { "contact_id": 170, "customer_id": "019b329a-8f0f-7265-9d8d-a90f96671967" } } ], "form_answers": [], "frame": { "id": "019b329a-4346-7064-bba3-e7c19057cda4", "name": "OlieDev Company " } }, { "id": 171, "name": "Dr. Sara Medina Bonilha", "role": "quaerat", "email": "noel.davila@example.org", "phone": "+5599999999999", "description": "Cumque sed nam dolor et neque repudiandae.", "created_at": "2025-12-18T17:55:48.000000Z", "updated_at": "2025-12-18T17:55:48.000000Z", "deleted_at": null, "frame_id": "019b329a-4346-7064-bba3-e7c19057cda4", "customers": [], "form_answers": [], "frame": { "id": "019b329a-4346-7064-bba3-e7c19057cda4", "name": "OlieDev Company " } }, { "id": 172, "name": "Sra. Heloise Rocha Rodrigues Sobrinho", "role": "neque", "email": "emilio91@example.com", "phone": "+5599999999999", "description": "Laudantium nostrum necessitatibus et voluptatem dolores ipsa.", "created_at": "2025-12-18T17:55:48.000000Z", "updated_at": "2025-12-18T17:55:48.000000Z", "deleted_at": null, "frame_id": "019b329a-4346-7064-bba3-e7c19057cda4", "customers": [ { "id": "019b329a-8ef0-71ac-8997-dc62f1486a70", "name": "Sra. Mariah Valentin Sobrinho", "pivot": { "contact_id": 172, "customer_id": "019b329a-8ef0-71ac-8997-dc62f1486a70" } }, { "id": "019b329a-8efa-70dd-ad42-60dd2431804b", "name": "Elias Montenegro", "pivot": { "contact_id": 172, "customer_id": "019b329a-8efa-70dd-ad42-60dd2431804b" } }, { "id": "019b329a-8f07-71ca-bff1-ab68831f5b7b", "name": "Dr. Artur Verdugo", "pivot": { "contact_id": 172, "customer_id": "019b329a-8f07-71ca-bff1-ab68831f5b7b" } } ], "form_answers": [], "frame": { "id": "019b329a-4346-7064-bba3-e7c19057cda4", "name": "OlieDev Company " } }, { "id": 173, "name": "Dr. Luciana Cíntia Lira Neto", "role": "nihil", "email": "flores.pedro@example.com", "phone": "+5599999999999", "description": "Ut voluptatem fugiat consequatur in quod temporibus nobis.", "created_at": "2025-12-18T17:55:48.000000Z", "updated_at": "2025-12-18T17:55:48.000000Z", "deleted_at": null, "frame_id": "019b329a-4346-7064-bba3-e7c19057cda4", "customers": [ { "id": "019b329a-8ef0-71ac-8997-dc62f1486a70", "name": "Sra. Mariah Valentin Sobrinho", "pivot": { "contact_id": 173, "customer_id": "019b329a-8ef0-71ac-8997-dc62f1486a70" } }, { "id": "019b329a-8f00-716b-9c61-0777df2c3714", "name": "Guilherme Thales Paz", "pivot": { "contact_id": 173, "customer_id": "019b329a-8f00-716b-9c61-0777df2c3714" } }, { "id": "019b329a-8f07-71ca-bff1-ab68831f5b7b", "name": "Dr. Artur Verdugo", "pivot": { "contact_id": 173, "customer_id": "019b329a-8f07-71ca-bff1-ab68831f5b7b" } } ], "form_answers": [], "frame": { "id": "019b329a-4346-7064-bba3-e7c19057cda4", "name": "OlieDev Company " } }, { "id": 174, "name": "Daniella Esther Valentin", "role": "possimus", "email": "theo68@example.net", "phone": "+5599999999999", "description": "Est debitis quo iusto magnam hic molestiae molestias.", "created_at": "2025-12-18T17:55:48.000000Z", "updated_at": "2025-12-18T17:55:48.000000Z", "deleted_at": null, "frame_id": "019b329a-4346-7064-bba3-e7c19057cda4", "customers": [], "form_answers": [], "frame": { "id": "019b329a-4346-7064-bba3-e7c19057cda4", "name": "OlieDev Company " } }, { "id": 175, "name": "Manuel Colaço Jr.", "role": "commodi", "email": "santana.jonas@example.com", "phone": "+5599999999999", "description": "Dolore est accusantium corrupti aut. Esse maxime facere ullam.", "created_at": "2025-12-18T17:55:48.000000Z", "updated_at": "2025-12-18T17:55:48.000000Z", "deleted_at": null, "frame_id": "019b329a-4346-7064-bba3-e7c19057cda4", "customers": [], "form_answers": [], "frame": { "id": "019b329a-4346-7064-bba3-e7c19057cda4", "name": "OlieDev Company " } }, { "id": 176, "name": "Dr. Melinda Benites Filho", "role": "repellendus", "email": "augusto40@example.org", "phone": "+5599999999999", "description": "Itaque quae debitis voluptatem deserunt. Ea nihil iusto saepe ut provident ea.", "created_at": "2025-12-18T17:55:48.000000Z", "updated_at": "2025-12-18T17:55:48.000000Z", "deleted_at": null, "frame_id": "019b329a-4346-7064-bba3-e7c19057cda4", "customers": [ { "id": "019b329a-8efa-70dd-ad42-60dd2431804b", "name": "Elias Montenegro", "pivot": { "contact_id": 176, "customer_id": "019b329a-8efa-70dd-ad42-60dd2431804b" } }, { "id": "019b329a-8f07-71ca-bff1-ab68831f5b7b", "name": "Dr. Artur Verdugo", "pivot": { "contact_id": 176, "customer_id": "019b329a-8f07-71ca-bff1-ab68831f5b7b" } }, { "id": "019b329a-8f0f-7265-9d8d-a90f96671967", "name": "César Sepúlveda Mascarenhas Sobrinho", "pivot": { "contact_id": 176, "customer_id": "019b329a-8f0f-7265-9d8d-a90f96671967" } } ], "form_answers": [], "frame": { "id": "019b329a-4346-7064-bba3-e7c19057cda4", "name": "OlieDev Company " } } ], "meta": { "current_page": 1, "from": 1, "last_page": 1, "per_page": 30, "to": 18, "total": 18 }, "response": true } } } } } } }, "/api/management/contacts/{contact}/restore": { "post": { "tags": [ "contacts", "restore" ], "summary": "Restaurar contato", "description": "Restaurar um contato que foi arquivado anteriormente.", "operationId": "restaurarContato", "responses": { "200": { "description": "Sucesso", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "Date": { "schema": { "type": "string" }, "example": "Thu, 15 Jan 2026 19:54:06 GMT" }, "X-Ratelimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-Ratelimit-Remaining": { "schema": { "type": "integer" }, "example": 157 }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" } } }, "example": { "response": true } } } } } }, "parameters": [ { "name": "contact", "in": "path", "required": true, "schema": { "type": "string" }, "example": "159" } ] }, "/api/management/contacts": { "get": { "tags": [ "contacts" ], "summary": "Listar contatos", "description": "Listar todos os contatos.", "operationId": "listarContatos", "responses": { "200": { "description": "200" } } }, "post": { "tags": [ "contacts" ], "summary": "Criar um contato", "description": "Criar um novo contato.", "operationId": "criarContato", "responses": { "200": { "description": "Sucesso", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "Date": { "schema": { "type": "string" }, "example": "Fri, 16 Jan 2026 18:03:26 GMT" }, "X-Ratelimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-Ratelimit-Remaining": { "schema": { "type": "integer" }, "example": 157 }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "name": { "type": "string", "maxLength": 255, "description": "Nome do contato" }, "role": { "type": "string", "description": "Cargo/função do contato" }, "email": { "type": "string", "maxLength": 254, "description": "E-mail do contato", "format": "email" }, "phone": { "type": "string", "maxLength": 30, "description": "Telefone do contato" }, "description": { "type": "string", "maxLength": 255, "description": "Descrição do contato" }, "customers": { "type": "object", "description": "Clientes vinculados ao contato. Envie to_add (clientes a adicionar) e to_rem (clientes a remover).", "properties": { "to_add": { "type": "array", "description": "IDs dos clientes a adicionar", "items": { "type": "string", "format": "uuid" } }, "to_rem": { "type": "array", "description": "IDs dos clientes a remover", "items": { "type": "string", "format": "uuid" } } } }, "tags": { "type": "object", "description": "Etiquetas do contato. Envie to_add (etiquetas a adicionar) e to_rem (etiquetas a remover).", "properties": { "to_add": { "type": "array", "description": "Etiquetas a adicionar: use id para vincular etiqueta existente ou name (e opcionalmente color) para criar nova", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "ID da etiqueta existente", "format": "uuid" }, "name": { "type": "string", "maxLength": 255, "description": "Nome da nova etiqueta" }, "color": { "type": "string", "pattern": "^#[0-9A-Fa-f]{6}$", "description": "Cor em hex (ex: #FF0000)" } } } }, "to_rem": { "type": "array", "description": "Etiquetas a remover", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "ID da etiqueta a remover", "format": "uuid" } } } } } }, "form_answers": { "type": "array", "description": "Respostas do formulário dinâmico", "items": {} } }, "required": [ "name" ] }, "example": { "name": "João Silva", "role": "Gerente de Vendas", "email": "joao.silva@exemplo.com.br", "phone": "+5591999990000", "description": "Contato principal da empresa", "customers": { "to_add": [], "to_rem": [] }, "tags": { "to_add": [], "to_rem": [] } } } } } } }, "/api/management/contacts/{contact}": { "get": { "tags": [ "contacts" ], "summary": "Obter contato específico", "description": "Obter detalhes de um contato específico.", "operationId": "obterContatoEspecFico", "responses": { "200": { "description": "200" } } }, "put": { "tags": [ "contacts" ], "summary": "Atualizar contato", "description": "Atualizar dados de um contato específico.", "operationId": "atualizarContato", "responses": { "200": { "description": "200" } } }, "delete": { "tags": [ "contacts" ], "summary": "Arquivar contato", "description": "Arquivar um contato específico.", "operationId": "arquivarContato", "responses": { "200": { "description": "200" } } }, "parameters": [ { "name": "contact", "in": "path", "required": true, "schema": { "type": "integer" }, "example": 159 } ] }, "/api/management/save-form": { "post": { "tags": [ "forms" ], "summary": "Salvar formulário", "description": "Cria um formulário ou, quando `id` é enviado, atualiza o título e os campos de um existente. A lista `edges` é sempre a definição completa: campo existente que não vier no payload é removido definitivamente. Tipos de campo e lógica condicional estão em [Criar um formulário](https://docs.olie.ai/guides/forms/creating-forms).", "operationId": "salvarFormulRio", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Formulário salvo.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição. Sempre true nas respostas bem-sucedidas." }, "form": { "type": "object", "description": "Dados do formulário.", "properties": { "id": { "type": "integer", "description": "ID do formulário." }, "title": { "type": "string", "description": "Título do formulário." }, "frame_id": { "type": "string", "description": "ID da conta dona do formulário.", "format": "uuid" }, "created_at": { "type": "string", "description": "Data de criação do formulário.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração do formulário.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data de exclusão do formulário. Nulo quando ativo.", "format": "date-time", "nullable": true }, "edges": { "type": "array", "description": "Campos do formulário, ordenados por index.", "items": { "type": "object", "description": "Campo do formulário.", "properties": { "id": { "type": "integer", "description": "ID do campo." }, "type": { "type": "string", "description": "Tipo do campo.", "enum": [ "short_text", "long_text", "rich_text", "attachment", "checkbox", "user", "date", "date_and_time", "email", "phone", "select", "radio", "currency", "number", "link", "time", "contact", "customer", "project", "counter", "matrix" ] }, "label": { "type": "string", "description": "Rótulo do campo." }, "index": { "type": "integer", "description": "Posição do campo no formulário (ordem crescente)." }, "help_text": { "type": "string", "description": "Texto de ajuda exibido junto ao campo.", "nullable": true }, "description": { "type": "string", "description": "Descrição do campo.", "nullable": true }, "options": { "description": "Opções do campo: lista de textos para select, radio e checkbox; objeto com rows/columns para matrix; lista vazia nos demais tipos.", "items": { "type": "string", "description": "Texto de uma opção." }, "anyOf": [ { "type": "array", "items": {} }, { "type": "object" } ] }, "initial_value": { "description": "Valor pré-preenchido do campo, no mesmo formato de uma resposta daquele tipo.", "nullable": true, "anyOf": [ { "type": "string" }, { "type": "number" }, { "type": "array", "items": {} }, { "type": "object" } ] }, "required": { "type": "boolean", "description": "Se o preenchimento é obrigatório." }, "custom_validation": { "type": "string", "description": "Expressão regular que a resposta precisa atender.", "nullable": true }, "conditional": { "description": "Campo legado, sempre nulo. As regras ficam em conditionals.", "nullable": true }, "form_id": { "type": "integer", "description": "ID do formulário ao qual o campo pertence." }, "created_at": { "type": "string", "description": "Data de criação do campo.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração do campo.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data em que o campo foi arquivado. Nulo quando ativo.", "format": "date-time", "nullable": true }, "is_multiple": { "type": "boolean", "description": "Se o campo aceita mais de um valor (ex.: vários links ou usuários)." }, "logical_operator": { "type": "string", "description": "Como as regras condicionais do campo se combinam.", "enum": [ "and", "or" ] }, "is_migrated": { "type": "boolean", "description": "Marcador interno de migração de dados. Pode ser ignorado." }, "conditional_action": { "type": "string", "description": "O que acontece com o campo quando as regras são atendidas: show (exibe) ou hide (oculta). Nulo quando não há lógica condicional.", "enum": [ "show", "hide", null ], "nullable": true }, "conditionals": { "type": "array", "description": "Regras condicionais do campo.", "items": { "type": "object", "description": "Regra condicional do campo.", "properties": { "id": { "type": "integer", "description": "ID da regra." }, "form_edge_id": { "type": "integer", "description": "ID do campo que é mostrado ou ocultado pela regra." }, "target_id": { "type": "integer", "description": "ID do campo cuja resposta é avaliada." }, "operator": { "type": "string", "description": "Operador de comparação.", "enum": [ "equals", "not_equals", "contains", "not_contains", "greater_than", "less_than", "is_empty", "is_not_empty", "starts_with", "ends_with", "greater_than_or_equals", "less_than_or_equals" ] }, "value": { "description": "Valor comparado com a resposta do campo avaliado.", "items": { "type": "string", "description": "Um dos valores comparados." }, "nullable": true, "anyOf": [ { "type": "string" }, { "type": "number" }, { "type": "array", "items": {} } ] }, "created_at": { "type": "string", "description": "Data de criação da regra.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração da regra.", "format": "date-time" } } } } } } } } } } }, "example": { "response": true, "form": { "title": "Briefing de projeto", "frame_id": "01a0252b-d865-71af-a0a2-d4e168d1ffe5", "updated_at": "2026-09-22T21:40:47.000000Z", "created_at": "2026-09-22T21:40:47.000000Z", "id": 69, "edges": [ { "id": 112, "type": "short_text", "label": "Objetivo do projeto", "index": 0, "help_text": "Descreva em uma frase.", "description": null, "options": [], "initial_value": null, "required": true, "custom_validation": null, "conditional": null, "form_id": 69, "created_at": "2026-09-22T21:40:47.000000Z", "updated_at": "2026-09-22T21:40:47.000000Z", "deleted_at": null, "is_multiple": false, "logical_operator": "and", "is_migrated": false, "conditional_action": null, "conditionals": [] }, { "id": 113, "type": "select", "label": "Canal de venda", "index": 1, "help_text": null, "description": null, "options": [ "Loja física", "E-commerce", "Marketplace" ], "initial_value": null, "required": false, "custom_validation": null, "conditional": null, "form_id": 69, "created_at": "2026-09-22T21:40:47.000000Z", "updated_at": "2026-09-22T21:40:47.000000Z", "deleted_at": null, "is_multiple": false, "logical_operator": "and", "is_migrated": false, "conditional_action": null, "conditionals": [] }, { "id": 114, "type": "link", "label": "URL da loja", "index": 2, "help_text": null, "description": null, "options": [], "initial_value": null, "required": false, "custom_validation": null, "conditional": null, "form_id": 69, "created_at": "2026-09-22T21:40:47.000000Z", "updated_at": "2026-09-22T21:40:47.000000Z", "deleted_at": null, "is_multiple": false, "logical_operator": "and", "is_migrated": false, "conditional_action": "show", "conditionals": [ { "id": 1, "form_edge_id": 114, "target_id": 113, "operator": "equals", "value": "E-commerce", "created_at": "2026-09-22T21:40:47.000000Z", "updated_at": "2026-09-22T21:40:47.000000Z" } ] } ] } } } } }, "422": { "description": "Validação falhou", "content": { "application/json": { "schema": { "type": "object", "description": "Resposta de erro.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição. Sempre false em erros." }, "message": { "type": "string", "description": "Código do erro para tratamento no cliente: validation_errors." }, "error": { "type": "string", "description": "Descrição legível do erro." }, "validation": { "type": "object", "description": "Mensagens de erro agrupadas pelo caminho do atributo inválido.", "additionalProperties": { "type": "array", "description": "Mensagens do atributo.", "items": { "type": "string", "description": "Mensagem de erro." } } } } }, "example": { "response": false, "message": "validation_errors", "error": "The título must be at least 3 characters. (and 1 more error)", "validation": { "title": [ "The título must be at least 3 characters." ], "edges": [ "The edges must have at least 1 items." ] } } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "description": "Definição completa do formulário.", "additionalProperties": false, "required": [ "title", "edges" ], "properties": { "id": { "type": "integer", "description": "ID do formulário a atualizar. Omita ou envie nulo para criar um novo.", "nullable": true }, "title": { "type": "string", "description": "Título do formulário (3 a 255 caracteres).", "minLength": 3, "maxLength": 255 }, "edges": { "type": "array", "description": "Lista completa de campos, na ordem desejada. Campos existentes que não forem enviados são removidos definitivamente.", "minItems": 1, "items": { "type": "object", "description": "Campo do formulário.", "required": [ "label", "type" ], "properties": { "id": { "description": "ID do campo existente (número) para atualizá-lo. Em campo novo, envie um ID temporário em texto (ex.: \"CREATE1\") para poder referenciá-lo em conditionals.target_id no mesmo payload.", "nullable": true, "anyOf": [ { "type": "integer" }, { "type": "string" } ] }, "label": { "type": "string", "description": "Rótulo do campo (até 255 caracteres, sem HTML).", "maxLength": 255 }, "type": { "type": "string", "description": "Tipo do campo.", "enum": [ "short_text", "long_text", "rich_text", "attachment", "checkbox", "user", "date", "date_and_time", "email", "phone", "select", "radio", "currency", "number", "link", "time", "contact", "customer", "project", "counter", "matrix" ] }, "index": { "type": "integer", "description": "Posição do campo no formulário." }, "required": { "type": "boolean", "description": "Se o preenchimento é obrigatório." }, "help_text": { "type": "string", "description": "Texto de ajuda (até 255 caracteres).", "maxLength": 255, "nullable": true }, "description": { "type": "string", "description": "Descrição do campo (até 255 caracteres).", "maxLength": 255, "nullable": true }, "custom_validation": { "type": "string", "description": "Expressão regular que a resposta precisa atender (até 255 caracteres).", "nullable": true }, "options": { "description": "Opções do campo: lista de textos para select, radio e checkbox; objeto com rows/columns para matrix. Opções removidas são apagadas das respostas já dadas.", "items": { "type": "string", "description": "Texto de uma opção." }, "properties": { "rows": { "type": "array", "description": "Linhas da matriz (1 a 100).", "items": { "type": "object", "description": "Linha da matriz.", "properties": { "key": { "type": "string", "description": "Chave única da linha (1 a 64 caracteres)." }, "label": { "type": "string", "description": "Rótulo exibido na linha (1 a 255 caracteres)." } } } }, "columns": { "type": "array", "description": "Colunas da matriz (1 a 20).", "items": { "type": "object", "description": "Coluna da matriz.", "properties": { "key": { "type": "string", "description": "Chave única da coluna (1 a 64 caracteres). O tipo de uma coluna existente não pode mudar." }, "label": { "type": "string", "description": "Rótulo exibido na coluna (1 a 255 caracteres)." }, "type": { "type": "string", "description": "Tipo da célula. Aceita apenas tipos simples.", "enum": [ "short_text", "long_text", "number", "currency", "date", "date_and_time", "time", "email", "phone", "link", "select", "radio", "checkbox" ] }, "options": { "type": "array", "description": "Opções da célula (1 a 50). Obrigatório para select, radio e checkbox; proibido nos demais tipos.", "items": { "type": "string", "description": "Texto de uma opção." } }, "required": { "type": "boolean", "description": "Se a célula é obrigatória." }, "is_multiple": { "type": "boolean", "description": "Permite vários links na célula. Só para colunas do tipo link." }, "description": { "type": "string", "description": "Descrição da coluna (até 255 caracteres).", "nullable": true }, "help_text": { "type": "string", "description": "Texto de ajuda da coluna (até 255 caracteres).", "nullable": true }, "custom_validation": { "type": "string", "description": "Expressão regular aplicada à célula. Só para short_text, long_text, email, phone, currency e number.", "nullable": true } }, "required": [ "key", "label", "type" ] } } }, "anyOf": [ { "type": "array", "items": {} }, { "type": "object" } ] }, "is_multiple": { "type": "boolean", "description": "Se o campo aceita mais de um valor.", "nullable": true }, "initial_value": { "description": "Valor pré-preenchido, no formato de uma resposta daquele tipo. É validado como uma resposta.", "nullable": true, "anyOf": [ { "type": "string" }, { "type": "number" }, { "type": "array", "items": {} }, { "type": "object" } ] }, "conditional_action": { "type": "string", "description": "O que fazer com o campo quando as regras são atendidas.", "enum": [ "show", "hide", null ], "nullable": true }, "logical_operator": { "type": "string", "description": "Como combinar as regras do campo: and (todas) ou or (qualquer uma).", "enum": [ "and", "or", null ], "nullable": true }, "conditionals": { "type": "array", "description": "Regras que controlam a exibição do campo. Substituem as regras anteriores a cada salvamento.", "items": { "type": "object", "description": "Regra condicional.", "required": [ "target_id" ], "properties": { "target_id": { "description": "Campo cuja resposta é avaliada: ID existente ou ID temporário de um campo novo do mesmo payload. Campos matrix não podem ser avaliados.", "anyOf": [ { "type": "integer" }, { "type": "string" } ] }, "operator": { "type": "string", "description": "Operador de comparação. Padrão: equals.", "enum": [ "equals", "not_equals", "contains", "not_contains", "greater_than", "less_than", "is_empty", "is_not_empty", "starts_with", "ends_with", "greater_than_or_equals", "less_than_or_equals" ] }, "value": { "description": "Valor comparado. Lista aceita apenas textos ou números.", "items": { "type": "string", "description": "Um dos valores comparados." }, "nullable": true, "anyOf": [ { "type": "string" }, { "type": "number" }, { "type": "array", "items": {} } ] } } } }, "action": { "type": "string", "description": "Ação sobre um campo existente: archive arquiva (oculta sem apagar as respostas) e restore reativa um campo arquivado.", "enum": [ "archive", "restore" ] } } } } } }, "example": { "id": null, "title": "Briefing de projeto", "edges": [ { "id": "CREATE1", "label": "Objetivo do projeto", "type": "short_text", "index": 0, "required": true, "help_text": "Descreva em uma frase.", "description": null, "custom_validation": null }, { "id": "CREATE2", "label": "Canal de venda", "type": "select", "index": 1, "required": false, "options": [ "Loja física", "E-commerce", "Marketplace" ] }, { "id": "CREATE3", "label": "URL da loja", "type": "link", "index": 2, "required": false, "conditional_action": "show", "logical_operator": "and", "conditionals": [ { "target_id": "CREATE2", "operator": "equals", "value": "E-commerce" } ] } ] } } } } } }, "/api/management/get-forms": { "get": { "tags": [ "forms" ], "summary": "Listar formulários", "description": "Lista todos os formulários da conta, sem paginação, com seus campos e as contagens de campos e de respostas. Por padrão traz só os ativos. Conceito de formulário: [Formulários dinâmicos](https://docs.olie.ai/guides/forms/overview).", "operationId": "listarFormulRios", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Formulários da conta.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição. Sempre true nas respostas bem-sucedidas." }, "forms": { "type": "array", "description": "Formulários encontrados.", "items": { "type": "object", "description": "Dados do formulário.", "properties": { "id": { "type": "integer", "description": "ID do formulário." }, "title": { "type": "string", "description": "Título do formulário." }, "frame_id": { "type": "string", "description": "ID da conta dona do formulário.", "format": "uuid" }, "created_at": { "type": "string", "description": "Data de criação do formulário.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração do formulário.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data de exclusão do formulário. Nulo quando ativo.", "format": "date-time", "nullable": true }, "edges_count": { "type": "integer", "description": "Quantidade de campos ativos do formulário." }, "answers_count": { "type": "integer", "description": "Quantidade de registros (projetos, clientes, etc.) com ao menos uma resposta no formulário." }, "edges": { "type": "array", "description": "Campos do formulário, ordenados por index.", "items": { "type": "object", "description": "Campo do formulário.", "properties": { "id": { "type": "integer", "description": "ID do campo." }, "type": { "type": "string", "description": "Tipo do campo.", "enum": [ "short_text", "long_text", "rich_text", "attachment", "checkbox", "user", "date", "date_and_time", "email", "phone", "select", "radio", "currency", "number", "link", "time", "contact", "customer", "project", "counter", "matrix" ] }, "label": { "type": "string", "description": "Rótulo do campo." }, "index": { "type": "integer", "description": "Posição do campo no formulário (ordem crescente)." }, "help_text": { "type": "string", "description": "Texto de ajuda exibido junto ao campo.", "nullable": true }, "description": { "type": "string", "description": "Descrição do campo.", "nullable": true }, "options": { "description": "Opções do campo: lista de textos para select, radio e checkbox; objeto com rows/columns para matrix; lista vazia nos demais tipos.", "items": { "type": "string", "description": "Texto de uma opção." }, "anyOf": [ { "type": "array", "items": {} }, { "type": "object" } ] }, "initial_value": { "description": "Valor pré-preenchido do campo, no mesmo formato de uma resposta daquele tipo.", "nullable": true, "anyOf": [ { "type": "string" }, { "type": "number" }, { "type": "array", "items": {} }, { "type": "object" } ] }, "required": { "type": "boolean", "description": "Se o preenchimento é obrigatório." }, "custom_validation": { "type": "string", "description": "Expressão regular que a resposta precisa atender.", "nullable": true }, "conditional": { "description": "Campo legado, sempre nulo. As regras ficam em conditionals.", "nullable": true }, "form_id": { "type": "integer", "description": "ID do formulário ao qual o campo pertence." }, "created_at": { "type": "string", "description": "Data de criação do campo.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração do campo.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data em que o campo foi arquivado. Nulo quando ativo.", "format": "date-time", "nullable": true }, "is_multiple": { "type": "boolean", "description": "Se o campo aceita mais de um valor (ex.: vários links ou usuários)." }, "logical_operator": { "type": "string", "description": "Como as regras condicionais do campo se combinam.", "enum": [ "and", "or" ] }, "is_migrated": { "type": "boolean", "description": "Marcador interno de migração de dados. Pode ser ignorado." }, "conditional_action": { "type": "string", "description": "O que acontece com o campo quando as regras são atendidas: show (exibe) ou hide (oculta). Nulo quando não há lógica condicional.", "enum": [ "show", "hide", null ], "nullable": true }, "conditionals": { "type": "array", "description": "Regras condicionais do campo.", "items": { "type": "object", "description": "Regra condicional do campo.", "properties": { "id": { "type": "integer", "description": "ID da regra." }, "form_edge_id": { "type": "integer", "description": "ID do campo que é mostrado ou ocultado pela regra." }, "target_id": { "type": "integer", "description": "ID do campo cuja resposta é avaliada." }, "operator": { "type": "string", "description": "Operador de comparação.", "enum": [ "equals", "not_equals", "contains", "not_contains", "greater_than", "less_than", "is_empty", "is_not_empty", "starts_with", "ends_with", "greater_than_or_equals", "less_than_or_equals" ] }, "value": { "description": "Valor comparado com a resposta do campo avaliado.", "items": { "type": "string", "description": "Um dos valores comparados." }, "nullable": true, "anyOf": [ { "type": "string" }, { "type": "number" }, { "type": "array", "items": {} } ] } } } } } } } } } } } }, "example": { "response": true, "forms": [ { "id": 69, "title": "Briefing de projeto", "frame_id": "01a0252b-d865-71af-a0a2-d4e168d1ffe5", "created_at": "2026-09-22T21:40:47.000000Z", "updated_at": "2026-09-22T21:40:56.000000Z", "deleted_at": null, "edges_count": 3, "answers_count": 0, "edges": [ { "id": 112, "type": "short_text", "label": "Objetivo do projeto", "index": 0, "help_text": "Descreva em uma frase.", "description": null, "options": [], "initial_value": null, "required": true, "custom_validation": null, "conditional": null, "form_id": 69, "created_at": "2026-09-22T21:40:47.000000Z", "updated_at": "2026-09-22T21:40:47.000000Z", "deleted_at": null, "is_multiple": false, "logical_operator": "and", "is_migrated": false, "conditional_action": null, "conditionals": [] }, { "id": 113, "type": "select", "label": "Canal de venda", "index": 1, "help_text": null, "description": null, "options": [ "Loja física", "E-commerce", "Marketplace" ], "initial_value": null, "required": false, "custom_validation": null, "conditional": null, "form_id": 69, "created_at": "2026-09-22T21:40:47.000000Z", "updated_at": "2026-09-22T21:40:47.000000Z", "deleted_at": null, "is_multiple": false, "logical_operator": "and", "is_migrated": false, "conditional_action": null, "conditionals": [] }, { "id": 114, "type": "link", "label": "URL da loja", "index": 2, "help_text": null, "description": null, "options": [], "initial_value": null, "required": false, "custom_validation": null, "conditional": null, "form_id": 69, "created_at": "2026-09-22T21:40:47.000000Z", "updated_at": "2026-09-22T21:40:47.000000Z", "deleted_at": null, "is_multiple": false, "logical_operator": "and", "is_migrated": false, "conditional_action": "show", "conditionals": [ { "id": 1, "form_edge_id": 114, "operator": "equals", "value": "E-commerce", "target_id": 113 } ] } ] } ] } } } } }, "parameters": [ { "name": "search", "in": "query", "description": "Busca parcial no título do formulário ou no rótulo dos campos. Com busca, `edges` traz apenas os campos cujo rótulo casou.", "schema": { "type": "string" }, "example": "" }, { "name": "id", "in": "query", "description": "ID de um formulário ou de um campo. Tem prioridade sobre `search`; `edges` traz apenas o campo com esse ID.", "schema": { "type": "string" }, "example": "" }, { "name": "filter[trashed]", "in": "query", "description": "Formulários excluídos: `with` (ativos e excluídos) ou `only` (só excluídos). Omita para trazer só os ativos.", "schema": { "type": "string" }, "example": "" } ] } }, "/api/management/get-form": { "post": { "tags": [ "forms" ], "summary": "Obter formulário", "description": "Retorna um formulário com todos os seus campos, inclusive os arquivados (com `deleted_at` preenchido), e as regras condicionais de cada campo.", "operationId": "obterFormulRio", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Formulário encontrado.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição. Sempre true nas respostas bem-sucedidas." }, "form": { "type": "object", "description": "Dados do formulário.", "properties": { "id": { "type": "integer", "description": "ID do formulário." }, "title": { "type": "string", "description": "Título do formulário." }, "frame_id": { "type": "string", "description": "ID da conta dona do formulário.", "format": "uuid" }, "created_at": { "type": "string", "description": "Data de criação do formulário.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração do formulário.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data de exclusão do formulário. Nulo quando ativo.", "format": "date-time", "nullable": true }, "edges": { "type": "array", "description": "Campos do formulário, ordenados por index.", "items": { "type": "object", "description": "Campo do formulário.", "properties": { "id": { "type": "integer", "description": "ID do campo." }, "type": { "type": "string", "description": "Tipo do campo.", "enum": [ "short_text", "long_text", "rich_text", "attachment", "checkbox", "user", "date", "date_and_time", "email", "phone", "select", "radio", "currency", "number", "link", "time", "contact", "customer", "project", "counter", "matrix" ] }, "label": { "type": "string", "description": "Rótulo do campo." }, "index": { "type": "integer", "description": "Posição do campo no formulário (ordem crescente)." }, "help_text": { "type": "string", "description": "Texto de ajuda exibido junto ao campo.", "nullable": true }, "description": { "type": "string", "description": "Descrição do campo.", "nullable": true }, "options": { "description": "Opções do campo: lista de textos para select, radio e checkbox; objeto com rows/columns para matrix; lista vazia nos demais tipos.", "items": { "type": "string", "description": "Texto de uma opção." }, "anyOf": [ { "type": "array", "items": {} }, { "type": "object" } ] }, "initial_value": { "description": "Valor pré-preenchido do campo, no mesmo formato de uma resposta daquele tipo.", "nullable": true, "anyOf": [ { "type": "string" }, { "type": "number" }, { "type": "array", "items": {} }, { "type": "object" } ] }, "required": { "type": "boolean", "description": "Se o preenchimento é obrigatório." }, "custom_validation": { "type": "string", "description": "Expressão regular que a resposta precisa atender.", "nullable": true }, "conditional": { "description": "Campo legado, sempre nulo. As regras ficam em conditionals.", "nullable": true }, "form_id": { "type": "integer", "description": "ID do formulário ao qual o campo pertence." }, "created_at": { "type": "string", "description": "Data de criação do campo.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração do campo.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data em que o campo foi arquivado. Nulo quando ativo.", "format": "date-time", "nullable": true }, "is_multiple": { "type": "boolean", "description": "Se o campo aceita mais de um valor (ex.: vários links ou usuários)." }, "logical_operator": { "type": "string", "description": "Como as regras condicionais do campo se combinam.", "enum": [ "and", "or" ] }, "is_migrated": { "type": "boolean", "description": "Marcador interno de migração de dados. Pode ser ignorado." }, "conditional_action": { "type": "string", "description": "O que acontece com o campo quando as regras são atendidas: show (exibe) ou hide (oculta). Nulo quando não há lógica condicional.", "enum": [ "show", "hide", null ], "nullable": true }, "conditionals": { "type": "array", "description": "Regras condicionais do campo.", "items": { "type": "object", "description": "Regra condicional do campo.", "properties": { "id": { "type": "integer", "description": "ID da regra." }, "form_edge_id": { "type": "integer", "description": "ID do campo que é mostrado ou ocultado pela regra." }, "target_id": { "type": "integer", "description": "ID do campo cuja resposta é avaliada." }, "operator": { "type": "string", "description": "Operador de comparação.", "enum": [ "equals", "not_equals", "contains", "not_contains", "greater_than", "less_than", "is_empty", "is_not_empty", "starts_with", "ends_with", "greater_than_or_equals", "less_than_or_equals" ] }, "value": { "description": "Valor comparado com a resposta do campo avaliado.", "items": { "type": "string", "description": "Um dos valores comparados." }, "nullable": true, "anyOf": [ { "type": "string" }, { "type": "number" }, { "type": "array", "items": {} } ] } } } } } } } } } } }, "example": { "response": true, "form": { "id": 69, "title": "Briefing de projeto", "frame_id": "01a0252b-d865-71af-a0a2-d4e168d1ffe5", "created_at": "2026-09-22T21:40:47.000000Z", "updated_at": "2026-09-22T21:40:47.000000Z", "deleted_at": null, "edges": [ { "id": 112, "type": "short_text", "label": "Objetivo do projeto", "index": 0, "help_text": "Descreva em uma frase.", "description": null, "options": [], "initial_value": null, "required": true, "custom_validation": null, "conditional": null, "form_id": 69, "created_at": "2026-09-22T21:40:47.000000Z", "updated_at": "2026-09-22T21:40:47.000000Z", "deleted_at": null, "is_multiple": false, "logical_operator": "and", "is_migrated": false, "conditional_action": null, "conditionals": [] }, { "id": 113, "type": "select", "label": "Canal de venda", "index": 1, "help_text": null, "description": null, "options": [ "Loja física", "E-commerce", "Marketplace" ], "initial_value": null, "required": false, "custom_validation": null, "conditional": null, "form_id": 69, "created_at": "2026-09-22T21:40:47.000000Z", "updated_at": "2026-09-22T21:40:47.000000Z", "deleted_at": null, "is_multiple": false, "logical_operator": "and", "is_migrated": false, "conditional_action": null, "conditionals": [] }, { "id": 114, "type": "link", "label": "URL da loja", "index": 2, "help_text": null, "description": null, "options": [], "initial_value": null, "required": false, "custom_validation": null, "conditional": null, "form_id": 69, "created_at": "2026-09-22T21:40:47.000000Z", "updated_at": "2026-09-22T21:40:47.000000Z", "deleted_at": null, "is_multiple": false, "logical_operator": "and", "is_migrated": false, "conditional_action": "show", "conditionals": [ { "id": 1, "form_edge_id": 114, "operator": "equals", "value": "E-commerce", "target_id": 113 } ] } ] } } } } }, "404": { "description": "Não encontrado", "content": { "application/json": { "schema": { "type": "object", "description": "Resposta de erro.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição. Sempre false em erros." }, "message": { "type": "string", "description": "Código do erro para tratamento no cliente: form_model_not_found." }, "error": { "type": "string", "description": "Descrição legível do erro." } } }, "example": { "response": false, "message": "form_model_not_found", "error": "No query results for model [App\\Models\\Form] 999999" } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "description": "Identificação do formulário.", "additionalProperties": false, "required": [ "form_id" ], "properties": { "form_id": { "type": "integer", "description": "ID do formulário." } } }, "example": { "form_id": null } } } } } }, "/api/management/delete-form": { "post": { "tags": [ "forms" ], "summary": "Excluir formulário", "description": "Exclui o formulário (é possível restaurá-lo depois) e o retira dos projetos em que estava como formulário avulso e do vínculo de formulário padrão de objeto. Formulário usado por um formulário público ou por uma solicitação não é excluído: a resposta vem com status 200 e `response: false` — ver [Formulários públicos](https://docs.olie.ai/guides/forms/public-forms).", "operationId": "deletarFormulRio", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Confirmação da operação.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição. Sempre true nas respostas bem-sucedidas." } } }, "examples": { "Sucesso": { "value": { "response": true } }, "Vinculado a publicação": { "value": { "response": false, "message": "the_form_is_linked_to_a_publication" } } } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "description": "Identificação do formulário.", "additionalProperties": false, "required": [ "form_id" ], "properties": { "form_id": { "type": "integer", "description": "ID do formulário." } } }, "example": { "form_id": null } } } } } }, "/api/management/set-model-forms": { "post": { "tags": [ "forms" ], "summary": "Definir formulários dos objetos", "description": "Define o formulário padrão de cada tipo de objeto da conta (projeto, cliente, contato e usuário). A lista substitui a configuração atual inteira: objeto que não vier fica sem formulário. Ver [Onde um formulário pode ser anexado](https://docs.olie.ai/guides/forms/overview).", "operationId": "definirFormulRiosDoObjeto", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Confirmação da operação.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição. Sempre true nas respostas bem-sucedidas." } } }, "example": { "response": true } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "description": "Formulários padrão de cada objeto da conta.", "additionalProperties": false, "properties": { "forms": { "type": "array", "description": "Lista completa de vínculos. Objetos ausentes ficam sem formulário; lista vazia remove todos.", "items": { "type": "object", "description": "Vínculo de um formulário a um tipo de objeto.", "required": [ "id", "class" ], "properties": { "id": { "type": "integer", "description": "ID do formulário." }, "class": { "type": "string", "description": "Tipo de objeto, sem repetição na lista.", "enum": [ "App\\Models\\Project", "App\\Models\\Customer", "App\\Models\\Contact", "App\\Models\\FrameRelationship" ] } } }, "nullable": true } } }, "example": { "forms": [ { "id": null, "class": "App\\Models\\Project" } ] } } } } } }, "/api/management/dynamic-forms/pivot-accessor/reply": { "post": { "tags": [ "dynamic-forms", "pivot-accessor", "reply" ], "summary": "Responder um formulário dinâmico através de uma URL assinada", "description": "Permite responder um formulário dinâmico através de uma URL assinada de pivot accessor. Valida expiração e uso único antes de processar a resposta.", "operationId": "responderFormulRioDinMicoAtravSDeUmaUrlAssinada", "responses": { "200": { "description": "200" } } } }, "/api/management/dynamic-forms/pivot-accessor/decode": { "get": { "tags": [ "dynamic-forms", "pivot-accessor", "decode" ], "summary": "Decodificar a URL assinada de pivot accessor", "description": "Decodifica uma URL assinada de pivot accessor e retorna as informações do formulário, respostas existentes e URL de resposta. Valida expiração e uso único.", "operationId": "decodificarUrlAssinadaDePivotAccessor", "responses": { "200": { "description": "200" } } } }, "/api/management/dynamic-forms/pivot-accessor/url-generate": { "post": { "tags": [ "dynamic-forms", "pivot-accessor", "url-generate" ], "summary": "Gerar uma URL assinada para acesso temporário a um formulário dinâmico", "description": "Gera URLs assinadas para acesso temporário a formulários dinâmicos através de um pivot accessor, permitindo controle de expiração e acesso único.", "operationId": "gerarUrlAssinadaParaAcessoTemporRioAUmFormulRioDinMico", "responses": { "200": { "description": "200" } } } }, "/api/management/dynamic-forms-answers-file": { "post": { "tags": [ "dynamic-forms", "dynamic-forms-answers-file" ], "summary": "Enviar um arquivo de resposta de formulário dinâmico", "description": "Enviar arquivo como resposta em um formulário dinâmico.", "operationId": "enviarArquivoDeRespostaDeFormulRioDinMico", "responses": { "200": { "description": "200" } } } }, "/api/management/dynamic-forms/{model}/{model_id}": { "get": { "tags": [ "dynamic-forms" ], "summary": "Listar todos os formulários dinâmicos relacionados a um modelo específico", "description": "Listar todos os formulários dinâmicos relacionados a um modelo específico", "operationId": "listarTodosOsFormulRiosDinMicosRelacionadosAUmModeloEspecFico", "responses": { "200": { "description": "200" } } }, "parameters": [ { "name": "model", "in": "path", "required": true, "schema": { "type": "string" }, "example": "string" }, { "name": "model_id", "in": "path", "required": true, "schema": { "type": "string" }, "example": "string" } ] }, "/api/management/dynamic-forms/set-form-answers": { "post": { "summary": "Responder um formulário dinâmico", "responses": { "200": { "description": "Resposta: Formulário objeto projeto", "headers": { "Date": { "schema": { "type": "string" }, "example": "Tue, 16 Dec 2025 14:49:55 GMT" }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" }, "Connection": { "schema": { "type": "string" }, "example": "keep-alive" }, "Cache-Control": { "schema": { "type": "string" }, "example": "private, must-revalidate" }, "pragma": { "schema": { "type": "string" }, "example": "no-cache" }, "expires": { "schema": { "type": "integer" }, "example": -1 }, "X-RateLimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-RateLimit-Remaining": { "schema": { "type": "integer" }, "example": 154 }, "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "edges": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "integer" }, "label": { "type": "string" }, "answer": { "type": "string" }, "answer_markdown": { "type": "string", "example": "**Hello**", "description": "Presente apenas em campos `rich_text` e `matrix`. Para `rich_text`, Markdown derivado do documento TipTap em `answer` (null se sem resposta, documento vazio, JSON inválido ou árvore acima do limite de conversão). Para `matrix`, tabela Markdown com rótulos de linhas/colunas em vez das keys opacas de `answer` (null se sem resposta, inválida ou vazia). Campo só de leitura — a escrita continua em TipTap JSON / objeto matriz via set-form-answers." }, "model": { "type": "string" }, "answered_by": { "type": "string" }, "updated_at": { "type": "string", "format": "date-time" } } } } } }, "example": { "response": true, "edges": [ { "id": 2130, "label": "Texto curto", "answer": "Exemplo de resposta no formulário do objeto projeto: Voluptates ipsam amet vel mollitia.", "model": "Project", "answered_by": "019aeaa3-2370-731c-9008-be759795f449", "updated_at": "2025-12-16T14:49:55.000000Z" }, { "id": 2131, "label": "Texto longo", "answer": "Exemplo de resposta no formulário do objeto projeto: Quia perspiciatis voluptates maiores.", "model": "Project", "answered_by": "019aeaa3-2370-731c-9008-be759795f449", "updated_at": "2025-12-16T14:49:55.000000Z" }, { "id": 2132, "label": "Notas", "answer": "{\"type\":\"doc\",\"content\":[{\"type\":\"paragraph\",\"content\":[{\"type\":\"text\",\"marks\":[{\"type\":\"bold\"}],\"text\":\"Hello\"}]}]}", "answer_markdown": "**Hello**", "model": "Project", "answered_by": "019aeaa3-2370-731c-9008-be759795f449", "updated_at": "2025-12-16T14:49:55.000000Z" } ] } } } }, "401": { "description": "Erro: Não autorizado", "headers": { "Date": { "schema": { "type": "string" }, "example": "Tue, 16 Dec 2025 15:01:12 GMT" }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" }, "Connection": { "schema": { "type": "string" }, "example": "keep-alive" }, "Cache-Control": { "schema": { "type": "string" }, "example": "private, must-revalidate" }, "pragma": { "schema": { "type": "string" }, "example": "no-cache" }, "expires": { "schema": { "type": "integer" }, "example": -1 }, "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" } } }, "404": { "description": "Erro: Objeto não encontrado", "headers": { "Date": { "schema": { "type": "string" }, "example": "Tue, 16 Dec 2025 15:03:37 GMT" }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" }, "Connection": { "schema": { "type": "string" }, "example": "keep-alive" }, "Cache-Control": { "schema": { "type": "string" }, "example": "private, must-revalidate" }, "X-RateLimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-RateLimit-Remaining": { "schema": { "type": "integer" }, "example": 159 }, "pragma": { "schema": { "type": "string" }, "example": "no-cache" }, "expires": { "schema": { "type": "integer" }, "example": -1 }, "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "message": { "type": "string" }, "error": { "type": "string" } } }, "example": { "response": false, "message": "project_model_not_found", "error": "No query results for model [App\\Models\\Project] 00000000-0000-0000-0000-000000000000" } } } }, "422": { "description": "Erro: Objeto sem relação com o formulário", "headers": { "Date": { "schema": { "type": "string" }, "example": "Tue, 16 Dec 2025 15:06:23 GMT" }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" }, "Connection": { "schema": { "type": "string" }, "example": "keep-alive" }, "Cache-Control": { "schema": { "type": "string" }, "example": "private, must-revalidate" }, "X-RateLimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-RateLimit-Remaining": { "schema": { "type": "integer" }, "example": 154 }, "pragma": { "schema": { "type": "string" }, "example": "no-cache" }, "expires": { "schema": { "type": "integer" }, "example": -1 }, "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "service": { "type": "string" }, "message": { "type": "string" }, "error": { "type": "string" } } }, "example": { "response": false, "service": "App\\Exceptions\\Services\\Form\\FormException", "message": "father_df_options_has_none_compatible_possibility", "error": "The father class possibilities has none compatible form with given attributes" } } } } }, "tags": [ "dynamic-forms" ], "description": "Responder um formulário dinâmico. Essa requisição recebe dois principais atributos:\n\n- Identificação do formulário (`target`): Aqui é usado um objeto com propriedades variáveis, são usados para identificar qual formulário será respondido.\n \n- Respostas (`answers`): Um array com objetos, cada objeto contendo `id` e `answer`, sendo o ID do campo do formulário e answer sendo a resposta que este campo receberá.\n\nA resposta de sucesso devolve os edges no mesmo formato de get-form-answers: campos `rich_text` e `matrix` incluem `answer_markdown` (só leitura).", "requestBody": { "content": { "application/json": { "schema": { "description": "Dados para responder um formulário dinâmico", "title": "SetFormAnswers", "type": "object", "properties": { "target": { "type": "object", "title": "Target", "description": "Objeto que descreve o alvo do formulário dinâmico", "properties": { "pivot_class": { "type": "string", "enum": [ "project", "contact", "customer", "projectfunnelassignment", "projectlooseform", "projectstepform" ], "example": "project" }, "father_class": { "type": "string", "enum": [ "project", "contact", "customer", "projectfunnelassignment", "projectlooseform", "projectstepform" ], "example": "project" }, "form_id": { "type": "integer", "example": 43, "description": "ID do formulário" }, "related_model_attribute_id": { "type": "string", "example": "9ee8c42a-909e-4502-a1e9-4431245c5455", "description": "Necessário quando pivot_class é 'Project'.", "format": "uuid" }, "id": { "example": "9ee8c42a-909e-4502-a1e9-4431245c5455", "description": "Necessário quando pivot_class é 'Project' ou 'ProjectLooseForm'. É o ID da classe que detém o formulário", "anyOf": [ { "type": "string" }, { "type": "integer" } ] }, "project_funnel_id": { "type": "integer", "example": 129, "description": "Necessário quando pivot_class é 'ProjectFunnelAssignment'." }, "project_id": { "type": "string", "example": "9ee8c42a-909e-4502-a1e9-4431245c5455", "description": "Necessário quando pivot_class é 'ProjectFunnelAssignment', 'ProjectLooseForm' ou 'ProjectStepForm'.", "format": "uuid" }, "funnel_step_id": { "type": "integer", "example": 402, "description": "Necessário quando pivot_class é 'ProjectStepForm'." }, "father_id": { "type": "string", "example": "9ee8c42a-909e-4502-a1e9-4431245c5455", "format": "uuid" } }, "required": [ "father_class", "father_id", "pivot_class", "form_id" ] }, "form_answers": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "integer", "example": 179, "description": "ID do campo do formulário" }, "answer": { "example": "exemple", "anyOf": [ { "type": "string" }, { "type": "array", "items": {} }, { "type": "object" } ] } }, "required": [ "id", "answer" ] } } } }, "example": { "target": { "father_class": "project", "father_id": "00000000-0000-0000-0000-000000000000", "pivot_class": "project", "form_id": 0, "related_model_attribute_id": "00000000-0000-0000-0000-000000000000", "id": "00000000-0000-0000-0000-000000000000", "project_funnel_id": 0, "project_id": "00000000-0000-0000-0000-000000000000", "funnel_step_id": 0 }, "form_answers": [ { "id": 0, "answer": "" }, { "id": 0, "answer": "" } ] } } } } } }, "/api/management/dynamic-forms/get-form-answers": { "post": { "summary": "Consultar respostas de formulário dinâmico", "responses": { "200": { "description": "Respostas do formulário retornadas com sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "example": true }, "answers": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "integer", "example": 179 }, "label": { "type": "string", "example": "Texto curto" }, "answer": { "type": "string", "example": "exemplo de texto" }, "answer_markdown": { "type": "string", "example": "**Hello**", "description": "Presente apenas em campos `rich_text` e `matrix`. Para `rich_text`, Markdown derivado do documento TipTap em `answer` (null se sem resposta, documento vazio, JSON inválido ou árvore acima do limite de conversão). Para `matrix`, tabela Markdown com rótulos de linhas/colunas em vez das keys opacas de `answer` (null se sem resposta, inválida ou vazia). Campo só de leitura — a escrita continua em TipTap JSON / objeto matriz via set-form-answers." }, "model": { "type": "string", "example": "Project" }, "answered_by": { "type": "string", "example": "9e1392ce-36ff-4984-bb9f-d69fd018b819", "format": "uuid" }, "updated_at": { "type": "string", "example": "2025-05-15T13:25:01.000000Z", "format": "date-time" } } } }, "last_updated_at": { "type": "string", "example": "2025-05-15T13:25:01.000000Z", "format": "date-time" } } }, "example": { "response": "", "answers": [ { "id": 179, "label": "Texto curto", "answer": "exemplo de texto", "model": "Project", "answered_by": "9e1392ce-36ff-4984-bb9f-d69fd018b819", "updated_at": "2025-05-15T13:25:01.000000Z" }, { "id": 180, "label": "Notas", "answer": "{\"type\":\"doc\",\"content\":[{\"type\":\"paragraph\",\"content\":[{\"type\":\"text\",\"marks\":[{\"type\":\"bold\"}],\"text\":\"Hello\"}]}]}", "answer_markdown": "**Hello**", "model": "Project", "answered_by": "9e1392ce-36ff-4984-bb9f-d69fd018b819", "updated_at": "2025-05-15T13:25:01.000000Z" }, { "id": 181, "label": "Satisfação", "answer": "{\"key_atendimento\":{\"key_nota\":\"Bom\",\"key_comentario\":\"atendeu bem\"},\"key_preco\":{\"key_nota\":\"Ok\"}}", "answer_markdown": "| | Nota | Comentário |\n| --- | --- | --- |\n| Atendimento | Bom | atendeu bem |\n| Preço | Ok | |", "model": "Project", "answered_by": "9e1392ce-36ff-4984-bb9f-d69fd018b819", "updated_at": "2025-05-15T13:25:01.000000Z" } ], "last_updated_at": "" } } } }, "401": { "description": "Não autorizado", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "example": false }, "message": { "type": "string", "example": "unauthorized" }, "error": { "type": "string", "example": "Unauthenticated." } } }, "example": { "response": "", "message": "", "error": "" } } } }, "422": { "description": "Erro de validação", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "example": false }, "message": { "type": "string", "example": "validation_errors" }, "error": { "type": "string", "example": "O campo [nome_campo] é obrigatório." }, "validation": { "type": "object", "example": { "[nome_campo]": [ "O campo [nome_campo] é obrigatório." ] } } } }, "example": { "response": "", "message": "", "error": "", "validation": {} } } } } }, "tags": [ "dynamic-forms" ], "description": "Recebe informações de vínculo entre um modelo e um formulário dinâmico, e retorna as respostas previamente salvas para esse formulário.\n\nCampos `rich_text` e `matrix` incluem `answer_markdown` no mesmo item: Markdown legível derivado do valor em `answer` (TipTap JSON ou objeto matriz). Preferir `answer_markdown` para leitura/resumo; a escrita permanece via set-form-answers no formato nativo do campo.", "requestBody": { "content": { "application/json": { "schema": { "description": "Objeto que descreve o alvo do formulário dinâmico", "title": "Target", "type": "object", "properties": { "pivot_class": { "type": "string", "example": "App\\Models\\Project" }, "form_id": { "type": "integer", "example": 43 }, "related_model_attribute_id": { "type": "string", "example": "9ee8c42a-909e-4502-a1e9-4431245c5455", "description": "Necessário quando pivot_class é 'Project'.", "format": "uuid" }, "id": { "type": "string", "example": "9ee8c42a-909e-4502-a1e9-4431245c5455", "description": "Necessário quando pivot_class é 'Project' ou 'ProjectLooseForm'." }, "project_funnel_id": { "type": "integer", "example": 129, "description": "Necessário quando pivot_class é 'ProjectFunnelAssignment'." }, "project_id": { "type": "string", "example": "9ee8c42a-909e-4502-a1e9-4431245c5455", "description": "Necessário quando pivot_class é 'ProjectFunnelAssignment', 'ProjectLooseForm' ou 'ProjectStepForm'.", "format": "uuid" }, "funnel_step_id": { "type": "integer", "example": 402, "description": "Necessário quando pivot_class é 'ProjectStepForm'." }, "father_class": { "type": "string", "example": "project" }, "father_id": { "type": "string", "example": "9ee8c42a-909e-4502-a1e9-4431245c5455", "format": "uuid" } }, "required": [ "father_class", "father_id", "pivot_class", "form_id" ] }, "example": { "father_class": "", "father_id": "", "pivot_class": "", "form_id": "", "related_model_attribute_id": "", "id": "", "project_funnel_id": "", "project_id": "", "funnel_step_id": "" } } } } } }, "/api/management/form-publications/{form_publication_token}/form": { "get": { "tags": [ "form-publications", "form" ], "summary": "Obter formulário público", "description": "Retorna o formulário de uma [publicação](https://docs.olie.ai/guides/forms/public-forms) a partir do token do link público, só com os campos que podem ser respondidos sem conta na plataforma. Fora da janela de publicação `form` vem nulo; publicação despublicada ou link invalidado retorna 404. Dispensa autenticação, mas sem token a requisição precisa do cabeçalho `Origin` com o endereço de uma conta da Olie.", "operationId": "obterFormulRioDaPublicaODeFormulRio", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "form": { "type": "object", "properties": { "id": { "type": "integer" }, "title": { "type": "string" }, "frame_id": { "type": "string" }, "created_at": { "type": "string", "format": "date-time" }, "updated_at": { "type": "string", "format": "date-time" }, "deleted_at": { "nullable": true }, "edges": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "integer" }, "type": { "type": "string" }, "label": { "type": "string" }, "index": { "type": "integer" }, "help_text": { "nullable": true }, "description": { "nullable": true }, "options": { "type": "array", "items": {} }, "initial_value": { "nullable": true }, "required": { "type": "boolean" }, "custom_validation": { "nullable": true }, "conditional": { "nullable": true }, "form_id": { "type": "integer" }, "created_at": { "type": "string", "format": "date-time" }, "updated_at": { "type": "string", "format": "date-time" }, "deleted_at": { "nullable": true }, "is_multiple": { "type": "boolean" }, "logical_operator": { "type": "string" }, "is_migrated": { "type": "boolean" }, "conditional_action": { "nullable": true }, "conditionals": { "type": "array", "items": {} } } } } } }, "form_publication": { "type": "object", "properties": { "title": { "type": "string" }, "description": { "type": "string" }, "background_color": { "type": "string", "format": "color" }, "starts_at": { "nullable": true }, "ends_at": { "type": "string" }, "redirect_url": { "type": "string", "format": "uri" }, "token": { "type": "string" } } } } }, "examples": { "Sucesso": { "value": { "response": true, "form": { "id": 70, "title": "Doc Postman - Inscrição em evento", "frame_id": "01a0252b-d865-71af-a0a2-d4e168d1ffe5", "created_at": "2026-09-22T22:00:15.000000Z", "updated_at": "2026-09-22T22:00:15.000000Z", "deleted_at": null, "edges": [ { "id": 115, "type": "short_text", "label": "Nome completo", "index": 0, "help_text": null, "description": null, "options": [], "initial_value": null, "required": true, "custom_validation": null, "conditional": null, "form_id": 70, "created_at": "2026-09-22T22:00:15.000000Z", "updated_at": "2026-09-22T22:00:15.000000Z", "deleted_at": null, "is_multiple": false, "logical_operator": "and", "is_migrated": false, "conditional_action": null, "conditionals": [] }, { "id": 116, "type": "email", "label": "E-mail", "index": 1, "help_text": null, "description": null, "options": [], "initial_value": null, "required": true, "custom_validation": null, "conditional": null, "form_id": 70, "created_at": "2026-09-22T22:00:15.000000Z", "updated_at": "2026-09-22T22:00:15.000000Z", "deleted_at": null, "is_multiple": false, "logical_operator": "and", "is_migrated": false, "conditional_action": null, "conditionals": [] }, { "id": 117, "type": "phone", "label": "Telefone", "index": 2, "help_text": null, "description": null, "options": [], "initial_value": null, "required": false, "custom_validation": null, "conditional": null, "form_id": 70, "created_at": "2026-09-22T22:00:15.000000Z", "updated_at": "2026-09-22T22:00:15.000000Z", "deleted_at": null, "is_multiple": false, "logical_operator": "and", "is_migrated": false, "conditional_action": null, "conditionals": [] }, { "id": 118, "type": "select", "label": "Como conheceu o evento", "index": 3, "help_text": null, "description": null, "options": [ "Indicação", "Redes sociais", "Site" ], "initial_value": null, "required": false, "custom_validation": null, "conditional": null, "form_id": 70, "created_at": "2026-09-22T22:00:15.000000Z", "updated_at": "2026-09-22T22:00:15.000000Z", "deleted_at": null, "is_multiple": false, "logical_operator": "and", "is_migrated": false, "conditional_action": null, "conditionals": [] } ] }, "form_publication": { "title": "Inscrição - Workshop de Processos", "description": "Preencha para garantir sua vaga.", "background_color": "#1E40AF", "starts_at": null, "ends_at": "2026-12-31 23:59:59", "redirect_url": "https://exemplo.com.br/obrigado", "token": "e867fd11-bf8d-4b10-b8a0-77deae294392" } } }, "Fora da janela de publicação": { "value": { "response": true, "form": null, "form_publication": { "title": "Inscrição - Workshop de Processos", "description": "Inscrições encerradas.", "background_color": "#1E40AF", "starts_at": "2026-09-01 00:00:00", "ends_at": "2026-09-20 23:59:59", "redirect_url": "https://exemplo.com.br/obrigado", "token": "e867fd11-bf8d-4b10-b8a0-77deae294392" } } } } } } }, "400": { "description": "Origem ausente", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "message": { "type": "string" }, "error": { "type": "string" }, "context": { "nullable": true } } }, "example": { "response": false, "message": "Origin header cannot be empty", "error": "empty_origin", "context": null } } } }, "404": { "description": "Não encontrado", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "message": { "type": "string" }, "error": { "type": "string" } } }, "example": { "response": false, "message": "form_publication_model_not_found", "error": "No query results for model [App\\Models\\FormPublication]." } } } } } }, "parameters": [ { "name": "form_publication_token", "in": "path", "required": true, "description": "Token do link público da publicação (não é o ID da publicação).", "schema": { "type": "string" }, "example": "string" } ] }, "/api/management/form-publications/{form_publication_id}/restore": { "post": { "tags": [ "form-publications", "restore" ], "summary": "Restaurar publicação", "description": "Restaura uma publicação excluída, com a mesma configuração e o mesmo link público de antes da exclusão.", "operationId": "restaurarPublicaODoFormulRio", "requestBody": { "content": { "multipart/form-data": { "schema": { "type": "object", "properties": {} } } } }, "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" } } }, "example": { "response": true } } } }, "404": { "description": "Não encontrado", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "message": { "type": "string" }, "error": { "type": "string" } } }, "example": { "response": false, "message": "form_publication_model_not_found", "error": "No query results for model [App\\Models\\FormPublication] 01a0cb22-5af9-7290-a243-736378cb5350" } } } } } }, "parameters": [ { "name": "form_publication_id", "in": "path", "required": true, "description": "ID (UUID) da publicação excluída.", "schema": { "type": "string", "example": "019b8f40-ce05-73b8-8c20-b29eb6e5b299" }, "example": "" } ] }, "/api/management/form-publications/{form_publication}/change-token": { "post": { "tags": [ "form-publications", "change-token" ], "summary": "Invalidar link da publicação", "description": "Gera um novo token para o link público da publicação. O link anterior para de funcionar na hora, inclusive onde o formulário estiver incorporado. Ver [Publicações de formulários](https://docs.olie.ai/guides/forms/public-forms).", "operationId": "alterarTokenDeUmaPublicaODeFormulRio", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "new_token": { "type": "string" } } }, "example": { "response": true, "new_token": "e867fd11-bf8d-4b10-b8a0-77deae294392" } } } }, "404": { "description": "Não encontrado", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "message": { "type": "string" }, "error": { "type": "string" } } }, "example": { "response": false, "message": "form_publication_model_not_found", "error": "No query results for model [App\\Models\\FormPublication]." } } } } } }, "parameters": [ { "name": "form_publication", "in": "path", "required": true, "description": "ID (UUID) da publicação de formulário.", "schema": { "type": "string" }, "example": "" } ] }, "/api/management/form-publications/{form_publication}/responses": { "get": { "tags": [ "form-publications", "responses" ], "summary": "Listar respostas da publicação", "description": "Lista, com [paginação](https://docs.olie.ai/api-reference/general/pagination), as respostas recebidas pela publicação, com o valor de cada campo e o projeto criado a partir da resposta, quando houver. Só entram respostas do formulário atualmente publicado.", "operationId": "obterRespostasDeUmaPublicaODeFormulRio", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "responses": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "form_publication_id": { "type": "string" }, "form_id": { "type": "integer" }, "frame_id": { "type": "string" }, "created_at": { "type": "string", "format": "date-time" }, "updated_at": { "type": "string", "format": "date-time" }, "deleted_at": { "nullable": true }, "project_id": { "nullable": true }, "answered_by": { "nullable": true }, "form_answers": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "integer" }, "label": { "type": "string" }, "answer": { "type": "string" }, "model": { "type": "string" }, "answered_by": { "nullable": true }, "updated_at": { "type": "string", "format": "date-time" } } } }, "project": { "nullable": true } } } }, "meta": { "type": "object", "properties": { "current_page": { "type": "integer" }, "from": { "type": "integer" }, "last_page": { "type": "integer" }, "per_page": { "type": "integer" }, "to": { "type": "integer" }, "total": { "type": "integer" } } }, "response": { "type": "boolean" } } }, "example": { "responses": [ { "id": "01a0cb23-1552-717d-9e9a-5ace17d75b48", "form_publication_id": "01a0cb22-5af9-7290-a243-736378cb5350", "form_id": 70, "frame_id": "01a0252b-d865-71af-a0a2-d4e168d1ffe5", "created_at": "2026-09-22T22:01:09.000000Z", "updated_at": "2026-09-22T22:01:09.000000Z", "deleted_at": null, "project_id": null, "answered_by": null, "form_answers": [ { "id": 115, "label": "Nome completo", "answer": "Ana Souza", "model": "FormPublicationResponse", "answered_by": null, "updated_at": "2026-09-22T22:01:09.000000Z" }, { "id": 116, "label": "E-mail", "answer": "ana.souza@exemplo.com.br", "model": "FormPublicationResponse", "answered_by": null, "updated_at": "2026-09-22T22:01:09.000000Z" }, { "id": 117, "label": "Telefone", "answer": "+5511999998888", "model": "FormPublicationResponse", "answered_by": null, "updated_at": "2026-09-22T22:01:09.000000Z" }, { "id": 118, "label": "Como conheceu o evento", "answer": "Indicação", "model": "FormPublicationResponse", "answered_by": null, "updated_at": "2026-09-22T22:01:09.000000Z" } ], "project": null } ], "meta": { "current_page": 1, "from": 1, "last_page": 1, "per_page": 30, "to": 1, "total": 1 }, "response": true } } } }, "404": { "description": "Não encontrado", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "message": { "type": "string" }, "error": { "type": "string" } } }, "example": { "response": false, "message": "form_publication_model_not_found", "error": "No query results for model [App\\Models\\FormPublication]." } } } } }, "parameters": [ { "name": "page", "in": "query", "description": "Página a retornar. Padrão: 1.", "schema": { "type": "string" }, "example": "" }, { "name": "perPage", "in": "query", "description": "Itens por página. Padrão: 30; máximo: 100.", "schema": { "type": "string" }, "example": "" } ] }, "parameters": [ { "name": "form_publication", "in": "path", "required": true, "description": "ID (UUID) da publicação de formulário.", "schema": { "type": "string", "example": "" }, "example": "" } ] }, "/api/management/form-publications": { "get": { "tags": [ "form-publications" ], "summary": "Listar publicações", "description": "Lista todas as [publicações de formulário](https://docs.olie.ai/guides/forms/public-forms) da conta, sem paginação, com o total de respostas de cada uma. [Solicitações](https://docs.olie.ai/guides/forms/requests) não aparecem aqui.", "operationId": "listarPublicaEsDeFormulRios", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "form_publications": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "title": { "type": "string" }, "description": { "type": "string" }, "background_color": { "type": "string", "format": "color" }, "starts_at": { "nullable": true }, "ends_at": { "type": "string" }, "redirect_url": { "type": "string", "format": "uri" }, "token": { "type": "string" }, "status": { "type": "string" }, "form_id": { "type": "integer" }, "frame_id": { "type": "string" }, "created_at": { "type": "string", "format": "date-time" }, "updated_at": { "type": "string", "format": "date-time" }, "deleted_at": { "nullable": true }, "create_project": { "type": "integer" }, "link_as_media": { "type": "boolean" }, "link_as_loose_form": { "type": "boolean" }, "project_name": { "nullable": true }, "form_edge_id": { "nullable": true }, "project_template_id": { "nullable": true }, "funnel_step_id": { "nullable": true }, "type": { "type": "string" }, "created_by": { "nullable": true }, "responses_count": { "type": "integer" }, "form": { "type": "object", "properties": { "id": { "type": "integer" }, "title": { "type": "string" } } }, "project_template": { "nullable": true }, "form_edge": { "nullable": true } } } } } }, "example": { "response": true, "form_publications": [ { "id": "01a0cb22-5af9-7290-a243-736378cb5350", "title": "Inscrição - Workshop de Processos", "description": "Preencha para garantir sua vaga.", "background_color": "#1E40AF", "starts_at": null, "ends_at": "2026-12-31 23:59:59", "redirect_url": "https://exemplo.com.br/obrigado", "token": "e867fd11-bf8d-4b10-b8a0-77deae294392", "status": "published", "form_id": 70, "frame_id": "01a0252b-d865-71af-a0a2-d4e168d1ffe5", "created_at": "2026-09-22T22:00:21.000000Z", "updated_at": "2026-09-22T22:01:18.000000Z", "deleted_at": null, "create_project": 0, "link_as_media": false, "link_as_loose_form": false, "project_name": null, "form_edge_id": null, "project_template_id": null, "funnel_step_id": null, "type": "publication", "created_by": null, "responses_count": 1, "form": { "id": 70, "title": "Doc Postman - Inscrição em evento" }, "project_template": null, "form_edge": null } ] } } } }, "400": { "description": "Filtro inválido", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "message": { "type": "string" }, "error": { "type": "string" }, "allowed_filters": { "type": "array", "items": { "type": "string" } }, "unknown_filters": { "type": "object", "properties": { "1": { "type": "string" } } } } }, "example": { "response": false, "message": "invalid_filter_query", "error": "Requested filter(s) `foo` are not allowed. Allowed filter(s) are `title, trashed`.", "allowed_filters": [ "title", "trashed" ], "unknown_filters": { "1": "foo" } } } } } }, "parameters": [ { "name": "filter[title]", "in": "query", "description": "Busca parcial no título da publicação.", "schema": { "type": "string" }, "example": "" }, { "name": "filter[trashed]", "in": "query", "description": "Publicações excluídas: `with` (ativas e excluídas) ou `only` (só excluídas). Omita para trazer só as ativas.", "schema": { "type": "string" }, "example": "" } ] }, "post": { "tags": [ "form-publications" ], "summary": "Criar publicação", "description": "Publica um formulário em um link aberto, com token gerado automaticamente. Com `create_project`, cada resposta cria um projeto na etapa escolhida, gravando as respostas no conteúdo ou como formulário avulso. Ver [Publicações de formulários](https://docs.olie.ai/guides/forms/public-forms).", "operationId": "criarPublicaODeFormulRio", "requestBody": { "content": { "application/json": { "schema": { "type": "array", "example": [], "items": {} }, "examples": { "Criar publicação de formulário": { "value": { "title": "Inscrição - Workshop de Processos", "description": "Preencha para garantir sua vaga.", "background_color": "#1E40AF", "starts_at": null, "ends_at": null, "redirect_url": null, "status": "published", "form_id": null, "create_project": false, "link_as_media": false, "link_as_loose_form": false, "project_name": null, "form_edge_id": null, "project_template_id": null, "funnel_step_id": null } } } } } }, "responses": { "201": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "form_publication": { "type": "object", "properties": { "title": { "type": "string" }, "description": { "type": "string" }, "background_color": { "type": "string", "format": "color" }, "starts_at": { "nullable": true }, "ends_at": { "nullable": true }, "redirect_url": { "type": "string", "format": "uri" }, "type": { "type": "string" }, "status": { "type": "string" }, "form_id": { "type": "integer" }, "link_as_media": { "type": "boolean" }, "link_as_loose_form": { "type": "boolean" }, "project_name": { "nullable": true }, "project_template_id": { "nullable": true }, "funnel_step_id": { "nullable": true }, "create_project": { "type": "boolean" }, "form_edge_id": { "nullable": true }, "token": { "type": "string" }, "frame_id": { "type": "string" }, "id": { "type": "string" }, "updated_at": { "type": "string", "format": "date-time" }, "created_at": { "type": "string", "format": "date-time" } } } } }, "example": { "response": true, "form_publication": { "title": "Inscrição - Workshop de Processos", "description": "Preencha para garantir sua vaga.", "background_color": "#1E40AF", "starts_at": null, "ends_at": null, "redirect_url": "https://exemplo.com.br/obrigado", "type": "publication", "status": "published", "form_id": 70, "link_as_media": false, "link_as_loose_form": false, "project_name": null, "project_template_id": null, "funnel_step_id": null, "create_project": false, "form_edge_id": null, "token": "bf2dc3d7-0bad-4806-b8d1-9ba3e3a8132f", "frame_id": "01a0252b-d865-71af-a0a2-d4e168d1ffe5", "id": "01a0cb22-5af9-7290-a243-736378cb5350", "updated_at": "2026-09-22T22:00:21.000000Z", "created_at": "2026-09-22T22:00:21.000000Z" } } } } }, "422": { "description": "Validação falhou", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "message": { "type": "string" }, "error": { "type": "string" }, "validation": { "type": "object", "properties": { "title": { "type": "array", "items": { "type": "string" } }, "background_color": { "type": "array", "items": { "type": "string" } }, "ends_at": { "type": "array", "items": { "type": "string" } }, "status": { "type": "array", "items": { "type": "string" } }, "form_id": { "type": "array", "items": { "type": "string" } }, "create_project": { "type": "array", "items": { "type": "string" } } } } } }, "example": { "response": false, "message": "validation_errors", "error": "The título field is required. (and 5 more errors)", "validation": { "title": [ "The título field is required." ], "background_color": [ "The background color format is invalid." ], "ends_at": [ "The ends at must be a date after or equal to starts at." ], "status": [ "The selected status is invalid." ], "form_id": [ "The selected form id is invalid." ], "create_project": [ "The link_as_media field is required when create_project is 1." ] } } } } } } } }, "/api/management/form-publications/{form_publication}": { "get": { "tags": [ "form-publications" ], "summary": "Obter publicação", "description": "Retorna a configuração completa de uma publicação, com o formulário publicado (só os campos respondíveis em link público), o modelo de projeto e o campo usado para nomear o projeto criado.", "operationId": "obterUmaPublicaODeFormulRio", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "form_publication": { "type": "object", "properties": { "id": { "type": "string" }, "title": { "type": "string" }, "description": { "type": "string" }, "background_color": { "type": "string", "format": "color" }, "starts_at": { "nullable": true }, "ends_at": { "type": "string" }, "redirect_url": { "type": "string", "format": "uri" }, "token": { "type": "string" }, "status": { "type": "string" }, "form_id": { "type": "integer" }, "frame_id": { "type": "string" }, "created_at": { "type": "string", "format": "date-time" }, "updated_at": { "type": "string", "format": "date-time" }, "deleted_at": { "nullable": true }, "create_project": { "type": "integer" }, "link_as_media": { "type": "boolean" }, "link_as_loose_form": { "type": "boolean" }, "project_name": { "nullable": true }, "form_edge_id": { "nullable": true }, "project_template_id": { "nullable": true }, "funnel_step_id": { "nullable": true }, "type": { "type": "string" }, "created_by": { "nullable": true }, "project_template": { "nullable": true }, "form_edge": { "nullable": true }, "form": { "type": "object", "properties": { "id": { "type": "integer" }, "title": { "type": "string" }, "frame_id": { "type": "string" }, "created_at": { "type": "string", "format": "date-time" }, "updated_at": { "type": "string", "format": "date-time" }, "deleted_at": { "nullable": true }, "edges": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "integer" }, "type": { "type": "string" }, "label": { "type": "string" }, "index": { "type": "integer" }, "help_text": { "nullable": true }, "description": { "nullable": true }, "options": { "type": "array", "items": {} }, "initial_value": { "nullable": true }, "required": { "type": "boolean" }, "custom_validation": { "nullable": true }, "conditional": { "nullable": true }, "form_id": { "type": "integer" }, "created_at": { "type": "string", "format": "date-time" }, "updated_at": { "type": "string", "format": "date-time" }, "deleted_at": { "nullable": true }, "is_multiple": { "type": "boolean" }, "logical_operator": { "type": "string" }, "is_migrated": { "type": "boolean" }, "conditional_action": { "nullable": true } } } } } } } } } }, "example": { "response": true, "form_publication": { "id": "01a0cb22-5af9-7290-a243-736378cb5350", "title": "Inscrição - Workshop de Processos", "description": "Preencha para garantir sua vaga.", "background_color": "#1E40AF", "starts_at": null, "ends_at": "2026-12-31 23:59:59", "redirect_url": "https://exemplo.com.br/obrigado", "token": "e867fd11-bf8d-4b10-b8a0-77deae294392", "status": "published", "form_id": 70, "frame_id": "01a0252b-d865-71af-a0a2-d4e168d1ffe5", "created_at": "2026-09-22T22:00:21.000000Z", "updated_at": "2026-09-22T22:01:18.000000Z", "deleted_at": null, "create_project": 0, "link_as_media": false, "link_as_loose_form": false, "project_name": null, "form_edge_id": null, "project_template_id": null, "funnel_step_id": null, "type": "publication", "created_by": null, "project_template": null, "form_edge": null, "form": { "id": 70, "title": "Doc Postman - Inscrição em evento", "frame_id": "01a0252b-d865-71af-a0a2-d4e168d1ffe5", "created_at": "2026-09-22T22:00:15.000000Z", "updated_at": "2026-09-22T22:00:15.000000Z", "deleted_at": null, "edges": [ { "id": 115, "type": "short_text", "label": "Nome completo", "index": 0, "help_text": null, "description": null, "options": [], "initial_value": null, "required": true, "custom_validation": null, "conditional": null, "form_id": 70, "created_at": "2026-09-22T22:00:15.000000Z", "updated_at": "2026-09-22T22:00:15.000000Z", "deleted_at": null, "is_multiple": false, "logical_operator": "and", "is_migrated": false, "conditional_action": null }, { "id": 116, "type": "email", "label": "E-mail", "index": 1, "help_text": null, "description": null, "options": [], "initial_value": null, "required": true, "custom_validation": null, "conditional": null, "form_id": 70, "created_at": "2026-09-22T22:00:15.000000Z", "updated_at": "2026-09-22T22:00:15.000000Z", "deleted_at": null, "is_multiple": false, "logical_operator": "and", "is_migrated": false, "conditional_action": null }, { "id": 117, "type": "phone", "label": "Telefone", "index": 2, "help_text": null, "description": null, "options": [], "initial_value": null, "required": false, "custom_validation": null, "conditional": null, "form_id": 70, "created_at": "2026-09-22T22:00:15.000000Z", "updated_at": "2026-09-22T22:00:15.000000Z", "deleted_at": null, "is_multiple": false, "logical_operator": "and", "is_migrated": false, "conditional_action": null }, { "id": 118, "type": "select", "label": "Como conheceu o evento", "index": 3, "help_text": null, "description": null, "options": [ "Indicação", "Redes sociais", "Site" ], "initial_value": null, "required": false, "custom_validation": null, "conditional": null, "form_id": 70, "created_at": "2026-09-22T22:00:15.000000Z", "updated_at": "2026-09-22T22:00:15.000000Z", "deleted_at": null, "is_multiple": false, "logical_operator": "and", "is_migrated": false, "conditional_action": null } ] } } } } } }, "404": { "description": "Não encontrado", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "message": { "type": "string" }, "error": { "type": "string" } } }, "example": { "response": false, "message": "form_publication_model_not_found", "error": "No query results for model [App\\Models\\FormPublication]." } } } } } }, "put": { "tags": [ "form-publications" ], "summary": "Editar publicação", "description": "Atualiza a configuração de uma publicação; `title`, `status` e `form_id` são obrigatórios mesmo sem mudança. Se `create_project` não vier como true, a configuração de criação de projeto é apagada. O link público continua o mesmo.", "operationId": "editarPublicaODeFormulRio", "requestBody": { "content": { "application/json": { "schema": { "type": "array", "example": [], "items": {} }, "examples": { "Editar publicação de formulário": { "value": { "title": "Inscrição - Workshop de Processos", "description": "Preencha para garantir sua vaga.", "background_color": "#1E40AF", "starts_at": null, "ends_at": null, "redirect_url": null, "status": "published", "form_id": null, "create_project": false, "link_as_media": false, "link_as_loose_form": false, "project_name": null, "form_edge_id": null, "project_template_id": null, "funnel_step_id": null } } } } } }, "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "form_publication": { "type": "object", "properties": { "id": { "type": "string" }, "title": { "type": "string" }, "description": { "type": "string" }, "background_color": { "type": "string", "format": "color" }, "starts_at": { "nullable": true }, "ends_at": { "type": "string" }, "redirect_url": { "type": "string", "format": "uri" }, "token": { "type": "string" }, "status": { "type": "string" }, "form_id": { "type": "integer" }, "frame_id": { "type": "string" }, "created_at": { "type": "string", "format": "date-time" }, "updated_at": { "type": "string", "format": "date-time" }, "deleted_at": { "nullable": true }, "create_project": { "type": "boolean" }, "link_as_media": { "type": "boolean" }, "link_as_loose_form": { "type": "boolean" }, "project_name": { "nullable": true }, "form_edge_id": { "nullable": true }, "project_template_id": { "nullable": true }, "funnel_step_id": { "nullable": true }, "type": { "type": "string" }, "created_by": { "nullable": true } } } } }, "example": { "response": true, "form_publication": { "id": "01a0cb22-5af9-7290-a243-736378cb5350", "title": "Inscrição - Workshop de Processos", "description": "Preencha para garantir sua vaga.", "background_color": "#1E40AF", "starts_at": null, "ends_at": "2026-12-31 23:59:59", "redirect_url": "https://exemplo.com.br/obrigado", "token": "bf2dc3d7-0bad-4806-b8d1-9ba3e3a8132f", "status": "published", "form_id": 70, "frame_id": "01a0252b-d865-71af-a0a2-d4e168d1ffe5", "created_at": "2026-09-22T22:00:21.000000Z", "updated_at": "2026-09-22T22:01:02.000000Z", "deleted_at": null, "create_project": false, "link_as_media": false, "link_as_loose_form": false, "project_name": null, "form_edge_id": null, "project_template_id": null, "funnel_step_id": null, "type": "publication", "created_by": null } } } } }, "404": { "description": "Não encontrado", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "message": { "type": "string" }, "error": { "type": "string" } } }, "example": { "response": false, "message": "form_publication_model_not_found", "error": "No query results for model [App\\Models\\FormPublication]." } } } }, "422": { "description": "Validação falhou", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "message": { "type": "string" }, "error": { "type": "string" }, "validation": { "type": "object", "properties": { "status": { "type": "array", "items": { "type": "string" } }, "form_id": { "type": "array", "items": { "type": "string" } } } } } }, "example": { "response": false, "message": "validation_errors", "error": "The status field is required. (and 1 more error)", "validation": { "status": [ "The status field is required." ], "form_id": [ "The form id field is required." ] } } } } } } }, "delete": { "tags": [ "form-publications" ], "summary": "Excluir publicação", "description": "Exclui a publicação, que pode ser restaurada depois. O link público para de funcionar e as respostas já recebidas são mantidas.", "operationId": "deletarPublicaODeFormulRio", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" } } }, "example": { "response": true } } } }, "404": { "description": "Não encontrado", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "message": { "type": "string" }, "error": { "type": "string" } } }, "example": { "response": false, "message": "form_publication_model_not_found", "error": "No query results for model [App\\Models\\FormPublication]." } } } } } }, "parameters": [ { "name": "form_publication", "in": "path", "required": true, "description": "ID (UUID) da publicação de formulário.", "schema": { "type": "string" }, "example": "" } ] }, "/api/management/answers-history/index": { "post": { "tags": [ "answers-history", "index" ], "summary": "Listar histórico de respostas de formulário", "description": "Listar registros do histórico de respostas de formulário com filtros e critérios específicos.", "operationId": "listarHistRicoDeRespostasDeFormulRio", "responses": { "200": { "description": "200" } } } }, "/api/management/answers-history": { "post": { "tags": [ "answers-history" ], "summary": "Salvar versão das respostas", "description": "Congela as respostas atuais de um formulário em uma nova [versão](https://docs.olie.ai/guides/forms/loose-forms) do histórico; com `clean_edges`, os campos são esvaziados em seguida para o próximo ciclo. O formulário é identificado pelo [pivot](https://docs.olie.ai/api-reference/general/form-answer-pivot), em que `father_class` e `father_id` são obrigatórios.", "operationId": "criarHistRicoDeRespostasDeUmFormulRio", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "answer_history": { "type": "object", "properties": { "answers": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "integer" }, "type": { "type": "string" }, "label": { "type": "string" }, "index": { "type": "integer" }, "help_text": { "nullable": true }, "description": { "nullable": true }, "options": { "type": "array", "items": {} }, "initial_value": { "nullable": true }, "required": { "type": "boolean" }, "custom_validation": { "nullable": true }, "conditional": { "nullable": true }, "form_id": { "type": "integer" }, "created_at": { "type": "string", "format": "date-time" }, "updated_at": { "type": "string", "format": "date-time" }, "deleted_at": { "nullable": true }, "is_multiple": { "type": "boolean" }, "logical_operator": { "type": "string" }, "is_migrated": { "type": "boolean" }, "conditional_action": { "nullable": true }, "answer": { "type": "string" }, "answered_by": { "type": "string" } } } }, "user_id": { "type": "string" }, "frame_id": { "type": "string" }, "form_id": { "type": "integer" }, "model_class": { "type": "string" }, "model_id": { "type": "integer" }, "updated_at": { "type": "string", "format": "date-time" }, "created_at": { "type": "string", "format": "date-time" }, "id": { "type": "integer" }, "user": { "type": "object", "properties": { "id": { "type": "string" }, "name": { "type": "string" }, "avatar_url": { "type": "string", "format": "uri" } } } } } } }, "example": { "response": true, "answer_history": { "answers": [ { "id": 115, "type": "short_text", "label": "Nome completo", "index": 0, "help_text": null, "description": null, "options": [], "initial_value": null, "required": true, "custom_validation": null, "conditional": null, "form_id": 70, "created_at": "2026-09-22T22:00:15.000000Z", "updated_at": "2026-09-22T22:01:40.000000Z", "deleted_at": null, "is_multiple": false, "logical_operator": "and", "is_migrated": false, "conditional_action": null, "answer": "Ana Souza", "answered_by": "01a0252b-d7a0-7242-9420-bacbd51f678b" }, { "id": 116, "type": "email", "label": "E-mail", "index": 1, "help_text": null, "description": null, "options": [], "initial_value": null, "required": true, "custom_validation": null, "conditional": null, "form_id": 70, "created_at": "2026-09-22T22:00:15.000000Z", "updated_at": "2026-09-22T22:01:40.000000Z", "deleted_at": null, "is_multiple": false, "logical_operator": "and", "is_migrated": false, "conditional_action": null, "answer": "ana.souza@exemplo.com.br", "answered_by": "01a0252b-d7a0-7242-9420-bacbd51f678b" }, { "id": 117, "type": "phone", "label": "Telefone", "index": 2, "help_text": null, "description": null, "options": [], "initial_value": null, "required": false, "custom_validation": null, "conditional": null, "form_id": 70, "created_at": "2026-09-22T22:00:15.000000Z", "updated_at": "2026-09-22T22:01:40.000000Z", "deleted_at": null, "is_multiple": false, "logical_operator": "and", "is_migrated": false, "conditional_action": null, "answer": "+5511999998888", "answered_by": "01a0252b-d7a0-7242-9420-bacbd51f678b" }, { "id": 118, "type": "select", "label": "Como conheceu o evento", "index": 3, "help_text": null, "description": null, "options": [ "Indicação", "Redes sociais", "Site" ], "initial_value": null, "required": false, "custom_validation": null, "conditional": null, "form_id": 70, "created_at": "2026-09-22T22:00:15.000000Z", "updated_at": "2026-09-22T22:01:40.000000Z", "deleted_at": null, "is_multiple": false, "logical_operator": "and", "is_migrated": false, "conditional_action": null, "answer": "Site", "answered_by": "01a0252b-d7a0-7242-9420-bacbd51f678b" }, { "id": 119, "type": "user", "label": "Responsável interno", "index": 4, "help_text": null, "description": null, "options": [], "initial_value": null, "required": false, "custom_validation": null, "conditional": null, "form_id": 70, "created_at": "2026-09-22T22:00:15.000000Z", "updated_at": "2026-09-22T22:00:15.000000Z", "deleted_at": null, "is_multiple": false, "logical_operator": "and", "is_migrated": false, "conditional_action": null, "answer": null } ], "user_id": "01a0252b-d7a0-7242-9420-bacbd51f678b", "frame_id": "01a0252b-d865-71af-a0a2-d4e168d1ffe5", "form_id": 70, "model_class": "App\\Models\\ProjectLooseForm", "model_id": 14, "updated_at": "2026-09-22T22:01:47.000000Z", "created_at": "2026-09-22T22:01:47.000000Z", "id": 2, "user": { "id": "01a0252b-d7a0-7242-9420-bacbd51f678b", "name": "Test User", "avatar_url": "https://exemplo.com.br/avatars/usuario.png" } } } } } }, "404": { "description": "Registro de origem não encontrado", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "message": { "type": "string" }, "error": { "type": "string" } } }, "example": { "response": false, "message": "project_model_not_found", "error": "No query results for model [App\\Models\\Project] 00000000-0000-0000-0000-000000000000" } } } }, "422": { "description": "Validação falhou", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "message": { "type": "string" }, "error": { "type": "string" }, "validation": { "type": "object", "properties": { "father_class": { "type": "array", "items": { "type": "string" } }, "father_id": { "type": "array", "items": { "type": "string" } }, "clean_edges": { "type": "array", "items": { "type": "string" } } } } } }, "example": { "response": false, "message": "validation_errors", "error": "The father class field is required. (and 2 more errors)", "validation": { "father_class": [ "The father class field is required." ], "father_id": [ "The father id field is required." ], "clean_edges": [ "The clean edges field must be true or false." ] } } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "pivot_class": { "type": "string" }, "form_id": { "nullable": true }, "project_id": { "nullable": true }, "id": { "nullable": true }, "father_class": { "type": "string" }, "father_id": { "nullable": true }, "clean_edges": { "type": "boolean" } } }, "example": { "pivot_class": "App\\Models\\ProjectLooseForm", "form_id": null, "project_id": null, "id": null, "father_class": "App\\Models\\Project", "father_id": null, "clean_edges": false } } } } } }, "/api/management/answers-history/{answers_history}": { "get": { "tags": [ "answers-history" ], "summary": "Obter histórico de respostas de formulário específico", "description": "Obter detalhes de um registro específico do histórico de respostas de formulário.", "operationId": "obterHistRicoDeRespostasDeFormulRioEspecFico", "responses": { "200": { "description": "200" } } }, "parameters": [ { "name": "answers_history", "in": "path", "required": true, "schema": { "type": "string" }, "example": "string" } ] }, "/api/management/ai/agents/executions": { "get": { "tags": [ "ai-agents", "agents", "executions" ], "summary": "Listar execuções de agentes", "description": "Lista as execuções de agentes de IA da empresa, da mais recente para a mais antiga. É um resumo: o texto gerado e os passos de cada execução só aparecem no detalhe. Aceita [paginação](https://docs.olie.ai/api-reference/general/pagination) e [filtros básicos](https://docs.olie.ai/api-reference/general/basic-filters).", "operationId": "listarExecuEsDeAgentes", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Página de execuções de agentes.", "properties": { "data": { "type": "array", "description": "Execuções da página atual, da mais recente para a mais antiga.", "items": { "type": "object", "description": "Resumo de uma execução de agente.", "properties": { "id": { "type": "string", "description": "ID (UUID) da execução.", "format": "uuid" }, "agent_id": { "type": "string", "description": "ID (UUID) do agente executado.", "format": "uuid", "nullable": true }, "agent": { "type": "object", "description": "Agente executado, apenas com os campos de identificação.", "properties": { "id": { "type": "string", "description": "ID (UUID) do agente.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do agente." }, "description": { "type": "string", "description": "Descrição curta do agente.", "nullable": true } }, "additionalProperties": false }, "model": { "type": "string", "description": "Modelo de IA usado na execução.", "nullable": true }, "status": { "type": "string", "description": "Situação da execução: `pending` enquanto está na fila, `completed` quando terminou e `failed` quando falhou.", "enum": [ "pending", "completed", "failed" ] }, "tokens_used": { "type": "integer", "description": "Total de tokens consumidos pela execução." }, "credits_debited": { "type": "string", "description": "Créditos debitados da carteira da empresa, com nove casas decimais; nulo em execuções anteriores à carteira de créditos ou que não chegaram a consumir nada.", "nullable": true }, "latency": { "type": "integer", "description": "Tempo total da execução, em milissegundos." }, "created_at": { "type": "string", "description": "Data e hora em que a execução foi enfileirada.", "format": "date-time" } }, "additionalProperties": false } }, "links": { "type": "object", "description": "Endereços das páginas de navegação.", "properties": { "first": { "type": "string", "description": "Endereço da primeira página.", "nullable": true }, "last": { "type": "string", "description": "Endereço da última página.", "nullable": true }, "prev": { "type": "string", "description": "Endereço da página anterior; nulo na primeira página.", "nullable": true }, "next": { "type": "string", "description": "Endereço da próxima página; nulo na última página.", "nullable": true } }, "additionalProperties": false }, "meta": { "type": "object", "description": "Dados da paginação.", "properties": { "current_page": { "type": "integer", "description": "Página atual." }, "from": { "type": "integer", "description": "Posição do primeiro item da página dentro do total; nulo quando a página está vazia.", "nullable": true }, "last_page": { "type": "integer", "description": "Número da última página." }, "links": { "type": "array", "description": "Links prontos para montar a navegação por páginas.", "items": { "type": "object", "description": "Link de uma página da paginação.", "properties": { "url": { "type": "string", "description": "Endereço da página; nulo quando o link não leva a lugar nenhum.", "nullable": true }, "label": { "type": "string", "description": "Rótulo do link, como o número da página ou os textos de anterior e próximo." }, "page": { "type": "integer", "description": "Número da página do link; nulo nos links desativados.", "nullable": true }, "active": { "type": "boolean", "description": "Indica se o link corresponde à página atual." } }, "additionalProperties": false } }, "path": { "type": "string", "description": "Endereço base usado para montar os links de paginação." }, "per_page": { "type": "integer", "description": "Quantidade de itens por página." }, "to": { "type": "integer", "description": "Posição do último item da página dentro do total; nulo quando a página está vazia.", "nullable": true }, "total": { "type": "integer", "description": "Total de execuções que atendem aos filtros." } }, "additionalProperties": false } }, "additionalProperties": false }, "example": { "data": [ { "id": "019b6b4d-2f18-7331-b60a-91c7d2e40a55", "agent_id": "019b6b1a-4c21-73d6-9f0e-5a1c8d3e7b04", "agent": { "id": "019b6b1a-4c21-73d6-9f0e-5a1c8d3e7b04", "name": "Triador de entrada", "description": "Classifica e resume os cards que chegam no funil de atendimento." }, "model": "openrouter/auto-cost-based", "status": "completed", "tokens_used": 1284, "credits_debited": "1.300000000", "latency": 4210, "created_at": "2026-09-18T11:52:03.000000Z" }, { "id": "019b6b3a-77c1-72a0-8f5d-1de0a4c9b6e7", "agent_id": "019b6b1a-4c21-73d6-9f0e-5a1c8d3e7b04", "agent": { "id": "019b6b1a-4c21-73d6-9f0e-5a1c8d3e7b04", "name": "Triador de entrada", "description": "Classifica e resume os cards que chegam no funil de atendimento." }, "model": "openrouter/auto-cost-based", "status": "failed", "tokens_used": 0, "credits_debited": null, "latency": 812, "created_at": "2026-09-17T19:04:55.000000Z" } ], "links": { "first": "https://devframe.olie.ai/api/management/ai/agents/executions?page=1", "last": "https://devframe.olie.ai/api/management/ai/agents/executions?page=3", "prev": null, "next": "https://devframe.olie.ai/api/management/ai/agents/executions?page=2" }, "meta": { "current_page": 1, "from": 1, "last_page": 3, "links": [ { "url": null, "label": "« Previous", "page": null, "active": false }, { "url": "https://devframe.olie.ai/api/management/ai/agents/executions?page=1", "label": "1", "page": 1, "active": true }, { "url": "https://devframe.olie.ai/api/management/ai/agents/executions?page=2", "label": "2", "page": 2, "active": false }, { "url": "https://devframe.olie.ai/api/management/ai/agents/executions?page=2", "label": "Next »", "page": 2, "active": false } ], "path": "https://devframe.olie.ai/api/management/ai/agents/executions", "per_page": 30, "to": 30, "total": 74 } } } } }, "400": { "description": "Ordenação não permitida", "content": { "application/json": { "schema": { "type": "object", "description": "Campo de ordenação não permitido.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição; sempre falso em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro; nesta resposta sempre `invalid_sort_query`." }, "error": { "type": "string", "description": "Descrição do erro em linguagem natural, para log e exibição." }, "allowed_sorts": { "type": "array", "description": "Campos de ordenação aceitos pelo endpoint.", "items": { "type": "string", "description": "Nome de um campo de ordenação aceito." } }, "unknown_sorts": { "type": "array", "description": "Campos de ordenação enviados que não são aceitos.", "items": { "type": "string", "description": "Nome de um campo de ordenação recusado." } } }, "additionalProperties": false }, "example": { "response": false, "message": "invalid_sort_query", "error": "Requested sort(s) `cost` is not allowed. Allowed sort(s) are `credits_debited, tokens_used, latency, created_at`.", "allowed_sorts": [ "credits_debited", "tokens_used", "latency", "created_at" ], "unknown_sorts": [ "cost" ] } } } } }, "parameters": [ { "name": "page", "in": "query", "description": "Página a retornar. Padrão 1; valores inválidos voltam para 1.", "schema": { "type": "string" }, "example": "" }, { "name": "perPage", "in": "query", "description": "Itens por página. Padrão 30, máximo 100.", "schema": { "type": "string" }, "example": "" }, { "name": "sort", "in": "query", "description": "Campo de ordenação: `created_at`, `credits_debited`, `tokens_used` ou `latency`. Prefixe com `-` para ordem decrescente. Padrão `-created_at`.", "schema": { "type": "string" }, "example": "" }, { "name": "filter[agent_id]", "in": "query", "description": "Filtra as execuções de um agente pelo ID (correspondência parcial).", "schema": { "type": "string" }, "example": "" }, { "name": "filter[status]", "in": "query", "description": "Filtra pelo status exato da execução: `pending`, `completed` ou `failed`.", "schema": { "type": "string" }, "example": "" }, { "name": "filter[model]", "in": "query", "description": "Filtra pelo modelo usado na execução (correspondência parcial).", "schema": { "type": "string" }, "example": "" }, { "name": "filter[error]", "in": "query", "description": "Filtra pelo texto da mensagem de erro registrada (correspondência parcial).", "schema": { "type": "string" }, "example": "" } ] } }, "/api/management/ai/agents/executions/{execution}": { "get": { "tags": [ "ai-agents", "agents", "executions" ], "summary": "Obter execução de agente específica", "description": "Retorna o detalhe de uma execução de agente: o prompt enviado, a resposta gerada, o erro quando houve falha e o consumo em créditos. Traz também `steps`, o histórico de idas e voltas ao modelo, com as ferramentas chamadas, os tokens e o custo de cada passo.", "operationId": "obterExecuODeAgenteEspecFica", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Detalhe completo da execução.", "properties": { "data": { "type": "object", "description": "Execução do agente.", "properties": { "id": { "type": "string", "description": "ID (UUID) da execução.", "format": "uuid" }, "agent_id": { "type": "string", "description": "ID (UUID) do agente executado.", "format": "uuid", "nullable": true }, "model": { "type": "string", "description": "Modelo de IA usado na execução.", "nullable": true }, "provider": { "type": "string", "description": "Provedor de IA usado na execução.", "enum": [ "openrouter", "google", "openai", "anthropic", null ], "nullable": true }, "response": { "type": "string", "description": "Texto final produzido pelo agente; nulo enquanto a execução não termina.", "nullable": true }, "prompt": { "type": "string", "description": "Instrução enviada ao agente, já com o template renderizado.", "nullable": true }, "status": { "type": "string", "description": "Situação da execução.", "enum": [ "pending", "completed", "failed" ] }, "error": { "type": "string", "description": "Mensagem do erro que interrompeu a execução; nulo quando não houve falha.", "nullable": true }, "latency": { "type": "integer", "description": "Tempo total da execução, em milissegundos." }, "invoice_id": { "type": "string", "description": "ID (UUID) da fatura em que a execução foi cobrada, no modelo de cobrança anterior à carteira de créditos.", "format": "uuid", "nullable": true }, "bill_computed": { "type": "boolean", "description": "Indica se a execução já foi contabilizada no faturamento anterior à carteira de créditos." }, "tokens_used": { "type": "integer", "description": "Total de tokens consumidos pela execução." }, "credits_debited": { "type": "string", "description": "Créditos debitados da carteira da empresa, com nove casas decimais; nulo quando nada foi debitado.", "nullable": true }, "credit_transaction_id": { "type": "string", "description": "ID (UUID) do lançamento na carteira de créditos gerado por esta execução.", "format": "uuid", "nullable": true }, "created_at": { "type": "string", "description": "Data e hora em que a execução foi enfileirada.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data e hora da última alteração da execução.", "format": "date-time" }, "steps": { "type": "array", "description": "Idas e voltas ao modelo, na ordem em que aconteceram; vazio quando a execução ainda não rodou.", "items": { "type": "object", "description": "Uma ida e volta ao modelo dentro da execução.", "properties": { "index": { "type": "integer", "description": "Posição do passo dentro da execução, a partir de zero." }, "provider": { "type": "string", "description": "Provedor de IA usado no passo.", "nullable": true }, "model": { "type": "string", "description": "Modelo de IA usado no passo.", "nullable": true }, "text": { "type": "string", "description": "Texto produzido pelo modelo no passo; nulo quando o passo só chamou ferramentas.", "nullable": true }, "tool_calls": { "type": "array", "description": "Ferramentas chamadas pelo modelo no passo.", "items": { "type": "object", "description": "Chamada de ferramenta feita pelo modelo neste passo.", "properties": { "id": { "type": "string", "description": "Identificador da chamada, usado para casar com o resultado correspondente." }, "name": { "type": "string", "description": "Nome da ferramenta chamada." }, "arguments": { "type": "object", "description": "Argumentos com que a ferramenta foi chamada.", "additionalProperties": true }, "result_id": { "type": "string", "description": "Identificador do resultado correspondente, quando o provedor o informa.", "nullable": true }, "reasoning_id": { "type": "string", "description": "Identificador do raciocínio associado à chamada, quando o provedor o informa.", "nullable": true }, "reasoning_summary": { "type": "array", "description": "Resumo do raciocínio associado à chamada, quando o provedor o informa.", "items": { "type": "string", "description": "Trecho do resumo de raciocínio." }, "nullable": true } }, "additionalProperties": false }, "nullable": true }, "tool_results": { "type": "array", "description": "Resultados das ferramentas devolvidos ao modelo no passo.", "items": { "type": "object", "description": "Resultado devolvido por uma ferramenta neste passo.", "properties": { "id": { "type": "string", "description": "Identificador da chamada que originou o resultado." }, "name": { "type": "string", "description": "Nome da ferramenta executada." }, "arguments": { "type": "object", "description": "Argumentos com que a ferramenta foi chamada.", "additionalProperties": true }, "result": { "description": "Conteúdo devolvido pela ferramenta ao modelo.", "nullable": true, "anyOf": [ { "type": "string" }, { "type": "object" }, { "type": "array", "items": {} }, { "type": "number" }, { "type": "boolean" } ] }, "result_id": { "type": "string", "description": "Identificador do resultado informado pelo provedor, quando existe.", "nullable": true } }, "additionalProperties": false }, "nullable": true }, "finish_reason": { "type": "string", "description": "Motivo pelo qual o modelo encerrou o passo, conforme informado pelo provedor.", "nullable": true }, "prompt_tokens": { "type": "integer", "description": "Tokens de entrada consumidos no passo." }, "completion_tokens": { "type": "integer", "description": "Tokens de saída gerados no passo." }, "cached_tokens": { "type": "integer", "description": "Tokens de entrada lidos do cache do provedor." }, "cache_write_tokens": { "type": "integer", "description": "Tokens de entrada gravados no cache do provedor." }, "reasoning_tokens": { "type": "integer", "description": "Tokens gastos com raciocínio interno do modelo." }, "cost": { "type": "string", "description": "Custo do passo cobrado pelo provedor, em dólares e com nove casas decimais.", "nullable": true }, "created_at": { "type": "string", "description": "Data e hora em que o passo foi registrado.", "format": "date-time" } }, "additionalProperties": false } } }, "additionalProperties": false }, "response": { "type": "boolean", "description": "Indicador de sucesso da requisição; sempre verdadeiro nesta resposta." } }, "additionalProperties": false }, "example": { "data": { "id": "019b6b4d-2f18-7331-b60a-91c7d2e40a55", "agent_id": "019b6b1a-4c21-73d6-9f0e-5a1c8d3e7b04", "model": "openrouter/auto-cost-based", "provider": "openrouter", "response": "O card trata da renovação do contrato anual. Já foram acordados o escopo e o prazo; falta aprovar o valor final.", "prompt": "Resuma em até 3 linhas o que já foi combinado no card P-80.", "status": "completed", "error": null, "latency": 4210, "invoice_id": null, "bill_computed": false, "tokens_used": 1284, "credits_debited": "1.300000000", "credit_transaction_id": "019b6b4d-9a02-71ce-8b77-3c5f0e2a8d41", "created_at": "2026-09-18T11:52:03.000000Z", "updated_at": "2026-09-18T11:52:08.000000Z", "steps": [ { "index": 0, "provider": "openrouter", "model": "openrouter/auto-cost-based", "text": null, "tool_calls": [ { "id": "call_01", "name": "get-project-details-tool", "arguments": { "project_id": "019b140c-235d-73ee-96df-3d2afbf7d13d" }, "result_id": null, "reasoning_id": null, "reasoning_summary": null } ], "tool_results": [ { "id": "call_01", "name": "get-project-details-tool", "arguments": { "project_id": "019b140c-235d-73ee-96df-3d2afbf7d13d" }, "result": "{\"project\":{\"code\":\"P-80\",\"name\":\"Renovação anual\"}}", "result_id": null } ], "finish_reason": "tool_calls", "prompt_tokens": 742, "completion_tokens": 48, "cached_tokens": 0, "cache_write_tokens": 0, "reasoning_tokens": 0, "cost": "0.000410000", "created_at": "2026-09-18T11:52:05.000000Z" }, { "index": 1, "provider": "openrouter", "model": "openrouter/auto-cost-based", "text": "O card trata da renovação do contrato anual. Já foram acordados o escopo e o prazo; falta aprovar o valor final.", "tool_calls": [], "tool_results": [], "finish_reason": "stop", "prompt_tokens": 431, "completion_tokens": 63, "cached_tokens": 0, "cache_write_tokens": 0, "reasoning_tokens": 0, "cost": "0.000230000", "created_at": "2026-09-18T11:52:08.000000Z" } ] }, "response": true } } } }, "404": { "description": "Execução não encontrada", "content": { "application/json": { "schema": { "type": "object", "description": "Execução não encontrado no escopo da empresa autenticada.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição; sempre falso em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro; nesta resposta sempre `agent_execution_model_not_found`." }, "error": { "type": "string", "description": "Descrição do erro em linguagem natural, para log e exibição." } }, "additionalProperties": false }, "example": { "response": false, "message": "agent_execution_model_not_found", "error": "No query results for model [App\\Models\\AgentExecution] 019b6b4d-2f18-7331-b60a-91c7d2e40a55" } } } } } }, "parameters": [ { "name": "execution", "in": "path", "required": true, "description": "ID (UUID) da execução do agente.", "schema": { "type": "string" }, "example": "" } ] }, "/api/management/ai/agents/{agentId}/execute": { "post": { "tags": [ "ai-agents", "agents", "execute" ], "summary": "Executar agente", "description": "Dispara uma execução do agente: o `prompt` passa pelo motor de templates e a execução entra na fila de processamento. A resposta devolve o registro recém-criado, ainda sem resultado — o texto gerado, os tokens, os créditos consumidos e os passos aparecem depois no detalhe da execução. `model` e `provider` são opcionais e, quando enviados, substituem os padrões do agente apenas nesta execução.", "operationId": "executarAgente", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Execução criada e enfileirada.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição; sempre verdadeiro nesta resposta." }, "execution": { "type": "object", "description": "Execução recém-enfileirada, ainda sem resultado.", "properties": { "agent_id": { "type": "string", "description": "ID (UUID) do agente executado.", "format": "uuid" }, "provider": { "type": "string", "description": "Provedor de IA que vai processar a execução.", "enum": [ "openrouter", "google", "openai", "anthropic" ] }, "model": { "type": "string", "description": "Modelo de IA que vai processar a execução.", "nullable": true }, "prompt": { "type": "string", "description": "Instrução enviada ao agente, já com o template renderizado.", "nullable": true }, "frame_id": { "type": "string", "description": "ID (UUID) da empresa dona da execução.", "format": "uuid" }, "updated_at": { "type": "string", "description": "Data e hora da última alteração do registro.", "format": "date-time" }, "created_at": { "type": "string", "description": "Data e hora em que a execução foi enfileirada.", "format": "date-time" }, "id": { "type": "string", "description": "ID (UUID) da execução, usado para consultar o resultado depois.", "format": "uuid" } }, "additionalProperties": false } }, "additionalProperties": false }, "example": { "response": true, "execution": { "agent_id": "019b6b1a-4c21-73d6-9f0e-5a1c8d3e7b04", "provider": "openrouter", "model": "openrouter/auto-cost-based", "prompt": "Resuma em até 3 linhas o que já foi combinado no card P-80.", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "updated_at": "2026-09-18T11:52:03.000000Z", "created_at": "2026-09-18T11:52:03.000000Z", "id": "019b6b4d-2f18-7331-b60a-91c7d2e40a55" } } } } }, "402": { "description": "Créditos de IA esgotados", "content": { "application/json": { "schema": { "type": "object", "description": "Saldo de créditos de IA esgotado; nenhuma execução é criada.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição; sempre falso em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro; nesta resposta sempre `insufficient_credits`." }, "error": { "type": "string", "description": "Descrição do erro em linguagem natural, para log e exibição." }, "service": { "type": "string", "description": "Classe interna que originou o erro, útil apenas para diagnóstico." }, "available_credits": { "type": "number", "description": "Saldo de créditos no momento do bloqueio, zero ou negativo." }, "auto_recharge_status": { "type": "string", "description": "Situação da recarga automática: `disabled` quando está desligada, `failed` quando a última tentativa foi recusada.", "enum": [ "disabled", "failed" ] } }, "additionalProperties": false }, "example": { "response": false, "service": "App\\Exceptions\\Services\\AI\\InsufficientCreditsException", "message": "insufficient_credits", "error": "AI credits depleted and auto-recharge is disabled. Purchase a credit pack to continue.", "available_credits": 0, "auto_recharge_status": "disabled" } } } }, "404": { "description": "Agente não encontrado", "content": { "application/json": { "schema": { "type": "object", "description": "Agente de IA não encontrado no escopo da empresa autenticada.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição; sempre falso em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro; nesta resposta sempre `ai_agent_model_not_found`." }, "error": { "type": "string", "description": "Descrição do erro em linguagem natural, para log e exibição." } }, "additionalProperties": false }, "example": { "response": false, "message": "ai_agent_model_not_found", "error": "No query results for model [App\\Models\\AiAgent] 019b6b1a-4c21-73d6-9f0e-5a1c8d3e7b04" } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "description": "Entrada da execução do agente.", "properties": { "prompt": { "type": "string", "description": "Instrução enviada ao agente. Passa pelo motor de templates antes de chegar ao modelo." }, "model": { "type": "string", "description": "Modelo a usar apenas nesta execução; quando ausente ou nulo vale o modelo padrão do agente.", "nullable": true }, "provider": { "type": "string", "description": "Provedor a usar apenas nesta execução; quando ausente ou nulo vale o provedor padrão do agente.", "enum": [ "openrouter", "google", "openai", "anthropic", null ], "nullable": true } }, "required": [ "prompt" ], "additionalProperties": false }, "example": { "prompt": "Resuma em até 3 linhas o que já foi combinado no card P-80.", "model": null, "provider": null } } } } }, "parameters": [ { "name": "agentId", "in": "path", "required": true, "description": "ID (UUID) do agente de IA a ser executado.", "schema": { "type": "string" }, "example": "" } ] }, "/api/management/ai/agents/{agentId}/contexts/reorder": { "put": { "tags": [ "ai-agents", "agents", "contexts", "reorder" ], "summary": "Reordenar contextos do agente", "description": "Redefine a posição dos contextos do agente. Envie cada contexto com seu `id` e a nova `order`; todos os IDs precisam pertencer a este agente, e os contextos que não aparecerem na lista ficam com a posição que já tinham.", "operationId": "reordenarContextosDoAgente", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Confirmação da reordenação, sem corpo de dados.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição; sempre verdadeiro nesta resposta." } }, "additionalProperties": false }, "example": { "response": true } } } }, "422": { "description": "Erro de validação", "content": { "application/json": { "schema": { "type": "object", "description": "Erro de validação dos dados enviados.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição; sempre falso em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro; nesta resposta sempre `validation_errors`." }, "error": { "type": "string", "description": "Descrição do erro em linguagem natural, para log e exibição." }, "validation": { "type": "object", "description": "Mapa de campo inválido para a lista de mensagens de erro daquele campo.", "additionalProperties": { "type": "array", "description": "Mensagens de erro do campo.", "items": { "type": "string", "description": "Mensagem de erro do campo." } } } }, "additionalProperties": false }, "example": { "response": false, "message": "validation_errors", "error": "The selected contexts.0.id is invalid.", "validation": { "contexts.0.id": [ "The selected contexts.0.id is invalid." ] } } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "description": "Novas posições dos contextos do agente.", "properties": { "contexts": { "type": "array", "description": "Contextos a reposicionar; os que não aparecerem na lista mantêm a posição atual.", "items": { "type": "object", "description": "Nova posição de um contexto.", "properties": { "id": { "type": "string", "description": "ID (UUID) de um contexto que pertence a este agente.", "format": "uuid" }, "order": { "type": "integer", "description": "Nova posição do contexto na sequência aplicada ao prompt." } }, "required": [ "id", "order" ], "additionalProperties": false } } }, "required": [ "contexts" ], "additionalProperties": false }, "example": { "contexts": [ { "id": null, "order": 0 } ] } } } } }, "parameters": [ { "name": "agentId", "in": "path", "required": true, "description": "ID (UUID) do agente de IA dono dos contextos.", "schema": { "type": "string" }, "example": "" } ] }, "/api/management/ai/agents/{agentId}/contexts": { "get": { "tags": [ "ai-agents", "agents", "contexts" ], "summary": "Listar contextos do agente", "description": "Lista os contextos do agente na ordem em que são aplicados ao prompt. Em contextos do tipo `file`, `content` vem como um endereço temporário para baixar o arquivo.", "operationId": "listarContextosDoAgente", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Contextos do agente, na ordem de aplicação. Esta resposta não traz a chave `response`.", "properties": { "contexts": { "type": "array", "description": "Contextos do agente, ordenados por `order`.", "items": { "type": "object", "description": "Contexto do agente.", "properties": { "id": { "type": "string", "description": "ID (UUID) do contexto.", "format": "uuid" }, "ai_agent_id": { "type": "string", "description": "ID (UUID) do agente dono do contexto.", "format": "uuid" }, "type": { "type": "string", "description": "Tipo do contexto: `text` para texto escrito à mão, `file` para arquivo enviado.", "enum": [ "text", "file" ] }, "content": { "type": "string", "description": "Texto do contexto quando o tipo é `text`; endereço temporário para baixar o arquivo quando o tipo é `file`.", "nullable": true }, "mime_type": { "type": "string", "description": "Tipo do arquivo enviado; nulo em contextos de texto.", "nullable": true }, "order": { "type": "integer", "description": "Posição do contexto na sequência aplicada ao prompt, começando em zero." }, "is_active": { "type": "boolean", "description": "Indica se o contexto é aplicado ao prompt do agente." }, "created_at": { "type": "string", "description": "Data e hora de criação do contexto.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data e hora da última alteração do contexto.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data e hora da exclusão lógica; nulo enquanto o contexto está ativo.", "format": "date-time", "nullable": true } }, "additionalProperties": false } } }, "additionalProperties": false }, "example": { "contexts": [ { "id": "019b6b55-1ad4-7290-91cc-6e0b8fa21c37", "ai_agent_id": "019b6b1a-4c21-73d6-9f0e-5a1c8d3e7b04", "type": "text", "content": "Responda sempre em português do Brasil e em no máximo 3 parágrafos.", "mime_type": null, "order": 0, "is_active": true, "created_at": "2026-08-14T13:02:11.000000Z", "updated_at": "2026-08-14T13:02:11.000000Z", "deleted_at": null }, { "id": "019b6b55-8e4a-70b3-bb2e-7f10c92ad5e1", "ai_agent_id": "019b6b1a-4c21-73d6-9f0e-5a1c8d3e7b04", "type": "file", "content": "https://olie-storage.s3.sa-east-1.amazonaws.com/ai_agent_context/019b6b55-8e4a-70b3-bb2e-7f10c92ad5e1.pdf?X-Amz-Expires=86400&X-Amz-Signature=REDACTED", "mime_type": "application/pdf", "order": 1, "is_active": true, "created_at": "2026-08-20T10:41:09.000000Z", "updated_at": "2026-08-20T10:41:09.000000Z", "deleted_at": null } ] } } } }, "404": { "description": "Agente não encontrado", "content": { "application/json": { "schema": { "type": "object", "description": "Agente de IA não encontrado no escopo da empresa autenticada.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição; sempre falso em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro; nesta resposta sempre `ai_agent_model_not_found`." }, "error": { "type": "string", "description": "Descrição do erro em linguagem natural, para log e exibição." } }, "additionalProperties": false }, "example": { "response": false, "message": "ai_agent_model_not_found", "error": "No query results for model [App\\Models\\AiAgent] 019b6b1a-4c21-73d6-9f0e-5a1c8d3e7b04" } } } } } }, "post": { "tags": [ "ai-agents", "agents", "contexts" ], "summary": "Criar contexto do agente", "description": "Cria um contexto do agente. Sem `order`, ele entra no fim da lista. Para `type: \"text\"` envie o texto em `content`; para `type: \"file\"` envie a requisição como `multipart/form-data` com o arquivo no campo `file` (imagem ou PDF, até 10 MB) — nesse caso o `content` passa a apontar para o arquivo armazenado.", "operationId": "criarContextoDoAgente", "responses": { "201": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Contexto recém-criado.", "properties": { "type": { "type": "string", "description": "Tipo do contexto.", "enum": [ "text", "file" ] }, "content": { "type": "string", "description": "Texto do contexto ou endereço do arquivo armazenado.", "nullable": true }, "mime_type": { "type": "string", "description": "Tipo do arquivo enviado; presente apenas em contextos do tipo `file`." }, "order": { "type": "integer", "description": "Posição do contexto na sequência aplicada ao prompt." }, "is_active": { "type": "boolean", "description": "Indica se o contexto é aplicado ao prompt do agente." }, "ai_agent_id": { "type": "string", "description": "ID (UUID) do agente dono do contexto.", "format": "uuid" }, "updated_at": { "type": "string", "description": "Data e hora da última alteração do contexto.", "format": "date-time" }, "created_at": { "type": "string", "description": "Data e hora de criação do contexto.", "format": "date-time" }, "id": { "type": "string", "description": "ID (UUID) do contexto.", "format": "uuid" } }, "additionalProperties": false }, "example": { "type": "text", "content": "Responda sempre em português do Brasil e em no máximo 3 parágrafos.", "is_active": true, "order": 2, "ai_agent_id": "019b6b1a-4c21-73d6-9f0e-5a1c8d3e7b04", "updated_at": "2026-09-18T12:05:44.000000Z", "created_at": "2026-09-18T12:05:44.000000Z", "id": "019b6b60-3c91-7018-86d4-0a2e9b7f5c33" } } } }, "404": { "description": "Agente não encontrado", "content": { "application/json": { "schema": { "type": "object", "description": "Agente de IA não encontrado no escopo da empresa autenticada.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição; sempre falso em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro; nesta resposta sempre `ai_agent_model_not_found`." }, "error": { "type": "string", "description": "Descrição do erro em linguagem natural, para log e exibição." } }, "additionalProperties": false }, "example": { "response": false, "message": "ai_agent_model_not_found", "error": "No query results for model [App\\Models\\AiAgent] 019b6b1a-4c21-73d6-9f0e-5a1c8d3e7b04" } } } }, "422": { "description": "Erro de validação", "content": { "application/json": { "schema": { "type": "object", "description": "Erro de validação dos dados enviados.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição; sempre falso em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro; nesta resposta sempre `validation_errors`." }, "error": { "type": "string", "description": "Descrição do erro em linguagem natural, para log e exibição." }, "validation": { "type": "object", "description": "Mapa de campo inválido para a lista de mensagens de erro daquele campo.", "additionalProperties": { "type": "array", "description": "Mensagens de erro do campo.", "items": { "type": "string", "description": "Mensagem de erro do campo." } } } }, "additionalProperties": false }, "example": { "response": false, "message": "validation_errors", "error": "The selected type is invalid. (and 1 more error)", "validation": { "type": [ "The selected type is invalid." ], "content": [ "The content field is required when file is not present." ] } } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "description": "Dados do contexto a criar. Contextos do tipo `file` exigem uma requisição multipart/form-data.", "properties": { "type": { "type": "string", "description": "Tipo do contexto.", "enum": [ "text", "file" ] }, "content": { "type": "string", "description": "Texto do contexto. Obrigatório quando nenhum arquivo é enviado.", "nullable": true }, "file": { "type": "string", "description": "Arquivo do contexto: imagem ou PDF de até 10 MB. Obrigatório quando `type` é `file` e só pode ser enviado em requisição multipart/form-data.", "format": "binary" }, "order": { "type": "integer", "description": "Posição do contexto na sequência. Omita o campo para acrescentar o contexto ao fim da lista." }, "is_active": { "type": "boolean", "description": "Define se o contexto é aplicado ao prompt. Quando omitido, o contexto nasce ativo." } }, "required": [ "type" ], "additionalProperties": false }, "example": { "type": "text", "content": "Responda sempre em português do Brasil e em no máximo 3 parágrafos.", "is_active": true } } } } }, "parameters": [ { "name": "agentId", "in": "path", "required": true, "description": "ID (UUID) do agente de IA dono do contexto.", "schema": { "type": "string" }, "example": "" } ] }, "/api/management/ai/agents/{agentId}/contexts/{contextId}": { "put": { "tags": [ "ai-agents", "agents", "contexts" ], "summary": "Atualizar contexto do agente", "description": "Atualiza um contexto do agente; o tipo não pode ser trocado. Em um contexto de texto, `content` é obrigatório. Em um contexto de arquivo, envie a requisição como `multipart/form-data` com um novo `file`, e o arquivo anterior é apagado.", "operationId": "atualizarContextoDoAgente", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Contexto já com as alterações aplicadas.", "properties": { "id": { "type": "string", "description": "ID (UUID) do contexto.", "format": "uuid" }, "ai_agent_id": { "type": "string", "description": "ID (UUID) do agente dono do contexto.", "format": "uuid" }, "type": { "type": "string", "description": "Tipo do contexto: `text` para texto escrito à mão, `file` para arquivo enviado.", "enum": [ "text", "file" ] }, "content": { "type": "string", "description": "Texto do contexto quando o tipo é `text`; endereço temporário para baixar o arquivo quando o tipo é `file`.", "nullable": true }, "mime_type": { "type": "string", "description": "Tipo do arquivo enviado; nulo em contextos de texto.", "nullable": true }, "order": { "type": "integer", "description": "Posição do contexto na sequência aplicada ao prompt, começando em zero." }, "is_active": { "type": "boolean", "description": "Indica se o contexto é aplicado ao prompt do agente." }, "created_at": { "type": "string", "description": "Data e hora de criação do contexto.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data e hora da última alteração do contexto.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data e hora da exclusão lógica; nulo enquanto o contexto está ativo.", "format": "date-time", "nullable": true } }, "additionalProperties": false }, "example": { "id": "019b6b55-1ad4-7290-91cc-6e0b8fa21c37", "ai_agent_id": "019b6b1a-4c21-73d6-9f0e-5a1c8d3e7b04", "type": "text", "content": "Responda sempre em português do Brasil e em no máximo 3 parágrafos.", "mime_type": null, "order": 0, "is_active": true, "created_at": "2026-08-14T13:02:11.000000Z", "updated_at": "2026-09-18T12:09:31.000000Z", "deleted_at": null } } } }, "404": { "description": "Contexto não encontrado", "content": { "application/json": { "schema": { "type": "object", "description": "Contexto do agente não encontrado no escopo da empresa autenticada.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição; sempre falso em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro; nesta resposta sempre `ai_agent_context_model_not_found`." }, "error": { "type": "string", "description": "Descrição do erro em linguagem natural, para log e exibição." } }, "additionalProperties": false }, "example": { "response": false, "message": "ai_agent_context_model_not_found", "error": "No query results for model [App\\Models\\AiAgentContext] 019b6b55-1ad4-7290-91cc-6e0b8fa21c37" } } } }, "422": { "description": "Erro de validação", "content": { "application/json": { "schema": { "type": "object", "description": "Erro de validação dos dados enviados.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição; sempre falso em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro; nesta resposta sempre `validation_errors`." }, "error": { "type": "string", "description": "Descrição do erro em linguagem natural, para log e exibição." }, "validation": { "type": "object", "description": "Mapa de campo inválido para a lista de mensagens de erro daquele campo.", "additionalProperties": { "type": "array", "description": "Mensagens de erro do campo.", "items": { "type": "string", "description": "Mensagem de erro do campo." } } } }, "additionalProperties": false }, "example": { "response": false, "message": "validation_errors", "error": "The content field is required.", "validation": { "content": [ "The content field is required." ] } } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "description": "Campos do contexto a alterar; o tipo não pode ser trocado.", "properties": { "content": { "type": "string", "description": "Novo texto do contexto. Obrigatório em contextos do tipo `text` e ignorado em contextos do tipo `file`." }, "file": { "type": "string", "description": "Novo arquivo do contexto, de até 10 MB. Aceito apenas em contextos do tipo `file` e apenas em requisição multipart/form-data; substitui e apaga o arquivo anterior.", "format": "binary" }, "order": { "type": "integer", "description": "Nova posição do contexto na sequência aplicada ao prompt." }, "is_active": { "type": "boolean", "description": "Define se o contexto é aplicado ao prompt." } }, "additionalProperties": false }, "example": { "content": "Responda sempre em português do Brasil e em no máximo 3 parágrafos.", "is_active": true } } } } }, "delete": { "tags": [ "ai-agents", "agents", "contexts" ], "summary": "Remover contexto do agente", "description": "Remove um contexto do agente e, quando ele é do tipo `file`, apaga também o arquivo armazenado. Responde sem corpo; os demais contextos mantêm a posição que já tinham.", "operationId": "deletarContextoDoAgente", "responses": { "204": { "description": "Sucesso", "content": { "application/json": { "schema": { "description": "Resposta 204 sem corpo: o contexto foi removido.", "nullable": true }, "example": {} } } }, "404": { "description": "Contexto não encontrado", "content": { "application/json": { "schema": { "type": "object", "description": "Contexto do agente não encontrado no escopo da empresa autenticada.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição; sempre falso em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro; nesta resposta sempre `ai_agent_context_model_not_found`." }, "error": { "type": "string", "description": "Descrição do erro em linguagem natural, para log e exibição." } }, "additionalProperties": false }, "example": { "response": false, "message": "ai_agent_context_model_not_found", "error": "No query results for model [App\\Models\\AiAgentContext] 019b6b55-1ad4-7290-91cc-6e0b8fa21c37" } } } } } }, "parameters": [ { "name": "agentId", "in": "path", "required": true, "description": "ID (UUID) do agente de IA dono do contexto.", "schema": { "type": "string" }, "example": "" }, { "name": "contextId", "in": "path", "required": true, "description": "ID (UUID) do contexto do agente.", "schema": { "type": "string" }, "example": "" } ] }, "/api/management/ai/agents": { "get": { "tags": [ "ai-agents", "agents" ], "summary": "Listar agentes de IA", "description": "Lista os agentes de IA da empresa, cada um já acompanhado da contagem e do custo somado de suas execuções e das etapas de funil em que atua como assistente. A lista vem inteira, sem paginação; use `search` para filtrar pelo nome.", "operationId": "listarAgentesDeIa", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Lista completa dos agentes de IA da empresa.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição; sempre verdadeiro nesta resposta." }, "agents": { "type": "array", "description": "Agentes de IA da empresa, sem paginação.", "items": { "type": "object", "description": "Agente de IA da empresa.", "properties": { "id": { "type": "string", "description": "ID (UUID) do agente.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do agente." }, "description": { "type": "string", "description": "Descrição curta do agente, exibida na interface.", "nullable": true }, "default_provider": { "type": "string", "description": "Provedor de IA usado por padrão nas execuções do agente.", "enum": [ "openrouter", "google", "openai", "anthropic", null ], "nullable": true }, "default_model": { "type": "string", "description": "Identificador do modelo de IA usado por padrão nas execuções do agente.", "nullable": true }, "base_prompt": { "type": "string", "description": "Prompt base que define o comportamento do agente.", "nullable": true }, "status": { "type": "string", "description": "Situação do agente.", "enum": [ "active", "inactive" ] }, "tools": { "type": "array", "description": "Ferramentas habilitadas para o agente.", "items": { "type": "string", "description": "Nome de uma ferramenta habilitada.", "enum": [ "get-project-details-tool", "get-project-media-tool", "get-project-funnel-metrics-tool", "get-form-tool", "get-model-dynamic-forms-tool", "get-form-answers-tool", "set-form-answers-tool", "move-project-to-funnel-step-tool", "get-projects-in-step-tool", "get-user-tool", "index-project-funnels-tool", "index-projects-tool", "web-search-tool", "today-tool", "save-media-tool", "edit-project-tool", "create-project-tool", "quick-create-project-tool", "clone-project-tool", "get-project-step-metrics-tool", "get-funnel-step-transitions-tool" ] }, "nullable": true }, "structured_output": { "type": "object", "description": "Formato estruturado de saída configurado para o agente; nulo quando a resposta é texto livre.", "additionalProperties": true, "nullable": true }, "frame_id": { "type": "string", "description": "ID (UUID) da empresa dona do agente.", "format": "uuid" }, "created_at": { "type": "string", "description": "Data e hora de criação do agente.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data e hora da última alteração do agente.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data e hora da exclusão lógica; nulo enquanto o agente está ativo.", "format": "date-time", "nullable": true }, "created_by": { "type": "string", "description": "ID (UUID) do usuário que criou o agente.", "format": "uuid", "nullable": true }, "executions_count": { "type": "integer", "description": "Quantidade de execuções já registradas para o agente." }, "executions_sum_cost": { "type": "string", "description": "Custo somado das execuções do agente, em dólares e com nove casas decimais; nulo quando o agente ainda não foi executado.", "nullable": true }, "step_assistants": { "type": "array", "description": "Etapas de funil em que o agente atua como assistente.", "items": { "type": "object", "description": "Vínculo do agente com uma etapa de funil.", "properties": { "id": { "type": "string", "description": "ID (UUID) do assistente de etapa.", "format": "uuid" }, "funnel_step_id": { "type": "integer", "description": "ID da etapa de funil em que o agente atua." }, "ai_agent_id": { "type": "string", "description": "ID (UUID) do agente vinculado à etapa.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do assistente de etapa." }, "funnel_step": { "type": "object", "description": "Etapa de funil em que o assistente está configurado.", "properties": { "id": { "type": "integer", "description": "ID da etapa de funil." }, "name": { "type": "string", "description": "Nome da etapa de funil." } }, "additionalProperties": false } }, "additionalProperties": false } }, "creator": { "type": "object", "description": "Usuário que criou o agente; nulo quando o agente foi criado por uma integração.", "properties": { "id": { "type": "string", "description": "ID (UUID) do usuário.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do usuário." }, "avatar_url": { "type": "string", "description": "Endereço da foto de perfil do usuário.", "nullable": true } }, "additionalProperties": false } }, "additionalProperties": false } } }, "additionalProperties": false }, "example": { "response": true, "agents": [ { "id": "019b6b1a-4c21-73d6-9f0e-5a1c8d3e7b04", "name": "Triador de entrada", "description": "Classifica e resume os cards que chegam no funil de atendimento.", "default_provider": "openrouter", "default_model": "openrouter/auto-cost-based", "base_prompt": "Você é um assistente que lê o card recém-criado e escreve um resumo objetivo em até 3 linhas.", "status": "active", "tools": [ "get-project-details-tool", "index-projects-tool", "today-tool" ], "structured_output": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2026-08-14T13:02:11.000000Z", "updated_at": "2026-09-02T18:45:03.000000Z", "deleted_at": null, "created_by": "019aeaa3-2370-731c-9008-be759795f449", "executions_count": 128, "executions_sum_cost": "0.412800000", "step_assistants": [ { "id": "019b6b1b-0a77-71f2-8c44-2f9d6ab15e30", "name": "Resumo automático na triagem", "funnel_step_id": 3808, "ai_agent_id": "019b6b1a-4c21-73d6-9f0e-5a1c8d3e7b04", "funnel_step": { "id": 3808, "name": "Triagem" } } ], "creator": { "id": "019aeaa3-2370-731c-9008-be759795f449", "name": "Test User", "avatar_url": null } }, { "id": "019b6b2c-9de0-7188-b3a1-0c6f47ab2211", "name": "Redator de propostas", "description": "Gera o rascunho da proposta comercial a partir dos dados do card.", "default_provider": "openrouter", "default_model": "openrouter/auto", "base_prompt": null, "status": "active", "tools": [], "structured_output": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2026-09-01T09:18:40.000000Z", "updated_at": "2026-09-01T09:18:40.000000Z", "deleted_at": null, "created_by": "019aeaa3-2370-731c-9008-be759795f449", "executions_count": 0, "executions_sum_cost": null, "step_assistants": [], "creator": { "id": "019aeaa3-2370-731c-9008-be759795f449", "name": "Test User", "avatar_url": null } } ] } } } } }, "parameters": [ { "name": "search", "in": "query", "description": "Filtra os agentes cujo nome contenha o termo informado.", "schema": { "type": "string" }, "example": "" } ] }, "post": { "tags": [ "ai-agents", "agents" ], "summary": "Criar agente de IA", "description": "Cria um agente de IA. No modo manual (padrão) informe `name`, `description`, `default_provider` e `default_model`; `tools` aceita apenas os nomes devolvidos pelo endpoint de ferramentas disponíveis. Com `auto_generate: true` basta enviar `description`: o sistema redige nome, prompt base, ferramentas e os contextos iniciais do agente, e nesse modo a criação respeita o limite de agentes contratado, respondendo 402 quando ele já foi atingido.", "operationId": "criarAgenteDeIa", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "description": "Dados para criar um agente de IA.", "properties": { "name": { "type": "string", "description": "Nome do agente. Obrigatório quando `auto_generate` é falso ou ausente.", "maxLength": 255 }, "description": { "type": "string", "description": "Descrição curta do agente. No modo de geração automática é a partir dela que o agente inteiro é redigido.", "maxLength": 255 }, "default_provider": { "type": "string", "description": "Provedor de IA padrão do agente. Obrigatório quando `auto_generate` é falso ou ausente.", "enum": [ "openrouter", "google", "openai", "anthropic" ] }, "default_model": { "type": "string", "description": "Identificador do modelo padrão, conforme o `id` devolvido pelo catálogo de modelos disponíveis. Obrigatório quando `auto_generate` é falso ou ausente." }, "base_prompt": { "type": "string", "description": "Prompt base que define o comportamento do agente.", "nullable": true }, "tools": { "type": "array", "description": "Ferramentas que o agente pode usar; nomes fora do catálogo são rejeitados.", "items": { "type": "string", "description": "Nome de uma ferramenta, conforme o `name` devolvido pelo catálogo de ferramentas disponíveis.", "enum": [ "get-project-details-tool", "get-project-media-tool", "get-project-funnel-metrics-tool", "get-form-tool", "get-model-dynamic-forms-tool", "get-form-answers-tool", "set-form-answers-tool", "move-project-to-funnel-step-tool", "get-projects-in-step-tool", "get-user-tool", "index-project-funnels-tool", "index-projects-tool", "web-search-tool", "today-tool", "save-media-tool", "edit-project-tool", "create-project-tool", "quick-create-project-tool", "clone-project-tool", "get-project-step-metrics-tool", "get-funnel-step-transitions-tool" ] }, "nullable": true }, "auto_generate": { "type": "boolean", "description": "Quando verdadeiro, nome, prompt base, ferramentas e contextos iniciais são gerados a partir de `description` e os demais campos enviados são ignorados." } }, "required": [ "description" ], "additionalProperties": false }, "examples": { "Criar agente de IA": { "value": { "name": "Triador de entrada", "description": "Classifica e resume os cards que chegam no funil de atendimento.", "default_provider": "openrouter", "default_model": "openrouter/auto-cost-based", "base_prompt": "Leia o card recém-criado e escreva um resumo objetivo em até 3 linhas.", "tools": [], "auto_generate": false } } } } } }, "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Agente criado no modo manual.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição; sempre verdadeiro nesta resposta." }, "agent": { "type": "object", "description": "Agente recém-criado, ainda sem execuções nem contadores.", "properties": { "name": { "type": "string", "description": "Nome do agente." }, "description": { "type": "string", "description": "Descrição curta do agente.", "nullable": true }, "default_model": { "type": "string", "description": "Identificador do modelo de IA padrão do agente.", "nullable": true }, "default_provider": { "type": "string", "description": "Provedor de IA padrão do agente.", "enum": [ "openrouter", "google", "openai", "anthropic", null ], "nullable": true }, "tools": { "type": "array", "description": "Ferramentas habilitadas para o agente.", "items": { "type": "string", "description": "Nome de uma ferramenta habilitada.", "enum": [ "get-project-details-tool", "get-project-media-tool", "get-project-funnel-metrics-tool", "get-form-tool", "get-model-dynamic-forms-tool", "get-form-answers-tool", "set-form-answers-tool", "move-project-to-funnel-step-tool", "get-projects-in-step-tool", "get-user-tool", "index-project-funnels-tool", "index-projects-tool", "web-search-tool", "today-tool", "save-media-tool", "edit-project-tool", "create-project-tool", "quick-create-project-tool", "clone-project-tool", "get-project-step-metrics-tool", "get-funnel-step-transitions-tool" ] }, "nullable": true }, "base_prompt": { "type": "string", "description": "Prompt base que define o comportamento do agente.", "nullable": true }, "frame_id": { "type": "string", "description": "ID (UUID) da empresa dona do agente.", "format": "uuid" }, "created_by": { "type": "string", "description": "ID (UUID) do usuário que criou o agente.", "format": "uuid", "nullable": true }, "updated_at": { "type": "string", "description": "Data e hora da última alteração do agente.", "format": "date-time" }, "created_at": { "type": "string", "description": "Data e hora de criação do agente.", "format": "date-time" }, "id": { "type": "string", "description": "ID (UUID) do agente.", "format": "uuid" } }, "additionalProperties": false } }, "additionalProperties": false }, "examples": { "Sucesso": { "value": { "response": true, "agent": { "name": "Triador de entrada", "description": "Classifica e resume os cards que chegam no funil de atendimento.", "default_model": "openrouter/auto-cost-based", "default_provider": "openrouter", "tools": [ "get-project-details-tool", "today-tool" ], "base_prompt": "Leia o card recém-criado e escreva um resumo objetivo em até 3 linhas.", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_by": "019aeaa3-2370-731c-9008-be759795f449", "updated_at": "2026-09-18T11:24:07.000000Z", "created_at": "2026-09-18T11:24:07.000000Z", "id": "019b6b1a-4c21-73d6-9f0e-5a1c8d3e7b04" } } }, "Sucesso — geração automática": { "value": { "response": true, "agent": { "name": "Triador Cards", "description": "Assistente que lê cards novos e devolve um resumo curto com a classificação sugerida.", "base_prompt": "Você é um assistente de triagem. Ao receber um card, use a ferramenta get-project-details-tool para ler os dados e devolva um resumo de até 3 linhas com a classificação sugerida.", "tools": [ "get-project-details-tool" ], "default_provider": "openrouter", "default_model": "openrouter/auto-cost-based", "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_by": "019aeaa3-2370-731c-9008-be759795f449", "updated_at": "2026-09-18T11:31:52.000000Z", "created_at": "2026-09-18T11:31:52.000000Z", "id": "019b6b3f-71a2-7404-9c2e-8b03d5e1af62" } } } } } } }, "402": { "description": "Limite de agentes atingido", "content": { "application/json": { "schema": { "type": "object", "description": "Limite de agentes de IA do plano já atingido.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição; sempre falso em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro; nesta resposta sempre `ai_agent_max_limit_exceeded`." }, "error": { "type": "string", "description": "Descrição do erro em linguagem natural, para log e exibição." }, "object_type": { "type": "string", "description": "Tipo de objeto cujo limite foi atingido." }, "limit": { "type": "integer", "description": "Quantidade máxima de agentes permitida pelo plano." }, "usage": { "type": "integer", "description": "Quantidade de agentes já existentes na empresa." } }, "additionalProperties": false }, "example": { "response": false, "message": "ai_agent_max_limit_exceeded", "error": "frame_max_limit_exceeded", "object_type": "ai_agent", "limit": 5, "usage": 5 } } } }, "422": { "description": "Erro de validação", "content": { "application/json": { "schema": { "type": "object", "description": "Erro de validação dos dados enviados.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição; sempre falso em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro; nesta resposta sempre `validation_errors`." }, "error": { "type": "string", "description": "Descrição do erro em linguagem natural, para log e exibição." }, "validation": { "type": "object", "description": "Mapa de campo inválido para a lista de mensagens de erro daquele campo.", "additionalProperties": { "type": "array", "description": "Mensagens de erro do campo.", "items": { "type": "string", "description": "Mensagem de erro do campo." } } } }, "additionalProperties": false }, "example": { "response": false, "message": "validation_errors", "error": "The name field is required. (and 1 more error)", "validation": { "name": [ "The name field is required." ], "tools": [ "The selected tools is invalid." ] } } } } } } } }, "/api/management/ai/agents/{agent}": { "get": { "tags": [ "ai-agents", "agents" ], "summary": "Obter agente de IA específico", "description": "Retorna um agente de IA com a contagem e o custo somado de suas execuções e as etapas de funil em que ele atua como assistente.", "operationId": "obterAgenteDeIaEspecFico", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Agente de IA solicitado.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição; sempre verdadeiro nesta resposta." }, "agent": { "type": "object", "description": "Agente de IA.", "properties": { "id": { "type": "string", "description": "ID (UUID) do agente.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do agente." }, "description": { "type": "string", "description": "Descrição curta do agente, exibida na interface.", "nullable": true }, "default_provider": { "type": "string", "description": "Provedor de IA usado por padrão nas execuções do agente.", "enum": [ "openrouter", "google", "openai", "anthropic", null ], "nullable": true }, "default_model": { "type": "string", "description": "Identificador do modelo de IA usado por padrão nas execuções do agente.", "nullable": true }, "base_prompt": { "type": "string", "description": "Prompt base que define o comportamento do agente.", "nullable": true }, "status": { "type": "string", "description": "Situação do agente.", "enum": [ "active", "inactive" ] }, "tools": { "type": "array", "description": "Ferramentas habilitadas para o agente.", "items": { "type": "string", "description": "Nome de uma ferramenta habilitada.", "enum": [ "get-project-details-tool", "get-project-media-tool", "get-project-funnel-metrics-tool", "get-form-tool", "get-model-dynamic-forms-tool", "get-form-answers-tool", "set-form-answers-tool", "move-project-to-funnel-step-tool", "get-projects-in-step-tool", "get-user-tool", "index-project-funnels-tool", "index-projects-tool", "web-search-tool", "today-tool", "save-media-tool", "edit-project-tool", "create-project-tool", "quick-create-project-tool", "clone-project-tool", "get-project-step-metrics-tool", "get-funnel-step-transitions-tool" ] }, "nullable": true }, "structured_output": { "type": "object", "description": "Formato estruturado de saída configurado para o agente; nulo quando a resposta é texto livre.", "additionalProperties": true, "nullable": true }, "frame_id": { "type": "string", "description": "ID (UUID) da empresa dona do agente.", "format": "uuid" }, "created_at": { "type": "string", "description": "Data e hora de criação do agente.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data e hora da última alteração do agente.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data e hora da exclusão lógica; nulo enquanto o agente está ativo.", "format": "date-time", "nullable": true }, "created_by": { "type": "string", "description": "ID (UUID) do usuário que criou o agente.", "format": "uuid", "nullable": true }, "executions_count": { "type": "integer", "description": "Quantidade de execuções já registradas para o agente." }, "executions_sum_cost": { "type": "string", "description": "Custo somado das execuções do agente, em dólares e com nove casas decimais; nulo quando o agente ainda não foi executado.", "nullable": true }, "step_assistants": { "type": "array", "description": "Etapas de funil em que o agente atua como assistente.", "items": { "type": "object", "description": "Vínculo do agente com uma etapa de funil.", "properties": { "id": { "type": "string", "description": "ID (UUID) do assistente de etapa.", "format": "uuid" }, "funnel_step_id": { "type": "integer", "description": "ID da etapa de funil em que o agente atua." }, "ai_agent_id": { "type": "string", "description": "ID (UUID) do agente vinculado à etapa.", "format": "uuid" }, "funnel_step": { "type": "object", "description": "Etapa de funil em que o assistente está configurado.", "properties": { "id": { "type": "integer", "description": "ID da etapa de funil." } }, "additionalProperties": false } }, "additionalProperties": false } }, "creator": { "type": "object", "description": "Usuário que criou o agente; nulo quando o agente foi criado por uma integração.", "properties": { "id": { "type": "string", "description": "ID (UUID) do usuário.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do usuário." }, "avatar_url": { "type": "string", "description": "Endereço da foto de perfil do usuário.", "nullable": true } }, "additionalProperties": false } }, "additionalProperties": false } }, "additionalProperties": false }, "example": { "response": true, "agent": { "id": "019b6b1a-4c21-73d6-9f0e-5a1c8d3e7b04", "name": "Triador de entrada", "description": "Classifica e resume os cards que chegam no funil de atendimento.", "default_provider": "openrouter", "default_model": "openrouter/auto-cost-based", "base_prompt": "Leia o card recém-criado e escreva um resumo objetivo em até 3 linhas.", "status": "active", "tools": [ "get-project-details-tool", "today-tool" ], "structured_output": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2026-08-14T13:02:11.000000Z", "updated_at": "2026-09-02T18:45:03.000000Z", "deleted_at": null, "created_by": "019aeaa3-2370-731c-9008-be759795f449", "executions_count": 128, "executions_sum_cost": "0.412800000", "step_assistants": [ { "id": "019b6b1b-0a77-71f2-8c44-2f9d6ab15e30", "funnel_step_id": 3808, "ai_agent_id": "019b6b1a-4c21-73d6-9f0e-5a1c8d3e7b04", "funnel_step": { "id": 3808 } } ], "creator": { "id": "019aeaa3-2370-731c-9008-be759795f449", "name": "Test User", "avatar_url": null } } } } } }, "404": { "description": "Agente não encontrado", "content": { "application/json": { "schema": { "type": "object", "description": "Agente de IA não encontrado no escopo da empresa autenticada.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição; sempre falso em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro; nesta resposta sempre `ai_agent_model_not_found`." }, "error": { "type": "string", "description": "Descrição do erro em linguagem natural, para log e exibição." } }, "additionalProperties": false }, "example": { "response": false, "message": "ai_agent_model_not_found", "error": "No query results for model [App\\Models\\AiAgent] 019b6b1a-4c21-73d6-9f0e-5a1c8d3e7b04" } } } } } }, "put": { "tags": [ "ai-agents", "agents" ], "summary": "Atualizar agente de IA", "description": "Atualiza os dados de um agente de IA. Apenas os campos enviados são alterados, e `tools` substitui por inteiro a lista de ferramentas habilitadas — enviar uma lista vazia desabilita todas.", "operationId": "atualizarAgenteDeIa", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "description": "Campos do agente a alterar; apenas os enviados são gravados.", "properties": { "name": { "type": "string", "description": "Novo nome do agente.", "maxLength": 255 }, "description": { "type": "string", "description": "Nova descrição curta do agente.", "maxLength": 255 }, "default_provider": { "type": "string", "description": "Novo provedor de IA padrão do agente.", "enum": [ "openrouter", "google", "openai", "anthropic" ] }, "default_model": { "type": "string", "description": "Novo identificador do modelo padrão, conforme o `id` devolvido pelo catálogo de modelos disponíveis." }, "base_prompt": { "type": "string", "description": "Novo prompt base do agente.", "nullable": true }, "tools": { "type": "array", "description": "Nova lista de ferramentas habilitadas; substitui a anterior por inteiro.", "items": { "type": "string", "description": "Nome de uma ferramenta, conforme o `name` devolvido pelo catálogo de ferramentas disponíveis.", "enum": [ "get-project-details-tool", "get-project-media-tool", "get-project-funnel-metrics-tool", "get-form-tool", "get-model-dynamic-forms-tool", "get-form-answers-tool", "set-form-answers-tool", "move-project-to-funnel-step-tool", "get-projects-in-step-tool", "get-user-tool", "index-project-funnels-tool", "index-projects-tool", "web-search-tool", "today-tool", "save-media-tool", "edit-project-tool", "create-project-tool", "quick-create-project-tool", "clone-project-tool", "get-project-step-metrics-tool", "get-funnel-step-transitions-tool" ] }, "nullable": true } }, "additionalProperties": false }, "examples": { "Atualizar agente de IA": { "value": { "name": "", "description": "", "default_provider": "openrouter", "default_model": "", "base_prompt": "", "tools": [] } } } } } }, "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Agente já com as alterações aplicadas.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição; sempre verdadeiro nesta resposta." }, "agent": { "type": "object", "description": "Agente de IA atualizado.", "properties": { "id": { "type": "string", "description": "ID (UUID) do agente.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do agente." }, "description": { "type": "string", "description": "Descrição curta do agente, exibida na interface.", "nullable": true }, "default_provider": { "type": "string", "description": "Provedor de IA usado por padrão nas execuções do agente.", "enum": [ "openrouter", "google", "openai", "anthropic", null ], "nullable": true }, "default_model": { "type": "string", "description": "Identificador do modelo de IA usado por padrão nas execuções do agente.", "nullable": true }, "base_prompt": { "type": "string", "description": "Prompt base que define o comportamento do agente.", "nullable": true }, "status": { "type": "string", "description": "Situação do agente.", "enum": [ "active", "inactive" ] }, "tools": { "type": "array", "description": "Ferramentas habilitadas para o agente.", "items": { "type": "string", "description": "Nome de uma ferramenta habilitada.", "enum": [ "get-project-details-tool", "get-project-media-tool", "get-project-funnel-metrics-tool", "get-form-tool", "get-model-dynamic-forms-tool", "get-form-answers-tool", "set-form-answers-tool", "move-project-to-funnel-step-tool", "get-projects-in-step-tool", "get-user-tool", "index-project-funnels-tool", "index-projects-tool", "web-search-tool", "today-tool", "save-media-tool", "edit-project-tool", "create-project-tool", "quick-create-project-tool", "clone-project-tool", "get-project-step-metrics-tool", "get-funnel-step-transitions-tool" ] }, "nullable": true }, "structured_output": { "type": "object", "description": "Formato estruturado de saída configurado para o agente; nulo quando a resposta é texto livre.", "additionalProperties": true, "nullable": true }, "frame_id": { "type": "string", "description": "ID (UUID) da empresa dona do agente.", "format": "uuid" }, "created_at": { "type": "string", "description": "Data e hora de criação do agente.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data e hora da última alteração do agente.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data e hora da exclusão lógica; nulo enquanto o agente está ativo.", "format": "date-time", "nullable": true }, "created_by": { "type": "string", "description": "ID (UUID) do usuário que criou o agente.", "format": "uuid", "nullable": true } }, "additionalProperties": false } }, "additionalProperties": false }, "example": { "response": true, "agent": { "id": "019b6b1a-4c21-73d6-9f0e-5a1c8d3e7b04", "name": "Triador de entrada (revisado)", "description": "Classifica e resume os cards que chegam no funil de atendimento.", "default_provider": "openrouter", "default_model": "openrouter/auto-cost-based", "base_prompt": "Leia o card recém-criado e escreva um resumo objetivo em até 3 linhas.", "status": "active", "tools": [ "get-project-details-tool", "index-projects-tool", "today-tool" ], "structured_output": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2026-08-14T13:02:11.000000Z", "updated_at": "2026-09-18T11:40:22.000000Z", "deleted_at": null, "created_by": "019aeaa3-2370-731c-9008-be759795f449" } } } } }, "404": { "description": "Agente não encontrado", "content": { "application/json": { "schema": { "type": "object", "description": "Agente de IA não encontrado no escopo da empresa autenticada.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição; sempre falso em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro; nesta resposta sempre `ai_agent_model_not_found`." }, "error": { "type": "string", "description": "Descrição do erro em linguagem natural, para log e exibição." } }, "additionalProperties": false }, "example": { "response": false, "message": "ai_agent_model_not_found", "error": "No query results for model [App\\Models\\AiAgent] 019b6b1a-4c21-73d6-9f0e-5a1c8d3e7b04" } } } }, "422": { "description": "Erro de validação", "content": { "application/json": { "schema": { "type": "object", "description": "Erro de validação dos dados enviados.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição; sempre falso em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro; nesta resposta sempre `validation_errors`." }, "error": { "type": "string", "description": "Descrição do erro em linguagem natural, para log e exibição." }, "validation": { "type": "object", "description": "Mapa de campo inválido para a lista de mensagens de erro daquele campo.", "additionalProperties": { "type": "array", "description": "Mensagens de erro do campo.", "items": { "type": "string", "description": "Mensagem de erro do campo." } } } }, "additionalProperties": false }, "example": { "response": false, "message": "validation_errors", "error": "The selected tools is invalid.", "validation": { "tools": [ "The selected tools is invalid." ] } } } } } } }, "delete": { "tags": [ "ai-agents", "agents" ], "summary": "Remover agente de IA", "description": "Remove um agente de IA. A exclusão é lógica: o agente deixa de aparecer nas listagens, mas as execuções já registradas continuam disponíveis no histórico de execuções.", "operationId": "deletarAgenteDeIa", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Confirmação da exclusão, sem corpo de dados.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição; sempre verdadeiro nesta resposta." } }, "additionalProperties": false }, "example": { "response": true } } } }, "404": { "description": "Agente não encontrado", "content": { "application/json": { "schema": { "type": "object", "description": "Agente de IA não encontrado no escopo da empresa autenticada.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição; sempre falso em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro; nesta resposta sempre `ai_agent_model_not_found`." }, "error": { "type": "string", "description": "Descrição do erro em linguagem natural, para log e exibição." } }, "additionalProperties": false }, "example": { "response": false, "message": "ai_agent_model_not_found", "error": "No query results for model [App\\Models\\AiAgent] 019b6b1a-4c21-73d6-9f0e-5a1c8d3e7b04" } } } } } }, "parameters": [ { "name": "agent", "in": "path", "required": true, "description": "ID (UUID) do agente de IA.", "schema": { "type": "string" }, "example": "" } ] }, "/api/management/ai/available-models": { "get": { "tags": [ "ai-agents", "available-models" ], "summary": "Listar modelos disponíveis", "description": "Lista os modelos de IA que podem ser escolhidos como padrão de um agente, reunindo os catálogos de todos os provedores. Os identificadores devolvidos em `id` e `internal_provider` são os valores aceitos em `default_model` e `default_provider` do agente. O catálogo do OpenRouter é consultado ao vivo e acompanha o preço convertido em créditos.", "operationId": "listarModelosDisponVeis", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Catálogo de modelos de todos os provedores.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição; sempre verdadeiro nesta resposta." }, "models": { "type": "array", "description": "Modelos disponíveis, agrupados por provedor na ordem openrouter, google, openai e anthropic.", "items": { "type": "object", "description": "Modelo de IA disponível para os agentes.", "properties": { "id": { "type": "string", "description": "Identificador do modelo; é o valor aceito em `default_model` do agente." }, "name": { "type": "string", "description": "Nome do modelo para exibição." }, "internal_provider": { "type": "string", "description": "Provedor que oferece o modelo; é o valor aceito em `default_provider` do agente.", "enum": [ "openrouter", "google", "openai", "anthropic" ] }, "context_length": { "type": "integer", "description": "Tamanho máximo da janela de contexto do modelo, em tokens.", "nullable": true }, "input_modalities": { "type": "array", "description": "Tipos de conteúdo que o modelo aceita na entrada, como texto, imagem e arquivo.", "items": { "type": "string", "description": "Tipo de conteúdo aceito na entrada." } }, "output_modalities": { "type": "array", "description": "Tipos de conteúdo que o modelo produz na saída.", "items": { "type": "string", "description": "Tipo de conteúdo produzido na saída." } }, "supported_parameters": { "type": "array", "description": "Recursos suportados pelo modelo, como uso de ferramentas, saída estruturada, busca na internet e raciocínio.", "items": { "type": "string", "description": "Nome de um recurso suportado pelo modelo." } }, "pricing_in_credits": { "type": "object", "description": "Preço do modelo convertido para a unidade de créditos da carteira, já com a margem aplicada. Presente nos modelos do catálogo do OpenRouter; nulo quando o modelo não tem preço público.", "properties": { "prompt_per_1m": { "type": "number", "description": "Créditos por 1 milhão de tokens de entrada.", "nullable": true }, "completion_per_1m": { "type": "number", "description": "Créditos por 1 milhão de tokens de saída.", "nullable": true }, "request": { "type": "number", "description": "Créditos cobrados por requisição, independentemente dos tokens.", "nullable": true }, "image_per_unit": { "type": "number", "description": "Créditos por imagem enviada ao modelo.", "nullable": true }, "web_search_per_unit": { "type": "number", "description": "Créditos por busca na internet feita pelo modelo.", "nullable": true }, "internal_reasoning_per_1m": { "type": "number", "description": "Créditos por 1 milhão de tokens de raciocínio interno.", "nullable": true }, "input_cache_read_per_1m": { "type": "number", "description": "Créditos por 1 milhão de tokens de entrada lidos do cache.", "nullable": true }, "input_cache_write_per_1m": { "type": "number", "description": "Créditos por 1 milhão de tokens de entrada gravados no cache.", "nullable": true } }, "additionalProperties": false }, "pricing": { "description": "Campo presente apenas nos catálogos fixos de `openai`, `google` e `anthropic`, onde o preço não é publicado; nesses casos vem sempre nulo.", "nullable": true } }, "additionalProperties": false } } }, "additionalProperties": false }, "example": { "response": true, "models": [ { "id": "openrouter/auto", "name": "Seleção automática de modelo", "internal_provider": "openrouter", "context_length": 100000, "input_modalities": [ "text", "image", "file" ], "output_modalities": [ "text" ], "supported_parameters": [ "tools", "structured_output", "web_search", "reasoning" ], "pricing_in_credits": null }, { "id": "openrouter/auto-cost-based", "name": "Seleção automática baseada em custo", "internal_provider": "openrouter", "context_length": 100000, "input_modalities": [ "text", "image", "file" ], "output_modalities": [ "text" ], "supported_parameters": [ "tools", "structured_output", "web_search", "reasoning" ], "pricing_in_credits": null }, { "id": "anthropic/claude-sonnet-4.5", "name": "Anthropic: Claude Sonnet 4.5", "internal_provider": "openrouter", "context_length": 1000000, "input_modalities": [ "text", "image", "file" ], "output_modalities": [ "text" ], "supported_parameters": [ "tools", "tool_choice", "structured_outputs", "reasoning", "max_tokens", "temperature" ], "pricing_in_credits": { "prompt_per_1m": 3900, "completion_per_1m": 19500, "request": null, "image_per_unit": null, "web_search_per_unit": null, "internal_reasoning_per_1m": null, "input_cache_read_per_1m": 390, "input_cache_write_per_1m": 4875 } }, { "id": "gemini-2.5-pro", "name": "Gemini 2.5 Pro", "internal_provider": "google", "context_length": 100000, "input_modalities": [ "text" ], "output_modalities": [ "text" ], "supported_parameters": [], "pricing": null }, { "id": "gpt-4-turbo", "name": "GPT-4 Turbo", "internal_provider": "openai", "context_length": 100000, "input_modalities": [ "text" ], "output_modalities": [ "text" ], "supported_parameters": [], "pricing": null }, { "id": "claude-3-5-sonnet-20240620", "name": "Claude 3.5 Sonnet", "internal_provider": "anthropic", "context_length": 100000, "input_modalities": [ "text" ], "output_modalities": [ "text" ], "supported_parameters": [], "pricing": null } ] } } } } }, "parameters": [ { "name": "search", "in": "query", "description": "Filtra os modelos cujo nome ou identificador contenha o termo informado.", "schema": { "type": "string" }, "example": "" }, { "name": "supportedParameters[]", "in": "query", "description": "Recurso que o modelo precisa suportar, por exemplo `tools`, `structured_output`, `web_search` ou `reasoning`. Repita o parâmetro para exigir mais de um. Aplica-se ao catálogo do OpenRouter.", "schema": { "type": "string" }, "example": "" } ] } }, "/api/management/ai/available-tools": { "get": { "tags": [ "ai-agents", "available-tools" ], "summary": "Listar ferramentas disponíveis", "description": "Lista as ferramentas que um agente pode usar. O `name` de cada item é exatamente o valor aceito no campo `tools` do agente, `inputSchema` descreve os argumentos que o modelo precisa preencher para chamá-la e `annotations` indica se ela apenas lê dados ou também escreve. O catálogo é o mesmo para todas as empresas e não tem paginação.", "operationId": "listarFerramentasDisponVeis", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Catálogo de ferramentas dos agentes.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição; sempre verdadeiro nesta resposta." }, "tools": { "type": "array", "description": "Ferramentas disponíveis, na ordem em que são registradas.", "items": { "type": "object", "description": "Ferramenta que pode ser habilitada em um agente.", "properties": { "name": { "type": "string", "description": "Nome da ferramenta; é exatamente o valor aceito no campo `tools` do agente.", "enum": [ "get-project-details-tool", "get-project-media-tool", "get-project-funnel-metrics-tool", "get-form-tool", "get-model-dynamic-forms-tool", "get-form-answers-tool", "set-form-answers-tool", "move-project-to-funnel-step-tool", "get-projects-in-step-tool", "get-user-tool", "index-project-funnels-tool", "index-projects-tool", "web-search-tool", "today-tool", "save-media-tool", "edit-project-tool", "create-project-tool", "quick-create-project-tool", "clone-project-tool", "get-project-step-metrics-tool", "get-funnel-step-transitions-tool" ] }, "title": { "type": "string", "description": "Nome da ferramenta para exibição." }, "description": { "type": "string", "description": "Explicação de quando usar a ferramenta, escrita para o modelo de IA." }, "inputSchema": { "type": "object", "description": "Argumentos que o modelo precisa preencher para chamar a ferramenta.", "properties": { "type": { "type": "string", "description": "Tipo do objeto de entrada; sempre `object`." }, "properties": { "type": "object", "description": "Argumentos aceitos pela ferramenta, um por chave.", "additionalProperties": { "type": "object", "description": "Definição de um argumento da ferramenta.", "properties": { "type": { "description": "Tipo do argumento em JSON Schema.", "anyOf": [ { "type": "string" }, { "type": "array", "items": {} } ] }, "description": { "type": "string", "description": "Explicação do argumento, escrita para o modelo de IA." }, "format": { "type": "string", "description": "Formato esperado do valor, como `uuid` ou `date-time`." }, "enum": { "type": "array", "description": "Valores aceitos, quando o argumento é restrito a uma lista.", "items": { "description": "Valor aceito para o argumento.", "nullable": true, "anyOf": [ { "type": "string" }, { "type": "number" }, { "type": "boolean" } ] } }, "items": { "type": "object", "description": "Definição dos elementos, quando o argumento é uma lista.", "additionalProperties": true } }, "additionalProperties": true } }, "required": { "type": "array", "description": "Argumentos obrigatórios da ferramenta.", "items": { "type": "string", "description": "Nome de um argumento obrigatório." } } }, "additionalProperties": false }, "outputSchema": { "type": "object", "description": "Formato do resultado devolvido pela ferramenta; presente apenas nas ferramentas que declaram um.", "properties": { "type": { "type": "string", "description": "Tipo do objeto de saída; sempre `object`." }, "properties": { "type": "object", "description": "Campos devolvidos pela ferramenta.", "additionalProperties": { "type": "object", "description": "Definição de um argumento da ferramenta.", "properties": { "type": { "description": "Tipo do argumento em JSON Schema.", "anyOf": [ { "type": "string" }, { "type": "array", "items": {} } ] }, "description": { "type": "string", "description": "Explicação do argumento, escrita para o modelo de IA." }, "format": { "type": "string", "description": "Formato esperado do valor, como `uuid` ou `date-time`." }, "enum": { "type": "array", "description": "Valores aceitos, quando o argumento é restrito a uma lista.", "items": { "description": "Valor aceito para o argumento.", "nullable": true, "anyOf": [ { "type": "string" }, { "type": "number" }, { "type": "boolean" } ] } }, "items": { "type": "object", "description": "Definição dos elementos, quando o argumento é uma lista.", "additionalProperties": true } }, "additionalProperties": true } } }, "additionalProperties": false }, "annotations": { "type": "object", "description": "Sinais sobre o comportamento da ferramenta, usados pelo modelo para decidir quando chamá-la.", "properties": { "readOnlyHint": { "type": "boolean", "description": "Indica que a ferramenta apenas lê dados, sem alterar nada." }, "openWorldHint": { "type": "boolean", "description": "Indica que a ferramenta acessa informação externa ao sistema." }, "destructiveHint": { "type": "boolean", "description": "Indica que a ferramenta pode apagar ou sobrescrever dados." }, "idempotentHint": { "type": "boolean", "description": "Indica que chamar a ferramenta várias vezes com os mesmos argumentos produz o mesmo efeito." } }, "additionalProperties": false } }, "additionalProperties": false } } }, "additionalProperties": false }, "example": { "response": true, "tools": [ { "name": "get-project-details-tool", "title": "Get Project Details Tool", "description": "Get the details like name, status, funnels, steps, forms, tags, groups and many other details of the project by project identifier.", "inputSchema": { "type": "object", "properties": { "project_identifier": { "type": "string", "description": "The identifier of the project to get the details of. Can be CODE (^[A-Z0-9]+-\\d+$) or ID (uuid)" } }, "required": [ "project_identifier" ] }, "annotations": { "readOnlyHint": true, "openWorldHint": false, "destructiveHint": false, "idempotentHint": true } }, { "name": "get-user-tool", "title": "Get User Tool", "description": "Get the details like name, emails, and simple info about the user by user id.", "inputSchema": { "type": "object", "properties": { "user_id": { "type": "string", "description": "The id of the user to get the details of", "format": "uuid" } }, "required": [ "user_id" ] }, "annotations": { "readOnlyHint": true, "openWorldHint": false, "destructiveHint": false, "idempotentHint": true } }, { "name": "today-tool", "title": "Today Tool", "description": "Use this tool when you need to know what is the current date and time in the format ISO 8601.", "inputSchema": { "type": "object", "properties": {} }, "annotations": { "readOnlyHint": true, "openWorldHint": false, "destructiveHint": false, "idempotentHint": true } } ] } } } } } } }, "/api/management/business-areas/{id}/restore": { "post": { "tags": [ "business-areas", "restore" ], "summary": "Restaurar uma área de negócio", "description": "Restaura uma área de negócio arquivada, devolvendo-a ao uso normal. Só funciona para áreas que estejam arquivadas. Os funis de projeto que perderam o vínculo no arquivamento não são reatribuídos: é preciso vinculá-los novamente.", "operationId": "restaurarReaDeNegCio", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Confirmação da operação.", "properties": { "response": { "type": "boolean", "description": "Indica que a requisição foi concluída com sucesso. Sempre `true`." } } }, "example": { "response": true } } } }, "404": { "description": "Não encontrada ou não arquivada", "content": { "application/json": { "schema": { "type": "object", "description": "Envelope de erro da API.", "properties": { "response": { "type": "boolean", "description": "Indica que a requisição falhou. Sempre `false`." }, "message": { "type": "string", "description": "Slug do erro. Sempre `business_area_model_not_found` quando não existe área arquivada com esse identificador na empresa." }, "error": { "type": "string", "description": "Descrição legível do erro, destinada a log e diagnóstico." } } }, "example": { "response": false, "message": "business_area_model_not_found", "error": "No query results for model [App\\Models\\BusinessArea] 24" } } } } } }, "parameters": [ { "name": "id", "in": "path", "required": true, "description": "ID da área de negócio arquivada que será restaurada.", "schema": { "type": "integer" }, "example": 0 } ] }, "/api/management/business-areas/reorder": { "post": { "tags": [ "business-areas", "reorder" ], "summary": "Reordenar áreas de negócio", "description": "Define a ordem em que as áreas de negócio aparecem na listagem. A posição de cada identificador dentro do array vira a posição da área na lista, começando em zero. Envie sempre a lista completa: áreas não citadas mantêm a posição anterior e podem acabar empatadas com as reposicionadas.", "operationId": "reordenarReasDeNegCio", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Confirmação da operação.", "properties": { "response": { "type": "boolean", "description": "Indica que a requisição foi concluída com sucesso. Sempre `true`." } } }, "example": { "response": true } } } }, "422": { "description": "Erro de validação", "content": { "application/json": { "schema": { "type": "object", "description": "Envelope de erro da API.", "properties": { "response": { "type": "boolean", "description": "Indica que a requisição falhou. Sempre `false`." }, "message": { "type": "string", "description": "Slug do erro. Sempre `validation_errors`." }, "error": { "type": "string", "description": "Descrição legível do erro, destinada a log e diagnóstico." }, "validation": { "type": "object", "description": "Mapa de campo para a lista de mensagens de validação que ele recebeu.", "additionalProperties": { "type": "array", "description": "Mensagens de validação do campo.", "items": { "type": "string", "description": "Mensagem de validação." } } } } }, "example": { "response": false, "message": "validation_errors", "error": "O campo business area ids deve ser uma matriz.", "validation": { "business_area_ids": [ "O campo business area ids deve ser uma matriz." ] } } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "description": "Nova ordem das áreas de negócio.", "additionalProperties": false, "required": [ "business_area_ids" ], "properties": { "business_area_ids": { "type": "array", "description": "Identificadores das áreas de negócio na ordem desejada; a posição no array vira o valor de `order`, começando em zero. Não pode ser vazio.", "minItems": 1, "items": { "type": "integer", "description": "Identificador de uma área de negócio da empresa." } } } }, "example": { "business_area_ids": [] } } } } } }, "/api/management/business-areas": { "get": { "tags": [ "business-areas" ], "summary": "Listar áreas de negócio", "description": "Lista todas as áreas de negócio da empresa, na ordem definida pela reordenação, incluindo as arquivadas — nestas, `deleted_at` vem preenchido. Cada item traz a quantidade de funis de projeto vinculados àquela área. A listagem devolve tudo de uma vez: não há paginação, busca nem filtros.", "operationId": "listarReasDeNegCio", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Lista completa das áreas de negócio da empresa.", "properties": { "response": { "type": "boolean", "description": "Indica que a requisição foi concluída com sucesso. Sempre `true`." }, "business_areas": { "type": "array", "description": "Áreas de negócio ordenadas por `order`, incluindo as arquivadas.", "items": { "type": "object", "description": "Área de negócio.", "properties": { "id": { "type": "integer", "description": "Identificador numérico da área de negócio." }, "name": { "type": "string", "description": "Nome da área de negócio." }, "order": { "type": "integer", "description": "Posição da área na listagem, começando em zero." }, "frame_id": { "type": "integer", "description": "Identificador interno da empresa proprietária da área." }, "deleted_at": { "type": "string", "description": "Data e hora do arquivamento, ou `null` quando a área está ativa.", "format": "date-time", "nullable": true }, "project_funnels_count": { "type": "integer", "description": "Quantidade de funis de projeto vinculados à área." } } } } } }, "example": { "response": true, "business_areas": [ { "id": 12, "name": "Comercial", "order": 0, "frame_id": 7, "deleted_at": null, "project_funnels_count": 3 }, { "id": 18, "name": "Marketing", "order": 1, "frame_id": 7, "deleted_at": null, "project_funnels_count": 1 }, { "id": 9, "name": "Pós-venda", "order": 2, "frame_id": 7, "deleted_at": "2026-08-14T13:22:05.000000Z", "project_funnels_count": 0 } ] } } } } } }, "post": { "tags": [ "business-areas" ], "summary": "Criar uma área de negócio", "description": "Cria uma área de negócio, usada para agrupar funis de projeto. O nome precisa ser único na empresa e a verificação inclui as áreas arquivadas, então reaproveitar o nome de uma área arquivada é recusado. A área nasce na posição 0 da ordenação; use a reordenação para definir onde ela aparece na lista.", "operationId": "criarReaDeNegCio", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Área de negócio recém-criada.", "properties": { "response": { "type": "boolean", "description": "Indica que a requisição foi concluída com sucesso. Sempre `true`." }, "business_area": { "type": "object", "description": "Área de negócio.", "properties": { "name": { "type": "string", "description": "Nome da área de negócio." }, "frame_id": { "type": "integer", "description": "Identificador interno da empresa proprietária da área." }, "id": { "type": "integer", "description": "Identificador numérico da área de negócio." } } } } }, "example": { "response": true, "business_area": { "name": "Comercial", "frame_id": 7, "id": 24 } } } } }, "422": { "description": "Nome já utilizado", "content": { "application/json": { "schema": { "type": "object", "description": "Envelope de erro da API.", "properties": { "response": { "type": "boolean", "description": "Indica que a requisição falhou. Sempre `false`." }, "message": { "type": "string", "description": "Slug do erro. Sempre `business_area_already_exists` quando já há uma área com esse nome, inclusive arquivada." } } }, "examples": { "Nome já utilizado": { "value": { "response": false, "message": "business_area_already_exists" } }, "Erro de validação": { "value": { "response": false, "message": "validation_errors", "error": "O campo nome é obrigatório.", "validation": { "name": [ "O campo nome é obrigatório." ] } } } } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "description": "Dados da área de negócio a ser criada.", "additionalProperties": false, "required": [ "name" ], "properties": { "name": { "type": "string", "description": "Nome da área de negócio. Precisa ser único na empresa, inclusive entre as áreas arquivadas.", "minLength": 1 } } }, "example": { "name": "Comercial" } } } } } }, "/api/management/business-areas/{business_area}": { "put": { "tags": [ "business-areas" ], "summary": "Atualizar uma área de negócio", "description": "Renomeia uma área de negócio. O identificador efetivamente usado é o `id` enviado no corpo — repita nele o mesmo valor colocado na URL. O novo nome precisa ser único na empresa, considerando também as áreas arquivadas.", "operationId": "atualizarReaDeNegCio", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Área de negócio após a atualização.", "properties": { "response": { "type": "boolean", "description": "Indica que a requisição foi concluída com sucesso. Sempre `true`." }, "business_area": { "type": "object", "description": "Área de negócio.", "properties": { "id": { "type": "integer", "description": "Identificador numérico da área de negócio." }, "name": { "type": "string", "description": "Nome da área de negócio." }, "order": { "type": "integer", "description": "Posição da área na listagem, começando em zero." }, "frame_id": { "type": "integer", "description": "Identificador interno da empresa proprietária da área." }, "deleted_at": { "type": "string", "description": "Data e hora do arquivamento, ou `null` quando a área está ativa.", "format": "date-time", "nullable": true } } } } }, "example": { "response": true, "business_area": { "id": 24, "name": "Comercial e Parcerias", "order": 0, "frame_id": 7, "deleted_at": null } } } } }, "404": { "description": "Não encontrado", "content": { "application/json": { "schema": { "type": "object", "description": "Envelope de erro da API.", "properties": { "response": { "type": "boolean", "description": "Indica que a requisição falhou. Sempre `false`." }, "message": { "type": "string", "description": "Slug do erro. Sempre `business_area_model_not_found` quando a área informada não existe na empresa." }, "error": { "type": "string", "description": "Descrição legível do erro, destinada a log e diagnóstico." } } }, "example": { "response": false, "message": "business_area_model_not_found", "error": "No query results for model [App\\Models\\BusinessArea] 24" } } } }, "422": { "description": "Nome já utilizado", "content": { "application/json": { "schema": { "type": "object", "description": "Envelope de erro da API.", "properties": { "response": { "type": "boolean", "description": "Indica que a requisição falhou. Sempre `false`." }, "message": { "type": "string", "description": "Slug do erro. Sempre `business_area_already_exists` quando já há uma área com esse nome, inclusive arquivada." } } }, "examples": { "Nome já utilizado": { "value": { "response": false, "message": "business_area_already_exists" } }, "Erro de validação": { "value": { "response": false, "message": "validation_errors", "error": "O campo id é obrigatório.", "validation": { "id": [ "O campo id é obrigatório." ] } } } } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "description": "Novos dados da área de negócio. Ambos os campos são exigidos pelo endpoint.", "additionalProperties": false, "properties": { "id": { "type": "integer", "description": "Identificador da área de negócio a ser atualizada; é este valor, e não o da URL, que determina o registro alterado. Obrigatório." }, "name": { "type": "string", "description": "Novo nome da área. Precisa ser único na empresa, inclusive entre as áreas arquivadas. Obrigatório.", "minLength": 1 } }, "required": [ "id", "name" ] }, "example": { "id": null, "name": "Comercial" } } } } }, "delete": { "tags": [ "business-areas" ], "summary": "Arquivar uma área de negócio", "description": "Arquiva uma área de negócio: a exclusão é reversível e a área continua aparecendo na listagem com `deleted_at` preenchido, podendo voltar pelo endpoint de restauração. Todos os funis de projeto que estavam nessa área ficam sem área de negócio, e esse vínculo não é refeito quando a área é restaurada.", "operationId": "arquivarReaDeNegCio", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Confirmação da operação.", "properties": { "response": { "type": "boolean", "description": "Indica que a requisição foi concluída com sucesso. Sempre `true`." } } }, "example": { "response": true } } } }, "404": { "description": "Não encontrado", "content": { "application/json": { "schema": { "type": "object", "description": "Envelope de erro da API.", "properties": { "response": { "type": "boolean", "description": "Indica que a requisição falhou. Sempre `false`." }, "message": { "type": "string", "description": "Slug do erro. Sempre `business_area_model_not_found` quando a área informada não existe na empresa." }, "error": { "type": "string", "description": "Descrição legível do erro, destinada a log e diagnóstico." } } }, "example": { "response": false, "message": "business_area_model_not_found", "error": "No query results for model [App\\Models\\BusinessArea] 24" } } } } } }, "parameters": [ { "name": "business_area", "in": "path", "required": true, "description": "ID da área de negócio a ser arquivada.", "schema": { "type": "string" }, "example": "" } ] }, "/api/management/goals/{goal}/results": { "get": { "tags": [ "goals", "results" ], "summary": "Listar resultados de uma meta", "description": "Retorna todos os resultados já apurados da meta, em ordem crescente de período e sem paginação. O campo `progress_change_percentage` compara o progresso de cada período com o do período anterior e é sempre 0 no primeiro resultado.", "operationId": "listarResultadosDeUmaMeta", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Todos os resultados já apurados da meta, em ordem crescente de período.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição. Sempre true nas respostas bem-sucedidas." }, "results": { "type": "array", "description": "Resultados apurados da meta.", "items": { "type": "object", "description": "Resultado apurado de um período da meta.", "properties": { "id": { "type": "integer", "description": "ID do resultado apurado." }, "target": { "type": "integer", "description": "Alvo vigente no período apurado." }, "progress": { "type": "integer", "description": "Progresso alcançado no período." }, "progress_change_percentage": { "type": "number", "description": "Variação percentual do progresso em relação ao período anterior. Sempre 0 no primeiro resultado." }, "period": { "type": "integer", "description": "Índice do período apurado, contado a partir de 0 na data de início da meta." }, "init_date": { "type": "string", "format": "date", "description": "Primeiro dia do período apurado, no formato YYYY-MM-DD.", "nullable": true }, "end_date": { "type": "string", "format": "date", "description": "Último dia do período apurado, no formato YYYY-MM-DD.", "nullable": true }, "created_at": { "type": "string", "format": "date-time", "description": "Momento em que o resultado foi apurado." } } } } } }, "example": { "response": true, "results": [ { "id": 1841, "target": 50, "progress": 10, "progress_change_percentage": 0, "period": 0, "init_date": "2026-01-01", "end_date": "2026-01-30", "created_at": "2026-01-31T03:00:12.000000Z" }, { "id": 1902, "target": 50, "progress": 30, "progress_change_percentage": 200, "period": 1, "init_date": "2026-01-31", "end_date": "2026-03-01", "created_at": "2026-03-02T03:00:09.000000Z" }, { "id": 1977, "target": 50, "progress": 50, "progress_change_percentage": 66.67, "period": 2, "init_date": "2026-03-02", "end_date": "2026-03-31", "created_at": "2026-04-01T03:00:07.000000Z" } ] } } } }, "404": { "description": "Meta não encontrada", "content": { "application/json": { "schema": { "type": "object", "description": "Envelope de erro da API.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição. Sempre false nas respostas de erro." }, "message": { "type": "string", "enum": [ "goal_model_not_found" ], "description": "Identificador do erro. goal_model_not_found indica que a meta informada não existe, foi removida ou pertence a outra empresa." }, "error": { "type": "string", "description": "Descrição do erro em texto livre, voltada a log e diagnóstico." } } }, "example": { "response": false, "message": "goal_model_not_found", "error": "No query results for model [App\\Models\\Goal] 9b2d1f4a-3c5e-4a7b-8d9f-1e2c3a4b5c6d" } } } } } }, "parameters": [ { "name": "goal", "in": "path", "required": true, "description": "ID (UUID) da meta.", "schema": { "type": "string" }, "example": "" } ] }, "/api/management/goals/{goal}/results/{result}": { "delete": { "tags": [ "goals", "results" ], "summary": "Deletar um resultado específico de uma meta", "description": "Remove por soft delete um resultado já apurado da meta, sem alterar o progresso atual dela. Nas metas que conseguem recalcular períodos passados (todos os tipos exceto `manual` e `composite`), a rotina automática de atualização regenera o resultado removido. Responde 204 mesmo quando o resultado informado não existe ou pertence a outra meta.", "operationId": "deletarResultadoEspecFicoDeUmaMeta", "responses": { "204": { "description": "Resultado removido", "content": { "application/json": { "schema": { "description": "Resposta sem corpo (HTTP 204).", "nullable": true }, "example": {} } } } } }, "parameters": [ { "name": "goal", "in": "path", "required": true, "description": "ID (UUID) da meta.", "schema": { "type": "string" }, "example": "" }, { "name": "result", "in": "path", "required": true, "description": "ID (numérico) do resultado apurado da meta.", "schema": { "type": "string" }, "example": "" } ] }, "/api/management/goals": { "get": { "tags": [ "goals" ], "summary": "Listar metas", "description": "Retorna a lista paginada de metas, ordenada por status (ativas primeiro) e, dentro de cada status, da mais recente para a mais antiga. Cada meta traz suas metas filhas, a contagem de resultados já apurados e a variação percentual do progresso em relação ao último resultado. Aceita [paginação](https://docs.olie.ai/api-reference/general/pagination) e [filtros básicos](https://docs.olie.ai/api-reference/general/basic-filters).", "operationId": "listarMetas", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Página de metas com os metadados da paginação.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição. Sempre true nas respostas bem-sucedidas." }, "goals": { "type": "array", "description": "Metas da página.", "items": { "type": "object", "description": "Dados da meta.", "properties": { "id": { "type": "string", "format": "uuid", "description": "ID da meta." }, "title": { "type": "string", "description": "Título da meta." }, "description": { "type": "string", "description": "Descrição livre da meta.", "nullable": true }, "status": { "type": "string", "enum": [ "active", "inactive", "completed" ], "description": "Situação da meta: active (em apuração), inactive (pausada, sem cálculo automático) ou completed (encerrada)." }, "start_date": { "type": "string", "format": "date", "description": "Data de início da apuração, no formato YYYY-MM-DD." }, "end_date": { "type": "string", "format": "date", "description": "Data de término da apuração, no formato YYYY-MM-DD. Nulo quando a meta não tem prazo final.", "nullable": true }, "periodicity": { "type": "integer", "description": "Tamanho de cada período de apuração, em dias (0 a 365). Use 0 para apurar o intervalo inteiro de uma vez, sem quebrar em períodos.", "nullable": true }, "type": { "type": "string", "enum": [ "manual", "projects_created", "projects_created_by_user", "funnel_steps_links", "funnel_steps_links_by_user", "composite" ], "description": "Tipo da meta, que define como o progresso é apurado: manual (informado à mão), projects_created (projetos criados), projects_created_by_user (projetos criados por um usuário), funnel_steps_links (entradas em uma etapa de funil), funnel_steps_links_by_user (entradas em uma etapa de funil feitas por um usuário) e composite (soma do progresso das metas filhas)." }, "user_id": { "type": "string", "format": "uuid", "description": "Usuário ao qual a meta está restrita. Preenchido apenas nos tipos projects_created_by_user e funnel_steps_links_by_user.", "nullable": true }, "funnel_step_id": { "type": "integer", "description": "Etapa de funil apurada pela meta. Preenchido apenas nos tipos funnel_steps_links e funnel_steps_links_by_user.", "nullable": true }, "target": { "type": "integer", "description": "Valor alvo da meta, na unidade indicada em unit.", "nullable": true }, "unit": { "type": "string", "enum": [ "count", "currency", "percentage" ], "description": "Unidade do alvo e do progresso: count (quantidade), currency (valor monetário) ou percentage (porcentagem)." }, "comparison_mode": { "type": "string", "enum": [ "target", "limit" ], "description": "Leitura do alvo: target quando a meta é atingir o valor, limit quando a meta é não ultrapassá-lo." }, "progress": { "type": "integer", "description": "Progresso apurado no período corrente." }, "progress_change_percentage": { "type": "number", "description": "Variação percentual do progresso atual em relação ao último resultado apurado. Vale 0 quando não há resultado anterior carregado." }, "percentage": { "type": "integer", "description": "Percentual do alvo já alcançado, arredondado para baixo." }, "is_past_calculable": { "type": "boolean", "description": "Indica se a meta consegue recalcular períodos passados. Falso nos tipos manual e composite." }, "created_at": { "type": "string", "format": "date-time", "description": "Momento em que a meta foi criada." }, "updated_at": { "type": "string", "format": "date-time", "description": "Momento da última alteração da meta." }, "deleted_at": { "type": "string", "format": "date-time", "description": "Momento em que a meta foi removida por soft delete. Nulo enquanto a meta existir.", "nullable": true }, "results_count": { "type": "integer", "description": "Quantidade de resultados já apurados da meta." }, "children": { "type": "array", "description": "Metas filhas somadas em metas do tipo composite. Vem vazio nos demais tipos.", "items": { "type": "object", "description": "Meta filha somada no progresso da meta composta.", "properties": { "id": { "type": "string", "format": "uuid", "description": "ID da meta." }, "title": { "type": "string", "description": "Título da meta." }, "description": { "type": "string", "description": "Descrição livre da meta.", "nullable": true }, "status": { "type": "string", "enum": [ "active", "inactive", "completed" ], "description": "Situação da meta: active (em apuração), inactive (pausada, sem cálculo automático) ou completed (encerrada)." }, "start_date": { "type": "string", "format": "date", "description": "Data de início da apuração, no formato YYYY-MM-DD." }, "end_date": { "type": "string", "format": "date", "description": "Data de término da apuração, no formato YYYY-MM-DD. Nulo quando a meta não tem prazo final.", "nullable": true }, "periodicity": { "type": "integer", "description": "Tamanho de cada período de apuração, em dias (0 a 365). Use 0 para apurar o intervalo inteiro de uma vez, sem quebrar em períodos.", "nullable": true }, "type": { "type": "string", "enum": [ "manual", "projects_created", "projects_created_by_user", "funnel_steps_links", "funnel_steps_links_by_user", "composite" ], "description": "Tipo da meta, que define como o progresso é apurado: manual (informado à mão), projects_created (projetos criados), projects_created_by_user (projetos criados por um usuário), funnel_steps_links (entradas em uma etapa de funil), funnel_steps_links_by_user (entradas em uma etapa de funil feitas por um usuário) e composite (soma do progresso das metas filhas)." }, "user_id": { "type": "string", "format": "uuid", "description": "Usuário ao qual a meta está restrita. Preenchido apenas nos tipos projects_created_by_user e funnel_steps_links_by_user.", "nullable": true }, "funnel_step_id": { "type": "integer", "description": "Etapa de funil apurada pela meta. Preenchido apenas nos tipos funnel_steps_links e funnel_steps_links_by_user.", "nullable": true }, "target": { "type": "integer", "description": "Valor alvo da meta, na unidade indicada em unit.", "nullable": true }, "unit": { "type": "string", "enum": [ "count", "currency", "percentage" ], "description": "Unidade do alvo e do progresso: count (quantidade), currency (valor monetário) ou percentage (porcentagem)." }, "comparison_mode": { "type": "string", "enum": [ "target", "limit" ], "description": "Leitura do alvo: target quando a meta é atingir o valor, limit quando a meta é não ultrapassá-lo." }, "progress": { "type": "integer", "description": "Progresso apurado no período corrente." }, "progress_change_percentage": { "type": "number", "description": "Variação percentual do progresso atual em relação ao último resultado apurado. Vale 0 quando não há resultado anterior carregado." }, "percentage": { "type": "integer", "description": "Percentual do alvo já alcançado, arredondado para baixo." }, "is_past_calculable": { "type": "boolean", "description": "Indica se a meta consegue recalcular períodos passados. Falso nos tipos manual e composite." }, "created_at": { "type": "string", "format": "date-time", "description": "Momento em que a meta foi criada." }, "updated_at": { "type": "string", "format": "date-time", "description": "Momento da última alteração da meta." }, "deleted_at": { "type": "string", "format": "date-time", "description": "Momento em que a meta foi removida por soft delete. Nulo enquanto a meta existir.", "nullable": true } } } } } } }, "meta": { "type": "object", "description": "Metadados da paginação.", "properties": { "current_page": { "type": "integer", "description": "Página retornada." }, "from": { "type": "integer", "description": "Posição do primeiro item da página no total. Nulo quando a página está vazia.", "nullable": true }, "last_page": { "type": "integer", "description": "Número da última página." }, "per_page": { "type": "integer", "description": "Quantidade de itens por página." }, "to": { "type": "integer", "description": "Posição do último item da página no total. Nulo quando a página está vazia.", "nullable": true }, "total": { "type": "integer", "description": "Total de metas que atendem aos filtros." } } } } }, "example": { "goals": [ { "id": "9b2d1f4a-3c5e-4a7b-8d9f-1e2c3a4b5c6d", "title": "Projetos criados no mês", "description": "Total de novos projetos abertos no período.", "status": "active", "start_date": "2026-01-01", "end_date": "2026-12-31", "periodicity": 30, "type": "projects_created", "user_id": null, "funnel_step_id": null, "target": 50, "unit": "count", "comparison_mode": "target", "progress": 32, "children": [], "progress_change_percentage": 14, "percentage": 64, "results_count": 4, "is_past_calculable": true, "created_at": "2026-01-06T14:45:51.000000Z", "updated_at": "2026-01-20T09:12:03.000000Z", "deleted_at": null }, { "id": "7a1c8e2b-9d4f-4e6a-b3c7-5f8d2a1b9c0e", "title": "Faturamento trimestral", "description": null, "status": "active", "start_date": "2026-01-01", "end_date": null, "periodicity": 90, "type": "composite", "user_id": null, "funnel_step_id": null, "target": 100000, "unit": "currency", "comparison_mode": "target", "progress": 48000, "children": [ { "id": "1f3b6d9c-2e5a-4c8b-9a7d-3e6f1b2c4d5e", "title": "Vendas via funil de marketing", "description": null, "status": "active", "start_date": "2026-01-01", "end_date": null, "periodicity": 90, "type": "funnel_steps_links", "user_id": null, "funnel_step_id": 310, "target": 60000, "unit": "currency", "comparison_mode": "target", "progress": 30000, "progress_change_percentage": 0, "percentage": 50, "is_past_calculable": true, "created_at": "2026-01-06T14:50:10.000000Z", "updated_at": "2026-01-20T09:12:03.000000Z", "deleted_at": null } ], "progress_change_percentage": 8, "percentage": 48, "results_count": 1, "is_past_calculable": false, "created_at": "2026-01-06T15:02:44.000000Z", "updated_at": "2026-01-20T09:12:03.000000Z", "deleted_at": null } ], "meta": { "current_page": 1, "from": 1, "last_page": 1, "per_page": 30, "to": 2, "total": 2 }, "response": true } } } }, "400": { "description": "Filtro não permitido", "content": { "application/json": { "schema": { "type": "object", "description": "Envelope de erro da API.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição. Sempre false nas respostas de erro." }, "message": { "type": "string", "enum": [ "invalid_filter_query" ], "description": "Identificador do erro. invalid_filter_query indica que a URL trouxe um filtro que o endpoint não aceita." }, "error": { "type": "string", "description": "Descrição do erro em texto livre, voltada a log e diagnóstico." }, "allowed_filters": { "type": "array", "description": "Filtros aceitos pelo endpoint.", "items": { "type": "string", "description": "Nome de um filtro aceito." } }, "unknown_filters": { "type": "array", "description": "Filtros enviados que o endpoint não reconhece.", "items": { "type": "string", "description": "Nome de um filtro não reconhecido." } } } }, "example": { "response": false, "message": "invalid_filter_query", "error": "Requested filter(s) `owner` are not allowed. Allowed filter(s) are `title, status, type, comparison_mode, periodicity, user_id, funnel_step_id, start_date_gte, end_date_lte, trashed`.", "allowed_filters": [ "title", "status", "type", "comparison_mode", "periodicity", "user_id", "funnel_step_id", "start_date_gte", "end_date_lte", "trashed" ], "unknown_filters": [ "owner" ] } } } }, "403": { "description": "Sem permissão", "content": { "application/json": { "schema": { "type": "object", "description": "Envelope de erro da API.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição. Sempre false nas respostas de erro." }, "message": { "type": "string", "enum": [ "permission_required" ], "description": "Identificador do erro. permission_required indica que falta permissão para a ação." }, "error": { "type": "string", "description": "Descrição do erro em texto livre, voltada a log e diagnóstico." }, "permission": { "type": "string", "description": "Permissão exigida pela ação recusada.", "nullable": true } } }, "example": { "response": false, "message": "permission_required", "error": "An permission is required to that action", "permission": "goals.index" } } } } }, "parameters": [ { "name": "filter[title]", "in": "query", "description": "Filtra pelo título da meta (correspondência parcial, sem diferenciar maiúsculas).", "schema": { "type": "string" }, "example": "" }, { "name": "filter[status]", "in": "query", "description": "Filtra pelo status exato. Valores aceitos: active, inactive, completed.", "schema": { "type": "string", "enum": [ "active", " inactive", " completed" ] }, "example": "" }, { "name": "filter[type]", "in": "query", "description": "Filtra pelo tipo exato. Valores aceitos: manual, projects_created, projects_created_by_user, funnel_steps_links, funnel_steps_links_by_user, composite.", "schema": { "type": "string" }, "example": "" }, { "name": "filter[comparison_mode]", "in": "query", "description": "Filtra pelo modo de comparação exato. Valores aceitos: target (atingir o alvo), limit (não ultrapassar o alvo).", "schema": { "type": "string" }, "example": "" }, { "name": "filter[periodicity]", "in": "query", "description": "Filtra pela periodicidade exata, em dias. Use 0 para as metas que apuram o intervalo inteiro de uma vez.", "schema": { "type": "string" }, "example": "" }, { "name": "filter[user_id]", "in": "query", "description": "Filtra as metas restritas ao usuário informado (ID UUID). Só retorna metas dos tipos projects_created_by_user e funnel_steps_links_by_user.", "schema": { "type": "string" }, "example": "" }, { "name": "filter[funnel_step_id]", "in": "query", "description": "Filtra as metas que apuram a etapa de funil informada (ID numérico). Só retorna metas dos tipos funnel_steps_links e funnel_steps_links_by_user.", "schema": { "type": "string" }, "example": "" }, { "name": "filter[start_date_gte]", "in": "query", "description": "Retorna as metas com data de início maior ou igual à data informada (YYYY-MM-DD).", "schema": { "type": "string" }, "example": "" }, { "name": "filter[end_date_lte]", "in": "query", "description": "Retorna as metas com data de término menor ou igual à data informada (YYYY-MM-DD).", "schema": { "type": "string" }, "example": "" }, { "name": "filter[trashed]", "in": "query", "description": "Controla as metas removidas. Valores aceitos: with (inclui as removidas), only (apenas as removidas). Sem o parâmetro, as removidas ficam de fora.", "schema": { "type": "string" }, "example": "" }, { "name": "sort", "in": "query", "description": "Ordenação: nome do campo para crescente ou prefixado com '-' para decrescente; vários campos separados por vírgula. Campos aceitos: title, status, created_at, updated_at, start_date, end_date, target, progress, periodicity. Padrão: status,-created_at.", "schema": { "type": "string" }, "example": "" }, { "name": "page", "in": "query", "description": "Número da página. Padrão 1.", "schema": { "type": "string" }, "example": "" }, { "name": "perPage", "in": "query", "description": "Quantidade de metas por página. Padrão 30, máximo 100.", "schema": { "type": "string" }, "example": "" } ] }, "post": { "tags": [ "goals" ], "summary": "Criar uma meta", "description": "Cria uma meta e já calcula o progresso inicial dela. Os campos de recorte (`user_id`, `funnel_step_id`) e a lista de metas filhas (`children`) só são aceitos preenchidos nos tipos que os exigem; nos demais tipos eles devem ir nulos ou vazios. Metas do tipo `manual` informam o progresso no próprio corpo.", "operationId": "criarMeta", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "description": "Dados da nova meta. Campos fora desta lista são ignorados.", "additionalProperties": false, "required": [ "title", "type", "start_date", "target" ], "properties": { "title": { "type": "string", "maxLength": 90, "description": "Título da meta. Até 90 caracteres." }, "description": { "type": "string", "maxLength": 255, "description": "Descrição livre da meta. Até 255 caracteres.", "nullable": true }, "status": { "type": "string", "enum": [ "active", "inactive", "completed" ], "description": "Situação da meta: active (em apuração), inactive (pausada, sem cálculo automático) ou completed (encerrada). Quando omitido na criação, a meta nasce inactive." }, "type": { "type": "string", "enum": [ "manual", "projects_created", "projects_created_by_user", "funnel_steps_links", "funnel_steps_links_by_user", "composite" ], "description": "Tipo da meta, que define como o progresso é apurado: manual (informado à mão), projects_created (projetos criados), projects_created_by_user (projetos criados por um usuário), funnel_steps_links (entradas em uma etapa de funil), funnel_steps_links_by_user (entradas em uma etapa de funil feitas por um usuário) e composite (soma do progresso das metas filhas)." }, "user_id": { "type": "string", "format": "uuid", "description": "Usuário ao qual a meta fica restrita. Obrigatório nos tipos projects_created_by_user e funnel_steps_links_by_user e proibido nos demais (envie nulo). O usuário precisa fazer parte da empresa.", "nullable": true }, "funnel_step_id": { "type": "integer", "description": "Etapa de funil apurada pela meta. Obrigatório nos tipos funnel_steps_links e funnel_steps_links_by_user e proibido nos demais (envie nulo).", "nullable": true }, "start_date": { "type": "string", "format": "date", "description": "Data de início da apuração, no formato YYYY-MM-DD." }, "end_date": { "type": "string", "format": "date", "description": "Data de término da apuração, no formato YYYY-MM-DD. Precisa ser posterior a start_date. Nulo deixa a meta sem prazo final.", "nullable": true }, "periodicity": { "type": "integer", "minimum": 0, "maximum": 365, "description": "Tamanho de cada período de apuração, em dias (0 a 365). Use 0 para apurar o intervalo inteiro de uma vez, sem quebrar em períodos.", "nullable": true }, "target": { "type": "integer", "minimum": 1, "description": "Valor alvo da meta, na unidade indicada em unit. Mínimo 1." }, "unit": { "type": "string", "enum": [ "count", "currency", "percentage" ], "description": "Unidade do alvo e do progresso: count (quantidade), currency (valor monetário) ou percentage (porcentagem). Padrão count." }, "comparison_mode": { "type": "string", "enum": [ "target", "limit" ], "description": "Leitura do alvo: target quando a meta é atingir o valor, limit quando a meta é não ultrapassá-lo. Padrão target." }, "progress": { "type": "integer", "minimum": 0, "description": "Progresso da meta. Só é aceito (e passa a ser obrigatório) em metas do tipo manual com status active; nos demais casos é ignorado, porque o progresso é calculado pelo sistema." }, "children": { "type": "array", "description": "IDs das metas que compõem esta meta. Obrigatório no tipo composite e proibido nos demais (envie uma lista vazia). Não aceita IDs repetidos, nem a própria meta ou alguma de suas metas-pai, para não criar ciclo.", "items": { "type": "string", "format": "uuid", "description": "ID de uma meta da mesma empresa que entra na composição." } } } }, "examples": { "Criar meta": { "value": { "title": "Reuniões de alinhamento", "description": "Encontros semanais registrados manualmente.", "type": "manual", "status": "active", "start_date": "2026-01-01", "end_date": "2026-12-31", "periodicity": 30, "target": 12, "unit": "count", "comparison_mode": "target", "progress": 0, "user_id": null, "funnel_step_id": null, "children": [] } } } } } }, "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Meta criada.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição. Sempre true nas respostas bem-sucedidas." }, "goal": { "type": "object", "description": "Dados da meta. As metas filhas (children) e a contagem de resultados (results_count) não vêm nesta resposta.", "properties": { "id": { "type": "string", "format": "uuid", "description": "ID da meta." }, "title": { "type": "string", "description": "Título da meta." }, "description": { "type": "string", "description": "Descrição livre da meta.", "nullable": true }, "status": { "type": "string", "enum": [ "active", "inactive", "completed" ], "description": "Situação da meta: active (em apuração), inactive (pausada, sem cálculo automático) ou completed (encerrada)." }, "start_date": { "type": "string", "format": "date", "description": "Data de início da apuração, no formato YYYY-MM-DD." }, "end_date": { "type": "string", "format": "date", "description": "Data de término da apuração, no formato YYYY-MM-DD. Nulo quando a meta não tem prazo final.", "nullable": true }, "periodicity": { "type": "integer", "description": "Tamanho de cada período de apuração, em dias (0 a 365). Use 0 para apurar o intervalo inteiro de uma vez, sem quebrar em períodos.", "nullable": true }, "type": { "type": "string", "enum": [ "manual", "projects_created", "projects_created_by_user", "funnel_steps_links", "funnel_steps_links_by_user", "composite" ], "description": "Tipo da meta, que define como o progresso é apurado: manual (informado à mão), projects_created (projetos criados), projects_created_by_user (projetos criados por um usuário), funnel_steps_links (entradas em uma etapa de funil), funnel_steps_links_by_user (entradas em uma etapa de funil feitas por um usuário) e composite (soma do progresso das metas filhas)." }, "user_id": { "type": "string", "format": "uuid", "description": "Usuário ao qual a meta está restrita. Preenchido apenas nos tipos projects_created_by_user e funnel_steps_links_by_user.", "nullable": true }, "funnel_step_id": { "type": "integer", "description": "Etapa de funil apurada pela meta. Preenchido apenas nos tipos funnel_steps_links e funnel_steps_links_by_user.", "nullable": true }, "target": { "type": "integer", "description": "Valor alvo da meta, na unidade indicada em unit.", "nullable": true }, "unit": { "type": "string", "enum": [ "count", "currency", "percentage" ], "description": "Unidade do alvo e do progresso: count (quantidade), currency (valor monetário) ou percentage (porcentagem)." }, "comparison_mode": { "type": "string", "enum": [ "target", "limit" ], "description": "Leitura do alvo: target quando a meta é atingir o valor, limit quando a meta é não ultrapassá-lo." }, "progress": { "type": "integer", "description": "Progresso apurado no período corrente." }, "progress_change_percentage": { "type": "number", "description": "Variação percentual do progresso atual em relação ao último resultado apurado. Vale 0 quando não há resultado anterior carregado." }, "percentage": { "type": "integer", "description": "Percentual do alvo já alcançado, arredondado para baixo." }, "is_past_calculable": { "type": "boolean", "description": "Indica se a meta consegue recalcular períodos passados. Falso nos tipos manual e composite." }, "created_at": { "type": "string", "format": "date-time", "description": "Momento em que a meta foi criada." }, "updated_at": { "type": "string", "format": "date-time", "description": "Momento da última alteração da meta." }, "deleted_at": { "type": "string", "format": "date-time", "description": "Momento em que a meta foi removida por soft delete. Nulo enquanto a meta existir.", "nullable": true } } } } }, "example": { "response": true, "goal": { "id": "9b2d1f4a-3c5e-4a7b-8d9f-1e2c3a4b5c6d", "title": "Reuniões de alinhamento", "description": "Encontros semanais registrados manualmente.", "status": "active", "start_date": "2026-01-01", "end_date": "2026-12-31", "periodicity": 30, "type": "manual", "user_id": null, "funnel_step_id": null, "target": 12, "unit": "count", "comparison_mode": "target", "progress": 0, "progress_change_percentage": 0, "percentage": 0, "is_past_calculable": false, "created_at": "2026-01-06T14:45:51.000000Z", "updated_at": "2026-01-06T14:45:51.000000Z", "deleted_at": null } } } } }, "422": { "description": "Erro de validação", "content": { "application/json": { "schema": { "type": "object", "description": "Envelope de erro da API.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição. Sempre false nas respostas de erro." }, "message": { "type": "string", "enum": [ "validation_errors" ], "description": "Identificador do erro. validation_errors indica que o corpo enviado não passou na validação." }, "error": { "type": "string", "description": "Descrição do erro em texto livre, voltada a log e diagnóstico." }, "validation": { "type": "object", "description": "Mapa de campo para a lista de mensagens de validação que ele reprovou.", "additionalProperties": { "type": "array", "description": "Mensagens de validação do campo.", "items": { "type": "string", "description": "Mensagem de validação." } } } } }, "example": { "response": false, "message": "validation_errors", "error": "O campo título é obrigatório. (and 3 more errors)", "validation": { "title": [ "O campo título é obrigatório." ], "type": [ "O campo type é obrigatório." ], "start_date": [ "O campo start date é obrigatório." ], "target": [ "O campo target é obrigatório." ] } } } } } } } }, "/api/management/goals/{goal}": { "get": { "tags": [ "goals" ], "summary": "Obter detalhes de uma meta", "description": "Retorna os dados de uma meta, com as metas filhas e a contagem de resultados já apurados. Enviar o parâmetro `refresh` recalcula e grava o progresso antes de responder.", "operationId": "obterDetalhesDeUmaMeta", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Meta solicitada.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição. Sempre true nas respostas bem-sucedidas." }, "goal": { "type": "object", "description": "Dados da meta.", "properties": { "id": { "type": "string", "format": "uuid", "description": "ID da meta." }, "title": { "type": "string", "description": "Título da meta." }, "description": { "type": "string", "description": "Descrição livre da meta.", "nullable": true }, "status": { "type": "string", "enum": [ "active", "inactive", "completed" ], "description": "Situação da meta: active (em apuração), inactive (pausada, sem cálculo automático) ou completed (encerrada)." }, "start_date": { "type": "string", "format": "date", "description": "Data de início da apuração, no formato YYYY-MM-DD." }, "end_date": { "type": "string", "format": "date", "description": "Data de término da apuração, no formato YYYY-MM-DD. Nulo quando a meta não tem prazo final.", "nullable": true }, "periodicity": { "type": "integer", "description": "Tamanho de cada período de apuração, em dias (0 a 365). Use 0 para apurar o intervalo inteiro de uma vez, sem quebrar em períodos.", "nullable": true }, "type": { "type": "string", "enum": [ "manual", "projects_created", "projects_created_by_user", "funnel_steps_links", "funnel_steps_links_by_user", "composite" ], "description": "Tipo da meta, que define como o progresso é apurado: manual (informado à mão), projects_created (projetos criados), projects_created_by_user (projetos criados por um usuário), funnel_steps_links (entradas em uma etapa de funil), funnel_steps_links_by_user (entradas em uma etapa de funil feitas por um usuário) e composite (soma do progresso das metas filhas)." }, "user_id": { "type": "string", "format": "uuid", "description": "Usuário ao qual a meta está restrita. Preenchido apenas nos tipos projects_created_by_user e funnel_steps_links_by_user.", "nullable": true }, "funnel_step_id": { "type": "integer", "description": "Etapa de funil apurada pela meta. Preenchido apenas nos tipos funnel_steps_links e funnel_steps_links_by_user.", "nullable": true }, "target": { "type": "integer", "description": "Valor alvo da meta, na unidade indicada em unit.", "nullable": true }, "unit": { "type": "string", "enum": [ "count", "currency", "percentage" ], "description": "Unidade do alvo e do progresso: count (quantidade), currency (valor monetário) ou percentage (porcentagem)." }, "comparison_mode": { "type": "string", "enum": [ "target", "limit" ], "description": "Leitura do alvo: target quando a meta é atingir o valor, limit quando a meta é não ultrapassá-lo." }, "progress": { "type": "integer", "description": "Progresso apurado no período corrente." }, "progress_change_percentage": { "type": "number", "description": "Variação percentual do progresso atual em relação ao último resultado apurado. Vale 0 quando não há resultado anterior carregado." }, "percentage": { "type": "integer", "description": "Percentual do alvo já alcançado, arredondado para baixo." }, "is_past_calculable": { "type": "boolean", "description": "Indica se a meta consegue recalcular períodos passados. Falso nos tipos manual e composite." }, "created_at": { "type": "string", "format": "date-time", "description": "Momento em que a meta foi criada." }, "updated_at": { "type": "string", "format": "date-time", "description": "Momento da última alteração da meta." }, "deleted_at": { "type": "string", "format": "date-time", "description": "Momento em que a meta foi removida por soft delete. Nulo enquanto a meta existir.", "nullable": true }, "results_count": { "type": "integer", "description": "Quantidade de resultados já apurados da meta." }, "children": { "type": "array", "description": "Metas filhas somadas em metas do tipo composite. Vem vazio nos demais tipos.", "items": { "type": "object", "description": "Meta filha somada no progresso da meta composta.", "properties": { "id": { "type": "string", "format": "uuid", "description": "ID da meta." }, "title": { "type": "string", "description": "Título da meta." }, "description": { "type": "string", "description": "Descrição livre da meta.", "nullable": true }, "status": { "type": "string", "enum": [ "active", "inactive", "completed" ], "description": "Situação da meta: active (em apuração), inactive (pausada, sem cálculo automático) ou completed (encerrada)." }, "start_date": { "type": "string", "format": "date", "description": "Data de início da apuração, no formato YYYY-MM-DD." }, "end_date": { "type": "string", "format": "date", "description": "Data de término da apuração, no formato YYYY-MM-DD. Nulo quando a meta não tem prazo final.", "nullable": true }, "periodicity": { "type": "integer", "description": "Tamanho de cada período de apuração, em dias (0 a 365). Use 0 para apurar o intervalo inteiro de uma vez, sem quebrar em períodos.", "nullable": true }, "type": { "type": "string", "enum": [ "manual", "projects_created", "projects_created_by_user", "funnel_steps_links", "funnel_steps_links_by_user", "composite" ], "description": "Tipo da meta, que define como o progresso é apurado: manual (informado à mão), projects_created (projetos criados), projects_created_by_user (projetos criados por um usuário), funnel_steps_links (entradas em uma etapa de funil), funnel_steps_links_by_user (entradas em uma etapa de funil feitas por um usuário) e composite (soma do progresso das metas filhas)." }, "user_id": { "type": "string", "format": "uuid", "description": "Usuário ao qual a meta está restrita. Preenchido apenas nos tipos projects_created_by_user e funnel_steps_links_by_user.", "nullable": true }, "funnel_step_id": { "type": "integer", "description": "Etapa de funil apurada pela meta. Preenchido apenas nos tipos funnel_steps_links e funnel_steps_links_by_user.", "nullable": true }, "target": { "type": "integer", "description": "Valor alvo da meta, na unidade indicada em unit.", "nullable": true }, "unit": { "type": "string", "enum": [ "count", "currency", "percentage" ], "description": "Unidade do alvo e do progresso: count (quantidade), currency (valor monetário) ou percentage (porcentagem)." }, "comparison_mode": { "type": "string", "enum": [ "target", "limit" ], "description": "Leitura do alvo: target quando a meta é atingir o valor, limit quando a meta é não ultrapassá-lo." }, "progress": { "type": "integer", "description": "Progresso apurado no período corrente." }, "progress_change_percentage": { "type": "number", "description": "Variação percentual do progresso atual em relação ao último resultado apurado. Vale 0 quando não há resultado anterior carregado." }, "percentage": { "type": "integer", "description": "Percentual do alvo já alcançado, arredondado para baixo." }, "is_past_calculable": { "type": "boolean", "description": "Indica se a meta consegue recalcular períodos passados. Falso nos tipos manual e composite." }, "created_at": { "type": "string", "format": "date-time", "description": "Momento em que a meta foi criada." }, "updated_at": { "type": "string", "format": "date-time", "description": "Momento da última alteração da meta." }, "deleted_at": { "type": "string", "format": "date-time", "description": "Momento em que a meta foi removida por soft delete. Nulo enquanto a meta existir.", "nullable": true } } } } } } } }, "example": { "response": true, "goal": { "id": "9b2d1f4a-3c5e-4a7b-8d9f-1e2c3a4b5c6d", "title": "Projetos criados no mês", "description": "Total de novos projetos abertos no período.", "status": "active", "start_date": "2026-01-01", "end_date": "2026-12-31", "periodicity": 30, "type": "projects_created", "user_id": null, "funnel_step_id": null, "target": 50, "unit": "count", "comparison_mode": "target", "progress": 32, "children": [], "progress_change_percentage": 0, "percentage": 64, "results_count": 4, "is_past_calculable": true, "created_at": "2026-01-06T14:45:51.000000Z", "updated_at": "2026-01-20T09:12:03.000000Z", "deleted_at": null } } } } }, "404": { "description": "Meta não encontrada", "content": { "application/json": { "schema": { "type": "object", "description": "Envelope de erro da API.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição. Sempre false nas respostas de erro." }, "message": { "type": "string", "enum": [ "goal_model_not_found" ], "description": "Identificador do erro. goal_model_not_found indica que a meta informada não existe, foi removida ou pertence a outra empresa." }, "error": { "type": "string", "description": "Descrição do erro em texto livre, voltada a log e diagnóstico." } } }, "example": { "response": false, "message": "goal_model_not_found", "error": "No query results for model [App\\Models\\Goal] 9b2d1f4a-3c5e-4a7b-8d9f-1e2c3a4b5c6d" } } } } }, "parameters": [ { "name": "refresh", "in": "query", "description": "Basta estar presente na URL (com ou sem valor) para recalcular e gravar o progresso da meta antes de responder.", "schema": { "type": "string" }, "example": "" } ] }, "put": { "tags": [ "goals" ], "summary": "Atualizar informações de uma meta", "description": "Atualiza uma meta e recalcula o progresso dela em seguida. Título, tipo, data de início e alvo precisam ser enviados sempre, mesmo quando não mudam; os demais campos omitidos permanecem como estão. A lista `children` é sincronizada: as metas filhas que não aparecerem nela são desvinculadas.", "operationId": "atualizarInformaEsDeUmaMeta", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "description": "Dados da meta. Campos fora desta lista são ignorados. Apesar de ser uma atualização, title, type, start_date e target precisam ser enviados sempre; os demais campos omitidos mantêm o valor atual e children, quando omitido, esvazia a composição.", "additionalProperties": false, "properties": { "title": { "type": "string", "maxLength": 90, "description": "Título da meta. Até 90 caracteres." }, "description": { "type": "string", "maxLength": 255, "description": "Descrição livre da meta. Até 255 caracteres.", "nullable": true }, "status": { "type": "string", "enum": [ "active", "inactive", "completed" ], "description": "Situação da meta: active (em apuração), inactive (pausada, sem cálculo automático) ou completed (encerrada). Quando omitido na criação, a meta nasce inactive." }, "type": { "type": "string", "enum": [ "manual", "projects_created", "projects_created_by_user", "funnel_steps_links", "funnel_steps_links_by_user", "composite" ], "description": "Tipo da meta, que define como o progresso é apurado: manual (informado à mão), projects_created (projetos criados), projects_created_by_user (projetos criados por um usuário), funnel_steps_links (entradas em uma etapa de funil), funnel_steps_links_by_user (entradas em uma etapa de funil feitas por um usuário) e composite (soma do progresso das metas filhas)." }, "user_id": { "type": "string", "format": "uuid", "description": "Usuário ao qual a meta fica restrita. Obrigatório nos tipos projects_created_by_user e funnel_steps_links_by_user e proibido nos demais (envie nulo). O usuário precisa fazer parte da empresa.", "nullable": true }, "funnel_step_id": { "type": "integer", "description": "Etapa de funil apurada pela meta. Obrigatório nos tipos funnel_steps_links e funnel_steps_links_by_user e proibido nos demais (envie nulo).", "nullable": true }, "start_date": { "type": "string", "format": "date", "description": "Data de início da apuração, no formato YYYY-MM-DD." }, "end_date": { "type": "string", "format": "date", "description": "Data de término da apuração, no formato YYYY-MM-DD. Precisa ser posterior a start_date. Nulo deixa a meta sem prazo final.", "nullable": true }, "periodicity": { "type": "integer", "minimum": 0, "maximum": 365, "description": "Tamanho de cada período de apuração, em dias (0 a 365). Use 0 para apurar o intervalo inteiro de uma vez, sem quebrar em períodos.", "nullable": true }, "target": { "type": "integer", "minimum": 1, "description": "Valor alvo da meta, na unidade indicada em unit. Mínimo 1." }, "unit": { "type": "string", "enum": [ "count", "currency", "percentage" ], "description": "Unidade do alvo e do progresso: count (quantidade), currency (valor monetário) ou percentage (porcentagem). Padrão count." }, "comparison_mode": { "type": "string", "enum": [ "target", "limit" ], "description": "Leitura do alvo: target quando a meta é atingir o valor, limit quando a meta é não ultrapassá-lo. Padrão target." }, "progress": { "type": "integer", "minimum": 0, "description": "Progresso da meta. Só é aceito (e passa a ser obrigatório) em metas do tipo manual com status active; nos demais casos é ignorado, porque o progresso é calculado pelo sistema." }, "children": { "type": "array", "description": "IDs das metas que compõem esta meta. Obrigatório no tipo composite e proibido nos demais (envie uma lista vazia). Não aceita IDs repetidos, nem a própria meta ou alguma de suas metas-pai, para não criar ciclo.", "items": { "type": "string", "format": "uuid", "description": "ID de uma meta da mesma empresa que entra na composição." } } }, "required": [ "title", "type", "start_date", "target" ] }, "examples": { "Atualizar informações de uma meta": { "value": { "title": "Reuniões de alinhamento", "description": "Encontros semanais registrados manualmente.", "type": "manual", "status": "active", "start_date": "2026-01-01", "end_date": "2026-12-31", "periodicity": 30, "target": 12, "unit": "count", "comparison_mode": "target", "progress": 0, "user_id": null, "funnel_step_id": null, "children": [] } } } } } }, "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Meta atualizada.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição. Sempre true nas respostas bem-sucedidas." }, "goal": { "type": "object", "description": "Dados da meta. As metas filhas (children) e a contagem de resultados (results_count) não vêm nesta resposta.", "properties": { "id": { "type": "string", "format": "uuid", "description": "ID da meta." }, "title": { "type": "string", "description": "Título da meta." }, "description": { "type": "string", "description": "Descrição livre da meta.", "nullable": true }, "status": { "type": "string", "enum": [ "active", "inactive", "completed" ], "description": "Situação da meta: active (em apuração), inactive (pausada, sem cálculo automático) ou completed (encerrada)." }, "start_date": { "type": "string", "format": "date", "description": "Data de início da apuração, no formato YYYY-MM-DD." }, "end_date": { "type": "string", "format": "date", "description": "Data de término da apuração, no formato YYYY-MM-DD. Nulo quando a meta não tem prazo final.", "nullable": true }, "periodicity": { "type": "integer", "description": "Tamanho de cada período de apuração, em dias (0 a 365). Use 0 para apurar o intervalo inteiro de uma vez, sem quebrar em períodos.", "nullable": true }, "type": { "type": "string", "enum": [ "manual", "projects_created", "projects_created_by_user", "funnel_steps_links", "funnel_steps_links_by_user", "composite" ], "description": "Tipo da meta, que define como o progresso é apurado: manual (informado à mão), projects_created (projetos criados), projects_created_by_user (projetos criados por um usuário), funnel_steps_links (entradas em uma etapa de funil), funnel_steps_links_by_user (entradas em uma etapa de funil feitas por um usuário) e composite (soma do progresso das metas filhas)." }, "user_id": { "type": "string", "format": "uuid", "description": "Usuário ao qual a meta está restrita. Preenchido apenas nos tipos projects_created_by_user e funnel_steps_links_by_user.", "nullable": true }, "funnel_step_id": { "type": "integer", "description": "Etapa de funil apurada pela meta. Preenchido apenas nos tipos funnel_steps_links e funnel_steps_links_by_user.", "nullable": true }, "target": { "type": "integer", "description": "Valor alvo da meta, na unidade indicada em unit.", "nullable": true }, "unit": { "type": "string", "enum": [ "count", "currency", "percentage" ], "description": "Unidade do alvo e do progresso: count (quantidade), currency (valor monetário) ou percentage (porcentagem)." }, "comparison_mode": { "type": "string", "enum": [ "target", "limit" ], "description": "Leitura do alvo: target quando a meta é atingir o valor, limit quando a meta é não ultrapassá-lo." }, "progress": { "type": "integer", "description": "Progresso apurado no período corrente." }, "progress_change_percentage": { "type": "number", "description": "Variação percentual do progresso atual em relação ao último resultado apurado. Vale 0 quando não há resultado anterior carregado." }, "percentage": { "type": "integer", "description": "Percentual do alvo já alcançado, arredondado para baixo." }, "is_past_calculable": { "type": "boolean", "description": "Indica se a meta consegue recalcular períodos passados. Falso nos tipos manual e composite." }, "created_at": { "type": "string", "format": "date-time", "description": "Momento em que a meta foi criada." }, "updated_at": { "type": "string", "format": "date-time", "description": "Momento da última alteração da meta." }, "deleted_at": { "type": "string", "format": "date-time", "description": "Momento em que a meta foi removida por soft delete. Nulo enquanto a meta existir.", "nullable": true } } } } }, "example": { "response": true, "goal": { "id": "9b2d1f4a-3c5e-4a7b-8d9f-1e2c3a4b5c6d", "title": "Reuniões de alinhamento (revisado)", "description": "Encontros semanais registrados manualmente.", "status": "active", "start_date": "2026-01-01", "end_date": "2026-12-31", "periodicity": 30, "type": "manual", "user_id": null, "funnel_step_id": null, "target": 24, "unit": "count", "comparison_mode": "target", "progress": 6, "progress_change_percentage": 0, "percentage": 25, "is_past_calculable": false, "created_at": "2026-01-06T14:45:51.000000Z", "updated_at": "2026-02-11T10:03:27.000000Z", "deleted_at": null } } } } }, "422": { "description": "Erro de validação", "content": { "application/json": { "schema": { "type": "object", "description": "Envelope de erro da API.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição. Sempre false nas respostas de erro." }, "message": { "type": "string", "enum": [ "validation_errors" ], "description": "Identificador do erro. validation_errors indica que o corpo enviado não passou na validação." }, "error": { "type": "string", "description": "Descrição do erro em texto livre, voltada a log e diagnóstico." }, "validation": { "type": "object", "description": "Mapa de campo para a lista de mensagens de validação que ele reprovou.", "additionalProperties": { "type": "array", "description": "Mensagens de validação do campo.", "items": { "type": "string", "description": "Mensagem de validação." } } } } }, "example": { "response": false, "message": "validation_errors", "error": "O campo end date deve ser uma data posterior a start date.", "validation": { "end_date": [ "O campo end date deve ser uma data posterior a start date." ] } } } } } } }, "delete": { "tags": [ "goals" ], "summary": "Deletar uma meta", "description": "Remove a meta por soft delete: ela sai das listagens e só reaparece com `filter[trashed]`, deixa de ser considerada nas metas compostas que a incluíam e seus resultados já apurados ficam inacessíveis, embora não sejam apagados. Não existe endpoint para restaurar uma meta removida.", "operationId": "deletarUmaMeta", "responses": { "204": { "description": "Meta removida", "content": { "application/json": { "schema": { "description": "Resposta sem corpo (HTTP 204).", "nullable": true }, "example": {} } } }, "404": { "description": "Meta não encontrada", "content": { "application/json": { "schema": { "type": "object", "description": "Envelope de erro da API.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição. Sempre false nas respostas de erro." }, "message": { "type": "string", "enum": [ "goal_model_not_found" ], "description": "Identificador do erro. goal_model_not_found indica que a meta informada não existe, foi removida ou pertence a outra empresa." }, "error": { "type": "string", "description": "Descrição do erro em texto livre, voltada a log e diagnóstico." } } }, "example": { "response": false, "message": "goal_model_not_found", "error": "No query results for model [App\\Models\\Goal] 9b2d1f4a-3c5e-4a7b-8d9f-1e2c3a4b5c6d" } } } } } }, "parameters": [ { "name": "goal", "in": "path", "required": true, "description": "ID (UUID) da meta.", "schema": { "type": "string" }, "example": "" } ] }, "/api/management/automations/{automation}/logs": { "get": { "tags": [ "automations", "logs" ], "summary": "Obter registro de execuções da automação", "description": "Obter registro de execução de uma automação específica.", "operationId": "obterRegistroDeExecuEsDaAutomaO", "responses": { "200": { "description": "200" } } }, "parameters": [ { "name": "automation", "in": "path", "required": true, "schema": { "type": "string" }, "example": "string" } ] }, "/api/management/automations": { "get": { "tags": [ "automations" ], "summary": "Listar automações", "description": "Listar todas as automações.", "operationId": "listarAutomaEs", "responses": { "200": { "description": "200" } } }, "post": { "tags": [ "automations" ], "summary": "Criar uma automação", "description": "Criar uma nova automação.", "operationId": "criarAutomaO", "responses": { "200": { "description": "200" } } } }, "/api/management/automations/{automation}": { "get": { "tags": [ "automations" ], "summary": "Obter automação específica", "description": "Obter detalhes de uma automação específica.", "operationId": "obterAutomaOEspecFica", "responses": { "200": { "description": "200" } } }, "put": { "tags": [ "automations" ], "summary": "Atualizar automação", "description": "Atualizar dados de uma automação específica.", "operationId": "atualizarAutomaO", "responses": { "200": { "description": "200" } } }, "delete": { "tags": [ "automations" ], "summary": "Deletar automação", "description": "Deletar uma automação específica.", "operationId": "deletarAutomaO", "responses": { "200": { "description": "200" } } }, "parameters": [ { "name": "automation", "in": "path", "required": true, "schema": { "type": "string" }, "example": "string" } ] }, "/api/management/get-user": { "post": { "tags": [ "users" ], "summary": "Obter detalhes de um usuário específico", "description": "Retorna os dados de um usuário específico, incluindo seus vínculos (relationships) com frame e jornadas de trabalho, squads e aliases. Retorna `response: false` quando o usuário informado não é encontrado.", "operationId": "obterDetalhesDeUmUsuRioEspecFico", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Indica sucesso da requisição (true)." }, "user": { "type": "object", "description": "Dados do usuário encontrado.", "properties": { "id": { "type": "string", "description": "ID (UUID) do usuário.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do usuário." }, "email": { "type": "string", "description": "E-mail do usuário.", "format": "email" }, "lang": { "type": "string", "description": "Idioma preferido do usuário (ex.: pt-BR)." }, "description": { "type": "string", "description": "Descrição/cargo do usuário, ou null." }, "is_partner": { "type": "boolean", "description": "Se o usuário é parceiro." }, "partner_approved_at": { "type": "string", "description": "Data/hora de aprovação como parceiro, ou null.", "format": "date-time" }, "partner_approved_by": { "type": "string", "description": "ID de quem aprovou o parceiro, ou null." }, "email_verified_at": { "type": "string", "description": "Data/hora de verificação do e-mail, ou null.", "format": "date-time" }, "relationships": { "type": "array", "description": "Vínculos do usuário com frames (cada item traz frame e jornadas de trabalho).", "items": { "description": "Vínculo (relationship) do usuário com um frame.", "type": "object" } }, "squads": { "type": "array", "description": "Squads das quais o usuário participa.", "items": { "description": "Squad do usuário.", "type": "object" } }, "aliases": { "type": "array", "description": "Aliases (apelidos) do usuário.", "items": {} } } } } }, "examples": { "Sucesso": { "value": { "response": true, "user": { "id": "9c2f1a54-0f3b-4d2e-8a1c-6e7b2d4f9a01", "name": "Ana Souza", "email": "ana.souza@empresa.com", "lang": "pt-BR", "description": "Designer de produto", "is_partner": false, "partner_approved_at": null, "partner_approved_by": null, "email_verified_at": "2026-01-04T12:00:00.000000Z", "relationships": [ { "id": "3d8e7c21-5b9a-4f6d-9c0e-1a2b3c4d5e6f", "user_id": "9c2f1a54-0f3b-4d2e-8a1c-6e7b2d4f9a01", "frame_id": "1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d", "frame": { "id": "1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d", "name": "Empresa Exemplo", "subdomain": "empresa" }, "workdays": [ { "id": "7f6e5d4c-3b2a-1908-7654-321fedcba098", "weekday": 1, "start_time": "09:00:00", "end_time": "18:00:00" } ] } ], "squads": [ { "id": "2b3c4d5e-6f7a-8b9c-0d1e-2f3a4b5c6d7e", "name": "Produto", "pivot": { "user_id": "9c2f1a54-0f3b-4d2e-8a1c-6e7b2d4f9a01", "squad_id": "2b3c4d5e-6f7a-8b9c-0d1e-2f3a4b5c6d7e", "type": "member" } } ], "aliases": [] } } }, "Usuário não encontrado": { "value": { "response": false } } } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "user_id": { "type": "string", "description": "ID (UUID) do usuário a ser consultado. Deve pertencer ao frame atual.", "format": "uuid" } }, "required": [ "user_id" ] }, "example": { "user_id": null } } }, "required": true } } }, "/api/management/squads/{squad}/users": { "get": { "tags": [ "squads", "users" ], "summary": "Listar usuários associados a um squad", "description": "Listar usuários associados a um squad", "operationId": "listarUsuRiosAssociadosAUmSquad", "responses": { "200": { "description": "200" } } }, "post": { "tags": [ "squads", "users" ], "summary": "Adicionar um ou mais usuários a um squad como membros", "description": "Adicionar um ou mais usuários a um squad como membros", "operationId": "adicionarUmOuMaisUsuRiosAUmSquadComoMembros", "requestBody": { "content": { "application/json": { "schema": { "type": "array", "items": {}, "example": [] }, "examples": { "Adicionar um ou mais usuários a um squad como membros": { "value": [] } } } } }, "responses": { "200": { "description": "200" } } }, "parameters": [ { "name": "squad", "in": "path", "required": true, "schema": { "type": "string" }, "example": "string" } ] }, "/api/management/squads/{squad}/users/{user}": { "put": { "tags": [ "squads", "users" ], "summary": "Atualizar tipo de um usuário no squad", "description": "Atualiza o tipo de um usuário no squad (MEMBER, LEADER, LEADER_SUBSTITUTE). Ao definir LEADER ou LEADER_SUBSTITUTE, remove automaticamente o tipo anterior de outros usuários.", "operationId": "atualizarTipoDeUmUsuRioNoSquad", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "type": { "type": "string", "example": "sample_text" } } }, "examples": { "Atualizar tipo de um usuário no squad": { "value": { "type": "sample_text" } } } } } }, "responses": { "200": { "description": "200" } } }, "delete": { "tags": [ "squads", "users" ], "summary": "Remover um usuário específico de um squad", "description": "Remove um usuário específico de um squad, desvinculando-o completamente.", "operationId": "removerUsuRioEspecFicoDeUmSquad", "responses": { "200": { "description": "200" } } }, "parameters": [ { "name": "squad", "in": "path", "required": true, "schema": { "type": "string" }, "example": "string" }, { "name": "user", "in": "path", "required": true, "schema": { "type": "string" }, "example": "string" } ] }, "/api/management/squads": { "get": { "tags": [ "squads" ], "summary": "Listar squads", "description": "Retorna uma lista de todos os squads do frame atual, incluindo até 10 usuários de cada squad.", "operationId": "listarSquads", "responses": { "200": { "description": "200" } } }, "post": { "tags": [ "squads" ], "summary": "Criar um squad", "description": "Criar squad", "operationId": "criarSquad", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "code": { "type": "string", "example": "sample_text" }, "description": { "type": "string", "example": "sample_text" }, "name": { "type": "string", "example": "sample_text" } } }, "examples": { "Criar squad": { "value": { "code": "sample_text", "description": "sample_text", "name": "sample_text" } } } } } }, "responses": { "200": { "description": "200" } } } }, "/api/management/squads/{squad}": { "get": { "tags": [ "squads" ], "summary": "Obter detalhes de um squad", "description": "Retorna os detalhes de um squad específico, incluindo todos os seus usuários.", "operationId": "obterDetalhesDeUmSquad", "responses": { "200": { "description": "200" } } }, "put": { "tags": [ "squads" ], "summary": "Atualizar informações de um squad", "description": "Atualiza as informações de um squad existente (código, nome e descrição).", "operationId": "atualizarInformaEsDeUmSquad", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "code": { "type": "string", "example": "sample_text" }, "description": { "type": "string", "example": "sample_text" }, "name": { "type": "string", "example": "sample_text" } } }, "examples": { "Atualizar informações de um squad": { "value": { "code": "sample_text", "description": "sample_text", "name": "sample_text" } } } } } }, "responses": { "200": { "description": "200" } } }, "delete": { "tags": [ "squads" ], "summary": "Deletar um squad", "description": "Delete um squad. Desvincula todos os usuários antes de excluir.", "operationId": "deletarUmSquad", "responses": { "200": { "description": "200" } } }, "parameters": [ { "name": "squad", "in": "path", "required": true, "schema": { "type": "string", "example": "" }, "example": "" } ] }, "/api/management/user-alias": { "post": { "tags": [ "user-alias" ], "summary": "Criar alias de email para um usuário", "description": "Cria um novo alias de email para um usuário. Envia notificação de verificação de email para o alias criado.", "operationId": "criarAliasDeEmailParaUmUsuRio", "responses": { "200": { "description": "200" } } } }, "/api/management/user-alias/{user_alias}": { "get": { "tags": [ "user-alias" ], "summary": "Listar aliases de email de um usuário", "description": "Retorna todos os aliases de email de um usuário específico, incluindo o email primário.", "operationId": "listarAliasesDeEmailDeUmUsuRio", "responses": { "200": { "description": "200" } } }, "delete": { "tags": [ "user-alias" ], "summary": "Deletar alias de email de um usuário", "description": "Remove um alias de email de um usuário.", "operationId": "deletarAliasDeEmailDeUmUsuRio", "responses": { "200": { "description": "200" } } }, "parameters": [ { "name": "user_alias", "in": "path", "required": true, "schema": { "type": "string" }, "example": "string" } ] }, "/api/management/toggle-primary-user-alias": { "post": { "tags": [ "user-alias" ], "summary": "Definir ou remover o alias primário de um usuário", "description": "Define ou remove o alias primário de um usuário. Se um alias_id for fornecido, define-o como primário (apenas se já estiver verificado). Se alias_id for nulo, remove o alias primário atual.", "operationId": "definirOuRemoverOAliasPrimRioDeUmUsuRio", "responses": { "200": { "description": "200" } } } }, "/api/management/project-groups/{project_group}/projects/index": { "post": { "tags": [ "project-groups", "projects", "index" ], "summary": "Listar projetos de um grupo", "description": "Retorna, de forma paginada, os projetos associados ao grupo, sempre na ordem definida dentro do grupo — este endpoint não aceita ordenação personalizada. Cada projeto vem com as respostas dos formulários dinâmicos já preenchidas.\n\nOs filtros usam o mesmo formato da [busca avançada](https://docs.olie.ai/api-reference/general/advanced-search) e a resposta segue o padrão de [paginação](https://docs.olie.ai/api-reference/general/pagination).", "operationId": "retornaUmaListaDeProjetosAssociadosAUmGrupo", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Página de projetos do grupo, na ordem definida dentro do grupo.", "properties": { "meta": { "type": "object", "description": "Informações de paginação do resultado.", "properties": { "current_page": { "type": "integer", "description": "Página retornada." }, "from": { "type": "integer", "description": "Posição do primeiro item da página no total.", "nullable": true }, "last_page": { "type": "integer", "description": "Número da última página disponível." }, "per_page": { "type": "integer", "description": "Quantidade de itens por página." }, "to": { "type": "integer", "description": "Posição do último item da página no total.", "nullable": true }, "total": { "type": "integer", "description": "Total de projetos que atendem aos filtros." } } }, "response": { "type": "boolean", "description": "Sempre `true` quando a operação foi concluída." }, "projects": { "type": "array", "description": "Projetos da página.", "items": { "type": "object", "description": "Projeto associado ao grupo.", "properties": { "id": { "type": "string", "description": "Identificador do projeto.", "format": "uuid" }, "old_id": { "type": "integer", "description": "Identificador numérico herdado da base anterior.", "nullable": true }, "code": { "type": "string", "description": "Código curto do projeto, exibido na interface.", "nullable": true }, "name": { "type": "string", "description": "Nome do projeto." }, "description": { "type": "string", "description": "Descrição livre do projeto.", "nullable": true }, "impact": { "type": "integer", "description": "Grau de impacto do projeto, de 1 a 10.", "nullable": true }, "parent_id": { "type": "string", "description": "Identificador do projeto pai, quando o projeto é filho de outro.", "format": "uuid", "nullable": true }, "frame_id": { "type": "string", "description": "Identificador do ambiente dono do projeto.", "format": "uuid" }, "created_at": { "type": "string", "description": "Data e hora de criação.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data e hora da última alteração.", "format": "date-time" }, "customer_id": { "type": "string", "description": "Identificador do cliente vinculado.", "format": "uuid", "nullable": true }, "contact_id": { "type": "integer", "description": "Identificador do contato vinculado.", "nullable": true }, "share_token": { "type": "string", "description": "Token do link de compartilhamento público, quando ativo.", "nullable": true }, "share_settings": { "type": "object", "description": "Configurações do compartilhamento público, quando ativo.", "nullable": true }, "merged_id": { "type": "string", "description": "Identificador do projeto que absorveu este numa fusão.", "format": "uuid", "nullable": true }, "status": { "type": "integer", "description": "Situação do projeto.", "nullable": true }, "budget": { "type": "number", "description": "Orçamento do projeto.", "nullable": true }, "is_template": { "type": "boolean", "description": "Indica se o registro é um modelo de projeto." }, "created_by": { "type": "string", "description": "Identificador do usuário que criou o projeto.", "format": "uuid", "nullable": true }, "deleted_at": { "type": "string", "description": "Data e hora em que o projeto foi para a lixeira.", "format": "date-time", "nullable": true }, "headquarter": { "type": "object", "description": "Cliente matriz do projeto: o cliente vinculado ou, se ele for filial, a matriz dele.", "properties": { "id": { "type": "string", "description": "Identificador do cliente.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do cliente." }, "parent_id": { "type": "string", "description": "Identificador do cliente matriz, quando este é uma filial.", "format": "uuid", "nullable": true }, "parent": { "type": "object", "description": "Cliente matriz, quando houver.", "properties": { "id": { "type": "string", "description": "Identificador do cliente matriz.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do cliente matriz." }, "parent_id": { "type": "string", "description": "Identificador do nível acima, quando houver.", "format": "uuid", "nullable": true } }, "nullable": true } }, "nullable": true }, "form_answers": { "type": "array", "description": "Respostas do formulário dinâmico da etapa atual do projeto.", "items": { "type": "object", "description": "Resposta de um campo do formulário." } }, "tasks": { "type": "array", "description": "Tarefas do projeto, apenas com identificador e situação.", "items": { "type": "object", "description": "Tarefa do projeto.", "properties": { "id": { "type": "string", "description": "Identificador da tarefa.", "format": "uuid" }, "project_id": { "type": "string", "description": "Identificador do projeto dono da tarefa.", "format": "uuid" }, "status": { "type": "integer", "description": "Situação da tarefa.", "nullable": true } } } }, "customer": { "type": "object", "description": "Cliente vinculado ao projeto.", "properties": { "id": { "type": "string", "description": "Identificador do cliente.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do cliente." }, "parent_id": { "type": "string", "description": "Identificador do cliente matriz, quando este é uma filial.", "format": "uuid", "nullable": true }, "parent": { "type": "object", "description": "Cliente matriz, quando houver.", "properties": { "id": { "type": "string", "description": "Identificador do cliente matriz.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do cliente matriz." }, "parent_id": { "type": "string", "description": "Identificador do nível acima, quando houver.", "format": "uuid", "nullable": true } }, "nullable": true } }, "nullable": true }, "contact": { "type": "object", "description": "Contato vinculado ao projeto.", "properties": { "id": { "type": "integer", "description": "Identificador do contato." }, "name": { "type": "string", "description": "Nome do contato." }, "role": { "type": "string", "description": "Cargo ou papel do contato.", "nullable": true }, "email": { "type": "string", "description": "E-mail do contato.", "nullable": true }, "phone": { "type": "string", "description": "Telefone do contato.", "nullable": true }, "description": { "type": "string", "description": "Observações sobre o contato.", "nullable": true }, "frame_id": { "type": "string", "description": "Identificador do ambiente dono do contato.", "format": "uuid" }, "created_at": { "type": "string", "description": "Data e hora de criação do contato.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data e hora da última alteração do contato.", "format": "date-time" }, "deleted_at": { "type": "string", "description": "Data e hora em que o contato foi arquivado.", "format": "date-time", "nullable": true }, "customers": { "type": "array", "description": "Clientes aos quais o contato pertence.", "items": { "type": "object", "description": "Cliente do contato.", "properties": { "id": { "type": "string", "description": "Identificador do cliente.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do cliente." } } } } }, "nullable": true }, "funnels": { "type": "array", "description": "Funis em que o projeto está presente.", "items": { "type": "object", "description": "Funil do projeto.", "properties": { "id": { "type": "string", "description": "Identificador do funil.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do funil." } } } }, "funnel_steps": { "type": "array", "description": "Etapas de funil em que o projeto está posicionado.", "items": { "type": "object", "description": "Etapa de funil ocupada pelo projeto." } }, "tags": { "type": "array", "description": "Etiquetas aplicadas ao projeto.", "items": { "type": "object", "description": "Etiqueta do projeto." } }, "groups": { "type": "array", "description": "Grupos de projetos aos quais o projeto pertence.", "items": { "type": "object", "description": "Grupo de projetos do qual o projeto faz parte.", "properties": { "id": { "type": "string", "description": "Identificador do grupo.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do grupo." } } } }, "users": { "type": "array", "description": "Usuários vinculados ao projeto.", "items": { "type": "object", "description": "Usuário vinculado ao projeto." } }, "frame": { "type": "object", "description": "Ambiente dono do projeto.", "properties": { "id": { "type": "string", "description": "Identificador do ambiente.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do ambiente." }, "subdomain": { "type": "string", "description": "Subdomínio do ambiente." }, "model_forms": { "type": "object", "description": "Formulários padrão configurados no ambiente.", "nullable": true } } }, "form": { "type": "object", "description": "Formulário dinâmico da etapa atual do projeto.", "nullable": true }, "executors": { "type": "array", "description": "Responsáveis pela execução do projeto.", "items": { "type": "object", "description": "Responsável pela execução." } }, "costs": { "type": "object", "description": "Custos consolidados do projeto.", "nullable": true }, "branch": { "type": "object", "description": "Filial do cliente. Presente apenas quando `withPercentage` é `true`.", "nullable": true }, "expected_finish": { "type": "string", "description": "Data prevista de conclusão. Presente apenas quando `withPercentage` é `true`.", "format": "date-time", "nullable": true }, "tasks_count": { "type": "integer", "description": "Total de tarefas do projeto. Presente apenas quando `withPercentage` é `true`.", "nullable": true }, "completed_count": { "type": "integer", "description": "Total de tarefas concluídas. Presente apenas quando `withPercentage` é `true`.", "nullable": true }, "completed_percentage": { "type": "number", "description": "Percentual de conclusão do projeto. Presente apenas quando `withPercentage` é `true`.", "nullable": true } } } } } }, "example": { "meta": { "current_page": 1, "from": 1, "last_page": 1, "per_page": 30, "to": 2, "total": 2 }, "response": true, "projects": [ { "id": "019aeaa3-b2d5-71f6-84c5-322f66c1a406", "old_id": null, "code": "P-1", "name": "Reforma da loja do centro", "description": "Troca de piso, vitrine e iluminação.", "impact": 3, "parent_id": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:08.000000Z", "updated_at": "2025-12-04T18:33:08.000000Z", "customer_id": "019aeaa3-afaa-7294-b6f9-c9ab2653c84e", "contact_id": 12560, "share_token": null, "share_settings": null, "merged_id": null, "merged_project": null, "status": 1, "budget": 15000, "is_template": false, "created_by": null, "deleted_at": null, "headquarter": { "id": "019aeaa3-afaa-7294-b6f9-c9ab2653c84e", "name": "Customer Name Example", "parent_id": null, "parent": null }, "form_answers": [], "tasks": [], "customer": { "id": "019aeaa3-afaa-7294-b6f9-c9ab2653c84e", "name": "Customer Name Example", "parent_id": null, "parent": null }, "contact": { "id": 12560, "name": "Contact Name Example", "role": "Comprador", "email": "email@example.org", "phone": "+5511999998888", "description": null, "frame_id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "created_at": "2025-12-04T18:33:07.000000Z", "updated_at": "2025-12-04T18:33:07.000000Z", "deleted_at": null, "customers": [] }, "funnels": [], "funnel_steps": [], "tags": [], "groups": [ { "id": "019aeaa3-c1f0-72a4-9d3b-6b8f0e5a1c77", "name": "Campanhas 2026" } ], "users": [], "frame": { "id": "019aeaa3-2778-73ec-8f8d-59d06cc59dca", "name": "OlieDev Company", "subdomain": "devframe", "model_forms": null }, "form": null, "executors": [], "costs": null } ] } } } }, "422": { "description": "Filtro inválido", "content": { "application/json": { "schema": { "type": "object", "description": "Um dos filtros aponta para um campo que o endpoint não sabe filtrar.", "properties": { "response": { "type": "boolean", "description": "Sempre `false` em respostas de erro." }, "message": { "type": "string", "description": "Slug do erro. Aqui sempre `validation_errors`." }, "error": { "type": "string", "description": "Descrição do erro em texto legível, destinada a log e exibição." }, "validation": { "type": "object", "description": "Mensagens de validação agrupadas por campo.", "properties": { "field": { "type": "array", "description": "Mensagem indicando o campo inválido e listando os campos aceitos.", "items": { "type": "string", "description": "Mensagem de validação." } } } } } }, "example": { "response": false, "message": "validation_errors", "error": "O campo [campo_inexistente] selecionado é inválido. Campos disponíveis: id, code, name, description, impact, status, budget, funnel_status_at, funnel_forecast_date, funnel_status, funnel_tags, parent, children, customer, contact, assignee, creator, created_at, funnels, funnel_steps, funnel_step_linked_at, completed_percentage, channel_awaiting_reply_since, project_groups, answer_pool, project_step_form_answer_pool, project_funnel_assignments_answer_pool, project_loose_form_answer_pool, name_code.", "validation": { "field": [ "O campo [campo_inexistente] selecionado é inválido. Campos disponíveis: id, code, name, description, impact, status, budget, funnel_status_at, funnel_forecast_date, funnel_status, funnel_tags, parent, children, customer, contact, assignee, creator, created_at, funnels, funnel_steps, funnel_step_linked_at, completed_percentage, channel_awaiting_reply_since, project_groups, answer_pool, project_step_form_answer_pool, project_funnel_assignments_answer_pool, project_loose_form_answer_pool, name_code." ] } } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "description": "Filtros e paginação da listagem de projetos do grupo.", "additionalProperties": false, "properties": { "filters": { "type": "array", "description": "Filtros aplicados sobre os projetos do grupo. Vazio retorna todos.", "items": { "type": "object", "description": "Um filtro da busca avançada.", "required": [ "field", "operator" ], "properties": { "field": { "type": "string", "description": "Campo a filtrar. Campos não suportados são recusados com erro de validação." }, "operator": { "type": "string", "description": "Operador da comparação.", "enum": [ "equals", "not_equals", "contains", "not_contains", "greater_than", "greater_than_or_equals", "less_than", "less_than_or_equals", "is_null", "is_not_null" ] }, "value": { "description": "Valor comparado. Ignorado nos operadores `is_null` e `is_not_null`.", "nullable": true, "anyOf": [ { "type": "string" }, { "type": "number" }, { "type": "boolean" } ] }, "logical_operator": { "type": "string", "description": "Como o filtro se junta ao anterior: `and` (padrão) ou `or`.", "enum": [ "and", "or" ] }, "arguments": { "type": "array", "description": "Argumentos extras exigidos por alguns filtros.", "items": { "type": "object", "description": "Argumento do filtro.", "properties": { "argument_key": { "type": "string", "description": "Nome do argumento." }, "argument_value_id": { "type": "string", "description": "Identificador do valor do argumento." }, "argument_value_type": { "type": "string", "description": "Tipo do valor do argumento." } } } } } } }, "page": { "type": "integer", "description": "Página desejada. Padrão 1." }, "perPage": { "type": "integer", "description": "Itens por página. Padrão 30, máximo 100." }, "trashed": { "type": "boolean", "description": "`true` retorna apenas os projetos na lixeira. Padrão `false`." }, "template": { "type": "boolean", "description": "`true` retorna apenas os modelos de projeto. Padrão `false`." }, "withPercentage": { "type": "boolean", "description": "`true` acrescenta a cada projeto os campos de progresso (`completed_percentage`, `tasks_count`, `completed_count`, `expected_finish` e `branch`). Padrão `false`." } } }, "example": { "filters": [], "page": 1, "perPage": 30, "trashed": false, "template": false, "withPercentage": false } } } } }, "parameters": [ { "name": "project_group", "in": "path", "required": true, "description": "ID (UUID) do grupo de projetos.", "schema": { "type": "string" }, "example": "" } ] }, "/api/management/project-groups/{project_group}/projects/{project_id}/reorder": { "post": { "tags": [ "project-groups", "projects", "reorder" ], "summary": "Alterar a ordem de um projeto dentro de um grupo", "description": "Define a posição do projeto dentro do grupo; a listagem de projetos do grupo passa a usar esse valor. A posição é gravada apenas para o projeto informado — os demais não são renumerados, então repetir uma posição já ocupada deixa os dois projetos empatados e a ordem entre eles fica indefinida.", "operationId": "alteraAOrdemDeUmProjetoDentroDeUmGrupo", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Confirmação da nova posição do projeto no grupo.", "properties": { "response": { "type": "boolean", "description": "Sempre `true` quando a operação foi concluída." } } }, "example": { "response": true } } } }, "404": { "description": "Projeto não está no grupo", "content": { "application/json": { "schema": { "type": "object", "description": "Nenhum projeto acessível corresponde ao ID informado.", "properties": { "response": { "type": "boolean", "description": "Sempre `false` em respostas de erro." }, "message": { "type": "string", "description": "Slug do erro. Aqui sempre `project_model_not_found`." }, "error": { "type": "string", "description": "Descrição do erro em texto legível, destinada a log e exibição." } } }, "example": { "response": false, "message": "project_model_not_found", "error": "No query results for model [App\\\\Models\\\\Project] 00000000-0000-0000-0000-000000000000" } } } }, "422": { "description": "Erro de validação", "content": { "application/json": { "schema": { "type": "object", "description": "O corpo enviado não passou na validação.", "properties": { "response": { "type": "boolean", "description": "Sempre `false` em respostas de erro." }, "message": { "type": "string", "description": "Slug do erro. Aqui sempre `validation_errors`." }, "error": { "type": "string", "description": "Descrição do erro em texto legível, destinada a log e exibição." }, "validation": { "type": "object", "description": "Mensagens de validação agrupadas por campo.", "properties": { "order": { "type": "array", "description": "Mensagens sobre o campo `order`.", "items": { "type": "string", "description": "Mensagem de validação." } } } } } }, "example": { "response": false, "message": "validation_errors", "error": "O campo order é obrigatório.", "validation": { "order": [ "O campo order é obrigatório." ] } } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "description": "Nova posição do projeto dentro do grupo.", "additionalProperties": false, "required": [ "order" ], "properties": { "order": { "type": "integer", "description": "Posição do projeto na lista do grupo, começando em 0. Vale apenas para este projeto: os demais não são renumerados.", "minimum": 0 } } }, "example": { "order": 0 } } } } }, "parameters": [ { "name": "project_group", "in": "path", "required": true, "description": "ID (UUID) do grupo de projetos.", "schema": { "type": "string" }, "example": "" }, { "name": "project_id", "in": "path", "required": true, "description": "ID (UUID) do projeto que será reposicionado. Ele precisa já pertencer ao grupo.", "schema": { "type": "string" }, "example": "{{project_id}}" } ] }, "/api/management/project-groups/{project_group}/projects": { "post": { "tags": [ "project-groups", "projects" ], "summary": "Associar um projeto a um grupo de projetos", "description": "Associa um projeto existente ao grupo, posicionando-o no fim da lista. O mesmo projeto não pode ser associado duas vezes ao mesmo grupo.", "operationId": "associaUmProjetoAUmGrupoDeProjetos", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Confirmação da associação. O projeto entra no fim da lista do grupo.", "properties": { "response": { "type": "boolean", "description": "Sempre `true` quando a operação foi concluída." } } }, "example": { "response": true } } } }, "404": { "description": "Projeto não encontrado", "content": { "application/json": { "schema": { "type": "object", "description": "Nenhum projeto acessível corresponde ao ID informado.", "properties": { "response": { "type": "boolean", "description": "Sempre `false` em respostas de erro." }, "message": { "type": "string", "description": "Slug do erro. Aqui sempre `project_model_not_found`." }, "error": { "type": "string", "description": "Descrição do erro em texto legível, destinada a log e exibição." } } }, "example": { "response": false, "message": "project_model_not_found", "error": "No query results for model [App\\\\Models\\\\Project] 00000000-0000-0000-0000-000000000000" } } } }, "422": { "description": "Projeto já vinculado ao grupo", "content": { "application/json": { "schema": { "type": "object", "description": "O projeto já pertence a este grupo.", "properties": { "response": { "type": "boolean", "description": "Sempre `false` em respostas de erro." }, "message": { "type": "string", "description": "Slug do erro. Aqui sempre `validation_errors`." }, "error": { "type": "string", "description": "Descrição do erro em texto legível, destinada a log e exibição." }, "validation": { "type": "object", "description": "Mensagens de validação agrupadas por campo.", "properties": { "project": { "type": "array", "description": "Mensagem informando que o projeto já está vinculado ao grupo.", "items": { "type": "string", "description": "Mensagem de validação." } } } } } }, "examples": { "Projeto já vinculado ao grupo": { "value": { "response": false, "message": "validation_errors", "error": "O projeto já está vinculado ao grupo", "validation": { "project": [ "O projeto já está vinculado ao grupo" ] } } }, "Erro de validação": { "value": { "response": false, "message": "validation_errors", "error": "O campo project id é obrigatório.", "validation": { "project_id": [ "O campo project id é obrigatório." ] } } } } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "description": "Projeto que passará a fazer parte do grupo.", "additionalProperties": false, "required": [ "project_id" ], "properties": { "project_id": { "type": "string", "description": "Identificador do projeto a associar.", "format": "uuid" } } }, "example": { "project_id": null } } } } }, "parameters": [ { "name": "project_group", "in": "path", "required": true, "description": "ID (UUID) do grupo de projetos.", "schema": { "type": "string" }, "example": "" } ] }, "/api/management/project-groups/{project_group}/projects/{project}": { "delete": { "tags": [ "project-groups", "projects" ], "summary": "Remover a associação de um projeto de um grupo de projetos", "description": "Desfaz a associação entre o projeto e o grupo; o projeto em si não é excluído. Os projetos que continuam no grupo são renumerados para fechar a lacuna deixada. Se o projeto não estiver no grupo, a resposta ainda é de sucesso.", "operationId": "removeAAssociaODeUmProjetoDeUmGrupoDeProjetos", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Confirmação da remoção. Os projetos restantes do grupo são renumerados.", "properties": { "response": { "type": "boolean", "description": "Sempre `true` quando a operação foi concluída." } } }, "example": { "response": true } } } }, "404": { "description": "Projeto não encontrado", "content": { "application/json": { "schema": { "type": "object", "description": "Nenhum projeto acessível corresponde ao ID informado.", "properties": { "response": { "type": "boolean", "description": "Sempre `false` em respostas de erro." }, "message": { "type": "string", "description": "Slug do erro. Aqui sempre `project_model_not_found`." }, "error": { "type": "string", "description": "Descrição do erro em texto legível, destinada a log e exibição." } } }, "example": { "response": false, "message": "project_model_not_found", "error": "No query results for model [App\\\\Models\\\\Project] 00000000-0000-0000-0000-000000000000" } } } } } }, "parameters": [ { "name": "project_group", "in": "path", "required": true, "description": "ID (UUID) do grupo de projetos.", "schema": { "type": "string" }, "example": "" }, { "name": "project", "in": "path", "required": true, "description": "ID (UUID) do projeto que deixará de pertencer ao grupo.", "schema": { "type": "string" }, "example": "{{project_id}}" } ] }, "/api/management/project-groups": { "get": { "tags": [ "project-groups" ], "summary": "Listar grupos de projetos", "description": "Retorna todos os grupos de projetos, cada um com a quantidade de projetos associados. A lista não é paginada e não traz os projetos em si — para isso use a rota de projetos do grupo.\n\nInforme `id` para trazer um grupo específico ou `search` para filtrar pelo nome; quando `id` é enviado, `search` é ignorado.", "operationId": "listarGruposDeProjetos", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Lista completa dos grupos de projetos.", "properties": { "response": { "type": "boolean", "description": "Sempre `true` quando a operação foi concluída." }, "project_groups": { "type": "array", "description": "Grupos encontrados. A lista não é paginada.", "items": { "type": "object", "description": "Grupo de projetos com a contagem de projetos associados.", "properties": { "id": { "type": "string", "description": "Identificador do grupo.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do grupo." }, "projects_count": { "type": "integer", "description": "Quantidade de projetos associados ao grupo." } } } } } }, "example": { "response": true, "project_groups": [ { "id": "019aeaa3-c1f0-72a4-9d3b-6b8f0e5a1c77", "name": "Campanhas 2026", "projects_count": 12 }, { "id": "019aeaa3-c1f0-7b62-8a41-2d9c4e7f3b08", "name": "Contratos recorrentes", "projects_count": 0 } ] } } } } }, "parameters": [ { "name": "id", "in": "query", "description": "ID (UUID) de um grupo específico. Quando informado, `search` é ignorado.", "schema": { "type": "string" }, "example": "" }, { "name": "search", "in": "query", "description": "Termo buscado no nome do grupo.", "schema": { "type": "string" }, "example": "" } ] }, "post": { "tags": [ "project-groups" ], "summary": "Criar um grupo de projetos", "description": "Cria um grupo de projetos vazio. O nome é obrigatório e não pode conter HTML. Depois de criado, use a rota de associação para incluir projetos no grupo.", "operationId": "criarGrupoDeProjetos", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Grupo de projetos criado.", "properties": { "response": { "type": "boolean", "description": "Sempre `true` quando a operação foi concluída." }, "project_group": { "type": "object", "description": "Grupo recém-criado, ainda sem projetos.", "properties": { "id": { "type": "string", "description": "Identificador do grupo.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do grupo." } } } } }, "example": { "response": true, "project_group": { "id": "019aeaa3-c1f0-72a4-9d3b-6b8f0e5a1c77", "name": "Campanhas 2026" } } } } }, "422": { "description": "Erro de validação", "content": { "application/json": { "schema": { "type": "object", "description": "O corpo enviado não passou na validação.", "properties": { "response": { "type": "boolean", "description": "Sempre `false` em respostas de erro." }, "message": { "type": "string", "description": "Slug do erro. Aqui sempre `validation_errors`." }, "error": { "type": "string", "description": "Descrição do erro em texto legível, destinada a log e exibição." }, "validation": { "type": "object", "description": "Mensagens de validação agrupadas por campo.", "properties": { "name": { "type": "array", "description": "Mensagens sobre o campo `name`.", "items": { "type": "string", "description": "Mensagem de validação." } } } } } }, "example": { "response": false, "message": "validation_errors", "error": "O campo nome é obrigatório.", "validation": { "name": [ "O campo nome é obrigatório." ] } } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "description": "Dados do grupo de projetos a ser criado.", "additionalProperties": false, "required": [ "name" ], "properties": { "name": { "type": "string", "description": "Nome do grupo. Obrigatório e não pode conter HTML." } } }, "example": { "name": "Campanhas 2026" } } } } } }, "/api/management/project-groups/{project_group}": { "get": { "tags": [ "project-groups" ], "summary": "Obter detalhes de um grupo de projetos", "description": "Retorna um grupo de projetos pelo ID. A resposta traz apenas os dados do grupo — sem a lista de projetos associados e sem a contagem deles.", "operationId": "obterDetalhesDeUmGrupoDeProjetos", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Grupo de projetos encontrado.", "properties": { "response": { "type": "boolean", "description": "Sempre `true` quando a operação foi concluída." }, "project_group": { "type": "object", "description": "Dados do grupo, sem a lista de projetos.", "properties": { "id": { "type": "string", "description": "Identificador do grupo.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do grupo." } } } } }, "example": { "response": true, "project_group": { "id": "019aeaa3-c1f0-72a4-9d3b-6b8f0e5a1c77", "name": "Campanhas 2026" } } } } }, "404": { "description": "Grupo não encontrado", "content": { "application/json": { "schema": { "type": "object", "description": "Nenhum grupo de projetos corresponde ao ID informado.", "properties": { "response": { "type": "boolean", "description": "Sempre `false` em respostas de erro." }, "message": { "type": "string", "description": "Slug do erro. Aqui sempre `project_group_model_not_found`." }, "error": { "type": "string", "description": "Descrição do erro em texto legível, destinada a log e exibição." } } }, "example": { "response": false, "message": "project_group_model_not_found", "error": "No query results for model [App\\\\Models\\\\ProjectGroup] 00000000-0000-0000-0000-000000000000" } } } } } }, "put": { "tags": [ "project-groups" ], "summary": "Atualizar informações de um grupo de projetos", "description": "Renomeia um grupo de projetos. O nome é obrigatório e não pode conter HTML; os projetos associados e a ordem deles permanecem como estavam.", "operationId": "atualizarInformaEsDeUmGrupoDeProjetos", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Grupo de projetos atualizado.", "properties": { "response": { "type": "boolean", "description": "Sempre `true` quando a operação foi concluída." }, "project_group": { "type": "object", "description": "Grupo já com o nome atualizado.", "properties": { "id": { "type": "string", "description": "Identificador do grupo.", "format": "uuid" }, "name": { "type": "string", "description": "Nome do grupo." } } } } }, "example": { "response": true, "project_group": { "id": "019aeaa3-c1f0-72a4-9d3b-6b8f0e5a1c77", "name": "Campanhas 2026 (revisado)" } } } } }, "404": { "description": "Grupo não encontrado", "content": { "application/json": { "schema": { "type": "object", "description": "Nenhum grupo de projetos corresponde ao ID informado.", "properties": { "response": { "type": "boolean", "description": "Sempre `false` em respostas de erro." }, "message": { "type": "string", "description": "Slug do erro. Aqui sempre `project_group_model_not_found`." }, "error": { "type": "string", "description": "Descrição do erro em texto legível, destinada a log e exibição." } } }, "example": { "response": false, "message": "project_group_model_not_found", "error": "No query results for model [App\\\\Models\\\\ProjectGroup] 00000000-0000-0000-0000-000000000000" } } } }, "422": { "description": "Erro de validação", "content": { "application/json": { "schema": { "type": "object", "description": "O corpo enviado não passou na validação.", "properties": { "response": { "type": "boolean", "description": "Sempre `false` em respostas de erro." }, "message": { "type": "string", "description": "Slug do erro. Aqui sempre `validation_errors`." }, "error": { "type": "string", "description": "Descrição do erro em texto legível, destinada a log e exibição." }, "validation": { "type": "object", "description": "Mensagens de validação agrupadas por campo.", "properties": { "name": { "type": "array", "description": "Mensagens sobre o campo `name`.", "items": { "type": "string", "description": "Mensagem de validação." } } } } } }, "example": { "response": false, "message": "validation_errors", "error": "O campo nome é obrigatório.", "validation": { "name": [ "O campo nome é obrigatório." ] } } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "description": "Novos dados do grupo de projetos.", "additionalProperties": false, "properties": { "name": { "type": "string", "description": "Novo nome do grupo. Precisa ser enviado e não pode conter HTML." } }, "required": [ "name" ] }, "example": { "name": "Campanhas 2026 (revisado)" } } } } }, "delete": { "tags": [ "project-groups" ], "summary": "Deletar um grupo de projetos", "description": "Exclui o grupo em definitivo, junto com as associações dele com os projetos. Os projetos que estavam no grupo não são afetados. A resposta é de sucesso mesmo quando o grupo informado não existe.", "operationId": "deletarGrupoDeProjetos", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Confirmação da exclusão. O corpo não traz o grupo removido.", "properties": { "response": { "type": "boolean", "description": "Sempre `true` quando a operação foi concluída." } } }, "example": { "response": true } } } } } }, "parameters": [ { "name": "project_group", "in": "path", "required": true, "description": "ID (UUID) do grupo de projetos.", "schema": { "type": "string" }, "example": "" } ] }, "/api/management/system/get-meta-data": { "get": { "tags": [ "system", "get-meta-data" ], "summary": "Obter metadados de uma URL", "description": "Obter metadados de uma URL fornecida, extraindo as meta tags (Open Graph, description, etc.) do HTML retornado. Pode retornar os dados em formato EditorJs se especificado. Não funciona com URLs localhost.", "operationId": "obterMetadadosDeUmaUrl", "responses": { "200": { "description": "200" } } } }, "/api/management/system/params/{model_name}": { "get": { "tags": [ "system", "params" ], "summary": "Listar parâmetros disponíveis para filtragem de um modelo", "description": "Listar parâmetros disponíveis para filtragem de um modelo específico. Use esse endpoint para saber quais parâmetros disponibilizamos para cada objeto.\n\nLeia [aqui a documentação sobre parâmetros disponíveis](https://docs.olie.ai/api-reference/general/advanced-search#descobrindo-campos-dispon%C3%ADveis). Os parâmetros aqui listados são disponíveis apenas nas [buscas avançadas](https://docs.olie.ai/api-reference/general/advanced-search).", "operationId": "listarParMetrosDisponVeisParaFiltragemDeUmModelo", "responses": { "200": { "description": "Sucesso: projeto", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "Date": { "schema": { "type": "string" }, "example": "Mon, 19 Jan 2026 12:10:54 GMT" }, "X-Ratelimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-Ratelimit-Remaining": { "schema": { "type": "integer" }, "example": 159 }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "enum": [ true ], "description": "Indicador de sucesso da requisição" }, "params": { "type": "object", "description": "Parâmetros disponíveis para filtros e ordenação do modelo", "properties": { "filters": { "type": "array", "description": "Lista de filtros disponíveis para o modelo", "items": { "type": "object", "properties": { "name": { "type": "string", "description": "Nome do campo que pode ser filtrado" }, "input_type": { "type": "string", "enum": [ "text", "number", "datetime-local", "date", "time", "email", "tel", "url" ], "description": "Tipo de input esperado para o filtro" }, "operators": { "type": "array", "description": "Operadores relacionais permitidos para este filtro", "items": { "type": "string" } }, "options": { "type": "array", "description": "Opções fixas disponíveis para o filtro (usado em campos enum/select)", "items": { "type": "object", "properties": { "label": { "description": "Rótulo da opção exibido ao usuário", "oneOf": [ { "type": "string" }, { "type": "number" } ] }, "value": { "description": "Valor da opção usado na query", "oneOf": [ { "type": "string" }, { "type": "number" }, { "type": "boolean" } ] } }, "required": [ "label", "value" ] } }, "arguments": { "type": "array", "description": "Argumentos adicionais necessários para este filtro funcionar", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "Identificador único do argumento" }, "label": { "type": "string", "description": "Rótulo descritivo do argumento" }, "required": { "type": "boolean", "description": "Indica se o argumento é obrigatório" }, "modelClass": { "type": "string", "description": "Classe do modelo associado ao argumento" }, "hydrate": { "type": "object", "description": "Configuração para popular/hidratar dados do argumento dinamicamente", "properties": { "route": { "type": "string", "description": "Rota da API para buscar as opções disponíveis" }, "options": { "type": "string", "description": "Chave do objeto de resposta que contém as opções" }, "key": { "type": "string", "description": "Campo usado como valor/identificador da opção" }, "label": { "type": "string", "description": "Campo usado como rótulo da opção" }, "children_key": { "type": "string", "description": "Chave para acessar opções filhas/aninhadas (opcional)" }, "children_label": { "type": "string", "description": "Campo usado como rótulo das opções filhas (opcional)" } }, "required": [ "route", "options", "key", "label", "children_key", "children_label" ] } }, "required": [ "id", "label", "required", "modelClass", "hydrate" ] } }, "hydrate": { "description": "Configuração para popular/hidratar dados do filtro dinamicamente (null se não aplicável)", "oneOf": [ { "type": "object", "properties": { "route": { "type": "string", "description": "Rota da API para buscar as opções disponíveis" }, "options": { "type": "string", "description": "Chave do objeto de resposta que contém as opções" }, "key": { "type": "string", "description": "Campo usado como valor/identificador da opção" }, "label": { "type": "string", "description": "Campo usado como rótulo da opção" }, "children_key": { "type": "string", "description": "Chave para acessar opções filhas/aninhadas (opcional)" }, "children_label": { "type": "string", "description": "Campo usado como rótulo das opções filhas (opcional)" } }, "required": [ "route", "options", "key", "label", "children_key", "children_label" ] } ] } }, "required": [ "name", "input_type", "operators", "options", "arguments", "hydrate" ] } }, "sorting": { "type": "array", "description": "Lista de campos disponíveis para ordenação", "items": { "type": "object", "properties": { "name": { "type": "string", "description": "Nome do campo que pode ser usado para ordenação" }, "arguments": { "type": "array", "description": "Argumentos adicionais para a ordenação (geralmente vazio)", "items": { "type": "object" } } }, "required": [ "name", "arguments" ] } } }, "required": [ "filters", "sorting" ] } }, "required": [ "response", "params" ] }, "example": { "response": true, "params": { "filters": [ { "name": "id", "input_type": "text", "operators": [ "equals" ], "options": [], "arguments": [], "hydrate": null }, { "name": "code", "input_type": "text", "operators": [ "equals", "contains", "not_contains" ], "options": [], "arguments": [], "hydrate": null }, { "name": "name", "input_type": "text", "operators": [ "equals", "not_equals", "contains", "not_contains" ], "options": [], "arguments": [], "hydrate": null }, { "name": "description", "input_type": "text", "operators": [ "equals", "not_equals", "contains", "not_contains" ], "options": [], "arguments": [], "hydrate": null }, { "name": "impact", "input_type": "text", "operators": [ "equals", "not_equals", "greater_than", "greater_than_or_equals", "less_than", "less_than_or_equals" ], "options": [ { "label": 1, "value": 1 }, { "label": 2, "value": 2 }, { "label": 3, "value": 3 }, { "label": 4, "value": 4 }, { "label": 5, "value": 5 }, { "label": 6, "value": 6 }, { "label": 7, "value": 7 }, { "label": 8, "value": 8 }, { "label": 9, "value": 9 }, { "label": 10, "value": 10 } ], "arguments": [], "hydrate": null }, { "name": "status", "input_type": "text", "operators": [ "equals", "not_equals" ], "options": [ { "label": "Em andamento", "value": 1 }, { "label": "Concluído", "value": 2 }, { "label": "Arquivado", "value": 3 }, { "label": "Paralisado", "value": 4 } ], "arguments": [], "hydrate": null }, { "name": "budget", "input_type": "number", "operators": [ "equals", "not_equals", "greater_than", "greater_than_or_equals", "less_than", "less_than_or_equals" ], "options": [], "arguments": [], "hydrate": null }, { "name": "funnel_status_at", "input_type": "datetime-local", "operators": [ "equals", "not_equals", "greater_than", "greater_than_or_equals", "less_than", "less_than_or_equals", "is_null", "is_not_null" ], "options": [], "arguments": [ { "id": "funnel_status", "label": "Status de Funil", "required": false, "modelClass": "App\\Models\\ProjectFunnel", "hydrate": { "route": "/api/management/get-project-funnels", "options": "project_funnels", "key": "id", "label": "name", "children_key": null, "children_label": null } } ], "hydrate": null }, { "name": "funnel_forecast_date", "input_type": "datetime-local", "operators": [ "equals", "not_equals", "greater_than", "greater_than_or_equals", "less_than", "less_than_or_equals", "is_null", "is_not_null" ], "options": [], "arguments": [ { "id": "funnel_forecast_date", "label": "Funil de Projetos", "required": false, "modelClass": "App\\Models\\ProjectFunnel", "hydrate": { "route": "/api/management/get-project-funnels", "options": "project_funnels", "key": "id", "label": "name", "children_key": null, "children_label": null } } ], "hydrate": null }, { "name": "funnel_status", "input_type": "text", "operators": [ "equals", "not_equals" ], "options": [], "arguments": [ { "id": "funnel_status", "label": "Status de Funil", "required": false, "modelClass": "App\\Models\\ProjectFunnel", "hydrate": { "route": "/api/management/get-project-funnels", "options": "project_funnels", "key": "id", "label": "name", "children_key": null, "children_label": null } } ], "hydrate": { "route": "/api/management/get-available-steps", "options": "funnels", "key": "id", "label": "name", "children_key": "funnel_status", "children_label": "name" } }, { "name": "funnel_tags", "input_type": "text", "operators": [ "equals", "not_equals", "contains", "not_contains", "is_null", "is_not_null" ], "options": [], "arguments": [], "hydrate": { "route": "/api/management/get-available-steps", "options": "funnels", "key": "id", "label": "name", "children_key": "tags", "children_label": "name" } }, { "name": "parent", "input_type": "text", "operators": [ "equals", "not_equals", "is_null", "is_not_null" ], "options": [], "arguments": [], "hydrate": { "route": "/api/management/projects", "options": "projects", "key": "id", "label": "name", "children_key": null, "children_label": null } }, { "name": "children", "input_type": "text", "operators": [ "is_null", "is_not_null", "contains", "not_contains" ], "options": [], "arguments": [], "hydrate": { "route": "/api/management/projects", "options": "projects", "key": "id", "label": "name", "children_key": null, "children_label": null } }, { "name": "customer", "input_type": "text", "operators": [ "equals", "not_equals", "is_null", "is_not_null" ], "options": [], "arguments": [], "hydrate": { "route": "/api/management/customers", "options": "customers", "key": "id", "label": "name", "children_key": null, "children_label": null } }, { "name": "contact", "input_type": "text", "operators": [ "equals", "not_equals", "is_null", "is_not_null" ], "options": [], "arguments": [], "hydrate": { "route": "/api/management/contacts", "options": "contacts", "key": "id", "label": "name", "children_key": null, "children_label": null } }, { "name": "assignee", "input_type": "text", "operators": [ "equals", "contains", "not_equals", "is_null", "is_not_null" ], "options": [], "arguments": [], "hydrate": { "route": "/api/management/get-users", "options": "users", "key": "id", "label": "name", "children_key": null, "children_label": null } }, { "name": "creator", "input_type": "text", "operators": [ "contains", "not_equals", "is_null", "is_not_null" ], "options": [], "arguments": [], "hydrate": { "route": "/api/management/get-users", "options": "users", "key": "id", "label": "name", "children_key": null, "children_label": null } }, { "name": "created_at", "input_type": "datetime-local", "operators": [ "equals", "not_equals", "greater_than", "greater_than_or_equals", "less_than", "less_than_or_equals" ], "options": [], "arguments": [], "hydrate": null }, { "name": "funnels", "input_type": "text", "operators": [ "contains", "not_contains" ], "options": [], "arguments": [], "hydrate": { "route": "/api/management/get-project-funnels", "options": "project_funnels", "key": "id", "label": "name", "children_key": null, "children_label": null } }, { "name": "funnel_steps", "input_type": "text", "operators": [ "contains", "not_contains" ], "options": [], "arguments": [], "hydrate": { "route": "/api/management/get-available-steps", "options": "funnels", "key": "id", "label": "name", "children_key": "steps", "children_label": "name" } }, { "name": "funnel_step_linked_at", "input_type": "datetime-local", "operators": [ "equals", "not_equals", "greater_than", "greater_than_or_equals", "less_than", "less_than_or_equals" ], "options": [], "arguments": [ { "id": "funnel_step", "label": "Etapa de Funil", "required": false, "modelClass": "App\\Models\\FunnelStep", "hydrate": { "route": "/api/management/get-available-steps", "options": "funnels", "key": "id", "label": "name", "children_key": "steps", "children_label": "name" } } ], "hydrate": null }, { "name": "completed_percentage", "input_type": "number", "operators": [ "equals", "not_equals", "greater_than", "greater_than_or_equals", "less_than", "less_than_or_equals" ], "options": [], "arguments": [], "hydrate": null }, { "name": "project_groups", "input_type": "text", "operators": [ "contains", "not_contains" ], "options": [], "arguments": [], "hydrate": { "route": "/api/management/project-groups", "options": "project_groups", "key": "id", "label": "name", "children_key": null, "children_label": null } }, { "name": "answer_pool", "input_type": "text", "operators": [ "equals", "not_equals", "contains", "not_contains", "greater_than", "greater_than_or_equals", "less_than", "less_than_or_equals", "is_null", "is_not_null" ], "options": [], "arguments": [ { "id": "answer_pool_edge", "label": "Campo", "required": true, "modelClass": "App\\Models\\FormEdge", "hydrate": { "route": "/api/management/get-forms", "options": "forms", "key": "id", "label": "label", "children_key": "edges", "children_label": "title" } } ], "hydrate": null }, { "name": "project_step_form_answer_pool", "input_type": "text", "operators": [ "equals", "not_equals", "contains", "not_contains", "greater_than", "greater_than_or_equals", "less_than", "less_than_or_equals", "is_null", "is_not_null" ], "options": [], "arguments": [ { "id": "project_step_form_answer_pool_step", "label": "Etapa de Funil", "required": true, "modelClass": "App\\Models\\FunnelStep", "hydrate": { "route": "/api/management/get-available-steps", "options": "funnels", "key": "id", "label": "name", "children_key": "steps", "children_label": "name" } }, { "id": "project_step_form_answer_pool_edge", "label": "Campo", "required": true, "modelClass": "App\\Models\\FormEdge", "hydrate": { "route": "/api/management/get-forms", "options": "forms", "key": "id", "label": "label", "children_key": "edges", "children_label": "title" } } ], "hydrate": null }, { "name": "project_funnel_assignments_answer_pool", "input_type": "text", "operators": [ "equals", "not_equals", "contains", "not_contains", "greater_than", "greater_than_or_equals", "less_than", "less_than_or_equals", "is_null", "is_not_null" ], "options": [], "arguments": [ { "id": "project_funnel_assignments_answer_pool_project_funnel", "label": "Funil de Projetos", "required": true, "modelClass": "App\\Models\\ProjectFunnel", "hydrate": { "route": "/api/management/get-project-funnels", "options": "project_funnels", "key": "id", "label": "name", "children_key": null, "children_label": null } }, { "id": "project_funnel_assignments_answer_pool_edge", "label": "Campo", "required": true, "modelClass": "App\\Models\\FormEdge", "hydrate": { "route": "/api/management/get-forms", "options": "forms", "key": "id", "label": "label", "children_key": "edges", "children_label": "title" } } ], "hydrate": null }, { "name": "project_loose_form_answer_pool", "input_type": "text", "operators": [ "equals", "not_equals", "contains", "not_contains", "greater_than", "greater_than_or_equals", "less_than", "less_than_or_equals", "is_null", "is_not_null" ], "options": [], "arguments": [ { "id": "project_loose_form_answer_pool_edge", "label": "Campo", "required": true, "modelClass": "App\\Models\\FormEdge", "hydrate": { "route": "/api/management/get-forms", "options": "forms", "key": "id", "label": "label", "children_key": "edges", "children_label": "title" } } ], "hydrate": null }, { "name": "name_code", "input_type": "text", "operators": [ "contains" ], "options": [], "arguments": [], "hydrate": null } ], "sorting": [ { "name": "name", "arguments": [] }, { "name": "impact", "arguments": [] }, { "name": "status", "arguments": [] }, { "name": "budget", "arguments": [] }, { "name": "created_at", "arguments": [] }, { "name": "assigned_to", "arguments": [] }, { "name": "funnel_step_linked_at", "arguments": [] }, { "name": "answer_pool", "arguments": [] }, { "name": "project_funnel_assignments_answer_pool", "arguments": [] }, { "name": "customer__name", "arguments": [] }, { "name": "contact__name", "arguments": [] }, { "name": "project_funnel_assignments__statuses_at", "arguments": [] } ] } } } } } } }, "parameters": [ { "name": "model_name", "in": "path", "required": true, "description": "Nome do objeto a ser consultado.", "schema": { "type": "string", "enum": [ "project", "customer", "contact" ] }, "example": "project" } ] }, "/api/management/system/bulk-update/{model_name}": { "post": { "tags": [ "system", "bulk-update" ], "summary": "Atualizar vários registros de uma vez", "description": "Aplica a mesma alteração a vários registros de uma vez. O `model_name` aceita `project` (os campos do corpo são os mesmos do endpoint de edição de projeto) e `answer_pool` (respostas de formulário dinâmico) — os demais modelos ainda não são suportados.\n\nFalhas em registros individuais não interrompem o lote: o que deu certo é gravado e a resposta traz os contadores e o motivo de cada falha. Enquanto um lote do mesmo usuário está em andamento, uma nova chamada com mais de um ID responde 409.", "operationId": "atualizarMLtiplosRegistrosDeUmModeloDeUmaVez", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Resultado do lote. Falhas individuais não alteram o status HTTP.", "properties": { "response": { "type": "boolean", "description": "Sempre `true` quando a requisição foi processada." }, "result": { "type": "object", "description": "Resumo do processamento do lote.", "properties": { "successCount": { "type": "integer", "description": "Quantidade de registros atualizados com sucesso." }, "failedCount": { "type": "integer", "description": "Quantidade de registros que falharam." }, "fails": { "type": "array", "description": "Um item por registro que falhou. Vazio quando todos foram atualizados.", "items": { "type": "object", "description": "Falha de um registro específico.", "properties": { "id": { "type": "string", "description": "ID do registro que falhou." }, "error": { "type": "string", "description": "Motivo da falha." }, "permission": { "type": "string", "description": "Permissão exigida. Presente apenas quando a falha foi por falta de permissão." } }, "required": [ "id", "error" ] } } }, "required": [ "successCount", "failedCount", "fails" ] } }, "required": [ "response", "result" ] }, "example": { "response": true, "result": { "successCount": 3, "failedCount": 0, "fails": [] } } } } }, "409": { "description": "Outro lote em andamento", "content": { "application/json": { "schema": { "type": "object", "description": "Outra operação em lote do mesmo usuário ainda está em andamento.", "properties": { "response": { "type": "boolean", "description": "Sempre `false` em caso de erro." }, "message": { "type": "string", "description": "Identificador do erro, sempre `bulk_operation_in_progress`." }, "error": { "type": "string", "description": "Descrição do erro em texto legível." } }, "required": [ "response", "message", "error" ] }, "example": { "response": false, "message": "bulk_operation_in_progress", "error": "Another bulk operation is already in progress" } } } }, "422": { "description": "Erro de validação", "content": { "application/json": { "schema": { "type": "object", "description": "Erro de validação da requisição.", "properties": { "response": { "type": "boolean", "description": "Sempre `false` em caso de erro." }, "message": { "type": "string", "description": "Identificador do erro, sempre `validation_errors`." }, "error": { "type": "string", "description": "Primeira mensagem de validação, em texto legível." }, "validation": { "type": "object", "description": "Mensagens de validação agrupadas por campo.", "additionalProperties": { "type": "array", "description": "Mensagens do campo.", "items": { "type": "string", "description": "Mensagem de validação." } } } }, "required": [ "response", "message", "error", "validation" ] }, "examples": { "Erro de validação": { "value": { "response": false, "message": "validation_errors", "error": "The ids field is required.", "validation": { "ids": [ "The ids field is required." ] } } }, "Modelo não suportado": { "value": { "response": false, "message": "validation_errors", "error": "messages.model_not_supported_yet", "validation": { "model": [ "messages.model_not_supported_yet" ] } } } } } } } }, "requestBody": { "content": { "application/json": { "schema": { "type": "object", "description": "Lista de registros a alterar e os campos a aplicar em todos eles.", "required": [ "ids" ], "additionalProperties": false, "properties": { "ids": { "type": "array", "description": "IDs dos registros que receberão a alteração. Obrigatório, sem valores repetidos e sem limite máximo de itens.", "items": { "type": "string", "description": "ID (UUID) do registro a atualizar.", "format": "uuid" } }, "name": { "type": "string", "description": "`model_name=project`: novo nome do projeto. Até 191 caracteres.", "maxLength": 191 }, "description": { "type": "string", "description": "`model_name=project`: nova descrição do projeto." }, "impact": { "type": "integer", "description": "`model_name=project`: grau de impacto do projeto, de 1 a 10.", "minimum": 1, "maximum": 10 }, "status": { "type": "integer", "description": "`model_name=project`: situação do projeto — 1 em andamento, 2 concluído, 3 arquivado, 4 parado.", "enum": [ 1, 2, 3, 4 ] }, "budget": { "type": "number", "description": "`model_name=project`: orçamento do projeto. Use `null` para limpar.", "minimum": 0 }, "is_template": { "type": "boolean", "description": "`model_name=project`: marca ou desmarca os projetos como modelo." }, "contact_id": { "type": "string", "format": "uuid", "description": "`model_name=project`: contato vinculado ao projeto. `null` remove o vínculo.", "nullable": true }, "customer_id": { "type": "string", "format": "uuid", "description": "`model_name=project`: cliente vinculado ao projeto. `null` remove o vínculo.", "nullable": true }, "parent_id": { "type": "string", "format": "uuid", "description": "`model_name=project`: projeto pai. `null` desvincula da hierarquia.", "nullable": true }, "funnels": { "type": "object", "description": "`model_name=project`: vínculo com funis. O que não for citado permanece como está.", "properties": { "to_add": { "type": "array", "description": "IDs dos funis a vincular.", "items": { "type": "integer", "description": "ID do funil." } }, "to_rem": { "type": "array", "description": "IDs dos funis a desvincular.", "items": { "type": "integer", "description": "ID do funil." } } }, "required": [ "to_add", "to_rem" ] }, "groups": { "type": "object", "description": "`model_name=project`: vínculo com grupos de projetos.", "properties": { "to_add": { "type": "array", "description": "IDs dos grupos a vincular.", "items": { "type": "string", "description": "ID (UUID) do grupo de projetos.", "format": "uuid" } }, "to_rem": { "type": "array", "description": "IDs dos grupos a desvincular.", "items": { "type": "string", "description": "ID (UUID) do grupo de projetos.", "format": "uuid" } } }, "required": [ "to_add", "to_rem" ] }, "tags": { "type": "object", "description": "`model_name=project`: etiquetas do projeto.", "properties": { "to_add": { "type": "array", "description": "IDs das etiquetas a aplicar.", "items": { "type": "integer", "description": "ID da etiqueta." } }, "to_rem": { "type": "array", "description": "IDs das etiquetas a remover.", "items": { "type": "integer", "description": "ID da etiqueta." } } }, "required": [ "to_add", "to_rem" ] }, "childrens": { "type": "object", "description": "`model_name=project`: projetos filhos na hierarquia.", "properties": { "to_add": { "type": "array", "description": "IDs dos projetos que passam a ser filhos.", "items": { "type": "string", "description": "ID (UUID) do projeto filho.", "format": "uuid" } }, "to_rem": { "type": "array", "description": "IDs dos projetos que deixam de ser filhos.", "items": { "type": "string", "description": "ID (UUID) do projeto filho.", "format": "uuid" } } }, "required": [ "to_add", "to_rem" ] }, "users": { "type": "array", "description": "`model_name=project`: responsáveis do projeto. Adicionar um responsável dispara notificação para ele.", "items": { "type": "object", "description": "Operação sobre um responsável.", "properties": { "user_id": { "type": "string", "description": "ID (UUID) do usuário. Precisa ter vínculo ativo na empresa.", "format": "uuid" }, "role": { "type": "string", "description": "Papel do usuário no projeto.", "enum": [ "creator", "assignee", "follower" ] }, "action": { "type": "string", "description": "`add` vincula o usuário, `remove` desvincula.", "enum": [ "add", "remove" ] } }, "required": [ "user_id", "role", "action" ] } }, "forecast_dates": { "type": "array", "description": "`model_name=project`: data prevista de conclusão por funil.", "items": { "type": "object", "description": "Previsão de um funil.", "properties": { "date": { "type": "string", "description": "Data prevista (AAAA-MM-DD). `null` limpa a previsão.", "nullable": true }, "project_funnel_id": { "type": "integer", "description": "ID do funil ao qual a previsão pertence." } }, "required": [ "date", "project_funnel_id" ] } }, "funnel_status": { "type": "object", "description": "`model_name=project`: situação do projeto dentro de um funil.", "properties": { "project_funnel_id": { "type": "integer", "description": "ID do funil em que a situação será aplicada." }, "funnel_status_id": { "type": "integer", "description": "ID da situação do funil. `null` remove a situação.", "nullable": true } }, "required": [ "project_funnel_id" ] }, "form_answers": { "type": "array", "description": "Respostas de formulário dinâmico. Com `model_name=project` responde o formulário do próprio projeto; com `model_name=answer_pool` é a lista de respostas aplicada a todos os IDs.", "items": { "type": "object", "description": "Resposta de um campo do formulário.", "properties": { "id": { "type": "string", "description": "ID do campo (edge) do formulário dinâmico." }, "answer": { "description": "Valor da resposta. O tipo aceito depende do campo." } }, "required": [ "id", "answer" ] } }, "target": { "type": "object", "description": "`model_name=answer_pool`: identifica o formulário e a entidade dona das respostas. `father_id` é preenchido automaticamente com cada item de `ids`.", "properties": { "pivot_class": { "type": "string", "description": "Model que guarda as respostas, por exemplo `App\\\\Models\\\\Project`." }, "form_id": { "type": "string", "description": "ID (UUID) do formulário dinâmico.", "format": "uuid" }, "father_class": { "type": "string", "description": "Model dono das respostas, por exemplo `App\\\\Models\\\\Project`." } }, "required": [ "pivot_class", "form_id", "father_class" ] } } }, "example": { "ids": [], "name": "", "description": "", "impact": 5, "status": 1, "budget": 0, "is_template": false, "contact_id": null, "customer_id": null, "parent_id": null, "funnels": { "to_add": [], "to_rem": [] }, "groups": { "to_add": [], "to_rem": [] }, "tags": { "to_add": [], "to_rem": [] }, "childrens": { "to_add": [], "to_rem": [] }, "users": [ { "user_id": null, "role": "assignee", "action": "add" } ], "forecast_dates": [ { "date": "2026-09-01", "project_funnel_id": null } ], "funnel_status": { "project_funnel_id": null, "funnel_status_id": null }, "form_answers": [ { "id": null, "answer": "" } ] } } } } }, "parameters": [ { "name": "model_name", "in": "path", "required": true, "description": "Modelo a atualizar. Aceita `project` (projetos) e `answer_pool` (respostas de formulário dinâmico). O nome é case-insensitive e aceita as variações `answerPool` e `answer-pool`.", "schema": { "type": "string" }, "example": "string" } ] }, "/api/management/tags": { "get": { "tags": [ "tags" ], "summary": "Listar etiquetas", "description": "Listar todas as etiquetas cadastradas no sistema.", "operationId": "listarEtiquetas", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "tags": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "name": { "type": "string" }, "color": { "type": "string" }, "model": { "type": "string" }, "created_at": { "type": "string", "format": "date-time" } } } }, "response": { "type": "boolean" } } }, "example": { "tags": [ { "id": "019c8b6e-8e75-724d-b877-b11df90d2b15", "name": "Copyright", "color": "#5e4ff8", "model": "App\\Models\\Contact", "created_at": "2026-02-23T16:56:44.000000Z", "deleted_at": null }, { "id": "019c8b9c-c034-73cd-9a3c-eae8e54b3bfe", "name": "Financeiro", "color": "#258aff", "model": "App\\Models\\Customer", "created_at": "2026-02-23T17:47:11.000000Z", "deleted_at": null }, { "id": "019c8fa4-9ed1-727b-81d4-e2d9c03d695f", "name": "Marketing", "color": "#28a745", "model": "App\\Models\\Customer", "created_at": "2026-02-24T12:34:16.000000Z", "deleted_at": null }, { "id": "019c8fca-50e8-7142-83d3-01c38543a9c5", "name": "Desenvolvedor de software", "color": null, "model": "App\\Models\\Customer", "created_at": "2026-02-24T13:15:26.000000Z", "deleted_at": null } ], "response": true } } } }, "401": { "description": "Não autorizado", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "message": { "type": "string" }, "error": { "type": "string" } } }, "example": { "response": false, "message": "unauthorized", "error": "Unauthenticated." } } } } } }, "post": { "tags": [ "tags" ], "summary": "Criar uma etiqueta", "description": "Criar uma nova etiqueta no sistema.", "operationId": "criarEtiqueta", "requestBody": { "content": { "application/json": { "schema": { "title": "Criação de etiqueta", "description": "Payload obrigatório para criação de uma etiqueta", "allOf": [ { "description": "Dados para criação de uma etiqueta", "title": "Etiqueta", "type": "object", "properties": { "name": { "type": "string", "maxLength": 255, "example": "Nome da etiqueta", "description": "Nome da etiqueta. Campo obrigatório, máximo de 255 caracteres. Deve ser único por empresa e model." }, "model": { "type": "string", "enum": [ "App\\Models\\Customer", "App\\Models\\Contact" ], "example": "App\\Models\\Customer", "description": "Classe do modelo ao qual a tag está associada. Modelos suportados: Customer, Contact. Campo obrigatório na criação." }, "color": { "type": "string", "pattern": "^#[0-9A-Fa-f]{6}$", "maxLength": 7, "example": "#FF5733", "description": "Cor da tag em hexadecimal (#RRGGBB). Campo opcional." } }, "required": [ "name", "model" ] }, {} ] }, "examples": { "Criar etiqueta": { "value": { "name": "Nova etiqueta", "color": "#258aff", "model": "App\\Models\\Contact" } } } } } }, "responses": { "201": { "description": "Sucesso", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "Date": { "schema": { "type": "string" }, "example": "Thu, 26 Feb 2026 17:37:42 GMT" }, "Referrer-Policy": { "schema": { "type": "string" }, "example": "strict-origin-when-cross-origin" }, "Strict-Transport-Security": { "schema": { "type": "string" }, "example": "max-age=31536000; includeSubDomains" }, "X-Content-Type-Options": { "schema": { "type": "string" }, "example": "nosniff" }, "X-Frame-Options": { "schema": { "type": "string" }, "example": "SAMEORIGIN" }, "X-Ratelimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-Ratelimit-Remaining": { "schema": { "type": "integer" }, "example": 159 }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" } } }, "401": { "description": "Não autorizado", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "Date": { "schema": { "type": "string" }, "example": "Thu, 26 Feb 2026 17:38:33 GMT" }, "Referrer-Policy": { "schema": { "type": "string" }, "example": "strict-origin-when-cross-origin" }, "Strict-Transport-Security": { "schema": { "type": "string" }, "example": "max-age=31536000; includeSubDomains" }, "X-Content-Type-Options": { "schema": { "type": "string" }, "example": "nosniff" }, "X-Frame-Options": { "schema": { "type": "string" }, "example": "SAMEORIGIN" }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" } } }, "422": { "description": "Campo inválido", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "Date": { "schema": { "type": "string" }, "example": "Thu, 26 Feb 2026 17:39:10 GMT" }, "Referrer-Policy": { "schema": { "type": "string" }, "example": "strict-origin-when-cross-origin" }, "Strict-Transport-Security": { "schema": { "type": "string" }, "example": "max-age=31536000; includeSubDomains" }, "X-Content-Type-Options": { "schema": { "type": "string" }, "example": "nosniff" }, "X-Frame-Options": { "schema": { "type": "string" }, "example": "SAMEORIGIN" }, "X-Ratelimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-Ratelimit-Remaining": { "schema": { "type": "integer" }, "example": 159 }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" } } } } } }, "/api/management/tags/{tag}": { "get": { "tags": [ "tags" ], "summary": "Obter etiqueta específica", "description": "Obter detalhes de uma etiqueta específica.", "operationId": "obterEtiquetaEspecFica", "responses": { "200": { "description": "Sucesso", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "Content-Encoding": { "schema": { "type": "string" }, "example": "gzip" }, "Date": { "schema": { "type": "string" }, "example": "Thu, 26 Feb 2026 17:43:43 GMT" }, "Referrer-Policy": { "schema": { "type": "string" }, "example": "strict-origin-when-cross-origin" }, "Strict-Transport-Security": { "schema": { "type": "string" }, "example": "max-age=31536000; includeSubDomains" }, "Vary": { "schema": { "type": "string" }, "example": "Accept-Encoding" }, "X-Content-Type-Options": { "schema": { "type": "string" }, "example": "nosniff" }, "X-Frame-Options": { "schema": { "type": "string" }, "example": "SAMEORIGIN" }, "X-Ratelimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-Ratelimit-Remaining": { "schema": { "type": "integer" }, "example": 156 }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" } } }, "401": { "description": "Não autorizado", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "Date": { "schema": { "type": "string" }, "example": "Thu, 26 Feb 2026 17:44:26 GMT" }, "Referrer-Policy": { "schema": { "type": "string" }, "example": "strict-origin-when-cross-origin" }, "Strict-Transport-Security": { "schema": { "type": "string" }, "example": "max-age=31536000; includeSubDomains" }, "X-Content-Type-Options": { "schema": { "type": "string" }, "example": "nosniff" }, "X-Frame-Options": { "schema": { "type": "string" }, "example": "SAMEORIGIN" }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" } } } } }, "put": { "tags": [ "tags" ], "summary": "Atualizar uma etiqueta", "description": "Atualizar dados de uma etiqueta específica.", "operationId": "atualizarEtiqueta", "requestBody": { "content": { "application/json": { "schema": { "title": "Atualização de etiqueta", "description": "Payload para atualização de uma etiqueta", "allOf": [ { "description": "Dados para atualização de uma etiqueta", "title": "Etiqueta", "type": "object", "properties": { "name": { "type": "string", "maxLength": 255, "example": "Nome da etiqueta", "description": "Nome da etiqueta. Campo obrigatório, máximo de 255 caracteres. Deve ser único por frame e model." }, "color": { "type": "string", "maxLength": 7, "pattern": "^#[0-9A-Fa-f]{6}$", "example": "#33FF57", "description": "Cor da tag em hexadecimal (#RRGGBB). Campo opcional." } }, "required": [ "name" ] }, {} ] }, "examples": { "Atualizar etiqueta": { "value": { "name": "Novo nome de etiqueta", "color": "#258aff", "model": "App\\Models\\Customer" } } } } } }, "responses": { "200": { "description": "Sucesso", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "Content-Encoding": { "schema": { "type": "string" }, "example": "gzip" }, "Date": { "schema": { "type": "string" }, "example": "Thu, 26 Feb 2026 17:46:02 GMT" }, "Referrer-Policy": { "schema": { "type": "string" }, "example": "strict-origin-when-cross-origin" }, "Strict-Transport-Security": { "schema": { "type": "string" }, "example": "max-age=31536000; includeSubDomains" }, "Vary": { "schema": { "type": "string" }, "example": "Accept-Encoding" }, "X-Content-Type-Options": { "schema": { "type": "string" }, "example": "nosniff" }, "X-Frame-Options": { "schema": { "type": "string" }, "example": "SAMEORIGIN" }, "X-Ratelimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-Ratelimit-Remaining": { "schema": { "type": "integer" }, "example": 159 }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" } } }, "401": { "description": "Não autorizado", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "Date": { "schema": { "type": "string" }, "example": "Thu, 26 Feb 2026 17:47:11 GMT" }, "Referrer-Policy": { "schema": { "type": "string" }, "example": "strict-origin-when-cross-origin" }, "Strict-Transport-Security": { "schema": { "type": "string" }, "example": "max-age=31536000; includeSubDomains" }, "X-Content-Type-Options": { "schema": { "type": "string" }, "example": "nosniff" }, "X-Frame-Options": { "schema": { "type": "string" }, "example": "SAMEORIGIN" }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" } } }, "422": { "description": "Campo inváildo", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "Date": { "schema": { "type": "string" }, "example": "Thu, 26 Feb 2026 17:49:13 GMT" }, "Referrer-Policy": { "schema": { "type": "string" }, "example": "strict-origin-when-cross-origin" }, "Strict-Transport-Security": { "schema": { "type": "string" }, "example": "max-age=31536000; includeSubDomains" }, "X-Content-Type-Options": { "schema": { "type": "string" }, "example": "nosniff" }, "X-Frame-Options": { "schema": { "type": "string" }, "example": "SAMEORIGIN" }, "X-Ratelimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-Ratelimit-Remaining": { "schema": { "type": "integer" }, "example": 159 }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" } } } } }, "delete": { "tags": [ "tags" ], "summary": "Deletar uma etiqueta", "description": "Deletar uma tag específica do sistema.", "operationId": "deletarEtiqueta", "responses": { "200": { "description": "Sucesso", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "Content-Encoding": { "schema": { "type": "string" }, "example": "gzip" }, "Date": { "schema": { "type": "string" }, "example": "Thu, 26 Feb 2026 17:50:55 GMT" }, "Referrer-Policy": { "schema": { "type": "string" }, "example": "strict-origin-when-cross-origin" }, "Strict-Transport-Security": { "schema": { "type": "string" }, "example": "max-age=31536000; includeSubDomains" }, "Vary": { "schema": { "type": "string" }, "example": "Accept-Encoding" }, "X-Content-Type-Options": { "schema": { "type": "string" }, "example": "nosniff" }, "X-Frame-Options": { "schema": { "type": "string" }, "example": "SAMEORIGIN" }, "X-Ratelimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-Ratelimit-Remaining": { "schema": { "type": "integer" }, "example": 159 }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" } } }, "401": { "description": "Não autorizado", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "Date": { "schema": { "type": "string" }, "example": "Thu, 26 Feb 2026 17:51:19 GMT" }, "Referrer-Policy": { "schema": { "type": "string" }, "example": "strict-origin-when-cross-origin" }, "Strict-Transport-Security": { "schema": { "type": "string" }, "example": "max-age=31536000; includeSubDomains" }, "X-Content-Type-Options": { "schema": { "type": "string" }, "example": "nosniff" }, "X-Frame-Options": { "schema": { "type": "string" }, "example": "SAMEORIGIN" }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" } } } } }, "parameters": [ { "name": "tag", "in": "path", "required": true, "schema": { "type": "string" }, "example": "string" } ] }, "/api/management/search-activities": { "post": { "tags": [ "search-activities" ], "summary": "Buscar registros de alterações", "description": "Buscar registros de alterações do sistema com filtros e critérios específicos.", "operationId": "buscarRegistrosDeAlteraEs", "responses": { "200": { "description": "200" } } } }, "/api/management/project-funnels/{project_funnel_id}/metrics": { "get": { "summary": "Métricas do funil", "responses": { "200": { "description": "Sucesso", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "Content-Encoding": { "schema": { "type": "string" }, "example": "gzip" }, "Date": { "schema": { "type": "string" }, "example": "Mon, 09 Feb 2026 02:49:22 GMT" }, "Referrer-Policy": { "schema": { "type": "string" }, "example": "strict-origin-when-cross-origin" }, "Server": { "schema": { "type": "string" }, "example": "nginx" }, "Strict-Transport-Security": { "schema": { "type": "string" }, "example": "max-age=31536000; includeSubDomains" }, "Vary": { "schema": { "type": "string" }, "example": "Accept-Encoding" }, "X-Content-Type-Options": { "schema": { "type": "string" }, "example": "nosniff" }, "X-Frame-Options": { "schema": { "type": "string" }, "example": "SAMEORIGIN" }, "X-Ratelimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-Ratelimit-Remaining": { "schema": { "type": "integer" }, "example": 157 }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "metrics": { "type": "object", "description": "Métricas do funil no período.", "properties": { "period": { "type": "object", "description": "Período efetivamente usado no cálculo.", "properties": { "start_date": { "type": "string", "description": "Início do período considerado.", "format": "date" }, "end_date": { "type": "string", "description": "Fim do período considerado.", "format": "date" }, "is_default": { "type": "boolean", "description": "Indica que o período veio do padrão de 30 dias, por não ter sido informado." } } }, "basic": { "type": "object", "description": "Identificação e configuração básica do funil.", "properties": { "id": { "type": "integer", "description": "ID do funil." }, "name": { "type": "string", "description": "Nome do funil." }, "condition": { "type": "string", "enum": [ "active", "inactive" ], "description": "Situação do funil." }, "steps": { "type": "array", "description": "Etapas do funil.", "items": { "description": "Etapa do funil.", "type": "object", "properties": {} } }, "funnel_form": { "type": "object", "description": "Formulário de vínculo do funil." }, "business_area": { "type": "object", "description": "Área de negócio do funil." }, "created_at": { "type": "string", "description": "Data de criação do funil.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data da última alteração.", "format": "date-time" } } }, "counts": { "type": "object", "description": "Totais do funil.", "properties": { "total_steps": { "type": "integer", "description": "Quantidade de etapas." }, "total_projects": { "type": "integer", "description": "Projetos vinculados ao funil." }, "active_projects": { "type": "integer", "description": "Projetos em andamento." }, "tags_count": { "type": "integer", "description": "Etiquetas cadastradas." }, "attachments_count": { "type": "integer", "description": "Anexos do funil." } } }, "steps_distribution": { "type": "array", "description": "Movimento de cada etapa no período.", "items": { "type": "object", "properties": { "step_id": { "type": "integer", "description": "ID da etapa." }, "step_name": { "type": "string", "description": "Nome da etapa." }, "projects_count": { "type": "integer", "description": "Projetos atualmente na etapa." }, "projects_entry_in_period": { "type": "integer", "description": "Projetos que entraram na etapa no período." }, "projects_exit_in_period": { "type": "integer", "description": "Projetos que saíram da etapa no período." } } } }, "steps_summary": { "type": "object", "description": "Resumo da ocupação das etapas.", "properties": { "most_occupied_step": { "type": "object", "description": "Etapa com mais projetos no momento." }, "empty_steps_ids": { "type": "array", "description": "Etapas sem nenhum projeto.", "items": { "type": "integer", "description": "ID de uma etapa sem projetos." } }, "empty_steps_count": { "type": "integer", "description": "Quantidade de etapas vazias." } } }, "time_metrics": { "type": "object", "description": "Tempos do funil e por etapa.", "properties": { "average_time_in_funnel_minutes": { "type": "number", "description": "Tempo médio, em minutos, que os projetos passam no funil." }, "average_time_per_step_minutes": { "type": "array", "description": "Tempo médio por etapa.", "items": { "type": "object", "properties": { "step_id": { "type": "integer", "description": "ID da etapa." }, "step_name": { "type": "string", "description": "Nome da etapa." }, "average_time_minutes": { "type": "number", "description": "Tempo médio de permanência, em minutos." } } } }, "oldest_project_id": { "type": "string", "description": "Projeto há mais tempo no funil.", "format": "uuid" }, "newest_project_id": { "type": "string", "description": "Projeto mais recente no funil.", "format": "uuid" }, "oldest_project_minutes": { "type": "number", "description": "Tempo, em minutos, do projeto mais antigo." }, "newest_project_minutes": { "type": "number", "description": "Tempo, em minutos, do projeto mais recente." } } }, "activity": { "type": "object", "description": "Atividade recente.", "properties": { "last_activity_at": { "type": "string", "description": "Última movimentação registrada no funil.", "format": "date-time" }, "projects_added_in_period": { "type": "integer", "description": "Projetos que entraram no funil no período." } } }, "tags": { "type": "array", "description": "Uso das etiquetas do funil.", "items": { "description": "Etiqueta com a quantidade de projetos que a usam.", "type": "object", "properties": { "id": { "type": "integer", "description": "ID do item." }, "name": { "type": "string", "description": "Nome do item." }, "color": { "type": "string", "description": "Cor em hexadecimal." }, "projects_count": { "type": "integer", "description": "Projetos do funil com este item aplicado." } } } }, "funnel_status": { "type": "array", "description": "Uso dos status do funil.", "items": { "description": "Status com a quantidade de projetos que o usam.", "type": "object", "properties": { "id": { "type": "integer", "description": "ID do item." }, "name": { "type": "string", "description": "Nome do item." }, "color": { "type": "string", "description": "Cor em hexadecimal." }, "projects_count": { "type": "integer", "description": "Projetos do funil com este item aplicado." } } } }, "attachments": { "type": "array", "description": "Anexos do funil.", "items": { "description": "Anexo do funil com quem o enviou.", "type": "object", "properties": {} } } } } }, "required": [ "response", "metrics" ] }, "example": { "response": true, "metrics": { "period": { "start_date": "2026-01-09", "end_date": "2026-02-08", "is_default": true }, "basic": { "id": 38, "name": "Marketing", "condition": "active", "steps": [ { "id": 166, "name": "Backlog", "form_id": null }, { "id": 167, "name": "Em Andamento", "form_id": null }, { "id": 168, "name": "Correção", "form_id": null }, { "id": 169, "name": "Publicação", "form_id": null }, { "id": 170, "name": "Análise de Resultados", "form_id": null }, { "id": 171, "name": "Finalização", "form_id": null } ], "funnel_form": null, "business_area": null, "created_at": "2026-02-08T23:44:18-03:00", "updated_at": "2026-02-08T23:44:18-03:00" }, "counts": { "total_steps": 6, "total_projects": 50, "active_projects": 50, "tags_count": 2, "attachments_count": 0 }, "steps_distribution": [ { "step_id": 167, "step_name": "Em Andamento", "projects_count": 11, "projects_entry_in_period": 19, "projects_exit_in_period": 12 }, { "step_id": 166, "step_name": "Backlog", "projects_count": 9, "projects_entry_in_period": 21, "projects_exit_in_period": 13 }, { "step_id": 168, "step_name": "Correção", "projects_count": 9, "projects_entry_in_period": 11, "projects_exit_in_period": 9 }, { "step_id": 169, "step_name": "Publicação", "projects_count": 8, "projects_entry_in_period": 7, "projects_exit_in_period": 5 }, { "step_id": 171, "step_name": "Finalização", "projects_count": 7, "projects_entry_in_period": 5, "projects_exit_in_period": 0 }, { "step_id": 170, "step_name": "Análise de Resultados", "projects_count": 6, "projects_entry_in_period": 6, "projects_exit_in_period": 5 } ], "steps_summary": { "most_occupied_step": { "step_id": 167, "step_name": "Em Andamento", "step_form_id": null, "projects_count": 11 }, "empty_steps_ids": [], "empty_steps_count": 0 }, "time_metrics": { "average_time_in_funnel_minutes": 4963.2, "average_time_per_step_minutes": [ { "step_id": 166, "step_name": "Backlog", "average_time_minutes": 5643.75 }, { "step_id": 167, "step_name": "Em Andamento", "average_time_minutes": 4472 }, { "step_id": 168, "step_name": "Correção", "average_time_minutes": 5880 }, { "step_id": 169, "step_name": "Publicação", "average_time_minutes": 3372 }, { "step_id": 170, "step_name": "Análise de Resultados", "average_time_minutes": 4200 }, { "step_id": 171, "step_name": "Finalização", "average_time_minutes": 0 } ], "oldest_project_id": "d5f647d1-2df1-451c-96e7-5f577dd3b574", "newest_project_id": "8812c301-6ed5-4495-a255-34b2d24433e5", "oldest_project_minutes": 129398.09, "newest_project_minutes": 963.09 }, "activity": { "last_activity_at": "2026-02-08T17:46:17-03:00", "projects_added_in_period": 15 }, "tags": [ { "id": 1, "name": "Bixa prioridade", "color": "#28a745", "projects_count": 0 }, { "id": 2, "name": "Alta prioridade", "color": "#ffc107", "projects_count": 0 } ], "funnel_status": [], "attachments": [] } } } } } }, "tags": [ "project-funnels", "Métricas" ], "description": "Consolida os números do funil no período: contagens de projetos e etapas, distribuição e ocupação por etapa, tempo médio no funil e por etapa, atividade recente, uso de etiquetas e status e os anexos do funil. Sem `start_date` e `end_date` o período são os últimos 30 dias; o intervalo informado não pode passar de 3 meses e as datas devem estar em `YYYY-MM-DD`. Ver [Métricas e tempo por etapa](https://docs.olie.ai/guides/funnels/metrics).", "parameters": [ { "name": "start_date", "in": "query", "description": "Início do período no formato `YYYY-MM-DD`. Não pode ser futura. Padrão: 30 dias atrás.", "schema": { "type": "string", "format": "date" }, "example": "" }, { "name": "end_date", "in": "query", "description": "Fim do período no formato `YYYY-MM-DD`. Obrigatória quando `start_date` é informada e não pode ser anterior a ela. Padrão: hoje.", "schema": { "type": "string" }, "example": "" } ] }, "parameters": [ { "name": "project_funnel_id", "in": "path", "required": true, "description": "ID do funil de projeto.", "deprecated": false, "schema": { "type": "integer" }, "example": 0 } ] }, "/api/management/projects/{project}/project-executions": { "get": { "summary": "Listar execuções de um projeto", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "description": "Lista paginada de execuções do projeto.", "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "meta": { "type": "object", "description": "Dados da paginação.", "properties": { "current_page": { "type": "integer", "description": "Página retornada." }, "from": { "type": "integer", "description": "Posição do primeiro item da página no total." }, "to": { "type": "integer", "description": "Posição do último item da página no total." }, "last_page": { "type": "integer", "description": "Número da última página." }, "per_page": { "type": "integer", "description": "Itens por página." }, "total": { "type": "integer", "description": "Total de itens encontrados." } } }, "project_executions": { "type": "array", "description": "Execuções da página.", "items": { "description": "Registro de tempo de trabalho.", "type": "object", "properties": { "id": { "type": "string", "description": "ID (UUID) da execução.", "format": "uuid" }, "project_id": { "type": "string", "description": "Projeto em que o tempo foi contado.", "format": "uuid" }, "user_id": { "type": "string", "description": "Pessoa que executou.", "format": "uuid" }, "funnel_step_id": { "type": "integer", "description": "Etapa do funil em que o tempo foi contado." }, "started_at": { "type": "string", "description": "Início da contagem.", "format": "date-time" }, "finished_at": { "type": "string", "description": "Término da contagem. `null` enquanto a execução está em andamento.", "format": "date-time" }, "hourly_rate": { "type": "number", "description": "Valor hora aplicado. Só aparece para quem tem acesso a custos." }, "finished_reason": { "type": "string", "description": "Motivo do encerramento: `self_stop`, `scheduled_stop`, `step_moved`, `project_deleted`, `project_template` ou `step_deleted`." }, "started_at_real": { "type": "string", "description": "Início original, quando o horário foi ajustado depois.", "format": "date-time" }, "finished_at_real": { "type": "string", "description": "Término original, quando o horário foi ajustado depois.", "format": "date-time" }, "project": { "type": "object", "description": "Projeto da execução." }, "user": { "type": "object", "description": "Pessoa que executou." }, "funnel_step": { "type": "object", "description": "Etapa e funil da execução." } } } } }, "required": [ "response", "project_executions" ] }, "example": { "response": true, "meta": { "current_page": 1, "from": 1, "last_page": 1, "per_page": 30, "to": 2, "total": 2 }, "project_executions": [ { "id": "a14afcbd-38b1-4b97-8950-02c09547611a", "project_id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "user_id": "019c1e87-63f4-71dd-a4e3-6eaea0619c2f", "funnel_step_id": 181, "started_at": "2026-08-19T13:05:00.000000Z", "finished_at": "2026-08-19T14:47:12.000000Z", "hourly_rate": 85, "finished_reason": "self_stop", "started_at_real": null, "finished_at_real": null, "project": { "id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "code": "SC-1", "name": "Shopping Center", "is_template": false, "deleted_at": null }, "user": { "id": "019c1e87-63f4-71dd-a4e3-6eaea0619c2f", "name": "Ana Souza", "avatar_url": null }, "funnel_step": { "id": 181, "name": "Execução", "project_funnel_id": 36, "funnel": { "id": 36, "name": "Obras" } } }, { "id": "a14afbe7-d2bc-4821-9c2b-7ce295f8a962", "project_id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "user_id": "019c1e87-63f4-71dd-a4e3-6eaea0619c2f", "funnel_step_id": 181, "started_at": "2026-08-18T09:12:44.000000Z", "finished_at": "2026-08-18T11:30:00.000000Z", "hourly_rate": 85, "finished_reason": "step_moved", "started_at_real": null, "finished_at_real": null, "project": { "id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "code": "SC-1", "name": "Shopping Center", "is_template": false, "deleted_at": null }, "user": { "id": "019c1e87-63f4-71dd-a4e3-6eaea0619c2f", "name": "Ana Souza", "avatar_url": null }, "funnel_step": { "id": 181, "name": "Execução", "project_funnel_id": 36, "funnel": { "id": 36, "name": "Obras" } } } ] } } } } }, "tags": [ "projects", "Execuções" ], "parameters": [ { "name": "page", "in": "query", "description": "Página desejada. Padrão `1`.", "schema": { "type": "string" }, "example": "" }, { "name": "perPage", "in": "query", "description": "Itens por página. Padrão `30`, máximo `100`.", "schema": { "type": "string" }, "example": "" }, { "name": "filter[user_id]", "in": "query", "description": "ID (UUID) do usuário dono das execuções.", "schema": { "type": "string", "format": "uuid" }, "example": "" }, { "name": "filter[funnel_step_id]", "in": "query", "description": "ID da etapa do funil em que a execução ocorreu.", "schema": { "type": "integer" }, "example": 0 }, { "name": "filter[start_date_gt]", "in": "query", "description": "Retorna execuções iniciadas nesta data ou depois dela.", "schema": { "type": "string", "format": "date-time" }, "example": "" }, { "name": "filter[end_date_lt]", "in": "query", "description": "Retorna execuções encerradas nesta data ou antes dela.", "schema": { "type": "string", "format": "date-time" }, "example": "" }, { "name": "filter[is_running]", "in": "query", "description": "`true` retorna apenas as execuções em andamento; `false`, apenas as encerradas.", "schema": { "type": "string" }, "example": "" }, { "name": "sort", "in": "query", "description": "Ordenação por `started_at` ou `finished_at`. Use `-` antes do campo para ordem decrescente.", "schema": { "type": "string" }, "example": "" } ], "description": "Lista as execuções registradas em um projeto, com paginação. Aceita recortes por pessoa, por etapa e por período, e ordenação por início ou término.\n\nConsulte [Filtro básico](https://docs.olie.ai/api-reference/general/basic-filters) e [Paginação](https://docs.olie.ai/api-reference/general/pagination)." }, "parameters": [ { "name": "project", "in": "path", "required": true, "description": "ID (UUID) do projeto.", "schema": { "type": "string" }, "example": "{{project_id}}" } ], "post": { "summary": "Iniciar uma execução", "responses": { "201": { "description": "Sucesso", "content": { "application/json": { "schema": { "description": "Execução devolvida sob a chave `data`.", "type": "object", "properties": { "data": { "type": "object", "description": "Registro de tempo de trabalho.", "properties": { "id": { "type": "string", "description": "ID (UUID) da execução.", "format": "uuid" }, "project_id": { "type": "string", "description": "Projeto em que o tempo foi contado.", "format": "uuid" }, "user_id": { "type": "string", "description": "Pessoa que executou.", "format": "uuid" }, "funnel_step_id": { "type": "integer", "description": "Etapa do funil em que o tempo foi contado." }, "started_at": { "type": "string", "description": "Início da contagem.", "format": "date-time" }, "finished_at": { "type": "string", "description": "Término da contagem. `null` enquanto a execução está em andamento.", "format": "date-time" }, "hourly_rate": { "type": "number", "description": "Valor hora aplicado. Só aparece para quem tem acesso a custos." }, "finished_reason": { "type": "string", "description": "Motivo do encerramento: `self_stop`, `scheduled_stop`, `step_moved`, `project_deleted`, `project_template` ou `step_deleted`." }, "started_at_real": { "type": "string", "description": "Início original, quando o horário foi ajustado depois.", "format": "date-time" }, "finished_at_real": { "type": "string", "description": "Término original, quando o horário foi ajustado depois.", "format": "date-time" }, "project": { "type": "object", "description": "Projeto da execução." }, "user": { "type": "object", "description": "Pessoa que executou." }, "funnel_step": { "type": "object", "description": "Etapa e funil da execução." } } }, "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." } }, "required": [ "data", "response" ] }, "example": { "data": { "id": "a14afcbd-38b1-4b97-8950-02c09547611a", "project_id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "user_id": "019c1e87-63f4-71dd-a4e3-6eaea0619c2f", "funnel_step_id": 181, "started_at": "2026-08-19T13:05:00.000000Z", "finished_at": null, "hourly_rate": 85, "finished_reason": null, "started_at_real": null, "finished_at_real": null, "project": { "id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "code": "SC-1", "name": "Shopping Center", "is_template": false, "deleted_at": null }, "user": { "id": "019c1e87-63f4-71dd-a4e3-6eaea0619c2f", "name": "Ana Souza", "avatar_url": null }, "funnel_step": { "id": 181, "name": "Execução", "project_funnel_id": 36, "funnel": { "id": 36, "name": "Obras" } } }, "response": true } } } }, "422": { "description": "Etapa não permite execução", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." } }, "required": [ "response", "message", "error" ] }, "example": { "response": false, "message": "execution_not_allowed_on_step", "error": "Project executions are not allowed on this funnel/step" } } } } }, "tags": [ "projects", "Execuções" ], "parameters": [ { "name": "funnel_step_id", "in": "query", "description": "ID da etapa onde será executado o projeto", "schema": { "type": "string" }, "example": "string" } ], "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "funnel_step_id": { "type": "integer", "description": "ID da etapa do funil em que o tempo será contado." } }, "description": "Etapa em que a execução começa.", "required": [ "funnel_step_id" ] }, "example": { "funnel_step_id": null } } } }, "description": "Inicia a contagem de tempo do usuário autenticado no projeto, na etapa informada. Qualquer execução que ele tenha em andamento é encerrada automaticamente antes; se já houver uma execução rodando naquela mesma etapa, ela é devolvida sem que uma nova seja criada.\n\nO projeto precisa estar na etapa indicada, e tanto o funil quanto a etapa precisam permitir execução — veja [Permitir execução](https://docs.olie.ai/guides/funnels/creating-funnels). Tokens de aplicação não podem iniciar execuções." } }, "/api/management/projects/{project_id}/project-executions/{project_execution_id}": { "put": { "summary": "Atualizar uma execução", "responses": { "200": { "description": "Encerrada agora", "content": { "application/json": { "schema": { "description": "Execução devolvida sob a chave `data`.", "type": "object", "properties": { "data": { "type": "object", "description": "Registro de tempo de trabalho.", "properties": { "id": { "type": "string", "description": "ID (UUID) da execução.", "format": "uuid" }, "project_id": { "type": "string", "description": "Projeto em que o tempo foi contado.", "format": "uuid" }, "user_id": { "type": "string", "description": "Pessoa que executou.", "format": "uuid" }, "funnel_step_id": { "type": "integer", "description": "Etapa do funil em que o tempo foi contado." }, "started_at": { "type": "string", "description": "Início da contagem.", "format": "date-time" }, "finished_at": { "type": "string", "description": "Término da contagem. `null` enquanto a execução está em andamento.", "format": "date-time" }, "hourly_rate": { "type": "number", "description": "Valor hora aplicado. Só aparece para quem tem acesso a custos." }, "finished_reason": { "type": "string", "description": "Motivo do encerramento: `self_stop`, `scheduled_stop`, `step_moved`, `project_deleted`, `project_template` ou `step_deleted`." }, "started_at_real": { "type": "string", "description": "Início original, quando o horário foi ajustado depois.", "format": "date-time" }, "finished_at_real": { "type": "string", "description": "Término original, quando o horário foi ajustado depois.", "format": "date-time" }, "project": { "type": "object", "description": "Projeto da execução." }, "user": { "type": "object", "description": "Pessoa que executou." }, "funnel_step": { "type": "object", "description": "Etapa e funil da execução." } } }, "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." } }, "required": [ "data", "response" ] }, "examples": { "Encerrada agora": { "value": { "data": { "id": "a14afcbd-38b1-4b97-8950-02c09547611a", "project_id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "user_id": "019c1e87-63f4-71dd-a4e3-6eaea0619c2f", "funnel_step_id": 181, "started_at": "2026-08-19T13:05:00.000000Z", "finished_at": "2026-08-19T14:47:12.000000Z", "hourly_rate": 85, "finished_reason": "self_stop", "started_at_real": null, "finished_at_real": null, "project": { "id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "code": "SC-1", "name": "Shopping Center", "is_template": false, "deleted_at": null }, "user": { "id": "019c1e87-63f4-71dd-a4e3-6eaea0619c2f", "name": "Ana Souza", "avatar_url": null }, "funnel_step": { "id": 181, "name": "Execução", "project_funnel_id": 36, "funnel": { "id": 36, "name": "Obras" } } }, "response": true } }, "Horários ajustados": { "value": { "data": { "id": "a14afcbd-38b1-4b97-8950-02c09547611a", "project_id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "user_id": "019c1e87-63f4-71dd-a4e3-6eaea0619c2f", "funnel_step_id": 181, "started_at": "2026-08-19T13:00:00.000000Z", "finished_at": "2026-08-19T15:00:00.000000Z", "hourly_rate": 85, "finished_reason": "self_stop", "started_at_real": null, "finished_at_real": null, "project": { "id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "code": "SC-1", "name": "Shopping Center", "is_template": false, "deleted_at": null }, "user": { "id": "019c1e87-63f4-71dd-a4e3-6eaea0619c2f", "name": "Ana Souza", "avatar_url": null }, "funnel_step": { "id": 181, "name": "Execução", "project_funnel_id": 36, "funnel": { "id": 36, "name": "Obras" } } }, "response": true } } } } } }, "422": { "description": "Validação falhou", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." }, "validation": { "type": "object", "description": "Mapa de campo para as mensagens de validação daquele campo.", "properties": {} } }, "required": [ "response", "message", "error", "validation" ] }, "example": { "response": false, "message": "validation_errors", "error": "O campo finish now proíbe que started at esteja presente.", "validation": { "finish_now": [ "O campo finish now proíbe que started at esteja presente." ] } } } } } }, "tags": [ "projects", "Execuções" ], "requestBody": { "content": { "application/json": { "schema": { "description": "Ajuste da execução. Envie os horários ou `finish_now`, nunca os dois.", "type": "object", "properties": { "started_at": { "type": "string", "description": "Novo horário de início.", "format": "date-time" }, "finished_at": { "type": "string", "description": "Novo horário de término. Precisa ser depois do início.", "format": "date-time" }, "finish_now": { "type": "boolean", "description": "`true` encerra a execução agora. Não pode ser combinado com os horários." } } }, "example": { "started_at": null, "finished_at": null, "finish_now": false } } } }, "description": "Ajusta os horários de uma execução ou a encerra imediatamente. Envie `finish_now` como `true` para parar a contagem agora — nesse caso `started_at` e `finished_at` não podem ser enviados.\n\nCorrigir horários exige permissão de edição da execução, enquanto encerrar a própria contagem não. Tokens de aplicação não podem atualizar execuções." }, "parameters": [ { "name": "project_id", "in": "path", "required": true, "description": "ID (UUID) do projeto.", "schema": { "type": "string" }, "example": "{{project_id}}" }, { "name": "project_execution_id", "in": "path", "required": true, "description": "ID (UUID) da execução.", "schema": { "type": "string" }, "example": "" } ], "delete": { "summary": "Remover uma execução", "responses": { "204": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object" }, "example": {} } } } }, "tags": [ "projects", "Execuções" ], "description": "Apaga um registro de execução do projeto. O tempo deixa de contar nos totais do painel e nos relatórios. Exige permissão de edição da execução." } }, "/api/management/project-executions/me": { "get": { "summary": "Obter minhas execuções", "responses": { "200": { "description": "Sucesso", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "Content-Encoding": { "schema": { "type": "string" }, "example": "gzip" }, "Date": { "schema": { "type": "string" }, "example": "Fri, 13 Mar 2026 21:17:54 GMT" }, "Referrer-Policy": { "schema": { "type": "string" }, "example": "strict-origin-when-cross-origin" }, "Server": { "schema": { "type": "string" }, "example": "nginx" }, "Strict-Transport-Security": { "schema": { "type": "string" }, "example": "max-age=31536000; includeSubDomains" }, "Vary": { "schema": { "type": "string" }, "example": "Accept-Encoding" }, "X-Content-Type-Options": { "schema": { "type": "string" }, "example": "nosniff" }, "X-Frame-Options": { "schema": { "type": "string" }, "example": "SAMEORIGIN" }, "X-Ratelimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-Ratelimit-Remaining": { "schema": { "type": "integer" }, "example": 159 }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" } }, "content": { "application/json": { "schema": { "description": "Panorama de execuções do usuário autenticado.", "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "current_execution": { "type": "object", "description": "Execução em andamento, quando existe." }, "recent_executions": { "type": "array", "description": "Execuções recentes do usuário.", "items": { "description": "Registro de tempo de trabalho.", "type": "object", "properties": { "id": { "type": "string", "description": "ID (UUID) da execução.", "format": "uuid" }, "project_id": { "type": "string", "description": "Projeto em que o tempo foi contado.", "format": "uuid" }, "user_id": { "type": "string", "description": "Pessoa que executou.", "format": "uuid" }, "funnel_step_id": { "type": "integer", "description": "Etapa do funil em que o tempo foi contado." }, "started_at": { "type": "string", "description": "Início da contagem.", "format": "date-time" }, "finished_at": { "type": "string", "description": "Término da contagem. `null` enquanto a execução está em andamento.", "format": "date-time" }, "hourly_rate": { "type": "number", "description": "Valor hora aplicado. Só aparece para quem tem acesso a custos." }, "finished_reason": { "type": "string", "description": "Motivo do encerramento: `self_stop`, `scheduled_stop`, `step_moved`, `project_deleted`, `project_template` ou `step_deleted`." }, "started_at_real": { "type": "string", "description": "Início original, quando o horário foi ajustado depois.", "format": "date-time" }, "finished_at_real": { "type": "string", "description": "Término original, quando o horário foi ajustado depois.", "format": "date-time" }, "project": { "type": "object", "description": "Projeto da execução." }, "user": { "type": "object", "description": "Pessoa que executou." }, "funnel_step": { "type": "object", "description": "Etapa e funil da execução." } } } }, "hidden_timers": { "type": "boolean", "description": "`true` quando o usuário não pode ver os próprios cronômetros; nesse caso os tempos vêm nulos." }, "total_time": { "type": "integer", "description": "Tempo trabalhado no período, em segundos." }, "idle_time": { "type": "integer", "description": "Tempo do período sem execução, em segundos." }, "current_project_total_time": { "type": "integer", "description": "Tempo acumulado no projeto da execução atual, em segundos." }, "current_step_total_time": { "type": "integer", "description": "Tempo acumulado na etapa da execução atual, em segundos." } }, "required": [ "response" ] }, "example": { "response": true, "current_execution": { "id": "a14afcbd-38b1-4b97-8950-02c09547611a", "project_id": "019c2ffd-f4e9-709f-ae34-d4d149e3585d", "user_id": "019c1e87-63f4-71dd-a4e3-6eaea0619c2f", "funnel_step_id": 181, "started_at": "2026-03-13T20:39:59.000000Z", "finished_at": null, "hourly_rate": 0, "finished_reason": null, "started_at_real": null, "finished_at_real": null, "project": { "id": "019c2ffd-f4e9-709f-ae34-d4d149e3585d", "code": "AD-1", "name": "awdawd" }, "user": { "id": "019c1e87-63f4-71dd-a4e3-6eaea0619c2f", "name": "Test User", "avatar_url": "https://olie-main-dev.s3.amazonaws.com/app/avatars/AKMCHJI5WBPqrvx6aF9okU2dwf4VlOtRg3bN-avatar-1773273837.png" }, "funnel_step": { "id": 181, "name": "tres", "project_funnel_id": 36, "funnel": { "id": 36, "name": "funil do abacaxi" } } }, "recent_executions": [ { "id": "a14afbe7-d2bc-4821-9c2b-7ce295f8a962", "project_id": "019c2ffd-f4e9-709f-ae34-d4d149e3585d", "user_id": "019c1e87-63f4-71dd-a4e3-6eaea0619c2f", "funnel_step_id": 181, "started_at": "2026-03-13T16:00:39.000000Z", "finished_at": "2026-03-13T20:39:00.000000Z", "hourly_rate": 0, "finished_reason": "self_stop", "started_at_real": null, "finished_at_real": "2026-03-13T19:20:03.000000Z", "project": { "id": "019c2ffd-f4e9-709f-ae34-d4d149e3585d", "code": "AD-1", "name": "awdawd" }, "user": { "id": "019c1e87-63f4-71dd-a4e3-6eaea0619c2f", "name": "Test User", "avatar_url": "https://olie-main-dev.s3.amazonaws.com/app/avatars/AKMCHJI5WBPqrvx6aF9okU2dwf4VlOtRg3bN-avatar-1773273837.png" }, "funnel_step": { "id": 181, "name": "tres", "project_funnel_id": 36, "funnel": { "id": 36, "name": "funil do abacaxi" } } }, { "id": "a14afbe7-d2bc-4821-9c2b-7ce295f8a961", "project_id": "019c2ffd-f4e9-709f-ae34-d4d149e3585d", "user_id": "019c1e87-63f4-71dd-a4e3-6eaea0619c2f", "funnel_step_id": 181, "started_at": "2026-03-13T10:00:39.000000Z", "finished_at": "2026-03-13T15:20:03.000000Z", "hourly_rate": 0, "finished_reason": "self_stop", "started_at_real": null, "finished_at_real": null, "project": { "id": "019c2ffd-f4e9-709f-ae34-d4d149e3585d", "code": "AD-1", "name": "awdawd" }, "user": { "id": "019c1e87-63f4-71dd-a4e3-6eaea0619c2f", "name": "Test User", "avatar_url": "https://olie-main-dev.s3.amazonaws.com/app/avatars/AKMCHJI5WBPqrvx6aF9okU2dwf4VlOtRg3bN-avatar-1773273837.png" }, "funnel_step": { "id": 181, "name": "tres", "project_funnel_id": 36, "funnel": { "id": 36, "name": "funil do abacaxi" } } } ], "hidden_timers": false, "total_time": 38140, "idle_time": 27734, "current_project_total_time": 38140, "current_step_total_time": 38140 } } } } }, "tags": [ "projects", "Execuções" ], "parameters": [ { "name": "start_date", "in": "query", "description": "Início do período (data ou data-hora). Padrão: começo do dia de hoje.", "schema": { "type": "string" }, "example": "" }, { "name": "end_date", "in": "query", "description": "Fim do período. Padrão: fim do dia de hoje. No máximo 30 dias após `start_date`.", "schema": { "type": "string" }, "example": "" } ], "description": "Retorna o panorama de execuções do usuário autenticado: a execução em andamento (se houver), as execuções recentes e os tempos acumulados no período — total trabalhado, tempo ocioso e tempo no projeto e na etapa atuais.\n\nO período padrão é o dia de hoje e não pode passar de 30 dias. Quem não tem acesso aos cronômetros recebe os tempos como `null` e `hidden_timers` igual a `true`." } }, "/api/management/projects/{project}/project-executions/dashboard": { "get": { "summary": "Obter o painel de execuções do projeto", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "description": "Painel de execuções do projeto.", "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "dashboard": { "type": "object", "description": "Consolidação do tempo trabalhado no projeto.", "properties": { "total_time_invested": { "type": "integer", "description": "Tempo total investido no projeto, em segundos." }, "total_sessions": { "type": "integer", "description": "Quantidade de execuções registradas." }, "average_duration": { "type": "integer", "description": "Duração média de cada execução, em segundos." }, "distribution_by_funnel": { "type": "array", "description": "Distribuição do tempo por funil.", "items": { "description": "Tempo por funil.", "type": "object", "properties": { "funnel_id": { "type": "integer", "description": "ID do funil." }, "funnel_name": { "type": "string", "description": "Nome do funil." }, "steps": { "type": "array", "description": "Distribuição do tempo por etapa.", "items": { "description": "Tempo por etapa.", "type": "object", "properties": { "step_id": { "type": "integer", "description": "ID da etapa." }, "step_name": { "type": "string", "description": "Nome da etapa." }, "time": { "type": "integer", "description": "Tempo acumulado na etapa, em segundos." }, "percentage": { "type": "number", "description": "Participação da etapa no total, em percentual." } } } } } } }, "top_users_by_time": { "type": "array", "description": "Pessoas ordenadas por tempo dedicado.", "items": { "description": "Tempo por pessoa.", "type": "object", "properties": { "user_id": { "type": "string", "description": "ID (UUID) da pessoa.", "format": "uuid" }, "user_name": { "type": "string", "description": "Nome da pessoa." }, "time": { "type": "integer", "description": "Tempo dedicado por ela, em segundos." }, "percentage": { "type": "number", "description": "Participação dela no total, em percentual." }, "is_currently_executing": { "type": "boolean", "description": "Indica se ela está executando o projeto agora." }, "current_execution_id": { "type": "string", "description": "Execução em andamento dela, quando houver.", "format": "uuid" }, "steps": { "type": "array", "description": "Distribuição do tempo por etapa.", "items": { "description": "Tempo por etapa.", "type": "object", "properties": { "step_id": { "type": "integer", "description": "ID da etapa." }, "step_name": { "type": "string", "description": "Nome da etapa." }, "time": { "type": "integer", "description": "Tempo acumulado na etapa, em segundos." }, "percentage": { "type": "number", "description": "Participação da etapa no total, em percentual." } } } } } } } } } }, "required": [ "response", "dashboard" ] }, "example": { "response": true, "dashboard": { "total_time_invested": 14352, "total_sessions": 6, "average_duration": 2392, "distribution_by_funnel": [ { "funnel_id": 36, "funnel_name": "Obras", "steps": [ { "step_id": 181, "step_name": "Execução", "time": 10120, "percentage": 70.51 }, { "step_id": 182, "step_name": "Conferência", "time": 4232, "percentage": 29.49 } ] } ], "top_users_by_time": [ { "user_id": "019c1e87-63f4-71dd-a4e3-6eaea0619c2f", "user_name": "Ana Souza", "time": 9840, "percentage": 68.56, "is_currently_executing": true, "current_execution_id": "a14afcbd-38b1-4b97-8950-02c09547611a", "steps": [ { "step_id": 181, "step_name": "Execução", "time": 9840, "percentage": 100 } ] }, { "user_id": "019c1e88-2d70-71aa-9f04-6b5c1d8e4a37", "user_name": "Bruno Lima", "time": 4512, "percentage": 31.44, "is_currently_executing": false, "current_execution_id": null, "steps": [ { "step_id": 182, "step_name": "Conferência", "time": 4512, "percentage": 100 } ] } ] } } } } } }, "tags": [ "projects", "Execuções" ], "description": "Consolida o tempo trabalhado no projeto: total investido, número de sessões, duração média, distribuição por funil e etapa e o ranking de pessoas por tempo — indicando quem está executando no momento. Todos os tempos são em segundos." }, "parameters": [ { "name": "project", "in": "path", "required": true, "description": "ID (UUID) do projeto.", "schema": { "type": "string" }, "example": "{{project_id}}" } ] }, "/api/management/users/{user_id}/project-executions": { "get": { "summary": "Listar execuções de projeto", "parameters": [ { "name": "filter[funnel_step_id]", "in": "query", "description": "Filtra pelo ID da etapa da execução", "schema": { "type": "string" }, "example": "string" }, { "name": "filter[start_date_gt]", "in": "query", "description": "Filtra execuções que começaram depois da data usada no filtro", "schema": { "type": "string" }, "example": "string" }, { "name": "filter[end_date_lt]", "in": "query", "description": "Filtra execuções que começaram antes da data usada no filtro", "schema": { "type": "string" }, "example": "string" } ], "responses": { "200": { "description": "200" } }, "tags": [ "users", "{id}" ] }, "parameters": [ { "name": "user_id", "in": "path", "required": true, "schema": { "type": "string" }, "example": "{{user_id}}" } ] }, "/api/management/forms/{form_id}/restore": { "post": { "summary": "Restaurar formulário", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "description": "Confirmação da operação.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição. Sempre true nas respostas bem-sucedidas." } } }, "example": { "response": true } } } }, "404": { "description": "Não encontrado", "content": { "application/json": { "schema": { "type": "object", "description": "Resposta de erro.", "properties": { "response": { "type": "boolean", "description": "Indicador de sucesso da requisição. Sempre false em erros." }, "message": { "type": "string", "description": "Código do erro para tratamento no cliente: form_model_not_found (inexistente, de outra conta ou não excluído)." }, "error": { "type": "string", "description": "Descrição legível do erro." } } }, "example": { "response": false, "message": "form_model_not_found", "error": "No query results for model [App\\Models\\Form] 69" } } } } }, "tags": [ "forms" ], "description": "Restaura um formulário excluído. Vínculos desfeitos na exclusão (formulário avulso de projeto e formulário padrão de objeto) não voltam automaticamente." }, "parameters": [ { "name": "form_id", "in": "path", "required": true, "description": "ID do formulário excluído.", "schema": { "type": "string" }, "example": "" } ] }, "/api/management/project-executions/{project_execution_id}": { "get": { "summary": "Obter uma execução", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "description": "Execução consultada.", "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "project_execution": { "type": "object", "description": "Registro de tempo de trabalho.", "properties": { "id": { "type": "string", "description": "ID (UUID) da execução.", "format": "uuid" }, "project_id": { "type": "string", "description": "Projeto em que o tempo foi contado.", "format": "uuid" }, "user_id": { "type": "string", "description": "Pessoa que executou.", "format": "uuid" }, "funnel_step_id": { "type": "integer", "description": "Etapa do funil em que o tempo foi contado." }, "started_at": { "type": "string", "description": "Início da contagem.", "format": "date-time" }, "finished_at": { "type": "string", "description": "Término da contagem. `null` enquanto a execução está em andamento.", "format": "date-time" }, "hourly_rate": { "type": "number", "description": "Valor hora aplicado. Só aparece para quem tem acesso a custos." }, "finished_reason": { "type": "string", "description": "Motivo do encerramento: `self_stop`, `scheduled_stop`, `step_moved`, `project_deleted`, `project_template` ou `step_deleted`." }, "started_at_real": { "type": "string", "description": "Início original, quando o horário foi ajustado depois.", "format": "date-time" }, "finished_at_real": { "type": "string", "description": "Término original, quando o horário foi ajustado depois.", "format": "date-time" }, "project": { "type": "object", "description": "Projeto da execução." }, "user": { "type": "object", "description": "Pessoa que executou." }, "funnel_step": { "type": "object", "description": "Etapa e funil da execução." } } } }, "required": [ "response", "project_execution" ] }, "example": { "response": true, "project_execution": { "id": "a14afcbd-38b1-4b97-8950-02c09547611a", "project_id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "user_id": "019c1e87-63f4-71dd-a4e3-6eaea0619c2f", "funnel_step_id": 181, "started_at": "2026-08-19T13:05:00.000000Z", "finished_at": "2026-08-19T14:47:12.000000Z", "hourly_rate": 85, "finished_reason": "self_stop", "started_at_real": null, "finished_at_real": null, "project": { "id": "019e0edb-aa7c-70c4-9d2d-3a2f175b5ddf", "code": "SC-1", "name": "Shopping Center", "is_template": false, "deleted_at": null }, "user": { "id": "019c1e87-63f4-71dd-a4e3-6eaea0619c2f", "name": "Ana Souza", "avatar_url": null }, "funnel_step": { "id": 181, "name": "Execução", "project_funnel_id": 36, "funnel": { "id": 36, "name": "Obras" } } } } } } } }, "tags": [ "projects", "Execuções" ], "description": "Retorna uma execução específica com o projeto, a etapa do funil e o usuário relacionados. O valor hora só aparece para quem tem acesso a custos." }, "parameters": [ { "name": "project_execution_id", "in": "path", "required": true, "deprecated": false, "schema": { "type": "string", "format": "uuid" }, "example": "aeb08293-dfd2-365f-9867-93c1251db399" } ] }, "/api/management/invites": { "get": { "summary": "Listar convites", "responses": { "200": { "description": "Sucesso", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "invites": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "integer" }, "token": { "type": "string" }, "email": { "type": "string", "format": "email" }, "frame_id": { "type": "string" }, "is_expired": { "type": "boolean" }, "role_ids": { "type": "array", "items": { "type": "integer" } }, "funnel_access": { "type": "array", "items": { "type": "object", "properties": { "index_all": { "type": "boolean" }, "step_change": { "type": "boolean" }, "index_created": { "type": "boolean" }, "index_assigned": { "type": "boolean" }, "project_funnel_id": { "type": "integer" } } } }, "created_at": { "type": "string", "format": "date-time" }, "updated_at": { "type": "string", "format": "date-time" } } } } } }, "example": { "response": true, "invites": [ { "id": 19, "token": "585A52F30336EE64616075FC4984D7A0", "email": "user@example.com", "frame_id": "019c75de-532c-7047-9563-daf1448ca963", "is_expired": false, "user_id": null, "role_ids": [ 6, 1 ], "funnel_access": [ { "index_all": true, "step_change": true, "index_created": true, "index_assigned": true, "project_funnel_id": 46 }, { "index_all": true, "step_change": true, "index_created": true, "index_assigned": true, "project_funnel_id": 55 }, { "index_all": true, "step_change": true, "index_created": true, "index_assigned": true, "project_funnel_id": 49 }, { "index_all": true, "step_change": true, "index_created": true, "index_assigned": true, "project_funnel_id": 48 } ], "created_at": "2026-04-16T15:05:55.000000Z", "updated_at": "2026-04-16T15:05:55.000000Z" }, { "id": 21, "token": "B2F08265A7B9016EC6C42EF1FEF3A58D", "email": "user2@example.com", "frame_id": "019c75de-532c-7047-9563-daf1448ca963", "user_id": null, "role_ids": [ 6, 1 ], "funnel_access": [ { "index_all": true, "step_change": true, "index_created": true, "index_assigned": true, "project_funnel_id": 46 }, { "index_all": true, "step_change": true, "index_created": true, "index_assigned": true, "project_funnel_id": 55 }, { "index_all": true, "step_change": true, "index_created": true, "index_assigned": true, "project_funnel_id": 49 }, { "index_all": true, "step_change": true, "index_created": true, "index_assigned": true, "project_funnel_id": 48 } ], "created_at": "2026-04-16T15:05:55.000000Z", "updated_at": "2026-04-16T15:05:55.000000Z" } ] } } } }, "401": { "description": "Não autorizado", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "Referrer-Policy": { "schema": { "type": "string" }, "example": "strict-origin-when-cross-origin" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "message": { "type": "string" }, "error": { "type": "string" } } }, "example": { "response": false, "message": "unauthorized", "error": "Unauthenticated." } } } } }, "tags": [ "invites" ] }, "post": { "summary": "Enviar convites", "responses": { "201": { "description": "Sucesso", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "invites": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "integer" }, "frame_id": { "type": "string" }, "email": { "type": "string", "format": "email" }, "role_ids": { "type": "array", "items": { "type": "integer" } }, "funnel_access": { "type": "array", "items": { "type": "object", "properties": { "project_funnel_id": { "type": "integer" }, "index_all": { "type": "boolean" }, "index_assigned": { "type": "boolean" }, "index_created": { "type": "boolean" }, "step_change": { "type": "boolean" } } } }, "token": { "type": "string" }, "updated_at": { "type": "string", "format": "date-time" }, "created_at": { "type": "string", "format": "date-time" } } } } } }, "example": { "response": true, "invites": [ { "id": 64, "frame_id": "019c75de-532c-7047-9563-daf1448ca963", "email": "user4@example.com", "role_ids": [ 7, 1 ], "funnel_access": [ { "project_funnel_id": 112, "index_all": false, "index_assigned": true, "index_created": false, "step_change": true }, { "project_funnel_id": 42, "index_all": false, "index_assigned": false, "index_created": true, "step_change": true }, { "project_funnel_id": 49, "index_all": true, "index_assigned": true, "index_created": true, "step_change": true } ], "token": "A45DA91B85AC7F67F5BA8F3CD0FC76E1", "updated_at": "2026-04-29T14:06:40.000000Z", "created_at": "2026-04-29T14:06:40.000000Z" }, { "id": 65, "frame_id": "019c75de-532c-7047-9563-daf1448ca963", "email": "user5@example.com", "role_ids": [ 7, 1 ], "funnel_access": [ { "project_funnel_id": 112, "index_all": false, "index_assigned": true, "index_created": false, "step_change": true }, { "project_funnel_id": 42, "index_all": false, "index_assigned": false, "index_created": true, "step_change": true }, { "project_funnel_id": 49, "index_all": true, "index_assigned": true, "index_created": true, "step_change": true } ], "token": "DC40E84BF55B563D11D314D9BBB39FF2", "updated_at": "2026-04-29T14:06:40.000000Z", "created_at": "2026-04-29T14:06:40.000000Z" } ] } } } }, "401": { "description": "Não autorizado", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "message": { "type": "string" }, "error": { "type": "string" } } }, "example": { "response": false, "message": "unauthorized", "error": "Unauthenticated." } } } }, "422": { "description": "Convite já enviado para este e-mail", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "message": { "type": "string" }, "error": { "type": "string" }, "email": { "type": "string", "format": "email" } } }, "example": { "response": false, "message": "invite_already_sent", "error": "Invite already sent to this email for this frame", "email": "user3@example.com" } } } } }, "tags": [ "invites" ], "requestBody": { "content": { "application/json": { "schema": { "type": "object", "description": "Payload para criar um ou mais convites (um por e-mail), com papéis e permissões de acesso a funis.", "properties": { "emails": { "type": "array", "description": "Lista de e-mails que receberão convite. Cada e-mail gera um convite dentro da mesma requisição.", "items": { "type": "string", "format": "email", "description": "Endereço de e-mail do convidado." } }, "role_ids": { "type": "array", "description": "Lista de IDs de papéis (roles) que serão atribuídos ao convidado ao aceitar o convite.", "items": { "type": "integer", "description": "ID do papel (role) a ser associado ao convidado." } }, "funnel_access": { "type": "array", "description": "Lista de permissões por funil que o convidado terá ao aceitar o convite.", "items": { "type": "object", "description": "Configuração de acesso do convidado para um funil específico.", "properties": { "project_funnel_id": { "type": "integer", "description": "ID do funil ao qual as permissões se aplicam." }, "index_all": { "type": "boolean", "description": "Permite listar/visualizar todos os projetos do funil, independentemente de atribuição ou autoria." }, "index_assigned": { "type": "boolean", "description": "Permite listar/visualizar apenas os projetos do funil atribuídos ao usuário." }, "index_created": { "type": "boolean", "description": "Permite listar/visualizar apenas os projetos do funil criados pelo usuário." }, "step_change": { "type": "boolean", "description": "Permite mover projetos de etapa dentro do funil." } } } } } }, "example": { "emails": [ "user3@example.com", "user4@example.com" ], "role_ids": [ 6, 1 ], "funnel_access": [ { "project_funnel_id": 112, "index_all": false, "index_assigned": true, "index_created": false, "step_change": true }, { "project_funnel_id": 42, "index_all": false, "index_assigned": false, "index_created": true, "step_change": true }, { "project_funnel_id": 49, "index_all": true, "index_assigned": true, "index_created": true, "step_change": true } ] } } } } } }, "/api/management/invites/{invite}": { "delete": { "summary": "Deletar convite", "responses": { "200": { "description": "Sucesso", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" }, "Content-Encoding": { "schema": { "type": "string" }, "example": "gzip" }, "Date": { "schema": { "type": "string" }, "example": "Wed, 29 Apr 2026 14:13:22 GMT" }, "Referrer-Policy": { "schema": { "type": "string" }, "example": "strict-origin-when-cross-origin" }, "Server": { "schema": { "type": "string" }, "example": "nginx" }, "Strict-Transport-Security": { "schema": { "type": "string" }, "example": "max-age=31536000; includeSubDomains" }, "Vary": { "schema": { "type": "string" }, "example": "Accept-Encoding" }, "X-Content-Type-Options": { "schema": { "type": "string" }, "example": "nosniff" }, "X-Frame-Options": { "schema": { "type": "string" }, "example": "SAMEORIGIN" }, "X-Ratelimit-Limit": { "schema": { "type": "integer" }, "example": 160 }, "X-Ratelimit-Remaining": { "schema": { "type": "integer" }, "example": 159 }, "Transfer-Encoding": { "schema": { "type": "string" }, "example": "chunked" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" } } }, "example": { "response": true } } } }, "401": { "description": "Não autorizado", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "message": { "type": "string" }, "error": { "type": "string" } } }, "example": { "response": false, "message": "unauthorized", "error": "Unauthenticated." } } } } }, "tags": [ "invites" ] }, "parameters": [ { "name": "invite", "in": "path", "required": true, "schema": { "type": "string" }, "example": "" } ] }, "/api/management/project-funnels/{project_funnel_id}/step-transitions": { "get": { "summary": "Transições de etapas", "parameters": [ { "name": "project_id", "in": "query", "required": false, "description": "Restringe as transições a um projeto (UUID).", "deprecated": false, "schema": { "type": "string" }, "example": "" }, { "name": "funnel_step_id", "in": "query", "description": "Restringe às transições de entrada ou de saída daquela etapa.", "schema": { "type": "integer" }, "example": 0 }, { "name": "user_id", "in": "query", "description": "Restringe às transições feitas por um usuário (UUID), na entrada ou na saída.", "schema": { "type": "string" }, "example": "" }, { "name": "start_date", "in": "query", "description": "Data ou data/hora inicial da entrada na etapa. Só com data, considera o dia inteiro.", "schema": { "type": "string" }, "example": "" }, { "name": "end_date", "in": "query", "description": "Data ou data/hora final da entrada na etapa. Não pode ser anterior a `start_date`.", "schema": { "type": "string" }, "example": "" }, { "name": "page", "in": "query", "description": "Página desejada. Padrão 1.", "schema": { "type": "integer" }, "example": 0 }, { "name": "perPage", "in": "query", "description": "Itens por página. Padrão 30, máximo 100.", "schema": { "type": "string" }, "example": "" } ], "responses": { "200": { "description": "Sucesso", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre true quando a operação é concluída." }, "funnel_step_transitions": { "type": "array", "description": "Transições encontradas.", "items": { "description": "Passagem de um projeto por uma etapa.", "type": "object", "properties": { "id": { "type": "integer", "description": "ID da transição." }, "entry_time": { "type": "string", "description": "Momento em que o projeto entrou na etapa.", "format": "date-time" }, "exit_time": { "type": "string", "description": "Momento da saída. Nulo enquanto o projeto continua na etapa.", "format": "date-time" }, "project_id": { "type": "string", "description": "ID (UUID) do projeto.", "format": "uuid" }, "funnel_step_id": { "type": "integer", "description": "ID da etapa." }, "exit_parent_id": { "type": "integer", "description": "ID da transição anterior, de onde o projeto veio." }, "entry_user_id": { "type": "string", "description": "Usuário que moveu o projeto para a etapa.", "format": "uuid" }, "exit_user_id": { "type": "string", "description": "Usuário que tirou o projeto da etapa.", "format": "uuid" }, "duration_seconds": { "type": "integer", "description": "Tempo de permanência em segundos. Nulo enquanto não houver saída." }, "funnel_step": { "type": "object", "description": "Etapa da transição.", "properties": { "id": { "type": "integer", "description": "ID da etapa." }, "name": { "type": "string", "description": "Nome da etapa." } } }, "exit_parent": { "type": "object", "description": "Transição anterior, no mesmo formato." }, "entry_user": { "type": "object", "description": "Usuário da entrada." }, "exit_user": { "type": "object", "description": "Usuário da saída." } } } }, "meta": { "type": "object", "description": "Metadados da paginação.", "properties": { "current_page": { "type": "integer", "description": "Página atual." }, "from": { "type": "integer", "description": "Índice do primeiro item da página." }, "to": { "type": "integer", "description": "Índice do último item da página." }, "last_page": { "type": "integer", "description": "Última página disponível." }, "per_page": { "type": "integer", "description": "Itens por página." }, "total": { "type": "integer", "description": "Total de itens." } } } }, "required": [ "response", "funnel_step_transitions", "meta" ] }, "example": { "funnel_step_transitions": [ { "id": 938, "entry_time": "2026-05-07T12:01:19.000000Z", "exit_time": null, "project_id": "019dd427-5d13-71bf-9a09-d75aa2bf4bd7", "funnel_step_id": 197, "exit_parent_id": null, "entry_user_id": "019c75de-509e-711a-8933-175cb2514cc5", "exit_user_id": null, "duration_seconds": null, "funnel_step": { "id": 197, "name": "Desenvolvimento Conceitual" }, "exit_parent": null, "entry_user": { "id": "019c75de-509e-711a-8933-175cb2514cc5", "name": "Test User", "avatar_url": "https://via.placeholder.com/124x124.png/00aa99?text=quas" }, "exit_user": null }, { "id": 936, "entry_time": "2026-05-07T11:52:43.000000Z", "exit_time": "2026-05-07T12:01:19.000000Z", "project_id": "019dd427-5d13-71bf-9a09-d75aa2bf4bd7", "funnel_step_id": 200, "exit_parent_id": 938, "entry_user_id": "019c75de-50f0-7366-a948-b8cbdd1841be", "exit_user_id": "019c75de-509e-711a-8933-175cb2514cc5", "duration_seconds": 516, "funnel_step": { "id": 200, "name": "Aprovação do Cliente" }, "exit_parent": { "id": 938, "entry_time": "2026-05-07T12:01:19.000000Z", "exit_time": null, "project_id": "019dd427-5d13-71bf-9a09-d75aa2bf4bd7", "funnel_step_id": 197, "exit_parent_id": null, "entry_user_id": "019c75de-509e-711a-8933-175cb2514cc5", "exit_user_id": null, "duration_seconds": null, "funnel_step": { "id": 197, "name": "Desenvolvimento Conceitual" } }, "entry_user": { "id": "019c75de-50f0-7366-a948-b8cbdd1841be", "name": "Cotestr User", "avatar_url": "https://via.placeholder.com/124x124.png/00aa99?text=quas" }, "exit_user": { "id": "019c75de-509e-711a-8933-175cb2514cc5", "name": "Test User", "avatar_url": "https://via.placeholder.com/124x124.png/00aa99?text=quas" } }, { "id": 935, "entry_time": "2026-05-07T11:52:39.000000Z", "exit_time": "2026-05-07T11:52:43.000000Z", "project_id": "019dd427-5d13-71bf-9a09-d75aa2bf4bd7", "funnel_step_id": 197, "exit_parent_id": 936, "entry_user_id": "019c75de-50f0-7366-a948-b8cbdd1841be", "exit_user_id": "019c75de-50f0-7366-a948-b8cbdd1841be", "duration_seconds": 4, "funnel_step": { "id": 197, "name": "Desenvolvimento Conceitual" }, "exit_parent": { "id": 936, "entry_time": "2026-05-07T11:52:43.000000Z", "exit_time": "2026-05-07T12:01:19.000000Z", "project_id": "019dd427-5d13-71bf-9a09-d75aa2bf4bd7", "funnel_step_id": 200, "exit_parent_id": 938, "entry_user_id": "019c75de-50f0-7366-a948-b8cbdd1841be", "exit_user_id": "019c75de-509e-711a-8933-175cb2514cc5", "duration_seconds": 516, "funnel_step": { "id": 200, "name": "Aprovação do Cliente" } }, "entry_user": { "id": "019c75de-50f0-7366-a948-b8cbdd1841be", "name": "Cotestr User", "avatar_url": "https://via.placeholder.com/124x124.png/00aa99?text=quas" }, "exit_user": { "id": "019c75de-50f0-7366-a948-b8cbdd1841be", "name": "Cotestr User", "avatar_url": "https://via.placeholder.com/124x124.png/00aa99?text=quas" } }, { "id": 923, "entry_time": "2026-04-28T12:54:10.000000Z", "exit_time": "2026-05-07T11:52:39.000000Z", "project_id": "019dd427-5d13-71bf-9a09-d75aa2bf4bd7", "funnel_step_id": 201, "exit_parent_id": 935, "entry_user_id": "019c75de-509e-711a-8933-175cb2514cc5", "exit_user_id": "019c75de-50f0-7366-a948-b8cbdd1841be", "duration_seconds": 773909, "funnel_step": { "id": 201, "name": "sTeste de Produto" }, "exit_parent": { "id": 935, "entry_time": "2026-05-07T11:52:39.000000Z", "exit_time": "2026-05-07T11:52:43.000000Z", "project_id": "019dd427-5d13-71bf-9a09-d75aa2bf4bd7", "funnel_step_id": 197, "exit_parent_id": 936, "entry_user_id": "019c75de-50f0-7366-a948-b8cbdd1841be", "exit_user_id": "019c75de-50f0-7366-a948-b8cbdd1841be", "duration_seconds": 4, "funnel_step": { "id": 197, "name": "Desenvolvimento Conceitual" } }, "entry_user": { "id": "019c75de-509e-711a-8933-175cb2514cc5", "name": "Test User", "avatar_url": "https://via.placeholder.com/124x124.png/00aa99?text=quas" }, "exit_user": { "id": "019c75de-50f0-7366-a948-b8cbdd1841be", "name": "Cotestr User", "avatar_url": "https://via.placeholder.com/124x124.png/00aa99?text=quas" } } ], "meta": { "current_page": 1, "from": 1, "last_page": 1, "per_page": 30, "to": 4, "total": 4 }, "response": true } } } }, "401": { "description": "Não autorizado", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." } }, "required": [ "response", "message", "error" ] }, "example": { "response": false, "message": "unauthorized", "error": "Unauthenticated." } } } }, "422": { "description": "Validação falhou", "headers": { "Access-Control-Allow-Origin": { "schema": { "type": "string" }, "example": "*" }, "Access-Control-Expose-Headers": { "schema": { "type": "string" }, "example": "*" }, "Cache-Control": { "schema": { "type": "string" }, "example": "no-cache, private" } }, "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "description": "Sempre false em respostas de erro." }, "message": { "type": "string", "description": "Identificador do erro, usado pelo cliente para tratar o caso." }, "error": { "type": "string", "description": "Descrição legível do erro." }, "validation": { "type": "object", "description": "Mapa de campo para as mensagens de validação daquele campo.", "properties": {} } }, "required": [ "response", "message", "error", "validation" ] }, "example": { "response": false, "message": "validation_errors", "error": "O campo project id deve ser um UUID válido.", "validation": { "project_id": [ "O campo project id deve ser um UUID válido." ] } } } } } }, "tags": [ "project-funnels", "Métricas" ], "description": "Lista o histórico de entradas e saídas das etapas do funil, com quem moveu, quando e quanto tempo o projeto ficou em cada etapa. É a base bruta das métricas: cada registro traz a etapa, o usuário de entrada e de saída e a transição anterior que o originou. O resultado é paginado. Ver [Métricas e tempo por etapa](https://docs.olie.ai/guides/funnels/metrics) e [Paginação](https://docs.olie.ai/api-reference/general/pagination)." }, "parameters": [ { "name": "project_funnel_id", "in": "path", "required": true, "description": "ID do funil de projeto.", "schema": { "type": "integer" }, "example": 0 } ] }, "/api/management/spreadsheet-operations": { "get": { "tags": [ "spreadsheet-operations", "index" ], "summary": "Listar operações de planilha", "description": "Lista operações de import/export assíncronas. Suporta paginação e filtros por `action` e `status`.", "operationId": "listarOperacoesDePlanilha", "responses": { "200": { "description": "Lista de operações de planilha retornada com sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "example": true }, "meta": { "type": "object", "title": "Informações de Paginação", "description": "Metadados de paginação", "properties": { "current_page": { "type": "integer", "example": 1 }, "from": { "type": "integer", "example": 1 }, "last_page": { "type": "integer", "example": 1 }, "per_page": { "type": "integer", "example": 30 }, "to": { "type": "integer", "example": 30 }, "total": { "type": "integer", "example": 5 } } }, "spreadsheet_operations": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "format": "uuid" }, "action": { "type": "string", "example": "export" }, "type": { "type": "string", "example": "project" }, "status": { "type": "string", "example": "completed" }, "total_rows": { "type": "integer", "example": 120 }, "processed_rows": { "type": "integer", "example": 120 }, "percentage": { "type": "integer", "example": 100 }, "errors_count": { "type": "integer", "example": 0 }, "metadata": { "type": "object" }, "file_name": { "type": "string", "example": "project_2026-06-01-143022.xlsx" }, "initiator_type": { "type": "string", "example": "App\\Models\\User" }, "initiator_id": { "type": "string", "format": "uuid" }, "initiator": { "type": "object", "properties": { "id": { "type": "string", "format": "uuid" }, "name": { "type": "string" }, "avatar_url": { "type": "string" } } }, "started_at": { "type": "string", "format": "date-time" }, "completed_at": { "type": "string", "format": "date-time" }, "created_at": { "type": "string", "format": "date-time" }, "updated_at": { "type": "string", "format": "date-time" } } } } } }, "example": { "response": true, "meta": { "current_page": 1, "from": 1, "last_page": 1, "per_page": 30, "to": 30, "total": 5 }, "spreadsheet_operations": [ { "id": "019dd427-5d13-71bf-9a09-d75aa2bf4bd7", "action": "export", "type": "project", "status": "completed", "total_rows": 120, "processed_rows": 120, "percentage": 100, "errors_count": 0, "metadata": { "columns": [ "project.id", "project.name" ], "filters": [] }, "file_name": "project_2026-06-01-143022.xlsx", "initiator_type": "App\\Models\\User", "initiator_id": "019c75de-50f0-7366-a948-b8cbdd1841be", "initiator": { "id": "019c75de-50f0-7366-a948-b8cbdd1841be", "name": "Tester", "avatar_url": "https://via.placeholder.com/124x124.png/00aa99?text=quas" }, "started_at": "2026-06-01T14:30:22.000000Z", "completed_at": "2026-06-01T14:31:10.000000Z", "created_at": "2026-06-01T14:30:22.000000Z", "updated_at": "2026-06-01T14:31:10.000000Z" } ] } } } }, "401": { "description": "Não autenticado" }, "403": { "description": "Sem permissão" }, "422": { "description": "Campos inválidos" } } }, "parameters": [ { "name": "page", "in": "query", "description": "Número da página a ser retornada. Começa em 1", "schema": { "type": "integer" }, "example": 1 }, { "name": "perPage", "in": "query", "description": "Quantidade de itens exibidos por página. Define o tamanho da página de resultados", "schema": { "type": "integer" }, "example": 30 }, { "name": "filter[action]", "in": "query", "description": "Filtra pelo tipo de operação: `import` ou `export`.", "schema": { "type": "string", "enum": [ "import", "export" ] }, "example": "export" }, { "name": "filter[status]", "in": "query", "description": "Filtra pelo status exato: `pending`, `processing`, `completed` ou `failed`.", "schema": { "type": "string", "enum": [ "pending", "processing", "completed", "failed" ] }, "example": "completed" } ] }, "/api/management/spreadsheet-operations/import/{type}": { "post": { "tags": [ "spreadsheet-operations", "import" ], "summary": "Importar planilha", "description": "Cria uma operação de import assíncrona (XLSX). O arquivo é processado em background e os erros são consultáveis em `/errors`.", "operationId": "importarPlanilha", "requestBody": { "required": true, "content": { "multipart/form-data": { "schema": { "type": "object", "properties": { "file": { "type": "string", "format": "binary", "description": "Arquivo XLSX (até 50MB)." } }, "required": [ "file" ] }, "example": {} } } }, "responses": { "200": { "description": "Operação de import criada com sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "example": true }, "spreadsheet_operation": { "type": "object", "properties": { "id": { "type": "string", "format": "uuid" }, "action": { "type": "string", "example": "export" }, "type": { "type": "string", "example": "project" }, "status": { "type": "string", "example": "completed" }, "total_rows": { "type": "integer", "example": 120 }, "processed_rows": { "type": "integer", "example": 120 }, "percentage": { "type": "integer", "example": 100 }, "errors_count": { "type": "integer", "example": 0 }, "metadata": { "type": "object" }, "file_name": { "type": "string", "example": "project_2026-06-01-143022.xlsx" }, "initiator_type": { "type": "string", "example": "App\\Models\\User" }, "initiator_id": { "type": "string", "format": "uuid" }, "initiator": { "type": "object", "properties": { "id": { "type": "string", "format": "uuid" }, "name": { "type": "string" }, "avatar_url": { "type": "string" } } }, "started_at": { "type": "string", "format": "date-time" }, "completed_at": { "type": "string", "format": "date-time" }, "created_at": { "type": "string", "format": "date-time" }, "updated_at": { "type": "string", "format": "date-time" } } } } }, "example": { "response": true, "spreadsheet_operation": { "id": "c8f6c4a2-31af-f523-ad00-47b2ce67491e", "action": "export", "type": "project", "status": "completed", "total_rows": 120, "processed_rows": 120, "percentage": 100, "errors_count": 0, "metadata": {}, "file_name": "project_2026-06-01-143022.xlsx", "initiator_type": "App\\Models\\User", "initiator_id": "ee989a1d-afe3-4ff7-f4fb-bec440e8b372", "initiator": { "id": "7b6c3328-3066-e4e3-ae36-911996a826da", "name": "string", "avatar_url": "string" }, "started_at": "2026-04-23T17:57:57.942Z", "completed_at": "1980-11-02T01:58:58.018Z", "created_at": "1950-02-26T12:34:00.424Z", "updated_at": "1955-03-13T19:55:56.035Z" } } } } }, "401": { "description": "Não autenticado" }, "403": { "description": "Sem permissão" }, "422": { "description": "Campos inválidos" } } }, "parameters": [ { "name": "type", "in": "path", "required": true, "description": "Tipo de operação. Atualmente: `project`, `customer` ou `contact`.", "schema": { "type": "string", "enum": [ "project", "customer", "contact" ] }, "example": "project" } ] }, "/api/management/spreadsheet-operations/export/{type}/columns": { "get": { "tags": [ "spreadsheet-operations", "export-columns" ], "summary": "Obter colunas do export", "description": "Retorna o catálogo de colunas fixas disponíveis para o tipo especificado.\n\nTipos suportados: `project`, `customer`, `contact`, `form_answer`, `answer_history`, `agent_execution`, `project_execution`, `user`.\n\nPara `project`/`customer`/`contact`/`user`, as chaves retornadas devem ser usadas no body de `POST /export/{type}` (campo `columns`). Para `form_answer` e `answer_history`, a lista cobre apenas colunas fixas — campos dinâmicos do formulário entram automaticamente no XLSX. Para `agent_execution` e `project_execution`, todas as colunas do catálogo são exportadas (não há seleção via `columns`).", "operationId": "obterColunasDeExportacao", "responses": { "200": { "description": "Colunas retornadas com sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "example": true }, "columns": { "type": "array", "items": { "type": "object", "properties": { "key": { "type": "string", "example": "project.id" }, "required": { "type": "boolean", "example": true }, "importable": { "type": "boolean", "example": true } } } } } }, "example": { "response": true, "columns": [ { "key": "project.id", "required": true, "importable": true }, { "key": "project.name", "required": true, "importable": true }, { "key": "project.code", "required": false, "importable": false } ] } } } }, "401": { "description": "Não autenticado" }, "403": { "description": "Sem permissão" }, "422": { "description": "Campos inválidos" } } }, "parameters": [ { "name": "type", "in": "path", "required": true, "description": "Tipo de exportação: `project`, `customer`, `contact`, `form_answer`, `answer_history`, `agent_execution`, `project_execution` ou `user`.", "schema": { "type": "string", "enum": [ "project", "customer", "contact", "form_answer", "answer_history", "agent_execution", "project_execution", "user" ] }, "example": "project" } ] }, "/api/management/spreadsheet-operations/export/{type}": { "post": { "tags": [ "spreadsheet-operations", "export" ], "summary": "Exportar planilha", "description": "Cria uma operação de export assíncrona (XLSX). O body depende do `{type}` na URL (veja os schemas abaixo).\n\nA operação fica `pending` e o arquivo fica disponível em `GET /spreadsheet-operations/{operation}/download` após `completed`.", "operationId": "exportarPlanilha", "requestBody": { "content": { "application/json": { "schema": { "title": "Exportação de Planilha", "description": "Payload de exportação. O schema correto depende do `{type}` na URL.", "oneOf": [ { "description": "Payload para `POST /export/project`.", "title": "Export Project", "type": "object", "properties": { "columns": { "type": "array", "example": [ "project.id", "project.name", "project.customer" ], "description": "Chaves das colunas (deve incluir todas as requiredKeys do catálogo em GET /export/{type}/columns).", "items": { "type": "string" } }, "dynamic_forms": { "type": "array", "example": [ { "model": "project" }, { "model": "project_funnel", "id": "019dd427-5d13-71bf-9a09-d75aa2bf4bd7" } ], "description": "Formulários dinâmicos opcionais que entram no layout e no payload de exportação.", "items": { "type": "object", "properties": { "model": { "type": "string", "enum": [ "project", "project_funnel", "funnel_step" ] }, "id": { "type": "string", "description": "Obrigatório para `project_funnel` e `funnel_step`.", "format": "uuid" } }, "required": [ "model" ] } }, "filters": { "type": "array", "description": "Busca avançada (array de filtros).", "items": { "type": "object" } } }, "required": [ "columns" ] }, { "description": "Payload para `POST /export/customer`.", "title": "Export Customer", "type": "object", "properties": { "columns": { "type": "array", "example": [ "customer.id", "customer.name" ], "description": "Chaves das colunas (deve incluir todas as requiredKeys do catálogo em GET /export/{type}/columns).", "items": { "type": "string" } }, "include_dynamic_form": { "type": "boolean", "example": true, "description": "Quando `true`, inclui o formulário dinâmico do frame no payload/colunas do export." }, "filters": { "type": "array", "description": "Busca avançada (array de filtros).", "items": { "type": "object" } } }, "required": [ "columns" ] }, { "description": "Payload para `POST /export/contact`.", "title": "Export Contact", "type": "object", "properties": { "columns": { "type": "array", "example": [ "contact.id", "contact.name" ], "description": "Chaves das colunas (deve incluir todas as requiredKeys do catálogo em GET /export/{type}/columns).", "items": { "type": "string" } }, "include_dynamic_form": { "type": "boolean", "example": true, "description": "Quando `true`, inclui o formulário dinâmico do frame no payload/colunas do export." }, "filters": { "type": "array", "description": "Busca avançada (array de filtros).", "items": { "type": "object" } } }, "required": [ "columns" ] }, { "description": "Payload para `POST /export/form_answer`. Exporta respostas do formulário; colunas dinâmicas vêm das edges do form.", "title": "Export Form Answer", "type": "object", "properties": { "form_id": { "type": "integer", "example": 18, "description": "ID do formulário (do frame atual) cujas respostas serão exportadas." } }, "required": [ "form_id" ] }, { "description": "Payload para `POST /export/answer_history`. Identifica o pivot/modelo cujo histórico de respostas será exportado.", "title": "Export Answer History", "type": "object", "properties": { "target": { "type": "object", "properties": { "pivot_class": { "type": "string", "example": "App\\Models\\Project", "description": "FQCN do modelo pivot." }, "form_id": { "type": "integer", "example": 18, "description": "ID do formulário associado ao histórico." }, "id": { "type": "string", "example": "019dd427-5d13-71bf-9a09-d75aa2bf4bd7", "description": "ID do registro pivot (quando aplicável).", "format": "uuid" }, "father_class": { "type": "string", "description": "FQCN do modelo pai, quando o pivot depende de um pai." }, "father_id": { "type": "string", "description": "Obrigatório quando `father_class` é informado.", "format": "uuid" } }, "required": [ "pivot_class", "form_id" ] } }, "required": [ "target" ] }, { "description": "Payload para `POST /export/agent_execution`. Exporta todas as colunas do catálogo. Body opcional com filtros Spatie QueryBuilder.", "title": "Export Agent Execution", "type": "object", "properties": { "filter": { "type": "object", "example": { "status": "completed" }, "description": "Filtros Spatie QueryBuilder. Campos: `agent_id`, `status`, `model`, `error`.", "properties": { "agent_id": { "type": "string", "format": "uuid" }, "status": { "type": "string", "enum": [ "pending", "completed", "failed" ], "example": "completed" }, "model": { "type": "string" }, "error": { "type": "string" } } }, "sort": { "type": "string", "example": "-created_at", "description": "Ordenação Spatie (`campo` ou `-campo`). Campos: `credits_debited`, `tokens_used`, `latency`, `created_at`." } } }, { "description": "Payload para `POST /export/project_execution`. Exporta todas as colunas do catálogo. Exige `project_id` e/ou `user_id` (ao menos um).", "title": "Export Project Execution", "type": "object", "properties": { "project_id": { "type": "string", "example": "019dd427-5d13-71bf-9a09-d75aa2bf4bd7", "description": "UUID do projeto. Obrigatório se `user_id` não for enviado. Requer permissão de view no projeto.", "format": "uuid" }, "user_id": { "type": "string", "example": "ee989a1d-afe3-4ff7-f4fb-bec440e8b372", "description": "UUID do usuário. Obrigatório se `project_id` não for enviado. Requer permissão de view no usuário.", "format": "uuid" }, "filter": { "type": "object", "example": { "is_running": false }, "description": "Filtros Spatie QueryBuilder. Campos: `user_id`, `funnel_step_id`, `start_date_gt`, `end_date_lt`, `is_running`.", "properties": { "user_id": { "type": "string", "format": "uuid" }, "funnel_step_id": { "type": "integer" }, "start_date_gt": { "type": "string", "format": "date-time" }, "end_date_lt": { "type": "string", "format": "date-time" }, "is_running": { "type": "boolean", "example": false } } }, "sort": { "type": "string", "example": "-started_at", "description": "Ordenação Spatie (`campo` ou `-campo`). Campos: `started_at`, `finished_at`." } } }, { "description": "Payload para `POST /export/user`. Exporta os usuários vinculados ao frame atual. Requer permissão `export` em usuários.", "title": "Export User", "type": "object", "properties": { "columns": { "type": "array", "example": [ "user.id", "user.name", "user.email", "user.status", "user.roles" ], "description": "Chaves das colunas (deve incluir todas as requiredKeys do catálogo em GET /export/{type}/columns: `user.id`, `user.name`, `user.email`).", "items": { "type": "string" } }, "filters": { "type": "array", "description": "Filtros avançados (mesmo formato do `POST /users/search`). Campos disponíveis: `id` (`equals`), `status` (`equals`, `not_equals`; valores: 1 = aguardando resposta, 2 = ativo, 3 = inativo) e `search` (`contains`, aplica LIKE em nome e e-mail).", "items": { "type": "object", "properties": { "field": { "type": "string", "enum": [ "id", "status", "search" ], "example": "status" }, "operator": { "type": "string", "enum": [ "equals", "not_equals", "contains" ], "example": "equals" }, "logical_operator": { "type": "string", "enum": [ "and", "or" ], "example": "and" } }, "required": [ "field", "operator" ] } } }, "required": [ "columns" ] } ] }, "example": { "columns": [ "project.id", "project.name", "project.customer" ], "dynamic_forms": [ { "model": "project" }, { "model": "project_funnel" } ] } } }, "required": true }, "responses": { "200": { "description": "Operação de export criada com sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "example": true }, "spreadsheet_operation": { "type": "object", "properties": { "id": { "type": "string", "format": "uuid" }, "action": { "type": "string", "example": "export" }, "type": { "type": "string", "example": "project" }, "status": { "type": "string", "example": "completed" }, "total_rows": { "type": "integer", "example": 120 }, "processed_rows": { "type": "integer", "example": 120 }, "percentage": { "type": "integer", "example": 100 }, "errors_count": { "type": "integer", "example": 0 }, "metadata": { "type": "object" }, "file_name": { "type": "string", "example": "project_2026-06-01-143022.xlsx" }, "initiator_type": { "type": "string", "example": "App\\Models\\User" }, "initiator_id": { "type": "string", "format": "uuid" }, "initiator": { "type": "object", "properties": { "id": { "type": "string", "format": "uuid" }, "name": { "type": "string" }, "avatar_url": { "type": "string" } } }, "started_at": { "type": "string", "format": "date-time" }, "completed_at": { "type": "string", "format": "date-time" }, "created_at": { "type": "string", "format": "date-time" }, "updated_at": { "type": "string", "format": "date-time" } } } } }, "example": { "response": true, "spreadsheet_operation": { "id": "c8f6c4a2-31af-f523-ad00-47b2ce67491e", "action": "export", "type": "project", "status": "completed", "total_rows": 120, "processed_rows": 120, "percentage": 100, "errors_count": 0, "metadata": {}, "file_name": "project_2026-06-01-143022.xlsx", "initiator_type": "App\\Models\\User", "initiator_id": "ee989a1d-afe3-4ff7-f4fb-bec440e8b372", "initiator": { "id": "7b6c3328-3066-e4e3-ae36-911996a826da", "name": "string", "avatar_url": "string" }, "started_at": "2026-04-23T17:57:57.942Z", "completed_at": "1980-11-02T01:58:58.018Z", "created_at": "1950-02-26T12:34:00.424Z", "updated_at": "1955-03-13T19:55:56.035Z" } } } } }, "401": { "description": "Não autenticado" }, "403": { "description": "Sem permissão" }, "422": { "description": "Campos inválidos" } } }, "parameters": [ { "name": "type", "in": "path", "required": true, "description": "Tipo de exportação: `project`, `customer`, `contact`, `form_answer`, `answer_history`, `agent_execution`, `project_execution` ou `user`.", "schema": { "type": "string", "enum": [ "project", "customer", "contact", "form_answer", "answer_history", "agent_execution", "project_execution", "user" ] }, "example": "project" } ] }, "/api/management/spreadsheet-operations/{operation}": { "get": { "tags": [ "spreadsheet-operations", "show" ], "summary": "Detalhar operação", "description": "Retorna os detalhes da operação de import/export especificada.", "operationId": "obterOperacaoDePlanilha", "responses": { "200": { "description": "Operação retornada com sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "example": true }, "spreadsheet_operation": { "type": "object", "properties": { "id": { "type": "string", "format": "uuid" }, "action": { "type": "string", "example": "export" }, "type": { "type": "string", "example": "project" }, "status": { "type": "string", "example": "completed" }, "total_rows": { "type": "integer", "example": 120 }, "processed_rows": { "type": "integer", "example": 120 }, "percentage": { "type": "integer", "example": 100 }, "errors_count": { "type": "integer", "example": 0 }, "metadata": { "type": "object" }, "file_name": { "type": "string", "example": "project_2026-06-01-143022.xlsx" }, "initiator_type": { "type": "string", "example": "App\\Models\\User" }, "initiator_id": { "type": "string", "format": "uuid" }, "initiator": { "type": "object", "properties": { "id": { "type": "string", "format": "uuid" }, "name": { "type": "string" }, "avatar_url": { "type": "string" } } }, "started_at": { "type": "string", "format": "date-time" }, "completed_at": { "type": "string", "format": "date-time" }, "created_at": { "type": "string", "format": "date-time" }, "updated_at": { "type": "string", "format": "date-time" } } } } }, "example": { "response": true, "spreadsheet_operation": { "id": "c8f6c4a2-31af-f523-ad00-47b2ce67491e", "action": "export", "type": "project", "status": "completed", "total_rows": 120, "processed_rows": 120, "percentage": 100, "errors_count": 0, "metadata": {}, "file_name": "project_2026-06-01-143022.xlsx", "initiator_type": "App\\Models\\User", "initiator_id": "ee989a1d-afe3-4ff7-f4fb-bec440e8b372", "initiator": { "id": "7b6c3328-3066-e4e3-ae36-911996a826da", "name": "string", "avatar_url": "string" }, "started_at": "2026-04-23T17:57:57.942Z", "completed_at": "1980-11-02T01:58:58.018Z", "created_at": "1950-02-26T12:34:00.424Z", "updated_at": "1955-03-13T19:55:56.035Z" } } } } }, "401": { "description": "Não autenticado" }, "403": { "description": "Sem permissão" }, "404": { "description": "Não encontrado" } } }, "parameters": [ { "name": "operation", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" }, "example": "019dd427-5d13-71bf-9a09-d75aa2bf4bd7" } ] }, "/api/management/spreadsheet-operations/{operation}/errors": { "get": { "tags": [ "spreadsheet-operations", "errors" ], "summary": "Listar erros da operação", "description": "Lista erros por linha/coluna da operação de import.", "operationId": "listarErrosDaOperacaoDePlanilha", "responses": { "200": { "description": "Lista de erros retornada com sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean", "example": true }, "meta": { "type": "object", "properties": { "current_page": { "type": "integer", "example": 1 }, "from": { "type": "integer", "example": 1 }, "last_page": { "type": "integer", "example": 1 }, "per_page": { "type": "integer", "example": 30 }, "to": { "type": "integer", "example": 30 }, "total": { "type": "integer", "example": 4 } } }, "spreadsheet_operation_errors": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "format": "uuid" }, "row": { "type": "integer", "example": 5 }, "column_key": { "type": "string" }, "column_label": { "type": "string" }, "message": { "type": "string" }, "context": { "type": "object" }, "created_at": { "type": "string", "format": "date-time" } } } } } }, "example": { "response": true, "meta": { "current_page": 1, "from": 1, "last_page": 1, "per_page": 30, "to": 4, "total": 4 }, "spreadsheet_operation_errors": [ { "id": "019c75de-50f0-7366-a948-b8cbdd1841be", "row": 5, "column_key": "project.name", "column_label": "Nome", "message": "The name field is required.", "context": null, "created_at": "2026-06-01T14:31:10.000000Z" } ] } } } }, "401": { "description": "Não autenticado" }, "403": { "description": "Sem permissão" }, "404": { "description": "Não encontrado" } } }, "parameters": [ { "name": "operation", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" }, "example": "019dd427-5d13-71bf-9a09-d75aa2bf4bd7" } ] }, "/api/management/spreadsheet-operations/{operation}/download": { "get": { "tags": [ "spreadsheet-operations", "download" ], "summary": "Baixar resultado da operação", "description": "Baixa o arquivo gerado da operação (somente para operações de `export` concluídas com sucesso).", "operationId": "baixarResultadoDaOperacaoDePlanilha", "responses": { "200": { "description": "Arquivo baixado com sucesso" }, "401": { "description": "Não autenticado" }, "403": { "description": "Sem permissão" }, "404": { "description": "Não encontrado" } } }, "parameters": [ { "name": "operation", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" }, "example": "019dd427-5d13-71bf-9a09-d75aa2bf4bd7" } ] }, "/api/management/channels": { "get": { "summary": "Listar canais", "parameters": [ { "name": "project_id", "in": "query", "description": "Filtra os canais por projeto (UUID).", "schema": { "type": "string" }, "example": "" }, { "name": "page", "in": "query", "description": "Número da página a ser retornada. Começa em 1.", "schema": { "type": "integer" }, "example": 1 }, { "name": "perPage", "in": "query", "description": "Quantidade de itens exibidos por página.", "schema": { "type": "integer" }, "example": 30 } ], "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "meta": { "type": "object", "properties": { "current_page": { "type": "integer" }, "from": { "type": "integer" }, "to": { "type": "integer" }, "last_page": { "type": "integer" }, "per_page": { "type": "integer" }, "total": { "type": "integer" } } }, "channels": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "name": { "type": "string" }, "audience": { "type": "string" }, "connector_type": { "type": "string" }, "external_ref": { "type": "string" }, "is_active": { "type": "boolean" }, "project_id": { "type": "string" }, "frame_id": { "type": "string" }, "created_at": { "type": "string", "format": "date-time" }, "updated_at": { "type": "string", "format": "date-time" } } } } } }, "example": { "response": true, "meta": { "current_page": 1, "from": 1, "to": 2, "last_page": 1, "per_page": 30, "total": 2 }, "channels": [ { "id": "9b2a1c3e-4d5f-6789-abcd-ef0123456789", "name": "WhatsApp João", "audience": "client", "connector_type": "fake", "external_ref": "wpp-5511999999999", "is_active": true, "project_id": "8a1f2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c", "frame_id": "7c0e1d2f-3a4b-5c6d-7e8f-9a0b1c2d3e4f", "created_at": "2026-06-18T12:00:00.000000Z", "updated_at": "2026-06-18T12:00:00.000000Z" }, { "id": "1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d", "name": "Canal interno", "audience": "internal", "connector_type": null, "external_ref": null, "is_active": true, "project_id": "8a1f2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c", "frame_id": "7c0e1d2f-3a4b-5c6d-7e8f-9a0b1c2d3e4f", "created_at": "2026-06-18T11:00:00.000000Z", "updated_at": "2026-06-18T11:30:00.000000Z" } ] } } } }, "401": { "description": "Não autorizado", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "message": { "type": "string" }, "error": { "type": "string" } } }, "example": { "response": false, "message": "unauthenticated", "error": "Unauthenticated." } } } } }, "tags": [ "channels" ], "description": "Lista os canais do frame, com paginação. Use o filtro `project_id` para restringir os canais de um projeto específico." }, "post": { "summary": "Criar canal", "responses": { "201": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "channel": { "type": "object", "properties": { "id": { "type": "string" }, "name": { "type": "string" }, "audience": { "type": "string" }, "connector_type": { "type": "string" }, "external_ref": { "type": "string" }, "is_active": { "type": "boolean" }, "project_id": { "type": "string" }, "frame_id": { "type": "string" }, "created_at": { "type": "string", "format": "date-time" }, "updated_at": { "type": "string", "format": "date-time" } } } } }, "example": { "response": true, "channel": { "id": "9b2a1c3e-4d5f-6789-abcd-ef0123456789", "name": "WhatsApp João", "audience": "client", "connector_type": "fake", "external_ref": "wpp-5511999999999", "is_active": true, "project_id": "8a1f2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c", "frame_id": "7c0e1d2f-3a4b-5c6d-7e8f-9a0b1c2d3e4f", "created_at": "2026-06-18T12:00:00.000000Z", "updated_at": "2026-06-18T12:00:00.000000Z" } } } } }, "422": { "description": "Erro de validação", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "message": { "type": "string" }, "error": { "type": "string" }, "validation": { "type": "object", "properties": { "project_id": { "type": "array", "items": { "type": "string" } }, "name": { "type": "array", "items": { "type": "string" } } } } } }, "example": { "response": false, "message": "validation_errors", "error": "The given data was invalid.", "validation": { "project_id": [ "O campo project id é obrigatório." ], "name": [ "O campo name é obrigatório." ] } } } } } }, "tags": [ "channels" ], "description": "Cria um novo canal em um projeto. O canal nasce restrito à equipe (audiência interna) por padrão; defina `audience` como `client` para um canal visível ao cliente. Um `connector_type` opcional liga o canal a um conector externo.", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "name": { "type": "string", "description": "Teste do schema para criar canal" } } }, "example": { "name": "teste-nome-canal" } } } } } }, "/api/management/channels/{channel}": { "put": { "summary": "Atualizar canal", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "channel": { "type": "object", "properties": { "id": { "type": "string" }, "name": { "type": "string" }, "audience": { "type": "string" }, "connector_type": { "type": "string" }, "external_ref": { "type": "string" }, "is_active": { "type": "boolean" }, "project_id": { "type": "string" }, "frame_id": { "type": "string" }, "created_at": { "type": "string", "format": "date-time" }, "updated_at": { "type": "string", "format": "date-time" } } } } }, "example": { "response": true, "channel": { "id": "9b2a1c3e-4d5f-6789-abcd-ef0123456789", "name": "WhatsApp João (atualizado)", "audience": "client", "connector_type": "fake", "external_ref": "wpp-5511999999999", "is_active": true, "project_id": "8a1f2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c", "frame_id": "7c0e1d2f-3a4b-5c6d-7e8f-9a0b1c2d3e4f", "created_at": "2026-06-18T12:00:00.000000Z", "updated_at": "2026-06-18T15:30:00.000000Z" } } } } }, "404": { "description": "Não encontrado", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "message": { "type": "string" }, "error": { "type": "string" } } }, "example": { "response": false, "message": "channel_model_not_found", "error": "No query results for model [Channel]." } } } } }, "tags": [ "channels" ], "description": "Atualiza um canal. Todos os campos do body são opcionais — envie apenas o que deve mudar. O projeto do canal não pode ser alterado.", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "name": { "type": "string" }, "audience": { "type": "string" }, "is_active": { "type": "boolean" } } }, "example": { "name": "", "audience": "internal", "connector_type": null, "connector_config": null, "external_ref": null, "is_active": true } } } } }, "parameters": [ { "name": "channel", "in": "path", "required": true, "schema": { "type": "string" }, "example": "" } ], "delete": { "summary": "Remover canal", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" } } }, "example": { "response": true } } } }, "404": { "description": "Não encontrado", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "message": { "type": "string" }, "error": { "type": "string" } } }, "example": { "response": false, "message": "channel_model_not_found", "error": "No query results for model [Channel]." } } } } }, "tags": [ "channels" ], "description": "Remove um canal (exclusão lógica). As medias do canal voltam para o canal principal do projeto — não são apagadas." } }, "/api/management/channels/inbound/{external_ref}": { "post": { "summary": "Webhook de entrada do conector", "responses": { "200": { "description": "Sucesso", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" } } }, "example": { "response": true } } } }, "404": { "description": "Não encontrado", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "message": { "type": "string" }, "error": { "type": "string" } } }, "example": { "response": false, "message": "channel_model_not_found", "error": "No query results for model [Channel]." } } } } }, "tags": [ "channels" ], "description": "Webhook público de entrada de um conector externo. Resolve o canal pelo identificador externo e registra a mensagem recebida como uma media de entrada no canal. Não usa autenticação de usuário.", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "message": { "type": "string" } } }, "example": { "message": "" } } } } }, "parameters": [ { "name": "external_ref", "in": "path", "required": true, "description": "Identificador externo do canal (resolve o webhook de entrada).", "schema": { "type": "string" }, "example": "" } ] }, "/api/management/integrations": { "post": { "summary": "Create integration (WhatsApp Meta Cloud)", "responses": { "200": { "description": "200" } }, "tags": [ "integrations" ], "security": [ { "BearerAuth": [] } ], "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "type": { "type": "string" }, "external_ref": { "type": "string" }, "config": { "type": "object" }, "credentials": { "type": "object", "properties": { "phone_number_id": { "type": "string" }, "access_token": { "type": "string" }, "app_secret": { "type": "string" }, "verify_token": { "type": "string" } } }, "is_active": { "type": "boolean" } } }, "example": { "type": "whatsapp_cloud", "external_ref": "5517999990000", "config": {}, "credentials": { "phone_number_id": "123456789012345", "access_token": "EAAG-exemplo-token", "app_secret": "meu-app-secret", "verify_token": "meu-verify-token" }, "is_active": true } } } } }, "get": { "summary": "List integrations", "responses": { "200": { "description": "200" } }, "tags": [ "integrations" ], "security": [ { "BearerAuth": [] } ] } }, "/api/management/integrations/{integration_id}": { "put": { "summary": "Update integration", "responses": { "200": { "description": "200" } }, "tags": [ "integrations" ], "security": [ { "BearerAuth": [] } ], "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "external_ref": { "type": "string" }, "is_active": { "type": "boolean" } } }, "example": { "external_ref": "5517988887777", "is_active": false } } } } }, "parameters": [ { "name": "integration_id", "in": "path", "required": true, "schema": { "type": "string" }, "example": "{{integration_id}}" } ], "delete": { "summary": "Delete integration", "responses": { "200": { "description": "200" } }, "tags": [ "integrations" ], "security": [ { "BearerAuth": [] } ] } }, "/api/management/answers-history/export": { "post": { "summary": "Exportar histórico de respostas de formulário", "responses": { "200": { "description": "200" } }, "tags": [ "answers-history", "export" ], "description": "Exportar histórico de respostas de formulário para um arquivo excel." } }, "/api/management/projects/{project}/conversation/resolve": { "post": { "summary": "Resolver a conversa do projeto", "responses": { "200": { "description": "Sucesso — conversa silenciada", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "channel_state": { "type": "object", "properties": { "status": { "type": "string" }, "since": { "type": "string", "format": "date-time" } } } } }, "examples": { "Sucesso — conversa silenciada": { "value": { "response": true, "channel_state": { "status": "resolved", "since": "2026-08-24T20:30:00.000000Z" } } }, "Sucesso — projeto sem nenhuma conversa": { "value": { "response": true, "channel_state": null } } } } } }, "401": { "description": "Não autorizado", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "message": { "type": "string" }, "error": { "type": "string" } } }, "example": { "response": false, "message": "unauthorized", "error": "Unauthenticated." } } } }, "403": { "description": "Sem permissão", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "message": { "type": "string" }, "error": { "type": "string" }, "permission": { "type": "string" } } }, "example": { "response": false, "message": "permission_required", "error": "This action is unauthorized.", "permission": "projects.edit.9c2f1a44-3b2e-4a0f-9b7a-1c4c5f7e8d90" } } } }, "404": { "description": "Projeto não encontrado", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "message": { "type": "string" }, "error": { "type": "string" } } }, "example": { "response": false, "message": "project_model_not_found", "error": "No query results for model [App\\Models\\Project] 9c2f1a44-3b2e-4a0f-9b7a-1c4c5f7e8d90" } } } } }, "tags": [ "projects", "Conversas" ], "description": "Silencia as conversas do projeto que estão aguardando resposta e apaga o indicador de \"aguardando resposta\" do cartão no quadro. A marca vale só até o cliente escrever de novo: a mensagem nova ultrapassa a resolução e o indicador volta sozinho. Responde com o estado resultante da conversa, para o cartão ser atualizado sem recarregar a etapa." }, "parameters": [ { "name": "project", "in": "path", "required": true, "description": "ID (UUID) do projeto cujas conversas serão silenciadas.", "schema": { "type": "string" }, "example": "{{project_id}}" } ] }, "/api/management/projects/{project}/conversation/reopen": { "post": { "summary": "Reabrir a conversa do projeto", "responses": { "200": { "description": "Sucesso — espera restaurada", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "channel_state": { "type": "object", "properties": { "status": { "type": "string" }, "since": { "type": "string", "format": "date-time" } } } } }, "examples": { "Sucesso — espera restaurada": { "value": { "response": true, "channel_state": { "status": "awaiting_reply", "since": "2026-08-22T13:05:41.000000Z" } } }, "Sucesso — projeto sem nenhuma conversa": { "value": { "response": true, "channel_state": null } } } } } }, "401": { "description": "Não autorizado", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "message": { "type": "string" }, "error": { "type": "string" } } }, "example": { "response": false, "message": "unauthorized", "error": "Unauthenticated." } } } }, "403": { "description": "Sem permissão", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "message": { "type": "string" }, "error": { "type": "string" }, "permission": { "type": "string" } } }, "example": { "response": false, "message": "permission_required", "error": "This action is unauthorized.", "permission": "projects.edit.9c2f1a44-3b2e-4a0f-9b7a-1c4c5f7e8d90" } } } }, "404": { "description": "Projeto não encontrado", "content": { "application/json": { "schema": { "type": "object", "properties": { "response": { "type": "boolean" }, "message": { "type": "string" }, "error": { "type": "string" } } }, "example": { "response": false, "message": "project_model_not_found", "error": "No query results for model [App\\Models\\Project] 9c2f1a44-3b2e-4a0f-9b7a-1c4c5f7e8d90" } } } } }, "tags": [ "projects", "Conversas" ], "description": "Desfaz a resolução das conversas do projeto, para quem silenciou o cartão errado. O cartão volta com o tempo de espera que sempre teve, e não com uma espera reiniciada no clique. Responde com o estado resultante da conversa, para o cartão ser atualizado sem recarregar a etapa." }, "parameters": [ { "name": "project", "in": "path", "required": true, "description": "ID (UUID) do projeto cuja resolução será desfeita.", "schema": { "type": "string" }, "example": "{{project_id}}" } ] } }, "components": { "securitySchemes": { "BearerAuth": { "type": "http", "scheme": "bearer" } } }, "security": [ { "BearerAuth": [] } ] }