Quick Start
UnveilPass is a zero-knowledge password manager. All vault data is encrypted client-side. The API returns and accepts only ciphertext — you must derive keys and encrypt/decrypt on your end.
Authenticate with an API Key
# Step 1: Get your salt
curl -X POST https://unveilpass.com:8444/api/auth/api-key/init \
-H "Content-Type: application/json" \
-d '{"api_key": "uvp_your_key_here"}'
# Response: {"salt": "base64_salt_value"}
# Step 2: Derive auth_key from master password + salt using Argon2id
# (time=3, mem=64MB, parallelism=4, hashLen=64)
# auth_key = first 32 bytes of the hash, base64-encoded
# Step 3: Login with API key + auth_key
curl -X POST https://unveilpass.com:8444/api/auth/api-key \
-H "Content-Type: application/json" \
-d '{"api_key": "uvp_your_key_here", "auth_key": "base64_derived_key"}'
# Response: {"token": "jwt_token", "encrypted_vault_key": "...", ...}
# Step 4: Use the JWT token for all subsequent requests
curl https://unveilpass.com:8444/api/vault \
-H "Authorization: Bearer YOUR_TOKEN"
encrypted_vault_key returned at login must be unwrapped with your KEK (derived via HKDF-SHA256 from the Argon2id hash). This vault key is then used to encrypt and decrypt all vault entries.
Authentication
UnveilPass supports two authentication methods. Both return a JWT token used as Authorization: Bearer <token> for all API calls.
Method 1: Email Login
The standard two-step email login flow:
Request Body
{
"email": "user@example.com"
}
Response
{
"salt": "base64_encoded_salt"
}
curl Example
curl -X POST https://unveilpass.com:8444/api/auth/login/init \
-H "Content-Type: application/json" \
-d '{"email": "user@example.com"}'
Request Body
{
"email": "user@example.com",
"auth_key": "base64_derived_auth_key",
"device_token": "optional_device_token",
"verification_code": "optional_6_digit_code"
}
Response
{
"token": "jwt_token",
"encrypted_vault_key": "iv:ciphertext",
"encrypted_private_key": "iv:ciphertext",
"public_key": "base64_public_key"
}
curl Example
curl -X POST https://unveilpass.com:8444/api/auth/login \
-H "Content-Type: application/json" \
-d '{"email": "user@example.com", "auth_key": "base64_key"}'
Method 2: API Key Login
API keys provide a streamlined login for CLI tools, scripts, and CI/CD pipelines. No device trust or TOTP required.
Request Body
{
"api_key": "uvp_your_key_here"
}
Response
{
"salt": "base64_encoded_salt"
}
curl Example
curl -X POST https://unveilpass.com:8444/api/auth/api-key/init \
-H "Content-Type: application/json" \
-d '{"api_key": "uvp_your_key_here"}'
Request Body
{
"api_key": "uvp_your_key_here",
"auth_key": "base64_derived_auth_key"
}
Response
{
"token": "jwt_token",
"encrypted_vault_key": "iv:ciphertext",
"encrypted_private_key": "iv:ciphertext",
"public_key": "base64_public_key"
}
auth_key is still required because the server must verify your master password knowledge before releasing your encrypted vault key.
curl Example
curl -X POST https://unveilpass.com:8444/api/auth/api-key \
-H "Content-Type: application/json" \
-d '{"api_key": "uvp_your_key_here", "auth_key": "base64_key"}'
API Key Management
Manage API keys for programmatic access. Keys are prefixed with uvp_ and can be generated from Settings in the web UI or via the API.
Response
[
{
"id": 1,
"name": "CI/CD Pipeline",
"prefix": "uvp_abc1",
"created_at": "2026-03-28T10:00:00Z",
"last_used_at": "2026-03-28T14:30:00Z",
"revoked": false
}
]
curl Example
curl https://unveilpass.com:8444/api/auth/api-keys \
-H "Authorization: Bearer YOUR_TOKEN"
Request Body
{
"name": "CI/CD Pipeline"
}
Response
{
"id": 2,
"name": "CI/CD Pipeline",
"api_key": "uvp_a1b2c3d4e5f6g7h8i9j0..."
}
curl Example
curl -X POST https://unveilpass.com:8444/api/auth/api-keys \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "CI/CD Pipeline"}'
Response
{
"message": "API key revoked"
}
curl Example
curl -X DELETE https://unveilpass.com:8444/api/auth/api-keys/2 \
-H "Authorization: Bearer YOUR_TOKEN"
Vault
Vault entries store encrypted credentials. All encrypted_data fields contain AES-256-GCM ciphertext that must be decrypted client-side with the vault key.
Response
[
{
"id": 1,
"encrypted_data": "base64_ciphertext",
"iv": "base64_iv",
"created_at": "2026-03-28T10:00:00Z",
"updated_at": "2026-03-28T14:30:00Z"
}
]
After decryption, each entry contains: site, username, password, notes, folder, favorite, totp_secret, urls.
curl Example
curl https://unveilpass.com:8444/api/vault \
-H "Authorization: Bearer YOUR_TOKEN"
Request Body
{
"encrypted_data": "base64_ciphertext",
"iv": "base64_iv",
"expires_at": "2027-01-01T00:00:00Z"
}
Response
{
"id": 2,
"encrypted_data": "base64_ciphertext",
"iv": "base64_iv",
"created_at": "2026-03-28T15:00:00Z",
"updated_at": "2026-03-28T15:00:00Z"
}
curl Example
curl -X POST https://unveilpass.com:8444/api/vault \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"encrypted_data": "...", "iv": "..."}'
Response
{
"id": 1,
"encrypted_data": "base64_ciphertext",
"iv": "base64_iv",
"created_at": "2026-03-28T10:00:00Z",
"updated_at": "2026-03-28T14:30:00Z"
}
curl Example
curl https://unveilpass.com:8444/api/vault/1 \
-H "Authorization: Bearer YOUR_TOKEN"
Request Body
{
"encrypted_data": "base64_new_ciphertext",
"iv": "base64_new_iv"
}
Response
{
"id": 1,
"encrypted_data": "base64_new_ciphertext",
"iv": "base64_new_iv",
"updated_at": "2026-03-28T16:00:00Z"
}
curl Example
curl -X PUT https://unveilpass.com:8444/api/vault/1 \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"encrypted_data": "...", "iv": "..."}'
Response
{
"message": "Entry deleted"
}
curl Example
curl -X DELETE https://unveilpass.com:8444/api/vault/1 \
-H "Authorization: Bearer YOUR_TOKEN"
Secure Notes
Encrypted notes stored in the vault. All content is AES-256-GCM encrypted client-side.
Response
[
{
"id": 1,
"encrypted_data": "base64_ciphertext",
"iv": "base64_iv",
"created_at": "2026-03-28T10:00:00Z",
"updated_at": "2026-03-28T14:30:00Z"
}
]
curl Example
curl https://unveilpass.com:8444/api/notes \
-H "Authorization: Bearer YOUR_TOKEN"
Request Body
{
"encrypted_data": "base64_ciphertext",
"iv": "base64_iv"
}
curl Example
curl -X POST https://unveilpass.com:8444/api/notes \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"encrypted_data": "...", "iv": "..."}'
curl Example
curl https://unveilpass.com:8444/api/notes/1 \
-H "Authorization: Bearer YOUR_TOKEN"
Request Body
{
"encrypted_data": "base64_new_ciphertext",
"iv": "base64_new_iv"
}
curl Example
curl -X PUT https://unveilpass.com:8444/api/notes/1 \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"encrypted_data": "...", "iv": "..."}'
curl Example
curl -X DELETE https://unveilpass.com:8444/api/notes/1 \
-H "Authorization: Bearer YOUR_TOKEN"
Contacts
Manage trusted contacts for vault sharing and emergency access.
Response
[
{
"id": 1,
"contact_user_id": 5,
"email_hash": "sha256_hash",
"status": "accepted",
"public_key": "base64_public_key",
"created_at": "2026-03-28T10:00:00Z"
}
]
curl Example
curl https://unveilpass.com:8444/api/contacts \
-H "Authorization: Bearer YOUR_TOKEN"
Request Body
{
"email": "friend@example.com"
}
curl Example
curl -X POST https://unveilpass.com:8444/api/contacts \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"email": "friend@example.com"}'
curl Example
curl -X PUT https://unveilpass.com:8444/api/contacts/1 \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{ ... }'
curl Example
curl -X DELETE https://unveilpass.com:8444/api/contacts/1 \
-H "Authorization: Bearer YOUR_TOKEN"
Teams
Team vaults use a shared Team Key encrypted per-member via ECDH. Team entries are encrypted with the Team Key rather than individual vault keys.
Response
[
{
"id": 1,
"name": "Engineering",
"role": "owner",
"encrypted_team_key": "iv:ciphertext",
"member_count": 5,
"created_at": "2026-03-01T10:00:00Z"
}
]
curl Example
curl https://unveilpass.com:8444/api/teams \
-H "Authorization: Bearer YOUR_TOKEN"
Request Body
{
"name": "Engineering",
"encrypted_team_key": "iv:ciphertext"
}
curl Example
curl -X POST https://unveilpass.com:8444/api/teams \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "Engineering", "encrypted_team_key": "..."}'
curl Example
curl -X DELETE https://unveilpass.com:8444/api/teams/1 \
-H "Authorization: Bearer YOUR_TOKEN"
Team Members
Response
[
{
"id": 1,
"user_id": 3,
"role": "member",
"status": "accepted"
}
]
curl Example
curl https://unveilpass.com:8444/api/teams/1/members \
-H "Authorization: Bearer YOUR_TOKEN"
Request Body
{
"user_id": 5,
"role": "member",
"encrypted_team_key": "iv:ciphertext"
}
curl Example
curl -X POST https://unveilpass.com:8444/api/teams/1/members \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"user_id": 5, "role": "member", "encrypted_team_key": "..."}'
curl Example
curl -X DELETE https://unveilpass.com:8444/api/teams/1/members/5 \
-H "Authorization: Bearer YOUR_TOKEN"
Team Vault Entries
curl Example
curl https://unveilpass.com:8444/api/teams/1/vault \
-H "Authorization: Bearer YOUR_TOKEN"
Request Body
{
"encrypted_data": "base64_ciphertext",
"iv": "base64_iv",
"permission": "read_write"
}
curl Example
curl -X POST https://unveilpass.com:8444/api/teams/1/vault \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"encrypted_data": "...", "iv": "...", "permission": "read_write"}'
curl Example
curl -X PUT https://unveilpass.com:8444/api/teams/1/vault/5 \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"encrypted_data": "...", "iv": "..."}'
curl Example
curl -X DELETE https://unveilpass.com:8444/api/teams/1/vault/5 \
-H "Authorization: Bearer YOUR_TOKEN"
Team Notes
curl Example
curl https://unveilpass.com:8444/api/teams/1/notes \
-H "Authorization: Bearer YOUR_TOKEN"
Request Body
{
"encrypted_data": "base64_ciphertext",
"iv": "base64_iv"
}
curl Example
curl -X POST https://unveilpass.com:8444/api/teams/1/notes \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"encrypted_data": "...", "iv": "..."}'
curl Example
curl -X PUT https://unveilpass.com:8444/api/teams/1/notes/3 \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"encrypted_data": "...", "iv": "..."}'
curl Example
curl -X DELETE https://unveilpass.com:8444/api/teams/1/notes/3 \
-H "Authorization: Bearer YOUR_TOKEN"
CryptoLink — Encrypted File Transfer
Send files with end-to-end encryption. Files are encrypted client-side (AES-256-GCM) before upload. The decryption key is never sent to the server — it stays in the URL fragment. The server stores only encrypted data it cannot read.
Create CryptoLink
Request Body
{
"encrypted_data": "base64-encoded AES-256-GCM ciphertext",
"iv": "base64-encoded 12-byte IV",
"encrypted_filename": "iv_b64:ciphertext_b64",
"size_bytes": 102400,
"ttl_seconds": 86400,
"max_downloads": 1,
"single_use": false,
"pin_hash": "sha256-hex-of-pin (optional)"
}
Response
{ "id": "uuid" }
Build the shareable link: https://unveilpass.com/#/receive?id={id}&k={url_encoded_key_b64}
Limits
- Free plan: 1 MB per link, 1 link per hour
- Pro plan: 10 MB per link, unlimited
List CryptoLinks
Response
[
{
"id": "uuid",
"size_bytes": 102400,
"ttl_seconds": 86400,
"max_downloads": 1,
"download_count": 0,
"downloaded": false,
"pin_hash": "sha256...",
"pin_attempts": 0,
"expires_at": "2026-04-12T14:00:00Z",
"created_at": "2026-04-11T14:00:00Z"
}
]
Download / Decrypt
Query Parameters
pin_hash— SHA-256 hex of the PIN (required if PIN was set)
Response
{
"encrypted_data": "base64...",
"iv": "base64...",
"encrypted_filename": "iv_b64:ct_b64"
}
Errors
401— PIN required or invalid PIN (with attempts remaining)403— Too many PIN attempts, link blocked410— File expired or download limit reached
Get Info
Response
{
"size_bytes": 102400,
"expires_at": "2026-04-12T14:00:00Z",
"pin_required": true
}
Delete CryptoLink
Response
{ "status": "deleted" }
Reset Counters
Response
{ "status": "ok" }
SDK Examples
Python
from unveilpass import UnveilPassAgent
agent = UnveilPassAgent("uvp_agent_your_key")
# Send a file with 24h TTL and PIN protection
result = agent.send_file("contract.pdf", ttl=86400, pin="482916")
print(result["link"]) # Share this with the recipient
print(result["pin"]) # Share PIN separately (SMS, phone)
# With message and download limit
result = agent.send_file(
"report.xlsx",
ttl=604800, # 7 days
max_downloads=5,
message="Monthly report attached"
)
# List and delete
sends = agent.list_sends()
agent.delete_send(sends[0]["id"])
Requires: pip install pycryptodome requests
Node.js
const { UnveilPassAgent } = require('unveilpass');
const agent = new UnveilPassAgent('uvp_agent_your_key');
// Send a file with PIN
const result = await agent.sendFile('contract.pdf', {
ttl: 86400,
pin: '482916',
message: 'Please sign and return'
});
console.log(result.link, result.pin);
// List sends
const sends = await agent.listSends();
// Delete
await agent.deleteSend(sends[0].id);
Other Endpoints
Health Check
Response
{
"status": "ok"
}
curl Example
curl https://unveilpass.com:8444/api/health
Password Generator
Request Body
{
"length": 24,
"uppercase": true,
"lowercase": true,
"digits": true,
"symbols": true
}
Response
{
"password": "xK9#mP2£qR7$nL4wB6..."
}
curl Example
curl -X POST https://unveilpass.com:8444/api/generator \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"length": 24, "uppercase": true, "lowercase": true, "digits": true, "symbols": true}'
Audit Log
Response
[
{
"id": 100,
"action": "login",
"ip_address": "192.168.1.1",
"details": "Web login",
"created_at": "2026-03-28T14:30:00Z"
}
]
curl Example
curl https://unveilpass.com:8444/api/audit \
-H "Authorization: Bearer YOUR_TOKEN"