storage-p

Documentação da API

A mesma API REST sobre a qual o cliente web roda. Cada item é criptografado no seu navegador antes de sair do dispositivo — o servidor só vê texto cifrado e não tem como lê-lo. Use-a para criar seus próprios clientes ou para dar a uma integração acesso restrito e confirmável a alguns itens. Base URL: https://storage-p.com

Especificação OpenAPI (legível por máquina, para integrações) /openapi.yaml

Guias

Passo a passo completo do que o storage-p realmente faz — baseado no conjunto real de recursos, nada inventado.

Auto-hospedagem no seu próprio servidor

Rode o storage-p como um contêiner Docker atrás do Caddy no seu domínio. O Caddy serve o cliente estático e faz proxy reverso de /api para o backend; o banco de dados SQLite é criptografado em repouso com SQLCipher. Você o opera de ponta a ponta — ninguém mais tem as chaves.

Armazenar e gerar chaves SSH / TLS

Gere chaves SSH Ed25519 (formato OpenSSH) e certificados TLS autoassinados na aba Geradores, ou faça upload de arquivos de chave/certificado existentes (até 1 MB). O material privado é criptografado no navegador antes do upload, então ele nunca existe em texto puro no servidor.

Links de uso único que se autodestroem

Compartilhe um único item ou uma pasta inteira por um link cuja chave de descriptografia vive apenas no fragmento da URL (#…) — a parte que os navegadores nunca enviam ao servidor. Defina um TTL e um limite de visualizações; após a última visualização, os dados não podem mais ser abertos.

Tokens de API restritos com confirmação

Crie um token que pode ler apenas os itens ou projetos da sua lista de permissões. Ative a confirmação por leitura e cada acesso fica em espera até você aprovar pelo sino no app ou por uma mensagem do Telegram; adicione um limite de taxa e um prazo de expiração. A integração recebe o item ainda criptografado mais uma chave de acesso de uso único para descriptografá-lo localmente.

Projetos e acesso da equipe

Transforme uma pasta em um projeto com a sua própria chave. Conceda a outro usuário acesso de leitura ou escrita e a chave do projeto é selada para a chave pública dele (X25519), de modo que ele trabalha com os itens mais recentes sem que o servidor jamais veja uma cópia legível. Revogue qualquer concessão a qualquer momento.

TOTP / 2FA integrado

Guarde o segredo TOTP de um login ao lado dele e leia o código rotativo em tempo real no mesmo lugar — o storage-p também funciona como seu autenticador. Você também pode proteger sua própria conta com TOTP de duplo fator.

Importar de outro gerenciador

Traga um JSON do Bitwarden, um CSV do KeePass ou qualquer CSV com as colunas name/username/password/url/notes. A análise e a criptografia rodam no seu dispositivo, então as entradas são recriptografadas com a sua chave e nunca enviadas em texto claro.

Documentação da API · API

Autenticação

Obtenha um token de acesso via register/login e o envie como token Bearer. Os tokens de acesso têm vida curta (15 min); renove com o refresh token.

Authorization: Bearer <access_token>

Auth

Cadastre-se, entre e mantenha a sessão ativa. A senha mestra nunca sai do navegador — apenas um auth-hash Argon2id é enviado.

POST /api/v1/auth/register
Crie uma conta. O cliente escolhe os parâmetros do KDF e envia sua chave privada já criptografada.
Corpo{ email, master_password, kdf_salt_b64, kdf_memory_kib, kdf_iters, kdf_parallelism, pubkey_b64, privkey_enc_b64 }
Resposta{ access_token, refresh_token, user_id, kdf_* }
POST /api/v1/auth/login
Entre. Retorna os tokens mais o salt do KDF que o cliente precisa para derivar a chave do cofre.
Corpo{ email, master_password, totp_code? }
Resposta{ access_token, refresh_token, user_id, kdf_*, totp_required }
POST /api/v1/auth/refresh
Troque um refresh token por um novo token de acesso de vida curta.
Corpo{ refresh_token }
Resposta{ access_token, refresh_token }
POST /api/v1/auth/logout Bearer
Revogue o refresh token atual.
Resposta{ ok }
POST /api/v1/auth/totp/setup Bearer
Ative o duplo fator TOTP para a conta.
Corpo{ secret_b32, current_code }
Resposta{ ok }

Vault

CRUD sobre os seus itens. Tudo entra e sai já criptografado; o servidor armazena e devolve somente texto cifrado.

GET /api/v1/vault Bearer
Liste todos os itens (texto cifrado) do seu cofre.
Resposta[ { id, meta_enc_b64, body_enc_b64, version, created_at, updated_at } ]
POST /api/v1/vault Bearer
Adicione um item. meta/body já estão criptografados no cliente antes do upload.
Corpo{ meta_enc_b64, body_enc_b64, blind_index_b64? }
Resposta{ id, ... }
GET /api/v1/vault/:id Bearer
Busque um único item por id.
PUT /api/v1/vault/:id Bearer
Atualize um item; expected_version protege contra sobrescrever uma alteração mais recente.
Corpo{ meta_enc_b64?, body_enc_b64?, expected_version }
DELETE /api/v1/vault/:id Bearer
Mova um item para a lixeira (exclusão lógica, reversível).
GET /api/v1/vault/trash Bearer
Liste os itens que estão na lixeira.
POST /api/v1/vault/:id/restore Bearer
Restaure um item da lixeira.
DELETE /api/v1/vault/:id/purge Bearer
Exclua um item permanentemente — não pode ser desfeito.

Sharing

Duas formas de entregar um segredo a outra pessoa: um link de uso único que se autodestrói após a leitura, ou uma entrega ponta a ponta sealed-box a outro usuário.

POST /api/v1/share Bearer
Crie um link de uso único. A chave de descriptografia vive no fragmento da URL e nunca chega ao servidor.
Corpo{ payload_b64, nonce_b64, ttl_secs, max_views }
Resposta{ id, expires_at }
GET /api/v1/share/:id
Abra um link de uso único. Some após o número de visualizações permitido.
Resposta{ payload_b64, nonce_b64 }
GET /api/v1/users/lookup?email= Bearer
Encontre a chave pública de um usuário pelo e-mail para compartilhar ponta a ponta com ele.
Resposta{ user_id, pubkey_b64 }
POST /api/v1/shares/user Bearer
Envie um item a outro usuário, selado para a chave pública dele — só ele consegue abrir.
Corpo{ to_email, payload_b64 }
GET /api/v1/shares/incoming Bearer
Liste os itens que outros usuários compartilharam com você.
DELETE /api/v1/shares/:id Bearer
Remova um compartilhamento de entrada ou de saída.

Tokens & confirmations

Tokens restritos permitem que uma integração leia itens selecionados, opcionalmente protegidos pela sua confirmação no app/Telegram.

GET /api/v1/tokens Bearer
Liste seus tokens de API.
POST /api/v1/tokens Bearer
Crie um token restrito para uma integração — escolha quais itens ele pode ler e se cada leitura precisa de confirmação.
Corpo{ name, item_ids[], require_confirmation, rate_limit_per_hour, ttl_secs }
Resposta{ id, token, expires_at }
DELETE /api/v1/tokens/:id Bearer
Revogue um token imediatamente.
GET /api/v1/confirmations/pending Bearer
Liste as solicitações de acesso aguardando sua aprovação.
POST /api/v1/confirmations/:id/resolve Bearer
Aprove ou negue uma solicitação pendente.
Corpo{ decision: "approve"|"deny" }
GET /api/v1/api/vault/:id Bearer (scoped token)
Como uma integração lê um item restrito. Se a confirmação for necessária, a primeira chamada retorna um confirmation_id para consultar até você aprovar.

Tokens de API restritos (para integrações)

Crie um token restrito na interface (Tokens de API). Ele só pode ler itens da lista de permissões, e as leituras podem exigir confirmação. Fluxo: o primeiro GET retorna um confirmation_id com status pending_confirmation; o dono aprova no app ou pelo Telegram; repita o GET com ?confirmation_id= para receber o item (ainda criptografado no cliente).

Notas

meta_enc / body_enc são nonce(24)‖ciphertext, criptografados com a chave do cofre derivada da senha mestra. O servidor não consegue descriptografá-los.