{"openapi":"3.0.0","paths":{"/health":{"get":{"description":"Liveness; não verifica a disponibilidade do Appwrite.","operationId":"HealthController_health","parameters":[],"responses":{"200":{"description":""}},"summary":"Verificar processo","tags":["Health"]}},"/v1/spaces":{"get":{"operationId":"VaultController_listSpaces","parameters":[{"name":"cursor","required":false,"in":"query","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"integer","minimum":1,"maximum":50,"default":25}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["items","nextCursor"],"properties":{"items":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","name","createdAt"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"createdAt":{"type":"string","format":"date-time"}}}},"nextCursor":{"type":"string","nullable":true,"description":"Cursor opaco. Encerrar somente quando null."}}}}}},"400":{"description":"Entrada inválida.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Autenticação necessária ou token inválido.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Usuário sem acesso ao cofre.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Espaço ou cursor indisponível.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"429":{"description":"Limite da dependência atingido.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"503":{"description":"Dependência indisponível.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}},"security":[{"appwrite-jwt":[]}],"summary":"Listar espaços","tags":["Cofre"]},"post":{"operationId":"VaultController_createSpace","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["name"],"properties":{"name":{"type":"string","minLength":1,"maxLength":128,"example":"Desenvolvimento"}}}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["id","name","createdAt"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"createdAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Entrada inválida.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Autenticação necessária ou token inválido.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Usuário sem acesso ao cofre.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Espaço ou cursor indisponível.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"429":{"description":"Limite da dependência atingido.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"503":{"description":"Dependência indisponível.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}},"security":[{"appwrite-jwt":[]}],"summary":"Criar espaço","tags":["Cofre"]}},"/v1/spaces/{spaceId}/credentials":{"get":{"description":"Nunca retorna o segredo.","operationId":"VaultController_listCredentials","parameters":[{"name":"spaceId","required":true,"in":"path","schema":{"type":"string"}},{"name":"cursor","required":false,"in":"query","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"integer","minimum":1,"maximum":50,"default":25}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["items","nextCursor"],"properties":{"items":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","key","spaceId","createdAt"],"properties":{"id":{"type":"string"},"key":{"type":"string"},"spaceId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"file":{"type":"object","additionalProperties":false,"required":["name","size"],"properties":{"name":{"type":"string"},"size":{"type":"integer","minimum":0}}}}}},"nextCursor":{"type":"string","nullable":true,"description":"Cursor opaco. Encerrar somente quando null."}}}}}},"400":{"description":"Entrada inválida.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Autenticação necessária ou token inválido.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Usuário sem acesso ao cofre.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Espaço ou cursor indisponível.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"429":{"description":"Limite da dependência atingido.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"503":{"description":"Dependência indisponível.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}},"security":[{"appwrite-jwt":[]}],"summary":"Listar metadados das credenciais","tags":["Cofre"]},"post":{"description":"A chave é sensível a maiúsculas e única por espaço. Segredo não é devolvido.","operationId":"VaultController_createCredential","parameters":[{"name":"spaceId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["key","secret"],"properties":{"key":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$","example":"EXAMPLE_TOKEN"},"secret":{"type":"string","minLength":1,"maxLength":16000,"writeOnly":true,"format":"password"}}}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["id","key","spaceId","createdAt"],"properties":{"id":{"type":"string"},"key":{"type":"string"},"spaceId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"file":{"type":"object","additionalProperties":false,"required":["name","size"],"properties":{"name":{"type":"string"},"size":{"type":"integer","minimum":0}}}}}}}},"400":{"description":"Entrada inválida.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Autenticação necessária ou token inválido.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Usuário sem acesso ao cofre.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Espaço ou cursor indisponível.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"409":{"description":"Chave já cadastrada neste espaço.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"429":{"description":"Limite da dependência atingido.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"503":{"description":"Dependência indisponível.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}},"security":[{"appwrite-jwt":[]}],"summary":"Salvar credencial","tags":["Cofre"]}},"/v1/spaces/{spaceId}/files":{"post":{"description":"Armazena o conteúdo em bucket privado; respostas comuns retornam somente nome e tamanho.","operationId":"VaultController_createFile","parameters":[{"name":"spaceId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["key","fileName","contentBase64"],"properties":{"key":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$"},"fileName":{"type":"string","minLength":1,"maxLength":255},"contentBase64":{"type":"string","format":"byte","maxLength":1398104,"writeOnly":true}}}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["id","key","spaceId","createdAt"],"properties":{"id":{"type":"string"},"key":{"type":"string"},"spaceId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"file":{"type":"object","additionalProperties":false,"required":["name","size"],"properties":{"name":{"type":"string"},"size":{"type":"integer","minimum":0}}}}}}}},"400":{"description":"Entrada inválida.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Autenticação necessária ou token inválido.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Usuário sem acesso ao cofre.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Espaço ou cursor indisponível.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"409":{"description":"Chave já cadastrada neste espaço.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"429":{"description":"Limite da dependência atingido.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"503":{"description":"Dependência indisponível.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}},"security":[{"appwrite-jwt":[]}],"summary":"Guardar arquivo como credencial","tags":["Cofre"]}},"/v1/spaces/{spaceId}/credentials/{credentialId}/file":{"get":{"description":"Única resposta que contém o conteúdo do arquivo, codificado em base64.","operationId":"VaultController_getFile","parameters":[{"name":"spaceId","required":true,"in":"path","schema":{"type":"string"}},{"name":"credentialId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["fileName","contentBase64"],"properties":{"fileName":{"type":"string"},"contentBase64":{"type":"string","format":"byte"}}}}}},"400":{"description":"Entrada inválida.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Autenticação necessária ou token inválido.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Usuário sem acesso ao cofre.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Espaço ou cursor indisponível.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"429":{"description":"Limite da dependência atingido.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"503":{"description":"Dependência indisponível.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}},"security":[{"appwrite-jwt":[]}],"summary":"Baixar arquivo da credencial","tags":["Cofre"]}},"/auth/session":{"get":{"summary":"Verificar a sessão do navegador","responses":{"200":{"description":"Sessão válida"},"401":{"description":"Sessão ausente ou expirada"},"503":{"description":"Identidade indisponível"}}},"post":{"summary":"Entrar com a conta NEAD Ops","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["email","password"],"properties":{"email":{"type":"string","format":"email","maxLength":320},"password":{"type":"string","format":"password","minLength":8,"maxLength":256}}}}}},"responses":{"200":{"description":"Sessão criada em cookie HttpOnly"},"400":{"description":"Entrada inválida"},"401":{"description":"Credenciais inválidas"},"403":{"description":"Origem não autorizada"},"429":{"description":"Limite de tentativas excedido"},"503":{"description":"Identidade indisponível"}}}},"/auth/logout":{"post":{"summary":"Revogar a sessão atual","responses":{"204":{"description":"Sessão revogada e cookie removido"},"403":{"description":"Origem não autorizada"},"503":{"description":"Não foi possível revogar a sessão"}}}}},"info":{"title":"NEAD Vault API","description":"Cadastro de credenciais do NEAD Ops. A interface usa sessão HttpOnly; clientes de API também podem usar JWT Appwrite. Respostas nunca incluem segredos.","version":"1.0.0","contact":{}},"tags":[],"servers":[],"components":{"securitySchemes":{"appwrite-jwt":{"scheme":"bearer","bearerFormat":"Appwrite JWT","type":"http"}},"schemas":{}}}