{"openapi":"3.1.0","info":{"title":"API da CLAUDO","version":"1.0.0","description":"A mesma plataforma do painel e do MCP, por HTTP. Autentique com `Authorization: Bearer <token>`, criado em Settings → Acesso por IA e API. A organização vai em `?organization=<slug>`; sem ela, vale a pessoal."},"servers":[{"url":"https://claudo.com.br/api/v1"}],"security":[{"bearer":[]}],"paths":{"/me":{"get":{"operationId":"whoami","summary":"Quem sou eu","description":"Mostra a conta conectada, as organizações dela com o papel em cada uma, e o que este acesso permite. Use primeiro para saber em qual organização agir.","tags":["Conta"],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/platform":{"get":{"operationId":"platform_status","summary":"O que a CLAUDO já faz","description":"Lista os produtos da CLAUDO com a disponibilidade real de cada um. Consulte antes de prometer algo ao usuário.","tags":["Conta"],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/usage":{"get":{"operationId":"usage_summary","summary":"Consumo da organização","description":"Quantos projetos, aplicações publicadas, bancos, domínios e membros a organização tem, os deploys do mês e os limites do mês do plano (chamadas ao AI Gateway, e-mails, mensagens de fila e minutos de deploy: usado, incluído, teto e preço do excedente). Só números medidos de verdade.","tags":["Conta"],"parameters":[{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/activity":{"get":{"operationId":"list_activity","summary":"Ver atividade","description":"Histórico recente de quem fez o quê numa organização. Só para dono e administrador.","tags":["Conta"],"parameters":[{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."},{"name":"limit","in":"query","required":false,"schema":{"default":30,"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/organizations":{"post":{"operationId":"create_organization","summary":"Criar organização de equipe","description":"Cria uma organização de equipe, com a pessoa conectada como dona. Use para separar clientes, empresas ou times.","tags":["Organizações"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":80,"description":"Nome da organização."}},"required":["name"]}}}},"responses":{"201":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/members":{"get":{"operationId":"list_members","summary":"Listar membros","description":"Lista membros e papéis de uma organização, e os convites em aberto quando o papel permite.","tags":["Organizações"],"parameters":[{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"invite_member","summary":"Convidar membro","description":"Convida uma pessoa por e-mail para uma organização de equipe. Devolve o link do convite; com o e-mail da plataforma ativo, ele também é enviado.","tags":["Organizações"],"parameters":[{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"E-mail da pessoa convidada."},"role":{"default":"developer","type":"string","enum":["owner","admin","developer","viewer","billing"],"description":"Papel: owner, admin, developer, viewer ou billing."}},"required":["email"]}}}},"responses":{"201":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/members/{email}":{"patch":{"operationId":"change_member_role","summary":"Mudar papel de membro","description":"Muda o papel de um membro. Ninguém concede papel acima do próprio, e a organização nunca fica sem dono.","tags":["Organizações"],"parameters":[{"name":"email","in":"path","required":true,"schema":{"type":"string"},"description":"E-mail do membro."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"role":{"type":"string","enum":["owner","admin","developer","viewer","billing"],"description":"Papel: owner, admin, developer, viewer ou billing."}},"required":["role"]}}}},"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"},"delete":{"operationId":"remove_member","summary":"Remover membro","description":"Remove um membro de uma organização. Confirme com o usuário antes.","tags":["Organizações"],"parameters":[{"name":"email","in":"path","required":true,"schema":{"type":"string"},"description":"E-mail do membro."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/projects":{"get":{"operationId":"list_projects","summary":"Listar projetos","description":"Lista os projetos de uma organização.","tags":["Projetos"],"parameters":[{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"create_project","summary":"Criar projeto","description":"Cria um projeto numa organização, com o ambiente Production. Ele fica pendente até o primeiro deploy. kind web (padrão) é site ou API, com endereço; worker é robô (Discord, Telegram), consumidor de fila ou processo de fundo, sem endereço público.","tags":["Projetos"],"parameters":[{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":80,"description":"Nome do projeto."},"kind":{"default":"web","description":"web: site ou API, com endereço. worker: sem endereço público.","type":"string","enum":["web","worker"]}},"required":["name"]}}}},"responses":{"201":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/projects/{project}":{"get":{"operationId":"get_project","summary":"Ver projeto","description":"Mostra a configuração e os ambientes de um projeto.","tags":["Projetos"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"update_project","summary":"Alterar projeto","description":"Altera nome, repositório GitHub, branch, framework, comandos, diretório, teste de saúde ou pastas que disparam deploy de um projeto. Só os campos informados mudam; string vazia apaga o valor.","tags":["Projetos"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"description":"Novo nome.","type":"string"},"repository_url":{"description":"Repositório GitHub, como https://github.com/dono/repo.","type":"string"},"repository_branch":{"description":"Branch, como main.","type":"string"},"framework":{"type":"string"},"build_command":{"type":"string"},"start_command":{"type":"string"},"root_directory":{"type":"string"},"health_check_path":{"description":"Caminho que responde quando a aplicação está pronta, como /api/health. Com ele, o deploy só troca a versão quando a nova responde.","type":"string"},"deploy_watch_paths":{"description":"Pastas que disparam deploy no push (monorepo), separadas por vírgula, como apps/web, packages/ui. ! no começo tira arquivos. Vazio: todo push publica.","type":"string"},"dockerfile_path":{"description":"Dockerfile fora do lugar padrão, a partir do diretório raiz, como Dockerfile.prod ou docker/Dockerfile. Vazio: Dockerfile.","type":"string"},"release_command":{"description":"Comando que roda no contêiner da versão nova depois de cada deploy (também nos previews, com as variáveis de Preview), como npx prisma migrate deploy. Se falhar, a versão nova fica no ar e o erro vai para o fim do log do build. Vazio: nenhum.","type":"string"}}}}}},"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"},"delete":{"operationId":"delete_project","summary":"Apagar projeto","description":"Apaga um projeto com ambientes e variáveis. Permanente. Exige confirm_name igual ao nome do projeto — confirme com o usuário antes.","tags":["Projetos"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."},{"name":"confirm_name","in":"query","required":true,"schema":{"type":"string"},"description":"Nome exato do projeto, como confirmação."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/projects/{project}/kind":{"put":{"operationId":"set_project_kind","summary":"Tipo do projeto (web ou worker)","description":"Troca o tipo do projeto antes do primeiro deploy: web (site ou API, com endereço) ou worker (robô, fila ou processo de fundo, sem endereço público). Depois do primeiro deploy o tipo não muda: crie outro projeto. Virar worker tira teste de saúde, senha de acesso, previews e página de status; com domínio cadastrado, é recusado.","tags":["Projetos"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string","enum":["web","worker"],"description":"web ou worker."}},"required":["kind"]}}}},"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/github/repositories":{"get":{"operationId":"list_github_repositories","summary":"Repositórios do GitHub","description":"Lista os repositórios que as contas do GitHub conectadas à organização liberaram para a CLAUDO. Conectar uma conta nova exige o navegador: Configuração do projeto → Conectar GitHub.","tags":["Projetos"],"parameters":[{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/projects/{project}/repository":{"put":{"operationId":"connect_project_repository","summary":"Ligar repositório ao projeto","description":"Liga um repositório do GitHub (dono/repo, um dos de list_github_repositories) e a branch de produção a um projeto. Sem branch, usa a padrão do repositório.","tags":["Projetos"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"repository":{"type":"string","minLength":3,"description":"Repositório no formato dono/repo."},"branch":{"description":"Branch de produção.","type":"string","minLength":1,"maxLength":255}},"required":["repository"]}}}},"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/projects/{project}/repository/public":{"put":{"operationId":"connect_public_repository","summary":"Ligar repositório público ao projeto","description":"Liga um repositório PÚBLICO do GitHub (https://github.com/dono/repo ou dono/repo) ou do gitlab.com (https://gitlab.com/grupo/projeto) ao projeto pelo endereço, sem conectar conta. Sem branch, usa a padrão. Publica por deploy_project ou por um gancho de deploy (create_deploy_hook; no GitLab, cadastre a URL em Settings → Webhooks com Push events para publicar a cada push); não há preview de PR. Para repositório privado do GitHub ou deploy a cada push sem gancho, use connect_project_repository com a conta conectada.","tags":["Projetos"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","minLength":3,"maxLength":300,"description":"https://github.com/dono/repo, dono/repo ou https://gitlab.com/grupo/projeto."},"branch":{"description":"Branch a publicar.","type":"string","minLength":1,"maxLength":255}},"required":["url"]}}}},"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/projects/{project}/image":{"put":{"operationId":"connect_docker_image","summary":"Ligar imagem Docker ao projeto","description":"Usa uma imagem Docker PÚBLICA no lugar do repositório (nginx:1.27, n8nio/n8n, ghcr.io/dono/app:v2; registros: Docker Hub, ghcr.io, quay.io, public.ecr.aws, registry.gitlab.com, mcr.microsoft.com). Sem build: cada deploy_project confere a tag no registro e publica a versão exata (digest). A porta é a do EXPOSE da imagem, ou PORT nas variáveis. Imagem com rótulos traefik.* é recusada.","tags":["Projetos"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"image":{"type":"string","minLength":1,"maxLength":255,"description":"nome:tag da imagem pública."}},"required":["image"]}}}},"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/projects/{project}/access-protection":{"put":{"operationId":"set_access_protection","summary":"Pôr senha de acesso no site","description":"Liga ou troca a senha de acesso ao site do projeto: o navegador pede usuário e senha antes de qualquer página, nos domínios e nos previews de pull request (ADR 0055). Para site em construção, homologação ou ferramenta interna. Avise o usuário que webhooks de pagamento, apps e robôs que chamam o site também passam a precisar da senha, e que a senha passa por esta conversa (se preferir que não, ele põe em Configuração do projeto, no painel). Com a aplicação no ar, ela sobe de novo sem build para valer na hora.","tags":["Projetos"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":"string","description":"Usuário: letras sem acento, números e . _ -, até 64."},"password":{"type":"string","description":"Senha: de 8 a 72 caracteres, sem acento nem emoji. Não aparece de novo."}},"required":["username","password"]}}}},"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"},"delete":{"operationId":"remove_access_protection","summary":"Tirar a senha de acesso do site","description":"Tira a senha de acesso ao site do projeto: ele volta a abrir para qualquer pessoa. Confirme com o usuário antes.","tags":["Projetos"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/projects/{project}/status-page":{"put":{"operationId":"set_status_page","summary":"Página de status pública","description":"Liga ou desliga a página de status pública do projeto (ADR 0059): mostra a quem tiver o endereço se o site está no ar, os últimos 30 dias do monitoramento e as quedas, sem detalhe interno. Devolve o endereço e o selo para o README. Desligada, o endereço responde 404.","tags":["Projetos"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"enabled":{"type":"boolean","description":"true liga, false desliga."}},"required":["enabled"]}}}},"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/deployments":{"get":{"operationId":"list_deployments_by_deployments","summary":"Listar deploys","description":"Lista os deploys mais recentes da organização, ou de um projeto, com status real (Na fila, Buildando, Pronto, Falhou).","tags":["Deploy"],"parameters":[{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."},{"name":"project","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/projects/{project}/deployments":{"get":{"operationId":"list_deployments_by_projects_deployments","summary":"Listar deploys","description":"Lista os deploys mais recentes da organização, ou de um projeto, com status real (Na fila, Buildando, Pronto, Falhou).","tags":["Deploy"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"deploy_project","summary":"Publicar projeto","description":"Publica (deploy) a branch de produção do repositório ligado ao projeto, com as variáveis de Production. Devolve o id do deploy; acompanhe com get_deployment. Com a conta do GitHub conectada, depois do primeiro deploy cada push na branch publica sozinho; com repositório público pelo endereço (GitHub ou gitlab.com), por aqui ou por um gancho de deploy (create_deploy_hook).","tags":["Deploy"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"no_cache":{"default":false,"description":"Constrói do zero, sem o cache do build anterior. Mais lento; use quando o build insiste num erro que não está no código.","type":"boolean"}}}}}},"responses":{"201":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/deployments/{deployment_id}":{"get":{"operationId":"get_deployment","summary":"Ver deploy","description":"Status atual de um deploy e as últimas linhas do log do build. Use para acompanhar um deploy iniciado ou entender uma falha.","tags":["Deploy"],"parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string"},"description":"Id do deploy, de deploy_project ou list_deployments."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."},{"name":"log_lines","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":500},"description":"Linhas finais do log (padrão 60)."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/projects/{project}/deploy-hooks":{"get":{"operationId":"list_deploy_hooks","summary":"Listar ganchos de deploy","description":"Lista os ganchos de deploy do projeto: URLs secretas que publicam a produção com um POST (CMS, CI). Mostra nome, começo do token e último uso; a URL inteira só aparece ao criar.","tags":["Deploy"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"create_deploy_hook","summary":"Criar gancho de deploy","description":"Cria uma URL secreta que publica a produção do projeto quando recebe um POST (para um CMS, um CI ou um agendador). A URL aparece só nesta resposta: entregue ao usuário e avise que quem a tiver consegue publicar, e que revogar este acesso não apaga o gancho. Se o usuário preferir que a URL não passe pela conversa, ele cria em Configuração do projeto, no painel. Até 10 por projeto.","tags":["Deploy"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":60,"description":"Quem vai chamar, como 'CMS' ou 'GitHub Actions'."}},"required":["name"]}}}},"responses":{"201":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/projects/{project}/deploy-hooks/{hook_id}":{"delete":{"operationId":"delete_deploy_hook","summary":"Apagar gancho de deploy","description":"Apaga um gancho de deploy; a URL dele para de funcionar na hora. Use o id de list_deploy_hooks.","tags":["Deploy"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"hook_id","in":"path","required":true,"schema":{"type":"string"},"description":"Id do gancho, de list_deploy_hooks."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/projects/{project}/restart":{"post":{"operationId":"restart_project","summary":"Reiniciar aplicação","description":"Reinicia a aplicação publicada do projeto: a imagem da versão no ar sobe de novo com a configuração atual, sem build (o código novo do branch só vai por deploy_project). Vira um deploy; acompanhe com get_deployment.","tags":["Deploy"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/projects/{project}/stop":{"post":{"operationId":"stop_project","summary":"Parar aplicação","description":"Para a aplicação publicada do projeto: o endereço deixa de responder, o monitoramento não conta como queda, e push e deploy por variável não a ligam. Volta com start_project ou deploy_project. Dados de bancos e volumes ficam.","tags":["Deploy"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/projects/{project}/start":{"post":{"operationId":"start_project","summary":"Ligar aplicação","description":"Liga de novo a aplicação parada com stop_project: a imagem da versão que estava no ar sobe, sem build, e vira um deploy (get_deployment). Aplicação parada pela CLAUDO por segurança só volta com deploy_project.","tags":["Deploy"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/deployments/{deployment_id}/rollback":{"post":{"operationId":"rollback_deployment","summary":"Voltar para uma versão anterior","description":"Volta a produção para um deploy anterior que ficou pronto, usando a imagem guardada no servidor (sem build, em segundos). Só as versões mais recentes ficam guardadas. Vira um deploy novo; acompanhe com get_deployment. O próximo push publica de novo o código da branch. Confirme com o usuário antes.","tags":["Deploy"],"parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string"},"description":"Id do deploy pronto para onde voltar, de list_deployments."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/projects/{project}/logs":{"get":{"operationId":"get_runtime_logs","summary":"Logs da aplicação","description":"Últimas linhas que a aplicação publicada imprimiu em produção. Útil para investigar erro depois do deploy.","tags":["Deploy"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."},{"name":"lines","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":1000},"description":"Quantidade de linhas (padrão 100)."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/projects/{project}/logs/history":{"get":{"operationId":"search_logs","summary":"Buscar nos logs guardados","description":"Busca no histórico de logs da aplicação publicada (guardado pelo tempo do plano, lido a cada minuto), mais recentes primeiro. Use para achar um erro de horas ou dias atrás, ou de antes do último deploy; para o que está acontecendo agora, get_runtime_logs.","tags":["Deploy"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."},{"name":"query","in":"query","required":false,"schema":{"type":"string","maxLength":200},"description":"Texto que a linha contém, como ERROR ou um id."},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":720},"description":"Quantas horas para trás (padrão 24)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":500},"description":"Linhas (padrão 100)."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/log-drains":{"get":{"operationId":"list_log_drains","summary":"Listar envios de logs","description":"Lista os envios de logs da organização: endereços (Better Stack, Axiom, Datadog ou outro) que recebem, a cada minuto, as linhas novas das aplicações. Mostra o host do endereço (o caminho pode levar token), o projeto (ou todos), o nome do cabeçalho de autenticação (nunca o valor), o último envio, o erro e a próxima tentativa, o atraso (lagging_since) e quando linhas foram apagadas pelo tempo do plano antes de sair (lines_dropped_at). Só Dono e Administrador.","tags":["Deploy"],"parameters":[{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"create_log_drain","summary":"Criar envio de logs","description":"Manda os logs das aplicações para um serviço de logs: a cada minuto, as linhas novas vão num POST de JSON (lista de objetos com message, timestamp, dt, _time, service e project) para o endereço HTTPS. Better Stack: o endereço de ingestão da fonte HTTP e header_name Authorization com \"Bearer <token>\". Axiom: https://api.axiom.co/v1/datasets/<dataset>/ingest com Authorization \"Bearer <token>\". Datadog: https://http-intake.logs.datadoghq.com/api/v2/logs com DD-API-KEY. Começa do que chegar depois de criado. O valor do cabeçalho passa pela conversa: se o usuário preferir, ele cria no painel (Webhooks → Envio de logs). Até 3 por organização. Só Dono e Administrador.","tags":["Deploy"],"parameters":[{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","minLength":1,"maxLength":500,"description":"Endereço HTTPS público que recebe o POST."},"project":{"description":"Slug (ou nome) do projeto. Ausente, manda os logs de todos os projetos.","type":"string"},"header_name":{"description":"Cabeçalho de autenticação do serviço, como Authorization ou DD-API-KEY.","type":"string","maxLength":64},"header_value":{"description":"Valor do cabeçalho, como 'Bearer <token>'. Fica cifrado e não aparece de novo.","type":"string","maxLength":2000}},"required":["url"]}}}},"responses":{"201":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/projects/{project}/log-alerts":{"get":{"operationId":"list_log_alerts","summary":"Listar alertas de log","description":"Lista os alertas de log do projeto: o texto procurado, quantas linhas em quantos minutos disparam o aviso, se está ligado e o último aviso.","tags":["Deploy"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"create_log_alert","summary":"Criar alerta de log","description":"Cria um alerta no projeto: quando passam de threshold as linhas com pattern (sem diferenciar maiúscula) em window_minutes, quem administra recebe e-mail e os webhooks com o evento log.alert recebem o aviso com as últimas linhas. Depois de avisar, espera a janela (pelo menos 30 minutos). Conferido a cada minuto no histórico de logs. Até 10 por projeto.","tags":["Deploy"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":60,"description":"Nome, como 'Erros no checkout'."},"pattern":{"type":"string","minLength":1,"maxLength":200,"description":"Texto que a linha contém, como ERROR (vale como escrito, com espaços)."},"threshold":{"type":"integer","minimum":1,"maximum":30000,"description":"Quantas linhas disparam o aviso: até 500 por minuto da janela, o que a coleta guarda."},"window_minutes":{"type":"integer","minimum":1,"maximum":60,"description":"Em quantos minutos (1 a 60)."}},"required":["name","pattern","threshold","window_minutes"]}}}},"responses":{"201":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/projects/{project}/log-alerts/{alert_id}":{"delete":{"operationId":"delete_log_alert","summary":"Apagar alerta de log","description":"Apaga um alerta de log do projeto (o id vem de list_log_alerts).","tags":["Deploy"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"alert_id","in":"path","required":true,"schema":{"type":"string"},"description":"Id do alerta, de list_log_alerts."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/log-drains/{drain_id}":{"delete":{"operationId":"delete_log_drain","summary":"Apagar envio de logs","description":"Apaga um envio de logs da organização (o id vem de list_log_drains): os logs param de sair para aquele endereço. Os já enviados continuam no serviço. Confirme com o usuário antes. Só Dono e Administrador.","tags":["Deploy"],"parameters":[{"name":"drain_id","in":"path","required":true,"schema":{"type":"string"},"description":"Id do envio, de list_log_drains."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/projects/{project}/monitoring":{"get":{"operationId":"get_project_monitoring","summary":"Disponibilidade da aplicação","description":"Se a aplicação publicada está no ar agora, a disponibilidade nas últimas 24 h, o tempo médio de resposta e os incidentes recentes. A CLAUDO checa cada aplicação a cada minuto: o site pelo endereço, o worker pelo estado do processo (rodando ou parado, sem tempo de resposta).","tags":["Deploy"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/projects/{project}/env":{"get":{"operationId":"list_env_vars","summary":"Listar variáveis de ambiente","description":"Lista os nomes das variáveis de ambiente de um projeto, por ambiente. Os valores nunca são mostrados: são de escrita apenas.","tags":["Variáveis"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/projects/{project}/env/development":{"get":{"operationId":"pull_env_vars","summary":"Baixar variáveis de Development","description":"Variáveis de Development do projeto, com os valores, para o computador de quem desenvolve (claudo env pull). Só pela API REST; cada leitura fica no histórico.","tags":["Variáveis"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/projects/{project}/env/import":{"post":{"operationId":"import_env_vars","summary":"Importar variáveis de um .env","description":"Grava de uma vez as variáveis de um texto no formato .env (CHAVE=valor por linha, com aspas, comentários e export) num ambiente do projeto. Tudo ou nada: uma linha errada não grava nenhuma. Nomes que já existem têm o valor substituído; os sem valor são pulados. Os valores passam pelo assistente: evite segredos que o usuário não queira expor à IA.","tags":["Variáveis"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","maxLength":262144,"description":"Texto do .env."},"environment":{"default":"production","description":"Ambiente da variável.","type":"string","enum":["production","preview","development"]}},"required":["content"]}}}},"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/projects/{project}/env/{key}":{"put":{"operationId":"set_env_var","summary":"Definir variável de ambiente","description":"Cria ou substitui uma variável de ambiente de um projeto, cifrada em repouso. O valor passa pelo assistente para chegar aqui — evite colar segredos que o usuário não queira expor à IA. Production chega à aplicação no próximo deploy; Preview, nos previews de pull request.","tags":["Variáveis"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"key","in":"path","required":true,"schema":{"type":"string"},"description":"Nome, como DATABASE_URL. Letras, dígitos e sublinhado."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"value":{"type":"string","description":"Valor da variável."},"environment":{"default":"production","description":"Ambiente da variável.","type":"string","enum":["production","preview","development"]},"build":{"description":"Também no build (ex.: token de pacote privado). O valor pode aparecer no log do build. NEXT_PUBLIC_, VITE_ e parecidos vão ao build sempre. Ausente, mantém o que já estava.","type":"boolean"}},"required":["value"]}}}},"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"},"delete":{"operationId":"delete_env_var","summary":"Apagar variável de ambiente","description":"Apaga uma variável de ambiente de um projeto, num ambiente.","tags":["Variáveis"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"key","in":"path","required":true,"schema":{"type":"string"},"description":"Nome da variável."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."},{"name":"environment","in":"query","required":false,"schema":{"default":"production","type":"string","enum":["production","preview","development"]},"description":"Ambiente da variável."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/shared-env":{"get":{"operationId":"list_shared_env_vars","summary":"Listar variáveis compartilhadas","description":"Lista as variáveis compartilhadas da organização (nomes, ambiente e em quais projetos valem), nunca os valores. Uma compartilhada vale nos projetos ligados (ou em todos); a variável do projeto com o mesmo nome vence.","tags":["Variáveis"],"parameters":[{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/shared-env/{key}":{"put":{"operationId":"set_shared_env_var","summary":"Definir variável compartilhada","description":"Cria ou muda uma variável compartilhada da organização: gravada uma vez, vale em todos os projetos (all_projects) ou nos listados em projects; o projeto com variável de mesmo nome usa a dele. Sem value, mantém o valor e muda só projetos ou build. O valor passa pelo assistente: evite segredos que o usuário não queira expor à IA. Só Dono e Administrador. Production marca os projetos para deploy.","tags":["Variáveis"],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string"},"description":"Nome, como RESEND_API_KEY. Letras, dígitos e sublinhado."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"value":{"description":"Valor. Ausente, mantém o que já estava.","type":"string"},"environment":{"default":"production","description":"Ambiente da variável.","type":"string","enum":["production","preview","development"]},"all_projects":{"default":false,"description":"Vale em todo projeto da organização, inclusive os criados depois.","type":"boolean"},"projects":{"default":[],"description":"Slugs (ou nomes) dos projetos em que vale, quando não são todos. Projeto de imagem pronta ou de repositório público de terceiros só recebe se estiver aqui.","maxItems":500,"type":"array","items":{"type":"string"}},"build":{"description":"Também no build. Ausente, mantém o que já estava (nova: só rodando).","type":"boolean"}}}}}},"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"},"delete":{"operationId":"delete_shared_env_var","summary":"Apagar variável compartilhada","description":"Apaga uma variável compartilhada da organização de todos os projetos em que vale (os que têm a sua própria continuam com ela). Confirme com o usuário antes. Só Dono e Administrador.","tags":["Variáveis"],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string"},"description":"Nome da variável."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."},{"name":"environment","in":"query","required":false,"schema":{"default":"production","type":"string","enum":["production","preview","development"]},"description":"Ambiente da variável."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/projects/{project}/domains":{"get":{"operationId":"list_domains","summary":"Domínios do projeto","description":"Lista os domínios próprios de um projeto, com status (pending = aguardando DNS, verified, active) e, para os pendentes, os registros DNS a criar.","tags":["Domínios"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"add_domain","summary":"Adicionar domínio","description":"Adiciona um domínio próprio (ex.: loja.com.br) a um projeto e devolve os dois registros DNS que o usuário precisa criar no provedor do domínio. Depois, use verify_domain.","tags":["Domínios"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"hostname":{"type":"string","minLength":3,"maxLength":253,"description":"Domínio, como loja.com.br."}},"required":["hostname"]}}}},"responses":{"201":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/domains/{domain_id}/verify":{"post":{"operationId":"verify_domain","summary":"Verificar domínio","description":"Confere no DNS os registros do domínio. Se estiverem certos, liga o domínio ao projeto publicado e o certificado HTTPS é emitido em alguns minutos.","tags":["Domínios"],"parameters":[{"name":"domain_id","in":"path","required":true,"schema":{"type":"string"},"description":"Id do domínio, de add_domain ou list_domains."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/projects/{project}/www-redirect":{"put":{"operationId":"set_www_redirect","summary":"Redirecionar www","description":"Liga ou desliga o redirecionamento de www.x para x no projeto (302, com o mesmo caminho). Ligar pede o par: cada domínio com www precisa do mesmo domínio sem www no projeto (adicione com add_domain). Vale quando os dois estão verificados; a aplicação sobe de novo, sem build.","tags":["Domínios"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"enabled":{"type":"boolean","description":"true redireciona www para o sem www; false desliga."}},"required":["enabled"]}}}},"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/databases":{"get":{"operationId":"list_databases","summary":"Bancos de dados","description":"Lista os bancos PostgreSQL da organização, ou de um projeto, com status real. Nunca mostra senha.","tags":["Bancos"],"parameters":[{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."},{"name":"project","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/projects/{project}/databases":{"post":{"operationId":"create_database","summary":"Criar banco de dados","description":"Cria um banco para um projeto, na rede privada da organização: PostgreSQL (padrão), MySQL, MariaDB ou MongoDB, com backup diário, ou Redis (cache e filas, sem backup). A conexão vai para as variáveis de Production (DATABASE_URL; MONGODB_URI no MongoDB; REDIS_URL no Redis) e a senha não é mostrada a ninguém; depois, faça deploy_project para a aplicação recebê-la.","tags":["Bancos"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"description":"Nome curto, minúsculas e hífen. Padrão: principal.","type":"string","minLength":2,"maxLength":40},"engine":{"description":"postgresql (padrão), mysql, mariadb, mongodb ou redis.","type":"string","enum":["postgresql","mysql","mariadb","mongodb","redis"]},"set_database_url":{"description":"Gravar a variável de conexão em Production (padrão: sim).","type":"boolean"}}}}}},"responses":{"201":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/databases/{database}/backups":{"get":{"operationId":"list_database_backups","summary":"Backups de um banco","description":"Lista os backups de um banco (data, tamanho, se deu certo, se também foi para fora do servidor). Use o id que list_databases devolve. Restaurar um backup é feito no painel, com confirmação.","tags":["Bancos"],"parameters":[{"name":"database","in":"path","required":true,"schema":{"type":"string"},"description":"Id do banco, de list_databases."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"backup_database_now","summary":"Fazer backup agora","description":"Pede um backup imediato do banco. Ele aparece em list_database_backups em alguns minutos.","tags":["Bancos"],"parameters":[{"name":"database","in":"path","required":true,"schema":{"type":"string"},"description":"Id do banco, de list_databases."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/databases/{database}/password":{"post":{"operationId":"change_database_password","summary":"Trocar a senha do banco","description":"Gera uma senha nova para um banco do projeto (PostgreSQL, MySQL, MariaDB ou Redis; MongoDB ainda não) e regrava a variável de conexão em Production. No Redis vale na hora (ele reinicia); nos SQL, um ALTER USER roda dentro do banco e a variável muda quando ele termina (até dois minutos; acompanhe com list_databases). Se a troca não terminar, chamar de novo tenta com a mesma senha nova. A aplicação perde a conexão até o próximo deploy_project. A senha nunca aparece. Confirme com o usuário antes.","tags":["Bancos"],"parameters":[{"name":"database","in":"path","required":true,"schema":{"type":"string"},"description":"Id do banco, de list_databases."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/databases/{database}/public":{"post":{"operationId":"set_database_public_access","summary":"Abrir ou fechar o acesso de fora ao banco","description":"Abre (enabled: true) ou fecha o acesso de fora a um banco PostgreSQL, MySQL, MariaDB ou MongoDB (Redis não: manda a senha sem cifrar). Aberto, o banco responde numa porta pública do servidor, protegido só pela senha e sem TLS; a conexão de fora fica na variável DATABASE_PUBLIC_URL (ou MONGODB_PUBLIC_URI) de Development, que `claudo env pull` leva para o computador. A aplicação continua pela rede interna. Só administrador; precisa estar liberado na plataforma. Confirme com o usuário antes de abrir.","tags":["Bancos"],"parameters":[{"name":"database","in":"path","required":true,"schema":{"type":"string"},"description":"Id do banco, de list_databases."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"enabled":{"type":"boolean","description":"true abre; false fecha."}},"required":["enabled"]}}}},"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/projects/{project}/supabase":{"get":{"operationId":"get_supabase","summary":"Ver o Supabase do projeto","description":"Mostra o Supabase do projeto (beta, planos pagos): estado, endereço da API e se as chaves já estão nas variáveis de Production. As chaves e a senha do Studio não saem por aqui; o acesso ao Studio fica no painel.","tags":["Bancos"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"create_supabase","summary":"Criar Supabase no projeto","description":"Cria um Supabase inteiro (Postgres, Auth, Storage, Realtime e Studio) para o projeto, só nos planos pagos e um por projeto. Leva alguns minutos; quando fica pronto, SUPABASE_URL, SUPABASE_ANON_KEY, SUPABASE_SERVICE_ROLE_KEY e as NEXT_PUBLIC_ vão para Production. Acompanhe com get_supabase e depois faça deploy_project.","tags":["Bancos"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"201":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/buckets":{"get":{"operationId":"list_buckets","summary":"Listar buckets de storage","description":"Lista os buckets S3 da organização (ou de um projeto), com tamanho usado, cota e se a leitura é pública. Nunca mostra chaves.","tags":["Storage"],"parameters":[{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."},{"name":"project","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/projects/{project}/buckets":{"post":{"operationId":"create_bucket","summary":"Criar bucket de storage","description":"Cria um bucket S3 privado no projeto, com chave só dele e cota do plano. Grava em Production S3_ENDPOINT, S3_REGION, S3_BUCKET, S3_ACCESS_KEY_ID, S3_SECRET_ACCESS_KEY e S3_FORCE_PATH_STYLE=true; depois, deploy_project. As chaves não são mostradas aqui; o painel mostra a quem pode.","tags":["Storage"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":3,"maxLength":30,"description":"Nome curto: minúsculas, números e hífen, começando por letra. Ex.: fotos."},"set_env_vars":{"description":"Gravar as variáveis S3_ em Production (padrão: sim).","type":"boolean"}},"required":["name"]}}}},"responses":{"201":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/projects/{project}/tasks":{"get":{"operationId":"list_tasks","summary":"Tarefas do projeto","description":"Lista as tarefas do projeto (comandos que rodam dentro da aplicação, agendados como cron ou manuais), com a última execução.","tags":["Tarefas"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"create_task","summary":"Criar tarefa","description":"Cria uma tarefa: um comando que roda dentro da aplicação publicada. Com schedule (cron de 5 campos, horário UTC), roda sozinha; sem schedule, só quando pedida com run_task (bom para migração, criar administrador, coleta pontual).","tags":["Tarefas"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":41,"description":"Nome curto, como coleta."},"command":{"type":"string","minLength":1,"maxLength":2000,"description":"Comando, como npm run coleta:tudo."},"schedule":{"description":"Cron de 5 campos em UTC, como 0 6 * * *. Omita para tarefa manual.","type":"string","maxLength":60}},"required":["name","command"]}}}},"responses":{"201":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/tasks/{task}/runs":{"post":{"operationId":"run_task","summary":"Rodar tarefa agora","description":"Roda uma tarefa agora dentro da aplicação publicada. A saída aparece em task_runs em alguns segundos.","tags":["Tarefas"],"parameters":[{"name":"task","in":"path","required":true,"schema":{"type":"string"},"description":"Id da tarefa, de list_tasks."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"},"get":{"operationId":"task_runs","summary":"Execuções de uma tarefa","description":"Últimas execuções de uma tarefa, com resultado e a saída do comando.","tags":["Tarefas"],"parameters":[{"name":"task","in":"path","required":true,"schema":{"type":"string"},"description":"Id da tarefa, de list_tasks."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/projects/{project}/volumes":{"get":{"operationId":"list_volumes","summary":"Volumes do projeto","description":"Lista as pastas persistentes do projeto (nome e caminho dentro da aplicação). O que a aplicação grava fora delas some a cada deploy.","tags":["Tarefas"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"add_volume","summary":"Criar volume","description":"Cria uma pasta persistente no projeto, num caminho absoluto dentro da aplicação (ex.: /app/uploads), para arquivos que precisam sobreviver a deploy. Com o projeto no ar, a aplicação reinicia para montar a pasta.","tags":["Tarefas"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":31,"description":"Nome curto, como uploads."},"mount_path":{"type":"string","minLength":2,"maxLength":200,"description":"Caminho, como /app/uploads."}},"required":["name","mount_path"]}}}},"responses":{"201":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-claudo-scope":"write"}},"/projects/{project}/analytics":{"get":{"operationId":"get_analytics","summary":"Visitas do site do projeto","description":"Visitas do site do projeto (Umami, sem cookies) nos últimos dias: visualizações, visitantes, rejeição, páginas, origens, países e navegadores, e o script para colar na página. Para ligar o analytics, use o painel (Projeto → Analytics).","tags":["Produtos"],"parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador (slug) do projeto, como aparece em list_projects. O nome exato também serve."},{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."},{"name":"days","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":90},"description":"Período em dias (padrão 7)."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/mail":{"get":{"operationId":"mail_status","summary":"E-mail da organização (CLAUDO Mail)","description":"Domínios de envio (com os registros DNS que faltam criar), envios do mês e o limite do plano. Para enviar, a aplicação usa POST <url>/emails com a chave claudo_mail_ do painel.","tags":["Produtos"],"parameters":[{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/queues":{"get":{"operationId":"queues_status","summary":"Filas e agendamentos (CLAUDO Queues)","description":"Mensagens do mês e o limite do plano, o que está na fila, as falhas recentes (com o erro e a resposta HTTP) e os agendamentos cron. A aplicação publica com POST <api_url>/messages e a chave claudo_queue_ do painel.","tags":["Produtos"],"parameters":[{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/auth":{"get":{"operationId":"auth_status","summary":"Login das aplicações (CLAUDO Auth)","description":"Aplicações com CLAUDO Auth na organização: usuários, client_id, emissor (issuer) e JWKS para conferir os tokens, endereços de retorno, origens permitidas e login social ligado. Ligar o Auth, criar chaves secretas e mexer em usuários é pelo painel (Auth).","tags":["Produtos"],"parameters":[{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/ai/usage":{"get":{"operationId":"ai_usage","summary":"Uso do AI Gateway","description":"Chamadas, tokens e custo estimado em reais do AI Gateway no mês, por modelo, com o limite do plano e o teto de tokens da organização. As chaves (dos provedores e do gateway) só são criadas e vistas no painel.","tags":["Produtos"],"parameters":[{"name":"organization","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100},"description":"Identificador (slug) ou id da organização. Sem ele, usa a organização pessoal. Veja os disponíveis em whoami."}],"responses":{"200":{"description":"Feito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"default":{"description":"Recusa, com código e mensagem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer"}},"schemas":{"Result":{"type":"object","properties":{"message":{"type":"string"},"data":{"type":["object","null"]}},"required":["message","data"]},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}},"required":["error"]}}}}