Reference
API reference
Every endpoint of the controller's REST API, generated from its OpenAPI document (openapi.json). Authentication, errors and the WebSocket are explained in Using the API. A running panel also serves this reference at /api/v1/docs.
API keys Account Agent Audit Authentication Backups Billing Configs Datacenters Files Games Meta Mods Nodes Notifications Packages Resellers Schedules Services Settings Setup Steam accounts Users
API keys
GET /api/v1/api-keys
List my API keys
Responses
200OK - APIKeysOutputBodyFields
Field Type Description itemsrequiredarray of APIKey 4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/api-keys
Create an API key
Request body application/json
| Field | Type | Description |
|---|---|---|
expires_at | string (date-time) | |
name required | string | (≤ 64 chars) |
scopes | array of string | Limit the key to these permissions; omit for all of yours |
Responses
201Created - CreateAPIKeyOutputBodyFields
Field Type Description api_keyrequiredAPIKey tokenrequiredstring The key itself. Shown only now; store it safely. 4xx/5xxerror envelope{"error":{"code","message","details"}}
DELETE /api/v1/api-keys/{id}
Revoke one of my API keys
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Responses
204No Content4xx/5xxerror envelope{"error":{"code","message","details"}}
Account
GET /api/v1/auth/me/ssh-keys
Your SSH keys for SFTP
Responses
200OK - List-ssh-keysResponseFields
Field Type Description itemsrequiredarray of SSHKeyOut 4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/auth/me/ssh-keys
Add an SSH public key for SFTP
Request body application/json
| Field | Type | Description |
|---|---|---|
name | string | (≤ 100 chars) |
public_key required | string | One line in OpenSSH format, e.g. ssh-ed25519 AAAA... me@pc (≤ 16384 chars) |
Responses
201Created - SSHKeyOutFields
Field Type Description created_atrequiredstring (date-time) fingerprintrequiredstring idrequiredinteger (int64) last_used_atrequiredstring (nullable) (date-time) namerequiredstring public_keyrequiredstring 4xx/5xxerror envelope{"error":{"code","message","details"}}
DELETE /api/v1/auth/me/ssh-keys/{id}
Remove an SSH key
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Responses
204No Content4xx/5xxerror envelope{"error":{"code","message","details"}}
Agent
GET /api/v1/agent/ca
The agent CA certificate (agents verify it against --ca-hash before enrolling)
No authentication needed.
Responses
200OK - CAInfoFields
Field Type Description ca_hashrequiredstring sha256:<hex> of the CA's SubjectPublicKeyInfo ca_pemrequiredstring 4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/agent/enroll
Enroll a node (called by ngcp-agent enroll)
Consumes a one-time token, creates the node and signs the agent's certificate. The agent must verify ca_pem against the --ca-hash it was given.
No authentication needed.
Request body application/json
| Field | Type | Description |
|---|---|---|
csr_pem required | string | PEM certificate request for the agent's new key (≤ 8192 chars) |
inventory required | Inventory | |
token required | string | One-time enrollment token (ngcpe_...) (≤ 200 chars) |
Responses
200OK - ResponseFields
Field Type Description ca_pemrequiredstring Verify its SubjectPublicKeyInfo hash against the --ca-hash from the token certificate_pemrequiredstring grpc_addressrequiredstring host:port of the AgentLink endpoint node_idrequiredinteger (int64) node_namerequiredstring update_public_keyrequiredstring Ed25519 key (hex) that signs agent updates 4xx/5xxerror envelope{"error":{"code","message","details"}}
GET /api/v1/agent/releases
Agent builds available for self-update
Responses
200OK - List-agent-releasesResponseFields
Field Type Description itemsrequiredarray of AgentRelease 4xx/5xxerror envelope{"error":{"code","message","details"}}
Audit
GET /api/v1/audit-events
Search the audit log
| Parameter | In | Type | Description |
|---|---|---|---|
cursor | query | string | |
limit | query | integer (int32) | |
action | query | string | Exact action or a prefix such as 'user' (matches user.*) |
target_type | query | string | |
target_id | query | string | |
actor_user_id | query | integer (int64) | |
outcome | query | string: success, failure, denied | |
since | query | string (date-time) | RFC 3339 |
until | query | string (date-time) | RFC 3339 |
Responses
200OK - PageAuditEventFields
Field Type Description itemsrequiredarray of AuditEvent next_cursorrequiredstring Pass as ?cursor= to get the next page; empty when there are no more 4xx/5xxerror envelope{"error":{"code","message","details"}}
Authentication
POST /api/v1/auth/login
Sign in with username/email and password
On success without 2FA, sets the session cookie and returns the CSRF token. With 2FA on, returns status mfa_required and an mfa_token for POST /auth/login/mfa.
No authentication needed.
Request body application/json
| Field | Type | Description |
|---|---|---|
login required | string | Username or email address (≤ 254 chars) |
password required | string | (≤ 1024 chars) |
Responses
200OK - LoginBodyFields
Field Type Description csrf_tokenstring Send as X-CSRF-Token on every state-changing request mfa_tokenstring Send with the code to POST /auth/login/mfa (valid 5 minutes) statusrequiredstring: ok, mfa_required userUser 4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/auth/login/mfa
Complete sign-in with a 2FA code or recovery code
No authentication needed.
Request body application/json
| Field | Type | Description |
|---|---|---|
code | string | 6-digit code from the authenticator app (≤ 10 chars) |
mfa_token required | string | (≤ 200 chars) |
recovery_code | string | One of the recovery codes, instead of a code (≤ 32 chars) |
Responses
200OK - LoginBodyFields
Field Type Description csrf_tokenstring Send as X-CSRF-Token on every state-changing request mfa_tokenstring Send with the code to POST /auth/login/mfa (valid 5 minutes) statusrequiredstring: ok, mfa_required userUser 4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/auth/logout
Sign out of this session
Responses
204No Content4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/auth/logout-all
Sign out of every session, including this one
Responses
200OK - LogoutAllOutputBodyFields
Field Type Description sessions_endedrequiredinteger (int64) 4xx/5xxerror envelope{"error":{"code","message","details"}}
GET /api/v1/auth/me
Who am I
Responses
200OK - MeBodyFields
Field Type Description auth_methodrequiredstring: session, api_key brandingrequiredMeBranding What this account sees: the panel's branding, overridden by its reseller's client_iprequiredstring The address this request came from, as the controller sees it csrf_tokenstring mfa_enrollment_requiredrequiredboolean Policy requires turning on 2FA before anything else password_min_lengthrequiredinteger (int64) Current password policy, for form hints permissionsrequiredarray of string Effective global permissions recovery_codes_leftrequiredinteger (int64) userrequiredUser 4xx/5xxerror envelope{"error":{"code","message","details"}}
PATCH /api/v1/auth/me
Change my display name or email address
Request body application/json
| Field | Type | Description |
|---|---|---|
current_password | string | Required when changing the email address (≤ 1024 chars) |
display_name | string | (≤ 100 chars) |
email | string | (≤ 254 chars) |
Responses
200OK - UserFields
Field Type Description created_atrequiredstring (date-time) denied_permissionsrequiredarray of string display_namerequiredstring emailrequiredstring extra_permissionsrequiredarray of string idrequiredinteger (int64) last_login_atrequiredstring (nullable) (date-time) last_login_iprequiredstring (nullable) locked_untilrequiredstring (nullable) (date-time) must_change_passwordrequiredboolean reseller_idrequiredinteger (nullable) (int64) rolerequiredstring: superadmin, admin, reseller, user, subuser statusrequiredstring: active, suspended, disabled totp_enabledrequiredboolean updated_atrequiredstring (date-time) usernamerequiredstring 4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/auth/password
Change my password (ends my other sessions)
Request body application/json
| Field | Type | Description |
|---|---|---|
current_password required | string | (≤ 1024 chars) |
new_password required | string | (≤ 1024 chars) |
Responses
204No Content4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/auth/recovery-codes
Replace my recovery codes
Request body application/json
| Field | Type | Description |
|---|---|---|
password required | string | (≤ 1024 chars) |
Responses
200OK - RecoveryCodesOutputBodyFields
Field Type Description recovery_codesrequiredarray of string 4xx/5xxerror envelope{"error":{"code","message","details"}}
GET /api/v1/auth/sessions
List my active sessions
Responses
200OK - SessionsOutputBodyFields
Field Type Description itemsrequiredarray of Session 4xx/5xxerror envelope{"error":{"code","message","details"}}
DELETE /api/v1/auth/sessions/{id}
End one of my sessions
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Responses
204No Content4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/auth/totp/disable
Turn off two-factor authentication
Request body application/json
| Field | Type | Description |
|---|---|---|
code required | string | (≤ 10 chars) |
password required | string | (≤ 1024 chars) |
Responses
204No Content4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/auth/totp/enable
Confirm a code and turn on two-factor authentication
Returns recovery codes. They are shown only once.
Request body application/json
| Field | Type | Description |
|---|---|---|
code required | string | (≤ 10 chars) |
Responses
200OK - RecoveryCodesOutputBodyFields
Field Type Description recovery_codesrequiredarray of string 4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/auth/totp/setup
Start turning on two-factor authentication
Request body application/json
| Field | Type | Description |
|---|---|---|
password required | string | (≤ 1024 chars) |
Responses
200OK - TOTPSetupOutputBodyFields
Field Type Description otpauth_urirequiredstring Render as a QR code secretrequiredstring 4xx/5xxerror envelope{"error":{"code","message","details"}}
GET /api/v1/public/branding
Branding for the sign-in page
No authentication needed.
Responses
200OK - BrandingOutputBodyFields
Field Type Description password_min_lengthrequiredinteger (int64) Password policy, for form hints product_namerequiredstring support_urlrequiredstring 4xx/5xxerror envelope{"error":{"code","message","details"}}
Backups
GET /api/v1/backup-targets
Backup targets (local folder, SFTP, S3-compatible)
Responses
200OK - ItemsTargetViewBodyFields
Field Type Description itemsrequiredarray of TargetView 4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/backup-targets
Add a backup target
Request body application/json
| Field | Type | Description |
|---|---|---|
config required | TargetConfig | |
keep_days required | integer (int32) | Delete backups older than this (0 = never) (min 0, max 3650) |
keep_last required | integer (int32) | Keep at most this many backups per service (0 = all) (min 0, max 1000) |
kind | string: local, sftp, s3 | Fixed after creation |
name required | string | (≤ 80 chars) |
password | string | sftp |
private_key | string | sftp: unencrypted OpenSSH / PEM key |
secret_key | string | s3 |
user_selectable required | boolean | Service owners may back up here |
Responses
201Created - TargetViewFields
Field Type Description configrequiredTargetConfig created_atrequiredstring (date-time) has_passwordrequiredboolean has_private_keyrequiredboolean has_secret_keyrequiredboolean idrequiredinteger (int64) keep_daysrequiredinteger (int32) keep_lastrequiredinteger (int32) kindrequiredstring: local, sftp, s3 namerequiredstring updated_atrequiredstring (date-time) user_selectablerequiredboolean 4xx/5xxerror envelope{"error":{"code","message","details"}}
PUT /api/v1/backup-targets/{id}
Change a backup target (its kind stays)
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Request body application/json
| Field | Type | Description |
|---|---|---|
config required | TargetConfig | |
keep_days required | integer (int32) | Delete backups older than this (0 = never) (min 0, max 3650) |
keep_last required | integer (int32) | Keep at most this many backups per service (0 = all) (min 0, max 1000) |
kind | string: local, sftp, s3 | Fixed after creation |
name required | string | (≤ 80 chars) |
password | string | sftp |
private_key | string | sftp: unencrypted OpenSSH / PEM key |
secret_key | string | s3 |
user_selectable required | boolean | Service owners may back up here |
Responses
200OK - TargetViewFields
Field Type Description configrequiredTargetConfig created_atrequiredstring (date-time) has_passwordrequiredboolean has_private_keyrequiredboolean has_secret_keyrequiredboolean idrequiredinteger (int64) keep_daysrequiredinteger (int32) keep_lastrequiredinteger (int32) kindrequiredstring: local, sftp, s3 namerequiredstring updated_atrequiredstring (date-time) user_selectablerequiredboolean 4xx/5xxerror envelope{"error":{"code","message","details"}}
DELETE /api/v1/backup-targets/{id}
Remove a backup target no task uses (its backups stay where they are)
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Responses
204No Content4xx/5xxerror envelope{"error":{"code","message","details"}}
GET /api/v1/services/{id}/backups
A service's backups
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Responses
200OK - SvcBackupsBodyFields
Field Type Description itemsrequiredarray of BackupView targetsrequiredarray of TargetChoice Where the caller may back this service up to 4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/services/{id}/backups
Back a service up now
The node streams a .tar.gz of the service's files to the target while the server keeps running; progress arrives as "backups" events on the WebSocket topic service:{id}.
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Request body application/json
| Field | Type | Description |
|---|---|---|
target_id required | integer (int64) | (min 1) |
Responses
202Accepted - BackupViewFields
Field Type Description completed_atstring (date-time) created_atrequiredstring (date-time) errorrequiredstring idrequiredinteger (int64) locationrequiredstring messagerequiredstring providerrequiredstring restore_errorrequiredstring restore_statusrequiredstring: , running, completed, failed restored_atstring (date-time) scheduledrequiredboolean size_bytesrequiredinteger (int64) statusrequiredstring: pending, running, completed, failed, deleted targetrequiredstring target_idinteger (int64) 4xx/5xxerror envelope{"error":{"code","message","details"}}
DELETE /api/v1/services/{id}/backups/{backup_id}
Delete a backup from its target
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) | |
backup_id required | path | integer (int64) |
Responses
202Accepted4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/services/{id}/backups/{backup_id}/restore
Restore a backup
The node stops the service, downloads and unpacks the backup into a staging folder, replaces the backed-up files and starts the service again if it was running.
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) | |
backup_id required | path | integer (int64) |
Responses
202Accepted4xx/5xxerror envelope{"error":{"code","message","details"}}
Billing
PATCH /api/v1/services/{id}/package
Move a game server to another package of the same game (billing: upgrade / downgrade)
Applies the package's limits; slots are clamped into the new range unless given. Administrators, the owner's reseller and billing keys.
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Request body application/json
| Field | Type | Description |
|---|---|---|
package_id required | integer (int64) | (min 1) |
slots | integer (int32) | 0 = keep the current slots, clamped into the package's range (min 0) |
Responses
200OK - ViewFields
Field Type Description cpu_limit_percentrequiredinteger (int32) 0 = unlimited; 100 = one core cpu_percentrequirednumber (nullable) (float) crash_policyrequiredCrashPolicy created_atrequiredstring (date-time) desired_staterequiredstring: running, stopped disk_limit_bytesrequiredinteger (int64) File manager / SFTP / upload quota; 0 = unlimited external_idrequiredstring (nullable) The billing system's reference file_denyrequiredarray of string Deny globs added for this service (on top of the game definition's): matching paths are hidden from everyone except administrators game_idrequiredstring has_rconboolean The game has a remote console (only on GET /services/{id}) has_workshopboolean The game takes Steam Workshop mods (only on GET /services/{id}) idrequiredinteger (int64) installInstallProgress While installing / updating install_dirrequiredstring installedrequiredboolean The game files are in place iprequiredstring last_errorrequiredstring The last command the agent refused, and why last_exit_coderequiredinteger (nullable) (int32) max_playersrequiredinteger (nullable) (int32) memory_limit_bytesrequiredinteger (int64) 0 = unlimited memory_used_bytesrequiredinteger (nullable) (int64) metrics_atrequiredstring (nullable) (date-time) modsrequiredobject Workshop items per modlist variable namerequiredstring node_connectedrequiredboolean The node's agent link is up node_idrequiredinteger (int64) node_namerequiredstring node_osrequiredstring: windows, linux observed_atrequiredstring (nullable) (date-time) observed_messagerequiredstring observed_statusrequiredstring What the agent last reported os_userrequiredstring owner_user_idrequiredinteger (int64) owner_usernamerequiredstring package_idrequiredinteger (nullable) (int64) The package it was ordered with (null = none) permissionsarray of string What the caller may do on this service (absent on WebSocket events) playersrequiredinteger (nullable) (int32) From the game's status query while it runs (null = unknown) portsarray of PortView Only on GET /services/{id} primary_portrequiredinteger (nullable) (int32) process_countrequiredinteger (nullable) (int32) processesarray of ProcessView Only on GET /services/{id} query_atrequiredstring (nullable) (date-time) query_maprequiredstring query_namerequiredstring Server name the game reports restartsrequiredinteger (int32) Crash restarts within the crash-policy window secret_variablesrequiredarray of string Password variables that have a value (values are never returned) sftpSFTPInfo How the caller connects with SFTP (only on GET /services/{id}, with the files permission) slotsrequiredinteger (int32) statusrequiredstring: installing, install_failed, stopped, starting, running, stopping, crashed, suspended, moving, deleting steam_account_idrequiredinteger (nullable) (int64) suspend_reasonrequiredstring Why it was suspended (billing or an administrator) suspendedrequiredboolean variablesrequiredobject 4xx/5xxerror envelope{"error":{"code","message","details"}}
GET /api/v1/services/{id}/usage
Disk, CPU, memory and player usage of a game server (billing usage updates)
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) | |
since | query | string (date-time) | Start of the period (RFC 3339); default 30 days ago, at most 90 |
Responses
200OK - UsageReportFields
Field Type Description cpu_avg_percentrequirednumber (double) 100 = one core cpu_max_percentrequirednumber (double) disk_limit_bytesrequiredinteger (int64) 0 = unlimited disk_measured_atrequiredstring (nullable) (date-time) When the disk usage was measured (older when the node is offline) disk_used_bytesrequiredinteger (nullable) (int64) The service directory's size; null when never measured mem_avg_bytesrequiredinteger (int64) mem_limit_bytesrequiredinteger (int64) 0 = unlimited mem_max_bytesrequiredinteger (int64) net_measuredrequiredboolean Per-service network traffic is not measured yet (always false) players_maxrequiredinteger (int32) samplesrequiredinteger (int64) Resource samples in the period (one per minute while running) service_idrequiredinteger (int64) sincerequiredstring (date-time) slotsrequiredinteger (int32) 4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/users/{id}/sso-link
A one-time sign-in link for a customer account ("Log in to panel")
Only for user and sub-user accounts in the caller's tenancy. With service_id the link opens that game server (the account must own it or have access).
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Request body application/json
| Field | Type | Description |
|---|---|---|
service_id | integer (int64) | (min 0) |
Responses
200OK - SsoOutBodyFields
Field Type Description expires_atrequiredstring (date-time) urlrequiredstring Open this in the customer's browser; it works once, for 60 seconds 4xx/5xxerror envelope{"error":{"code","message","details"}}
Configs
GET /api/v1/services/{id}/configs
The service's config files as forms
Settings come from the game definition; bound settings follow a panel value (a variable or the slot count) and show it.
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Responses
200OK - List-configsResponseFields
Field Type Description itemsrequiredarray of ConfigFileView 4xx/5xxerror envelope{"error":{"code","message","details"}}
PUT /api/v1/services/{id}/configs/{index}
Save a config form
values: the settings to change (others stay as they are). A bound setting changes its variable / the slot count instead; the file follows. A password left null is unchanged. hash: the form's version (409 when the file changed meanwhile).
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) | |
index required | path | integer (int64) |
Request body application/json
| Field | Type | Description |
|---|---|---|
hash | string | (≤ 64 chars) |
values required | object |
Responses
200OK - ConfigFileViewFields
Field Type Description errorstring Why the file could not be read or parsed existsrequiredboolean formatrequiredstring hashstring Content version; send it back to detect concurrent edits indexrequiredinteger (int64) Position in the game definition's config_files labelrequiredstring pathrequiredstring settingsrequiredarray of ConfigSettingView 4xx/5xxerror envelope{"error":{"code","message","details"}}
Datacenters
GET /api/v1/datacenters
List datacenters
Responses
200OK - List-datacentersResponseFields
Field Type Description itemsrequiredarray of Datacenter 4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/datacenters
Create a datacenter
Request body application/json
| Field | Type | Description |
|---|---|---|
location | string | (≤ 200 chars) |
name required | string | (≤ 64 chars) |
Responses
201Created - DatacenterFields
Field Type Description created_atrequiredstring (date-time) idrequiredinteger (int64) locationrequiredstring namerequiredstring node_countrequiredinteger (int64) 4xx/5xxerror envelope{"error":{"code","message","details"}}
PUT /api/v1/datacenters/{id}
Rename or relocate a datacenter
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Request body application/json
| Field | Type | Description |
|---|---|---|
location | string | (≤ 200 chars) |
name required | string | (≤ 64 chars) |
Responses
200OK - DatacenterFields
Field Type Description created_atrequiredstring (date-time) idrequiredinteger (int64) locationrequiredstring namerequiredstring node_countrequiredinteger (int64) 4xx/5xxerror envelope{"error":{"code","message","details"}}
DELETE /api/v1/datacenters/{id}
Delete an empty datacenter
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Responses
204No Content4xx/5xxerror envelope{"error":{"code","message","details"}}
Files
GET /api/v1/services/{id}/files
List a folder of the service
Directories first, then by name. Paths the game definition or an administrator denies are left out (administrators see them).
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) | |
path | query | string | Relative to the service directory, / separated; empty or / is the directory itself |
Responses
200OK - List-filesResponseFields
Field Type Description itemsrequiredarray of FileEntry pathrequiredstring 4xx/5xxerror envelope{"error":{"code","message","details"}}
GET /api/v1/services/{id}/files/content
Open a text file in the editor
Files up to 2 MiB; larger ones are downloaded.
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) | |
path | query | string | Relative to the service directory, / separated; empty or / is the directory itself |
Responses
200OK - FileContentOutFields
Field Type Description binaryrequiredboolean Not UTF-8 text: download it instead contentrequiredstring UTF-8 text; empty when binary entryrequiredFileEntry hashrequiredstring Send back as expect when saving 4xx/5xxerror envelope{"error":{"code","message","details"}}
PUT /api/v1/services/{id}/files/content
Save a text file from the editor
expect: omit to overwrite or create, "absent" to only create, or the hash the editor read (409 conflict when the file changed meanwhile).
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Request body application/json
| Field | Type | Description |
|---|---|---|
content required | string | |
expect | string | (≤ 64 chars) |
path required | string | (≤ 4096 chars) |
Responses
200OK - Write-fileResponseFields
Field Type Description entryrequiredFileEntry hashrequiredstring 4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/services/{id}/files/direct-download
A signed URL to download straight from the node
null when the node has no direct file endpoint; then use GET .../files/download. The URL works for one hour.
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Request body application/json
| Field | Type | Description |
|---|---|---|
path required | string | (≤ 4096 chars) |
Responses
200OK - Direct-downloadResponseFields
Field Type Description directrequiredDirectTarget 4xx/5xxerror envelope{"error":{"code","message","details"}}
GET /api/v1/services/{id}/files/download
Download a file
Streams from the node through the controller (constant memory). For a direct node URL use POST .../files/direct-download.
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) | |
path | query | string | Relative to the service directory, / separated; empty or / is the directory itself |
Responses
200The file - string (binary)4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/services/{id}/files/ops
Create a folder, rename / move, copy, delete, change permissions, compress or extract
mkdir: path. rename / copy: path -> dest (rename with overwrite replaces a file). delete: paths. chmod: path + mode (octal bits as a number, Linux; Windows only toggles read-only). compress: paths -> dest (.zip, .tar.gz, .tar). extract: path (an archive) -> dest folder (overwrite replaces existing files).
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Request body application/json
| Field | Type | Description |
|---|---|---|
dest | string | (≤ 4096 chars) |
mode | integer (int32) | 0-511 (0o777) (min 0, max 511) |
op required | string: mkdir, rename, copy, delete, chmod, compress, extract | |
overwrite | boolean | |
path | string | (≤ 4096 chars) |
paths | array of string |
Responses
200OK - File-operationResponseFields
Field Type Description entryFileEntry filesinteger (int64) extract: files written skippedarray of string extract: entries left out (existing, denied, links) 4xx/5xxerror envelope{"error":{"code","message","details"}}
GET /api/v1/services/{id}/files/search
Find files and folders by name below a folder
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) | |
path | query | string | Relative to the service directory, / separated; empty or / is the directory itself |
q | query | string | Part of the name, or a glob with * ? [ ] |
Responses
200OK - Search-filesResponseFields
Field Type Description itemsrequiredarray of FileEntry truncatedrequiredboolean More than 500 matches 4xx/5xxerror envelope{"error":{"code","message","details"}}
GET /api/v1/services/{id}/files/stat
Describe one file or folder
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) | |
path | query | string | Relative to the service directory, / separated; empty or / is the directory itself |
Responses
200OK - FileEntryFields
Field Type Description moderequiredinteger (int32) (min 0) modifiedrequiredstring (date-time) namerequiredstring pathrequiredstring sizerequiredinteger (int64) typerequiredstring: file, dir, link, other 4xx/5xxerror envelope{"error":{"code","message","details"}}
GET /api/v1/services/{id}/files/usage
The service directory's size and quota
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Responses
200OK - ServiceDiskUsageFields
Field Type Description quota_bytesrequiredinteger (int64) 0 = unlimited used_bytesrequiredinteger (int64) 4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/services/{id}/uploads
Start a chunked upload
Then PUT each chunk (chunk_bytes at most, in order) to .../uploads/{upload}?offset=N, and POST .../complete. After a 409 conflict on a chunk (a gap or a retry from the wrong place), GET .../uploads/{upload} returns received: resume there. When direct is set, the chunks may go straight to the node instead (PUT {direct.url}?offset=N with header Authorization: Bearer {direct.token}).
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Request body application/json
| Field | Type | Description |
|---|---|---|
overwrite | boolean | |
path required | string | (≤ 4096 chars) |
size required | integer (int64) | (min 0) |
Responses
201Created - UploadInfoFields
Field Type Description chunk_bytesrequiredinteger (int64) directDirectTarget Upload straight to the node (PUT {url}?offset=N with the token); fall back to the controller when it fails idrequiredstring pathrequiredstring receivedrequiredinteger (int64) sizerequiredinteger (int64) 4xx/5xxerror envelope{"error":{"code","message","details"}}
GET /api/v1/services/{id}/uploads/{upload}
How much of an upload the node has (to resume)
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) | |
upload required | path | string |
Responses
200OK - UploadInfoFields
Field Type Description chunk_bytesrequiredinteger (int64) directDirectTarget Upload straight to the node (PUT {url}?offset=N with the token); fall back to the controller when it fails idrequiredstring pathrequiredstring receivedrequiredinteger (int64) sizerequiredinteger (int64) 4xx/5xxerror envelope{"error":{"code","message","details"}}
PUT /api/v1/services/{id}/uploads/{upload}
Send one chunk of an upload
The raw bytes (application/octet-stream), at most 64 MiB per request. They stream to the node; the controller keeps no copy.
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) | |
upload required | path | string | |
offset | query | integer (int64) | Where this chunk starts in the file |
Request body application/octet-stream
Responses
200OK - Upload-chunkResponseFields
Field Type Description receivedrequiredinteger (int64) Bytes the node has now 4xx/5xxerror envelope{"error":{"code","message","details"}}
DELETE /api/v1/services/{id}/uploads/{upload}
Cancel an upload and drop what was sent
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) | |
upload required | path | string |
Responses
204No Content4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/services/{id}/uploads/{upload}/complete
Finish an upload: the file appears at its path
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) | |
upload required | path | string |
Responses
200OK - FileEntryFields
Field Type Description moderequiredinteger (int32) (min 0) modifiedrequiredstring (date-time) namerequiredstring pathrequiredstring sizerequiredinteger (int64) typerequiredstring: file, dir, link, other 4xx/5xxerror envelope{"error":{"code","message","details"}}
Games
GET /api/v1/game-definitions
Every game definition, enabled or not, with its origin and use
Responses
200OK - List-game-definitionsResponseFields
Field Type Description itemsrequiredarray of GameAdmin 4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/game-definitions
Upload a new or changed game definition
The definition is validated first (422 with every problem). Its version must be higher than the stored one; a saved built-in becomes custom and is no longer refreshed by controller upgrades.
Request body application/json
| Field | Type | Description |
|---|---|---|
scripts | object | scripts/<name> -> content |
source_yaml required | string | game.yaml (≤ 262144 chars) |
Responses
200OK - GameSourceFields
Field Type Description categoryrequiredstring enabledrequiredboolean has_rconrequiredboolean The game has a remote console (RCON console, rcon tasks, stop over RCON) has_workshoprequiredboolean modlist variables take Steam Workshop ids or links idrequiredstring install_stepsrequiredobject Install steps per OS namerequiredstring needs_steam_accountrequiredboolean Installing needs a Steam account in the vault originrequiredstring: builtin, custom builtin definitions refresh with the controller until someone edits them platformsrequiredarray of string portsrequiredarray of GamePort scriptsrequiredobject service_countrequiredinteger (int64) slots_defaultrequiredinteger (int64) slots_maxrequiredinteger (int64) slots_minrequiredinteger (int64) source_yamlrequiredstring updated_atrequiredstring (date-time) variablesrequiredarray of GameVariable versionrequiredinteger (int64) versionsrequiredarray of GameVersion 4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/game-definitions/validate
Check a game.yaml without saving it
Always 200: valid is false with every problem (path or line + message) when the definition has errors.
Request body application/json
| Field | Type | Description |
|---|---|---|
scripts | object | scripts/<name> -> content |
source_yaml required | string | game.yaml (≤ 262144 chars) |
Responses
200OK - Validate-game-definitionResponseFields
Field Type Description gameGame problemsrequiredarray of ValidationProblem validrequiredboolean 4xx/5xxerror envelope{"error":{"code","message","details"}}
GET /api/v1/game-definitions/{game}
A game definition with its YAML, scripts and versions
| Parameter | In | Type | Description |
|---|---|---|---|
game required | path | string |
Responses
200OK - GameSourceFields
Field Type Description categoryrequiredstring enabledrequiredboolean has_rconrequiredboolean The game has a remote console (RCON console, rcon tasks, stop over RCON) has_workshoprequiredboolean modlist variables take Steam Workshop ids or links idrequiredstring install_stepsrequiredobject Install steps per OS namerequiredstring needs_steam_accountrequiredboolean Installing needs a Steam account in the vault originrequiredstring: builtin, custom builtin definitions refresh with the controller until someone edits them platformsrequiredarray of string portsrequiredarray of GamePort scriptsrequiredobject service_countrequiredinteger (int64) slots_defaultrequiredinteger (int64) slots_maxrequiredinteger (int64) slots_minrequiredinteger (int64) source_yamlrequiredstring updated_atrequiredstring (date-time) variablesrequiredarray of GameVariable versionrequiredinteger (int64) versionsrequiredarray of GameVersion 4xx/5xxerror envelope{"error":{"code","message","details"}}
PATCH /api/v1/game-definitions/{game}
Offer or hide a game for new services
| Parameter | In | Type | Description |
|---|---|---|---|
game required | path | string |
Request body application/json
| Field | Type | Description |
|---|---|---|
enabled required | boolean |
Responses
204No Content4xx/5xxerror envelope{"error":{"code","message","details"}}
DELETE /api/v1/game-definitions/{game}
Delete a custom definition that no service uses
| Parameter | In | Type | Description |
|---|---|---|---|
game required | path | string |
Responses
204No Content4xx/5xxerror envelope{"error":{"code","message","details"}}
GET /api/v1/game-definitions/{game}/versions/{version}
The YAML of an earlier version (for a diff)
| Parameter | In | Type | Description |
|---|---|---|---|
game required | path | string | |
version required | path | integer (int32) |
Responses
200OK - Get-game-definition-versionResponseFields
Field Type Description source_yamlrequiredstring 4xx/5xxerror envelope{"error":{"code","message","details"}}
GET /api/v1/games
Game definitions available for new services
Responses
200OK - List-gamesResponseFields
Field Type Description itemsrequiredarray of Game 4xx/5xxerror envelope{"error":{"code","message","details"}}
Meta
GET /api/v1/meta/permissions
Roles and permission flags
Responses
200OK - CatalogOutputBodyFields
Field Type Description permissionsrequiredarray of string rolesrequiredarray of RoleInfo service_permissionsrequiredarray of string 4xx/5xxerror envelope{"error":{"code","message","details"}}
Mods
GET /api/v1/game-definitions/{game}/mods
A game's mod catalog
| Parameter | In | Type | Description |
|---|---|---|---|
game required | path | string |
Responses
200OK - ItemsCatalogModBodyFields
Field Type Description itemsrequiredarray of CatalogMod 4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/game-definitions/{game}/mods
Add a Workshop item or collection to a game's mod catalog
| Parameter | In | Type | Description |
|---|---|---|---|
game required | path | string |
Request body application/json
| Field | Type | Description |
|---|---|---|
description | string | (≤ 500 chars) |
kind | string: workshop, workshop_collection | Fixed after creation |
name | string | Default: the Workshop title (required for collections) (≤ 120 chars) |
workshop_id required | string | (≤ 20 chars) |
Responses
201Created - CatalogModFields
Field Type Description created_atrequiredstring (date-time) descriptionrequiredstring game_idrequiredstring idrequiredinteger (int64) kindrequiredstring: workshop, workshop_collection namerequiredstring updated_atrequiredstring (date-time) workshop_idrequiredinteger (int64) 4xx/5xxerror envelope{"error":{"code","message","details"}}
PUT /api/v1/game-definitions/{game}/mods/{mod_id}
Change a catalog entry
| Parameter | In | Type | Description |
|---|---|---|---|
game required | path | string | |
mod_id required | path | integer (int64) |
Request body application/json
| Field | Type | Description |
|---|---|---|
description | string | (≤ 500 chars) |
kind | string: workshop, workshop_collection | Fixed after creation |
name | string | Default: the Workshop title (required for collections) (≤ 120 chars) |
workshop_id required | string | (≤ 20 chars) |
Responses
200OK - CatalogModFields
Field Type Description created_atrequiredstring (date-time) descriptionrequiredstring game_idrequiredstring idrequiredinteger (int64) kindrequiredstring: workshop, workshop_collection namerequiredstring updated_atrequiredstring (date-time) workshop_idrequiredinteger (int64) 4xx/5xxerror envelope{"error":{"code","message","details"}}
DELETE /api/v1/game-definitions/{game}/mods/{mod_id}
Remove a catalog entry (services keep their mods)
| Parameter | In | Type | Description |
|---|---|---|---|
game required | path | string | |
mod_id required | path | integer (int64) |
Responses
204No Content4xx/5xxerror envelope{"error":{"code","message","details"}}
GET /api/v1/services/{id}/mods
A service's mod lists and its game's mod catalog
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Responses
200OK - ServiceModsViewFields
Field Type Description catalogrequiredarray of CatalogMod installedrequiredboolean listsrequiredarray of ModList workshoprequiredboolean The game takes Steam Workshop mods 4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/services/{id}/mods/expand
Resolve a Workshop id or link (a collection becomes its items, with titles)
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Request body application/json
| Field | Type | Description |
|---|---|---|
ref required | string | (≤ 500 chars) |
Responses
200OK - ItemsWorkshopItemBodyFields
Field Type Description itemsrequiredarray of WorkshopItem 4xx/5xxerror envelope{"error":{"code","message","details"}}
PUT /api/v1/services/{id}/mods/{variable}
Replace one mod list (Workshop ids in load order)
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) | |
variable required | path | string |
Request body application/json
| Field | Type | Description |
|---|---|---|
ids required | array of string | Workshop ids |
Responses
200OK - SetModsOutBodyFields
Field Type Description cpu_limit_percentrequiredinteger (int32) 0 = unlimited; 100 = one core cpu_percentrequirednumber (nullable) (float) crash_policyrequiredCrashPolicy created_atrequiredstring (date-time) desired_staterequiredstring: running, stopped disk_limit_bytesrequiredinteger (int64) File manager / SFTP / upload quota; 0 = unlimited external_idrequiredstring (nullable) The billing system's reference file_denyrequiredarray of string Deny globs added for this service (on top of the game definition's): matching paths are hidden from everyone except administrators game_idrequiredstring has_rconboolean The game has a remote console (only on GET /services/{id}) has_workshopboolean The game takes Steam Workshop mods (only on GET /services/{id}) idrequiredinteger (int64) installInstallProgress While installing / updating install_dirrequiredstring installedrequiredboolean The game files are in place iprequiredstring last_errorrequiredstring The last command the agent refused, and why last_exit_coderequiredinteger (nullable) (int32) max_playersrequiredinteger (nullable) (int32) memory_limit_bytesrequiredinteger (int64) 0 = unlimited memory_used_bytesrequiredinteger (nullable) (int64) metrics_atrequiredstring (nullable) (date-time) modsrequiredobject Workshop items per modlist variable mods_changedrequiredboolean Run the update action to download the new mods namerequiredstring node_connectedrequiredboolean The node's agent link is up node_idrequiredinteger (int64) node_namerequiredstring node_osrequiredstring: windows, linux observed_atrequiredstring (nullable) (date-time) observed_messagerequiredstring observed_statusrequiredstring What the agent last reported os_userrequiredstring owner_user_idrequiredinteger (int64) owner_usernamerequiredstring package_idrequiredinteger (nullable) (int64) The package it was ordered with (null = none) permissionsarray of string What the caller may do on this service (absent on WebSocket events) playersrequiredinteger (nullable) (int32) From the game's status query while it runs (null = unknown) portsarray of PortView Only on GET /services/{id} primary_portrequiredinteger (nullable) (int32) process_countrequiredinteger (nullable) (int32) processesarray of ProcessView Only on GET /services/{id} query_atrequiredstring (nullable) (date-time) query_maprequiredstring query_namerequiredstring Server name the game reports restartsrequiredinteger (int32) Crash restarts within the crash-policy window secret_variablesrequiredarray of string Password variables that have a value (values are never returned) sftpSFTPInfo How the caller connects with SFTP (only on GET /services/{id}, with the files permission) slotsrequiredinteger (int32) statusrequiredstring: installing, install_failed, stopped, starting, running, stopping, crashed, suspended, moving, deleting steam_account_idrequiredinteger (nullable) (int64) suspend_reasonrequiredstring Why it was suspended (billing or an administrator) suspendedrequiredboolean variablesrequiredobject 4xx/5xxerror envelope{"error":{"code","message","details"}}
Nodes
GET /api/v1/enrollment-tokens
Pending (unused, unexpired) enrollment tokens
Responses
200OK - List-enrollment-tokensResponseFields
Field Type Description itemsrequiredarray of EnrollmentToken 4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/enrollment-tokens
Create a one-time token to add a node
Request body application/json
| Field | Type | Description |
|---|---|---|
datacenter_id required | integer (int64) | (min 1) |
node_name required | string | (≤ 64 chars) |
ttl_minutes | integer (int64) | Default 60 (min 5, max 10080) |
Responses
201Created - NewTokenOutBodyFields
Field Type Description ca_hashrequiredstring commandsrequiredobject Ready-to-paste commands: windows, linux (enroll an agent installed from its package); linux_install, windows_install (one-line installers, present when the panel serves the agent packages) created_atrequiredstring (date-time) datacenter_idrequiredinteger (int64) expires_atrequiredstring (date-time) hintrequiredstring idrequiredinteger (int64) node_namerequiredstring tokenrequiredstring Shown once 4xx/5xxerror envelope{"error":{"code","message","details"}}
DELETE /api/v1/enrollment-tokens/{id}
Cancel an unused enrollment token
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Responses
204No Content4xx/5xxerror envelope{"error":{"code","message","details"}}
GET /api/v1/nodes
List nodes with live status and the latest metrics
Responses
200OK - List-nodesResponseFields
Field Type Description itemsrequiredarray of Node 4xx/5xxerror envelope{"error":{"code","message","details"}}
GET /api/v1/nodes/{id}
Get a node
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Responses
200OK - NodeFields
Field Type Description agent_versionrequiredstring archrequiredstring capabilitiesrequiredarray of string cert_not_afterrequiredstring (nullable) (date-time) connectedrequiredboolean The agent link is up right now connected_atrequiredstring (nullable) (date-time) cpu_coresrequiredinteger (int32) cpu_percentrequirednumber (nullable) (float) created_atrequiredstring (date-time) datacenter_idrequiredinteger (int64) disk_bytesrequiredinteger (int64) disksrequiredarray of DiskUsage firewall_managedrequiredboolean hostnamerequiredstring idrequiredinteger (int64) ip_addressesarray of NodeIP Only on GET /nodes/{id} last_seen_atrequiredstring (nullable) (date-time) memory_bytesrequiredinteger (int64) memory_used_bytesrequiredinteger (nullable) (int64) metrics_atrequiredstring (nullable) (date-time) moderequiredstring: active, draining, disabled Operator mode; draining/disabled persist across disconnects (see connected for the link) namerequiredstring net_rx_bytesrequiredinteger (nullable) (int64) net_tx_bytesrequiredinteger (nullable) (int64) osrequiredstring: windows, linux os_versionrequiredstring overcommit_percentrequiredinteger (int32) port_range_endrequiredinteger (int32) port_range_startrequiredinteger (int32) services_dirrequiredstring statusrequiredstring: pending, online, offline, draining, disabled steamcmd_dirrequiredstring 4xx/5xxerror envelope{"error":{"code","message","details"}}
PATCH /api/v1/nodes/{id}
Change node settings or mode (active, draining, disabled)
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Request body application/json
| Field | Type | Description |
|---|---|---|
datacenter_id | integer (int64) | |
firewall_managed | boolean | |
mode | string: active, draining, disabled | |
name | string | (≤ 64 chars) |
overcommit_percent | integer (int32) | (min 1, max 1000) |
port_range_end | integer (int32) | (min 1024, max 65535) |
port_range_start | integer (int32) | (min 1024, max 65535) |
services_dir | string | (≤ 260 chars) |
steamcmd_dir | string | (≤ 260 chars) |
Responses
200OK - NodeFields
Field Type Description agent_versionrequiredstring archrequiredstring capabilitiesrequiredarray of string cert_not_afterrequiredstring (nullable) (date-time) connectedrequiredboolean The agent link is up right now connected_atrequiredstring (nullable) (date-time) cpu_coresrequiredinteger (int32) cpu_percentrequirednumber (nullable) (float) created_atrequiredstring (date-time) datacenter_idrequiredinteger (int64) disk_bytesrequiredinteger (int64) disksrequiredarray of DiskUsage firewall_managedrequiredboolean hostnamerequiredstring idrequiredinteger (int64) ip_addressesarray of NodeIP Only on GET /nodes/{id} last_seen_atrequiredstring (nullable) (date-time) memory_bytesrequiredinteger (int64) memory_used_bytesrequiredinteger (nullable) (int64) metrics_atrequiredstring (nullable) (date-time) moderequiredstring: active, draining, disabled Operator mode; draining/disabled persist across disconnects (see connected for the link) namerequiredstring net_rx_bytesrequiredinteger (nullable) (int64) net_tx_bytesrequiredinteger (nullable) (int64) osrequiredstring: windows, linux os_versionrequiredstring overcommit_percentrequiredinteger (int32) port_range_endrequiredinteger (int32) port_range_startrequiredinteger (int32) services_dirrequiredstring statusrequiredstring: pending, online, offline, draining, disabled steamcmd_dirrequiredstring 4xx/5xxerror envelope{"error":{"code","message","details"}}
DELETE /api/v1/nodes/{id}
Remove a node (revokes its certificate and disconnects it)
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Responses
204No Content4xx/5xxerror envelope{"error":{"code","message","details"}}
GET /api/v1/nodes/{id}/metrics
Node resource samples (up to 24 h)
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) | |
minutes | query | integer (int64) |
Responses
200OK - Get-node-metricsResponseFields
Field Type Description itemsrequiredarray of MetricSample 4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/nodes/{id}/update-agent
Send a signed self-update to a connected agent
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Request body application/json
| Field | Type | Description |
|---|---|---|
version required | string | (≤ 64 chars) |
Responses
202Accepted - Update-node-agentResponseFields
Field Type Description request_idrequiredstring 4xx/5xxerror envelope{"error":{"code","message","details"}}
Notifications
GET /api/v1/notification-deliveries
The latest 200 deliveries with their status
Responses
200OK - ItemsDeliveryBodyFields
Field Type Description itemsrequiredarray of Delivery 4xx/5xxerror envelope{"error":{"code","message","details"}}
GET /api/v1/notification-events
Events a webhook can subscribe to
Responses
200OK - ItemsStringBodyFields
Field Type Description itemsrequiredarray of string 4xx/5xxerror envelope{"error":{"code","message","details"}}
GET /api/v1/settings/notification-templates
Message templates per event (Go text/template over the event: .Service .Node .Message .Panel)
Responses
200OK - ItemsTemplateViewBodyFields
Field Type Description itemsrequiredarray of TemplateView 4xx/5xxerror envelope{"error":{"code","message","details"}}
PUT /api/v1/settings/notification-templates
Replace the template overrides (an empty text uses the default)
Request body application/json
| Field | Type | Description |
|---|---|---|
templates required | object |
Responses
200OK - ItemsTemplateViewBodyFields
Field Type Description itemsrequiredarray of TemplateView 4xx/5xxerror envelope{"error":{"code","message","details"}}
GET /api/v1/settings/smtp
The outgoing mail server for e-mail notifications
Responses
200OK - SMTPViewFields
Field Type Description fromrequiredstring has_passwordrequiredboolean hostrequiredstring portrequiredinteger (int64) securityrequiredstring: starttls, tls, none, usernamerequiredstring 4xx/5xxerror envelope{"error":{"code","message","details"}}
PUT /api/v1/settings/smtp
Change the mail server (an empty host turns e-mail off)
Request body application/json
| Field | Type | Description |
|---|---|---|
from | string | (≤ 200 chars) |
host required | string | (≤ 253 chars) |
password | string | Write-only; leave out to keep, "" to clear (≤ 500 chars) |
port | integer (int64) | (min 0, max 65535) |
security | string: starttls, tls, none | |
username | string | (≤ 200 chars) |
Responses
200OK - SMTPViewFields
Field Type Description fromrequiredstring has_passwordrequiredboolean hostrequiredstring portrequiredinteger (int64) securityrequiredstring: starttls, tls, none, usernamerequiredstring 4xx/5xxerror envelope{"error":{"code","message","details"}}
GET /api/v1/webhooks
Webhooks: generic (HMAC-signed JSON), Discord and e-mail
Responses
200OK - ItemsWebhookViewBodyFields
Field Type Description itemsrequiredarray of WebhookView 4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/webhooks
Add a webhook
Generic webhooks receive the event as JSON with X-NGCP-Event, X-NGCP-Timestamp and, with a secret, X-NGCP-Signature: sha256=hex(HMAC-SHA256(secret, timestamp + "." + body)).
Request body application/json
| Field | Type | Description |
|---|---|---|
enabled required | boolean | |
events | array of string | Empty = every event |
kind | string: generic, discord, email | Fixed after creation |
name required | string | (≤ 80 chars) |
secret | string | generic: HMAC-SHA256 signing secret (write-only; "" removes it) (≤ 200 chars) |
url | string | generic / discord: the URL; email: addresses. On update, empty keeps the stored one (≤ 2000 chars) |
Responses
201Created - WebhookViewFields
Field Type Description created_atrequiredstring (date-time) enabledrequiredboolean eventsrequiredarray of string Empty = every event has_secretrequiredboolean idrequiredinteger (int64) kindrequiredstring: generic, discord, email namerequiredstring updated_atrequiredstring (date-time) urlrequiredstring Generic: the endpoint; Discord: masked; email: the addresses 4xx/5xxerror envelope{"error":{"code","message","details"}}
PUT /api/v1/webhooks/{id}
Change a webhook (its kind stays)
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Request body application/json
| Field | Type | Description |
|---|---|---|
enabled required | boolean | |
events | array of string | Empty = every event |
kind | string: generic, discord, email | Fixed after creation |
name required | string | (≤ 80 chars) |
secret | string | generic: HMAC-SHA256 signing secret (write-only; "" removes it) (≤ 200 chars) |
url | string | generic / discord: the URL; email: addresses. On update, empty keeps the stored one (≤ 2000 chars) |
Responses
200OK - WebhookViewFields
Field Type Description created_atrequiredstring (date-time) enabledrequiredboolean eventsrequiredarray of string Empty = every event has_secretrequiredboolean idrequiredinteger (int64) kindrequiredstring: generic, discord, email namerequiredstring updated_atrequiredstring (date-time) urlrequiredstring Generic: the endpoint; Discord: masked; email: the addresses 4xx/5xxerror envelope{"error":{"code","message","details"}}
DELETE /api/v1/webhooks/{id}
Remove a webhook
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Responses
204No Content4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/webhooks/{id}/test
Send a test message (see the delivery log)
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Responses
202Accepted4xx/5xxerror envelope{"error":{"code","message","details"}}
Packages
GET /api/v1/packages
Packages (products): all for administrators, the global ones plus their own for resellers
Responses
200OK - PackagesOutBodyFields
Field Type Description itemsrequiredarray of Package 4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/packages
Create a package
Request body application/json
| Field | Type | Description |
|---|---|---|
allowed_datacenter_ids | array of integer (int64) | Empty = any datacenter |
cpu_limit_percent | integer (int32) | 0 = unlimited; 100 = one core (min 0) |
description | string | (≤ 500 chars) |
disk_limit_bytes | integer (int64) | 0 = unlimited (min 0) |
enabled required | boolean | |
game_id | string | Required on create; the game cannot change later (≤ 64 chars) |
memory_limit_bytes | integer (int64) | 0 = unlimited (min 0) |
name required | string | (≤ 64 chars) |
reseller_id | integer (int64) | Administrators: the reseller that owns it (0 = global); ignored for resellers and on update (min 0) |
slots_default | integer (int32) | 0 = the game's default, inside the range (min 0) |
slots_max required | integer (int32) | (min 0) |
slots_min required | integer (int32) | (min 0) |
start_on_create | boolean | |
variables | object | Startup variable defaults (no passwords) |
Responses
201Created - PackageFields
Field Type Description allowed_datacenter_idsrequiredarray of integer (int64) Empty = any datacenter cpu_limit_percentrequiredinteger (int32) 0 = unlimited; 100 = one core created_atrequiredstring (date-time) descriptionrequiredstring disk_limit_bytesrequiredinteger (int64) File manager / SFTP / upload quota; 0 = unlimited enabledrequiredboolean Disabled packages cannot be ordered; existing game servers keep running game_idrequiredstring idrequiredinteger (int64) memory_limit_bytesrequiredinteger (int64) 0 = unlimited namerequiredstring reseller_idrequiredinteger (int64) 0 = a global package (every reseller may sell it) service_countrequiredinteger (int64) slots_defaultrequiredinteger (int32) slots_maxrequiredinteger (int32) slots_minrequiredinteger (int32) start_on_createrequiredboolean Start new game servers after the install updated_atrequiredstring (date-time) variablesrequiredobject Startup variable defaults for new game servers 4xx/5xxerror envelope{"error":{"code","message","details"}}
GET /api/v1/packages/{id}
A package
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Responses
200OK - PackageFields
Field Type Description allowed_datacenter_idsrequiredarray of integer (int64) Empty = any datacenter cpu_limit_percentrequiredinteger (int32) 0 = unlimited; 100 = one core created_atrequiredstring (date-time) descriptionrequiredstring disk_limit_bytesrequiredinteger (int64) File manager / SFTP / upload quota; 0 = unlimited enabledrequiredboolean Disabled packages cannot be ordered; existing game servers keep running game_idrequiredstring idrequiredinteger (int64) memory_limit_bytesrequiredinteger (int64) 0 = unlimited namerequiredstring reseller_idrequiredinteger (int64) 0 = a global package (every reseller may sell it) service_countrequiredinteger (int64) slots_defaultrequiredinteger (int32) slots_maxrequiredinteger (int32) slots_minrequiredinteger (int32) start_on_createrequiredboolean Start new game servers after the install updated_atrequiredstring (date-time) variablesrequiredobject Startup variable defaults for new game servers 4xx/5xxerror envelope{"error":{"code","message","details"}}
PUT /api/v1/packages/{id}
Replace a package's settings (not its game or owner)
Existing game servers keep their limits until their package is applied again (PATCH /services/{id}/package).
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Request body application/json
| Field | Type | Description |
|---|---|---|
allowed_datacenter_ids | array of integer (int64) | Empty = any datacenter |
cpu_limit_percent | integer (int32) | 0 = unlimited; 100 = one core (min 0) |
description | string | (≤ 500 chars) |
disk_limit_bytes | integer (int64) | 0 = unlimited (min 0) |
enabled required | boolean | |
game_id | string | Required on create; the game cannot change later (≤ 64 chars) |
memory_limit_bytes | integer (int64) | 0 = unlimited (min 0) |
name required | string | (≤ 64 chars) |
reseller_id | integer (int64) | Administrators: the reseller that owns it (0 = global); ignored for resellers and on update (min 0) |
slots_default | integer (int32) | 0 = the game's default, inside the range (min 0) |
slots_max required | integer (int32) | (min 0) |
slots_min required | integer (int32) | (min 0) |
start_on_create | boolean | |
variables | object | Startup variable defaults (no passwords) |
Responses
200OK - PackageFields
Field Type Description allowed_datacenter_idsrequiredarray of integer (int64) Empty = any datacenter cpu_limit_percentrequiredinteger (int32) 0 = unlimited; 100 = one core created_atrequiredstring (date-time) descriptionrequiredstring disk_limit_bytesrequiredinteger (int64) File manager / SFTP / upload quota; 0 = unlimited enabledrequiredboolean Disabled packages cannot be ordered; existing game servers keep running game_idrequiredstring idrequiredinteger (int64) memory_limit_bytesrequiredinteger (int64) 0 = unlimited namerequiredstring reseller_idrequiredinteger (int64) 0 = a global package (every reseller may sell it) service_countrequiredinteger (int64) slots_defaultrequiredinteger (int32) slots_maxrequiredinteger (int32) slots_minrequiredinteger (int32) start_on_createrequiredboolean Start new game servers after the install updated_atrequiredstring (date-time) variablesrequiredobject Startup variable defaults for new game servers 4xx/5xxerror envelope{"error":{"code","message","details"}}
DELETE /api/v1/packages/{id}
Delete a package no game server uses
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Responses
204No Content4xx/5xxerror envelope{"error":{"code","message","details"}}
Resellers
GET /api/v1/resellers
Resellers with their quotas and what their customers use
Responses
200OK - ResellersOutBodyFields
Field Type Description itemsrequiredarray of Reseller 4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/resellers
Create a reseller
Its accounts are then created as users with role reseller and this reseller_id.
Request body application/json
| Field | Type | Description |
|---|---|---|
allowed_game_ids | array of string | Empty = every game |
allowed_node_ids | array of integer (int64) | Empty = every node |
branding | ResellerBranding | |
name required | string | (≤ 64 chars) |
quotas | ResellerQuotas |
Responses
201Created - ResellerFields
Field Type Description accountsrequiredinteger (int64) Accounts of this reseller, including its own reseller accounts allowed_game_idsrequiredarray of string Games the reseller may sell; empty = all allowed_node_idsrequiredarray of integer (int64) Nodes its customers' game servers may be placed on; empty = all brandingrequiredResellerBranding created_atrequiredstring (date-time) idrequiredinteger (int64) namerequiredstring quotasrequiredResellerQuotas updated_atrequiredstring (date-time) usagerequiredResellerUsage 4xx/5xxerror envelope{"error":{"code","message","details"}}
GET /api/v1/resellers/{id}
A reseller (administrators any; a reseller account its own, with quotas and usage)
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Responses
200OK - ResellerFields
Field Type Description accountsrequiredinteger (int64) Accounts of this reseller, including its own reseller accounts allowed_game_idsrequiredarray of string Games the reseller may sell; empty = all allowed_node_idsrequiredarray of integer (int64) Nodes its customers' game servers may be placed on; empty = all brandingrequiredResellerBranding created_atrequiredstring (date-time) idrequiredinteger (int64) namerequiredstring quotasrequiredResellerQuotas updated_atrequiredstring (date-time) usagerequiredResellerUsage 4xx/5xxerror envelope{"error":{"code","message","details"}}
PUT /api/v1/resellers/{id}
Replace a reseller's name, branding, quotas and allowed games / nodes
Lowering a quota below what is in use is allowed; it only stops further growth.
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Request body application/json
| Field | Type | Description |
|---|---|---|
allowed_game_ids | array of string | Empty = every game |
allowed_node_ids | array of integer (int64) | Empty = every node |
branding | ResellerBranding | |
name required | string | (≤ 64 chars) |
quotas | ResellerQuotas |
Responses
200OK - ResellerFields
Field Type Description accountsrequiredinteger (int64) Accounts of this reseller, including its own reseller accounts allowed_game_idsrequiredarray of string Games the reseller may sell; empty = all allowed_node_idsrequiredarray of integer (int64) Nodes its customers' game servers may be placed on; empty = all brandingrequiredResellerBranding created_atrequiredstring (date-time) idrequiredinteger (int64) namerequiredstring quotasrequiredResellerQuotas updated_atrequiredstring (date-time) usagerequiredResellerUsage 4xx/5xxerror envelope{"error":{"code","message","details"}}
DELETE /api/v1/resellers/{id}
Delete a reseller that has no accounts left
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Responses
204No Content4xx/5xxerror envelope{"error":{"code","message","details"}}
Schedules
GET /api/v1/schedule-preview
The next runs of a cron expression (checks it too)
| Parameter | In | Type | Description |
|---|---|---|---|
cron | query | string | |
timezone | query | string |
Responses
200OK - ItemsTimeBodyFields
Field Type Description itemsrequiredarray of string (date-time) 4xx/5xxerror envelope{"error":{"code","message","details"}}
GET /api/v1/schedules
Global scheduled tasks
Responses
200OK - ItemsTaskViewBodyFields
Field Type Description itemsrequiredarray of TaskView 4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/schedules
Add a global scheduled task (every service matching the selector)
Request body application/json
| Field | Type | Description |
|---|---|---|
action required | string: restart, stop, start, update, backup, rcon, script, notify | |
cron required | string | 5 fields (minute hour day month weekday) or @hourly, @daily, @weekly, @monthly (≤ 100 chars) |
enabled required | boolean | |
name required | string | (≤ 80 chars) |
params | TaskParams | |
selector | TaskSelector | Global tasks: the services they apply to (empty = all) |
timezone | string | IANA name, e.g. Europe/Stockholm (default UTC) (≤ 64 chars) |
Responses
201Created - TaskViewFields
Field Type Description actionrequiredstring created_atrequiredstring (date-time) cronrequiredstring enabledrequiredboolean idrequiredinteger (int64) last_resultTaskResult last_run_atstring (date-time) namerequiredstring nextrequiredarray of string (date-time) The next three runs paramsrequiredTaskParams scoperequiredstring: global, service selectorTaskSelector service_idinteger (int64) timezonerequiredstring updated_atrequiredstring (date-time) 4xx/5xxerror envelope{"error":{"code","message","details"}}
PUT /api/v1/schedules/{id}
Change a global scheduled task
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Request body application/json
| Field | Type | Description |
|---|---|---|
action required | string: restart, stop, start, update, backup, rcon, script, notify | |
cron required | string | 5 fields (minute hour day month weekday) or @hourly, @daily, @weekly, @monthly (≤ 100 chars) |
enabled required | boolean | |
name required | string | (≤ 80 chars) |
params | TaskParams | |
selector | TaskSelector | Global tasks: the services they apply to (empty = all) |
timezone | string | IANA name, e.g. Europe/Stockholm (default UTC) (≤ 64 chars) |
Responses
200OK - TaskViewFields
Field Type Description actionrequiredstring created_atrequiredstring (date-time) cronrequiredstring enabledrequiredboolean idrequiredinteger (int64) last_resultTaskResult last_run_atstring (date-time) namerequiredstring nextrequiredarray of string (date-time) The next three runs paramsrequiredTaskParams scoperequiredstring: global, service selectorTaskSelector service_idinteger (int64) timezonerequiredstring updated_atrequiredstring (date-time) 4xx/5xxerror envelope{"error":{"code","message","details"}}
DELETE /api/v1/schedules/{id}
Remove a global scheduled task
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Responses
204No Content4xx/5xxerror envelope{"error":{"code","message","details"}}
GET /api/v1/services/{id}/schedule-runs
A service's latest scheduled-task runs (also those that ran while the controller was down)
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Responses
200OK - ItemsScheduleRunViewBodyFields
Field Type Description itemsrequiredarray of ScheduleRunView 4xx/5xxerror envelope{"error":{"code","message","details"}}
GET /api/v1/services/{id}/schedules
A service's scheduled tasks
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Responses
200OK - SvcTasksBodyFields
Field Type Description globalrequiredarray of TaskView Global tasks that also apply (administrators manage them) itemsrequiredarray of TaskView The service's own tasks 4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/services/{id}/schedules
Add a scheduled task to a service
The task goes to the service's node, which runs it even while the controller is unreachable. Scripts are for administrators.
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Request body application/json
| Field | Type | Description |
|---|---|---|
action required | string: restart, stop, start, update, backup, rcon, script, notify | |
cron required | string | 5 fields (minute hour day month weekday) or @hourly, @daily, @weekly, @monthly (≤ 100 chars) |
enabled required | boolean | |
name required | string | (≤ 80 chars) |
params | TaskParams | |
selector | TaskSelector | Global tasks: the services they apply to (empty = all) |
timezone | string | IANA name, e.g. Europe/Stockholm (default UTC) (≤ 64 chars) |
Responses
201Created - TaskViewFields
Field Type Description actionrequiredstring created_atrequiredstring (date-time) cronrequiredstring enabledrequiredboolean idrequiredinteger (int64) last_resultTaskResult last_run_atstring (date-time) namerequiredstring nextrequiredarray of string (date-time) The next three runs paramsrequiredTaskParams scoperequiredstring: global, service selectorTaskSelector service_idinteger (int64) timezonerequiredstring updated_atrequiredstring (date-time) 4xx/5xxerror envelope{"error":{"code","message","details"}}
PUT /api/v1/services/{id}/schedules/{task_id}
Change a service's scheduled task
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) | |
task_id required | path | integer (int64) |
Request body application/json
| Field | Type | Description |
|---|---|---|
action required | string: restart, stop, start, update, backup, rcon, script, notify | |
cron required | string | 5 fields (minute hour day month weekday) or @hourly, @daily, @weekly, @monthly (≤ 100 chars) |
enabled required | boolean | |
name required | string | (≤ 80 chars) |
params | TaskParams | |
selector | TaskSelector | Global tasks: the services they apply to (empty = all) |
timezone | string | IANA name, e.g. Europe/Stockholm (default UTC) (≤ 64 chars) |
Responses
200OK - TaskViewFields
Field Type Description actionrequiredstring created_atrequiredstring (date-time) cronrequiredstring enabledrequiredboolean idrequiredinteger (int64) last_resultTaskResult last_run_atstring (date-time) namerequiredstring nextrequiredarray of string (date-time) The next three runs paramsrequiredTaskParams scoperequiredstring: global, service selectorTaskSelector service_idinteger (int64) timezonerequiredstring updated_atrequiredstring (date-time) 4xx/5xxerror envelope{"error":{"code","message","details"}}
DELETE /api/v1/services/{id}/schedules/{task_id}
Remove a service's scheduled task
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) | |
task_id required | path | integer (int64) |
Responses
204No Content4xx/5xxerror envelope{"error":{"code","message","details"}}
Services
GET /api/v1/services
Services the caller may see, with live status
With external_id (billing keys): only the game server provisioned with that billing reference, or none.
| Parameter | In | Type | Description |
|---|---|---|---|
external_id | query | string | Billing: find a game server by its billing reference |
Responses
200OK - List-servicesResponseFields
Field Type Description itemsrequiredarray of View 4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/services
Create a service
Allocates a block of ports from the node's range, creates the service's OS user and directory on the node and, with start=true, starts it. With a package the game, slot range, limits and allowed datacenters come from it; without node_id the node is picked. Billing keys (ADR-0024) provision from a package for a customer (owner_user_id, or owner_email: found or created in the caller's tenancy) and are idempotent by external_id (a repeat answers 200 with existing=true).
Request body application/json
| Field | Type | Description |
|---|---|---|
cpu_limit_percent | integer (int32) | Without a package: 0 = unlimited; 100 = one core (min 0) |
crash_policy | CrashPolicy | |
datacenter_id | integer (int64) | Pick the node in this datacenter (min 0) |
disk_limit_bytes | integer (int64) | Without a package: 0 = unlimited (min 0) |
external_id | string | Billing reference (e.g. whmcs-123), unique in the caller's tenancy (≤ 100 chars) |
game_id | string | Required without a package (≤ 64 chars) |
memory_limit_bytes | integer (int64) | Without a package: 0 = unlimited (min 0) |
name required | string | (≤ 64 chars) |
node_id | integer (int64) | Callers who can see nodes; 0 = picked (online, the game's OS, memory left) (min 0) |
owner_display_name | string | (≤ 100 chars) |
owner_email | string | Billing: the customer by e-mail address (created when unknown) (≤ 254 chars) |
owner_password | string | Billing: password for a new customer (default: generated and returned once) (≤ 256 chars) |
owner_user_id | integer (int64) | Default: the caller (min 0) |
owner_username | string | Billing: username for a new customer (default: from the e-mail address) (≤ 32 chars) |
package_id | integer (int64) | (min 0) |
slots | integer (int32) | Default: the package's or the game's default (min 0) |
start | boolean | Start right away (after the install); default: the package's start_on_create, else no |
steam_account_id | integer (int64) | Administrators: the Steam account to install with (default: the vault's default) (min 0) |
variables | object |
Responses
201Created - CreateOutBodyFields
Field Type Description cpu_limit_percentrequiredinteger (int32) 0 = unlimited; 100 = one core cpu_percentrequirednumber (nullable) (float) crash_policyrequiredCrashPolicy created_atrequiredstring (date-time) desired_staterequiredstring: running, stopped disk_limit_bytesrequiredinteger (int64) File manager / SFTP / upload quota; 0 = unlimited existingrequiredboolean external_id was already provisioned: this is that game server (nothing was created) external_idrequiredstring (nullable) The billing system's reference file_denyrequiredarray of string Deny globs added for this service (on top of the game definition's): matching paths are hidden from everyone except administrators game_idrequiredstring has_rconboolean The game has a remote console (only on GET /services/{id}) has_workshopboolean The game takes Steam Workshop mods (only on GET /services/{id}) idrequiredinteger (int64) installInstallProgress While installing / updating install_dirrequiredstring installedrequiredboolean The game files are in place iprequiredstring last_errorrequiredstring The last command the agent refused, and why last_exit_coderequiredinteger (nullable) (int32) max_playersrequiredinteger (nullable) (int32) memory_limit_bytesrequiredinteger (int64) 0 = unlimited memory_used_bytesrequiredinteger (nullable) (int64) metrics_atrequiredstring (nullable) (date-time) modsrequiredobject Workshop items per modlist variable namerequiredstring node_connectedrequiredboolean The node's agent link is up node_idrequiredinteger (int64) node_namerequiredstring node_osrequiredstring: windows, linux observed_atrequiredstring (nullable) (date-time) observed_messagerequiredstring observed_statusrequiredstring What the agent last reported os_userrequiredstring owner_createdboolean owner_email named no account: a customer account was created owner_passwordstring The new customer account's generated password (only when none was given; shown once) owner_user_idrequiredinteger (int64) owner_usernamerequiredstring package_idrequiredinteger (nullable) (int64) The package it was ordered with (null = none) permissionsarray of string What the caller may do on this service (absent on WebSocket events) playersrequiredinteger (nullable) (int32) From the game's status query while it runs (null = unknown) portsarray of PortView Only on GET /services/{id} primary_portrequiredinteger (nullable) (int32) process_countrequiredinteger (nullable) (int32) processesarray of ProcessView Only on GET /services/{id} query_atrequiredstring (nullable) (date-time) query_maprequiredstring query_namerequiredstring Server name the game reports restartsrequiredinteger (int32) Crash restarts within the crash-policy window secret_variablesrequiredarray of string Password variables that have a value (values are never returned) sftpSFTPInfo How the caller connects with SFTP (only on GET /services/{id}, with the files permission) slotsrequiredinteger (int32) statusrequiredstring: installing, install_failed, stopped, starting, running, stopping, crashed, suspended, moving, deleting steam_account_idrequiredinteger (nullable) (int64) suspend_reasonrequiredstring Why it was suspended (billing or an administrator) suspendedrequiredboolean variablesrequiredobject 4xx/5xxerror envelope{"error":{"code","message","details"}}
GET /api/v1/services/{id}
A service with its ports, processes and the caller's permissions
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Responses
200OK - ViewFields
Field Type Description cpu_limit_percentrequiredinteger (int32) 0 = unlimited; 100 = one core cpu_percentrequirednumber (nullable) (float) crash_policyrequiredCrashPolicy created_atrequiredstring (date-time) desired_staterequiredstring: running, stopped disk_limit_bytesrequiredinteger (int64) File manager / SFTP / upload quota; 0 = unlimited external_idrequiredstring (nullable) The billing system's reference file_denyrequiredarray of string Deny globs added for this service (on top of the game definition's): matching paths are hidden from everyone except administrators game_idrequiredstring has_rconboolean The game has a remote console (only on GET /services/{id}) has_workshopboolean The game takes Steam Workshop mods (only on GET /services/{id}) idrequiredinteger (int64) installInstallProgress While installing / updating install_dirrequiredstring installedrequiredboolean The game files are in place iprequiredstring last_errorrequiredstring The last command the agent refused, and why last_exit_coderequiredinteger (nullable) (int32) max_playersrequiredinteger (nullable) (int32) memory_limit_bytesrequiredinteger (int64) 0 = unlimited memory_used_bytesrequiredinteger (nullable) (int64) metrics_atrequiredstring (nullable) (date-time) modsrequiredobject Workshop items per modlist variable namerequiredstring node_connectedrequiredboolean The node's agent link is up node_idrequiredinteger (int64) node_namerequiredstring node_osrequiredstring: windows, linux observed_atrequiredstring (nullable) (date-time) observed_messagerequiredstring observed_statusrequiredstring What the agent last reported os_userrequiredstring owner_user_idrequiredinteger (int64) owner_usernamerequiredstring package_idrequiredinteger (nullable) (int64) The package it was ordered with (null = none) permissionsarray of string What the caller may do on this service (absent on WebSocket events) playersrequiredinteger (nullable) (int32) From the game's status query while it runs (null = unknown) portsarray of PortView Only on GET /services/{id} primary_portrequiredinteger (nullable) (int32) process_countrequiredinteger (nullable) (int32) processesarray of ProcessView Only on GET /services/{id} query_atrequiredstring (nullable) (date-time) query_maprequiredstring query_namerequiredstring Server name the game reports restartsrequiredinteger (int32) Crash restarts within the crash-policy window secret_variablesrequiredarray of string Password variables that have a value (values are never returned) sftpSFTPInfo How the caller connects with SFTP (only on GET /services/{id}, with the files permission) slotsrequiredinteger (int32) statusrequiredstring: installing, install_failed, stopped, starting, running, stopping, crashed, suspended, moving, deleting steam_account_idrequiredinteger (nullable) (int64) suspend_reasonrequiredstring Why it was suspended (billing or an administrator) suspendedrequiredboolean variablesrequiredobject 4xx/5xxerror envelope{"error":{"code","message","details"}}
PATCH /api/v1/services/{id}
Change a service's name, slots, variables or mods
Variables are merged into the current values; password variables are write-only (an empty value clears one). When mods changed, mods_changed is true: run the update action to download them.
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Request body application/json
| Field | Type | Description |
|---|---|---|
disk_limit_bytes | integer (int64) | Administrators: file manager / SFTP / upload quota; 0 = unlimited (min 0) |
file_deny | array of string | Administrators: deny globs for this service's file manager and SFTP (on top of the game's) |
name | string | (≤ 64 chars) |
slots | integer (int32) | (min 0) |
steam_account_id | integer (int64) | Administrators; 0 = the vault's default (min 0) |
variables | object |
Responses
200OK - UpdateOutBodyFields
Field Type Description cpu_limit_percentrequiredinteger (int32) 0 = unlimited; 100 = one core cpu_percentrequirednumber (nullable) (float) crash_policyrequiredCrashPolicy created_atrequiredstring (date-time) desired_staterequiredstring: running, stopped disk_limit_bytesrequiredinteger (int64) File manager / SFTP / upload quota; 0 = unlimited external_idrequiredstring (nullable) The billing system's reference file_denyrequiredarray of string Deny globs added for this service (on top of the game definition's): matching paths are hidden from everyone except administrators game_idrequiredstring has_rconboolean The game has a remote console (only on GET /services/{id}) has_workshopboolean The game takes Steam Workshop mods (only on GET /services/{id}) idrequiredinteger (int64) installInstallProgress While installing / updating install_dirrequiredstring installedrequiredboolean The game files are in place iprequiredstring last_errorrequiredstring The last command the agent refused, and why last_exit_coderequiredinteger (nullable) (int32) max_playersrequiredinteger (nullable) (int32) memory_limit_bytesrequiredinteger (int64) 0 = unlimited memory_used_bytesrequiredinteger (nullable) (int64) metrics_atrequiredstring (nullable) (date-time) modsrequiredobject Workshop items per modlist variable mods_changedrequiredboolean Run the update action to download the new mods namerequiredstring node_connectedrequiredboolean The node's agent link is up node_idrequiredinteger (int64) node_namerequiredstring node_osrequiredstring: windows, linux observed_atrequiredstring (nullable) (date-time) observed_messagerequiredstring observed_statusrequiredstring What the agent last reported os_userrequiredstring owner_user_idrequiredinteger (int64) owner_usernamerequiredstring package_idrequiredinteger (nullable) (int64) The package it was ordered with (null = none) permissionsarray of string What the caller may do on this service (absent on WebSocket events) playersrequiredinteger (nullable) (int32) From the game's status query while it runs (null = unknown) portsarray of PortView Only on GET /services/{id} primary_portrequiredinteger (nullable) (int32) process_countrequiredinteger (nullable) (int32) processesarray of ProcessView Only on GET /services/{id} query_atrequiredstring (nullable) (date-time) query_maprequiredstring query_namerequiredstring Server name the game reports restartsrequiredinteger (int32) Crash restarts within the crash-policy window secret_variablesrequiredarray of string Password variables that have a value (values are never returned) sftpSFTPInfo How the caller connects with SFTP (only on GET /services/{id}, with the files permission) slotsrequiredinteger (int32) statusrequiredstring: installing, install_failed, stopped, starting, running, stopping, crashed, suspended, moving, deleting steam_account_idrequiredinteger (nullable) (int64) suspend_reasonrequiredstring Why it was suspended (billing or an administrator) suspendedrequiredboolean variablesrequiredobject 4xx/5xxerror envelope{"error":{"code","message","details"}}
DELETE /api/v1/services/{id}
Delete a service with its files and OS user
The service shows status deleting until its node confirms; a node that is offline is cleaned up when it reconnects.
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Responses
202Accepted4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/services/{id}/console
Send a line to the service's console (stdin of the main process)
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Request body application/json
| Field | Type | Description |
|---|---|---|
line required | string | (≤ 1024 chars) |
Responses
204No Content4xx/5xxerror envelope{"error":{"code","message","details"}}
GET /api/v1/services/{id}/metrics
The service's CPU and memory samples (at most the last 24 hours)
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) | |
since | query | string (date-time) | Default: one hour ago |
Responses
200OK - Get-service-metricsResponseFields
Field Type Description itemsrequiredarray of ServiceMetricSample 4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/services/{id}/rcon
Run a remote-console (RCON) command
The node sends the command to the game on 127.0.0.1 (Source, BattlEye, Minecraft or TeamSpeak ServerQuery) and returns the answer. Audited.
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Request body application/json
| Field | Type | Description |
|---|---|---|
command required | string | (≤ 512 chars) |
Responses
200OK - RconReplyFields
Field Type Description atrequiredstring (date-time) outputrequiredstring 4xx/5xxerror envelope{"error":{"code","message","details"}}
GET /api/v1/services/{id}/subusers
Accounts that have access to this game server (sub-users)
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Responses
200OK - GrantsOutBodyFields
Field Type Description itemsrequiredarray of Grant 4xx/5xxerror envelope{"error":{"code","message","details"}}
PUT /api/v1/services/{id}/subusers
Give an account (by e-mail address) access to this game server, or change its access
view is always included. Nobody grants a permission they do not hold on this server. An unknown address creates a sub-user account in the owner's tenancy and returns its one-time password.
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Request body application/json
| Field | Type | Description |
|---|---|---|
email required | string | (≤ 254 chars) |
permissions required | array of string | view, control, console, files, config, mods, schedule, backups, settings, subusers, reinstall |
Responses
200OK - GrantResultFields
Field Type Description account_createdrequiredboolean No account had this e-mail address: a sub-user account was created created_atrequiredstring (date-time) display_namerequiredstring emailrequiredstring one_time_passwordstring The new account's password (shown once; it must be changed at the first sign-in) permissionsrequiredarray of string rolerequiredstring statusrequiredstring updated_atrequiredstring (date-time) user_idrequiredinteger (int64) usernamerequiredstring 4xx/5xxerror envelope{"error":{"code","message","details"}}
DELETE /api/v1/services/{id}/subusers/{user_id}
Take a sub-user's access to this game server away (the account stays)
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) | |
user_id required | path | integer (int64) |
Responses
204No Content4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/services/{id}/{action}
Start, stop, restart, kill, update, reinstall, cancel an install, suspend or unsuspend a service
Returns at once with the transitional status (starting, stopping, installing, ...); the agent's report follows on the WebSocket topic service:{id}. update downloads new game files and mods (a running service is stopped and started again); reinstall removes everything except the game's preserve_on_reinstall files. Suspend (with an optional reason), unsuspend and reinstall are also open to billing keys; suspend stops the server gracefully and blocks start, console, files and SFTP, keeping everything (ADR-0024).
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) | |
action required | path | string: start, stop, restart, kill, update, reinstall, cancel_install, suspend, unsuspend |
Request body application/json
| Field | Type | Description |
|---|---|---|
reason | string | suspend: why (e.g. Overdue on Payment); shown to the customer (≤ 200 chars) |
Responses
200OK - ViewFields
Field Type Description cpu_limit_percentrequiredinteger (int32) 0 = unlimited; 100 = one core cpu_percentrequirednumber (nullable) (float) crash_policyrequiredCrashPolicy created_atrequiredstring (date-time) desired_staterequiredstring: running, stopped disk_limit_bytesrequiredinteger (int64) File manager / SFTP / upload quota; 0 = unlimited external_idrequiredstring (nullable) The billing system's reference file_denyrequiredarray of string Deny globs added for this service (on top of the game definition's): matching paths are hidden from everyone except administrators game_idrequiredstring has_rconboolean The game has a remote console (only on GET /services/{id}) has_workshopboolean The game takes Steam Workshop mods (only on GET /services/{id}) idrequiredinteger (int64) installInstallProgress While installing / updating install_dirrequiredstring installedrequiredboolean The game files are in place iprequiredstring last_errorrequiredstring The last command the agent refused, and why last_exit_coderequiredinteger (nullable) (int32) max_playersrequiredinteger (nullable) (int32) memory_limit_bytesrequiredinteger (int64) 0 = unlimited memory_used_bytesrequiredinteger (nullable) (int64) metrics_atrequiredstring (nullable) (date-time) modsrequiredobject Workshop items per modlist variable namerequiredstring node_connectedrequiredboolean The node's agent link is up node_idrequiredinteger (int64) node_namerequiredstring node_osrequiredstring: windows, linux observed_atrequiredstring (nullable) (date-time) observed_messagerequiredstring observed_statusrequiredstring What the agent last reported os_userrequiredstring owner_user_idrequiredinteger (int64) owner_usernamerequiredstring package_idrequiredinteger (nullable) (int64) The package it was ordered with (null = none) permissionsarray of string What the caller may do on this service (absent on WebSocket events) playersrequiredinteger (nullable) (int32) From the game's status query while it runs (null = unknown) portsarray of PortView Only on GET /services/{id} primary_portrequiredinteger (nullable) (int32) process_countrequiredinteger (nullable) (int32) processesarray of ProcessView Only on GET /services/{id} query_atrequiredstring (nullable) (date-time) query_maprequiredstring query_namerequiredstring Server name the game reports restartsrequiredinteger (int32) Crash restarts within the crash-policy window secret_variablesrequiredarray of string Password variables that have a value (values are never returned) sftpSFTPInfo How the caller connects with SFTP (only on GET /services/{id}, with the files permission) slotsrequiredinteger (int32) statusrequiredstring: installing, install_failed, stopped, starting, running, stopping, crashed, suspended, moving, deleting steam_account_idrequiredinteger (nullable) (int64) suspend_reasonrequiredstring Why it was suspended (billing or an administrator) suspendedrequiredboolean variablesrequiredobject 4xx/5xxerror envelope{"error":{"code","message","details"}}
Settings
GET /api/v1/settings
Read panel settings
Responses
200OK - SettingsFields
Field Type Description brandingrequiredBranding securityrequiredSecurity 4xx/5xxerror envelope{"error":{"code","message","details"}}
PUT /api/v1/settings
Replace panel settings (SuperAdmin)
Request body application/json
| Field | Type | Description |
|---|---|---|
branding required | Branding | |
security required | Security |
Responses
200OK - SettingsFields
Field Type Description brandingrequiredBranding securityrequiredSecurity 4xx/5xxerror envelope{"error":{"code","message","details"}}
Setup
GET /api/v1/setup
Whether the first-run setup is open (and, with the token or from the server itself, its options)
No authentication needed.
Responses
200OK - SetupStatusFields
Field Type Description activerequiredboolean The controller waits for its first-run setup allowedrequiredboolean This request may run the setup (a right token, or a local request) builtin_databaseBuiltinDB local_agentboolean The NGCP agent is installed on this server (the setup can make it a game node) osstring suggested_public_urlstring The address this page was opened with versionstring 4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/setup
Finish the setup: database, first administrator, address, TLS
database_mode builtin creates the bundled database (Windows) or uses the package-prepared local one (Linux); external uses database_url. The controller switches to normal operation right after answering; sign in at login_url.
No authentication needed.
Request body application/json
| Field | Type | Description |
|---|---|---|
admin_email required | string | (≤ 254 chars) |
admin_password required | string | (≤ 1024 chars) |
admin_username required | string | (≤ 64 chars) |
database_mode required | string: builtin, external | |
database_url | string | (≤ 2000 chars) |
grpc_advertise | string | host:port agents dial (default: the public URL's host, port 8443) (≤ 255 chars) |
local_node | boolean | Also run game servers on this server: the NGCP agent installed here joins the panel by itself |
local_node_name | string | The game node's name (default: this computer's name) (≤ 64 chars) |
public_url required | string | How browsers and agents reach the panel (≤ 255 chars) |
tls_cert_file | string | (≤ 1024 chars) |
tls_key_file | string | (≤ 1024 chars) |
tls_mode required | string: none, files, self-signed | none: plain HTTP, or TLS ends at a reverse proxy |
token | string | (≤ 100 chars) |
Responses
200OK - ResultFields
Field Type Description existing_adminsrequiredboolean The database already had accounts; no new administrator was created local_nodestring Name of the game node this server joins as (the local agent enrolls within seconds) login_urlrequiredstring 4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/setup/check
Check the setup token and get the setup's options
No authentication needed.
Request body application/json
| Field | Type | Description |
|---|---|---|
token | string | Not needed from the server itself (localhost) (≤ 100 chars) |
Responses
200OK - SetupStatusFields
Field Type Description activerequiredboolean The controller waits for its first-run setup allowedrequiredboolean This request may run the setup (a right token, or a local request) builtin_databaseBuiltinDB local_agentboolean The NGCP agent is installed on this server (the setup can make it a game node) osstring suggested_public_urlstring The address this page was opened with versionstring 4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/setup/test-database
Try to connect to an existing PostgreSQL
No authentication needed.
Request body application/json
| Field | Type | Description |
|---|---|---|
token | string | (≤ 100 chars) |
url required | string | postgres://user:password@host:5432/dbname?sslmode=... (≤ 2000 chars) |
Responses
204No Content4xx/5xxerror envelope{"error":{"code","message","details"}}
Steam accounts
GET /api/v1/steam-accounts
Steam accounts SteamCMD logs in with (passwords are never returned)
Responses
200OK - List-steam-accountsResponseFields
Field Type Description itemsrequiredarray of SteamAccount 4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/steam-accounts
Add a Steam account
Bohemia and Valve recommend a separate account for servers. The first install with it may ask for a Steam Guard code: type the code into the service's console.
Request body application/json
| Field | Type | Description |
|---|---|---|
is_default | boolean | |
label required | string | (≤ 64 chars) |
password | string | Write-only; leave empty to keep the stored one (≤ 128 chars) |
username required | string | (≤ 64 chars) |
Responses
201Created - SteamAccountFields
Field Type Description created_atrequiredstring (date-time) idrequiredinteger (int64) is_defaultrequiredboolean labelrequiredstring service_countrequiredinteger (int64) updated_atrequiredstring (date-time) usernamerequiredstring 4xx/5xxerror envelope{"error":{"code","message","details"}}
PUT /api/v1/steam-accounts/{id}
Change a Steam account
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Request body application/json
| Field | Type | Description |
|---|---|---|
is_default | boolean | |
label required | string | (≤ 64 chars) |
password | string | Write-only; leave empty to keep the stored one (≤ 128 chars) |
username required | string | (≤ 64 chars) |
Responses
200OK - SteamAccountFields
Field Type Description created_atrequiredstring (date-time) idrequiredinteger (int64) is_defaultrequiredboolean labelrequiredstring service_countrequiredinteger (int64) updated_atrequiredstring (date-time) usernamerequiredstring 4xx/5xxerror envelope{"error":{"code","message","details"}}
DELETE /api/v1/steam-accounts/{id}
Remove a Steam account (its services use the default account)
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Responses
204No Content4xx/5xxerror envelope{"error":{"code","message","details"}}
Users
GET /api/v1/users
List users
| Parameter | In | Type | Description |
|---|---|---|---|
cursor | query | string | |
limit | query | integer (int32) | |
search | query | string | Matches username, email or display name |
role | query | string: superadmin, admin, reseller, user, subuser |
Responses
200OK - PageUserFields
Field Type Description itemsrequiredarray of User next_cursorrequiredstring Pass as ?cursor= to get the next page; empty when there are no more 4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/users
Create a user
Request body application/json
| Field | Type | Description |
|---|---|---|
denied_permissions | array of string | |
display_name | string | (≤ 100 chars) |
email required | string | (≤ 254 chars) |
extra_permissions | array of string | |
must_change_password | boolean | |
password required | string | (≤ 1024 chars) |
reseller_id | integer (int64) | Admins only; resellers' new users always belong to them |
role required | string: superadmin, admin, reseller, user, subuser | |
status | string: active, suspended, disabled | |
username required | string | 3-32 characters: lower-case letters, digits, '-' and '_' (not first). Upper case is lower-cased. (≤ 32 chars) |
Responses
201Created - UserFields
Field Type Description created_atrequiredstring (date-time) denied_permissionsrequiredarray of string display_namerequiredstring emailrequiredstring extra_permissionsrequiredarray of string idrequiredinteger (int64) last_login_atrequiredstring (nullable) (date-time) last_login_iprequiredstring (nullable) locked_untilrequiredstring (nullable) (date-time) must_change_passwordrequiredboolean reseller_idrequiredinteger (nullable) (int64) rolerequiredstring: superadmin, admin, reseller, user, subuser statusrequiredstring: active, suspended, disabled totp_enabledrequiredboolean updated_atrequiredstring (date-time) usernamerequiredstring 4xx/5xxerror envelope{"error":{"code","message","details"}}
GET /api/v1/users/{id}
Get a user
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Responses
200OK - UserFields
Field Type Description created_atrequiredstring (date-time) denied_permissionsrequiredarray of string display_namerequiredstring emailrequiredstring extra_permissionsrequiredarray of string idrequiredinteger (int64) last_login_atrequiredstring (nullable) (date-time) last_login_iprequiredstring (nullable) locked_untilrequiredstring (nullable) (date-time) must_change_passwordrequiredboolean reseller_idrequiredinteger (nullable) (int64) rolerequiredstring: superadmin, admin, reseller, user, subuser statusrequiredstring: active, suspended, disabled totp_enabledrequiredboolean updated_atrequiredstring (date-time) usernamerequiredstring 4xx/5xxerror envelope{"error":{"code","message","details"}}
PATCH /api/v1/users/{id}
Update a user
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Request body application/json
| Field | Type | Description |
|---|---|---|
denied_permissions | array of string | |
display_name | string | (≤ 100 chars) |
email | string | (≤ 254 chars) |
extra_permissions | array of string | |
role | string: superadmin, admin, reseller, user, subuser | |
status | string: active, suspended, disabled | |
username | string | (≤ 32 chars) |
Responses
200OK - UserFields
Field Type Description created_atrequiredstring (date-time) denied_permissionsrequiredarray of string display_namerequiredstring emailrequiredstring extra_permissionsrequiredarray of string idrequiredinteger (int64) last_login_atrequiredstring (nullable) (date-time) last_login_iprequiredstring (nullable) locked_untilrequiredstring (nullable) (date-time) must_change_passwordrequiredboolean reseller_idrequiredinteger (nullable) (int64) rolerequiredstring: superadmin, admin, reseller, user, subuser statusrequiredstring: active, suspended, disabled totp_enabledrequiredboolean updated_atrequiredstring (date-time) usernamerequiredstring 4xx/5xxerror envelope{"error":{"code","message","details"}}
DELETE /api/v1/users/{id}
Delete a user (ends their sessions and API keys)
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Responses
204No Content4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/users/{id}/password
Set a user's password (ends their sessions)
Billing API keys may set the password of the customer accounts (user, sub-user) in their tenancy.
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Request body application/json
| Field | Type | Description |
|---|---|---|
must_change_password | boolean | Force a change at next sign-in |
password required | string | (≤ 1024 chars) |
Responses
204No Content4xx/5xxerror envelope{"error":{"code","message","details"}}
DELETE /api/v1/users/{id}/totp
Turn off a user's two-factor authentication (lost device)
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Responses
204No Content4xx/5xxerror envelope{"error":{"code","message","details"}}
POST /api/v1/users/{id}/unlock
Clear a sign-in lockout
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer (int64) |
Responses
204No Content4xx/5xxerror envelope{"error":{"code","message","details"}}