Cloud Storage API

API endpoints for cloud storage provider management.

Configure and manage cloud storage providers for backups.

Endpoints Overview

MethodEndpointDescription
GET/cloud-storageList providers
POST/cloud-storageCreate provider
GET/cloud-storage/:idGet provider
DELETE/cloud-storage/:idDelete provider
POST/cloud-storage/:id/testTest connection
POST/cloud-storage/:id/defaultSet as default

List Providers

GET /api/v1/cloud-storage

Permission: cloudStorage:read

Response:

{
  "providers": [
    {
      "id": "provider-123",
      "name": "Production S3",
      "type": "s3",
      "isDefault": true,
      "config": {
        "bucket": "my-backups",
        "region": "us-east-1",
        "accessKeyId": "AKIA****XXXX"
      },
      "createdAt": "2026-01-01T00:00:00Z"
    }
  ]
}

Note: Sensitive values (secrets, keys) are masked.

Create Provider

POST /api/v1/cloud-storage

Permission: cloudStorage:write

AWS S3

{
  "name": "Production S3",
  "type": "s3",
  "isDefault": true,
  "s3Config": {
    "accessKeyId": "AKIAXXXXXXXXXXXXXXXX",
    "secretAccessKey": "your-secret-key",
    "region": "us-east-1",
    "bucket": "my-backups"
  }
}

Google Cloud Storage

{
  "name": "Production GCS",
  "type": "gcs",
  "gcsConfig": {
    "bucket": "my-backups",
    "credentials": {
      "type": "service_account",
      "project_id": "my-project",
      "private_key": "...",
      "client_email": "..."
    }
  }
}

Azure Blob Storage

{
  "name": "Production Azure",
  "type": "azure",
  "azureConfig": {
    "accountName": "mystorageaccount",
    "accountKey": "your-account-key",
    "containerName": "backups"
  }
}

Cloudflare R2

{
  "name": "Production R2",
  "type": "r2",
  "s3Config": {
    "accessKeyId": "your-r2-access-key",
    "secretAccessKey": "your-r2-secret-key",
    "endpoint": "https://account-id.r2.cloudflarestorage.com",
    "bucket": "my-backups",
    "region": "auto"
  }
}

MinIO

{
  "name": "Local MinIO",
  "type": "minio",
  "s3Config": {
    "accessKeyId": "minioadmin",
    "secretAccessKey": "minioadmin",
    "endpoint": "http://minio:9000",
    "bucket": "backups",
    "region": "us-east-1",
    "pathStyle": true
  }
}

Backblaze B2

{
  "name": "Backblaze B2",
  "type": "backblaze",
  "s3Config": {
    "accessKeyId": "your-key-id",
    "secretAccessKey": "your-application-key",
    "endpoint": "https://s3.us-west-002.backblazeb2.com",
    "bucket": "my-backups",
    "region": "us-west-002"
  }
}

Local Path

{
  "name": "Network Storage",
  "type": "local",
  "localConfig": {
    "path": "/mnt/nas/backups"
  }
}

Response:

{
  "success": true,
  "provider": {
    "id": "provider-456",
    "name": "Production S3",
    "type": "s3",
    "isDefault": true,
    "createdAt": "2026-01-19T12:00:00Z"
  }
}

Get Provider

GET /api/v1/cloud-storage/:id

Permission: cloudStorage:read

Response:

{
  "id": "provider-123",
  "name": "Production S3",
  "type": "s3",
  "isDefault": true,
  "config": {
    "bucket": "my-backups",
    "region": "us-east-1",
    "accessKeyId": "AKIA****XXXX"
  },
  "createdAt": "2026-01-01T00:00:00Z"
}

Delete Provider

DELETE /api/v1/cloud-storage/:id

Permission: cloudStorage:write

Response:

{
  "success": true,
  "message": "Provider deleted"
}

Test Connection

POST /api/v1/cloud-storage/:id/test

Permission: cloudStorage:write

Response (success):

{
  "success": true,
  "message": "Connection successful"
}

Response (failure):

{
  "success": false,
  "error": "Access denied: Invalid credentials"
}

Set as Default

POST /api/v1/cloud-storage/:id/default

Permission: cloudStorage:write

Response:

{
  "success": true,
  "message": "Provider set as default"
}

Provider Types

TypeDescription
s3AWS S3 or S3-compatible
gcsGoogle Cloud Storage
azureAzure Blob Storage
r2Cloudflare R2
minioMinIO (self-hosted)
backblazeBackblaze B2
localLocal filesystem

Error Responses

Invalid Credentials

{
  "success": false,
  "error": "Invalid credentials"
}

Status: 400

Bucket Not Found

{
  "success": false,
  "error": "Bucket 'my-bucket' not found"
}

Status: 400

Provider Not Found

{
  "success": false,
  "error": "Provider not found"
}

Status: 404

Cannot Delete Default

{
  "success": false,
  "error": "Cannot delete default provider. Set another as default first."
}

Status: 400