{"openapi":"3.1.0","info":{"title":"Loop API","version":"1.0.0","description":"Loop é uma plataforma de documentação viva de produtos (Laboratório de Orquestração e Otimização de Produtos). Cada projeto tem requisitos (user stories com critérios de aceitação e casos de teste), decisões (com histórico da discussão), documentos em seções (arquitetura, design, estudos), um CRM opcional e comentários do time.\n\nFluxo recomendado: 1) list_projects para achar o slug; 2) get_project_overview e leia o ai_guide (regras do projeto); 3) list_comments com status=pending: são os pedidos do time; 4) trate cada pedido editando requisitos, decisões ou seções; 5) registre o porquê no histórico da decisão (add_decision_log) e marque os comentários como revisados (mark_comments_reviewed) com uma resposta curta. Use search antes de criar para não duplicar. Links internos em textos: loop:req/CÓDIGO, loop:dec/CÓDIGO, loop:doc/slug#ancora."},"servers":[{"url":"https://loop.franssa.com/api/v1"}],"paths":{"/list_projects":{"post":{"operationId":"list_projects","summary":"Lista os projetos que você pode acessar, com seu papel em cada um. Comece por aqui para descobrir o slug do projeto.","description":"Lista os projetos que você pode acessar, com seu papel em cada um. Comece por aqui para descobrir o slug do projeto.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"description":"Erro: {\"error\": \"mensagem\"}"}}}},"/get_project_overview":{"post":{"operationId":"get_project_overview","summary":"Visão geral do projeto: descrição, guia para a IA (regras do processo e convenções — leia antes de editar), versões, per","description":"Visão geral do projeto: descrição, guia para a IA (regras do processo e convenções — leia antes de editar), versões, perfis, categorias, contagens, comentários pendentes, decisões em aberto e documentos.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"string","description":"Slug do projeto (veja list_projects). Opcional quando a chave de API é de um projeto só."}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"description":"Erro: {\"error\": \"mensagem\"}"}}}},"/update_project":{"post":{"operationId":"update_project","summary":"Atualiza dados do projeto: descrição, guia para a IA (ai_guide) e configurações (settings: versions, personas, categorie","description":"Atualiza dados do projeto: descrição, guia para a IA (ai_guide) e configurações (settings: versions, personas, categories, importance, crm, impl). Settings é mesclado por chave de primeiro nível; envie a lista inteira da chave que mudar.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"string","description":"Slug do projeto (veja list_projects). Opcional quando a chave de API é de um projeto só."},"name":{"type":"string","description":"Novo nome (só o dono)"},"description":{"type":"string","description":"Descrição curta"},"ai_guide":{"type":"string","description":"Guia/regras para a IA neste projeto"},"settings":{"type":"object","description":"Chaves de configuração a substituir"},"public_read":{"type":"boolean","description":"Leitura pública por link (só o dono)"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"description":"Erro: {\"error\": \"mensagem\"}"}}}},"/list_requirements":{"post":{"operationId":"list_requirements","summary":"Lista requisitos (user stories) com filtros. Por padrão devolve um resumo de cada um; use full=true para trazer história","description":"Lista requisitos (user stories) com filtros. Por padrão devolve um resumo de cada um; use full=true para trazer história, critérios e testes.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"string","description":"Slug do projeto (veja list_projects). Opcional quando a chave de API é de um projeto só."},"version":{"type":"string","description":"Id da versão"},"category":{"type":"string","description":"Sigla da categoria"},"persona":{"type":"string","description":"Chave do perfil"},"review":{"type":"string","description":"approved | revise | pending","enum":["approved","revise","pending"]},"impl":{"type":"string","description":"done | partial | todo"},"decision":{"type":"string","description":"Só os que citam esta decisão"},"q":{"type":"string","description":"Busca por texto"},"full":{"type":"boolean","description":"Trazer todos os campos"},"include_archived":{"type":"boolean","description":"Incluir arquivados"},"limit":{"type":"integer","description":"Máximo (padrão 200)"},"offset":{"type":"integer","description":"Pular N"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"description":"Erro: {\"error\": \"mensagem\"}"}}}},"/get_requirement":{"post":{"operationId":"get_requirement","summary":"Requisito completo: história, critérios, testes, implementação, avaliação, decisões relacionadas (com título e status) e","description":"Requisito completo: história, critérios, testes, implementação, avaliação, decisões relacionadas (com título e status) e comentários.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"string","description":"Slug do projeto (veja list_projects). Opcional quando a chave de API é de um projeto só."},"code":{"type":"string","description":"Código do requisito, ex.: CON-01"}},"required":["code"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"description":"Erro: {\"error\": \"mensagem\"}"}}}},"/create_requirement":{"post":{"operationId":"create_requirement","summary":"Cria um requisito (user story). O código é gerado como <categoria>-NN se não for informado. Procure antes (search) para ","description":"Cria um requisito (user story). O código é gerado como <categoria>-NN se não for informado. Procure antes (search) para não duplicar.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"string","description":"Slug do projeto (veja list_projects). Opcional quando a chave de API é de um projeto só."},"code":{"type":"string","description":"Código fixo (opcional; gerado automaticamente)"},"title":{"type":"string","description":"Título curto"},"story":{"type":"string","description":"O que a pessoa quer e para quê, SEM \"Como <perfil>, eu preciso\" (o sistema monta a frase). Ex.: \"recuperar o acesso pelo e-mail, para não perder meus dados\""},"category":{"type":"string","description":"Sigla do épico/categoria (ex.: CON). Categorias novas são criadas automaticamente."},"category_name":{"type":"string","description":"Nome da categoria, se for nova"},"version":{"type":"string","description":"Id da versão/coluna (veja settings.versions)"},"personas":{"type":"array","items":{"type":"string"},"description":"Chaves dos perfis; o primeiro é quem \"fala\" na história"},"importance":{"type":"integer","description":"1 = eu preciso (alta), 2 = eu gostaria de (média), 3 = eu posso querer (baixa)","enum":[1,2,3]},"acceptance":{"type":"array","items":{"type":"string"},"description":"Critérios de aceitação verificáveis"},"tests":{"type":"array","items":{"type":"string"},"description":"Casos de teste no formato \"ação → resultado esperado\""},"decisions":{"type":"array","items":{"type":"string"},"description":"Códigos das decisões relacionadas (ex.: D3)"},"tags":{"type":"array","items":{"type":"string"},"description":"Etiquetas livres"}},"required":["title","category"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"description":"Erro: {\"error\": \"mensagem\"}"}}}},"/update_requirement":{"post":{"operationId":"update_requirement","summary":"Altera campos de um requisito (só os enviados). Mudar o conteúdo faz a avaliação voltar a \"pendente\" para o time reavali","description":"Altera campos de um requisito (só os enviados). Mudar o conteúdo faz a avaliação voltar a \"pendente\" para o time reavaliar. Para mover de versão, envie version.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"string","description":"Slug do projeto (veja list_projects). Opcional quando a chave de API é de um projeto só."},"code":{"type":"string","description":"Código atual"},"new_code":{"type":"string","description":"Novo código (evite: o código deveria ser fixo)"},"archived":{"type":"boolean","description":"Arquivar/desarquivar"},"position":{"type":"integer","description":"Ordem no quadro"},"title":{"type":"string","description":"Título curto"},"story":{"type":"string","description":"O que a pessoa quer e para quê, SEM \"Como <perfil>, eu preciso\" (o sistema monta a frase). Ex.: \"recuperar o acesso pelo e-mail, para não perder meus dados\""},"category":{"type":"string","description":"Sigla do épico/categoria (ex.: CON). Categorias novas são criadas automaticamente."},"category_name":{"type":"string","description":"Nome da categoria, se for nova"},"version":{"type":"string","description":"Id da versão/coluna (veja settings.versions)"},"personas":{"type":"array","items":{"type":"string"},"description":"Chaves dos perfis; o primeiro é quem \"fala\" na história"},"importance":{"type":"integer","description":"1 = eu preciso (alta), 2 = eu gostaria de (média), 3 = eu posso querer (baixa)","enum":[1,2,3]},"acceptance":{"type":"array","items":{"type":"string"},"description":"Critérios de aceitação verificáveis"},"tests":{"type":"array","items":{"type":"string"},"description":"Casos de teste no formato \"ação → resultado esperado\""},"decisions":{"type":"array","items":{"type":"string"},"description":"Códigos das decisões relacionadas (ex.: D3)"},"tags":{"type":"array","items":{"type":"string"},"description":"Etiquetas livres"}},"required":["code"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"description":"Erro: {\"error\": \"mensagem\"}"}}}},"/set_implementation":{"post":{"operationId":"set_implementation","summary":"Registra a situação de implementação de um requisito: done (todos os critérios no código), partial ou todo, com nota do ","description":"Registra a situação de implementação de um requisito: done (todos os critérios no código), partial ou todo, com nota do que falta, commit e deploy.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"string","description":"Slug do projeto (veja list_projects). Opcional quando a chave de API é de um projeto só."},"code":{"type":"string","description":"Código do requisito"},"status":{"type":"string","description":"done | partial | todo","enum":["done","partial","todo"]},"note":{"type":"string","description":"O que falta ou observação"},"commit":{"type":"string","description":"Commit em que entrou"},"deploy":{"type":"string","description":"Id do deploy em que foi entregue por inteiro"},"tests_ok":{"type":"object","description":"Casos de teste cobertos por teste automático: {\"<índice começando em 1>\": \"nome do teste\"}"}},"required":["code","status"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"description":"Erro: {\"error\": \"mensagem\"}"}}}},"/list_decisions":{"post":{"operationId":"list_decisions","summary":"Lista as decisões do projeto (código, título, status, requisitos impactados, comentários). full=true traz situação, pont","description":"Lista as decisões do projeto (código, título, status, requisitos impactados, comentários). full=true traz situação, pontos e histórico.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"string","description":"Slug do projeto (veja list_projects). Opcional quando a chave de API é de um projeto só."},"status":{"type":"string","description":"open | partial | done | reopened"},"q":{"type":"string","description":"Busca por texto"},"full":{"type":"boolean","description":"Trazer todos os campos"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"description":"Erro: {\"error\": \"mensagem\"}"}}}},"/get_decision":{"post":{"operationId":"get_decision","summary":"Decisão completa: situação atual, pontos, histórico da discussão, documentos ligados, requisitos impactados e comentário","description":"Decisão completa: situação atual, pontos, histórico da discussão, documentos ligados, requisitos impactados e comentários.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"string","description":"Slug do projeto (veja list_projects). Opcional quando a chave de API é de um projeto só."},"code":{"type":"string","description":"Código, ex.: D3"}},"required":["code"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"description":"Erro: {\"error\": \"mensagem\"}"}}}},"/create_decision":{"post":{"operationId":"create_decision","summary":"Abre uma decisão nova (código Dn gerado se não informado). Use log_text para registrar a primeira entrada do histórico (","description":"Abre uma decisão nova (código Dn gerado se não informado). Use log_text para registrar a primeira entrada do histórico (a proposta e o porquê).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"string","description":"Slug do projeto (veja list_projects). Opcional quando a chave de API é de um projeto só."},"code":{"type":"string","description":"Código (opcional)"},"log_text":{"type":"string","description":"Primeira entrada do histórico"},"title":{"type":"string","description":"Título"},"status":{"type":"string","description":"open | partial | done","enum":["open","partial","done"]},"context":{"type":"string","description":"Situação atual: o que está decidido ou em discussão (HTML simples ou texto)"},"points":{"type":"array","items":{"type":"string"},"description":"Pontos/itens da decisão (HTML simples permitido: <b>, <a href=\"loop:req/X\">)"},"links":{"type":"array","description":"Onde a decisão aparece na documentação","items":{"type":"object","properties":{"doc":{"type":"string"},"anchor":{"type":"string"},"label":{"type":"string"}}}}},"required":["title"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"description":"Erro: {\"error\": \"mensagem\"}"}}}},"/update_decision":{"post":{"operationId":"update_decision","summary":"Altera campos de uma decisão (só os enviados). Ao mudar status ou contexto, registre o motivo com log_text (vira entrada","description":"Altera campos de uma decisão (só os enviados). Ao mudar status ou contexto, registre o motivo com log_text (vira entrada no histórico).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"string","description":"Slug do projeto (veja list_projects). Opcional quando a chave de API é de um projeto só."},"code":{"type":"string","description":"Código"},"log_text":{"type":"string","description":"Entrada a acrescentar no histórico"},"position":{"type":"integer","description":"Ordem"},"title":{"type":"string","description":"Título"},"status":{"type":"string","description":"open | partial | done","enum":["open","partial","done"]},"context":{"type":"string","description":"Situação atual: o que está decidido ou em discussão (HTML simples ou texto)"},"points":{"type":"array","items":{"type":"string"},"description":"Pontos/itens da decisão (HTML simples permitido: <b>, <a href=\"loop:req/X\">)"},"links":{"type":"array","description":"Onde a decisão aparece na documentação","items":{"type":"object","properties":{"doc":{"type":"string"},"anchor":{"type":"string"},"label":{"type":"string"}}}}},"required":["code"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"description":"Erro: {\"error\": \"mensagem\"}"}}}},"/add_decision_log":{"post":{"operationId":"add_decision_log","summary":"Acrescenta uma entrada no histórico de uma decisão (proposta, resposta, conclusão). O autor é o nome do agente da chave.","description":"Acrescenta uma entrada no histórico de uma decisão (proposta, resposta, conclusão). O autor é o nome do agente da chave.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"string","description":"Slug do projeto (veja list_projects). Opcional quando a chave de API é de um projeto só."},"code":{"type":"string","description":"Código da decisão"},"text":{"type":"string","description":"O que foi proposto, decidido ou mudou, e por quê"}},"required":["code","text"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"description":"Erro: {\"error\": \"mensagem\"}"}}}},"/list_documents":{"post":{"operationId":"list_documents","summary":"Lista os documentos (arquitetura, design, estudos...) com o índice de seções de cada um, sem o conteúdo.","description":"Lista os documentos (arquitetura, design, estudos...) com o índice de seções de cada um, sem o conteúdo.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"string","description":"Slug do projeto (veja list_projects). Opcional quando a chave de API é de um projeto só."}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"description":"Erro: {\"error\": \"mensagem\"}"}}}},"/get_document":{"post":{"operationId":"get_document","summary":"Documento com todas as seções e conteúdo. Para documentos grandes, prefira sections=[âncoras] ou get_section.","description":"Documento com todas as seções e conteúdo. Para documentos grandes, prefira sections=[âncoras] ou get_section.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"string","description":"Slug do projeto (veja list_projects). Opcional quando a chave de API é de um projeto só."},"slug":{"type":"string","description":"Slug do documento"},"sections":{"type":"array","items":{"type":"string"},"description":"Só estas seções (âncoras)"},"theme":{"type":"boolean","description":"Incluir head/css/js do documento"}},"required":["slug"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"description":"Erro: {\"error\": \"mensagem\"}"}}}},"/get_section":{"post":{"operationId":"get_section","summary":"Uma seção de um documento, com o conteúdo (Markdown ou HTML).","description":"Uma seção de um documento, com o conteúdo (Markdown ou HTML).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"string","description":"Slug do projeto (veja list_projects). Opcional quando a chave de API é de um projeto só."},"slug":{"type":"string","description":"Slug do documento"},"anchor":{"type":"string","description":"Âncora da seção"}},"required":["slug","anchor"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"description":"Erro: {\"error\": \"mensagem\"}"}}}},"/create_document":{"post":{"operationId":"create_document","summary":"Cria um documento novo, opcionalmente já com seções em Markdown.","description":"Cria um documento novo, opcionalmente já com seções em Markdown.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"string","description":"Slug do projeto (veja list_projects). Opcional quando a chave de API é de um projeto só."},"slug":{"type":"string","description":"Slug (gerado do título se vazio)"},"title":{"type":"string","description":"Título"},"menu":{"type":"string","description":"Rótulo curto no menu"},"eyebrow":{"type":"string","description":"Linha pequena acima do título"},"intro":{"type":"string","description":"Introdução (Markdown)"},"sections":{"type":"array","description":"Seções iniciais","items":{"type":"object","properties":{"title":{"type":"string"},"content":{"type":"string"},"anchor":{"type":"string"},"number":{"type":"string"},"format":{"type":"string"},"group":{"type":"string"}}}}},"required":["title"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"description":"Erro: {\"error\": \"mensagem\"}"}}}},"/update_document":{"post":{"operationId":"update_document","summary":"Altera título, rótulo do menu, linha de cima, introdução ou ordem de um documento. head/css/js mudam o tema visual (avan","description":"Altera título, rótulo do menu, linha de cima, introdução ou ordem de um documento. head/css/js mudam o tema visual (avançado).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"string","description":"Slug do projeto (veja list_projects). Opcional quando a chave de API é de um projeto só."},"slug":{"type":"string","description":"Slug"},"title":{"type":"string"},"menu":{"type":"string"},"eyebrow":{"type":"string"},"intro":{"type":"string"},"intro_format":{"type":"string","description":"md | html"},"position":{"type":"integer","description":"Ordem no menu"},"head":{"type":"string"},"css":{"type":"string"},"js":{"type":"string"}},"required":["slug"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"description":"Erro: {\"error\": \"mensagem\"}"}}}},"/upsert_section":{"post":{"operationId":"upsert_section","summary":"Cria ou substitui uma seção de documento. Com anchor de seção existente, atualiza só os campos enviados; sem anchor (ou ","description":"Cria ou substitui uma seção de documento. Com anchor de seção existente, atualiza só os campos enviados; sem anchor (ou anchor nova), cria no fim ou depois de \"after\". Conteúdo em Markdown por padrão.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"string","description":"Slug do projeto (veja list_projects). Opcional quando a chave de API é de um projeto só."},"slug":{"type":"string","description":"Slug do documento"},"anchor":{"type":"string","description":"Âncora da seção (identificador)"},"title":{"type":"string","description":"Título da seção"},"content":{"type":"string","description":"Conteúdo completo da seção"},"format":{"type":"string","description":"md (padrão) | html","enum":["md","html"]},"number":{"type":"string","description":"Número exibido (ex.: 05)"},"group":{"type":"string","description":"Grupo/aba no índice"},"after":{"type":"string","description":"Criar depois desta âncora"}},"required":["slug"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"description":"Erro: {\"error\": \"mensagem\"}"}}}},"/delete_section":{"post":{"operationId":"delete_section","summary":"Apaga uma seção de documento.","description":"Apaga uma seção de documento.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"string","description":"Slug do projeto (veja list_projects). Opcional quando a chave de API é de um projeto só."},"slug":{"type":"string"},"anchor":{"type":"string"}},"required":["slug","anchor"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"description":"Erro: {\"error\": \"mensagem\"}"}}}},"/reorder_sections":{"post":{"operationId":"reorder_sections","summary":"Reordena as seções de um documento (lista de âncoras na ordem nova).","description":"Reordena as seções de um documento (lista de âncoras na ordem nova).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"string","description":"Slug do projeto (veja list_projects). Opcional quando a chave de API é de um projeto só."},"slug":{"type":"string"},"anchors":{"type":"array","items":{"type":"string"},"description":"Âncoras na nova ordem"}},"required":["slug","anchors"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"description":"Erro: {\"error\": \"mensagem\"}"}}}},"/list_comments":{"post":{"operationId":"list_comments","summary":"Comentários do time. status=pending (padrão) traz o que ainda não foi tratado: é a fila de trabalho da IA. Cada um diz a","description":"Comentários do time. status=pending (padrão) traz o que ainda não foi tratado: é a fila de trabalho da IA. Cada um diz a que se refere (target_type: req, dec, doc, section, contact, project; target_ref: código/slug).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"string","description":"Slug do projeto (veja list_projects). Opcional quando a chave de API é de um projeto só."},"status":{"type":"string","description":"pending | reviewed | all","enum":["pending","reviewed","all"]},"target_type":{"type":"string","description":"Filtrar pelo tipo"},"target_ref":{"type":"string","description":"Filtrar pelo alvo"},"limit":{"type":"integer","description":"Máximo (padrão 100)"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"description":"Erro: {\"error\": \"mensagem\"}"}}}},"/add_comment":{"post":{"operationId":"add_comment","summary":"Comenta em um requisito, decisão, documento, seção (\"slug#ancora\"), contato ou no projeto. Comentário da IA já nasce com","description":"Comenta em um requisito, decisão, documento, seção (\"slug#ancora\"), contato ou no projeto. Comentário da IA já nasce como revisado (é uma resposta ou nota, não um pedido).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"string","description":"Slug do projeto (veja list_projects). Opcional quando a chave de API é de um projeto só."},"target_type":{"type":"string","description":"req | dec | doc | section | contact | project","enum":["req","dec","doc","section","contact","project"]},"target_ref":{"type":"string","description":"Código, slug ou \"slug#ancora\""},"body":{"type":"string","description":"Texto"}},"required":["target_type","target_ref","body"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"description":"Erro: {\"error\": \"mensagem\"}"}}}},"/mark_comments_reviewed":{"post":{"operationId":"mark_comments_reviewed","summary":"Marca comentários como revisados depois de tratá-los. reply (opcional) fica visível para o time como a resposta da IA. P","description":"Marca comentários como revisados depois de tratá-los. reply (opcional) fica visível para o time como a resposta da IA. Para desfazer, envie reviewed=false.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"string","description":"Slug do projeto (veja list_projects). Opcional quando a chave de API é de um projeto só."},"ids":{"type":"array","items":{"type":"integer"},"description":"Ids dos comentários"},"reply":{"type":"string","description":"Resposta curta: o que foi feito"},"reviewed":{"type":"boolean","description":"Padrão true"}},"required":["ids"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"description":"Erro: {\"error\": \"mensagem\"}"}}}},"/list_contacts":{"post":{"operationId":"list_contacts","summary":"Contatos do CRM (funil de clientes/parceiros), com filtros. Resumo por padrão; full=true traz todos os dados.","description":"Contatos do CRM (funil de clientes/parceiros), com filtros. Resumo por padrão; full=true traz todos os dados.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"string","description":"Slug do projeto (veja list_projects). Opcional quando a chave de API é de um projeto só."},"stage":{"type":"string","description":"Id da etapa"},"q":{"type":"string","description":"Busca"},"min_priority":{"type":"integer","description":"Prioridade mínima (0 a 10)"},"full":{"type":"boolean","description":"Todos os campos"},"limit":{"type":"integer","description":"Máximo (padrão 100)"},"offset":{"type":"integer","description":"Pular N"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"description":"Erro: {\"error\": \"mensagem\"}"}}}},"/get_contact":{"post":{"operationId":"get_contact","summary":"Contato completo do CRM, com histórico de etapas e comentários.","description":"Contato completo do CRM, com histórico de etapas e comentários.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"string","description":"Slug do projeto (veja list_projects). Opcional quando a chave de API é de um projeto só."},"code":{"type":"string"}},"required":["code"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"description":"Erro: {\"error\": \"mensagem\"}"}}}},"/upsert_contact":{"post":{"operationId":"upsert_contact","summary":"Cria ou atualiza um contato do CRM. data é mesclado (campos livres: segmento, cidade, uf, links [{rotulo,url}], justific","description":"Cria ou atualiza um contato do CRM. data é mesclado (campos livres: segmento, cidade, uf, links [{rotulo,url}], justificativa, origem...). Sem code, cria um novo.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"string","description":"Slug do projeto (veja list_projects). Opcional quando a chave de API é de um projeto só."},"code":{"type":"string"},"name":{"type":"string"},"stage":{"type":"string","description":"Id da etapa"},"priority":{"type":"integer","description":"0 a 10 (fit)"},"data":{"type":"object","description":"Campos livres a mesclar"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"description":"Erro: {\"error\": \"mensagem\"}"}}}},"/search":{"post":{"operationId":"search","summary":"Busca em tudo: requisitos, decisões, seções de documentos e contatos. Use antes de criar algo, para não duplicar.","description":"Busca em tudo: requisitos, decisões, seções de documentos e contatos. Use antes de criar algo, para não duplicar.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"string","description":"Slug do projeto (veja list_projects). Opcional quando a chave de API é de um projeto só."},"q":{"type":"string","description":"Palavras (todas precisam aparecer)"},"limit":{"type":"integer","description":"Máximo por tipo (padrão 20)"}},"required":["q"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"description":"Erro: {\"error\": \"mensagem\"}"}}}},"/get_activity":{"post":{"operationId":"get_activity","summary":"Histórico recente de mudanças no projeto (quem fez o quê, pelo site ou pela IA).","description":"Histórico recente de mudanças no projeto (quem fez o quê, pelo site ou pela IA).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"string","description":"Slug do projeto (veja list_projects). Opcional quando a chave de API é de um projeto só."},"limit":{"type":"integer","description":"Máximo (padrão 50)"},"before_id":{"type":"integer","description":"Paginação: itens anteriores a este id"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"description":"Erro: {\"error\": \"mensagem\"}"}}}}},"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer"}}},"security":[{"bearer":[]}]}