Skip to main content

Vault API

Base URL: https://api.sparbz.cloud/api/v1

Overview

The Vault API provides secret management, encryption, and access control. Store sensitive data securely, manage encryption keys, set policies for access control, and audit all operations.

All endpoints require authentication via Bearer token or API key with vault:read/vault:write scopes.


Cluster Management

GET /vault

List all Vault clusters in your organization.

Headers:

Authorization: Bearer <token>

Query Parameters:

ParameterTypeDescription
statusstringFilter by status: provisioning, running, sealed, error
limitintegerNumber of results (default: 20, max: 100)
offsetintegerPagination offset

Response (200 OK):

[
{
"id": "uuid",
"name": "prod-vault",
"status": "running",
"sealed": false,
"storage_used_mb": 256,
"total_secrets": 45,
"api_address": "https://vault-xxx.sparbz.cloud",
"auth_methods": ["token", "jwt", "approle"],
"created_at": "2024-10-15T10:30:00Z"
}
]

POST /vault

Create a new Vault cluster.

Request Body:

{
"name": "string",
"auto_unseal": true
}

Response (201 Created):

{
"id": "uuid",
"name": "prod-vault",
"status": "provisioning",
"sealed": true,
"created_at": "2024-11-29T10:30:00Z",
"unseal_keys": ["key1", "key2", "key3"]
}

GET /vault/:id

Get details of a specific Vault cluster.

Response (200 OK):

{
"id": "uuid",
"name": "prod-vault",
"status": "running",
"sealed": false,
"storage_used_mb": 256,
"total_secrets": 45,
"api_address": "https://vault-xxx.sparbz.cloud",
"auth_methods": ["token", "jwt", "approle"],
"policies": ["admin", "developer", "readonly"],
"secret_engines": ["kv", "database", "pki"],
"high_availability": true,
"replication_mode": "dr",
"version": "1.15.0",
"created_at": "2024-10-15T10:30:00Z"
}

Secret Management

GET /vault/:id/secret

List all secrets in the KV secret engine.

Query Parameters:

ParameterTypeDescription
pathstringSecret path prefix
listbooleanList mode (recursive)

Response (200 OK):

{
"request_id": "uuid",
"lease_id": "",
"renewable": false,
"lease_duration": 0,
"data": {
"keys": ["app-config", "api-keys", "database-credentials"]
},
"warnings": null,
"auth": null
}

POST /vault/:id/secret/:path

Create or update a secret.

Request Body:

{
"data": {
"username": "admin",
"password": "secure-password",
"api_key": "key-xxx"
}
}

Response (200 OK):

{
"request_id": "uuid",
"lease_id": "secret/data/app-config/uuid",
"renewable": false,
"lease_duration": 0,
"data": {
"created_time": "2024-11-29T10:30:00Z",
"custom_metadata": null,
"deletion_time": "",
"destroyed": false,
"version": 1
}
}

GET /vault/:id/secret/:path

Retrieve a specific secret.

Response (200 OK):

{
"request_id": "uuid",
"lease_id": "",
"renewable": false,
"lease_duration": 0,
"data": {
"data": {
"username": "admin",
"password": "secure-password",
"api_key": "key-xxx"
},
"metadata": {
"created_time": "2024-11-29T10:30:00Z",
"custom_metadata": null,
"deletion_time": "",
"destroyed": false,
"version": 1
}
}
}

DELETE /vault/:id/secret/:path

Delete a secret.

Response (204 No Content)


Policy Management

GET /vault/:id/policies

List all policies in the Vault cluster.

Response (200 OK):

{
"policies": [
{
"name": "admin",
"description": "Full access to all secrets",
"rules": "path \"secret/*\" { capabilities = [\"create\", \"read\", \"update\", \"delete\", \"list\"] }"
},
{
"name": "developer",
"description": "Read-only access to app secrets",
"rules": "path \"secret/app/*\" { capabilities = [\"read\", \"list\"] }"
}
]
}

POST /vault/:id/policies

Create or update a policy.

Request Body:

{
"name": "api-consumers",
"rules": "path \"secret/api/*\" { capabilities = [\"read\", \"list\"] } path \"secret/api/*/api-key\" { capabilities = [\"deny\"] }"
}

Response (200 OK)


GET /vault/:id/policies/:name

Get details of a specific policy.

Response (200 OK):

{
"name": "developer",
"rules": "path \"secret/app/*\" { capabilities = [\"read\", \"list\"] }",
"created_at": "2024-10-15T10:30:00Z"
}

DELETE /vault/:id/policies/:name

Delete a policy.

Response (204 No Content)


Authentication Methods

GET /vault/:id/auth

List all enabled authentication methods.

Response (200 OK):

{
"auth_methods": [
{
"type": "token",
"description": "token based credentials",
"path": "token/",
"config": {
"default_lease_ttl": 2764800,
"max_lease_ttl": 2764800,
"force_no_cache": false,
"token_type": "default-service"
}
},
{
"type": "jwt",
"path": "jwt/",
"description": "JWT authentication"
}
]
}

POST /vault/:id/auth/:method

Enable an authentication method.

Request Body:

{
"type": "jwt",
"description": "OIDC authentication",
"config": {
"oidc_discovery_url": "https://auth.example.com",
"oidc_client_id": "vault-client",
"bound_audiences": ["https://vault.example.com"]
}
}

Response (204 No Content)


Encryption as a Service

POST /vault/:id/encrypt/:key

Encrypt plaintext data.

Request Body:

{
"plaintext": "base64-encoded-data"
}

Response (200 OK):

{
"cipher_text": "vault:v1:encrypted-data-here"
}

POST /vault/:id/decrypt/:key

Decrypt cipher text.

Request Body:

{
"cipher_text": "vault:v1:encrypted-data-here"
}

Response (200 OK):

{
"plaintext": "base64-encoded-data"
}

Token Management

GET /vault/:id/tokens

List active tokens.

Response (200 OK):

[
{
"accessor": "accessor-id",
"type": "service",
"display_name": "app-token",
"ttl": 2592000,
"issue_time": "2024-11-29T10:30:00Z",
"expire_time": "2024-12-29T10:30:00Z",
"last_renewal_time": "2024-11-29T15:45:00Z",
"policies": ["admin", "developer"]
}
]

POST /vault/:id/tokens

Create a new token.

Request Body:

{
"display_name": "app-token",
"ttl": 2592000,
"policies": ["developer"]
}

Response (201 Created):

{
"client_token": "s.token-xxx",
"accessor": "accessor-id",
"display_name": "app-token",
"ttl": 2592000,
"issue_time": "2024-11-29T10:30:00Z",
"expire_time": "2024-12-29T10:30:00Z",
"policies": ["developer"]
}

DELETE /vault/:id/tokens/:accessor

Revoke a token by accessor.

Response (204 No Content)


Audit Logs

GET /vault/:id/audit

Get audit logs for the Vault cluster.

Query Parameters:

ParameterTypeDescription
limitintegerNumber of logs (default: 100, max: 1000)
offsetintegerPagination offset
fromtimestampStart time filter
totimestampEnd time filter

Response (200 OK):

[
{
"timestamp": "2024-11-29T15:45:00Z",
"request": {
"operation": "UPDATE",
"path": "secret/data/app-config",
"client_token": "s.token-xxx",
"client_address": "192.168.1.100",
"user_agent": "Vault/1.15.0"
},
"response": {
"status": 200,
"duration_ms": 42
},
"auth": {
"client_token": "s.token-xxx",
"accessor": "accessor-id",
"policies": ["admin"]
},
"error": null
}
]

Error Responses

CodeDescription
400Bad Request - Invalid secret path or policy rules
401Unauthorized - Invalid or missing token
403Forbidden - Insufficient permissions (policy violation)
404Not Found - Secret, policy, or cluster doesn't exist
409Conflict - Secret or policy already exists
500Internal Server Error
503Service Unavailable - Vault cluster sealed

Common Use Cases

Storing Database Credentials

POST /vault/{vault_id}/secret/database/prod-db
{
"data": {
"username": "postgres",
"password": "secure-password",
"host": "db.example.com",
"port": 5432,
"database": "production"
}
}

Setting Up Role-Based Access

POST /vault/{vault_id}/policies
{
"name": "database-reader",
"rules": "path \"secret/database/*\" { capabilities = [\"read\"] }"
}

Rotating Secrets

POST /vault/{vault_id}/secret/api-keys/current
{
"data": {
"api_key": "new-key-xxx",
"rotated_at": "2024-11-29T10:30:00Z"
}
}

Encrypting Sensitive Data

POST /vault/{vault_id}/encrypt/pii-key
{
"plaintext": "base64-encoded-pii"
}