{"openapi":"3.1.0","info":{"title":"pessoas-sandbox — usuários e áreas","version":"1.0.0","description":"Serviço de teste para as tools do noria: cadastro e login de usuários, edição, troca de senha, desligamento, remoção e áreas (setores). Autenticação: chave de API (x-api-key ou Authorization: Bearer), token do login (Authorization: Bearer) ou Basic (e-mail:senha). Toda escrita responde `mensagem` com o resumo em português; todo erro responde { mensagem, codigo, detalhes }."},"servers":[{"url":"https://pessoas-sandbox.grupogus.com","description":"Este serviço"}],"tags":[{"name":"Autenticação","description":"Cadastro, login e quem sou eu"},{"name":"Usuários","description":"Editar, trocar senha, desligar, remover e mudar de área"},{"name":"Áreas","description":"Criar, consultar e remover áreas (setores)"},{"name":"Histórico","description":"O que foi feito, por quem e quando"},{"name":"Serviço","description":"Saúde do serviço e esta especificação"}],"security":[{"chaveApi":[]},{"tokenBearer":[]},{"basic":[]}],"components":{"securitySchemes":{"chaveApi":{"type":"apiKey","in":"header","name":"x-api-key","description":"A API_KEY do serviço"},"tokenBearer":{"type":"http","scheme":"bearer","description":"A API_KEY do serviço ou o token devolvido pelo login"},"basic":{"type":"http","scheme":"basic","description":"E-mail e senha de um usuário ativo"}},"schemas":{"Usuario":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"nome":{"type":"string"},"email":{"type":"string"},"telefone":{"type":["string","null"]},"cargo":{"type":["string","null"]},"papel":{"type":"string","enum":["admin","colaborador"],"description":"admin gerencia áreas e usuários; colaborador só mexe na própria conta"},"status":{"type":"string","enum":["ativo","desligado"],"description":"desligado não consegue entrar, mas continua cadastrado (dá para religar)"},"area":{"anyOf":[{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"nome":{"type":"string"}},"required":["id","nome"],"additionalProperties":false},{"type":"null"}],"description":"null = usuário sem área"},"desligadoEm":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"motivoDesligamento":{"type":["string","null"]},"criadoEm":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"atualizadoEm":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","nome","email","telefone","cargo","papel","status","area","desligadoEm","motivoDesligamento","criadoEm","atualizadoEm"],"additionalProperties":false},"Area":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"nome":{"type":"string"},"descricao":{"type":["string","null"]},"totalUsuarios":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Quantos usuários (ativos e desligados) estão na área"},"usuariosAtivos":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"criadoEm":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"atualizadoEm":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","nome","descricao","totalUsuarios","usuariosAtivos","criadoEm","atualizadoEm"],"additionalProperties":false},"AreaDetalhada":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"nome":{"type":"string"},"descricao":{"type":["string","null"]},"totalUsuarios":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Quantos usuários (ativos e desligados) estão na área"},"usuariosAtivos":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"criadoEm":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"atualizadoEm":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"usuarios":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"nome":{"type":"string"},"email":{"type":"string"},"telefone":{"type":["string","null"]},"cargo":{"type":["string","null"]},"papel":{"type":"string","enum":["admin","colaborador"],"description":"admin gerencia áreas e usuários; colaborador só mexe na própria conta"},"status":{"type":"string","enum":["ativo","desligado"],"description":"desligado não consegue entrar, mas continua cadastrado (dá para religar)"},"area":{"anyOf":[{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"nome":{"type":"string"}},"required":["id","nome"],"additionalProperties":false},{"type":"null"}],"description":"null = usuário sem área"},"desligadoEm":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"motivoDesligamento":{"type":["string","null"]},"criadoEm":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"atualizadoEm":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","nome","email","telefone","cargo","papel","status","area","desligadoEm","motivoDesligamento","criadoEm","atualizadoEm"],"additionalProperties":false}}},"required":["id","nome","descricao","totalUsuarios","usuariosAtivos","criadoEm","atualizadoEm","usuarios"],"additionalProperties":false},"Evento":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"quando":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"acao":{"type":"string","examples":["usuario.area_alterada"]},"ator":{"type":"object","properties":{"tipo":{"type":"string","enum":["chave_api","usuario","anonimo","sistema"]},"id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"nome":{"type":["string","null"]}},"required":["tipo","id","nome"],"additionalProperties":false},"alvo":{"type":"object","properties":{"tipo":{"anyOf":[{"type":"string","enum":["usuario","area"]},{"type":"null"}]},"id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"nome":{"type":["string","null"]}},"required":["tipo","id","nome"],"additionalProperties":false},"detalhes":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["id","quando","acao","ator","alvo","detalhes"],"additionalProperties":false},"Erro":{"type":"object","properties":{"mensagem":{"type":"string","description":"O que aconteceu e o que fazer, em português"},"codigo":{"type":"string","examples":["AREA_COM_USUARIOS"]},"detalhes":{}},"required":["mensagem","codigo"],"additionalProperties":false}}},"paths":{"/api/auth/cadastro":{"post":{"operationId":"cadastrarUsuario","summary":"Cadastrar usuário","description":"Cria a conta de uma pessoa nova, como colaborador e ativa. Use quando pedirem para cadastrar, registrar ou criar o acesso de alguém. A área é opcional (areaId); sem ela, a pessoa começa sem área. Devolve também um token de sessão da pessoa cadastrada. Erro 409 EMAIL_EM_USO se o e-mail já existe. Não precisa de autenticação.","tags":["Autenticação"],"security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"nome":{"type":"string","minLength":2,"maxLength":120,"description":"Nome completo","examples":["Maria Souza"]},"email":{"type":"string","maxLength":200,"pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","format":"email","description":"E-mail — é também o login","examples":["maria.souza@empresa.com"]},"senha":{"type":"string","minLength":8,"maxLength":128,"description":"Senha de acesso (mínimo 8 caracteres)"},"telefone":{"type":"string","maxLength":30,"description":"Telefone com DDD","examples":["(11) 98765-4321"]},"cargo":{"type":"string","maxLength":80,"description":"Cargo","examples":["Analista financeiro"]},"areaId":{"description":"Área (setor) em que o usuário começa. Opcional: dá para definir depois com Mover usuário de área.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","examples":["3f1c1b1e-8d2a-4c55-9a51-2d8f3b6c7e90"]}},"required":["nome","email","senha"],"additionalProperties":false}}}},"responses":{"201":{"description":"Usuário cadastrado","content":{"application/json":{"schema":{"type":"object","properties":{"mensagem":{"type":"string","description":"Frase pronta, em português, dizendo o que aconteceu — pode ser repassada a quem pediu"},"usuario":{"$ref":"#/components/schemas/Usuario"},"token":{"type":"string","description":"Token de sessão: mande em Authorization: Bearer <token>"},"expiraEm":{"type":"string","format":"date-time"}},"required":["mensagem","usuario","token","expiraEm"]}}}},"400":{"description":"O corpo não é um JSON válido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"409":{"description":"Conflito com o estado atual (veja o código no corpo).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"422":{"description":"Dados inválidos: o corpo diz qual campo e por quê.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}}}}},"/api/auth/login":{"post":{"operationId":"fazerLogin","summary":"Fazer login","description":"Confere e-mail e senha e devolve um token de sessão (Authorization: Bearer <token>) para agir COMO aquele usuário. Use para testar se uma pessoa consegue entrar. Erros: 401 CREDENCIAIS_INVALIDAS (e-mail ou senha errados), 403 USUARIO_DESLIGADO. Não precisa de autenticação.","tags":["Autenticação"],"security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","maxLength":200,"pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","format":"email","description":"E-mail — é também o login","examples":["maria.souza@empresa.com"]},"senha":{"type":"string","minLength":1}},"required":["email","senha"],"additionalProperties":false}}}},"responses":{"200":{"description":"Login feito","content":{"application/json":{"schema":{"type":"object","properties":{"mensagem":{"type":"string","description":"Frase pronta, em português, dizendo o que aconteceu — pode ser repassada a quem pediu"},"usuario":{"$ref":"#/components/schemas/Usuario"},"token":{"type":"string","description":"Token de sessão: mande em Authorization: Bearer <token>"},"expiraEm":{"type":"string","format":"date-time"}},"required":["mensagem","usuario","token","expiraEm"]}}}},"400":{"description":"O corpo não é um JSON válido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"401":{"description":"Sem credencial, ou credencial inválida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"403":{"description":"Sem permissão para a ação, ou usuário desligado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"422":{"description":"Dados inválidos: o corpo diz qual campo e por quê.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}}}}},"/api/auth/logout":{"post":{"operationId":"encerrarSessao","summary":"Encerrar sessão","description":"Encerra a sessão do token enviado (ou do cookie). Com a chave de API ou Basic não há sessão a encerrar. Qualquer credencial válida serve.","tags":["Autenticação"],"responses":{"200":{"description":"Sessão encerrada","content":{"application/json":{"schema":{"type":"object","properties":{"mensagem":{"type":"string","description":"Frase pronta, em português, dizendo o que aconteceu — pode ser repassada a quem pediu"}},"required":["mensagem"]}}}},"401":{"description":"Sem credencial, ou credencial inválida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}}}}},"/api/me":{"get":{"operationId":"consultarQuemSouEu","summary":"Consultar quem sou eu","description":"Diz quem está chamando: a chave de API (usuario = null) ou o usuário do token ou do Basic, com o papel. Use para descobrir o próprio id antes de editar a própria conta ou trocar a própria senha. Qualquer credencial válida serve.","tags":["Autenticação"],"responses":{"200":{"description":"Quem está chamando","content":{"application/json":{"schema":{"type":"object","properties":{"ator":{"type":"object","properties":{"tipo":{"type":"string","enum":["chave_api","usuario"]},"papel":{"type":"string","enum":["admin","colaborador"]},"via":{"type":"string","description":"Por onde a credencial entrou: x-api-key, bearer-chave, bearer-sessao, basic ou cookie"}},"required":["tipo","papel","via"]},"usuario":{"anyOf":[{"$ref":"#/components/schemas/Usuario"},{"type":"null"}]}},"required":["ator","usuario"]}}}},"401":{"description":"Sem credencial, ou credencial inválida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}}}}},"/api/usuarios":{"get":{"operationId":"listarUsuarios","summary":"Listar usuários","description":"Lista usuários em ordem de nome, com a área de cada um. Use para achar o id de alguém pelo nome ou e-mail (busca), ver quem está numa área (areaId), quem está sem área (semArea=true) ou quem foi desligado (status=desligado). Qualquer credencial válida serve.","tags":["Usuários"],"parameters":[{"name":"busca","in":"query","required":false,"description":"Trecho do nome, e-mail ou cargo","schema":{"type":"string","maxLength":120}},{"name":"areaId","in":"query","required":false,"description":"Só os usuários desta área","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","examples":["3f1c1b1e-8d2a-4c55-9a51-2d8f3b6c7e90"]}},{"name":"semArea","in":"query","required":false,"description":"true = só quem está sem área","schema":{"type":"string","enum":["true","false"]}},{"name":"status","in":"query","required":false,"description":"desligado não consegue entrar, mas continua cadastrado (dá para religar)","schema":{"type":"string","enum":["ativo","desligado"]}},{"name":"papel","in":"query","required":false,"description":"admin gerencia áreas e usuários; colaborador só mexe na própria conta","schema":{"type":"string","enum":["admin","colaborador"]}},{"name":"limite","in":"query","required":false,"description":"Máximo de resultados (padrão 100)","schema":{"type":"integer","minimum":1,"maximum":200}}],"responses":{"200":{"description":"Usuários encontrados","content":{"application/json":{"schema":{"type":"object","properties":{"usuarios":{"type":"array","items":{"$ref":"#/components/schemas/Usuario"}},"total":{"type":"integer"}},"required":["usuarios","total"]}}}},"401":{"description":"Sem credencial, ou credencial inválida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"422":{"description":"Dados inválidos: o corpo diz qual campo e por quê.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}}}}},"/api/usuarios/{id}":{"get":{"operationId":"consultarUsuario","summary":"Consultar usuário","description":"Traz um usuário pelo id: contato, papel, status, área e, se desligado, quando e por quê. Qualquer credencial válida serve.","tags":["Usuários"],"parameters":[{"name":"id","in":"path","required":true,"description":"Id do usuário","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"O usuário","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Usuario"}}}},"401":{"description":"Sem credencial, ou credencial inválida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"404":{"description":"O recurso do caminho não existe.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"422":{"description":"Dados inválidos: o corpo diz qual campo e por quê.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}}}},"patch":{"operationId":"editarUsuario","summary":"Editar informações do usuário","description":"Altera nome, e-mail, telefone ou cargo — e o papel, só para administrador. Mande apenas os campos que mudam; texto vazio apaga telefone ou cargo. Precisa do id do usuário: ache-o com Listar usuários (busca pelo nome ou e-mail). Erro 409 EMAIL_EM_USO se o novo e-mail já é de outra pessoa. O próprio usuário pode; para outra pessoa, exige administrador ou a chave de API.","tags":["Usuários"],"parameters":[{"name":"id","in":"path","required":true,"description":"Id do usuário","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"nome":{"type":"string","minLength":2,"maxLength":120,"description":"Nome completo","examples":["Maria Souza"]},"email":{"type":"string","maxLength":200,"pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","format":"email","description":"E-mail — é também o login","examples":["maria.souza@empresa.com"]},"telefone":{"type":"string","maxLength":30,"description":"Telefone com DDD. Texto vazio apaga.","examples":["(11) 98765-4321"]},"cargo":{"type":"string","maxLength":80,"description":"Cargo. Texto vazio apaga.","examples":["Analista financeiro"]},"papel":{"description":"Só um administrador (ou a chave de API) pode mudar o papel.","type":"string","enum":["admin","colaborador"]}},"additionalProperties":false,"minProperties":1}}}},"responses":{"200":{"description":"Usuário atualizado","content":{"application/json":{"schema":{"type":"object","properties":{"mensagem":{"type":"string","description":"Frase pronta, em português, dizendo o que aconteceu — pode ser repassada a quem pediu"},"usuario":{"$ref":"#/components/schemas/Usuario"},"alterados":{"type":"array","items":{"type":"string"},"description":"Campos que de fato mudaram"}},"required":["mensagem","usuario","alterados"]}}}},"400":{"description":"O corpo não é um JSON válido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"401":{"description":"Sem credencial, ou credencial inválida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"403":{"description":"Sem permissão para a ação, ou usuário desligado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"404":{"description":"O recurso do caminho não existe.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"409":{"description":"Conflito com o estado atual (veja o código no corpo).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"422":{"description":"Dados inválidos: o corpo diz qual campo e por quê.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}}}},"delete":{"operationId":"removerUsuario","summary":"Remover usuário","description":"Apaga o usuário DEFINITIVAMENTE, sem volta. Só use quando pedirem explicitamente para excluir ou apagar o cadastro; para tirar o acesso, use Desligar usuário. Precisa do id do usuário: ache-o com Listar usuários (busca pelo nome ou e-mail). Erro 409 ULTIMO_ADMIN. Exige administrador ou a chave de API.","tags":["Usuários"],"parameters":[{"name":"id","in":"path","required":true,"description":"Id do usuário","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Usuário removido","content":{"application/json":{"schema":{"type":"object","properties":{"mensagem":{"type":"string","description":"Frase pronta, em português, dizendo o que aconteceu — pode ser repassada a quem pediu"},"removido":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"nome":{"type":"string"},"email":{"type":"string"}},"required":["id","nome","email"]}},"required":["mensagem","removido"]}}}},"401":{"description":"Sem credencial, ou credencial inválida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"403":{"description":"Sem permissão para a ação, ou usuário desligado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"404":{"description":"O recurso do caminho não existe.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"409":{"description":"Conflito com o estado atual (veja o código no corpo).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"422":{"description":"Dados inválidos: o corpo diz qual campo e por quê.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}}}}},"/api/usuarios/{id}/senha":{"post":{"operationId":"trocarSenha","summary":"Trocar senha do usuário","description":"Troca a senha. Quem troca a própria informa senhaAtual e novaSenha; administrador ou chave de API redefinem a de outra pessoa só com novaSenha. As outras sessões da pessoa caem. Precisa do id do usuário: ache-o com Listar usuários (busca pelo nome ou e-mail). Erros 422: SENHA_ATUAL_OBRIGATORIA, SENHA_ATUAL_INCORRETA, SENHA_REPETIDA. O próprio usuário pode; para outra pessoa, exige administrador ou a chave de API.","tags":["Usuários"],"parameters":[{"name":"id","in":"path","required":true,"description":"Id do usuário","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"senhaAtual":{"description":"Senha atual. Obrigatória quando o próprio usuário troca a sua. Dispensada para administrador ou chave de API redefinindo a de outra pessoa.","type":"string","minLength":1},"novaSenha":{"type":"string","minLength":8,"maxLength":128,"description":"Nova senha (mínimo 8 caracteres)"}},"required":["novaSenha"],"additionalProperties":false}}}},"responses":{"200":{"description":"Senha trocada","content":{"application/json":{"schema":{"type":"object","properties":{"mensagem":{"type":"string","description":"Frase pronta, em português, dizendo o que aconteceu — pode ser repassada a quem pediu"},"sessoesEncerradas":{"type":"integer"}},"required":["mensagem","sessoesEncerradas"]}}}},"400":{"description":"O corpo não é um JSON válido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"401":{"description":"Sem credencial, ou credencial inválida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"403":{"description":"Sem permissão para a ação, ou usuário desligado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"404":{"description":"O recurso do caminho não existe.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"422":{"description":"Dados inválidos: o corpo diz qual campo e por quê.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}}}}},"/api/usuarios/{id}/area":{"put":{"operationId":"moverUsuarioDeArea","summary":"Mover usuário de área","description":"Coloca o usuário na área (setor) de areaId. Use quando pedirem para transferir, realocar ou mudar alguém de setor. Precisa do id do usuário (Listar usuários) e do id da área (Listar áreas). Se ele já está nessa área, nada muda (mudou = false). Erro 422 AREA_NAO_ENCONTRADA se a área não existe. Exige administrador ou a chave de API.","tags":["Usuários"],"parameters":[{"name":"id","in":"path","required":true,"description":"Id do usuário","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"areaId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","examples":["3f1c1b1e-8d2a-4c55-9a51-2d8f3b6c7e90"],"description":"Id da área de destino. Para deixar o usuário sem área, use Tirar usuário da área."}},"required":["areaId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Área definida","content":{"application/json":{"schema":{"type":"object","properties":{"mensagem":{"type":"string","description":"Frase pronta, em português, dizendo o que aconteceu — pode ser repassada a quem pediu"},"usuario":{"$ref":"#/components/schemas/Usuario"},"mudou":{"type":"boolean"}},"required":["mensagem","usuario","mudou"]}}}},"400":{"description":"O corpo não é um JSON válido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"401":{"description":"Sem credencial, ou credencial inválida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"403":{"description":"Sem permissão para a ação, ou usuário desligado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"404":{"description":"O recurso do caminho não existe.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"422":{"description":"Dados inválidos: o corpo diz qual campo e por quê.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}}}},"delete":{"operationId":"tirarUsuarioDaArea","summary":"Tirar usuário da área","description":"Deixa o usuário sem área nenhuma, sem colocá-lo em outra. Precisa do id do usuário: ache-o com Listar usuários (busca pelo nome ou e-mail). Exige administrador ou a chave de API.","tags":["Usuários"],"parameters":[{"name":"id","in":"path","required":true,"description":"Id do usuário","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Usuário sem área","content":{"application/json":{"schema":{"type":"object","properties":{"mensagem":{"type":"string","description":"Frase pronta, em português, dizendo o que aconteceu — pode ser repassada a quem pediu"},"usuario":{"$ref":"#/components/schemas/Usuario"},"mudou":{"type":"boolean"}},"required":["mensagem","usuario","mudou"]}}}},"401":{"description":"Sem credencial, ou credencial inválida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"403":{"description":"Sem permissão para a ação, ou usuário desligado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"404":{"description":"O recurso do caminho não existe.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"422":{"description":"Dados inválidos: o corpo diz qual campo e por quê.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}}}}},"/api/usuarios/{id}/desligar":{"post":{"operationId":"desligarUsuario","summary":"Desligar usuário","description":"Desativa a conta: a pessoa não entra mais e as sessões dela caem, mas o cadastro continua e dá para religar. Use para desligamento, demissão, afastamento ou bloqueio de acesso — prefira isto a remover. Precisa do id do usuário: ache-o com Listar usuários (busca pelo nome ou e-mail). Erros 409: USUARIO_JA_DESLIGADO, ULTIMO_ADMIN. Exige administrador ou a chave de API.","tags":["Usuários"],"parameters":[{"name":"id","in":"path","required":true,"description":"Id do usuário","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"motivo":{"description":"Motivo do desligamento, registrado no usuário e no histórico","examples":["Pedido de demissão"],"type":"string","maxLength":300}},"additionalProperties":false}}}},"responses":{"200":{"description":"Usuário desligado","content":{"application/json":{"schema":{"type":"object","properties":{"mensagem":{"type":"string","description":"Frase pronta, em português, dizendo o que aconteceu — pode ser repassada a quem pediu"},"usuario":{"$ref":"#/components/schemas/Usuario"},"sessoesEncerradas":{"type":"integer"}},"required":["mensagem","usuario","sessoesEncerradas"]}}}},"400":{"description":"O corpo não é um JSON válido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"401":{"description":"Sem credencial, ou credencial inválida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"403":{"description":"Sem permissão para a ação, ou usuário desligado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"404":{"description":"O recurso do caminho não existe.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"409":{"description":"Conflito com o estado atual (veja o código no corpo).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"422":{"description":"Dados inválidos: o corpo diz qual campo e por quê.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}}}}},"/api/usuarios/{id}/religar":{"post":{"operationId":"religarUsuario","summary":"Religar usuário","description":"Reativa uma conta desligada; a pessoa volta a poder entrar. Precisa do id do usuário: ache-o com Listar usuários (busca pelo nome ou e-mail). Erro 409 USUARIO_JA_ATIVO. Exige administrador ou a chave de API.","tags":["Usuários"],"parameters":[{"name":"id","in":"path","required":true,"description":"Id do usuário","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Usuário religado","content":{"application/json":{"schema":{"type":"object","properties":{"mensagem":{"type":"string","description":"Frase pronta, em português, dizendo o que aconteceu — pode ser repassada a quem pediu"},"usuario":{"$ref":"#/components/schemas/Usuario"}},"required":["mensagem","usuario"]}}}},"401":{"description":"Sem credencial, ou credencial inválida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"403":{"description":"Sem permissão para a ação, ou usuário desligado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"404":{"description":"O recurso do caminho não existe.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"409":{"description":"Conflito com o estado atual (veja o código no corpo).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"422":{"description":"Dados inválidos: o corpo diz qual campo e por quê.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}}}}},"/api/areas":{"get":{"operationId":"listarAreas","summary":"Listar áreas","description":"Lista as áreas (setores) com o total de usuários de cada uma. Use para achar o id de uma área pelo nome. Qualquer credencial válida serve.","tags":["Áreas"],"responses":{"200":{"description":"As áreas","content":{"application/json":{"schema":{"type":"object","properties":{"areas":{"type":"array","items":{"$ref":"#/components/schemas/Area"}}},"required":["areas"]}}}},"401":{"description":"Sem credencial, ou credencial inválida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}}}},"post":{"operationId":"criarArea","summary":"Criar área","description":"Cria uma área (setor) nova, vazia. Erro 409 AREA_JA_EXISTE se o nome já existe (sem diferenciar maiúsculas). Exige administrador ou a chave de API.","tags":["Áreas"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"nome":{"type":"string","minLength":2,"maxLength":80,"description":"Nome da área (setor), único","examples":["Jurídico"]},"descricao":{"description":"Para que serve a área","type":"string","maxLength":300}},"required":["nome"],"additionalProperties":false}}}},"responses":{"201":{"description":"Área criada","content":{"application/json":{"schema":{"type":"object","properties":{"mensagem":{"type":"string","description":"Frase pronta, em português, dizendo o que aconteceu — pode ser repassada a quem pediu"},"area":{"$ref":"#/components/schemas/Area"}},"required":["mensagem","area"]}}}},"400":{"description":"O corpo não é um JSON válido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"401":{"description":"Sem credencial, ou credencial inválida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"403":{"description":"Sem permissão para a ação, ou usuário desligado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"409":{"description":"Conflito com o estado atual (veja o código no corpo).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"422":{"description":"Dados inválidos: o corpo diz qual campo e por quê.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}}}}},"/api/areas/{id}":{"get":{"operationId":"consultarArea","summary":"Consultar área","description":"Traz uma área e a lista de quem está nela. Qualquer credencial válida serve.","tags":["Áreas"],"parameters":[{"name":"id","in":"path","required":true,"description":"Id da área","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"A área e seus usuários","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AreaDetalhada"}}}},"401":{"description":"Sem credencial, ou credencial inválida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"404":{"description":"O recurso do caminho não existe.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"422":{"description":"Dados inválidos: o corpo diz qual campo e por quê.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}}}},"delete":{"operationId":"removerArea","summary":"Remover área","description":"Apaga a área. Se ela tem usuários, responde 409 AREA_COM_USUARIOS com os nomes — a menos que moverUsuariosPara traga o id da área que vai recebê-los. Exige administrador ou a chave de API.","tags":["Áreas"],"parameters":[{"name":"id","in":"path","required":true,"description":"Id da área","schema":{"type":"string","format":"uuid"}},{"name":"moverUsuariosPara","in":"query","required":false,"description":"Id da área que recebe os usuários da área removida. Sem ele, remover uma área com usuários responde 409.","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","examples":["3f1c1b1e-8d2a-4c55-9a51-2d8f3b6c7e90"]}}],"responses":{"200":{"description":"Área removida","content":{"application/json":{"schema":{"type":"object","properties":{"mensagem":{"type":"string","description":"Frase pronta, em português, dizendo o que aconteceu — pode ser repassada a quem pediu"},"removida":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"nome":{"type":"string"}},"required":["id","nome"]},"usuariosMovidos":{"type":"integer"},"destino":{"anyOf":[{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"nome":{"type":"string"}},"required":["id","nome"]},{"type":"null"}]}},"required":["mensagem","removida","usuariosMovidos","destino"]}}}},"401":{"description":"Sem credencial, ou credencial inválida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"403":{"description":"Sem permissão para a ação, ou usuário desligado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"404":{"description":"O recurso do caminho não existe.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"409":{"description":"Conflito com o estado atual (veja o código no corpo).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"422":{"description":"Dados inválidos: o corpo diz qual campo e por quê.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}}}}},"/api/historico":{"get":{"operationId":"consultarHistorico","summary":"Consultar histórico","description":"Últimas ações feitas no serviço — quem, o quê, quando e por qual credencial —, da mais nova para a mais antiga. Use para conferir se uma ação pedida foi mesmo feita. alvoId filtra por um usuário ou uma área. Exige administrador ou a chave de API.","tags":["Histórico"],"parameters":[{"name":"limite","in":"query","required":false,"description":"Máximo de eventos (padrão 100)","schema":{"type":"integer","minimum":1,"maximum":500}},{"name":"alvoId","in":"query","required":false,"description":"Só os eventos deste usuário ou desta área","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","examples":["3f1c1b1e-8d2a-4c55-9a51-2d8f3b6c7e90"]}}],"responses":{"200":{"description":"Os eventos","content":{"application/json":{"schema":{"type":"object","properties":{"eventos":{"type":"array","items":{"$ref":"#/components/schemas/Evento"}}},"required":["eventos"]}}}},"401":{"description":"Sem credencial, ou credencial inválida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"403":{"description":"Sem permissão para a ação, ou usuário desligado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"422":{"description":"Dados inválidos: o corpo diz qual campo e por quê.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}}}}},"/api/health":{"get":{"operationId":"verificarSaude","summary":"Verificar saúde do serviço","description":"Diz se o serviço está no ar e se o banco responde. Use para diagnosticar quando as outras chamadas falham sem motivo claro. Não precisa de autenticação.","tags":["Serviço"],"security":[],"responses":{"200":{"description":"Serviço e banco no ar","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"banco":{"type":"string","enum":["conectado","sem conexão"]}},"required":["ok","banco"]}}}},"503":{"description":"O serviço responde, mas o banco não","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"banco":{"type":"string","enum":["conectado","sem conexão"]}},"required":["ok","banco"]}}}}}}},"/api/openapi.json":{"get":{"operationId":"obterEspecificacao","summary":"Obter especificação OpenAPI","description":"Devolve este documento OpenAPI 3.1: todas as rotas, parâmetros, corpos e respostas. É o que o noria importa para criar as tools. Não precisa de autenticação.","tags":["Serviço"],"security":[],"responses":{"200":{"description":"O documento OpenAPI","content":{"application/json":{"schema":{"type":"object","description":"Documento OpenAPI 3.1 deste serviço"}}}}}}}}}