Autarch/services/setec-manager/docs/api-reference.md

1661 lines
28 KiB
Markdown
Raw Normal View History

2026-03-12 20:51:38 -07:00
# 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
1. [Authentication](#authentication)
2. [Dashboard](#dashboard)
3. [Sites](#sites)
4. [AUTARCH](#autarch)
5. [SSL/TLS](#ssltls)
6. [Nginx](#nginx)
7. [Firewall](#firewall)
8. [Users](#users)
9. [Backups](#backups)
10. [Monitoring](#monitoring)
11. [Logs](#logs)
12. [Float Mode](#float-mode)
13. [Hosting Providers](#hosting-providers)
---
## Authentication
### Login
```
POST /login
```
**Auth required:** No
**Rate limited:** Yes (5 attempts per IP per minute)
**Request body:**
```json
{
"username": "admin",
"password": "your-password"
}
```
**Response (200):**
```json
{
"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.
```bash
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):**
```json
{
"status": "logged out"
}
```
```bash
curl -X POST https://your-server:9090/logout \
-H "Authorization: Bearer $TOKEN"
```
### Auth Status
```
GET /api/auth/status
```
**Auth required:** Yes
**Response (200):**
```json
{
"user_id": 1,
"username": "admin",
"role": "admin"
}
```
```bash
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):**
```json
{
"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}
]
}
```
```bash
curl -s https://your-server:9090/api/system/info \
-H "Authorization: Bearer $TOKEN"
```
---
## Sites
### List Sites
```
GET /sites
```
**Auth required:** Yes
**Response (200):**
```json
[
{
"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"
}
]
```
```bash
curl -s https://your-server:9090/sites \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json"
```
### Create Site
```
POST /sites
```
**Auth required:** Yes
**Request body:**
```json
{
"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):**
```json
{
"id": 2,
"domain": "newsite.com",
"app_type": "python",
"enabled": true
}
```
```bash
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):**
```json
{
"Site": {
"id": 1,
"domain": "example.com",
"app_type": "python"
},
"Deployments": [
{
"id": 5,
"type": "deploy",
"status": "success",
"created_at": "2026-03-10T14:30:00Z"
}
]
}
```
```bash
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.
```bash
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):**
```json
{
"status": "deleted"
}
```
```bash
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):**
```json
{
"status": "deployed"
}
```
```bash
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):**
```json
{
"status": "started"
}
```
### Stop Site
```
POST /sites/{id}/stop
```
**Auth required:** Yes
**Response (200):**
```json
{
"status": "stopped"
}
```
### Restart Site
```
POST /sites/{id}/restart
```
**Auth required:** Yes
**Response (200):**
```json
{
"status": "restarted"
}
```
### Site Logs
```
GET /sites/{id}/logs
```
**Auth required:** Yes
Returns the last 100 lines of the site's systemd journal.
**Response (200):**
```json
{
"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.
```bash
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):**
```json
{
"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"
}
```
```bash
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):**
```json
{
"status": "installed"
}
```
**Response (409):**
```json
{
"error": "AUTARCH already installed at /var/www/autarch"
}
```
```bash
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):**
```json
{
"status": "updated"
}
```
### Start AUTARCH
```
POST /autarch/start
```
**Auth required:** Yes
Starts both `autarch-web` and `autarch-dns` systemd services.
**Response (200):**
```json
{
"status": "started"
}
```
### Stop AUTARCH
```
POST /autarch/stop
```
**Auth required:** Yes
**Response (200):**
```json
{
"status": "stopped"
}
```
### Restart AUTARCH
```
POST /autarch/restart
```
**Auth required:** Yes
**Response (200):**
```json
{
"status": "restarted"
}
```
### Get AUTARCH Config
```
GET /autarch/config
```
**Auth required:** Yes
Returns the contents of `autarch_settings.conf`.
**Response (200):**
```json
{
"config": "[settings]\nport = 8181\n..."
}
```
```bash
curl -s https://your-server:9090/autarch/config \
-H "Authorization: Bearer $TOKEN"
```
### Update AUTARCH Config
```
PUT /autarch/config
```
**Auth required:** Yes
**Request body:**
```json
{
"config": "[settings]\nport = 8181\n..."
}
```
Writes the config string to `autarch_settings.conf` with `0600` permissions.
**Response (200):**
```json
{
"status": "saved"
}
```
```bash
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):**
```json
{
"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):**
```json
[
{
"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
}
]
```
```bash
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):**
```json
{
"status": "issued",
"cert": "/etc/letsencrypt/live/example.com/fullchain.pem"
}
```
```bash
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):**
```json
{
"status": "renewed"
}
```
```bash
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):**
```json
{
"running": true,
"status": "active",
"config_test": "nginx: configuration file /etc/nginx/nginx.conf syntax is ok",
"config_ok": true
}
```
```bash
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):**
```json
{
"status": "reloaded"
}
```
**Response (400):**
```json
{
"error": "nginx config test failed -- not reloading"
}
```
```bash
curl -X POST https://your-server:9090/nginx/reload \
-H "Authorization: Bearer $TOKEN"
```
### Restart Nginx
```
POST /nginx/restart
```
**Auth required:** Yes
**Response (200):**
```json
{
"status": "restarted"
}
```
### View Nginx Config
```
GET /nginx/config/{domain}
```
**Auth required:** Yes
Returns the nginx site configuration for a specific domain.
**Response (200):**
```json
{
"domain": "example.com",
"config": "server {\n listen 80;\n server_name example.com;\n ...\n}"
}
```
```bash
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):**
```json
{
"output": "nginx: configuration file /etc/nginx/nginx.conf syntax is ok\nnginx: configuration file /etc/nginx/nginx.conf test is successful",
"valid": true
}
```
```bash
curl -X POST https://your-server:9090/nginx/test \
-H "Authorization: Bearer $TOKEN"
```
---
## Firewall
### List Firewall Rules
```
GET /firewall
```
**Auth required:** Yes
**Response (200):**
```json
{
"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..."
}
```
```bash
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:**
```json
{
"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):**
```json
{
"status": "rule added"
}
```
```bash
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):**
```json
{
"status": "rule deleted"
}
```
```bash
curl -X DELETE https://your-server:9090/firewall/rules/3 \
-H "Authorization: Bearer $TOKEN"
```
### Enable Firewall
```
POST /firewall/enable
```
**Auth required:** Yes
**Response (200):**
```json
{
"status": "enabled"
}
```
### Disable Firewall
```
POST /firewall/disable
```
**Auth required:** Yes
**Response (200):**
```json
{
"status": "disabled"
}
```
---
## Users
### System Users
#### List System Users
```
GET /users
```
**Auth required:** Yes
**Response (200):**
```json
[
{
"username": "root",
"uid": "0",
"home_dir": "/root",
"shell": "/bin/bash"
},
{
"username": "autarch",
"uid": "1000",
"home_dir": "/home/autarch",
"shell": "/bin/bash"
}
]
```
```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:**
```json
{
"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):**
```json
{
"status": "created",
"username": "deploy"
}
```
```bash
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):**
```json
{
"status": "deleted"
}
```
```bash
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:**
```json
{
"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):**
```json
{
"id": 2,
"username": "operator"
}
```
#### Update Panel User
```
PUT /panel/users/{id}
```
**Auth required:** Yes
**Request body:**
```json
{
"password": "new-password",
"role": "admin"
}
```
Both fields are optional. Only provided fields are updated.
**Response (200):**
```json
{
"status": "updated"
}
```
#### Delete Panel User
```
DELETE /panel/users/{id}
```
**Auth required:** Yes
**Response (200):**
```json
{
"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.
```bash
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):**
```json
{
"id": 3,
"path": "/opt/setec-manager/data/backups/site-example.com-20260311-143000.tar.gz",
"size": 15728640
}
```
```bash
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):**
```json
{
"id": 4,
"path": "/opt/setec-manager/data/backups/full-system-20260311-143000.tar.gz",
"size": 52428800
}
```
```bash
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):**
```json
{
"status": "deleted"
}
```
```bash
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.
```bash
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):**
```json
{
"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}
]
}
```
```bash
curl -s https://your-server:9090/api/monitor/cpu \
-H "Authorization: Bearer $TOKEN"
```
### Memory Usage
```
GET /api/monitor/memory
```
**Auth required:** Yes
**Response (200):**
```json
{
"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"
}
```
```bash
curl -s https://your-server:9090/api/monitor/memory \
-H "Authorization: Bearer $TOKEN"
```
### Disk Usage
```
GET /api/monitor/disk
```
**Auth required:** Yes
**Response (200):**
```json
[
{
"filesystem": "/dev/vda1",
"size": "78G",
"used": "23G",
"available": "52G",
"use_percent": "30%",
"mount_point": "/"
}
]
```
```bash
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):**
```json
[
{"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": ""}
]
```
```bash
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):**
```json
{
"logs": "Mar 10 14:30:00 vps systemd[1]: Started Setec Manager.\n..."
}
```
```bash
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):**
```json
{
"logs": "93.184.216.34 - - [10/Mar/2026:14:30:00 +0000] \"GET / HTTP/1.1\" 200 ...",
"type": "access"
}
```
```bash
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`.
```bash
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):**
```json
{
"user_agent": "FloatClient/1.0"
}
```
**Response (201):**
```json
{
"session_id": "550e8400-e29b-41d4-a716-446655440000",
"expires_in": "24h"
}
```
```bash
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.
```bash
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):**
```json
{
"status": "disconnected"
}
```
```bash
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](hosting-providers.md) 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](hosting-providers.md).
---
## Error Format
All API endpoints return errors in a consistent JSON format:
```json
{
"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) |