NGCP Game server control panel
Documentation
Contents

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

  • 200 OK - APIKeysOutputBody
    Fields
    FieldTypeDescription
    items requiredarray of APIKey
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

POST /api/v1/api-keys

Create an API key

Request body application/json

FieldTypeDescription
expires_atstring (date-time)
name requiredstring(≤ 64 chars)
scopesarray of stringLimit the key to these permissions; omit for all of yours

Responses

  • 201 Created - CreateAPIKeyOutputBody
    Fields
    FieldTypeDescription
    api_key requiredAPIKey
    token requiredstringThe key itself. Shown only now; store it safely.
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

DELETE /api/v1/api-keys/{id}

Revoke one of my API keys

ParameterInTypeDescription
id requiredpathinteger (int64)

Responses

  • 204 No Content
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

Account

GET /api/v1/auth/me/ssh-keys

Your SSH keys for SFTP

Responses

  • 200 OK - List-ssh-keysResponse
    Fields
    FieldTypeDescription
    items requiredarray of SSHKeyOut
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

POST /api/v1/auth/me/ssh-keys

Add an SSH public key for SFTP

Request body application/json

FieldTypeDescription
namestring(≤ 100 chars)
public_key requiredstringOne line in OpenSSH format, e.g. ssh-ed25519 AAAA... me@pc (≤ 16384 chars)

Responses

  • 201 Created - SSHKeyOut
    Fields
    FieldTypeDescription
    created_at requiredstring (date-time)
    fingerprint requiredstring
    id requiredinteger (int64)
    last_used_at requiredstring (nullable) (date-time)
    name requiredstring
    public_key requiredstring
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

DELETE /api/v1/auth/me/ssh-keys/{id}

Remove an SSH key

ParameterInTypeDescription
id requiredpathinteger (int64)

Responses

  • 204 No Content
  • 4xx/5xx error 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

  • 200 OK - CAInfo
    Fields
    FieldTypeDescription
    ca_hash requiredstringsha256:<hex> of the CA's SubjectPublicKeyInfo
    ca_pem requiredstring
  • 4xx/5xx error 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

FieldTypeDescription
csr_pem requiredstringPEM certificate request for the agent's new key (≤ 8192 chars)
inventory requiredInventory
token requiredstringOne-time enrollment token (ngcpe_...) (≤ 200 chars)

Responses

  • 200 OK - Response
    Fields
    FieldTypeDescription
    ca_pem requiredstringVerify its SubjectPublicKeyInfo hash against the --ca-hash from the token
    certificate_pem requiredstring
    grpc_address requiredstringhost:port of the AgentLink endpoint
    node_id requiredinteger (int64)
    node_name requiredstring
    update_public_key requiredstringEd25519 key (hex) that signs agent updates
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

GET /api/v1/agent/releases

Agent builds available for self-update

Responses

  • 200 OK - List-agent-releasesResponse
    Fields
    FieldTypeDescription
    items requiredarray of AgentRelease
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

Audit

GET /api/v1/audit-events

Search the audit log

ParameterInTypeDescription
cursorquerystring
limitqueryinteger (int32)
actionquerystringExact action or a prefix such as 'user' (matches user.*)
target_typequerystring
target_idquerystring
actor_user_idqueryinteger (int64)
outcomequerystring: success, failure, denied
sincequerystring (date-time)RFC 3339
untilquerystring (date-time)RFC 3339

Responses

  • 200 OK - PageAuditEvent
    Fields
    FieldTypeDescription
    items requiredarray of AuditEvent
    next_cursor requiredstringPass as ?cursor= to get the next page; empty when there are no more
  • 4xx/5xx error 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

FieldTypeDescription
login requiredstringUsername or email address (≤ 254 chars)
password requiredstring(≤ 1024 chars)

Responses

  • 200 OK - LoginBody
    Fields
    FieldTypeDescription
    csrf_tokenstringSend as X-CSRF-Token on every state-changing request
    mfa_tokenstringSend with the code to POST /auth/login/mfa (valid 5 minutes)
    status requiredstring: ok, mfa_required
    userUser
  • 4xx/5xx error 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

FieldTypeDescription
codestring6-digit code from the authenticator app (≤ 10 chars)
mfa_token requiredstring(≤ 200 chars)
recovery_codestringOne of the recovery codes, instead of a code (≤ 32 chars)

Responses

  • 200 OK - LoginBody
    Fields
    FieldTypeDescription
    csrf_tokenstringSend as X-CSRF-Token on every state-changing request
    mfa_tokenstringSend with the code to POST /auth/login/mfa (valid 5 minutes)
    status requiredstring: ok, mfa_required
    userUser
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

POST /api/v1/auth/logout

Sign out of this session

Responses

  • 204 No Content
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

POST /api/v1/auth/logout-all

Sign out of every session, including this one

Responses

  • 200 OK - LogoutAllOutputBody
    Fields
    FieldTypeDescription
    sessions_ended requiredinteger (int64)
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

GET /api/v1/auth/me

Who am I

Responses

  • 200 OK - MeBody
    Fields
    FieldTypeDescription
    auth_method requiredstring: session, api_key
    branding requiredMeBrandingWhat this account sees: the panel's branding, overridden by its reseller's
    client_ip requiredstringThe address this request came from, as the controller sees it
    csrf_tokenstring
    mfa_enrollment_required requiredbooleanPolicy requires turning on 2FA before anything else
    password_min_length requiredinteger (int64)Current password policy, for form hints
    permissions requiredarray of stringEffective global permissions
    recovery_codes_left requiredinteger (int64)
    user requiredUser
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

PATCH /api/v1/auth/me

Change my display name or email address

Request body application/json

FieldTypeDescription
current_passwordstringRequired when changing the email address (≤ 1024 chars)
display_namestring(≤ 100 chars)
emailstring(≤ 254 chars)

Responses

  • 200 OK - User
    Fields
    FieldTypeDescription
    created_at requiredstring (date-time)
    denied_permissions requiredarray of string
    display_name requiredstring
    email requiredstring
    extra_permissions requiredarray of string
    id requiredinteger (int64)
    last_login_at requiredstring (nullable) (date-time)
    last_login_ip requiredstring (nullable)
    locked_until requiredstring (nullable) (date-time)
    must_change_password requiredboolean
    reseller_id requiredinteger (nullable) (int64)
    role requiredstring: superadmin, admin, reseller, user, subuser
    status requiredstring: active, suspended, disabled
    totp_enabled requiredboolean
    updated_at requiredstring (date-time)
    username requiredstring
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

POST /api/v1/auth/password

Change my password (ends my other sessions)

Request body application/json

FieldTypeDescription
current_password requiredstring(≤ 1024 chars)
new_password requiredstring(≤ 1024 chars)

Responses

  • 204 No Content
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

POST /api/v1/auth/recovery-codes

Replace my recovery codes

Request body application/json

FieldTypeDescription
password requiredstring(≤ 1024 chars)

Responses

  • 200 OK - RecoveryCodesOutputBody
    Fields
    FieldTypeDescription
    recovery_codes requiredarray of string
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

GET /api/v1/auth/sessions

List my active sessions

Responses

  • 200 OK - SessionsOutputBody
    Fields
    FieldTypeDescription
    items requiredarray of Session
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

DELETE /api/v1/auth/sessions/{id}

End one of my sessions

ParameterInTypeDescription
id requiredpathinteger (int64)

Responses

  • 204 No Content
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

POST /api/v1/auth/totp/disable

Turn off two-factor authentication

Request body application/json

FieldTypeDescription
code requiredstring(≤ 10 chars)
password requiredstring(≤ 1024 chars)

Responses

  • 204 No Content
  • 4xx/5xx error 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

FieldTypeDescription
code requiredstring(≤ 10 chars)

Responses

  • 200 OK - RecoveryCodesOutputBody
    Fields
    FieldTypeDescription
    recovery_codes requiredarray of string
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

POST /api/v1/auth/totp/setup

Start turning on two-factor authentication

Request body application/json

FieldTypeDescription
password requiredstring(≤ 1024 chars)

Responses

  • 200 OK - TOTPSetupOutputBody
    Fields
    FieldTypeDescription
    otpauth_uri requiredstringRender as a QR code
    secret requiredstring
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

GET /api/v1/public/branding

Branding for the sign-in page

No authentication needed.

Responses

  • 200 OK - BrandingOutputBody
    Fields
    FieldTypeDescription
    password_min_length requiredinteger (int64)Password policy, for form hints
    product_name requiredstring
    support_url requiredstring
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

Backups

GET /api/v1/backup-targets

Backup targets (local folder, SFTP, S3-compatible)

Responses

  • 200 OK - ItemsTargetViewBody
    Fields
    FieldTypeDescription
    items requiredarray of TargetView
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

POST /api/v1/backup-targets

Add a backup target

Request body application/json

FieldTypeDescription
config requiredTargetConfig
keep_days requiredinteger (int32)Delete backups older than this (0 = never) (min 0, max 3650)
keep_last requiredinteger (int32)Keep at most this many backups per service (0 = all) (min 0, max 1000)
kindstring: local, sftp, s3Fixed after creation
name requiredstring(≤ 80 chars)
passwordstringsftp
private_keystringsftp: unencrypted OpenSSH / PEM key
secret_keystrings3
user_selectable requiredbooleanService owners may back up here

Responses

  • 201 Created - TargetView
    Fields
    FieldTypeDescription
    config requiredTargetConfig
    created_at requiredstring (date-time)
    has_password requiredboolean
    has_private_key requiredboolean
    has_secret_key requiredboolean
    id requiredinteger (int64)
    keep_days requiredinteger (int32)
    keep_last requiredinteger (int32)
    kind requiredstring: local, sftp, s3
    name requiredstring
    updated_at requiredstring (date-time)
    user_selectable requiredboolean
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

PUT /api/v1/backup-targets/{id}

Change a backup target (its kind stays)

ParameterInTypeDescription
id requiredpathinteger (int64)

Request body application/json

FieldTypeDescription
config requiredTargetConfig
keep_days requiredinteger (int32)Delete backups older than this (0 = never) (min 0, max 3650)
keep_last requiredinteger (int32)Keep at most this many backups per service (0 = all) (min 0, max 1000)
kindstring: local, sftp, s3Fixed after creation
name requiredstring(≤ 80 chars)
passwordstringsftp
private_keystringsftp: unencrypted OpenSSH / PEM key
secret_keystrings3
user_selectable requiredbooleanService owners may back up here

Responses

  • 200 OK - TargetView
    Fields
    FieldTypeDescription
    config requiredTargetConfig
    created_at requiredstring (date-time)
    has_password requiredboolean
    has_private_key requiredboolean
    has_secret_key requiredboolean
    id requiredinteger (int64)
    keep_days requiredinteger (int32)
    keep_last requiredinteger (int32)
    kind requiredstring: local, sftp, s3
    name requiredstring
    updated_at requiredstring (date-time)
    user_selectable requiredboolean
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

DELETE /api/v1/backup-targets/{id}

Remove a backup target no task uses (its backups stay where they are)

ParameterInTypeDescription
id requiredpathinteger (int64)

Responses

  • 204 No Content
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

GET /api/v1/services/{id}/backups

A service's backups

ParameterInTypeDescription
id requiredpathinteger (int64)

Responses

  • 200 OK - SvcBackupsBody
    Fields
    FieldTypeDescription
    items requiredarray of BackupView
    targets requiredarray of TargetChoiceWhere the caller may back this service up to
  • 4xx/5xx error 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}.

ParameterInTypeDescription
id requiredpathinteger (int64)

Request body application/json

FieldTypeDescription
target_id requiredinteger (int64)(min 1)

Responses

  • 202 Accepted - BackupView
    Fields
    FieldTypeDescription
    completed_atstring (date-time)
    created_at requiredstring (date-time)
    error requiredstring
    id requiredinteger (int64)
    location requiredstring
    message requiredstring
    provider requiredstring
    restore_error requiredstring
    restore_status requiredstring: , running, completed, failed
    restored_atstring (date-time)
    scheduled requiredboolean
    size_bytes requiredinteger (int64)
    status requiredstring: pending, running, completed, failed, deleted
    target requiredstring
    target_idinteger (int64)
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

DELETE /api/v1/services/{id}/backups/{backup_id}

Delete a backup from its target

ParameterInTypeDescription
id requiredpathinteger (int64)
backup_id requiredpathinteger (int64)

Responses

  • 202 Accepted
  • 4xx/5xx error 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.

ParameterInTypeDescription
id requiredpathinteger (int64)
backup_id requiredpathinteger (int64)

Responses

  • 202 Accepted
  • 4xx/5xx error 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.

ParameterInTypeDescription
id requiredpathinteger (int64)

Request body application/json

FieldTypeDescription
package_id requiredinteger (int64)(min 1)
slotsinteger (int32)0 = keep the current slots, clamped into the package's range (min 0)

Responses

  • 200 OK - View
    Fields
    FieldTypeDescription
    cpu_limit_percent requiredinteger (int32)0 = unlimited; 100 = one core
    cpu_percent requirednumber (nullable) (float)
    crash_policy requiredCrashPolicy
    created_at requiredstring (date-time)
    desired_state requiredstring: running, stopped
    disk_limit_bytes requiredinteger (int64)File manager / SFTP / upload quota; 0 = unlimited
    external_id requiredstring (nullable)The billing system's reference
    file_deny requiredarray of stringDeny globs added for this service (on top of the game definition's): matching paths are hidden from everyone except administrators
    game_id requiredstring
    has_rconbooleanThe game has a remote console (only on GET /services/{id})
    has_workshopbooleanThe game takes Steam Workshop mods (only on GET /services/{id})
    id requiredinteger (int64)
    installInstallProgressWhile installing / updating
    install_dir requiredstring
    installed requiredbooleanThe game files are in place
    ip requiredstring
    last_error requiredstringThe last command the agent refused, and why
    last_exit_code requiredinteger (nullable) (int32)
    max_players requiredinteger (nullable) (int32)
    memory_limit_bytes requiredinteger (int64)0 = unlimited
    memory_used_bytes requiredinteger (nullable) (int64)
    metrics_at requiredstring (nullable) (date-time)
    mods requiredobjectWorkshop items per modlist variable
    name requiredstring
    node_connected requiredbooleanThe node's agent link is up
    node_id requiredinteger (int64)
    node_name requiredstring
    node_os requiredstring: windows, linux
    observed_at requiredstring (nullable) (date-time)
    observed_message requiredstring
    observed_status requiredstringWhat the agent last reported
    os_user requiredstring
    owner_user_id requiredinteger (int64)
    owner_username requiredstring
    package_id requiredinteger (nullable) (int64)The package it was ordered with (null = none)
    permissionsarray of stringWhat the caller may do on this service (absent on WebSocket events)
    players requiredinteger (nullable) (int32)From the game's status query while it runs (null = unknown)
    portsarray of PortViewOnly on GET /services/{id}
    primary_port requiredinteger (nullable) (int32)
    process_count requiredinteger (nullable) (int32)
    processesarray of ProcessViewOnly on GET /services/{id}
    query_at requiredstring (nullable) (date-time)
    query_map requiredstring
    query_name requiredstringServer name the game reports
    restarts requiredinteger (int32)Crash restarts within the crash-policy window
    secret_variables requiredarray of stringPassword variables that have a value (values are never returned)
    sftpSFTPInfoHow the caller connects with SFTP (only on GET /services/{id}, with the files permission)
    slots requiredinteger (int32)
    status requiredstring: installing, install_failed, stopped, starting, running, stopping, crashed, suspended, moving, deleting
    steam_account_id requiredinteger (nullable) (int64)
    suspend_reason requiredstringWhy it was suspended (billing or an administrator)
    suspended requiredboolean
    variables requiredobject
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

GET /api/v1/services/{id}/usage

Disk, CPU, memory and player usage of a game server (billing usage updates)

ParameterInTypeDescription
id requiredpathinteger (int64)
sincequerystring (date-time)Start of the period (RFC 3339); default 30 days ago, at most 90

Responses

  • 200 OK - UsageReport
    Fields
    FieldTypeDescription
    cpu_avg_percent requirednumber (double)100 = one core
    cpu_max_percent requirednumber (double)
    disk_limit_bytes requiredinteger (int64)0 = unlimited
    disk_measured_at requiredstring (nullable) (date-time)When the disk usage was measured (older when the node is offline)
    disk_used_bytes requiredinteger (nullable) (int64)The service directory's size; null when never measured
    mem_avg_bytes requiredinteger (int64)
    mem_limit_bytes requiredinteger (int64)0 = unlimited
    mem_max_bytes requiredinteger (int64)
    net_measured requiredbooleanPer-service network traffic is not measured yet (always false)
    players_max requiredinteger (int32)
    samples requiredinteger (int64)Resource samples in the period (one per minute while running)
    service_id requiredinteger (int64)
    since requiredstring (date-time)
    slots requiredinteger (int32)
  • 4xx/5xx error 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.

ParameterInTypeDescription
id requiredpathinteger (int64)

Responses

  • 200 OK - List-configsResponse
    Fields
    FieldTypeDescription
    items requiredarray of ConfigFileView
  • 4xx/5xx error 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).

ParameterInTypeDescription
id requiredpathinteger (int64)
index requiredpathinteger (int64)

Request body application/json

FieldTypeDescription
hashstring(≤ 64 chars)
values requiredobject

Responses

  • 200 OK - ConfigFileView
    Fields
    FieldTypeDescription
    errorstringWhy the file could not be read or parsed
    exists requiredboolean
    format requiredstring
    hashstringContent version; send it back to detect concurrent edits
    index requiredinteger (int64)Position in the game definition's config_files
    label requiredstring
    path requiredstring
    settings requiredarray of ConfigSettingView
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

Datacenters

GET /api/v1/datacenters

List datacenters

Responses

  • 200 OK - List-datacentersResponse
    Fields
    FieldTypeDescription
    items requiredarray of Datacenter
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

POST /api/v1/datacenters

Create a datacenter

Request body application/json

FieldTypeDescription
locationstring(≤ 200 chars)
name requiredstring(≤ 64 chars)

Responses

  • 201 Created - Datacenter
    Fields
    FieldTypeDescription
    created_at requiredstring (date-time)
    id requiredinteger (int64)
    location requiredstring
    name requiredstring
    node_count requiredinteger (int64)
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

PUT /api/v1/datacenters/{id}

Rename or relocate a datacenter

ParameterInTypeDescription
id requiredpathinteger (int64)

Request body application/json

FieldTypeDescription
locationstring(≤ 200 chars)
name requiredstring(≤ 64 chars)

Responses

  • 200 OK - Datacenter
    Fields
    FieldTypeDescription
    created_at requiredstring (date-time)
    id requiredinteger (int64)
    location requiredstring
    name requiredstring
    node_count requiredinteger (int64)
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

DELETE /api/v1/datacenters/{id}

Delete an empty datacenter

ParameterInTypeDescription
id requiredpathinteger (int64)

Responses

  • 204 No Content
  • 4xx/5xx error 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).

ParameterInTypeDescription
id requiredpathinteger (int64)
pathquerystringRelative to the service directory, / separated; empty or / is the directory itself

Responses

  • 200 OK - List-filesResponse
    Fields
    FieldTypeDescription
    items requiredarray of FileEntry
    path requiredstring
  • 4xx/5xx error 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.

ParameterInTypeDescription
id requiredpathinteger (int64)
pathquerystringRelative to the service directory, / separated; empty or / is the directory itself

Responses

  • 200 OK - FileContentOut
    Fields
    FieldTypeDescription
    binary requiredbooleanNot UTF-8 text: download it instead
    content requiredstringUTF-8 text; empty when binary
    entry requiredFileEntry
    hash requiredstringSend back as expect when saving
  • 4xx/5xx error 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).

ParameterInTypeDescription
id requiredpathinteger (int64)

Request body application/json

FieldTypeDescription
content requiredstring
expectstring(≤ 64 chars)
path requiredstring(≤ 4096 chars)

Responses

  • 200 OK - Write-fileResponse
    Fields
    FieldTypeDescription
    entry requiredFileEntry
    hash requiredstring
  • 4xx/5xx error 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.

ParameterInTypeDescription
id requiredpathinteger (int64)

Request body application/json

FieldTypeDescription
path requiredstring(≤ 4096 chars)

Responses

  • 200 OK - Direct-downloadResponse
    Fields
    FieldTypeDescription
    direct requiredDirectTarget
  • 4xx/5xx error 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.

ParameterInTypeDescription
id requiredpathinteger (int64)
pathquerystringRelative to the service directory, / separated; empty or / is the directory itself

Responses

  • 200 The file - string (binary)
  • 4xx/5xx error 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).

ParameterInTypeDescription
id requiredpathinteger (int64)

Request body application/json

FieldTypeDescription
deststring(≤ 4096 chars)
modeinteger (int32)0-511 (0o777) (min 0, max 511)
op requiredstring: mkdir, rename, copy, delete, chmod, compress, extract
overwriteboolean
pathstring(≤ 4096 chars)
pathsarray of string

Responses

  • 200 OK - File-operationResponse
    Fields
    FieldTypeDescription
    entryFileEntry
    filesinteger (int64)extract: files written
    skippedarray of stringextract: entries left out (existing, denied, links)
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

GET /api/v1/services/{id}/files/search

Find files and folders by name below a folder

ParameterInTypeDescription
id requiredpathinteger (int64)
pathquerystringRelative to the service directory, / separated; empty or / is the directory itself
qquerystringPart of the name, or a glob with * ? [ ]

Responses

  • 200 OK - Search-filesResponse
    Fields
    FieldTypeDescription
    items requiredarray of FileEntry
    truncated requiredbooleanMore than 500 matches
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

GET /api/v1/services/{id}/files/stat

Describe one file or folder

ParameterInTypeDescription
id requiredpathinteger (int64)
pathquerystringRelative to the service directory, / separated; empty or / is the directory itself

Responses

  • 200 OK - FileEntry
    Fields
    FieldTypeDescription
    mode requiredinteger (int32)(min 0)
    modified requiredstring (date-time)
    name requiredstring
    path requiredstring
    size requiredinteger (int64)
    type requiredstring: file, dir, link, other
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

GET /api/v1/services/{id}/files/usage

The service directory's size and quota

ParameterInTypeDescription
id requiredpathinteger (int64)

Responses

  • 200 OK - ServiceDiskUsage
    Fields
    FieldTypeDescription
    quota_bytes requiredinteger (int64)0 = unlimited
    used_bytes requiredinteger (int64)
  • 4xx/5xx error 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}).

ParameterInTypeDescription
id requiredpathinteger (int64)

Request body application/json

FieldTypeDescription
overwriteboolean
path requiredstring(≤ 4096 chars)
size requiredinteger (int64)(min 0)

Responses

  • 201 Created - UploadInfo
    Fields
    FieldTypeDescription
    chunk_bytes requiredinteger (int64)
    directDirectTargetUpload straight to the node (PUT {url}?offset=N with the token); fall back to the controller when it fails
    id requiredstring
    path requiredstring
    received requiredinteger (int64)
    size requiredinteger (int64)
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

GET /api/v1/services/{id}/uploads/{upload}

How much of an upload the node has (to resume)

ParameterInTypeDescription
id requiredpathinteger (int64)
upload requiredpathstring

Responses

  • 200 OK - UploadInfo
    Fields
    FieldTypeDescription
    chunk_bytes requiredinteger (int64)
    directDirectTargetUpload straight to the node (PUT {url}?offset=N with the token); fall back to the controller when it fails
    id requiredstring
    path requiredstring
    received requiredinteger (int64)
    size requiredinteger (int64)
  • 4xx/5xx error 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.

ParameterInTypeDescription
id requiredpathinteger (int64)
upload requiredpathstring
offsetqueryinteger (int64)Where this chunk starts in the file

Request body application/octet-stream

Responses

  • 200 OK - Upload-chunkResponse
    Fields
    FieldTypeDescription
    received requiredinteger (int64)Bytes the node has now
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

DELETE /api/v1/services/{id}/uploads/{upload}

Cancel an upload and drop what was sent

ParameterInTypeDescription
id requiredpathinteger (int64)
upload requiredpathstring

Responses

  • 204 No Content
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

POST /api/v1/services/{id}/uploads/{upload}/complete

Finish an upload: the file appears at its path

ParameterInTypeDescription
id requiredpathinteger (int64)
upload requiredpathstring

Responses

  • 200 OK - FileEntry
    Fields
    FieldTypeDescription
    mode requiredinteger (int32)(min 0)
    modified requiredstring (date-time)
    name requiredstring
    path requiredstring
    size requiredinteger (int64)
    type requiredstring: file, dir, link, other
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

Games

GET /api/v1/game-definitions

Every game definition, enabled or not, with its origin and use

Responses

  • 200 OK - List-game-definitionsResponse
    Fields
    FieldTypeDescription
    items requiredarray of GameAdmin
  • 4xx/5xx error 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

FieldTypeDescription
scriptsobjectscripts/<name> -> content
source_yaml requiredstringgame.yaml (≤ 262144 chars)

Responses

  • 200 OK - GameSource
    Fields
    FieldTypeDescription
    category requiredstring
    enabled requiredboolean
    has_rcon requiredbooleanThe game has a remote console (RCON console, rcon tasks, stop over RCON)
    has_workshop requiredbooleanmodlist variables take Steam Workshop ids or links
    id requiredstring
    install_steps requiredobjectInstall steps per OS
    name requiredstring
    needs_steam_account requiredbooleanInstalling needs a Steam account in the vault
    origin requiredstring: builtin, custombuiltin definitions refresh with the controller until someone edits them
    platforms requiredarray of string
    ports requiredarray of GamePort
    scripts requiredobject
    service_count requiredinteger (int64)
    slots_default requiredinteger (int64)
    slots_max requiredinteger (int64)
    slots_min requiredinteger (int64)
    source_yaml requiredstring
    updated_at requiredstring (date-time)
    variables requiredarray of GameVariable
    version requiredinteger (int64)
    versions requiredarray of GameVersion
  • 4xx/5xx error 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

FieldTypeDescription
scriptsobjectscripts/<name> -> content
source_yaml requiredstringgame.yaml (≤ 262144 chars)

Responses

  • 200 OK - Validate-game-definitionResponse
    Fields
    FieldTypeDescription
    gameGame
    problems requiredarray of ValidationProblem
    valid requiredboolean
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

GET /api/v1/game-definitions/{game}

A game definition with its YAML, scripts and versions

ParameterInTypeDescription
game requiredpathstring

Responses

  • 200 OK - GameSource
    Fields
    FieldTypeDescription
    category requiredstring
    enabled requiredboolean
    has_rcon requiredbooleanThe game has a remote console (RCON console, rcon tasks, stop over RCON)
    has_workshop requiredbooleanmodlist variables take Steam Workshop ids or links
    id requiredstring
    install_steps requiredobjectInstall steps per OS
    name requiredstring
    needs_steam_account requiredbooleanInstalling needs a Steam account in the vault
    origin requiredstring: builtin, custombuiltin definitions refresh with the controller until someone edits them
    platforms requiredarray of string
    ports requiredarray of GamePort
    scripts requiredobject
    service_count requiredinteger (int64)
    slots_default requiredinteger (int64)
    slots_max requiredinteger (int64)
    slots_min requiredinteger (int64)
    source_yaml requiredstring
    updated_at requiredstring (date-time)
    variables requiredarray of GameVariable
    version requiredinteger (int64)
    versions requiredarray of GameVersion
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

PATCH /api/v1/game-definitions/{game}

Offer or hide a game for new services

ParameterInTypeDescription
game requiredpathstring

Request body application/json

FieldTypeDescription
enabled requiredboolean

Responses

  • 204 No Content
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

DELETE /api/v1/game-definitions/{game}

Delete a custom definition that no service uses

ParameterInTypeDescription
game requiredpathstring

Responses

  • 204 No Content
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

GET /api/v1/game-definitions/{game}/versions/{version}

The YAML of an earlier version (for a diff)

ParameterInTypeDescription
game requiredpathstring
version requiredpathinteger (int32)

Responses

  • 200 OK - Get-game-definition-versionResponse
    Fields
    FieldTypeDescription
    source_yaml requiredstring
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

GET /api/v1/games

Game definitions available for new services

Responses

  • 200 OK - List-gamesResponse
    Fields
    FieldTypeDescription
    items requiredarray of Game
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

Meta

GET /api/v1/meta/permissions

Roles and permission flags

Responses

  • 200 OK - CatalogOutputBody
    Fields
    FieldTypeDescription
    permissions requiredarray of string
    roles requiredarray of RoleInfo
    service_permissions requiredarray of string
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

Mods

GET /api/v1/game-definitions/{game}/mods

A game's mod catalog

ParameterInTypeDescription
game requiredpathstring

Responses

  • 200 OK - ItemsCatalogModBody
    Fields
    FieldTypeDescription
    items requiredarray of CatalogMod
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

POST /api/v1/game-definitions/{game}/mods

Add a Workshop item or collection to a game's mod catalog

ParameterInTypeDescription
game requiredpathstring

Request body application/json

FieldTypeDescription
descriptionstring(≤ 500 chars)
kindstring: workshop, workshop_collectionFixed after creation
namestringDefault: the Workshop title (required for collections) (≤ 120 chars)
workshop_id requiredstring(≤ 20 chars)

Responses

  • 201 Created - CatalogMod
    Fields
    FieldTypeDescription
    created_at requiredstring (date-time)
    description requiredstring
    game_id requiredstring
    id requiredinteger (int64)
    kind requiredstring: workshop, workshop_collection
    name requiredstring
    updated_at requiredstring (date-time)
    workshop_id requiredinteger (int64)
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

PUT /api/v1/game-definitions/{game}/mods/{mod_id}

Change a catalog entry

ParameterInTypeDescription
game requiredpathstring
mod_id requiredpathinteger (int64)

Request body application/json

FieldTypeDescription
descriptionstring(≤ 500 chars)
kindstring: workshop, workshop_collectionFixed after creation
namestringDefault: the Workshop title (required for collections) (≤ 120 chars)
workshop_id requiredstring(≤ 20 chars)

Responses

  • 200 OK - CatalogMod
    Fields
    FieldTypeDescription
    created_at requiredstring (date-time)
    description requiredstring
    game_id requiredstring
    id requiredinteger (int64)
    kind requiredstring: workshop, workshop_collection
    name requiredstring
    updated_at requiredstring (date-time)
    workshop_id requiredinteger (int64)
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

DELETE /api/v1/game-definitions/{game}/mods/{mod_id}

Remove a catalog entry (services keep their mods)

ParameterInTypeDescription
game requiredpathstring
mod_id requiredpathinteger (int64)

Responses

  • 204 No Content
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

GET /api/v1/services/{id}/mods

A service's mod lists and its game's mod catalog

ParameterInTypeDescription
id requiredpathinteger (int64)

Responses

  • 200 OK - ServiceModsView
    Fields
    FieldTypeDescription
    catalog requiredarray of CatalogMod
    installed requiredboolean
    lists requiredarray of ModList
    workshop requiredbooleanThe game takes Steam Workshop mods
  • 4xx/5xx error 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)

ParameterInTypeDescription
id requiredpathinteger (int64)

Request body application/json

FieldTypeDescription
ref requiredstring(≤ 500 chars)

Responses

  • 200 OK - ItemsWorkshopItemBody
    Fields
    FieldTypeDescription
    items requiredarray of WorkshopItem
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

PUT /api/v1/services/{id}/mods/{variable}

Replace one mod list (Workshop ids in load order)

ParameterInTypeDescription
id requiredpathinteger (int64)
variable requiredpathstring

Request body application/json

FieldTypeDescription
ids requiredarray of stringWorkshop ids

Responses

  • 200 OK - SetModsOutBody
    Fields
    FieldTypeDescription
    cpu_limit_percent requiredinteger (int32)0 = unlimited; 100 = one core
    cpu_percent requirednumber (nullable) (float)
    crash_policy requiredCrashPolicy
    created_at requiredstring (date-time)
    desired_state requiredstring: running, stopped
    disk_limit_bytes requiredinteger (int64)File manager / SFTP / upload quota; 0 = unlimited
    external_id requiredstring (nullable)The billing system's reference
    file_deny requiredarray of stringDeny globs added for this service (on top of the game definition's): matching paths are hidden from everyone except administrators
    game_id requiredstring
    has_rconbooleanThe game has a remote console (only on GET /services/{id})
    has_workshopbooleanThe game takes Steam Workshop mods (only on GET /services/{id})
    id requiredinteger (int64)
    installInstallProgressWhile installing / updating
    install_dir requiredstring
    installed requiredbooleanThe game files are in place
    ip requiredstring
    last_error requiredstringThe last command the agent refused, and why
    last_exit_code requiredinteger (nullable) (int32)
    max_players requiredinteger (nullable) (int32)
    memory_limit_bytes requiredinteger (int64)0 = unlimited
    memory_used_bytes requiredinteger (nullable) (int64)
    metrics_at requiredstring (nullable) (date-time)
    mods requiredobjectWorkshop items per modlist variable
    mods_changed requiredbooleanRun the update action to download the new mods
    name requiredstring
    node_connected requiredbooleanThe node's agent link is up
    node_id requiredinteger (int64)
    node_name requiredstring
    node_os requiredstring: windows, linux
    observed_at requiredstring (nullable) (date-time)
    observed_message requiredstring
    observed_status requiredstringWhat the agent last reported
    os_user requiredstring
    owner_user_id requiredinteger (int64)
    owner_username requiredstring
    package_id requiredinteger (nullable) (int64)The package it was ordered with (null = none)
    permissionsarray of stringWhat the caller may do on this service (absent on WebSocket events)
    players requiredinteger (nullable) (int32)From the game's status query while it runs (null = unknown)
    portsarray of PortViewOnly on GET /services/{id}
    primary_port requiredinteger (nullable) (int32)
    process_count requiredinteger (nullable) (int32)
    processesarray of ProcessViewOnly on GET /services/{id}
    query_at requiredstring (nullable) (date-time)
    query_map requiredstring
    query_name requiredstringServer name the game reports
    restarts requiredinteger (int32)Crash restarts within the crash-policy window
    secret_variables requiredarray of stringPassword variables that have a value (values are never returned)
    sftpSFTPInfoHow the caller connects with SFTP (only on GET /services/{id}, with the files permission)
    slots requiredinteger (int32)
    status requiredstring: installing, install_failed, stopped, starting, running, stopping, crashed, suspended, moving, deleting
    steam_account_id requiredinteger (nullable) (int64)
    suspend_reason requiredstringWhy it was suspended (billing or an administrator)
    suspended requiredboolean
    variables requiredobject
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

Nodes

GET /api/v1/enrollment-tokens

Pending (unused, unexpired) enrollment tokens

Responses

  • 200 OK - List-enrollment-tokensResponse
    Fields
    FieldTypeDescription
    items requiredarray of EnrollmentToken
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

POST /api/v1/enrollment-tokens

Create a one-time token to add a node

Request body application/json

FieldTypeDescription
datacenter_id requiredinteger (int64)(min 1)
node_name requiredstring(≤ 64 chars)
ttl_minutesinteger (int64)Default 60 (min 5, max 10080)

Responses

  • 201 Created - NewTokenOutBody
    Fields
    FieldTypeDescription
    ca_hash requiredstring
    commands requiredobjectReady-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_at requiredstring (date-time)
    datacenter_id requiredinteger (int64)
    expires_at requiredstring (date-time)
    hint requiredstring
    id requiredinteger (int64)
    node_name requiredstring
    token requiredstringShown once
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

DELETE /api/v1/enrollment-tokens/{id}

Cancel an unused enrollment token

ParameterInTypeDescription
id requiredpathinteger (int64)

Responses

  • 204 No Content
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

GET /api/v1/nodes

List nodes with live status and the latest metrics

Responses

  • 200 OK - List-nodesResponse
    Fields
    FieldTypeDescription
    items requiredarray of Node
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

GET /api/v1/nodes/{id}

Get a node

ParameterInTypeDescription
id requiredpathinteger (int64)

Responses

  • 200 OK - Node
    Fields
    FieldTypeDescription
    agent_version requiredstring
    arch requiredstring
    capabilities requiredarray of string
    cert_not_after requiredstring (nullable) (date-time)
    connected requiredbooleanThe agent link is up right now
    connected_at requiredstring (nullable) (date-time)
    cpu_cores requiredinteger (int32)
    cpu_percent requirednumber (nullable) (float)
    created_at requiredstring (date-time)
    datacenter_id requiredinteger (int64)
    disk_bytes requiredinteger (int64)
    disks requiredarray of DiskUsage
    firewall_managed requiredboolean
    hostname requiredstring
    id requiredinteger (int64)
    ip_addressesarray of NodeIPOnly on GET /nodes/{id}
    last_seen_at requiredstring (nullable) (date-time)
    memory_bytes requiredinteger (int64)
    memory_used_bytes requiredinteger (nullable) (int64)
    metrics_at requiredstring (nullable) (date-time)
    mode requiredstring: active, draining, disabledOperator mode; draining/disabled persist across disconnects (see connected for the link)
    name requiredstring
    net_rx_bytes requiredinteger (nullable) (int64)
    net_tx_bytes requiredinteger (nullable) (int64)
    os requiredstring: windows, linux
    os_version requiredstring
    overcommit_percent requiredinteger (int32)
    port_range_end requiredinteger (int32)
    port_range_start requiredinteger (int32)
    services_dir requiredstring
    status requiredstring: pending, online, offline, draining, disabled
    steamcmd_dir requiredstring
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

PATCH /api/v1/nodes/{id}

Change node settings or mode (active, draining, disabled)

ParameterInTypeDescription
id requiredpathinteger (int64)

Request body application/json

FieldTypeDescription
datacenter_idinteger (int64)
firewall_managedboolean
modestring: active, draining, disabled
namestring(≤ 64 chars)
overcommit_percentinteger (int32)(min 1, max 1000)
port_range_endinteger (int32)(min 1024, max 65535)
port_range_startinteger (int32)(min 1024, max 65535)
services_dirstring(≤ 260 chars)
steamcmd_dirstring(≤ 260 chars)

Responses

  • 200 OK - Node
    Fields
    FieldTypeDescription
    agent_version requiredstring
    arch requiredstring
    capabilities requiredarray of string
    cert_not_after requiredstring (nullable) (date-time)
    connected requiredbooleanThe agent link is up right now
    connected_at requiredstring (nullable) (date-time)
    cpu_cores requiredinteger (int32)
    cpu_percent requirednumber (nullable) (float)
    created_at requiredstring (date-time)
    datacenter_id requiredinteger (int64)
    disk_bytes requiredinteger (int64)
    disks requiredarray of DiskUsage
    firewall_managed requiredboolean
    hostname requiredstring
    id requiredinteger (int64)
    ip_addressesarray of NodeIPOnly on GET /nodes/{id}
    last_seen_at requiredstring (nullable) (date-time)
    memory_bytes requiredinteger (int64)
    memory_used_bytes requiredinteger (nullable) (int64)
    metrics_at requiredstring (nullable) (date-time)
    mode requiredstring: active, draining, disabledOperator mode; draining/disabled persist across disconnects (see connected for the link)
    name requiredstring
    net_rx_bytes requiredinteger (nullable) (int64)
    net_tx_bytes requiredinteger (nullable) (int64)
    os requiredstring: windows, linux
    os_version requiredstring
    overcommit_percent requiredinteger (int32)
    port_range_end requiredinteger (int32)
    port_range_start requiredinteger (int32)
    services_dir requiredstring
    status requiredstring: pending, online, offline, draining, disabled
    steamcmd_dir requiredstring
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

DELETE /api/v1/nodes/{id}

Remove a node (revokes its certificate and disconnects it)

ParameterInTypeDescription
id requiredpathinteger (int64)

Responses

  • 204 No Content
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

GET /api/v1/nodes/{id}/metrics

Node resource samples (up to 24 h)

ParameterInTypeDescription
id requiredpathinteger (int64)
minutesqueryinteger (int64)

Responses

  • 200 OK - Get-node-metricsResponse
    Fields
    FieldTypeDescription
    items requiredarray of MetricSample
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

POST /api/v1/nodes/{id}/update-agent

Send a signed self-update to a connected agent

ParameterInTypeDescription
id requiredpathinteger (int64)

Request body application/json

FieldTypeDescription
version requiredstring(≤ 64 chars)

Responses

  • 202 Accepted - Update-node-agentResponse
    Fields
    FieldTypeDescription
    request_id requiredstring
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

Notifications

GET /api/v1/notification-deliveries

The latest 200 deliveries with their status

Responses

  • 200 OK - ItemsDeliveryBody
    Fields
    FieldTypeDescription
    items requiredarray of Delivery
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

GET /api/v1/notification-events

Events a webhook can subscribe to

Responses

  • 200 OK - ItemsStringBody
    Fields
    FieldTypeDescription
    items requiredarray of string
  • 4xx/5xx error 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

  • 200 OK - ItemsTemplateViewBody
    Fields
    FieldTypeDescription
    items requiredarray of TemplateView
  • 4xx/5xx error 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

FieldTypeDescription
templates requiredobject

Responses

  • 200 OK - ItemsTemplateViewBody
    Fields
    FieldTypeDescription
    items requiredarray of TemplateView
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

GET /api/v1/settings/smtp

The outgoing mail server for e-mail notifications

Responses

  • 200 OK - SMTPView
    Fields
    FieldTypeDescription
    from requiredstring
    has_password requiredboolean
    host requiredstring
    port requiredinteger (int64)
    security requiredstring: starttls, tls, none,
    username requiredstring
  • 4xx/5xx error 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

FieldTypeDescription
fromstring(≤ 200 chars)
host requiredstring(≤ 253 chars)
passwordstringWrite-only; leave out to keep, "" to clear (≤ 500 chars)
portinteger (int64)(min 0, max 65535)
securitystring: starttls, tls, none
usernamestring(≤ 200 chars)

Responses

  • 200 OK - SMTPView
    Fields
    FieldTypeDescription
    from requiredstring
    has_password requiredboolean
    host requiredstring
    port requiredinteger (int64)
    security requiredstring: starttls, tls, none,
    username requiredstring
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

GET /api/v1/webhooks

Webhooks: generic (HMAC-signed JSON), Discord and e-mail

Responses

  • 200 OK - ItemsWebhookViewBody
    Fields
    FieldTypeDescription
    items requiredarray of WebhookView
  • 4xx/5xx error 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

FieldTypeDescription
enabled requiredboolean
eventsarray of stringEmpty = every event
kindstring: generic, discord, emailFixed after creation
name requiredstring(≤ 80 chars)
secretstringgeneric: HMAC-SHA256 signing secret (write-only; "" removes it) (≤ 200 chars)
urlstringgeneric / discord: the URL; email: addresses. On update, empty keeps the stored one (≤ 2000 chars)

Responses

  • 201 Created - WebhookView
    Fields
    FieldTypeDescription
    created_at requiredstring (date-time)
    enabled requiredboolean
    events requiredarray of stringEmpty = every event
    has_secret requiredboolean
    id requiredinteger (int64)
    kind requiredstring: generic, discord, email
    name requiredstring
    updated_at requiredstring (date-time)
    url requiredstringGeneric: the endpoint; Discord: masked; email: the addresses
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

PUT /api/v1/webhooks/{id}

Change a webhook (its kind stays)

ParameterInTypeDescription
id requiredpathinteger (int64)

Request body application/json

FieldTypeDescription
enabled requiredboolean
eventsarray of stringEmpty = every event
kindstring: generic, discord, emailFixed after creation
name requiredstring(≤ 80 chars)
secretstringgeneric: HMAC-SHA256 signing secret (write-only; "" removes it) (≤ 200 chars)
urlstringgeneric / discord: the URL; email: addresses. On update, empty keeps the stored one (≤ 2000 chars)

Responses

  • 200 OK - WebhookView
    Fields
    FieldTypeDescription
    created_at requiredstring (date-time)
    enabled requiredboolean
    events requiredarray of stringEmpty = every event
    has_secret requiredboolean
    id requiredinteger (int64)
    kind requiredstring: generic, discord, email
    name requiredstring
    updated_at requiredstring (date-time)
    url requiredstringGeneric: the endpoint; Discord: masked; email: the addresses
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

DELETE /api/v1/webhooks/{id}

Remove a webhook

ParameterInTypeDescription
id requiredpathinteger (int64)

Responses

  • 204 No Content
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

POST /api/v1/webhooks/{id}/test

Send a test message (see the delivery log)

ParameterInTypeDescription
id requiredpathinteger (int64)

Responses

  • 202 Accepted
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

Packages

GET /api/v1/packages

Packages (products): all for administrators, the global ones plus their own for resellers

Responses

  • 200 OK - PackagesOutBody
    Fields
    FieldTypeDescription
    items requiredarray of Package
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

POST /api/v1/packages

Create a package

Request body application/json

FieldTypeDescription
allowed_datacenter_idsarray of integer (int64)Empty = any datacenter
cpu_limit_percentinteger (int32)0 = unlimited; 100 = one core (min 0)
descriptionstring(≤ 500 chars)
disk_limit_bytesinteger (int64)0 = unlimited (min 0)
enabled requiredboolean
game_idstringRequired on create; the game cannot change later (≤ 64 chars)
memory_limit_bytesinteger (int64)0 = unlimited (min 0)
name requiredstring(≤ 64 chars)
reseller_idinteger (int64)Administrators: the reseller that owns it (0 = global); ignored for resellers and on update (min 0)
slots_defaultinteger (int32)0 = the game's default, inside the range (min 0)
slots_max requiredinteger (int32)(min 0)
slots_min requiredinteger (int32)(min 0)
start_on_createboolean
variablesobjectStartup variable defaults (no passwords)

Responses

  • 201 Created - Package
    Fields
    FieldTypeDescription
    allowed_datacenter_ids requiredarray of integer (int64)Empty = any datacenter
    cpu_limit_percent requiredinteger (int32)0 = unlimited; 100 = one core
    created_at requiredstring (date-time)
    description requiredstring
    disk_limit_bytes requiredinteger (int64)File manager / SFTP / upload quota; 0 = unlimited
    enabled requiredbooleanDisabled packages cannot be ordered; existing game servers keep running
    game_id requiredstring
    id requiredinteger (int64)
    memory_limit_bytes requiredinteger (int64)0 = unlimited
    name requiredstring
    reseller_id requiredinteger (int64)0 = a global package (every reseller may sell it)
    service_count requiredinteger (int64)
    slots_default requiredinteger (int32)
    slots_max requiredinteger (int32)
    slots_min requiredinteger (int32)
    start_on_create requiredbooleanStart new game servers after the install
    updated_at requiredstring (date-time)
    variables requiredobjectStartup variable defaults for new game servers
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

GET /api/v1/packages/{id}

A package

ParameterInTypeDescription
id requiredpathinteger (int64)

Responses

  • 200 OK - Package
    Fields
    FieldTypeDescription
    allowed_datacenter_ids requiredarray of integer (int64)Empty = any datacenter
    cpu_limit_percent requiredinteger (int32)0 = unlimited; 100 = one core
    created_at requiredstring (date-time)
    description requiredstring
    disk_limit_bytes requiredinteger (int64)File manager / SFTP / upload quota; 0 = unlimited
    enabled requiredbooleanDisabled packages cannot be ordered; existing game servers keep running
    game_id requiredstring
    id requiredinteger (int64)
    memory_limit_bytes requiredinteger (int64)0 = unlimited
    name requiredstring
    reseller_id requiredinteger (int64)0 = a global package (every reseller may sell it)
    service_count requiredinteger (int64)
    slots_default requiredinteger (int32)
    slots_max requiredinteger (int32)
    slots_min requiredinteger (int32)
    start_on_create requiredbooleanStart new game servers after the install
    updated_at requiredstring (date-time)
    variables requiredobjectStartup variable defaults for new game servers
  • 4xx/5xx error 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).

ParameterInTypeDescription
id requiredpathinteger (int64)

Request body application/json

FieldTypeDescription
allowed_datacenter_idsarray of integer (int64)Empty = any datacenter
cpu_limit_percentinteger (int32)0 = unlimited; 100 = one core (min 0)
descriptionstring(≤ 500 chars)
disk_limit_bytesinteger (int64)0 = unlimited (min 0)
enabled requiredboolean
game_idstringRequired on create; the game cannot change later (≤ 64 chars)
memory_limit_bytesinteger (int64)0 = unlimited (min 0)
name requiredstring(≤ 64 chars)
reseller_idinteger (int64)Administrators: the reseller that owns it (0 = global); ignored for resellers and on update (min 0)
slots_defaultinteger (int32)0 = the game's default, inside the range (min 0)
slots_max requiredinteger (int32)(min 0)
slots_min requiredinteger (int32)(min 0)
start_on_createboolean
variablesobjectStartup variable defaults (no passwords)

Responses

  • 200 OK - Package
    Fields
    FieldTypeDescription
    allowed_datacenter_ids requiredarray of integer (int64)Empty = any datacenter
    cpu_limit_percent requiredinteger (int32)0 = unlimited; 100 = one core
    created_at requiredstring (date-time)
    description requiredstring
    disk_limit_bytes requiredinteger (int64)File manager / SFTP / upload quota; 0 = unlimited
    enabled requiredbooleanDisabled packages cannot be ordered; existing game servers keep running
    game_id requiredstring
    id requiredinteger (int64)
    memory_limit_bytes requiredinteger (int64)0 = unlimited
    name requiredstring
    reseller_id requiredinteger (int64)0 = a global package (every reseller may sell it)
    service_count requiredinteger (int64)
    slots_default requiredinteger (int32)
    slots_max requiredinteger (int32)
    slots_min requiredinteger (int32)
    start_on_create requiredbooleanStart new game servers after the install
    updated_at requiredstring (date-time)
    variables requiredobjectStartup variable defaults for new game servers
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

DELETE /api/v1/packages/{id}

Delete a package no game server uses

ParameterInTypeDescription
id requiredpathinteger (int64)

Responses

  • 204 No Content
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

Resellers

GET /api/v1/resellers

Resellers with their quotas and what their customers use

Responses

  • 200 OK - ResellersOutBody
    Fields
    FieldTypeDescription
    items requiredarray of Reseller
  • 4xx/5xx error 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

FieldTypeDescription
allowed_game_idsarray of stringEmpty = every game
allowed_node_idsarray of integer (int64)Empty = every node
brandingResellerBranding
name requiredstring(≤ 64 chars)
quotasResellerQuotas

Responses

  • 201 Created - Reseller
    Fields
    FieldTypeDescription
    accounts requiredinteger (int64)Accounts of this reseller, including its own reseller accounts
    allowed_game_ids requiredarray of stringGames the reseller may sell; empty = all
    allowed_node_ids requiredarray of integer (int64)Nodes its customers' game servers may be placed on; empty = all
    branding requiredResellerBranding
    created_at requiredstring (date-time)
    id requiredinteger (int64)
    name requiredstring
    quotas requiredResellerQuotas
    updated_at requiredstring (date-time)
    usage requiredResellerUsage
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

GET /api/v1/resellers/{id}

A reseller (administrators any; a reseller account its own, with quotas and usage)

ParameterInTypeDescription
id requiredpathinteger (int64)

Responses

  • 200 OK - Reseller
    Fields
    FieldTypeDescription
    accounts requiredinteger (int64)Accounts of this reseller, including its own reseller accounts
    allowed_game_ids requiredarray of stringGames the reseller may sell; empty = all
    allowed_node_ids requiredarray of integer (int64)Nodes its customers' game servers may be placed on; empty = all
    branding requiredResellerBranding
    created_at requiredstring (date-time)
    id requiredinteger (int64)
    name requiredstring
    quotas requiredResellerQuotas
    updated_at requiredstring (date-time)
    usage requiredResellerUsage
  • 4xx/5xx error 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.

ParameterInTypeDescription
id requiredpathinteger (int64)

Request body application/json

FieldTypeDescription
allowed_game_idsarray of stringEmpty = every game
allowed_node_idsarray of integer (int64)Empty = every node
brandingResellerBranding
name requiredstring(≤ 64 chars)
quotasResellerQuotas

Responses

  • 200 OK - Reseller
    Fields
    FieldTypeDescription
    accounts requiredinteger (int64)Accounts of this reseller, including its own reseller accounts
    allowed_game_ids requiredarray of stringGames the reseller may sell; empty = all
    allowed_node_ids requiredarray of integer (int64)Nodes its customers' game servers may be placed on; empty = all
    branding requiredResellerBranding
    created_at requiredstring (date-time)
    id requiredinteger (int64)
    name requiredstring
    quotas requiredResellerQuotas
    updated_at requiredstring (date-time)
    usage requiredResellerUsage
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

DELETE /api/v1/resellers/{id}

Delete a reseller that has no accounts left

ParameterInTypeDescription
id requiredpathinteger (int64)

Responses

  • 204 No Content
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

Schedules

GET /api/v1/schedule-preview

The next runs of a cron expression (checks it too)

ParameterInTypeDescription
cronquerystring
timezonequerystring

Responses

  • 200 OK - ItemsTimeBody
    Fields
    FieldTypeDescription
    items requiredarray of string (date-time)
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

GET /api/v1/schedules

Global scheduled tasks

Responses

  • 200 OK - ItemsTaskViewBody
    Fields
    FieldTypeDescription
    items requiredarray of TaskView
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

POST /api/v1/schedules

Add a global scheduled task (every service matching the selector)

Request body application/json

FieldTypeDescription
action requiredstring: restart, stop, start, update, backup, rcon, script, notify
cron requiredstring5 fields (minute hour day month weekday) or @hourly, @daily, @weekly, @monthly (≤ 100 chars)
enabled requiredboolean
name requiredstring(≤ 80 chars)
paramsTaskParams
selectorTaskSelectorGlobal tasks: the services they apply to (empty = all)
timezonestringIANA name, e.g. Europe/Stockholm (default UTC) (≤ 64 chars)

Responses

  • 201 Created - TaskView
    Fields
    FieldTypeDescription
    action requiredstring
    created_at requiredstring (date-time)
    cron requiredstring
    enabled requiredboolean
    id requiredinteger (int64)
    last_resultTaskResult
    last_run_atstring (date-time)
    name requiredstring
    next requiredarray of string (date-time)The next three runs
    params requiredTaskParams
    scope requiredstring: global, service
    selectorTaskSelector
    service_idinteger (int64)
    timezone requiredstring
    updated_at requiredstring (date-time)
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

PUT /api/v1/schedules/{id}

Change a global scheduled task

ParameterInTypeDescription
id requiredpathinteger (int64)

Request body application/json

FieldTypeDescription
action requiredstring: restart, stop, start, update, backup, rcon, script, notify
cron requiredstring5 fields (minute hour day month weekday) or @hourly, @daily, @weekly, @monthly (≤ 100 chars)
enabled requiredboolean
name requiredstring(≤ 80 chars)
paramsTaskParams
selectorTaskSelectorGlobal tasks: the services they apply to (empty = all)
timezonestringIANA name, e.g. Europe/Stockholm (default UTC) (≤ 64 chars)

Responses

  • 200 OK - TaskView
    Fields
    FieldTypeDescription
    action requiredstring
    created_at requiredstring (date-time)
    cron requiredstring
    enabled requiredboolean
    id requiredinteger (int64)
    last_resultTaskResult
    last_run_atstring (date-time)
    name requiredstring
    next requiredarray of string (date-time)The next three runs
    params requiredTaskParams
    scope requiredstring: global, service
    selectorTaskSelector
    service_idinteger (int64)
    timezone requiredstring
    updated_at requiredstring (date-time)
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

DELETE /api/v1/schedules/{id}

Remove a global scheduled task

ParameterInTypeDescription
id requiredpathinteger (int64)

Responses

  • 204 No Content
  • 4xx/5xx error 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)

ParameterInTypeDescription
id requiredpathinteger (int64)

Responses

  • 200 OK - ItemsScheduleRunViewBody
    Fields
    FieldTypeDescription
    items requiredarray of ScheduleRunView
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

GET /api/v1/services/{id}/schedules

A service's scheduled tasks

ParameterInTypeDescription
id requiredpathinteger (int64)

Responses

  • 200 OK - SvcTasksBody
    Fields
    FieldTypeDescription
    global requiredarray of TaskViewGlobal tasks that also apply (administrators manage them)
    items requiredarray of TaskViewThe service's own tasks
  • 4xx/5xx error 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.

ParameterInTypeDescription
id requiredpathinteger (int64)

Request body application/json

FieldTypeDescription
action requiredstring: restart, stop, start, update, backup, rcon, script, notify
cron requiredstring5 fields (minute hour day month weekday) or @hourly, @daily, @weekly, @monthly (≤ 100 chars)
enabled requiredboolean
name requiredstring(≤ 80 chars)
paramsTaskParams
selectorTaskSelectorGlobal tasks: the services they apply to (empty = all)
timezonestringIANA name, e.g. Europe/Stockholm (default UTC) (≤ 64 chars)

Responses

  • 201 Created - TaskView
    Fields
    FieldTypeDescription
    action requiredstring
    created_at requiredstring (date-time)
    cron requiredstring
    enabled requiredboolean
    id requiredinteger (int64)
    last_resultTaskResult
    last_run_atstring (date-time)
    name requiredstring
    next requiredarray of string (date-time)The next three runs
    params requiredTaskParams
    scope requiredstring: global, service
    selectorTaskSelector
    service_idinteger (int64)
    timezone requiredstring
    updated_at requiredstring (date-time)
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

PUT /api/v1/services/{id}/schedules/{task_id}

Change a service's scheduled task

ParameterInTypeDescription
id requiredpathinteger (int64)
task_id requiredpathinteger (int64)

Request body application/json

FieldTypeDescription
action requiredstring: restart, stop, start, update, backup, rcon, script, notify
cron requiredstring5 fields (minute hour day month weekday) or @hourly, @daily, @weekly, @monthly (≤ 100 chars)
enabled requiredboolean
name requiredstring(≤ 80 chars)
paramsTaskParams
selectorTaskSelectorGlobal tasks: the services they apply to (empty = all)
timezonestringIANA name, e.g. Europe/Stockholm (default UTC) (≤ 64 chars)

Responses

  • 200 OK - TaskView
    Fields
    FieldTypeDescription
    action requiredstring
    created_at requiredstring (date-time)
    cron requiredstring
    enabled requiredboolean
    id requiredinteger (int64)
    last_resultTaskResult
    last_run_atstring (date-time)
    name requiredstring
    next requiredarray of string (date-time)The next three runs
    params requiredTaskParams
    scope requiredstring: global, service
    selectorTaskSelector
    service_idinteger (int64)
    timezone requiredstring
    updated_at requiredstring (date-time)
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

DELETE /api/v1/services/{id}/schedules/{task_id}

Remove a service's scheduled task

ParameterInTypeDescription
id requiredpathinteger (int64)
task_id requiredpathinteger (int64)

Responses

  • 204 No Content
  • 4xx/5xx error 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.

ParameterInTypeDescription
external_idquerystringBilling: find a game server by its billing reference

Responses

  • 200 OK - List-servicesResponse
    Fields
    FieldTypeDescription
    items requiredarray of View
  • 4xx/5xx error 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

FieldTypeDescription
cpu_limit_percentinteger (int32)Without a package: 0 = unlimited; 100 = one core (min 0)
crash_policyCrashPolicy
datacenter_idinteger (int64)Pick the node in this datacenter (min 0)
disk_limit_bytesinteger (int64)Without a package: 0 = unlimited (min 0)
external_idstringBilling reference (e.g. whmcs-123), unique in the caller's tenancy (≤ 100 chars)
game_idstringRequired without a package (≤ 64 chars)
memory_limit_bytesinteger (int64)Without a package: 0 = unlimited (min 0)
name requiredstring(≤ 64 chars)
node_idinteger (int64)Callers who can see nodes; 0 = picked (online, the game's OS, memory left) (min 0)
owner_display_namestring(≤ 100 chars)
owner_emailstringBilling: the customer by e-mail address (created when unknown) (≤ 254 chars)
owner_passwordstringBilling: password for a new customer (default: generated and returned once) (≤ 256 chars)
owner_user_idinteger (int64)Default: the caller (min 0)
owner_usernamestringBilling: username for a new customer (default: from the e-mail address) (≤ 32 chars)
package_idinteger (int64)(min 0)
slotsinteger (int32)Default: the package's or the game's default (min 0)
startbooleanStart right away (after the install); default: the package's start_on_create, else no
steam_account_idinteger (int64)Administrators: the Steam account to install with (default: the vault's default) (min 0)
variablesobject

Responses

  • 201 Created - CreateOutBody
    Fields
    FieldTypeDescription
    cpu_limit_percent requiredinteger (int32)0 = unlimited; 100 = one core
    cpu_percent requirednumber (nullable) (float)
    crash_policy requiredCrashPolicy
    created_at requiredstring (date-time)
    desired_state requiredstring: running, stopped
    disk_limit_bytes requiredinteger (int64)File manager / SFTP / upload quota; 0 = unlimited
    existing requiredbooleanexternal_id was already provisioned: this is that game server (nothing was created)
    external_id requiredstring (nullable)The billing system's reference
    file_deny requiredarray of stringDeny globs added for this service (on top of the game definition's): matching paths are hidden from everyone except administrators
    game_id requiredstring
    has_rconbooleanThe game has a remote console (only on GET /services/{id})
    has_workshopbooleanThe game takes Steam Workshop mods (only on GET /services/{id})
    id requiredinteger (int64)
    installInstallProgressWhile installing / updating
    install_dir requiredstring
    installed requiredbooleanThe game files are in place
    ip requiredstring
    last_error requiredstringThe last command the agent refused, and why
    last_exit_code requiredinteger (nullable) (int32)
    max_players requiredinteger (nullable) (int32)
    memory_limit_bytes requiredinteger (int64)0 = unlimited
    memory_used_bytes requiredinteger (nullable) (int64)
    metrics_at requiredstring (nullable) (date-time)
    mods requiredobjectWorkshop items per modlist variable
    name requiredstring
    node_connected requiredbooleanThe node's agent link is up
    node_id requiredinteger (int64)
    node_name requiredstring
    node_os requiredstring: windows, linux
    observed_at requiredstring (nullable) (date-time)
    observed_message requiredstring
    observed_status requiredstringWhat the agent last reported
    os_user requiredstring
    owner_createdbooleanowner_email named no account: a customer account was created
    owner_passwordstringThe new customer account's generated password (only when none was given; shown once)
    owner_user_id requiredinteger (int64)
    owner_username requiredstring
    package_id requiredinteger (nullable) (int64)The package it was ordered with (null = none)
    permissionsarray of stringWhat the caller may do on this service (absent on WebSocket events)
    players requiredinteger (nullable) (int32)From the game's status query while it runs (null = unknown)
    portsarray of PortViewOnly on GET /services/{id}
    primary_port requiredinteger (nullable) (int32)
    process_count requiredinteger (nullable) (int32)
    processesarray of ProcessViewOnly on GET /services/{id}
    query_at requiredstring (nullable) (date-time)
    query_map requiredstring
    query_name requiredstringServer name the game reports
    restarts requiredinteger (int32)Crash restarts within the crash-policy window
    secret_variables requiredarray of stringPassword variables that have a value (values are never returned)
    sftpSFTPInfoHow the caller connects with SFTP (only on GET /services/{id}, with the files permission)
    slots requiredinteger (int32)
    status requiredstring: installing, install_failed, stopped, starting, running, stopping, crashed, suspended, moving, deleting
    steam_account_id requiredinteger (nullable) (int64)
    suspend_reason requiredstringWhy it was suspended (billing or an administrator)
    suspended requiredboolean
    variables requiredobject
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

GET /api/v1/services/{id}

A service with its ports, processes and the caller's permissions

ParameterInTypeDescription
id requiredpathinteger (int64)

Responses

  • 200 OK - View
    Fields
    FieldTypeDescription
    cpu_limit_percent requiredinteger (int32)0 = unlimited; 100 = one core
    cpu_percent requirednumber (nullable) (float)
    crash_policy requiredCrashPolicy
    created_at requiredstring (date-time)
    desired_state requiredstring: running, stopped
    disk_limit_bytes requiredinteger (int64)File manager / SFTP / upload quota; 0 = unlimited
    external_id requiredstring (nullable)The billing system's reference
    file_deny requiredarray of stringDeny globs added for this service (on top of the game definition's): matching paths are hidden from everyone except administrators
    game_id requiredstring
    has_rconbooleanThe game has a remote console (only on GET /services/{id})
    has_workshopbooleanThe game takes Steam Workshop mods (only on GET /services/{id})
    id requiredinteger (int64)
    installInstallProgressWhile installing / updating
    install_dir requiredstring
    installed requiredbooleanThe game files are in place
    ip requiredstring
    last_error requiredstringThe last command the agent refused, and why
    last_exit_code requiredinteger (nullable) (int32)
    max_players requiredinteger (nullable) (int32)
    memory_limit_bytes requiredinteger (int64)0 = unlimited
    memory_used_bytes requiredinteger (nullable) (int64)
    metrics_at requiredstring (nullable) (date-time)
    mods requiredobjectWorkshop items per modlist variable
    name requiredstring
    node_connected requiredbooleanThe node's agent link is up
    node_id requiredinteger (int64)
    node_name requiredstring
    node_os requiredstring: windows, linux
    observed_at requiredstring (nullable) (date-time)
    observed_message requiredstring
    observed_status requiredstringWhat the agent last reported
    os_user requiredstring
    owner_user_id requiredinteger (int64)
    owner_username requiredstring
    package_id requiredinteger (nullable) (int64)The package it was ordered with (null = none)
    permissionsarray of stringWhat the caller may do on this service (absent on WebSocket events)
    players requiredinteger (nullable) (int32)From the game's status query while it runs (null = unknown)
    portsarray of PortViewOnly on GET /services/{id}
    primary_port requiredinteger (nullable) (int32)
    process_count requiredinteger (nullable) (int32)
    processesarray of ProcessViewOnly on GET /services/{id}
    query_at requiredstring (nullable) (date-time)
    query_map requiredstring
    query_name requiredstringServer name the game reports
    restarts requiredinteger (int32)Crash restarts within the crash-policy window
    secret_variables requiredarray of stringPassword variables that have a value (values are never returned)
    sftpSFTPInfoHow the caller connects with SFTP (only on GET /services/{id}, with the files permission)
    slots requiredinteger (int32)
    status requiredstring: installing, install_failed, stopped, starting, running, stopping, crashed, suspended, moving, deleting
    steam_account_id requiredinteger (nullable) (int64)
    suspend_reason requiredstringWhy it was suspended (billing or an administrator)
    suspended requiredboolean
    variables requiredobject
  • 4xx/5xx error 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.

ParameterInTypeDescription
id requiredpathinteger (int64)

Request body application/json

FieldTypeDescription
disk_limit_bytesinteger (int64)Administrators: file manager / SFTP / upload quota; 0 = unlimited (min 0)
file_denyarray of stringAdministrators: deny globs for this service's file manager and SFTP (on top of the game's)
namestring(≤ 64 chars)
slotsinteger (int32)(min 0)
steam_account_idinteger (int64)Administrators; 0 = the vault's default (min 0)
variablesobject

Responses

  • 200 OK - UpdateOutBody
    Fields
    FieldTypeDescription
    cpu_limit_percent requiredinteger (int32)0 = unlimited; 100 = one core
    cpu_percent requirednumber (nullable) (float)
    crash_policy requiredCrashPolicy
    created_at requiredstring (date-time)
    desired_state requiredstring: running, stopped
    disk_limit_bytes requiredinteger (int64)File manager / SFTP / upload quota; 0 = unlimited
    external_id requiredstring (nullable)The billing system's reference
    file_deny requiredarray of stringDeny globs added for this service (on top of the game definition's): matching paths are hidden from everyone except administrators
    game_id requiredstring
    has_rconbooleanThe game has a remote console (only on GET /services/{id})
    has_workshopbooleanThe game takes Steam Workshop mods (only on GET /services/{id})
    id requiredinteger (int64)
    installInstallProgressWhile installing / updating
    install_dir requiredstring
    installed requiredbooleanThe game files are in place
    ip requiredstring
    last_error requiredstringThe last command the agent refused, and why
    last_exit_code requiredinteger (nullable) (int32)
    max_players requiredinteger (nullable) (int32)
    memory_limit_bytes requiredinteger (int64)0 = unlimited
    memory_used_bytes requiredinteger (nullable) (int64)
    metrics_at requiredstring (nullable) (date-time)
    mods requiredobjectWorkshop items per modlist variable
    mods_changed requiredbooleanRun the update action to download the new mods
    name requiredstring
    node_connected requiredbooleanThe node's agent link is up
    node_id requiredinteger (int64)
    node_name requiredstring
    node_os requiredstring: windows, linux
    observed_at requiredstring (nullable) (date-time)
    observed_message requiredstring
    observed_status requiredstringWhat the agent last reported
    os_user requiredstring
    owner_user_id requiredinteger (int64)
    owner_username requiredstring
    package_id requiredinteger (nullable) (int64)The package it was ordered with (null = none)
    permissionsarray of stringWhat the caller may do on this service (absent on WebSocket events)
    players requiredinteger (nullable) (int32)From the game's status query while it runs (null = unknown)
    portsarray of PortViewOnly on GET /services/{id}
    primary_port requiredinteger (nullable) (int32)
    process_count requiredinteger (nullable) (int32)
    processesarray of ProcessViewOnly on GET /services/{id}
    query_at requiredstring (nullable) (date-time)
    query_map requiredstring
    query_name requiredstringServer name the game reports
    restarts requiredinteger (int32)Crash restarts within the crash-policy window
    secret_variables requiredarray of stringPassword variables that have a value (values are never returned)
    sftpSFTPInfoHow the caller connects with SFTP (only on GET /services/{id}, with the files permission)
    slots requiredinteger (int32)
    status requiredstring: installing, install_failed, stopped, starting, running, stopping, crashed, suspended, moving, deleting
    steam_account_id requiredinteger (nullable) (int64)
    suspend_reason requiredstringWhy it was suspended (billing or an administrator)
    suspended requiredboolean
    variables requiredobject
  • 4xx/5xx error 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.

ParameterInTypeDescription
id requiredpathinteger (int64)

Responses

  • 202 Accepted
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

POST /api/v1/services/{id}/console

Send a line to the service's console (stdin of the main process)

ParameterInTypeDescription
id requiredpathinteger (int64)

Request body application/json

FieldTypeDescription
line requiredstring(≤ 1024 chars)

Responses

  • 204 No Content
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

GET /api/v1/services/{id}/metrics

The service's CPU and memory samples (at most the last 24 hours)

ParameterInTypeDescription
id requiredpathinteger (int64)
sincequerystring (date-time)Default: one hour ago

Responses

  • 200 OK - Get-service-metricsResponse
    Fields
    FieldTypeDescription
    items requiredarray of ServiceMetricSample
  • 4xx/5xx error 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.

ParameterInTypeDescription
id requiredpathinteger (int64)

Request body application/json

FieldTypeDescription
command requiredstring(≤ 512 chars)

Responses

  • 200 OK - RconReply
    Fields
    FieldTypeDescription
    at requiredstring (date-time)
    output requiredstring
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

GET /api/v1/services/{id}/subusers

Accounts that have access to this game server (sub-users)

ParameterInTypeDescription
id requiredpathinteger (int64)

Responses

  • 200 OK - GrantsOutBody
    Fields
    FieldTypeDescription
    items requiredarray of Grant
  • 4xx/5xx error 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.

ParameterInTypeDescription
id requiredpathinteger (int64)

Request body application/json

FieldTypeDescription
email requiredstring(≤ 254 chars)
permissions requiredarray of stringview, control, console, files, config, mods, schedule, backups, settings, subusers, reinstall

Responses

  • 200 OK - GrantResult
    Fields
    FieldTypeDescription
    account_created requiredbooleanNo account had this e-mail address: a sub-user account was created
    created_at requiredstring (date-time)
    display_name requiredstring
    email requiredstring
    one_time_passwordstringThe new account's password (shown once; it must be changed at the first sign-in)
    permissions requiredarray of string
    role requiredstring
    status requiredstring
    updated_at requiredstring (date-time)
    user_id requiredinteger (int64)
    username requiredstring
  • 4xx/5xx error 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)

ParameterInTypeDescription
id requiredpathinteger (int64)
user_id requiredpathinteger (int64)

Responses

  • 204 No Content
  • 4xx/5xx error 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).

ParameterInTypeDescription
id requiredpathinteger (int64)
action requiredpathstring: start, stop, restart, kill, update, reinstall, cancel_install, suspend, unsuspend

Request body application/json

FieldTypeDescription
reasonstringsuspend: why (e.g. Overdue on Payment); shown to the customer (≤ 200 chars)

Responses

  • 200 OK - View
    Fields
    FieldTypeDescription
    cpu_limit_percent requiredinteger (int32)0 = unlimited; 100 = one core
    cpu_percent requirednumber (nullable) (float)
    crash_policy requiredCrashPolicy
    created_at requiredstring (date-time)
    desired_state requiredstring: running, stopped
    disk_limit_bytes requiredinteger (int64)File manager / SFTP / upload quota; 0 = unlimited
    external_id requiredstring (nullable)The billing system's reference
    file_deny requiredarray of stringDeny globs added for this service (on top of the game definition's): matching paths are hidden from everyone except administrators
    game_id requiredstring
    has_rconbooleanThe game has a remote console (only on GET /services/{id})
    has_workshopbooleanThe game takes Steam Workshop mods (only on GET /services/{id})
    id requiredinteger (int64)
    installInstallProgressWhile installing / updating
    install_dir requiredstring
    installed requiredbooleanThe game files are in place
    ip requiredstring
    last_error requiredstringThe last command the agent refused, and why
    last_exit_code requiredinteger (nullable) (int32)
    max_players requiredinteger (nullable) (int32)
    memory_limit_bytes requiredinteger (int64)0 = unlimited
    memory_used_bytes requiredinteger (nullable) (int64)
    metrics_at requiredstring (nullable) (date-time)
    mods requiredobjectWorkshop items per modlist variable
    name requiredstring
    node_connected requiredbooleanThe node's agent link is up
    node_id requiredinteger (int64)
    node_name requiredstring
    node_os requiredstring: windows, linux
    observed_at requiredstring (nullable) (date-time)
    observed_message requiredstring
    observed_status requiredstringWhat the agent last reported
    os_user requiredstring
    owner_user_id requiredinteger (int64)
    owner_username requiredstring
    package_id requiredinteger (nullable) (int64)The package it was ordered with (null = none)
    permissionsarray of stringWhat the caller may do on this service (absent on WebSocket events)
    players requiredinteger (nullable) (int32)From the game's status query while it runs (null = unknown)
    portsarray of PortViewOnly on GET /services/{id}
    primary_port requiredinteger (nullable) (int32)
    process_count requiredinteger (nullable) (int32)
    processesarray of ProcessViewOnly on GET /services/{id}
    query_at requiredstring (nullable) (date-time)
    query_map requiredstring
    query_name requiredstringServer name the game reports
    restarts requiredinteger (int32)Crash restarts within the crash-policy window
    secret_variables requiredarray of stringPassword variables that have a value (values are never returned)
    sftpSFTPInfoHow the caller connects with SFTP (only on GET /services/{id}, with the files permission)
    slots requiredinteger (int32)
    status requiredstring: installing, install_failed, stopped, starting, running, stopping, crashed, suspended, moving, deleting
    steam_account_id requiredinteger (nullable) (int64)
    suspend_reason requiredstringWhy it was suspended (billing or an administrator)
    suspended requiredboolean
    variables requiredobject
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

Settings

GET /api/v1/settings

Read panel settings

Responses

  • 200 OK - Settings
    Fields
    FieldTypeDescription
    branding requiredBranding
    security requiredSecurity
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

PUT /api/v1/settings

Replace panel settings (SuperAdmin)

Request body application/json

FieldTypeDescription
branding requiredBranding
security requiredSecurity

Responses

  • 200 OK - Settings
    Fields
    FieldTypeDescription
    branding requiredBranding
    security requiredSecurity
  • 4xx/5xx error 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

  • 200 OK - SetupStatus
    Fields
    FieldTypeDescription
    active requiredbooleanThe controller waits for its first-run setup
    allowed requiredbooleanThis request may run the setup (a right token, or a local request)
    builtin_databaseBuiltinDB
    local_agentbooleanThe NGCP agent is installed on this server (the setup can make it a game node)
    osstring
    suggested_public_urlstringThe address this page was opened with
    versionstring
  • 4xx/5xx error 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

FieldTypeDescription
admin_email requiredstring(≤ 254 chars)
admin_password requiredstring(≤ 1024 chars)
admin_username requiredstring(≤ 64 chars)
database_mode requiredstring: builtin, external
database_urlstring(≤ 2000 chars)
grpc_advertisestringhost:port agents dial (default: the public URL's host, port 8443) (≤ 255 chars)
local_nodebooleanAlso run game servers on this server: the NGCP agent installed here joins the panel by itself
local_node_namestringThe game node's name (default: this computer's name) (≤ 64 chars)
public_url requiredstringHow browsers and agents reach the panel (≤ 255 chars)
tls_cert_filestring(≤ 1024 chars)
tls_key_filestring(≤ 1024 chars)
tls_mode requiredstring: none, files, self-signednone: plain HTTP, or TLS ends at a reverse proxy
tokenstring(≤ 100 chars)

Responses

  • 200 OK - Result
    Fields
    FieldTypeDescription
    existing_admins requiredbooleanThe database already had accounts; no new administrator was created
    local_nodestringName of the game node this server joins as (the local agent enrolls within seconds)
    login_url requiredstring
  • 4xx/5xx error 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

FieldTypeDescription
tokenstringNot needed from the server itself (localhost) (≤ 100 chars)

Responses

  • 200 OK - SetupStatus
    Fields
    FieldTypeDescription
    active requiredbooleanThe controller waits for its first-run setup
    allowed requiredbooleanThis request may run the setup (a right token, or a local request)
    builtin_databaseBuiltinDB
    local_agentbooleanThe NGCP agent is installed on this server (the setup can make it a game node)
    osstring
    suggested_public_urlstringThe address this page was opened with
    versionstring
  • 4xx/5xx error 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

FieldTypeDescription
tokenstring(≤ 100 chars)
url requiredstringpostgres://user:password@host:5432/dbname?sslmode=... (≤ 2000 chars)

Responses

  • 204 No Content
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

Steam accounts

GET /api/v1/steam-accounts

Steam accounts SteamCMD logs in with (passwords are never returned)

Responses

  • 200 OK - List-steam-accountsResponse
    Fields
    FieldTypeDescription
    items requiredarray of SteamAccount
  • 4xx/5xx error 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

FieldTypeDescription
is_defaultboolean
label requiredstring(≤ 64 chars)
passwordstringWrite-only; leave empty to keep the stored one (≤ 128 chars)
username requiredstring(≤ 64 chars)

Responses

  • 201 Created - SteamAccount
    Fields
    FieldTypeDescription
    created_at requiredstring (date-time)
    id requiredinteger (int64)
    is_default requiredboolean
    label requiredstring
    service_count requiredinteger (int64)
    updated_at requiredstring (date-time)
    username requiredstring
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

PUT /api/v1/steam-accounts/{id}

Change a Steam account

ParameterInTypeDescription
id requiredpathinteger (int64)

Request body application/json

FieldTypeDescription
is_defaultboolean
label requiredstring(≤ 64 chars)
passwordstringWrite-only; leave empty to keep the stored one (≤ 128 chars)
username requiredstring(≤ 64 chars)

Responses

  • 200 OK - SteamAccount
    Fields
    FieldTypeDescription
    created_at requiredstring (date-time)
    id requiredinteger (int64)
    is_default requiredboolean
    label requiredstring
    service_count requiredinteger (int64)
    updated_at requiredstring (date-time)
    username requiredstring
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

DELETE /api/v1/steam-accounts/{id}

Remove a Steam account (its services use the default account)

ParameterInTypeDescription
id requiredpathinteger (int64)

Responses

  • 204 No Content
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

Users

GET /api/v1/users

List users

ParameterInTypeDescription
cursorquerystring
limitqueryinteger (int32)
searchquerystringMatches username, email or display name
rolequerystring: superadmin, admin, reseller, user, subuser

Responses

  • 200 OK - PageUser
    Fields
    FieldTypeDescription
    items requiredarray of User
    next_cursor requiredstringPass as ?cursor= to get the next page; empty when there are no more
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

POST /api/v1/users

Create a user

Request body application/json

FieldTypeDescription
denied_permissionsarray of string
display_namestring(≤ 100 chars)
email requiredstring(≤ 254 chars)
extra_permissionsarray of string
must_change_passwordboolean
password requiredstring(≤ 1024 chars)
reseller_idinteger (int64)Admins only; resellers' new users always belong to them
role requiredstring: superadmin, admin, reseller, user, subuser
statusstring: active, suspended, disabled
username requiredstring3-32 characters: lower-case letters, digits, '-' and '_' (not first). Upper case is lower-cased. (≤ 32 chars)

Responses

  • 201 Created - User
    Fields
    FieldTypeDescription
    created_at requiredstring (date-time)
    denied_permissions requiredarray of string
    display_name requiredstring
    email requiredstring
    extra_permissions requiredarray of string
    id requiredinteger (int64)
    last_login_at requiredstring (nullable) (date-time)
    last_login_ip requiredstring (nullable)
    locked_until requiredstring (nullable) (date-time)
    must_change_password requiredboolean
    reseller_id requiredinteger (nullable) (int64)
    role requiredstring: superadmin, admin, reseller, user, subuser
    status requiredstring: active, suspended, disabled
    totp_enabled requiredboolean
    updated_at requiredstring (date-time)
    username requiredstring
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

GET /api/v1/users/{id}

Get a user

ParameterInTypeDescription
id requiredpathinteger (int64)

Responses

  • 200 OK - User
    Fields
    FieldTypeDescription
    created_at requiredstring (date-time)
    denied_permissions requiredarray of string
    display_name requiredstring
    email requiredstring
    extra_permissions requiredarray of string
    id requiredinteger (int64)
    last_login_at requiredstring (nullable) (date-time)
    last_login_ip requiredstring (nullable)
    locked_until requiredstring (nullable) (date-time)
    must_change_password requiredboolean
    reseller_id requiredinteger (nullable) (int64)
    role requiredstring: superadmin, admin, reseller, user, subuser
    status requiredstring: active, suspended, disabled
    totp_enabled requiredboolean
    updated_at requiredstring (date-time)
    username requiredstring
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

PATCH /api/v1/users/{id}

Update a user

ParameterInTypeDescription
id requiredpathinteger (int64)

Request body application/json

FieldTypeDescription
denied_permissionsarray of string
display_namestring(≤ 100 chars)
emailstring(≤ 254 chars)
extra_permissionsarray of string
rolestring: superadmin, admin, reseller, user, subuser
statusstring: active, suspended, disabled
usernamestring(≤ 32 chars)

Responses

  • 200 OK - User
    Fields
    FieldTypeDescription
    created_at requiredstring (date-time)
    denied_permissions requiredarray of string
    display_name requiredstring
    email requiredstring
    extra_permissions requiredarray of string
    id requiredinteger (int64)
    last_login_at requiredstring (nullable) (date-time)
    last_login_ip requiredstring (nullable)
    locked_until requiredstring (nullable) (date-time)
    must_change_password requiredboolean
    reseller_id requiredinteger (nullable) (int64)
    role requiredstring: superadmin, admin, reseller, user, subuser
    status requiredstring: active, suspended, disabled
    totp_enabled requiredboolean
    updated_at requiredstring (date-time)
    username requiredstring
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

DELETE /api/v1/users/{id}

Delete a user (ends their sessions and API keys)

ParameterInTypeDescription
id requiredpathinteger (int64)

Responses

  • 204 No Content
  • 4xx/5xx error 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.

ParameterInTypeDescription
id requiredpathinteger (int64)

Request body application/json

FieldTypeDescription
must_change_passwordbooleanForce a change at next sign-in
password requiredstring(≤ 1024 chars)

Responses

  • 204 No Content
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

DELETE /api/v1/users/{id}/totp

Turn off a user's two-factor authentication (lost device)

ParameterInTypeDescription
id requiredpathinteger (int64)

Responses

  • 204 No Content
  • 4xx/5xx error envelope {"error":{"code","message","details"}}

POST /api/v1/users/{id}/unlock

Clear a sign-in lockout

ParameterInTypeDescription
id requiredpathinteger (int64)

Responses

  • 204 No Content
  • 4xx/5xx error envelope {"error":{"code","message","details"}}