28 KiB
Setec Manager API Reference
Complete REST API reference for the Setec Manager server management panel.
Base URL: https://your-server:9090
Authentication: Most endpoints require a valid JWT token, provided either as a cookie (setec_token) or an Authorization: Bearer <token> header. Tokens are issued by the login endpoint and expire after 24 hours.
Content Types: All JSON request bodies should use Content-Type: application/json. Responses are application/json unless otherwise noted. Some endpoints also serve HTML pages when the Accept header includes text/html.
Table of Contents
- Authentication
- Dashboard
- Sites
- AUTARCH
- SSL/TLS
- Nginx
- Firewall
- Users
- Backups
- Monitoring
- Logs
- Float Mode
- Hosting Providers
Authentication
Login
POST /login
Auth required: No
Rate limited: Yes (5 attempts per IP per minute)
Request body:
{
"username": "admin",
"password": "your-password"
}
Response (200):
{
"token": "eyJhbGciOiJIUzI1NiIs...",
"username": "admin",
"role": "admin"
}
A setec_token cookie is also set with HttpOnly, Secure, and SameSite=Strict flags. The cookie expires in 24 hours.
curl -X POST https://your-server:9090/login \
-H "Content-Type: application/json" \
-d '{"username": "admin", "password": "your-password"}'
Logout
POST /logout
Auth required: No (clears the cookie regardless)
Response (200):
{
"status": "logged out"
}
curl -X POST https://your-server:9090/logout \
-H "Authorization: Bearer $TOKEN"
Auth Status
GET /api/auth/status
Auth required: Yes
Response (200):
{
"user_id": 1,
"username": "admin",
"role": "admin"
}
curl -s https://your-server:9090/api/auth/status \
-H "Authorization: Bearer $TOKEN"
Dashboard
Dashboard Page
GET /
Auth required: Yes
Returns the dashboard HTML page (or JSON if Accept: application/json).
System Info
GET /api/system/info
Auth required: Yes
Response (200):
{
"hostname": "vps-12345",
"os": "linux",
"arch": "amd64",
"cpus": 4,
"uptime": "up 15d 3h 42m",
"load_avg": "0.45 0.38 0.32",
"mem_total": "7.8 GB",
"mem_used": "3.2 GB",
"mem_percent": 41.0,
"disk_total": "78 GB",
"disk_used": "23 GB",
"disk_percent": 29.5,
"site_count": 5,
"services": [
{"name": "Nginx", "status": "active", "running": true},
{"name": "AUTARCH Web", "status": "active", "running": true},
{"name": "AUTARCH DNS", "status": "inactive", "running": false},
{"name": "Setec Manager", "status": "active", "running": true}
]
}
curl -s https://your-server:9090/api/system/info \
-H "Authorization: Bearer $TOKEN"
Sites
List Sites
GET /sites
Auth required: Yes
Response (200):
[
{
"id": 1,
"domain": "example.com",
"aliases": "www.example.com",
"app_type": "python",
"app_root": "/var/www/example.com",
"app_port": 8000,
"app_entry": "app.py",
"git_repo": "https://github.com/user/repo.git",
"git_branch": "main",
"ssl_enabled": true,
"enabled": true,
"running": true,
"status": "active"
}
]
curl -s https://your-server:9090/sites \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json"
Create Site
POST /sites
Auth required: Yes
Request body:
{
"domain": "newsite.com",
"aliases": "www.newsite.com",
"app_type": "python",
"app_root": "/var/www/newsite.com",
"app_entry": "app.py",
"git_repo": "https://github.com/user/newsite.git",
"git_branch": "main"
}
| Field | Required | Default | Description |
|---|---|---|---|
domain |
Yes | - | Primary domain name |
aliases |
No | "" |
Space-separated domain aliases |
app_type |
No | "static" |
Application type: static, python, node, autarch |
app_root |
No | /var/www/{domain} |
Application root directory |
app_entry |
No | "" |
Entry point file (e.g., app.py, server.js) |
app_port |
No | 0 |
Application listening port |
git_repo |
No | "" |
Git repository URL to clone |
git_branch |
No | "main" |
Git branch to checkout |
Response (201):
{
"id": 2,
"domain": "newsite.com",
"app_type": "python",
"enabled": true
}
curl -X POST https://your-server:9090/sites \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"domain": "newsite.com",
"app_type": "python",
"git_repo": "https://github.com/user/newsite.git"
}'
Get Site Detail
GET /sites/{id}
Auth required: Yes
Response (200):
{
"Site": {
"id": 1,
"domain": "example.com",
"app_type": "python"
},
"Deployments": [
{
"id": 5,
"type": "deploy",
"status": "success",
"created_at": "2026-03-10T14:30:00Z"
}
]
}
curl -s https://your-server:9090/sites/1 \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json"
Update Site
PUT /sites/{id}
Auth required: Yes
Request body: Same fields as create (all optional). Only provided fields are updated.
Response (200): Updated site object.
curl -X PUT https://your-server:9090/sites/1 \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"ssl_enabled": true}'
Delete Site
DELETE /sites/{id}
Auth required: Yes
Disables the nginx config, stops and removes the systemd unit, and deletes the database record. Does not delete the application files.
Response (200):
{
"status": "deleted"
}
curl -X DELETE https://your-server:9090/sites/1 \
-H "Authorization: Bearer $TOKEN"
Deploy Site
POST /sites/{id}/deploy
Auth required: Yes
Performs a git pull, reinstalls dependencies (pip or npm based on app type), and restarts the application service.
Response (200):
{
"status": "deployed"
}
curl -X POST https://your-server:9090/sites/1/deploy \
-H "Authorization: Bearer $TOKEN"
Start Site
POST /sites/{id}/start
Auth required: Yes
Response (200):
{
"status": "started"
}
Stop Site
POST /sites/{id}/stop
Auth required: Yes
Response (200):
{
"status": "stopped"
}
Restart Site
POST /sites/{id}/restart
Auth required: Yes
Response (200):
{
"status": "restarted"
}
Site Logs
GET /sites/{id}/logs
Auth required: Yes
Returns the last 100 lines of the site's systemd journal.
Response (200):
{
"logs": "Mar 10 14:30:00 vps app-example.com[1234]: Starting server on :8000\n..."
}
Site Log Stream (SSE)
GET /sites/{id}/logs/stream
Auth required: Yes
Content-Type: text/event-stream
Streams live log output via Server-Sent Events. Connect with an EventSource client.
curl -N https://your-server:9090/sites/1/logs/stream \
-H "Authorization: Bearer $TOKEN"
AUTARCH
AUTARCH Status Page
GET /autarch
Auth required: Yes
Returns the AUTARCH management page (HTML) or status JSON.
AUTARCH Status API
GET /autarch/status
Auth required: Yes
Response (200):
{
"installed": true,
"install_dir": "/var/www/autarch",
"git_commit": "abc1234 Latest commit message",
"venv_ready": true,
"pip_packages": 47,
"web_running": true,
"web_status": "active",
"dns_running": false,
"dns_status": "inactive"
}
curl -s https://your-server:9090/autarch/status \
-H "Authorization: Bearer $TOKEN"
Install AUTARCH
POST /autarch/install
Auth required: Yes
Clones the AUTARCH repository, creates a Python venv, installs pip and npm packages, sets permissions, and installs systemd units. Returns an error if AUTARCH is already installed.
Response (200):
{
"status": "installed"
}
Response (409):
{
"error": "AUTARCH already installed at /var/www/autarch"
}
curl -X POST https://your-server:9090/autarch/install \
-H "Authorization: Bearer $TOKEN"
Update AUTARCH
POST /autarch/update
Auth required: Yes
Performs git pull, reinstalls pip packages, and restarts both web and DNS services.
Response (200):
{
"status": "updated"
}
Start AUTARCH
POST /autarch/start
Auth required: Yes
Starts both autarch-web and autarch-dns systemd services.
Response (200):
{
"status": "started"
}
Stop AUTARCH
POST /autarch/stop
Auth required: Yes
Response (200):
{
"status": "stopped"
}
Restart AUTARCH
POST /autarch/restart
Auth required: Yes
Response (200):
{
"status": "restarted"
}
Get AUTARCH Config
GET /autarch/config
Auth required: Yes
Returns the contents of autarch_settings.conf.
Response (200):
{
"config": "[settings]\nport = 8181\n..."
}
curl -s https://your-server:9090/autarch/config \
-H "Authorization: Bearer $TOKEN"
Update AUTARCH Config
PUT /autarch/config
Auth required: Yes
Request body:
{
"config": "[settings]\nport = 8181\n..."
}
Writes the config string to autarch_settings.conf with 0600 permissions.
Response (200):
{
"status": "saved"
}
curl -X PUT https://your-server:9090/autarch/config \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"config": "[settings]\nport = 8181"}'
Build AUTARCH DNS
POST /autarch/dns/build
Auth required: Yes
Runs go build in the AUTARCH DNS server directory.
Response (200):
{
"status": "built"
}
SSL/TLS
SSL Overview
GET /ssl
Auth required: Yes
Returns the SSL management page (HTML) or certificate list.
SSL Status
GET /api/ssl/status
Auth required: Yes
Response (200):
[
{
"domain": "example.com",
"issuer": "Let's Encrypt",
"not_before": "2025-12-15T00:00:00Z",
"not_after": "2026-03-15T00:00:00Z",
"days_left": 4,
"auto_renew": true
}
]
curl -s https://your-server:9090/api/ssl/status \
-H "Authorization: Bearer $TOKEN"
Issue Certificate
POST /ssl/{domain}/issue
Auth required: Yes
Issues a new Let's Encrypt SSL certificate for the domain using the ACME protocol and HTTP-01 challenge.
Response (200):
{
"status": "issued",
"cert": "/etc/letsencrypt/live/example.com/fullchain.pem"
}
curl -X POST https://your-server:9090/ssl/example.com/issue \
-H "Authorization: Bearer $TOKEN"
Renew Certificate
POST /ssl/{domain}/renew
Auth required: Yes
Response (200):
{
"status": "renewed"
}
curl -X POST https://your-server:9090/ssl/example.com/renew \
-H "Authorization: Bearer $TOKEN"
Nginx
Nginx Status
GET /nginx
Auth required: Yes
Response (200):
{
"running": true,
"status": "active",
"config_test": "nginx: configuration file /etc/nginx/nginx.conf syntax is ok",
"config_ok": true
}
curl -s https://your-server:9090/nginx \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json"
Reload Nginx
POST /nginx/reload
Auth required: Yes
Tests the configuration first. If the test fails, the reload is aborted.
Response (200):
{
"status": "reloaded"
}
Response (400):
{
"error": "nginx config test failed -- not reloading"
}
curl -X POST https://your-server:9090/nginx/reload \
-H "Authorization: Bearer $TOKEN"
Restart Nginx
POST /nginx/restart
Auth required: Yes
Response (200):
{
"status": "restarted"
}
View Nginx Config
GET /nginx/config/{domain}
Auth required: Yes
Returns the nginx site configuration for a specific domain.
Response (200):
{
"domain": "example.com",
"config": "server {\n listen 80;\n server_name example.com;\n ...\n}"
}
curl -s https://your-server:9090/nginx/config/example.com \
-H "Authorization: Bearer $TOKEN"
Test Nginx Config
POST /nginx/test
Auth required: Yes
Response (200):
{
"output": "nginx: configuration file /etc/nginx/nginx.conf syntax is ok\nnginx: configuration file /etc/nginx/nginx.conf test is successful",
"valid": true
}
curl -X POST https://your-server:9090/nginx/test \
-H "Authorization: Bearer $TOKEN"
Firewall
List Firewall Rules
GET /firewall
Auth required: Yes
Response (200):
{
"enabled": true,
"rules": [
{
"id": 1,
"direction": "in",
"protocol": "tcp",
"port": "22",
"source": "any",
"action": "allow",
"comment": "SSH"
},
{
"id": 2,
"direction": "in",
"protocol": "tcp",
"port": "80",
"source": "any",
"action": "allow",
"comment": "HTTP"
}
],
"ufw_output": "Status: active\n..."
}
curl -s https://your-server:9090/firewall \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json"
Firewall Status
GET /api/firewall/status
Auth required: Yes
Same response as GET /firewall but always returns JSON.
Add Firewall Rule
POST /firewall/rules
Auth required: Yes
Request body:
{
"port": "8080",
"protocol": "tcp",
"source": "any",
"action": "allow",
"comment": "Custom app"
}
| Field | Required | Default | Description |
|---|---|---|---|
port |
Yes | - | Port number or range (e.g., "8080", "3000:3100") |
protocol |
No | "tcp" |
Protocol: tcp, udp, or empty for both |
source |
No | "any" |
Source IP or CIDR (e.g., "192.168.1.0/24") |
action |
No | "allow" |
Action: allow or deny |
comment |
No | "" |
Human-readable description |
Response (201):
{
"status": "rule added"
}
curl -X POST https://your-server:9090/firewall/rules \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"port": "8080", "protocol": "tcp", "action": "allow", "comment": "Custom app"}'
Delete Firewall Rule
DELETE /firewall/rules/{id}
Auth required: Yes
Response (200):
{
"status": "rule deleted"
}
curl -X DELETE https://your-server:9090/firewall/rules/3 \
-H "Authorization: Bearer $TOKEN"
Enable Firewall
POST /firewall/enable
Auth required: Yes
Response (200):
{
"status": "enabled"
}
Disable Firewall
POST /firewall/disable
Auth required: Yes
Response (200):
{
"status": "disabled"
}
Users
System Users
List System Users
GET /users
Auth required: Yes
Response (200):
[
{
"username": "root",
"uid": "0",
"home_dir": "/root",
"shell": "/bin/bash"
},
{
"username": "autarch",
"uid": "1000",
"home_dir": "/home/autarch",
"shell": "/bin/bash"
}
]
curl -s https://your-server:9090/users \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json"
Create System User
POST /users
Auth required: Yes
Request body:
{
"username": "deploy",
"password": "secure-password",
"shell": "/bin/bash"
}
| Field | Required | Default | Description |
|---|---|---|---|
username |
Yes | - | System username |
password |
Yes | - | User password |
shell |
No | "/bin/bash" |
Login shell |
Response (201):
{
"status": "created",
"username": "deploy"
}
curl -X POST https://your-server:9090/users \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"username": "deploy", "password": "secure-password"}'
Delete System User
DELETE /users/{id}
Auth required: Yes
The {id} parameter is the username (not a numeric ID). The root and autarch accounts are protected and cannot be deleted.
Response (200):
{
"status": "deleted"
}
curl -X DELETE https://your-server:9090/users/deploy \
-H "Authorization: Bearer $TOKEN"
Panel Users
Panel users are Setec Manager web interface accounts (separate from system users).
List Panel Users
GET /panel/users
Auth required: Yes
Response (200): Array of panel user objects.
Create Panel User
POST /panel/users
Auth required: Yes
Request body:
{
"username": "operator",
"password": "secure-password",
"role": "admin"
}
| Field | Required | Default | Description |
|---|---|---|---|
username |
Yes | - | Panel username |
password |
Yes | - | Panel password |
role |
No | "admin" |
User role |
Response (201):
{
"id": 2,
"username": "operator"
}
Update Panel User
PUT /panel/users/{id}
Auth required: Yes
Request body:
{
"password": "new-password",
"role": "admin"
}
Both fields are optional. Only provided fields are updated.
Response (200):
{
"status": "updated"
}
Delete Panel User
DELETE /panel/users/{id}
Auth required: Yes
Response (200):
{
"status": "deleted"
}
Backups
List Backups
GET /backups
Auth required: Yes
Response (200): Array of backup records with ID, type, file path, size, and creation timestamp.
curl -s https://your-server:9090/backups \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json"
Create Site Backup
POST /backups/site/{id}
Auth required: Yes
Creates a tar.gz archive of the site's application directory.
Response (201):
{
"id": 3,
"path": "/opt/setec-manager/data/backups/site-example.com-20260311-143000.tar.gz",
"size": 15728640
}
curl -X POST https://your-server:9090/backups/site/1 \
-H "Authorization: Bearer $TOKEN"
Create Full System Backup
POST /backups/full
Auth required: Yes
Creates a tar.gz archive of the webroot (/var/www), nginx configuration (/etc/nginx), and Setec Manager data (/opt/setec-manager/data).
Response (201):
{
"id": 4,
"path": "/opt/setec-manager/data/backups/full-system-20260311-143000.tar.gz",
"size": 52428800
}
curl -X POST https://your-server:9090/backups/full \
-H "Authorization: Bearer $TOKEN"
Delete Backup
DELETE /backups/{id}
Auth required: Yes
Deletes both the database record and the backup file from disk.
Response (200):
{
"status": "deleted"
}
curl -X DELETE https://your-server:9090/backups/3 \
-H "Authorization: Bearer $TOKEN"
Download Backup
GET /backups/{id}/download
Auth required: Yes
Returns the backup file as a download with Content-Disposition: attachment header.
curl -O -J https://your-server:9090/backups/3/download \
-H "Authorization: Bearer $TOKEN"
Monitoring
Monitor Page
GET /monitor
Auth required: Yes
Returns the monitoring dashboard HTML page.
CPU Usage
GET /api/monitor/cpu
Auth required: Yes
Response (200):
{
"cpu": "%Cpu(s): 12.3 us, 2.1 sy, 85.6 id",
"overall": 14.4,
"idle": 85.6,
"cores": [
{"core": 0, "user": 15.2, "system": 3.1},
{"core": 1, "user": 10.5, "system": 1.2}
]
}
curl -s https://your-server:9090/api/monitor/cpu \
-H "Authorization: Bearer $TOKEN"
Memory Usage
GET /api/monitor/memory
Auth required: Yes
Response (200):
{
"total": "7.8 GB",
"used": "3.2 GB",
"free": "1.1 GB",
"available": "4.6 GB",
"swap_total": "2.0 GB",
"swap_used": "256 MB",
"swap_free": "1.7 GB"
}
curl -s https://your-server:9090/api/monitor/memory \
-H "Authorization: Bearer $TOKEN"
Disk Usage
GET /api/monitor/disk
Auth required: Yes
Response (200):
[
{
"filesystem": "/dev/vda1",
"size": "78G",
"used": "23G",
"available": "52G",
"use_percent": "30%",
"mount_point": "/"
}
]
curl -s https://your-server:9090/api/monitor/disk \
-H "Authorization: Bearer $TOKEN"
Service Status
GET /api/monitor/services
Auth required: Yes
Checks the status of key services: nginx, autarch-web, autarch-dns, setec-manager, ufw.
Response (200):
[
{"name": "nginx", "active": "active", "running": true, "memory": "12.5 MB"},
{"name": "autarch-web", "active": "active", "running": true, "memory": "85.3 MB"},
{"name": "autarch-dns", "active": "inactive", "running": false, "memory": ""},
{"name": "setec-manager", "active": "active", "running": true, "memory": "18.2 MB"},
{"name": "ufw", "active": "active", "running": true, "memory": ""}
]
curl -s https://your-server:9090/api/monitor/services \
-H "Authorization: Bearer $TOKEN"
Logs
Logs Page
GET /logs
Auth required: Yes
Returns the logs viewer HTML page.
System Logs
GET /api/logs/system
Auth required: Yes
Query parameters:
| Parameter | Default | Description |
|---|---|---|
lines |
100 |
Number of log lines to return |
Response (200):
{
"logs": "Mar 10 14:30:00 vps systemd[1]: Started Setec Manager.\n..."
}
curl -s "https://your-server:9090/api/logs/system?lines=50" \
-H "Authorization: Bearer $TOKEN"
Nginx Logs
GET /api/logs/nginx
Auth required: Yes
Query parameters:
| Parameter | Default | Description |
|---|---|---|
type |
"access" |
Log type: access or error |
Returns the last 200 lines of the specified nginx log file.
Response (200):
{
"logs": "93.184.216.34 - - [10/Mar/2026:14:30:00 +0000] \"GET / HTTP/1.1\" 200 ...",
"type": "access"
}
curl -s "https://your-server:9090/api/logs/nginx?type=error" \
-H "Authorization: Bearer $TOKEN"
Log Stream (SSE)
GET /api/logs/stream
Auth required: Yes
Content-Type: text/event-stream
Query parameters:
| Parameter | Default | Description |
|---|---|---|
unit |
"autarch-web" |
Systemd unit to stream logs from |
Streams live log output via Server-Sent Events using journalctl -f.
curl -N "https://your-server:9090/api/logs/stream?unit=nginx" \
-H "Authorization: Bearer $TOKEN"
Float Mode
Float Mode enables remote sessions for managing the server through a WebSocket bridge.
Register Float Session
POST /float/register
Auth required: Yes
Returns HTTP 503 if Float Mode is disabled in the configuration.
Request body (optional):
{
"user_agent": "FloatClient/1.0"
}
Response (201):
{
"session_id": "550e8400-e29b-41d4-a716-446655440000",
"expires_in": "24h"
}
curl -X POST https://your-server:9090/float/register \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"user_agent": "FloatClient/1.0"}'
List Float Sessions
GET /float/sessions
Auth required: Yes
Cleans expired sessions before returning the list.
Response (200): Array of active float session objects.
curl -s https://your-server:9090/float/sessions \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json"
Disconnect Float Session
DELETE /float/sessions/{id}
Auth required: Yes
The {id} is the UUID session ID from the register response.
Response (200):
{
"status": "disconnected"
}
curl -X DELETE https://your-server:9090/float/sessions/550e8400-e29b-41d4-a716-446655440000 \
-H "Authorization: Bearer $TOKEN"
Float WebSocket
GET /float/ws
Auth required: Yes
Upgrades to a WebSocket connection for the Float Mode bridge. Use a WebSocket client library, not curl.
Hosting Providers
The hosting provider API provides a unified interface for managing DNS records, domains, VPS instances, SSH keys, and billing across different hosting providers. See the Hosting Providers Guide for detailed documentation.
Provider Management
| Method | Path | Description |
|---|---|---|
GET |
/api/hosting/providers |
List all registered providers |
POST |
/api/hosting/providers/{provider}/configure |
Set API credentials |
POST |
/api/hosting/providers/{provider}/test |
Test connection |
DELETE |
/api/hosting/providers/{provider} |
Remove saved credentials |
DNS
| Method | Path | Description |
|---|---|---|
GET |
/api/hosting/providers/{provider}/dns/{domain} |
List DNS records |
POST |
/api/hosting/providers/{provider}/dns/{domain} |
Create DNS record |
PUT |
/api/hosting/providers/{provider}/dns/{domain} |
Update DNS records (batch) |
DELETE |
/api/hosting/providers/{provider}/dns/{domain} |
Delete DNS record |
POST |
/api/hosting/providers/{provider}/dns/{domain}/reset |
Reset DNS zone |
Domains
| Method | Path | Description |
|---|---|---|
GET |
/api/hosting/providers/{provider}/domains |
List domains |
GET |
/api/hosting/providers/{provider}/domains/{domain} |
Get domain details |
POST |
/api/hosting/providers/{provider}/domains/check |
Check availability |
POST |
/api/hosting/providers/{provider}/domains/purchase |
Purchase domain |
PUT |
/api/hosting/providers/{provider}/domains/{domain}/nameservers |
Set nameservers |
POST |
/api/hosting/providers/{provider}/domains/{domain}/lock |
Enable domain lock |
DELETE |
/api/hosting/providers/{provider}/domains/{domain}/lock |
Disable domain lock |
POST |
/api/hosting/providers/{provider}/domains/{domain}/privacy |
Enable WHOIS privacy |
DELETE |
/api/hosting/providers/{provider}/domains/{domain}/privacy |
Disable WHOIS privacy |
VPS
| Method | Path | Description |
|---|---|---|
GET |
/api/hosting/providers/{provider}/vms |
List VMs |
GET |
/api/hosting/providers/{provider}/vms/{id} |
Get VM details |
POST |
/api/hosting/providers/{provider}/vms |
Create VM |
GET |
/api/hosting/providers/{provider}/datacenters |
List data centers |
SSH Keys
| Method | Path | Description |
|---|---|---|
GET |
/api/hosting/providers/{provider}/ssh-keys |
List SSH keys |
POST |
/api/hosting/providers/{provider}/ssh-keys |
Add SSH key |
DELETE |
/api/hosting/providers/{provider}/ssh-keys/{id} |
Delete SSH key |
Billing
| Method | Path | Description |
|---|---|---|
GET |
/api/hosting/providers/{provider}/subscriptions |
List subscriptions |
GET |
/api/hosting/providers/{provider}/catalog |
Get product catalog |
For complete request/response examples for each hosting endpoint, see hosting-providers.md.
Error Format
All API endpoints return errors in a consistent JSON format:
{
"error": "description of the error"
}
Common HTTP Status Codes
| Code | Meaning |
|---|---|
| 200 | Success |
| 201 | Created |
| 303 | Redirect (HTML form submissions) |
| 400 | Bad request (invalid parameters) |
| 401 | Authentication required |
| 403 | Forbidden (insufficient permissions) |
| 404 | Resource not found |
| 409 | Conflict (duplicate resource) |
| 429 | Rate limited |
| 500 | Internal server error |
| 501 | Not implemented (provider does not support this operation) |
| 503 | Service unavailable (e.g., Float Mode disabled) |