{"openapi":"3.1.0","info":{"title":"nimbuslab API","version":"0.1.0","description":"API REST do ecossistema nimbuslab — Inteligência, gestão e automação."},"servers":[{"url":"https://cumulus-api.nimbuslab.com.br","description":"Servidor ativo"},{"url":"http://localhost:3333","description":"Desenvolvimento"}],"components":{"schemas":{},"parameters":{}},"paths":{"/api/health":{"get":{"tags":["Sistema"],"summary":"Health check","description":"Verifica se a API está online e retorna informações básicas.","responses":{"200":{"description":"API online","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"ok"},"name":{"type":"string","example":"nimbuslab-api"},"version":{"type":"string","example":"0.1.0"},"timestamp":{"type":"string","example":"2026-02-18T12:00:00.000Z"}},"required":["status","name","version","timestamp"]}}}}}}},"/api/me":{"get":{"tags":["Autenticação"],"summary":"Usuário autenticado","description":"Retorna dados do usuário logado + role e permissões do membro na organização.","responses":{"200":{"description":"Dados do usuário e membro","content":{"application/json":{"schema":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string","example":"abc123"},"name":{"type":"string","example":"Hugo Dias"},"email":{"type":"string","format":"email","example":"hugo@nimbuslab.com.br"},"image":{"type":"string","nullable":true,"example":null},"emailVerified":{"type":"boolean","example":true}},"required":["id","name","email","image","emailVerified"]},"member":{"type":"object","nullable":true,"properties":{"id":{"type":"number","example":1},"role":{"type":"string","example":"owner"},"permissions":{"type":"array","items":{"type":"string"},"example":["clients:read","finance:read"]},"scopes":{"type":"array","items":{"type":"string"},"example":["dev","devops"]}},"required":["id","role","permissions"]}},"required":["user","member"]}}}},"401":{"description":"Não autenticado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Não autenticado"}},"required":["error"]}}}}}}},"/api/me/avatar":{"patch":{"tags":["Autenticação"],"summary":"Atualizar avatar do usuário","description":"Atualiza a imagem de perfil do usuário autenticado.","requestBody":{"description":"URL pública do avatar","content":{"application/json":{"schema":{"type":"object","properties":{"image":{"type":"string","nullable":true,"format":"uri","example":"https://uploads.nimbuslab.com.br/avatars/abc/avatar.webp"}},"required":["image"]}}}},"responses":{"200":{"description":"Avatar atualizado","content":{"application/json":{"schema":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string","example":"abc123"},"name":{"type":"string","example":"Hugo Dias"},"email":{"type":"string","format":"email","example":"hugo@nimbuslab.com.br"},"image":{"type":"string","nullable":true,"example":null},"emailVerified":{"type":"boolean","example":true}},"required":["id","name","email","image","emailVerified"]}},"required":["user"]}}}},"400":{"description":"URL inválida","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Não autenticado"}},"required":["error"]}}}},"401":{"description":"Não autenticado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Não autenticado"}},"required":["error"]}}}}}}},"/api/auth/providers":{"get":{"tags":["Autenticação"],"summary":"Provedores disponíveis","description":"Lista os provedores de autenticação habilitados.","responses":{"200":{"description":"Provedores e funcionalidades disponíveis","content":{"application/json":{"schema":{"type":"object","properties":{"providers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","example":"google"},"name":{"type":"string","example":"Google"},"enabled":{"type":"boolean","example":true}},"required":["id","name","enabled"]}},"features":{"type":"object","properties":{"magicLink":{"type":"boolean","example":true},"totp":{"type":"boolean","example":true},"passkey":{"type":"boolean","example":true}},"required":["magicLink","totp","passkey"]}},"required":["providers","features"]}}}}}}},"/api/contact/request-access":{"post":{"tags":["Contato"],"summary":"Solicitar acesso","description":"Envia uma solicitação de acesso ao nimbuslab.","requestBody":{"description":"Dados da solicitação","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"example":"Maria Silva"},"email":{"type":"string","format":"email","example":"maria@empresa.com.br"},"message":{"type":"string","example":"Gostaria de acesso para gerenciar os projetos da equipe."}},"required":["name","email"]}}}},"responses":{"200":{"description":"Solicitação enviada","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"}},"required":["ok"]}}}},"500":{"description":"Erro ao enviar","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/email/render":{"post":{"tags":["Email Render"],"summary":"Renderizar template de email para HTML","description":"Endpoint service-to-service para renderizar templates React Email. Auth via X-Email-Render-Key.","requestBody":{"description":"Template, tema e props","required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"theme":{"type":"string","default":"nimbus"},"org":{"type":"object","properties":{"name":{"type":"string"},"logoUrl":{"type":"string","format":"uri"},"primaryColor":{"type":"string"},"siteUrl":{"type":"string","format":"uri"},"supportEmail":{"type":"string","format":"email"}},"required":["name"]}}},{"oneOf":[{"type":"object","properties":{"template":{"type":"string","enum":["magic-link"]},"props":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"expiryMinutes":{"type":"number"},"appName":{"type":"string"}},"required":["url"]}},"required":["template","props"]},{"type":"object","properties":{"template":{"type":"string","enum":["monitor-alert"]},"props":{"type":"object","properties":{"monitorName":{"type":"string"},"monitorUrl":{"type":"string","format":"uri"},"status":{"type":"string","enum":["up","down","degraded"]},"responseTimeMs":{"type":"number"},"error":{"type":"string"},"checkedAt":{"type":"string"}},"required":["monitorName","monitorUrl","status"]}},"required":["template","props"]},{"type":"object","properties":{"template":{"type":"string","enum":["contact-request"]},"props":{"type":"object","properties":{"senderName":{"type":"string"},"senderEmail":{"type":"string","format":"email"},"message":{"type":"string"}},"required":["senderName","senderEmail"]}},"required":["template","props"]},{"type":"object","properties":{"template":{"type":"string","enum":["member-invite"]},"props":{"type":"object","properties":{"inviterName":{"type":"string"},"orgName":{"type":"string"},"loginUrl":{"type":"string","format":"uri"}},"required":["inviterName","orgName","loginUrl"]}},"required":["template","props"]},{"type":"object","properties":{"template":{"type":"string","enum":["changelog"]},"props":{"type":"object","properties":{"version":{"type":"string"},"projectName":{"type":"string"},"changes":{"type":"object","properties":{"features":{"type":"array","items":{"type":"string"}},"fixes":{"type":"array","items":{"type":"string"}},"improvements":{"type":"array","items":{"type":"string"}},"breaking":{"type":"array","items":{"type":"string"}}}},"intro":{"type":"string"},"imageUrl":{"type":"string","format":"uri"},"date":{"type":"string"}},"required":["version","projectName","changes"]}},"required":["template","props"]},{"type":"object","properties":{"template":{"type":"string","enum":["welcome"]},"props":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string","format":"email"}},"required":["name","email"]}},"required":["template","props"]},{"type":"object","properties":{"template":{"type":"string","enum":["invite"]},"props":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string","format":"email"},"orgName":{"type":"string"},"invitedBy":{"type":"string"},"mcpUrl":{"type":"string","format":"uri"},"clientType":{"type":"string"}},"required":["name","email","orgName","invitedBy"]}},"required":["template","props"]},{"type":"object","properties":{"template":{"type":"string","enum":["recado"]},"props":{"type":"object","properties":{"fromName":{"type":"string"},"toName":{"type":"string"},"message":{"type":"string"}},"required":["fromName","toName","message"]}},"required":["template","props"]},{"type":"object","properties":{"template":{"type":"string","enum":["eod-summary"]},"props":{"type":"object","properties":{"name":{"type":"string"},"summary":{"type":"string"},"summaryHtml":{"type":"string"},"subtitle":{"type":"string"}},"required":["name"]}},"required":["template","props"]},{"type":"object","properties":{"template":{"type":"string","enum":["billing-invoice"]},"props":{"type":"object","properties":{"clientName":{"type":"string"},"invoiceNumber":{"type":"string"},"amount":{"type":"number"},"dueDate":{"type":"string"},"items":{"type":"array","items":{"type":"object","properties":{"description":{"type":"string"},"quantity":{"type":"number"},"unitPrice":{"type":"number"}},"required":["description","quantity","unitPrice"]}},"status":{"type":"string","enum":["pending","overdue"]},"payUrl":{"type":"string","format":"uri"}},"required":["clientName","invoiceNumber","amount","dueDate"]}},"required":["template","props"]},{"type":"object","properties":{"template":{"type":"string","enum":["billing-confirmation"]},"props":{"type":"object","properties":{"clientName":{"type":"string"},"invoiceNumber":{"type":"string"},"amount":{"type":"number"},"paidDate":{"type":"string"}},"required":["clientName","invoiceNumber","amount","paidDate"]}},"required":["template","props"]},{"type":"object","properties":{"template":{"type":"string","enum":["waitlist"]},"props":{"type":"object","properties":{"email":{"type":"string","format":"email"}},"required":["email"]}},"required":["template","props"]},{"type":"object","properties":{"template":{"type":"string","enum":["client-welcome"]},"props":{"type":"object","properties":{"clientName":{"type":"string"},"projectName":{"type":"string"},"contactEmail":{"type":"string","format":"email"}},"required":["clientName","projectName","contactEmail"]}},"required":["template","props"]},{"type":"object","properties":{"template":{"type":"string","enum":["session-start"]},"props":{"type":"object","properties":{"name":{"type":"string"},"device":{"type":"string"},"time":{"type":"string"}},"required":["name"]}},"required":["template","props"]},{"type":"object","properties":{"template":{"type":"string","enum":["session-end"]},"props":{"type":"object","properties":{"name":{"type":"string"},"duration":{"type":"string"},"memories":{"type":"number"},"interactions":{"type":"number"},"summary":{"type":"string"},"resumeId":{"type":"string"}},"required":["name","duration"]}},"required":["template","props"]},{"type":"object","properties":{"template":{"type":"string","enum":["boa-noite-light"]},"props":{"type":"object","properties":{"name":{"type":"string"},"quietMessage":{"type":"string"},"quote":{"type":"string"},"subtitle":{"type":"string"}},"required":["name","quietMessage","quote"]}},"required":["template","props"]},{"type":"object","properties":{"template":{"type":"string","enum":["birthday"]},"props":{"type":"object","properties":{"name":{"type":"string"},"greeting":{"type":"string"},"message":{"type":"string"},"signedBy":{"type":"string"}},"required":["name","greeting","message"]}},"required":["template","props"]},{"type":"object","properties":{"template":{"type":"string","enum":["christmas"]},"props":{"type":"object","properties":{"name":{"type":"string"},"message":{"type":"string"},"year":{"type":"number"}},"required":["name","message"]}},"required":["template","props"]},{"type":"object","properties":{"template":{"type":"string","enum":["new-year"]},"props":{"type":"object","properties":{"name":{"type":"string"},"message":{"type":"string"},"year":{"type":"number"},"retrospectiveHtml":{"type":"string"}},"required":["name","message"]}},"required":["template","props"]},{"type":"object","properties":{"template":{"type":"string","enum":["onboarding"]},"props":{"type":"object","properties":{"name":{"type":"string"},"day":{"type":"number"},"title":{"type":"string"},"greeting":{"type":"string"},"intro":{"type":"string"},"blocks":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"titleColor":{"type":"string","enum":["primary","heading"]},"items":{"type":"array","items":{"type":"string"}}},"required":["title","items"]}}},"required":["name","day","title","greeting","intro","blocks"]}},"required":["template","props"]},{"type":"object","properties":{"template":{"type":"string","enum":["boa-noite"]},"props":{"type":"object","properties":{"name":{"type":"string"},"greeting":{"type":"string"},"quote":{"type":"string"},"stats":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"value":{"type":"number"}},"required":["label","value"]}},"activities":{"type":"array","items":{"type":"object","properties":{"time":{"type":"string"},"text":{"type":"string"}},"required":["time","text"]}},"sessions":{"type":"array","items":{"type":"object","properties":{"startedAt":{"type":"string"},"endedAt":{"type":"string"},"toolsUsed":{"type":"number"},"memoriesCreated":{"type":"number"},"device":{"type":"string"},"isActive":{"type":"boolean"}},"required":["startedAt"]}},"subtitle":{"type":"string"}},"required":["name","greeting","quote","stats"]}},"required":["template","props"]},{"type":"object","properties":{"template":{"type":"string","enum":["bom-dia"]},"props":{"type":"object","properties":{"name":{"type":"string"},"greeting":{"type":"string"},"recap":{"type":"string"},"issues":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"title":{"type":"string"},"priority":{"type":"string"},"projectName":{"type":"string"}},"required":["id","title","priority"]}},"events":{"type":"array","items":{"type":"object","properties":{"time":{"type":"string"},"summary":{"type":"string"}},"required":["time","summary"]}},"milestones":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"progress":{"type":"number"},"projectName":{"type":"string"}},"required":["title","progress"]}},"inboxTotal":{"type":"number"},"inboxUrgent":{"type":"number"},"insight":{"type":"string"},"tip":{"type":"object","properties":{"category":{"type":"string"},"text":{"type":"string"}},"required":["category","text"]},"news":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"url":{"type":"string","format":"uri"},"excerpt":{"type":"string"}},"required":["title","url"]}},"quote":{"type":"string"},"profileNote":{"type":"string"}},"required":["name","greeting"]}},"required":["template","props"]},{"type":"object","properties":{"template":{"type":"string","enum":["beta-weekly-report"]},"props":{"type":"object","properties":{"periodStart":{"type":"string"},"periodEnd":{"type":"string"},"totalTesters":{"type":"number"},"newThisWeek":{"type":"number"},"activeThisWeek":{"type":"number"},"totalCalls":{"type":"number"},"topTools":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"calls":{"type":"number"}},"required":["name","calls"]}},"testers":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"calls":{"type":"number"},"toolsUsed":{"type":"number"},"adoptionScore":{"type":"number"},"churnRisk":{"type":"number"},"status":{"type":"string"}},"required":["name","calls","toolsUsed","adoptionScore","churnRisk","status"]}},"retention":{"type":"object","properties":{"day1":{"type":"number"},"day7":{"type":"number"},"day30":{"type":"number"}},"required":["day1","day7","day30"]},"ttfvHours":{"type":"number"},"globalP50":{"type":"number"},"globalErrorRate":{"type":"number"},"totalMemoriesCreated":{"type":"number"},"totalIssuesCreated":{"type":"number"}},"required":["periodStart","periodEnd","totalTesters","newThisWeek","activeThisWeek","totalCalls"]}},"required":["template","props"]},{"type":"object","properties":{"template":{"type":"string","enum":["member-performance-report"]},"props":{"type":"object","properties":{"name":{"type":"string"},"periodLabel":{"type":"string"},"periodDays":{"type":"number"},"healthScore":{"type":"number"},"engagementScore":{"type":"number"},"usage":{"type":"object","properties":{"total_calls":{"type":"number"},"unique_tools":{"type":"number"},"sessions":{"type":"number"},"days_active":{"type":"number"}}},"learning":{"type":"object","properties":{"autonomy_ratio":{"type":"number"},"diversity_index":{"type":"number"},"gap_resolution":{"type":"number"},"search_quality":{"type":"number"}}},"trend":{"type":"object","properties":{"direction":{"type":"string"},"change_pct":{"type":"number"}}},"memoriesCreated":{"type":"number"},"memoriesConsulted":{"type":"number"},"issuesCreated":{"type":"number"},"issuesCompleted":{"type":"number"},"timeSavedHours":{"type":"number"},"growthInsights":{"type":"array","items":{"type":"string"}},"disruptionSignals":{"type":"array","items":{"type":"string"}},"recommendations":{"type":"array","items":{"type":"string"}},"trendSummary":{"type":"string"}},"required":["name","periodLabel","periodDays"]}},"required":["template","props"]},{"type":"object","properties":{"template":{"type":"string","enum":["platform-health-report"]},"props":{"type":"object","properties":{"periodLabel":{"type":"string"},"periodDays":{"type":"number"},"healthScore":{"type":"number"},"totalCalls":{"type":"number"},"uniqueMembers":{"type":"number"},"errorRate":{"type":"number"},"p50":{"type":"number"},"p95":{"type":"number"},"growthPct":{"type":"number"},"dauAvg":{"type":"number"},"mauAvg":{"type":"number"},"errorHotspots":{"type":"array","items":{"type":"object","properties":{"toolName":{"type":"string"},"total":{"type":"number"},"errors":{"type":"number"},"errorRate":{"type":"number"}},"required":["toolName","total","errors","errorRate"]}},"llmTotalCost":{"type":"number"},"llmTotalTokens":{"type":"number"},"llmByProvider":{"type":"array","items":{"type":"object","properties":{"provider":{"type":"string"},"model":{"type":"string"},"costUsd":{"type":"number"},"calls":{"type":"number"}},"required":["provider","model","costUsd","calls"]}},"llmByTask":{"type":"array","items":{"type":"object","properties":{"taskType":{"type":"string"},"costUsd":{"type":"number"},"calls":{"type":"number"}},"required":["taskType","costUsd","calls"]}},"team":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"healthScore":{"type":"number"},"totalCalls":{"type":"number"},"status":{"type":"string"},"churnRisk":{"type":"number"}},"required":["name","healthScore","totalCalls","status"]}},"improvements":{"type":"array","items":{"type":"string"}},"regressions":{"type":"array","items":{"type":"string"}},"userStruggles":{"type":"array","items":{"type":"string"}},"costInsights":{"type":"array","items":{"type":"string"}},"priorities":{"type":"array","items":{"type":"string"}}},"required":["periodLabel","periodDays"]}},"required":["template","props"]},{"type":"object","properties":{"template":{"type":"string","enum":["org-value-report"]},"props":{"type":"object","properties":{"orgName":{"type":"string"},"periodLabel":{"type":"string"},"periodDays":{"type":"number"},"valueScore":{"type":"number"},"totalCalls":{"type":"number"},"activeSessions":{"type":"number"},"activeMembers":{"type":"number"},"memoriesCreated":{"type":"number"},"memoriesConsulted":{"type":"number"},"memoryReuseRate":{"type":"number"},"issuesCreated":{"type":"number"},"issuesCompleted":{"type":"number"},"timeSavedHours":{"type":"number"},"searchQuality":{"type":"object","properties":{"avgSimilarity":{"type":"number"},"totalSearches":{"type":"number"},"goodRate":{"type":"number"}},"required":["avgSimilarity","totalSearches","goodRate"]},"highlights":{"type":"array","items":{"type":"string"}},"suggestions":{"type":"array","items":{"type":"string"}},"summary":{"type":"string"}},"required":["orgName","periodLabel","periodDays"]}},"required":["template","props"]},{"type":"object","properties":{"template":{"type":"string","enum":["inactivity-digest"]},"props":{"type":"object","properties":{"ownerName":{"type":"string"},"period":{"type":"object","properties":{"start":{"type":"string"},"end":{"type":"string"}},"required":["start","end"]},"members":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"},"daysInactive":{"type":"number"},"stage":{"type":"string","enum":["reminder","warning","revoked","reactivated"]},"lastSeen":{"type":"string"}},"required":["name","email","daysInactive","stage"]}},"previousCounts":{"type":"object","properties":{"reminder":{"type":"number"},"warning":{"type":"number"},"revoked":{"type":"number"},"reactivated":{"type":"number"}},"required":["reminder","warning","revoked","reactivated"]}},"required":["members"]}},"required":["template","props"]}]}]}}}},"responses":{"200":{"description":"HTML renderizado","content":{"application/json":{"schema":{"type":"object","properties":{"html":{"type":"string"}},"required":["html"]}}}},"400":{"description":"Erro de validacao","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Token invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"500":{"description":"Erro no render","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/admin/reset-dev-db":{"post":{"tags":["Admin"],"summary":"Reset dos bancos dev/staging","description":"Executa drop + create + push schema + seed nos bancos de desenvolvimento. Requer ADMIN_RESET_TOKEN. Não funciona em produção.","parameters":[{"schema":{"type":"string","description":"Token de admin","example":"meu-token-secreto"},"required":true,"name":"token","in":"query"}],"responses":{"200":{"description":"Reset concluído","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"ok"},"message":{"type":"string","example":"Reset concluído com sucesso"},"duration":{"type":"string","example":"12.3s"}},"required":["status","message","duration"]}}}},"403":{"description":"Token inválido ou ambiente não permitido","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}}}}},"/api/projects":{"get":{"tags":["Projetos"],"summary":"Listar projetos","description":"Retorna projetos filtrados por acesso do membro e status.","parameters":[{"schema":{"type":"string","enum":["active","archived","all"],"example":"active"},"required":false,"name":"status","in":"query"}],"responses":{"200":{"description":"Lista de projetos","content":{"application/json":{"schema":{"type":"object","properties":{"projects":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","example":1},"number":{"type":"number","nullable":true,"description":"Número sequencial por org (#1, #2, ...)","example":1},"name":{"type":"string","example":"lola"},"description":{"type":"string","nullable":true,"example":"MCP Server"},"icon":{"type":"string","nullable":true,"example":"rocket"},"path":{"type":"string","nullable":true,"example":"~/www/nimbuslab/lola"},"gitRemote":{"type":"string","nullable":true,"example":"git@github.com:lola-by-nimbuslab/lola.git"},"status":{"type":"string","example":"active"},"issueCount":{"type":"number","example":42},"memberCount":{"type":"number","example":3},"createdAt":{"type":"string","nullable":true,"example":"2026-01-15T10:00:00Z"}},"required":["id","number","name","description","icon","path","gitRemote","status","issueCount","memberCount","createdAt"]}}},"required":["projects"]}}}},"503":{"description":"Banco da Lola não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}},"post":{"tags":["Projetos"],"summary":"Criar projeto","description":"Cria um projeto e adiciona o criador como admin do projeto.","requestBody":{"description":"Dados do projeto","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"example":"meu-projeto"},"description":{"type":"string","example":"Descrição do projeto"},"icon":{"type":"string","example":"rocket"},"path":{"type":"string","example":"~/www/nimbuslab/meu-projeto"},"gitRemote":{"type":"string","example":"git@github.com:org/repo.git"}},"required":["name"]}}}},"responses":{"201":{"description":"Projeto criado","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/projects/{id}":{"get":{"tags":["Projetos"],"summary":"Detalhe do projeto","description":"Retorna um projeto com contagem de issues e membros.","parameters":[{"schema":{"type":"string","example":"13"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Projeto encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"object","properties":{"id":{"type":"number","example":1},"number":{"type":"number","nullable":true,"description":"Número sequencial por org (#1, #2, ...)","example":1},"name":{"type":"string","example":"lola"},"description":{"type":"string","nullable":true,"example":"MCP Server"},"icon":{"type":"string","nullable":true,"example":"rocket"},"path":{"type":"string","nullable":true,"example":"~/www/nimbuslab/lola"},"gitRemote":{"type":"string","nullable":true,"example":"git@github.com:lola-by-nimbuslab/lola.git"},"status":{"type":"string","example":"active"},"issueCount":{"type":"number","example":42},"memberCount":{"type":"number","example":3},"createdAt":{"type":"string","nullable":true,"example":"2026-01-15T10:00:00Z"}},"required":["id","number","name","description","icon","path","gitRemote","status","issueCount","memberCount","createdAt"]}},"required":["project"]}}}},"403":{"description":"Sem acesso ao projeto","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"404":{"description":"Projeto não encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"Banco da Lola não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}},"patch":{"tags":["Projetos"],"summary":"Atualizar projeto","description":"Atualiza campos de um projeto.","parameters":[{"schema":{"type":"string","example":"13"},"required":true,"name":"id","in":"path"}],"requestBody":{"description":"Campos a atualizar","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"icon":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"gitRemote":{"type":"string","nullable":true},"status":{"type":"string","enum":["active","archived"]}}}}}},"responses":{"200":{"description":"Projeto atualizado","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"404":{"description":"Projeto não encontrado ou sem acesso","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}},"delete":{"tags":["Projetos"],"summary":"Excluir projeto","description":"Exclui um projeto via Lola MCP.","parameters":[{"schema":{"type":"string","example":"13"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Projeto excluído","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"404":{"description":"Projeto não encontrado ou sem acesso","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/projects/{id}/members":{"get":{"tags":["Membros de Projeto"],"summary":"Listar membros do projeto","description":"Retorna membros do projeto com seus roles.","parameters":[{"schema":{"type":"string","example":"13"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Membros do projeto","content":{"application/json":{"schema":{"type":"object","properties":{"members":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"memberId":{"type":"number"},"memberName":{"type":"string","nullable":true},"memberEmail":{"type":"string"},"role":{"type":"string"},"addedBy":{"type":"string","nullable":true},"createdAt":{"type":"string","nullable":true}},"required":["id","memberId","memberName","memberEmail","role","addedBy","createdAt"]}}},"required":["members"]}}}},"403":{"description":"Sem acesso ao projeto","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"Banco não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}},"post":{"tags":["Membros de Projeto"],"summary":"Adicionar membro ao projeto","description":"Adiciona um membro da org ao projeto com um role.","parameters":[{"schema":{"type":"string","example":"13"},"required":true,"name":"id","in":"path"}],"requestBody":{"description":"Dados do membro","content":{"application/json":{"schema":{"type":"object","properties":{"member_id":{"type":"number","example":5},"role":{"type":"string","enum":["admin","contributor","viewer"],"example":"contributor"}},"required":["member_id"]}}}},"responses":{"201":{"description":"Membro adicionado","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","properties":{"id":{"type":"number"}},"required":["id"]}},"required":["message","data"]}}}},"400":{"description":"Membro já existe no projeto","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"403":{"description":"Sem permissão","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"404":{"description":"Projeto ou membro não encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"Banco não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/projects/{id}/members/{memberId}":{"patch":{"tags":["Membros de Projeto"],"summary":"Alterar role do membro no projeto","parameters":[{"schema":{"type":"string","example":"13"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","example":"5"},"required":true,"name":"memberId","in":"path"}],"requestBody":{"description":"Novo role","content":{"application/json":{"schema":{"type":"object","properties":{"role":{"type":"string","enum":["admin","contributor","viewer"]}},"required":["role"]}}}},"responses":{"200":{"description":"Role atualizado","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"403":{"description":"Sem permissão","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"404":{"description":"Membro não encontrado no projeto","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"Banco não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}},"delete":{"tags":["Membros de Projeto"],"summary":"Remover membro do projeto","parameters":[{"schema":{"type":"string","example":"13"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","example":"5"},"required":true,"name":"memberId","in":"path"}],"responses":{"200":{"description":"Membro removido","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"403":{"description":"Sem permissão","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"404":{"description":"Membro não encontrado no projeto","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"Banco não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/me/favorites":{"get":{"tags":["Favoritos"],"summary":"Listar projetos favoritos","description":"Retorna projetos favoritos do membro autenticado.","responses":{"200":{"description":"Favoritos","content":{"application/json":{"schema":{"type":"object","properties":{"favorites":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"projectId":{"type":"number"},"projectName":{"type":"string"},"createdAt":{"type":"string","nullable":true}},"required":["id","projectId","projectName","createdAt"]}}},"required":["favorites"]}}}},"401":{"description":"Membro não encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"Banco não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}},"post":{"tags":["Favoritos"],"summary":"Adicionar projeto aos favoritos","requestBody":{"description":"Projeto a favoritar","content":{"application/json":{"schema":{"type":"object","properties":{"projectId":{"type":"number","example":13}},"required":["projectId"]}}}},"responses":{"201":{"description":"Favoritado","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","properties":{"id":{"type":"number"}},"required":["id"]}},"required":["message","data"]}}}},"400":{"description":"Já é favorito","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"401":{"description":"Membro não encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"403":{"description":"Sem acesso ao projeto","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"Banco não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/me/favorites/{projectId}":{"delete":{"tags":["Favoritos"],"summary":"Remover projeto dos favoritos","parameters":[{"schema":{"type":"string","example":"13"},"required":true,"name":"projectId","in":"path"}],"responses":{"200":{"description":"Removido","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"401":{"description":"Membro não encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"404":{"description":"Favorito não encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"Banco não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/issues":{"get":{"tags":["Issues"],"summary":"Listar issues","description":"Retorna issues filtradas por acesso do membro, com filtros opcionais.","parameters":[{"schema":{"type":"string","example":"13"},"required":false,"name":"project_id","in":"query"},{"schema":{"type":"string","enum":["draft","backlog","todo","in_progress","done","canceled"]},"required":false,"name":"status","in":"query"},{"schema":{"type":"string"},"required":false,"name":"assigned_to","in":"query"},{"schema":{"type":"string"},"required":false,"name":"milestone_id","in":"query"},{"schema":{"type":"string"},"required":false,"name":"cycle_id","in":"query"},{"schema":{"type":"string","enum":["all","mine"],"example":"all"},"required":false,"name":"scope","in":"query"},{"schema":{"type":"string","example":"login"},"required":false,"name":"search","in":"query"},{"schema":{"type":"string","example":"50"},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Lista de issues","content":{"application/json":{"schema":{"type":"object","properties":{"issues":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","example":42},"title":{"type":"string","example":"Implementar login com Google"},"description":{"type":"string","nullable":true,"example":"Usar better-auth plugin"},"status":{"type":"string","example":"todo"},"priority":{"type":"string","example":"medium"},"assignedTo":{"type":"string","nullable":true,"example":"hugo@nimbuslab.com.br"},"projectId":{"type":"number","nullable":true,"example":13},"projectName":{"type":"string","nullable":true,"example":"nimbuslab"},"milestoneId":{"type":"number","nullable":true,"example":5},"cycleId":{"type":"number","nullable":true,"example":1},"createdBy":{"type":"string","example":"hugo@nimbuslab.com.br"},"dueDate":{"type":"string","nullable":true,"example":"2026-03-01"},"createdAt":{"type":"string","nullable":true,"example":"2026-02-18T10:00:00Z"},"updatedAt":{"type":"string","nullable":true,"example":"2026-02-18T10:00:00Z"}},"required":["id","title","description","status","priority","assignedTo","projectId","projectName","milestoneId","cycleId","createdBy","dueDate","createdAt","updatedAt"]}}},"required":["issues"]}}}},"503":{"description":"Banco não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}},"post":{"tags":["Issues"],"summary":"Criar issue","description":"Cria uma issue (valida acesso ao projeto).","requestBody":{"description":"Dados da issue","content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"example":"Implementar auth"},"description":{"type":"string"},"status":{"type":"string","enum":["draft","backlog","todo","in_progress","done","canceled"]},"project_id":{"type":"number","example":13},"priority":{"type":"string","enum":["none","low","medium","high","urgent"]},"assigned_to":{"type":"string"},"milestone_id":{"type":"number"},"cycle_id":{"type":"number"},"labels":{"type":"array","items":{"type":"string"}},"due_date":{"type":"string","example":"2026-03-01"}},"required":["title"]}}}},"responses":{"201":{"description":"Issue criada","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"403":{"description":"Sem acesso ao projeto","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"404":{"description":"Projeto não encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/issues/{id}":{"get":{"tags":["Issues"],"summary":"Detalhe da issue","description":"Retorna uma issue pelo ID (com verificação de acesso ao projeto).","parameters":[{"schema":{"type":"string","example":"42"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Issue encontrada","content":{"application/json":{"schema":{"type":"object","properties":{"issue":{"type":"object","properties":{"id":{"type":"number","example":42},"title":{"type":"string","example":"Implementar login com Google"},"description":{"type":"string","nullable":true,"example":"Usar better-auth plugin"},"status":{"type":"string","example":"todo"},"priority":{"type":"string","example":"medium"},"assignedTo":{"type":"string","nullable":true,"example":"hugo@nimbuslab.com.br"},"projectId":{"type":"number","nullable":true,"example":13},"projectName":{"type":"string","nullable":true,"example":"nimbuslab"},"milestoneId":{"type":"number","nullable":true,"example":5},"cycleId":{"type":"number","nullable":true,"example":1},"createdBy":{"type":"string","example":"hugo@nimbuslab.com.br"},"dueDate":{"type":"string","nullable":true,"example":"2026-03-01"},"createdAt":{"type":"string","nullable":true,"example":"2026-02-18T10:00:00Z"},"updatedAt":{"type":"string","nullable":true,"example":"2026-02-18T10:00:00Z"}},"required":["id","title","description","status","priority","assignedTo","projectId","projectName","milestoneId","cycleId","createdBy","dueDate","createdAt","updatedAt"]}},"required":["issue"]}}}},"403":{"description":"Sem acesso ao projeto desta issue","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"404":{"description":"Issue não encontrada","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"Banco não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}},"patch":{"tags":["Issues"],"summary":"Atualizar issue","description":"Atualiza campos de uma issue.","parameters":[{"schema":{"type":"string","example":"42"},"required":true,"name":"id","in":"path"}],"requestBody":{"description":"Campos a atualizar","content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["draft","backlog","todo","in_progress","done","canceled"]},"priority":{"type":"string","enum":["none","low","medium","high","urgent"]},"assigned_to":{"type":"string","nullable":true},"project_id":{"type":"number","nullable":true},"milestone_id":{"type":"number","nullable":true},"cycle_id":{"type":"number","nullable":true},"labels":{"type":"array","items":{"type":"string"}},"due_date":{"type":"string","nullable":true}}}}}},"responses":{"200":{"description":"Issue atualizada","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"404":{"description":"Issue não encontrada ou sem acesso","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}},"delete":{"tags":["Issues"],"summary":"Excluir issue","description":"Exclui uma issue via Lola MCP.","parameters":[{"schema":{"type":"string","example":"42"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Issue excluída","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"404":{"description":"Issue não encontrada ou sem acesso","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/issues/{id}/activity":{"get":{"tags":["Issues"],"summary":"Histórico da issue","description":"Retorna histórico de interações da issue (quem fez o quê e quando).","parameters":[{"schema":{"type":"string","example":"42"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Histórico da issue","content":{"application/json":{"schema":{"type":"object","properties":{"activity":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","example":1},"issueId":{"type":"number","example":42},"action":{"type":"string","example":"status_change"},"field":{"type":"string","nullable":true,"example":"status"},"oldValue":{"type":"string","nullable":true,"example":"todo"},"newValue":{"type":"string","nullable":true,"example":"in_progress"},"performedBy":{"type":"string","example":"hugo@nimbuslab.com.br"},"createdAt":{"type":"string","nullable":true,"example":"2026-03-03T12:34:00Z"}},"required":["id","issueId","action","field","oldValue","newValue","performedBy","createdAt"]}}},"required":["activity"]}}}},"404":{"description":"Issue não encontrada","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"Banco não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/issues/{id}/comments":{"get":{"tags":["Issue Comments"],"summary":"Listar comentários de uma issue","description":"Retorna comentários de uma issue.","parameters":[{"schema":{"type":"string","example":"42"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Lista de comentários","content":{"application/json":{"schema":{"type":"object","properties":{"comments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","example":1},"issueId":{"type":"number","example":42},"content":{"type":"string","example":"Precisa de revisão"},"createdBy":{"type":"string","example":"hugo@nimbuslab.com.br"},"createdAt":{"type":"string","nullable":true,"example":"2026-02-28T10:00:00Z"},"updatedAt":{"type":"string","nullable":true,"example":"2026-02-28T10:00:00Z"}},"required":["id","issueId","content","createdBy","createdAt","updatedAt"]}}},"required":["comments"]}}}},"503":{"description":"Banco não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}},"post":{"tags":["Issue Comments"],"summary":"Adicionar comentário","description":"Adiciona um comentário a uma issue.","parameters":[{"schema":{"type":"string","example":"42"},"required":true,"name":"id","in":"path"}],"requestBody":{"description":"Conteúdo do comentário","content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","minLength":1,"example":"Precisa de revisão"}},"required":["content"]}}}},"responses":{"201":{"description":"Comentário criado","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Banco não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/issues/{id}/comments/{commentId}":{"patch":{"tags":["Issue Comments"],"summary":"Editar comentário","description":"Edita um comentário da issue (até 30 minutos após criação).","parameters":[{"schema":{"type":"string","example":"42"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","example":"7"},"required":true,"name":"commentId","in":"path"}],"requestBody":{"description":"Conteúdo atualizado","content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","minLength":1,"example":"Texto atualizado"}},"required":["content"]}}}},"responses":{"200":{"description":"Comentário atualizado","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"403":{"description":"Edição não permitida","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"404":{"description":"Comentário não encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"Banco não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}},"delete":{"tags":["Issue Comments"],"summary":"Excluir comentário","description":"Exclui um comentário de uma issue.","parameters":[{"schema":{"type":"string","example":"42"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","example":"7"},"required":true,"name":"commentId","in":"path"}],"responses":{"200":{"description":"Comentário excluído","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Banco não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/milestones":{"get":{"tags":["Milestones"],"summary":"Listar milestones","description":"Retorna milestones com filtros opcionais. Leitura direta do banco.","parameters":[{"schema":{"type":"string","example":"13"},"required":false,"name":"project_id","in":"query"},{"schema":{"type":"string","enum":["active","completed","canceled"]},"required":false,"name":"status","in":"query"},{"schema":{"type":"string","example":"50"},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Lista de milestones","content":{"application/json":{"schema":{"type":"object","properties":{"milestones":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","example":5},"title":{"type":"string","example":"Dash V1"},"description":{"type":"string","nullable":true,"example":"Primeira versão do dashboard"},"dueDate":{"type":"string","nullable":true,"example":"2026-03-15"},"status":{"type":"string","example":"active"},"projectId":{"type":"number","nullable":true,"example":13},"createdAt":{"type":"string","nullable":true,"example":"2026-02-18T10:00:00Z"},"completedAt":{"type":"string","nullable":true,"example":null}},"required":["id","title","description","dueDate","status","projectId","createdAt","completedAt"]}}},"required":["milestones"]}}}},"503":{"description":"Banco não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}},"post":{"tags":["Milestones"],"summary":"Criar milestone","description":"Cria um milestone via Lola MCP.","requestBody":{"description":"Dados do milestone","content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"example":"Sprint 1"},"description":{"type":"string"},"project_id":{"type":"number","example":13},"due_date":{"type":"string","example":"2026-03-15"}},"required":["title"]}}}},"responses":{"201":{"description":"Milestone criado","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/milestones/{id}":{"get":{"tags":["Milestones"],"summary":"Detalhe do milestone","description":"Retorna um milestone pelo ID.","parameters":[{"schema":{"type":"string","example":"5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Milestone encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"milestone":{"type":"object","properties":{"id":{"type":"number","example":5},"title":{"type":"string","example":"Dash V1"},"description":{"type":"string","nullable":true,"example":"Primeira versão do dashboard"},"dueDate":{"type":"string","nullable":true,"example":"2026-03-15"},"status":{"type":"string","example":"active"},"projectId":{"type":"number","nullable":true,"example":13},"createdAt":{"type":"string","nullable":true,"example":"2026-02-18T10:00:00Z"},"completedAt":{"type":"string","nullable":true,"example":null}},"required":["id","title","description","dueDate","status","projectId","createdAt","completedAt"]}},"required":["milestone"]}}}},"404":{"description":"Milestone não encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"Banco não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}},"patch":{"tags":["Milestones"],"summary":"Atualizar milestone","description":"Atualiza campos de um milestone via Lola MCP.","parameters":[{"schema":{"type":"string","example":"5"},"required":true,"name":"id","in":"path"}],"requestBody":{"description":"Campos a atualizar","content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["active","completed","canceled"]},"due_date":{"type":"string","nullable":true}}}}}},"responses":{"200":{"description":"Milestone atualizado","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}},"delete":{"tags":["Milestones"],"summary":"Excluir milestone","description":"Exclui um milestone via Lola MCP.","parameters":[{"schema":{"type":"string","example":"5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Milestone excluído","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/cycles":{"get":{"tags":["Ciclos"],"summary":"Listar ciclos","description":"Retorna ciclos com filtros opcionais. Leitura direta do banco.","parameters":[{"schema":{"type":"string","example":"13"},"required":false,"name":"project_id","in":"query"},{"schema":{"type":"string","enum":["active","completed","canceled"]},"required":false,"name":"status","in":"query"},{"schema":{"type":"string","example":"50"},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Lista de ciclos","content":{"application/json":{"schema":{"type":"object","properties":{"cycles":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","example":1},"title":{"type":"string","example":"Sprint 1"},"description":{"type":"string","nullable":true,"example":"Primeira sprint do projeto"},"projectId":{"type":"number","nullable":true,"example":13},"startDate":{"type":"string","nullable":true,"example":"2026-02-18"},"endDate":{"type":"string","nullable":true,"example":"2026-03-04"},"status":{"type":"string","example":"active"},"createdAt":{"type":"string","nullable":true,"example":"2026-02-18T10:00:00Z"}},"required":["id","title","description","projectId","startDate","endDate","status","createdAt"]}}},"required":["cycles"]}}}},"503":{"description":"Banco não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}},"post":{"tags":["Ciclos"],"summary":"Criar ciclo","description":"Cria um ciclo via Lola MCP.","requestBody":{"description":"Dados do ciclo","content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"example":"Sprint 1"},"description":{"type":"string"},"project_id":{"type":"number","example":13},"start_date":{"type":"string","example":"2026-02-18"},"end_date":{"type":"string","example":"2026-03-04"}},"required":["title"]}}}},"responses":{"201":{"description":"Ciclo criado","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/cycles/{id}":{"get":{"tags":["Ciclos"],"summary":"Detalhe do ciclo","description":"Retorna um ciclo pelo ID.","parameters":[{"schema":{"type":"string","example":"1"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Ciclo encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"cycle":{"type":"object","properties":{"id":{"type":"number","example":1},"title":{"type":"string","example":"Sprint 1"},"description":{"type":"string","nullable":true,"example":"Primeira sprint do projeto"},"projectId":{"type":"number","nullable":true,"example":13},"startDate":{"type":"string","nullable":true,"example":"2026-02-18"},"endDate":{"type":"string","nullable":true,"example":"2026-03-04"},"status":{"type":"string","example":"active"},"createdAt":{"type":"string","nullable":true,"example":"2026-02-18T10:00:00Z"}},"required":["id","title","description","projectId","startDate","endDate","status","createdAt"]}},"required":["cycle"]}}}},"404":{"description":"Ciclo não encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"Banco não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}},"patch":{"tags":["Ciclos"],"summary":"Atualizar ciclo","description":"Atualiza campos de um ciclo via Lola MCP.","parameters":[{"schema":{"type":"string","example":"1"},"required":true,"name":"id","in":"path"}],"requestBody":{"description":"Campos a atualizar","content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["active","completed","canceled"]},"start_date":{"type":"string","nullable":true},"end_date":{"type":"string","nullable":true}}}}}},"responses":{"200":{"description":"Ciclo atualizado","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}},"delete":{"tags":["Ciclos"],"summary":"Excluir ciclo","description":"Exclui um ciclo via Lola MCP.","parameters":[{"schema":{"type":"string","example":"1"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Ciclo excluído","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/cycles/{id}/progress":{"get":{"tags":["Ciclos"],"summary":"Progresso do ciclo","description":"Retorna progresso de um ciclo via Lola MCP.","parameters":[{"schema":{"type":"string","example":"1"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Progresso do ciclo","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/clients":{"get":{"tags":["CRM"],"summary":"Listar clientes","description":"Retorna clientes com filtros opcionais.","parameters":[{"schema":{"type":"string","enum":["lead","prospect","negotiation","won","lost","churned"]},"required":false,"name":"stage","in":"query"},{"schema":{"type":"string","example":"acme"},"required":false,"name":"search","in":"query"},{"schema":{"type":"string","example":"50"},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Lista de clientes","content":{"application/json":{"schema":{"type":"object","properties":{"clients":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","example":1},"name":{"type":"string","example":"Acme Corp"},"email":{"type":"string","nullable":true,"example":"contato@acme.com"},"phone":{"type":"string","nullable":true,"example":"+55 61 3333-4444"},"mobilePhone":{"type":"string","nullable":true,"example":"+55 61 99999-0000"},"company":{"type":"string","nullable":true,"example":"Acme"},"cpfCnpj":{"type":"string","nullable":true,"example":"12345678000199"},"personType":{"type":"string","nullable":true,"example":"juridica"},"postalCode":{"type":"string","nullable":true,"example":"70040020"},"address":{"type":"string","nullable":true,"example":"SBS Quadra 2"},"addressNumber":{"type":"string","nullable":true,"example":"150"},"complement":{"type":"string","nullable":true,"example":"Sala 201"},"neighborhood":{"type":"string","nullable":true,"example":"Asa Sul"},"city":{"type":"string","nullable":true,"example":"Brasília"},"state":{"type":"string","nullable":true,"example":"DF"},"stateInscription":{"type":"string","nullable":true,"example":""},"municipalInscription":{"type":"string","nullable":true,"example":""},"notes":{"type":"string","nullable":true,"example":""},"stage":{"type":"string","example":"lead"},"asaasId":{"type":"string","nullable":true,"example":"cus_abc123"},"source":{"type":"string","nullable":true,"example":"google"},"website":{"type":"string","nullable":true,"example":"https://acme.com"},"segment":{"type":"string","nullable":true,"example":"tecnologia"},"contactName":{"type":"string","nullable":true,"example":"João Silva"},"contactRole":{"type":"string","nullable":true,"example":"Diretor"},"additionalEmails":{"type":"string","nullable":true,"example":"financeiro@acme.com"},"groupName":{"type":"string","nullable":true,"example":"Premium"},"notificationDisabled":{"type":"boolean","example":false},"foreignCustomer":{"type":"boolean","example":false},"createdAt":{"type":"string","nullable":true,"example":"2026-02-18T10:00:00Z"},"updatedAt":{"type":"string","nullable":true,"example":"2026-02-18T10:00:00Z"}},"required":["id","name","email","phone","mobilePhone","company","cpfCnpj","personType","postalCode","address","addressNumber","complement","neighborhood","city","state","stateInscription","municipalInscription","notes","stage","asaasId","source","website","segment","contactName","contactRole","additionalEmails","groupName","notificationDisabled","foreignCustomer","createdAt","updatedAt"]}}},"required":["clients"]}}}},"503":{"description":"Banco não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}},"post":{"tags":["CRM"],"summary":"Criar cliente","description":"Cria um cliente. Usa Lola MCP se disponível, senão grava direto no banco (dev).","requestBody":{"description":"Dados do cliente","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"example":"Acme Corp"},"email":{"type":"string","format":"email"},"phone":{"type":"string"},"mobilePhone":{"type":"string"},"company":{"type":"string"},"cpfCnpj":{"type":"string"},"personType":{"type":"string"},"postalCode":{"type":"string"},"address":{"type":"string"},"addressNumber":{"type":"string"},"complement":{"type":"string"},"neighborhood":{"type":"string"},"city":{"type":"string"},"state":{"type":"string"},"stateInscription":{"type":"string"},"municipalInscription":{"type":"string"},"notes":{"type":"string"},"source":{"type":"string"},"website":{"type":"string","format":"uri"},"segment":{"type":"string"},"contactName":{"type":"string"},"contactRole":{"type":"string"},"additionalEmails":{"type":"string"},"groupName":{"type":"string"},"notificationDisabled":{"type":"boolean"},"foreignCustomer":{"type":"boolean"},"stage":{"type":"string","enum":["lead","prospect","negotiation","won","lost","churned"]}},"required":["name"]}}}},"responses":{"201":{"description":"Cliente criado","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"409":{"description":"CPF/CNPJ já cadastrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"422":{"description":"CPF/CNPJ inválido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"Erro ao criar","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/clients/pipeline":{"get":{"tags":["CRM"],"summary":"Pipeline CRM","description":"Retorna clientes agrupados por estágio via Lola MCP.","responses":{"200":{"description":"Pipeline CRM","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/clients/{id}":{"get":{"tags":["CRM"],"summary":"Detalhe do cliente","description":"Retorna um cliente pelo ID.","parameters":[{"schema":{"type":"string","example":"1"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Cliente encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"client":{"type":"object","properties":{"id":{"type":"number","example":1},"name":{"type":"string","example":"Acme Corp"},"email":{"type":"string","nullable":true,"example":"contato@acme.com"},"phone":{"type":"string","nullable":true,"example":"+55 61 3333-4444"},"mobilePhone":{"type":"string","nullable":true,"example":"+55 61 99999-0000"},"company":{"type":"string","nullable":true,"example":"Acme"},"cpfCnpj":{"type":"string","nullable":true,"example":"12345678000199"},"personType":{"type":"string","nullable":true,"example":"juridica"},"postalCode":{"type":"string","nullable":true,"example":"70040020"},"address":{"type":"string","nullable":true,"example":"SBS Quadra 2"},"addressNumber":{"type":"string","nullable":true,"example":"150"},"complement":{"type":"string","nullable":true,"example":"Sala 201"},"neighborhood":{"type":"string","nullable":true,"example":"Asa Sul"},"city":{"type":"string","nullable":true,"example":"Brasília"},"state":{"type":"string","nullable":true,"example":"DF"},"stateInscription":{"type":"string","nullable":true,"example":""},"municipalInscription":{"type":"string","nullable":true,"example":""},"notes":{"type":"string","nullable":true,"example":""},"stage":{"type":"string","example":"lead"},"asaasId":{"type":"string","nullable":true,"example":"cus_abc123"},"source":{"type":"string","nullable":true,"example":"google"},"website":{"type":"string","nullable":true,"example":"https://acme.com"},"segment":{"type":"string","nullable":true,"example":"tecnologia"},"contactName":{"type":"string","nullable":true,"example":"João Silva"},"contactRole":{"type":"string","nullable":true,"example":"Diretor"},"additionalEmails":{"type":"string","nullable":true,"example":"financeiro@acme.com"},"groupName":{"type":"string","nullable":true,"example":"Premium"},"notificationDisabled":{"type":"boolean","example":false},"foreignCustomer":{"type":"boolean","example":false},"createdAt":{"type":"string","nullable":true,"example":"2026-02-18T10:00:00Z"},"updatedAt":{"type":"string","nullable":true,"example":"2026-02-18T10:00:00Z"}},"required":["id","name","email","phone","mobilePhone","company","cpfCnpj","personType","postalCode","address","addressNumber","complement","neighborhood","city","state","stateInscription","municipalInscription","notes","stage","asaasId","source","website","segment","contactName","contactRole","additionalEmails","groupName","notificationDisabled","foreignCustomer","createdAt","updatedAt"]}},"required":["client"]}}}},"404":{"description":"Cliente não encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"Banco não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}},"patch":{"tags":["CRM"],"summary":"Atualizar cliente","description":"Atualiza campos de um cliente.","parameters":[{"schema":{"type":"string","example":"1"},"required":true,"name":"id","in":"path"}],"requestBody":{"description":"Campos a atualizar","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string","format":"email"},"phone":{"type":"string"},"mobilePhone":{"type":"string"},"company":{"type":"string"},"cpfCnpj":{"type":"string"},"personType":{"type":"string"},"postalCode":{"type":"string"},"address":{"type":"string"},"addressNumber":{"type":"string"},"complement":{"type":"string"},"neighborhood":{"type":"string"},"city":{"type":"string"},"state":{"type":"string"},"stateInscription":{"type":"string"},"municipalInscription":{"type":"string"},"notes":{"type":"string"},"source":{"type":"string"},"website":{"type":"string","format":"uri"},"segment":{"type":"string"},"contactName":{"type":"string"},"contactRole":{"type":"string"},"additionalEmails":{"type":"string"},"groupName":{"type":"string"},"notificationDisabled":{"type":"boolean"},"foreignCustomer":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Cliente atualizado","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"409":{"description":"CPF/CNPJ já cadastrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"422":{"description":"CPF/CNPJ inválido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"Erro ao atualizar","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}},"delete":{"tags":["CRM"],"summary":"Excluir cliente","description":"Exclui um cliente pelo ID.","parameters":[{"schema":{"type":"string","example":"1"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Cliente excluído","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"404":{"description":"Cliente não encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"Erro ao excluir","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/clients/{id}/history":{"get":{"tags":["CRM"],"summary":"Histórico do cliente","description":"Retorna histórico de movimentações do cliente via Lola MCP.","parameters":[{"schema":{"type":"string","example":"1"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Histórico do cliente","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/clients/{id}/stage":{"post":{"tags":["CRM"],"summary":"Mover estágio do cliente","description":"Move o cliente para um novo estágio no pipeline.","parameters":[{"schema":{"type":"string","example":"1"},"required":true,"name":"id","in":"path"}],"requestBody":{"description":"Novo estágio","content":{"application/json":{"schema":{"type":"object","properties":{"new_stage":{"type":"string","enum":["lead","prospect","negotiation","won","lost","churned"],"example":"prospect"},"notes":{"type":"string","example":"Cliente optou por concorrente"}},"required":["new_stage"]}}}},"responses":{"200":{"description":"Estágio atualizado","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Erro ao mover","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/finance/accounts":{"get":{"tags":["Financeiro"],"summary":"Listar contas","description":"Retorna contas financeiras com filtro por tipo e status.","parameters":[{"schema":{"type":"string","enum":["bank","credit_card","cash","investment","digital"]},"required":false,"name":"type","in":"query"},{"schema":{"type":"string","enum":["true","false"]},"required":false,"name":"is_active","in":"query"}],"responses":{"200":{"description":"Lista de contas","content":{"application/json":{"schema":{"type":"object","properties":{"accounts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","example":1},"name":{"type":"string","example":"Itaú PJ"},"type":{"type":"string","example":"bank"},"bankName":{"type":"string","nullable":true,"example":"Itaú"},"currentBalance":{"type":"string","example":"15000.00"},"currency":{"type":"string","example":"BRL"},"isActive":{"type":"boolean","example":true},"createdAt":{"type":"string","nullable":true,"example":"2026-02-18T10:00:00Z"}},"required":["id","name","type","bankName","currentBalance","currency","isActive","createdAt"]}}},"required":["accounts"]}}}},"503":{"description":"Banco não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}},"post":{"tags":["Financeiro"],"summary":"Criar conta","description":"Cria uma conta financeira via Lola MCP.","requestBody":{"description":"Dados da conta","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"example":"Itaú PJ"},"type":{"type":"string","enum":["bank","credit_card","cash","investment","digital"],"example":"bank"},"bank_name":{"type":"string"},"initial_balance":{"type":"number","example":15000},"currency":{"type":"string"}},"required":["name","type"]}}}},"responses":{"201":{"description":"Conta criada","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/finance/accounts/{id}":{"patch":{"tags":["Financeiro"],"summary":"Atualizar conta","description":"Atualiza uma conta financeira via Lola MCP.","parameters":[{"schema":{"type":"string","example":"1"},"required":true,"name":"id","in":"path"}],"requestBody":{"description":"Campos a atualizar","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"bank_name":{"type":"string"},"current_balance":{"type":"number"},"is_active":{"type":"boolean"},"notes":{"type":"string"}}}}}},"responses":{"200":{"description":"Conta atualizada","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/finance/categories":{"get":{"tags":["Financeiro"],"summary":"Listar categorias","description":"Retorna categorias financeiras com filtro por tipo.","parameters":[{"schema":{"type":"string","enum":["revenue","expense","both"]},"required":false,"name":"type","in":"query"}],"responses":{"200":{"description":"Lista de categorias","content":{"application/json":{"schema":{"type":"object","properties":{"categories":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","example":1},"name":{"type":"string","example":"Infraestrutura"},"type":{"type":"string","example":"expense"},"parentId":{"type":"number","nullable":true,"example":null},"dreGroup":{"type":"string","nullable":true,"example":"despesa_fixa"},"icon":{"type":"string","nullable":true},"color":{"type":"string","nullable":true},"sortOrder":{"type":"number","nullable":true}},"required":["id","name","type","parentId","dreGroup","icon","color","sortOrder"]}}},"required":["categories"]}}}},"503":{"description":"Banco não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}},"post":{"tags":["Financeiro"],"summary":"Criar categoria","description":"Cria uma categoria financeira via Lola MCP.","requestBody":{"description":"Dados da categoria","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"example":"Infraestrutura"},"type":{"type":"string","enum":["revenue","expense","both"],"example":"expense"},"parent_id":{"type":"number"},"dre_group":{"type":"string","enum":["receita_operacional","receita_financeira","cpm","despesa_fixa","despesa_variavel"]},"icon":{"type":"string"},"color":{"type":"string"}},"required":["name","type"]}}}},"responses":{"201":{"description":"Categoria criada","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/finance/transactions":{"get":{"tags":["Financeiro"],"summary":"Listar transações","description":"Retorna transações financeiras com filtros por período, conta, categoria, tipo e status.","parameters":[{"schema":{"type":"string","enum":["revenue","expense","transfer"]},"required":false,"name":"type","in":"query"},{"schema":{"type":"string","enum":["pending","paid","overdue","cancelled"]},"required":false,"name":"status","in":"query"},{"schema":{"type":"string"},"required":false,"name":"account_id","in":"query"},{"schema":{"type":"string"},"required":false,"name":"category_id","in":"query"},{"schema":{"type":"string","example":"2026-02-01"},"required":false,"name":"date_from","in":"query"},{"schema":{"type":"string","example":"2026-02-28"},"required":false,"name":"date_to","in":"query"},{"schema":{"type":"string","example":"50"},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Lista de transações","content":{"application/json":{"schema":{"type":"object","properties":{"transactions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","example":1},"type":{"type":"string","example":"expense"},"amount":{"type":"string","example":"150.00"},"description":{"type":"string","nullable":true,"example":"Servidor Contabo"},"accountId":{"type":"number","nullable":true,"example":1},"categoryId":{"type":"number","nullable":true,"example":3},"transactionDate":{"type":"string","nullable":true,"example":"2026-02-18"},"dueDate":{"type":"string","nullable":true,"example":"2026-02-28"},"paidDate":{"type":"string","nullable":true},"status":{"type":"string","example":"pending"},"tags":{"type":"string","nullable":true},"createdAt":{"type":"string","nullable":true,"example":"2026-02-18T10:00:00Z"}},"required":["id","type","amount","description","accountId","categoryId","transactionDate","dueDate","paidDate","status","tags","createdAt"]}}},"required":["transactions"]}}}},"503":{"description":"Banco não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}},"post":{"tags":["Financeiro"],"summary":"Criar transação","description":"Cria um lançamento financeiro via Lola MCP. Suporta parcelamento.","requestBody":{"description":"Dados da transação","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","enum":["revenue","expense","transfer"],"example":"expense"},"amount":{"type":"number","minimum":0,"exclusiveMinimum":true,"example":150},"account_id":{"type":"number","example":1},"description":{"type":"string","example":"Servidor Contabo"},"category_id":{"type":"number"},"client_id":{"type":"number"},"transaction_date":{"type":"string","example":"2026-02-18"},"due_date":{"type":"string"},"status":{"type":"string","enum":["pending","paid","overdue","cancelled"]},"tags":{"type":"string"},"installment_total":{"type":"number"}},"required":["type","amount","account_id"]}}}},"responses":{"201":{"description":"Transação criada","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/finance/transactions/{id}":{"patch":{"tags":["Financeiro"],"summary":"Atualizar transação","description":"Atualiza um lançamento financeiro via Lola MCP.","parameters":[{"schema":{"type":"string","example":"1"},"required":true,"name":"id","in":"path"}],"requestBody":{"description":"Campos a atualizar","content":{"application/json":{"schema":{"type":"object","properties":{"description":{"type":"string"},"category_id":{"type":"number"},"status":{"type":"string","enum":["pending","paid","overdue","cancelled"]},"due_date":{"type":"string"},"paid_date":{"type":"string"},"tags":{"type":"string"},"notes":{"type":"string"}}}}}},"responses":{"200":{"description":"Transação atualizada","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}},"delete":{"tags":["Financeiro"],"summary":"Excluir transação","description":"Exclui um lançamento financeiro via Lola MCP.","parameters":[{"schema":{"type":"string","example":"1"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Transação excluída","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/finance/credit-cards":{"get":{"tags":["Financeiro - Cartões e Dívidas"],"summary":"Listar cartões de crédito","description":"Retorna cartões de crédito cadastrados.","parameters":[{"schema":{"type":"string","enum":["true","false"]},"required":false,"name":"is_active","in":"query"}],"responses":{"200":{"description":"Lista de cartões","content":{"application/json":{"schema":{"type":"object","properties":{"credit_cards":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","example":1},"name":{"type":"string","example":"Clara Card Visa"},"accountId":{"type":"number","nullable":true,"example":1},"brand":{"type":"string","nullable":true,"example":"Visa"},"lastDigits":{"type":"string","nullable":true,"example":"4321"},"closingDay":{"type":"number","example":25},"dueDay":{"type":"number","example":5},"creditLimit":{"type":"string","nullable":true,"example":"10000.00"},"isActive":{"type":"boolean","example":true},"createdAt":{"type":"string","nullable":true,"example":"2026-02-18T10:00:00Z"}},"required":["id","name","accountId","brand","lastDigits","closingDay","dueDay","creditLimit","isActive","createdAt"]}}},"required":["credit_cards"]}}}},"503":{"description":"Banco não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}},"post":{"tags":["Financeiro - Cartões e Dívidas"],"summary":"Criar cartão de crédito","description":"Cadastra um cartão de crédito via Lola MCP.","requestBody":{"description":"Dados do cartão","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"example":"Clara Card Visa"},"account_id":{"type":"number","example":1},"closing_day":{"type":"number","minimum":1,"maximum":31,"example":25},"due_day":{"type":"number","minimum":1,"maximum":31,"example":5},"brand":{"type":"string","example":"Visa"},"last_digits":{"type":"string","example":"4321"},"credit_limit":{"type":"number","example":10000}},"required":["name","account_id","closing_day","due_day"]}}}},"responses":{"201":{"description":"Cartão criado","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/finance/credit-cards/{id}/statement":{"get":{"tags":["Financeiro - Cartões e Dívidas"],"summary":"Fatura do cartão","description":"Retorna fatura de um mês específico via Lola MCP.","parameters":[{"schema":{"type":"string","example":"1"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","example":"2026-02"},"required":true,"name":"month","in":"query"}],"responses":{"200":{"description":"Fatura do cartão","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/finance/debts":{"get":{"tags":["Financeiro - Cartões e Dívidas"],"summary":"Listar dívidas","description":"Retorna dívidas com filtros por status e tipo.","parameters":[{"schema":{"type":"string","enum":["ativa","renegociada","quitada","inadimplente"]},"required":false,"name":"status","in":"query"},{"schema":{"type":"string","enum":["emprestimo","financiamento","fornecedor","tributaria","cartao","outro"]},"required":false,"name":"tipo","in":"query"}],"responses":{"200":{"description":"Lista de dívidas","content":{"application/json":{"schema":{"type":"object","properties":{"debts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","example":1},"credor":{"type":"string","example":"Banco do Brasil"},"tipo":{"type":"string","example":"emprestimo"},"valorOriginal":{"type":"string","example":"50000.00"},"saldoAtual":{"type":"string","nullable":true,"example":"35000.00"},"taxaJurosMes":{"type":"string","nullable":true,"example":"1.5000"},"valorParcela":{"type":"string","nullable":true,"example":"2500.00"},"parcelasTotal":{"type":"number","nullable":true,"example":24},"parcelasPagas":{"type":"number","nullable":true,"example":6},"status":{"type":"string","example":"ativa"},"createdAt":{"type":"string","nullable":true,"example":"2026-02-18T10:00:00Z"}},"required":["id","credor","tipo","valorOriginal","saldoAtual","taxaJurosMes","valorParcela","parcelasTotal","parcelasPagas","status","createdAt"]}}},"required":["debts"]}}}},"503":{"description":"Banco não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}},"post":{"tags":["Financeiro - Cartões e Dívidas"],"summary":"Criar dívida","description":"Cadastra uma dívida via Lola MCP. Gera parcelas automaticamente.","requestBody":{"description":"Dados da dívida","content":{"application/json":{"schema":{"type":"object","properties":{"credor":{"type":"string","minLength":1,"example":"Banco do Brasil"},"valor_original":{"type":"number","minimum":0,"exclusiveMinimum":true,"example":50000},"tipo":{"type":"string","enum":["emprestimo","financiamento","fornecedor","tributaria","cartao","outro"],"example":"emprestimo"},"parcelas_total":{"type":"number","example":24},"taxa_juros_mes":{"type":"number","example":1.5},"valor_parcela":{"type":"number"},"dia_vencimento":{"type":"number","minimum":1,"maximum":31},"account_id":{"type":"number"},"notes":{"type":"string"}},"required":["credor","valor_original","tipo"]}}}},"responses":{"201":{"description":"Dívida criada","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/finance/debts/summary":{"get":{"tags":["Financeiro - Cartões e Dívidas"],"summary":"Dashboard de dívidas","description":"Retorna visão consolidada de endividamento via Lola MCP.","responses":{"200":{"description":"Dashboard de dívidas","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/finance/debts/{id}":{"patch":{"tags":["Financeiro - Cartões e Dívidas"],"summary":"Atualizar dívida","description":"Atualiza uma dívida via Lola MCP.","parameters":[{"schema":{"type":"string","example":"1"},"required":true,"name":"id","in":"path"}],"requestBody":{"description":"Campos a atualizar","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["ativa","renegociada","quitada","inadimplente"]},"saldo_atual":{"type":"number"},"taxa_juros_mes":{"type":"number"},"valor_parcela":{"type":"number"},"notes":{"type":"string"}}}}}},"responses":{"200":{"description":"Dívida atualizada","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/finance/debts/installments/{id}/pay":{"post":{"tags":["Financeiro - Cartões e Dívidas"],"summary":"Pagar parcela","description":"Registra pagamento de parcela de dívida via Lola MCP.","parameters":[{"schema":{"type":"string","example":"1"},"required":true,"name":"id","in":"path"}],"requestBody":{"description":"Dados do pagamento","content":{"application/json":{"schema":{"type":"object","properties":{"valor_pago":{"type":"number"},"data_pagamento":{"type":"string","example":"2026-02-18"}}}}}},"responses":{"200":{"description":"Parcela paga","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/finance/reports/dre":{"get":{"tags":["Financeiro - Relatórios"],"summary":"DRE - Demonstrativo de Resultado","description":"Gera DRE gerencial por período via Lola MCP.","parameters":[{"schema":{"type":"string","example":"2026-01-01"},"required":true,"name":"start_date","in":"query"},{"schema":{"type":"string","example":"2026-02-28"},"required":true,"name":"end_date","in":"query"}],"responses":{"200":{"description":"DRE gerado","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/finance/reports/cashflow":{"get":{"tags":["Financeiro - Relatórios"],"summary":"Fluxo de Caixa","description":"Gera fluxo de caixa por período via Lola MCP.","parameters":[{"schema":{"type":"string","example":"2026-02-01"},"required":true,"name":"start_date","in":"query"},{"schema":{"type":"string","example":"2026-02-28"},"required":true,"name":"end_date","in":"query"}],"responses":{"200":{"description":"Fluxo de caixa","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/finance/reports/summary":{"get":{"tags":["Financeiro - Relatórios"],"summary":"Resumo Mensal","description":"Gera resumo financeiro de um mês via Lola MCP.","parameters":[{"schema":{"type":"string","example":"2"},"required":true,"name":"month","in":"query"},{"schema":{"type":"string","example":"2026"},"required":true,"name":"year","in":"query"}],"responses":{"200":{"description":"Resumo mensal","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/finance/reports/balance-sheet":{"get":{"tags":["Financeiro - Relatórios"],"summary":"Balanço Patrimonial","description":"Gera balanço patrimonial em data de referência via Lola MCP.","parameters":[{"schema":{"type":"string","example":"2026-02-28"},"required":false,"name":"reference_date","in":"query"}],"responses":{"200":{"description":"Balanço patrimonial","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/finance/reports/indicators":{"get":{"tags":["Financeiro - Relatórios"],"summary":"Indicadores Financeiros (KPIs)","description":"Calcula KPIs financeiros do mês via Lola MCP.","parameters":[{"schema":{"type":"string","example":"2"},"required":false,"name":"month","in":"query"},{"schema":{"type":"string","example":"2026"},"required":false,"name":"year","in":"query"}],"responses":{"200":{"description":"Indicadores financeiros","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/finance/reports/revenue-by-client":{"get":{"tags":["Financeiro - Relatórios"],"summary":"Receita por Cliente","description":"Relatório de receita agrupada por cliente via Lola MCP.","parameters":[{"schema":{"type":"string","example":"2026-01-01"},"required":false,"name":"date_from","in":"query"},{"schema":{"type":"string","example":"2026-02-28"},"required":false,"name":"date_to","in":"query"}],"responses":{"200":{"description":"Receita por cliente","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/finance/reports/upcoming-bills":{"get":{"tags":["Financeiro - Relatórios"],"summary":"Contas a Pagar","description":"Lista contas a vencer nos próximos dias via Lola MCP.","parameters":[{"schema":{"type":"string","example":"7"},"required":false,"name":"days","in":"query"}],"responses":{"200":{"description":"Contas a pagar","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/finance/reports/analysis":{"get":{"tags":["Financeiro - Relatórios"],"summary":"Análise Financeira Preditiva","description":"Análise financeira com diagnóstico, alertas e recomendações via Lola MCP.","parameters":[{"schema":{"type":"string","example":"3"},"required":false,"name":"months","in":"query"}],"responses":{"200":{"description":"Análise financeira","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/members":{"get":{"tags":["Membros e Cargos"],"summary":"Listar membros","description":"Lista membros da organização com filtros opcionais.","parameters":[{"schema":{"type":"string","enum":["active","blocked","removed","invited","expired"],"example":"active"},"required":false,"name":"status","in":"query"},{"schema":{"type":"string","example":"admin"},"required":false,"name":"role","in":"query"},{"schema":{"type":"string","example":"50"},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Lista de membros","content":{"application/json":{"schema":{"type":"object","properties":{"members":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","example":1},"email":{"type":"string","example":"hugo@nimbuslab.com.br"},"name":{"type":"string","nullable":true,"example":"Hugo Dias"},"image":{"type":"string","nullable":true,"example":"https://lh3.googleusercontent.com/a/..."},"role":{"type":"string","example":"owner"},"status":{"type":"string","nullable":true,"example":"active"},"signupMethod":{"type":"string","example":"google"},"lastLoginAt":{"type":"string","nullable":true,"example":"2026-02-18T10:00:00Z"},"addedAt":{"type":"string","nullable":true,"example":"2026-01-01T00:00:00Z"}},"required":["id","email","name","image","role","status","signupMethod","lastLoginAt","addedAt"]}},"total":{"type":"number"}},"required":["members","total"]}}}},"503":{"description":"Banco de dados não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/members/{id}":{"get":{"tags":["Membros e Cargos"],"summary":"Detalhe do membro","description":"Retorna dados de um membro específico.","parameters":[{"schema":{"type":"string","example":"1"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Membro encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"number","example":1},"email":{"type":"string","example":"hugo@nimbuslab.com.br"},"name":{"type":"string","nullable":true,"example":"Hugo Dias"},"image":{"type":"string","nullable":true,"example":"https://lh3.googleusercontent.com/a/..."},"role":{"type":"string","example":"owner"},"status":{"type":"string","nullable":true,"example":"active"},"signupMethod":{"type":"string","example":"google"},"lastLoginAt":{"type":"string","nullable":true,"example":"2026-02-18T10:00:00Z"},"addedAt":{"type":"string","nullable":true,"example":"2026-01-01T00:00:00Z"}},"required":["id","email","name","image","role","status","signupMethod","lastLoginAt","addedAt"]}}}},"404":{"description":"Membro não encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"Banco de dados não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/members/{id}/role":{"patch":{"tags":["Membros e Cargos"],"summary":"Alterar cargo do membro","description":"Promove ou rebaixa o cargo de um membro via Lola MCP. Requer admin+.","parameters":[{"schema":{"type":"string","example":"1"},"required":true,"name":"id","in":"path"}],"requestBody":{"description":"Novo cargo","content":{"application/json":{"schema":{"type":"object","properties":{"role":{"type":"string","example":"admin"}},"required":["role"]}}}},"responses":{"200":{"description":"Cargo atualizado","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/roles":{"get":{"tags":["Membros e Cargos"],"summary":"Listar cargos disponíveis","description":"Lista os cargos (roles) disponíveis na organização via Lola MCP.","responses":{"200":{"description":"Lista de cargos","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/members/{id}/status":{"patch":{"tags":["Membros e Cargos"],"summary":"Suspender ou restaurar membro","description":"Altera status de um membro (suspend/restore) via Lola MCP.","parameters":[{"schema":{"type":"string","example":"1"},"required":true,"name":"id","in":"path"}],"requestBody":{"description":"Ação de status","content":{"application/json":{"schema":{"type":"object","properties":{"action":{"type":"string","enum":["suspend","restore"],"example":"suspend"}},"required":["action"]}}}},"responses":{"200":{"description":"Status atualizado","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"503":{"description":"Lola MCP não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/members/invite":{"post":{"tags":["Membros e Cargos"],"summary":"Convidar novo membro","description":"Convida um novo membro para a organização por email e cargo.","requestBody":{"description":"Dados do convite","content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"novo@empresa.com"},"role":{"type":"string","example":"user"}},"required":["email","role"]}}}},"responses":{"201":{"description":"Membro convidado","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"number","example":1},"email":{"type":"string","example":"hugo@nimbuslab.com.br"},"name":{"type":"string","nullable":true,"example":"Hugo Dias"},"image":{"type":"string","nullable":true,"example":"https://lh3.googleusercontent.com/a/..."},"role":{"type":"string","example":"owner"},"status":{"type":"string","nullable":true,"example":"active"},"signupMethod":{"type":"string","example":"google"},"lastLoginAt":{"type":"string","nullable":true,"example":"2026-02-18T10:00:00Z"},"addedAt":{"type":"string","nullable":true,"example":"2026-01-01T00:00:00Z"}},"required":["id","email","name","image","role","status","signupMethod","lastLoginAt","addedAt"]}}}},"409":{"description":"Membro já existe","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"Banco de dados não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/members/{id}/resend-invite":{"post":{"tags":["Membros e Cargos"],"summary":"Reenviar convite","description":"Reenvia o convite para um membro pendente, resetando a data de criação.","parameters":[{"schema":{"type":"string","example":"1"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Convite reenviado","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"number","example":1},"email":{"type":"string","example":"hugo@nimbuslab.com.br"},"name":{"type":"string","nullable":true,"example":"Hugo Dias"},"image":{"type":"string","nullable":true,"example":"https://lh3.googleusercontent.com/a/..."},"role":{"type":"string","example":"owner"},"status":{"type":"string","nullable":true,"example":"active"},"signupMethod":{"type":"string","example":"google"},"lastLoginAt":{"type":"string","nullable":true,"example":"2026-02-18T10:00:00Z"},"addedAt":{"type":"string","nullable":true,"example":"2026-01-01T00:00:00Z"}},"required":["id","email","name","image","role","status","signupMethod","lastLoginAt","addedAt"]}}}},"400":{"description":"Membro não está com status invited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"404":{"description":"Membro não encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"Banco de dados não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/members/{id}/invite":{"delete":{"tags":["Membros e Cargos"],"summary":"Cancelar convite","description":"Cancela e remove um convite pendente.","parameters":[{"schema":{"type":"string","example":"1"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Convite cancelado","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"400":{"description":"Membro não está com status invited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"404":{"description":"Membro não encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"Banco de dados não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/members/{id}/audit":{"get":{"tags":["Membros e Cargos"],"summary":"Histórico de ações do membro","description":"Retorna o log de ações realizadas sobre um membro.","parameters":[{"schema":{"type":"string","example":"1"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Histórico de ações","content":{"application/json":{"schema":{"type":"object","properties":{"entries":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"action":{"type":"string"},"details":{"type":"string","nullable":true},"performedBy":{"type":"string","nullable":true},"createdAt":{"type":"string","nullable":true}},"required":["id","action","details","performedBy","createdAt"]}}},"required":["entries"]}}}},"503":{"description":"Banco de dados não disponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/waitlist":{"get":{"tags":["Waitlist"],"summary":"Listar waitlist","description":"Retorna emails cadastrados na lista de espera.","parameters":[{"schema":{"type":"string","enum":["pending","invited","active"]},"required":false,"name":"status","in":"query"},{"schema":{"type":"string","example":"dev@"},"required":false,"name":"search","in":"query"}],"responses":{"200":{"description":"Lista de espera","content":{"application/json":{"schema":{"type":"object","properties":{"entries":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","example":1},"email":{"type":"string","example":"dev@example.com"},"name":{"type":"string","nullable":true,"example":"Joao"},"clientType":{"type":"string","nullable":true,"example":"claude-code"},"status":{"type":"string","example":"pending"},"createdAt":{"type":"string","nullable":true,"example":"2026-02-18T10:00:00Z"}},"required":["id","email","name","clientType","status","createdAt"]}},"total":{"type":"number"}},"required":["entries","total"]}}}},"503":{"description":"Banco nao configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/waitlist/{id}/status":{"patch":{"tags":["Waitlist"],"summary":"Atualizar status de entrada na waitlist","parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"description":"Novo status","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["pending","invited","active"]}},"required":["status"]}}}},"responses":{"200":{"description":"Status atualizado","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"number","example":1},"email":{"type":"string","example":"dev@example.com"},"name":{"type":"string","nullable":true,"example":"Joao"},"clientType":{"type":"string","nullable":true,"example":"claude-code"},"status":{"type":"string","example":"pending"},"createdAt":{"type":"string","nullable":true,"example":"2026-02-18T10:00:00Z"}},"required":["id","email","name","clientType","status","createdAt"]}}}},"404":{"description":"Entrada nao encontrada","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"Banco nao configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/waitlist/{id}/invite-beta":{"post":{"tags":["Waitlist"],"summary":"Convidar entrada da waitlist para beta via Lola MCP","parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"201":{"description":"Convite enviado","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"400":{"description":"Erro na operacao","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"404":{"description":"Entrada nao encontrada","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"MCP ou banco nao configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/beta-testers":{"get":{"tags":["Beta Testers"],"summary":"Listar beta testers (lola_external)","responses":{"200":{"description":"Lista de beta testers","content":{"application/json":{"schema":{"type":"object","properties":{"testers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"email":{"type":"string"},"name":{"type":"string","nullable":true},"role":{"type":"string"},"status":{"type":"string"},"signupMethod":{"type":"string"},"betaExpiresAt":{"type":"string","nullable":true},"createdAt":{"type":"string","nullable":true},"org":{"type":"object","nullable":true,"properties":{"name":{"type":"string"},"slug":{"type":"string"},"plan":{"type":"string","nullable":true}},"required":["name","slug","plan"]},"usage":{"type":"object","properties":{"totalSessions":{"type":"number"},"lastSessionAt":{"type":"string","nullable":true},"totalToolCalls":{"type":"number"},"distinctTools":{"type":"number"}},"required":["totalSessions","lastSessionAt","totalToolCalls","distinctTools"]}},"required":["id","email","name","role","status","signupMethod","betaExpiresAt","createdAt","org","usage"]}},"total":{"type":"number"}},"required":["testers","total"]}}}},"503":{"description":"Banco externo não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/beta-testers/lifecycle-stats":{"get":{"tags":["Beta Testers"],"summary":"KPIs de lifecycle de beta testers","responses":{"200":{"description":"KPIs de ciclo de vida","content":{"application/json":{"schema":{"type":"object","properties":{"atRisk":{"type":"number"},"reminderSent":{"type":"number"},"warningsSent":{"type":"number"},"autoRevoked":{"type":"number"},"reactivated":{"type":"number"},"reactivationRate":{"type":"number"}},"required":["atRisk","reminderSent","warningsSent","autoRevoked","reactivated","reactivationRate"]}}}},"503":{"description":"Banco externo não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/beta-testers/{id}/lifecycle":{"get":{"tags":["Beta Testers"],"summary":"Listar eventos de lifecycle de um beta tester","parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Eventos de lifecycle","content":{"application/json":{"schema":{"type":"object","properties":{"events":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"eventType":{"type":"string"},"details":{"type":"string","nullable":true},"createdAt":{"type":"string","nullable":true}},"required":["id","eventType","details","createdAt"]}}},"required":["events"]}}}},"404":{"description":"Beta tester não encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"Banco externo não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/beta-testers/invite":{"post":{"tags":["Beta Testers"],"summary":"Convidar beta tester via Lola MCP","requestBody":{"description":"Email do beta tester","content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"}},"required":["email"]}}}},"responses":{"201":{"description":"Beta tester convidado","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"400":{"description":"Erro na operação","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"MCP não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/beta-testers/{id}/expiry":{"patch":{"tags":["Beta Testers"],"summary":"Alterar expiração de beta tester","parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"description":"Data de expiração","content":{"application/json":{"schema":{"type":"object","properties":{"betaExpiresAt":{"type":"string","nullable":true,"description":"Nova data de expiração ou null para remover","example":"2026-06-30T23:59:59Z"}},"required":["betaExpiresAt"]}}}},"responses":{"200":{"description":"Expiração atualizada","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"400":{"description":"Erro na operação","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"404":{"description":"Beta tester não encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"MCP ou banco não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/beta-testers/{id}/status":{"patch":{"tags":["Beta Testers"],"summary":"Alterar status de beta tester","parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"description":"Novo status","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["active","invited","expired","blocked"],"description":"Novo status do beta tester","example":"active"}},"required":["status"]}}}},"responses":{"200":{"description":"Status atualizado","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"404":{"description":"Beta tester não encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"Banco não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/beta-testers/{id}":{"delete":{"tags":["Beta Testers"],"summary":"Revogar acesso de beta tester","parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Acesso revogado","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"400":{"description":"Erro na operação","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"404":{"description":"Beta tester não encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"MCP ou banco não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/metrics/overview":{"get":{"tags":["Metrics"],"summary":"KPIs de uso da plataforma","parameters":[{"schema":{"type":"string","enum":["all","internal","external","beta"],"default":"all","example":"all"},"required":false,"name":"scope","in":"query"}],"responses":{"200":{"description":"KPIs de uso","content":{"application/json":{"schema":{"type":"object","properties":{"dau":{"type":"number"},"wau":{"type":"number"},"mau":{"type":"number"},"stickiness":{"type":"number"},"totalCalls":{"type":"number"},"activeBetaTesters":{"type":"number"},"activeSessions":{"type":"number"}},"required":["dau","wau","mau","stickiness","totalCalls","activeBetaTesters","activeSessions"]}}}},"500":{"description":"Erro interno","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"Banco externo não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/metrics/activity":{"get":{"tags":["Metrics"],"summary":"Atividade diária (tool calls + usuários + sessões)","parameters":[{"schema":{"type":"string","default":"30d","example":"30d"},"required":false,"name":"range","in":"query"},{"schema":{"type":"string","enum":["all","internal","external","beta"],"default":"all","example":"all"},"required":false,"name":"scope","in":"query"}],"responses":{"200":{"description":"Time-series de atividade","content":{"application/json":{"schema":{"type":"object","properties":{"series":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string"},"calls":{"type":"number"},"users":{"type":"number"},"sessions":{"type":"number"}},"required":["date","calls","users","sessions"]}}},"required":["series"]}}}},"500":{"description":"Erro interno","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"Banco externo não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/metrics/top-tools":{"get":{"tags":["Metrics"],"summary":"Ranking de tools mais usadas","parameters":[{"schema":{"type":"string","default":"30d","example":"30d"},"required":false,"name":"range","in":"query"},{"schema":{"type":"string","enum":["all","internal","external","beta"],"default":"all","example":"all"},"required":false,"name":"scope","in":"query"},{"schema":{"type":"string","example":"10"},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Ranking de tools","content":{"application/json":{"schema":{"type":"object","properties":{"tools":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"calls":{"type":"number"},"users":{"type":"number"}},"required":["name","calls","users"]}}},"required":["tools"]}}}},"500":{"description":"Erro interno","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"Banco externo não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/metrics/beta-activity":{"get":{"tags":["Metrics"],"summary":"Atividade por beta tester com evolução diária","parameters":[{"schema":{"type":"string","default":"30d","example":"30d"},"required":false,"name":"range","in":"query"},{"schema":{"type":"string","enum":["all","internal","external","beta"],"default":"all","example":"all"},"required":false,"name":"scope","in":"query"}],"responses":{"200":{"description":"Atividade de beta testers","content":{"application/json":{"schema":{"type":"object","properties":{"testers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"email":{"type":"string"},"name":{"type":"string","nullable":true},"role":{"type":"string"},"totalCalls":{"type":"number"},"lastSessionAt":{"type":"string","nullable":true},"dailyCalls":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string"},"calls":{"type":"number"}},"required":["date","calls"]}}},"required":["id","email","name","role","totalCalls","lastSessionAt","dailyCalls"]}}},"required":["testers"]}}}},"500":{"description":"Erro interno","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"Banco externo não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/agent-runs/overview":{"get":{"tags":["Agent Runs"],"summary":"KPIs gerais de agent runs","parameters":[{"schema":{"type":"string","default":"30d","example":"30d"},"required":false,"name":"range","in":"query"},{"schema":{"type":"string","enum":["all","success","failed"],"default":"all","example":"all"},"required":false,"name":"status","in":"query"}],"responses":{"200":{"description":"KPIs de agent runs","content":{"application/json":{"schema":{"type":"object","properties":{"totalRuns":{"type":"integer"},"successRuns":{"type":"integer"},"failedRuns":{"type":"integer"},"successRate":{"type":"number"},"totalCostUsd":{"type":"number"},"avgCostUsd":{"type":"number"},"totalTokens":{"type":"integer"},"avgTurns":{"type":"number"},"avgDurationMs":{"type":"number"}},"required":["totalRuns","successRuns","failedRuns","successRate","totalCostUsd","avgCostUsd","totalTokens","avgTurns","avgDurationMs"]}}}},"500":{"description":"Erro interno","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"Banco externo não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/agent-runs":{"get":{"tags":["Agent Runs"],"summary":"Lista paginada de agent runs","parameters":[{"schema":{"type":"string","default":"30d","example":"30d"},"required":false,"name":"range","in":"query"},{"schema":{"type":"string","enum":["all","success","failed"],"default":"all","example":"all"},"required":false,"name":"status","in":"query"},{"schema":{"type":"string","example":"50"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","example":"0"},"required":false,"name":"offset","in":"query"}],"responses":{"200":{"description":"Lista de agent runs","content":{"application/json":{"schema":{"type":"object","properties":{"runs":{"type":"array","items":{"type":"object","properties":{"runId":{"type":"string"},"memberId":{"type":"integer","nullable":true},"memberEmail":{"type":"string","nullable":true},"prompt":{"type":"string","nullable":true},"turns":{"type":"integer"},"toolsUsed":{"type":"array","items":{"type":"string"}},"model":{"type":"string","nullable":true},"inputTokens":{"type":"integer"},"outputTokens":{"type":"integer"},"costUsd":{"type":"number"},"success":{"type":"boolean"},"quotaHit":{"type":"boolean"},"durationMs":{"type":"integer"},"createdAt":{"type":"string","nullable":true},"completedAt":{"type":"string","nullable":true}},"required":["runId","memberId","memberEmail","prompt","turns","toolsUsed","model","inputTokens","outputTokens","costUsd","success","quotaHit","durationMs","createdAt","completedAt"]}},"total":{"type":"integer"}},"required":["runs","total"]}}}},"500":{"description":"Erro interno","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"Banco externo não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/audit":{"get":{"tags":["Audit"],"summary":"Listar log de auditoria","description":"Retorna registros de auditoria de operações de escrita. Requer permissão settings:read (owner/admin).","parameters":[{"schema":{"type":"string","example":"50"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","example":"clients"},"required":false,"name":"resource_type","in":"query"},{"schema":{"type":"string","example":"hugo@nimbuslab.com.br"},"required":false,"name":"user_email","in":"query"},{"schema":{"type":"string","example":"2026-02-01"},"required":false,"name":"from","in":"query"},{"schema":{"type":"string","example":"2026-02-28"},"required":false,"name":"to","in":"query"}],"responses":{"200":{"description":"Lista de registros de auditoria","content":{"application/json":{"schema":{"type":"object","properties":{"entries":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"userId":{"type":"string","nullable":true},"userEmail":{"type":"string","nullable":true},"method":{"type":"string"},"path":{"type":"string"},"statusCode":{"type":"number","nullable":true},"action":{"type":"string","nullable":true},"resourceType":{"type":"string","nullable":true},"resourceId":{"type":"string","nullable":true},"ipAddress":{"type":"string","nullable":true},"durationMs":{"type":"number","nullable":true},"createdAt":{"type":"string","nullable":true}},"required":["id","userId","userEmail","method","path","statusCode","action","resourceType","resourceId","ipAddress","durationMs","createdAt"]}},"total":{"type":"number"}},"required":["entries","total"]}}}},"403":{"description":"Sem permissão","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/uploads/presign":{"post":{"tags":["Uploads"],"summary":"Gerar URL presigned para upload","description":"Retorna uma URL presigned para upload direto ao R2 e a URL publica final do arquivo.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"filename":{"type":"string","minLength":1,"maxLength":255,"example":"screenshot.png"},"contentType":{"type":"string","minLength":1,"example":"image/png"}},"required":["filename","contentType"]}}}},"responses":{"200":{"description":"URL presigned gerada","content":{"application/json":{"schema":{"type":"object","properties":{"uploadUrl":{"type":"string","format":"uri","example":"https://...presigned"},"publicUrl":{"type":"string","format":"uri","example":"https://uploads.nimbuslab.com.br/uploads/abc123-screenshot.png"},"key":{"type":"string","example":"uploads/abc123-screenshot.png"}},"required":["uploadUrl","publicUrl","key"]}}}},"400":{"description":"Tipo de arquivo nao permitido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"R2 nao configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/uploads/presign-avatar":{"post":{"tags":["Uploads"],"summary":"Gerar URL presigned para avatar","description":"Retorna URL presigned para upload de avatar no R2 (pasta avatars).","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"filename":{"type":"string","minLength":1,"maxLength":255,"example":"avatar.png"},"contentType":{"type":"string","minLength":1,"example":"image/png"}},"required":["filename","contentType"]}}}},"responses":{"200":{"description":"URL presigned gerada","content":{"application/json":{"schema":{"type":"object","properties":{"uploadUrl":{"type":"string","format":"uri"},"publicUrl":{"type":"string","format":"uri"},"key":{"type":"string"}},"required":["uploadUrl","publicUrl","key"]}}}},"400":{"description":"Tipo de arquivo nao permitido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"401":{"description":"Nao autenticado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"R2 nao configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/deploys/projects":{"get":{"tags":["Deploys"],"summary":"Listar projetos Dokploy","description":"Retorna projetos Dokploy com suas aplicações.","responses":{"200":{"description":"Lista de projetos","content":{"application/json":{"schema":{"type":"object","properties":{"projects":{"type":"array","items":{"type":"object","properties":{"projectId":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"applications":{"type":"array","items":{"type":"object","properties":{"applicationId":{"type":"string"},"name":{"type":"string"},"appName":{"type":"string"},"applicationStatus":{"type":"string","nullable":true},"createdAt":{"type":"string","nullable":true},"projectId":{"type":"string"}},"required":["applicationId","name","appName","projectId"]}}},"required":["projectId","name","applications"]}}},"required":["projects"]}}}},"503":{"description":"Dokploy não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/deploys":{"get":{"tags":["Deploys"],"summary":"Listar deployments","description":"Retorna deployments de uma aplicação Dokploy.","parameters":[{"schema":{"type":"string","example":"abc123"},"required":true,"name":"applicationId","in":"query"},{"schema":{"type":"number","minimum":1,"maximum":100,"default":30},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Lista de deployments","content":{"application/json":{"schema":{"type":"object","properties":{"deployments":{"type":"array","items":{"type":"object","properties":{"deploymentId":{"type":"string"},"title":{"type":"string"},"description":{"type":"string","nullable":true},"status":{"type":"string"},"applicationId":{"type":"string"},"createdAt":{"type":"string","nullable":true},"startedAt":{"type":"string","nullable":true},"finishedAt":{"type":"string","nullable":true},"errorMessage":{"type":"string","nullable":true}},"required":["deploymentId","title","status","applicationId"]}}},"required":["deployments"]}}}},"503":{"description":"Dokploy não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/deploys/all":{"get":{"tags":["Deploys"],"summary":"Listar todos os deployments","description":"Agrega deployments de todas as aplicações.","parameters":[{"schema":{"type":"number","minimum":1,"maximum":200,"default":50},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Todos os deployments","content":{"application/json":{"schema":{"type":"object","properties":{"deployments":{"type":"array","items":{"type":"object","properties":{"deploymentId":{"type":"string"},"title":{"type":"string"},"description":{"type":"string","nullable":true},"status":{"type":"string"},"applicationId":{"type":"string"},"createdAt":{"type":"string","nullable":true},"startedAt":{"type":"string","nullable":true},"finishedAt":{"type":"string","nullable":true},"errorMessage":{"type":"string","nullable":true},"applicationName":{"type":"string"},"projectName":{"type":"string"}},"required":["deploymentId","title","status","applicationId","applicationName","projectName"]}}},"required":["deployments"]}}}},"503":{"description":"Dokploy não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/deploys/history":{"get":{"tags":["Deploys"],"summary":"Historico de deploys agregado por dia","description":"Retorna contagem de deploys por dia para heatmap.","parameters":[{"schema":{"type":"number","minimum":30,"maximum":365,"default":90},"required":false,"name":"days","in":"query"}],"responses":{"200":{"description":"Historico de deploys","content":{"application/json":{"schema":{"type":"object","properties":{"history":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string"},"count":{"type":"number"},"done":{"type":"number"},"error":{"type":"number"}},"required":["date","count","done","error"]}}},"required":["history"]}}}},"503":{"description":"Dokploy não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/deploys/redeploy":{"post":{"tags":["Deploys"],"summary":"Redeploy de aplicação","description":"Dispara um redeploy para uma aplicação Dokploy.","requestBody":{"description":"ID da aplicação","content":{"application/json":{"schema":{"type":"object","properties":{"applicationId":{"type":"string","example":"abc123"}},"required":["applicationId"]}}}},"responses":{"200":{"description":"Redeploy disparado","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"503":{"description":"Dokploy não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/deploys/cancel":{"post":{"tags":["Deploys"],"summary":"Cancelar deployment","description":"Cancela um deployment em andamento.","requestBody":{"description":"ID do deployment","content":{"application/json":{"schema":{"type":"object","properties":{"deploymentId":{"type":"string","example":"deploy-abc123"}},"required":["deploymentId"]}}}},"responses":{"200":{"description":"Deployment cancelado","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"503":{"description":"Dokploy não configurado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/messages":{"get":{"tags":["Inbox"],"summary":"Listar mensagens do inbox","parameters":[{"schema":{"type":"string","pattern":"^\\d+$"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","pattern":"^\\d+$"},"required":false,"name":"offset","in":"query"},{"schema":{"type":"string"},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"string","enum":["true","false"]},"required":false,"name":"unread_only","in":"query"},{"schema":{"type":"string"},"required":false,"name":"type","in":"query"},{"schema":{"type":"string"},"required":false,"name":"priority","in":"query"}],"responses":{"200":{"description":"Mensagens do inbox","content":{"application/json":{"schema":{"type":"object","properties":{"messages":{"type":"array","items":{"type":"object","properties":{"id":{"anyOf":[{"type":"number"},{"type":"string"}]},"subject":{"type":"string"},"content":{"type":"string"},"senderId":{"type":"string","nullable":true},"senderName":{"type":"string"},"senderEmail":{"type":"string","nullable":true},"recipientId":{"type":"string","nullable":true},"recipientName":{"type":"string","nullable":true},"recipientEmail":{"type":"string","nullable":true},"priority":{"type":"string","nullable":true},"type":{"type":"string","nullable":true},"project":{"type":"string","nullable":true},"readAt":{"type":"string","nullable":true},"editedAt":{"type":"string","nullable":true},"createdAt":{"type":"string","nullable":true}},"required":["id","subject","content","senderId","senderName","senderEmail","recipientId","recipientName","recipientEmail","priority","type","project","readAt","editedAt","createdAt"]}},"total":{"type":"number"},"unreadCount":{"type":"number"},"nextCursor":{"type":"string","nullable":true}},"required":["messages","total","unreadCount"]}}}},"401":{"description":"Não autenticado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}},"post":{"tags":["Inbox"],"summary":"Enviar mensagem","description":"Envia mensagem individual ou broadcast (owner/admin).","requestBody":{"description":"Dados da mensagem","content":{"application/json":{"schema":{"type":"object","properties":{"to":{"type":"string","description":"Email ou username do destinatário, ou 'broadcast' para todos"},"subject":{"type":"string"},"content":{"type":"string"},"type":{"type":"string","enum":["general","support","operational","financial","announcement"]},"priority":{"type":"string","enum":["low","normal","high","urgent"]},"replyTo":{"type":"number","description":"ID da mensagem original (para threads)"}},"required":["to","content"]}}}},"responses":{"200":{"description":"Mensagem enviada","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"401":{"description":"Não autenticado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"403":{"description":"Sem permissão para broadcast","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"503":{"description":"Serviço indisponível","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/messages/{id}/read":{"patch":{"tags":["Inbox"],"summary":"Marcar mensagem como lida","parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Mensagem marcada como lida","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"401":{"description":"Não autenticado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/messages/batch-read":{"post":{"tags":["Inbox"],"summary":"Marcar varias mensagens como lidas","requestBody":{"description":"IDs das mensagens","content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"number"},"minItems":1,"maxItems":100}},"required":["ids"]}}}},"responses":{"200":{"description":"Mensagens marcadas como lidas","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"count":{"type":"number"}},"required":["message","count"]}}}},"401":{"description":"Nao autenticado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/messages/{id}/unread":{"patch":{"tags":["Inbox"],"summary":"Marcar mensagem como não lida","parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Mensagem marcada como não lida","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"401":{"description":"Não autenticado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/messages/unread":{"get":{"tags":["Inbox"],"summary":"Contagem de mensagens não lidas","responses":{"200":{"description":"Contagem","content":{"application/json":{"schema":{"type":"object","properties":{"unread":{"type":"number"}},"required":["unread"]}}}},"401":{"description":"Não autenticado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/messages/mark-all-read":{"post":{"tags":["Inbox"],"summary":"Marcar todas as mensagens como lidas","responses":{"200":{"description":"Marcadas como lidas","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"401":{"description":"Não autenticado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}},"/api/messages/{id}":{"delete":{"tags":["Inbox"],"summary":"Remover mensagem","parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Mensagem removida","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"401":{"description":"Não autenticado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}},"patch":{"tags":["Inbox"],"summary":"Editar mensagem","description":"Atualiza conteúdo de uma mensagem. Apenas o remetente pode editar.","parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"description":"Novo conteúdo","content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","minLength":1}},"required":["content"]}}}},"responses":{"200":{"description":"Mensagem editada","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}},"required":["message","data"]}}}},"401":{"description":"Não autenticado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}},"403":{"description":"Sem permissão","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Serviço indisponível"}},"required":["error"]}}}}}}}}}