Files
CyberPanel/docs/CyberPanel_Cloud_API_DOCS.md
2026-01-05 16:43:10 +05:00

26 KiB

CyberPanel Cloud Platform - VPS API Documentation

Version: 1.0.0 Base URL: https://platform.cyberpersons.com/api/v1 Last Updated: January 2026


Table of Contents

  1. Introduction
  2. Authentication
  3. Rate Limiting
  4. Response Format
  5. Error Codes
  6. Endpoints

Introduction

The CyberPanel Cloud Platform API allows you to programmatically manage your VPS instances, view account information, and automate your infrastructure. This RESTful API uses JSON for request and response bodies.

Quick Start

  1. Create an API key at https://platform.cyberpersons.com/api-keys/
  2. Copy your key (shown only once)
  3. Include it in the Authorization header:
    Authorization: Bearer cyp_live_your_api_key_here
    

Authentication

All API requests (except /health and /scopes) require authentication using an API key.

API Key Format

API keys have the format: cyp_live_<64_character_hex_string>

Example: cyp_live_3ac1ca2feaADSRTSAFDbcdd86f2dc01c4a574e4a34EWRWEb9d995a28723caERERE

Authorization Header

Include your API key in the Authorization header using the Bearer scheme:

Authorization: Bearer cyp_live_your_api_key_here

Permission Scopes

API keys have granular permission scopes. When creating an API key, select only the scopes you need:

Scope Description
vps:read List and view VPS instances, plans, locations, templates
vps:write Create, start, stop, restart, and modify VPS instances
vps:delete Delete VPS instances (destructive action)
account:read View account information and API key metadata
account:write Update account settings
billing:read View balance, invoices, and billing information
billing:write Add funds to account
support:read View support tickets
support:write Create and reply to support tickets
email:read View email service information
email:write Send emails via Email Delivery Service
all Full access to all permissions

Security Features

  • Key Hashing: Keys are SHA-256 hashed before storage - we never store plain keys
  • IP Whitelisting: Optionally restrict key usage to specific IP addresses
  • Expiration Dates: Set optional expiration dates for keys
  • Usage Tracking: All requests are logged for security auditing

Rate Limiting

API keys have configurable rate limits to prevent abuse:

Limit Type Default Description
Per Minute 60 requests Requests allowed per minute
Per Hour 1000 requests Requests allowed per hour

Rate Limit Headers

Responses include rate limit information in headers:

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 58
X-RateLimit-Reset: 1704067200

Rate Limit Exceeded (HTTP 429)

When you exceed the rate limit:

{
  "success": false,
  "error": "Rate limit exceeded",
  "error_code": "RATE_LIMIT_EXCEEDED",
  "message": "You have exceeded the per minute rate limit. Please retry after 45 seconds."
}

The response includes a Retry-After header indicating seconds to wait.


Response Format

Success Response

{
  "success": true,
  "data": {
    // Response data here
  },
  "message": "Optional success message"
}

Error Response

{
  "success": false,
  "error": "Error description",
  "error_code": "ERROR_CODE",
  "message": "Human-readable explanation"
}

Error Codes

Authentication Errors (4xx)

Error Code HTTP Status Description
NO_API_KEY 401 No API key provided
INVALID_API_KEY 401 API key is invalid or malformed
EXPIRED_API_KEY 401 API key has expired
INACTIVE_API_KEY 401 API key has been deactivated
IP_NOT_ALLOWED 403 Request IP not in key's whitelist
INSUFFICIENT_SCOPE 403 API key lacks required permissions
RATE_LIMIT_EXCEEDED 429 Too many requests

Resource Errors (4xx)

Error Code HTTP Status Description
VPS_NOT_FOUND 404 VPS instance doesn't exist or isn't owned by you
VPS_DELETED 400 VPS has already been deleted
VPS_SUSPENDED 403 VPS is suspended (check suspension reason)
VPS_ALREADY_DELETED 400 Attempted to delete already-deleted VPS
PLAN_NOT_FOUND 400 Invalid plan_id
LOCATION_NOT_FOUND 400 Invalid location_code
INVALID_TEMPLATE 400 Invalid template_id
KEY_NOT_FOUND 404 API key doesn't exist

Validation Errors (4xx)

Error Code HTTP Status Description
MISSING_FIELDS 400 Required fields not provided
INVALID_HOSTNAME 400 Hostname format invalid
PASSWORD_TOO_SHORT 400 Password must be at least 8 characters
PASSWORD_TOO_LONG 400 Password must not exceed 72 characters
PASSWORD_WEAK 400 Password must contain letters AND numbers
INSUFFICIENT_BALANCE 400 Account balance too low

Server Errors (5xx)

Error Code HTTP Status Description
START_FAILED 500 Failed to start VPS
STOP_FAILED 500 Failed to stop VPS
RESTART_FAILED 500 Failed to restart VPS
DELETE_FAILED 500 Failed to delete VPS
STATUS_FAILED 500 Failed to get VPS status
CONSOLE_FAILED 500 Failed to get console access
DEPLOYMENT_FAILED 500 VPS deployment failed
NODE_NOT_FOUND 500 Proxmox node not found

Endpoints

General Endpoints

Health Check

Check if the API is operational. No authentication required.

GET /api/v1/health

Response:

{
  "success": true,
  "data": {
    "status": "healthy",
    "service": "CyberPanel Cloud API",
    "version": "1.0.0"
  }
}

Test Authentication

Verify your API key is working.

GET /api/v1/test

Required Scope: Any valid API key

Response:

{
  "success": true,
  "data": {
    "message": "API authentication successful!",
    "key_name": "My Production Key",
    "key_prefix": "cyp_live_3ac",
    "user_email": "user@example.com",
    "scopes": ["vps:read", "vps:write"],
    "ip_address": "203.0.113.50",
    "request_count": 142
  },
  "message": "Your API key is working correctly"
}

List Available Scopes

List all available permission scopes. No authentication required.

GET /api/v1/scopes

Response:

{
  "success": true,
  "data": {
    "scopes": [
      {"scope": "vps:read", "description": "VPS - Read"},
      {"scope": "vps:write", "description": "VPS - Create/Modify"},
      {"scope": "vps:delete", "description": "VPS - Delete"},
      {"scope": "billing:read", "description": "Billing - Read"},
      {"scope": "billing:write", "description": "Billing - Add Funds"},
      {"scope": "account:read", "description": "Account - Read Info"},
      {"scope": "all", "description": "Full Access - All Permissions"}
    ]
  }
}

Account & Billing Endpoints

Get Account Info

GET /api/v1/account

Required Scope: account:read

Response:

{
  "success": true,
  "data": {
    "id": 123,
    "email": "user@example.com",
    "full_name": "John Doe",
    "balance": "150.00",
    "status": "active",
    "two_factor_enabled": true,
    "vps_ordering_enabled": true,
    "registration_date": "2024-01-15T10:30:00Z"
  }
}

Get Billing Info

GET /api/v1/billing

Required Scope: billing:read

Response:

{
  "success": true,
  "data": {
    "balance": "150.00",
    "auto_funding": {
      "enabled": true,
      "threshold": "10.00",
      "amount": "50.00"
    },
    "recent_invoices": [
      {
        "id": 456,
        "description": "VPS Hourly Charge - my-server.example.com",
        "amount": "-0.0082",
        "type": "debit",
        "date": "2026-01-05T12:00:00Z"
      }
    ]
  }
}

List API Keys

List all your API keys (metadata only, not the actual keys).

GET /api/v1/account/api-keys

Required Scope: account:read

Response:

{
  "success": true,
  "data": {
    "api_keys": [
      {
        "id": 1,
        "name": "Production Key",
        "key_prefix": "cyp_live_3ac",
        "scopes": ["vps:read", "vps:write"],
        "is_active": true,
        "ip_whitelist": [],
        "expires_at": null,
        "last_used_at": "2026-01-05T14:30:00Z",
        "last_used_ip": "203.0.113.50",
        "request_count": 142,
        "rate_limit_per_minute": 60,
        "rate_limit_per_hour": 1000,
        "created_at": "2025-12-01T09:00:00Z"
      }
    ],
    "total": 1
  }
}

Get API Key Usage Logs

GET /api/v1/account/api-keys/{key_id}/usage

Required Scope: account:read

Query Parameters:

Parameter Type Default Description
limit integer 50 Number of records (max 100)
offset integer 0 Pagination offset

Response:

{
  "success": true,
  "data": {
    "key_id": 1,
    "key_name": "Production Key",
    "usage_logs": [
      {
        "endpoint": "/api/v1/vps",
        "method": "GET",
        "ip_address": "203.0.113.50",
        "response_status": 200,
        "response_time_ms": 45,
        "created_at": "2026-01-05T14:30:00Z"
      }
    ],
    "pagination": {
      "limit": 50,
      "offset": 0,
      "total": 142,
      "has_more": true
    }
  }
}

VPS Management Endpoints

List VPS Instances

GET /api/v1/vps

Required Scope: vps:read

Query Parameters:

Parameter Type Default Description
status string - Filter by status: running, stopped, suspended
location string - Filter by location code: la, de, eu
limit integer 50 Number of results (max 100)
offset integer 0 Pagination offset

Response:

{
  "success": true,
  "data": {
    "instances": [
      {
        "id": 45,
        "vmid": 281,
        "name": "my-server.example.com",
        "status": "running",
        "ip_address": "74.81.40.145",
        "is_suspended": false,
        "created_at": "2026-01-05T10:00:00Z"
      }
    ],
    "pagination": {
      "total": 3,
      "limit": 50,
      "offset": 0,
      "has_more": false
    }
  }
}

Get VPS Details

GET /api/v1/vps/{id}

Required Scope: vps:read

Response:

{
  "success": true,
  "data": {
    "id": 45,
    "vmid": 281,
    "name": "my-server.example.com",
    "status": "running",
    "ip_address": "74.81.40.145",
    "is_suspended": false,
    "created_at": "2026-01-05T10:00:00Z",
    "updated_at": "2026-01-05T14:30:00Z",
    "plan": {
      "id": 1,
      "name": "Starter",
      "cpu_cores": 1,
      "ram_mb": 1024,
      "disk_gb": 25,
      "bandwidth_gb": 1000,
      "price": "6.00"
    },
    "location": {
      "code": "la",
      "name": "Los Angeles, USA"
    },
    "server": {
      "hostname": "lax-power.cyberpersons.com"
    },
    "billing": {
      "hourly_rate": "0.0082",
      "billing_start": "2026-01-05T10:00:00Z",
      "last_billed": "2026-01-05T14:00:00Z"
    }
  }
}

Get VPS Dashboard Summary

GET /api/v1/vps/summary

Required Scope: vps:read

Response:

{
  "success": true,
  "data": {
    "total_instances": 3,
    "running": 2,
    "stopped": 1,
    "suspended": 0,
    "total_monthly_cost": "18.00",
    "locations": {
      "la": 2,
      "de": 1
    }
  }
}

Get VPS Live Status

Get real-time metrics from Proxmox.

GET /api/v1/vps/{id}/status

Required Scope: vps:read

Response:

{
  "success": true,
  "data": {
    "vps_id": 45,
    "vmid": 281,
    "name": "my-server.example.com",
    "status": "running",
    "qmpstatus": "running",
    "cpu": {
      "usage_percent": 2.5,
      "cores": 1
    },
    "memory": {
      "used_bytes": 536870912,
      "total_bytes": 1073741824,
      "usage_percent": 50.0
    },
    "disk": {
      "read_bytes": 1234567890,
      "write_bytes": 987654321
    },
    "network": {
      "in_bytes": 5678901234,
      "out_bytes": 1234567890
    },
    "uptime_seconds": 86400,
    "pid": 12345
  }
}

List VPS Plans

GET /api/v1/vps/plans

Required Scope: vps:read

Response:

{
  "success": true,
  "data": {
    "plans": [
      {
        "id": 1,
        "name": "Starter",
        "cpu_cores": 1,
        "ram_mb": 1024,
        "disk_gb": 25,
        "bandwidth_gb": 1000,
        "monthly_price": "6.00",
        "price_hourly": "0.0082"
      },
      {
        "id": 2,
        "name": "Basic",
        "cpu_cores": 2,
        "ram_mb": 2048,
        "disk_gb": 50,
        "bandwidth_gb": 2000,
        "monthly_price": "12.00",
        "price_hourly": "0.0164"
      }
    ]
  }
}

List Locations

GET /api/v1/vps/locations

Required Scope: vps:read

Response:

{
  "success": true,
  "data": {
    "locations": [
      {
        "code": "la",
        "name": "Los Angeles, USA",
        "country": "US",
        "available_ips": 15,
        "is_available": true
      },
      {
        "code": "de",
        "name": "Falkenstein, Germany",
        "country": "DE",
        "available_ips": 8,
        "is_available": true
      }
    ]
  }
}

List OS Templates

GET /api/v1/vps/templates

Required Scope: vps:read

Response:

{
  "success": true,
  "data": {
    "templates": [
      {"id": "101", "name": "CyberPanel", "os": "AlmaLinux 8", "description": "CyberPanel pre-installed with OpenLiteSpeed"},
      {"id": "9000", "name": "Ubuntu 22.04", "os": "Ubuntu 22.04 LTS", "description": "Clean Ubuntu 22.04 LTS installation"},
      {"id": "9022", "name": "Ubuntu 24.04", "os": "Ubuntu 24.04 LTS", "description": "Clean Ubuntu 24.04 LTS installation"},
      {"id": "9010", "name": "Debian 12", "os": "Debian 12", "description": "Clean Debian 12 installation"},
      {"id": "9001", "name": "AlmaLinux 8", "os": "AlmaLinux 8", "description": "Clean AlmaLinux 8 installation"},
      {"id": "9008", "name": "AlmaLinux 9", "os": "AlmaLinux 9", "description": "Clean AlmaLinux 9 installation"},
      {"id": "9125", "name": "Windows Server 2022", "os": "Windows Server 2022", "description": "Windows Server 2022 (requires $20 min balance)"}
    ]
  }
}

VPS Action Endpoints

Start VPS

POST /api/v1/vps/{id}/start

Required Scope: vps:write

Response:

{
  "success": true,
  "data": {
    "id": 45,
    "vmid": 281,
    "name": "my-server.example.com",
    "status": "running",
    "ip_address": "74.81.40.145"
  },
  "message": "VPS started successfully"
}

Stop VPS

POST /api/v1/vps/{id}/stop

Required Scope: vps:write

Response:

{
  "success": true,
  "data": {
    "id": 45,
    "vmid": 281,
    "name": "my-server.example.com",
    "status": "stopped",
    "ip_address": "74.81.40.145"
  },
  "message": "VPS stopped successfully"
}

Restart VPS

POST /api/v1/vps/{id}/restart

Required Scope: vps:write

Response:

{
  "success": true,
  "data": {
    "id": 45,
    "vmid": 281,
    "name": "my-server.example.com",
    "status": "running",
    "ip_address": "74.81.40.145"
  },
  "message": "VPS restarted successfully"
}

Delete VPS

WARNING: This permanently deletes the VPS and all data. This action cannot be undone.

POST /api/v1/vps/{id}/delete

Required Scope: vps:write

Response:

{
  "success": true,
  "data": {
    "deleted": true,
    "vps_id": 45,
    "name": "my-server.example.com",
    "vmid": 281
  },
  "message": "VPS \"my-server.example.com\" deleted successfully"
}

Get Console Access

Get noVNC console URL for browser-based access.

GET /api/v1/vps/{id}/console

Required Scope: vps:read

Response:

{
  "success": true,
  "data": {
    "vps_id": 45,
    "console_url": "https://lax-power.cyberpersons.com:8006/?console=kvm&novnc=1&vmid=281&node=lax-power",
    "type": "novnc",
    "expires_in_seconds": 300
  },
  "message": "Console URL generated. Valid for 5 minutes."
}

VPS Creation Endpoints

Create VPS

POST /api/v1/vps/create

Required Scope: vps:write

Request Body:

Field Type Required Description
hostname string Yes FQDN hostname (e.g., my-server.example.com)
plan_id integer Yes Plan ID from /vps/plans
location_code string Yes Location code from /vps/locations
template_id string Yes Template ID from /vps/templates
root_password string Yes Root password (8-72 chars, must have letters AND numbers)
ssh_key string No SSH public key for root access
webhook_url string No URL to notify when deployment completes/fails
webhook_secret string No Secret for webhook signature verification

Example Request:

{
  "hostname": "my-server.example.com",
  "plan_id": 1,
  "location_code": "la",
  "template_id": "9000",
  "root_password": "SecurePass123",
  "ssh_key": "ssh-rsa AAAAB3NzaC1yc2E...",
  "webhook_url": "https://your-server.com/webhook"
}

Response:

{
  "success": true,
  "data": {
    "vps_id": 46,
    "name": "my-server.example.com",
    "status": "deploying",
    "ip_address": "74.81.40.146",
    "plan": {
      "id": 1,
      "name": "Starter",
      "price": "6.00"
    },
    "location": "la",
    "template": "9000",
    "deployment_url": "/api/v1/vps/46/deployment",
    "estimated_time_seconds": 180,
    "webhook_configured": true
  },
  "message": "VPS deployment started. Use the deployment endpoint to check progress."
}

Get Deployment Status

Poll this endpoint to track VPS deployment progress.

GET /api/v1/vps/{id}/deployment

Required Scope: vps:read

Response (In Progress):

{
  "success": true,
  "data": {
    "vps_id": 46,
    "deployment_status": "in_progress",
    "vps_status": "deploying",
    "current_task": "configure_network",
    "progress_percent": 70,
    "tasks": [
      {"name": "validate_resources", "status": "completed", "order": 1},
      {"name": "allocate_ip", "status": "completed", "order": 2},
      {"name": "create_vm", "status": "completed", "order": 3},
      {"name": "configure_hardware", "status": "completed", "order": 4},
      {"name": "apply_cloud_init", "status": "completed", "order": 5},
      {"name": "start_vm", "status": "completed", "order": 6},
      {"name": "configure_network", "status": "in_progress", "order": 7},
      {"name": "wait_for_guest_agent", "status": "pending", "order": 8},
      {"name": "verify_connectivity", "status": "pending", "order": 9},
      {"name": "finalize", "status": "pending", "order": 10}
    ],
    "tasks_completed": 6,
    "tasks_total": 10,
    "started_at": "2026-01-05T15:00:00Z",
    "is_ready": false
  }
}

Response (Completed):

{
  "success": true,
  "data": {
    "vps_id": 46,
    "deployment_status": "completed",
    "vps_status": "running",
    "current_task": null,
    "progress_percent": 100,
    "tasks_completed": 10,
    "tasks_total": 10,
    "started_at": "2026-01-05T15:00:00Z",
    "completed_at": "2026-01-05T15:03:00Z",
    "is_ready": true,
    "access_info": {
      "ip_address": "74.81.40.146",
      "ssh_port": 22,
      "ssh_user": "root"
    }
  },
  "message": "VPS deployment completed successfully"
}

VPS Snapshots

List Snapshots

GET /api/v1/vps/{id}/snapshots

Required Scope: vps:read

Response:

{
  "success": true,
  "data": {
    "vps_id": 45,
    "snapshots": [
      {
        "name": "pre-upgrade-snapshot",
        "description": "Before system upgrade",
        "created_at": "2026-01-04T10:00:00Z",
        "vmstate": false
      }
    ]
  }
}

Create Snapshot

POST /api/v1/vps/{id}/snapshots/create

Required Scope: vps:write

Request Body:

Field Type Required Description
name string Yes Snapshot name (alphanumeric, underscores)
description string No Description of the snapshot
include_ram boolean No Include RAM state (default: false)

Example Request:

{
  "name": "pre_upgrade_snapshot",
  "description": "Before upgrading to Ubuntu 24.04",
  "include_ram": false
}

Response:

{
  "success": true,
  "data": {
    "vps_id": 45,
    "snapshot": {
      "name": "pre_upgrade_snapshot",
      "description": "Before upgrading to Ubuntu 24.04",
      "created_at": "2026-01-05T16:00:00Z"
    }
  },
  "message": "Snapshot created successfully"
}

Code Examples

Python

import requests

API_KEY = "cyp_live_your_api_key_here"
BASE_URL = "https://platform.cyberpersons.com/api/v1"

headers = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json"
}

# List all VPS instances
response = requests.get(f"{BASE_URL}/vps", headers=headers)
instances = response.json()["data"]["instances"]
for vps in instances:
    print(f"{vps['name']}: {vps['status']} ({vps['ip_address']})")

# Create a new VPS
new_vps = requests.post(f"{BASE_URL}/vps/create", headers=headers, json={
    "hostname": "my-server.example.com",
    "plan_id": 1,
    "location_code": "la",
    "template_id": "9000",
    "root_password": "SecurePass123"
})
vps_id = new_vps.json()["data"]["vps_id"]

# Poll deployment status
import time
while True:
    status = requests.get(f"{BASE_URL}/vps/{vps_id}/deployment", headers=headers)
    data = status.json()["data"]
    print(f"Progress: {data['progress_percent']}% - {data['current_task']}")
    if data["is_ready"]:
        print(f"VPS ready at {data['access_info']['ip_address']}")
        break
    time.sleep(10)

JavaScript (Node.js)

const API_KEY = "cyp_live_your_api_key_here";
const BASE_URL = "https://platform.cyberpersons.com/api/v1";

const headers = {
    "Authorization": `Bearer ${API_KEY}`,
    "Content-Type": "application/json"
};

// List all VPS instances
const response = await fetch(`${BASE_URL}/vps`, { headers });
const { data } = await response.json();
data.instances.forEach(vps => {
    console.log(`${vps.name}: ${vps.status} (${vps.ip_address})`);
});

// Create a new VPS
const createResponse = await fetch(`${BASE_URL}/vps/create`, {
    method: "POST",
    headers,
    body: JSON.stringify({
        hostname: "my-server.example.com",
        plan_id: 1,
        location_code: "la",
        template_id: "9000",
        root_password: "SecurePass123"
    })
});
const { data: vpsData } = await createResponse.json();
console.log(`VPS ${vpsData.vps_id} deployment started`);

cURL

# Test authentication
curl -X GET "https://platform.cyberpersons.com/api/v1/test" \
  -H "Authorization: Bearer cyp_live_your_api_key_here"

# List VPS instances
curl -X GET "https://platform.cyberpersons.com/api/v1/vps" \
  -H "Authorization: Bearer cyp_live_your_api_key_here"

# Create VPS
curl -X POST "https://platform.cyberpersons.com/api/v1/vps/create" \
  -H "Authorization: Bearer cyp_live_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "hostname": "my-server.example.com",
    "plan_id": 1,
    "location_code": "la",
    "template_id": "9000",
    "root_password": "SecurePass123"
  }'

# Stop VPS
curl -X POST "https://platform.cyberpersons.com/api/v1/vps/45/stop" \
  -H "Authorization: Bearer cyp_live_your_api_key_here"

# Delete VPS (WARNING: Permanent!)
curl -X POST "https://platform.cyberpersons.com/api/v1/vps/45/delete" \
  -H "Authorization: Bearer cyp_live_your_api_key_here"

PHP

<?php
$api_key = "cyp_live_your_api_key_here";
$base_url = "https://platform.cyberpersons.com/api/v1";

function api_request($method, $endpoint, $data = null) {
    global $api_key, $base_url;

    $ch = curl_init("$base_url$endpoint");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        "Authorization: Bearer $api_key",
        "Content-Type: application/json"
    ]);

    if ($method === "POST") {
        curl_setopt($ch, CURLOPT_POST, true);
        if ($data) {
            curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
        }
    }

    $response = curl_exec($ch);
    curl_close($ch);
    return json_decode($response, true);
}

// List VPS instances
$instances = api_request("GET", "/vps");
foreach ($instances["data"]["instances"] as $vps) {
    echo "{$vps['name']}: {$vps['status']} ({$vps['ip_address']})\n";
}

// Create VPS
$new_vps = api_request("POST", "/vps/create", [
    "hostname" => "my-server.example.com",
    "plan_id" => 1,
    "location_code" => "la",
    "template_id" => "9000",
    "root_password" => "SecurePass123"
]);
echo "Created VPS ID: " . $new_vps["data"]["vps_id"];
?>

Webhook Notifications

When creating a VPS, you can specify a webhook_url to receive notifications when deployment completes or fails.

Webhook Payload

{
  "event": "vps.deployment.completed",
  "timestamp": "2026-01-05T15:03:00Z",
  "data": {
    "vps_id": 46,
    "name": "my-server.example.com",
    "status": "running",
    "ip_address": "74.81.40.146",
    "deployment_time_seconds": 180
  }
}

Event Types

Event Description
vps.deployment.completed VPS deployment finished successfully
vps.deployment.failed VPS deployment failed

Webhook Security

If you provide a webhook_secret, the webhook request will include a signature header:

X-Webhook-Signature: sha256=<hmac_signature>

Verify the signature by computing HMAC-SHA256 of the request body using your secret.


Support


Changelog

v1.0.0 (January 2026)

  • Initial API release
  • VPS management endpoints (list, create, start, stop, restart, delete)
  • Account and billing endpoints
  • Snapshot management
  • Webhook notifications for deployments