Zum Inhalt springen
Aktueller Gutschein:10 % RabattIn der Bestellung einlösen

API für eigene Panels und Reselling

Verwalten Sie Ihre Dienste aus Ihrem eigenen System: dieselben Funktionen wie im Kundenkonto, mit Schlüsseln und Berechtigungen, die Sie selbst festlegen.

Wofür die API da ist

Die API ist für alle, die StormHost-Dienste aus ihrer eigenen Umgebung steuern möchten: Reseller mit eigenem Panel für ihre Kunden, Firmen mit internen Werkzeugen oder Entwickler, die Serverneustarts, Backups oder DNS per Skript erledigen wollen.

Über die API funktioniert fast alles, was Sie im Kundenkonto tun: Starten und Neustart, Statistiken, Neuinstallation, Firewall, rDNS, Backups, Dateien, Datenbanken, Einstellungen von Gameservern und Minecraft, Discord-Bots, Domain-DNS, Paketwechsel, Verlängerungen und Zahlung mit Guthaben.

Ein Schlüssel handelt in Ihrem Namen, aber nur im Rahmen der erteilten Berechtigungen. Bei einem Dienst, den jemand mit Ihnen teilt, gelten zusätzlich die Berechtigungen, die Ihnen der Eigentümer gegeben hat.

Schnellstart

  1. Öffnen Sie im Kundenkonto die Kontoeinstellungen, Reiter API-Schlüssel, und erstellen Sie einen Schlüssel. Wählen Sie Namen, Berechtigungen, optional die Dienste und IP-Adressen, von denen Sie ihn nutzen, und die Gültigkeit. Die Erstellung bestätigen Sie mit einem Code aus der App oder Ihrem Passwort.
  2. Der Schlüssel wird nur einmal angezeigt. Kopieren Sie ihn und bewahren Sie ihn sicher auf, zum Beispiel in einer Umgebungsvariable auf Ihrem Server. Wir speichern nur seinen Fingerabdruck und können ihn nicht erneut anzeigen.
  3. Probieren Sie die erste Anfrage. Der Endpunkt /api/v1/key liefert Informationen zum Schlüssel und funktioniert mit jedem gültigen Schlüssel:
curl https://stormhost.eu/api/v1/key \
  -H "Authorization: Bearer shk_…"

Authentifizierung

  • Jede Anfrage sendet den Schlüssel im Header Authorization als Bearer shk_… (alternativ geht auch der Header X-API-Key).
  • Die API verwendet keine Cookies. Anfragen mit dem Login-Cookie des Kundenkontos werden abgelehnt, sodass der Schlüssel nicht aus einem Browser missbraucht werden kann.
  • Legen Sie den Schlüssel nie in Code, der im Browser oder in einer mobilen App läuft. Er gehört nur auf Ihren Server.
  • Nach einer Passwortänderung oder -zurücksetzung und bei einer Kontosperre funktionieren bestehende Schlüssel nicht mehr. Erstellen Sie dann neue.
Authorization: Bearer shk_ab12cd34ef56_…

Berechtigungen

Geben Sie einem Schlüssel nur die Berechtigungen, die er wirklich braucht. Fehlt eine Berechtigung, antwortet die API mit 403, Code insufficient_scope und der benötigten Berechtigung im Feld requiredScope.

BerechtigungWas sie erlaubt
account:readKontodaten (nur lesen)
services:readDienstliste, Status und Statistiken
services:powerStarten, stoppen, neu starten
services:consoleKonsole
services:networkNetzwerk: rDNS, privates Netz, Adressen
services:firewallFirewall
services:filesDateien, Welten, Plugins und Mods
services:databaseDatenbanken
services:backupsBackups und Wiederherstellung
services:settingsDiensteinstellungen (Spiele, Bots, Planer, Warnungen, ISO)
services:secretsSensibel: Neuinstallation, Passwörter, SFTP, Domain-Transfercodenur mit IP-Beschränkung
domains:readDNS-Einträge (nur lesen)
domains:writeDNS-Einträge und Nameserver (Änderungen)
billing:readBelege und Guthaben (nur lesen)
billing:writeÄnderungsbestellungen, Verlängerungen und Zahlung mit Guthaben

Beschränkung auf Dienste und IP-Adressen

Sie können einen Schlüssel auf ausgewählte Dienste beschränken. Andere Dienste erreicht er dann nicht, und die API antwortet mit 404, als gäbe es sie nicht. Ohne Beschränkung gilt er für alle Ihre Dienste, auch künftige.

Sie können einen Schlüssel auf IP-Adressen oder Bereiche beschränken (z. B. 203.0.113.10 oder 203.0.113.0/24, höchstens 20). Von anderen Adressen antwortet die API mit 403 und dem Code ip_not_allowed. Die sensible Berechtigung services:secrets setzt diese Beschränkung voraus.

Die Gültigkeit wählen Sie bei der Erstellung (30 bis 365 Tage oder unbegrenzt). Sie können einen Schlüssel jederzeit widerrufen, er verliert sofort seine Gültigkeit.

Anfragen und Antworten

  • Die Adresse der API ist https://stormhost.eu/api/v1. Alle Antworten sind JSON in UTF-8, außer Datei- und PDF-Downloads.
  • Senden Sie Anfragen mit Inhalt (POST, PUT, PATCH, DELETE) als JSON mit dem Header Content-Type: application/json.
  • Die Sprache der Meldungen wählen Sie mit ?locale=cs, en, sk, pl oder de, bei Schreibzugriffen auch mit dem Feld locale im Inhalt. Ohne Angabe antworten wir auf Tschechisch.
  • Die Dienstkennung {id} finden Sie in der Dienstliste (GET /api/v1/services) oder in der Adresse des Dienstes im Kundenkonto.
  • Eine erfolgreiche Antwort hat den Status 200. Ein Fehler hat den Status 4xx oder 5xx mit dem Feld error (Text für Menschen) und meist auch code (maschinenlesbar).
{
  "error": "This API key lacks the services:power scope.",
  "code": "insufficient_scope",
  "requiredScope": "services:power"
}

Fehler

Fehler, die bei allen Funktionen auftreten können. Funktionsspezifische Fehler stehen bei der jeweiligen Funktion in der Übersicht.

StatusCodeBedeutung
400cookies_not_allowedDie Anfrage enthält Cookies. Die API wird nur mit einem Schlüssel genutzt.
401missing_keyDer Header Authorization mit dem Schlüssel fehlt.
401invalid_keyDer Schlüssel ist ungültig, abgelaufen oder widerrufen.
403ip_not_allowedDer Schlüssel kann von dieser IP-Adresse nicht verwendet werden.
403insufficient_scopeDem Schlüssel fehlt die nötige Berechtigung (Feld requiredScope).
403email_unverifiedDie E-Mail-Adresse des Kontos ist nicht bestätigt.
404not_foundUnbekannte Adresse oder ein Dienst, auf den der Schlüssel keinen Zugriff hat.
400—Die Funktion passt nicht zu diesem Diensttyp (z. B. Minecraft-Einstellungen bei einem VPS).
409—Der Dienst ist nicht aktiv (Einrichtung ausstehend, gesperrt oder beendet).
405method_not_allowedMethode nicht erlaubt, der Header Allow nennt die erlaubten.
429rate_limitedLimit überschritten, erneut versuchen nach der Zeit im Header Retry-After.
503unavailableVorübergehend nicht verfügbar, bitte gleich noch einmal versuchen.

Limits

  • Ein Schlüssel darf höchstens 300 Anfragen pro Minute senden (alle Funktionen zusammen).
  • Manche Funktionen haben ein eigenes, strengeres Limit wie im Kundenkonto, zum Beispiel Starten und Neustart eines Dienstes 5 pro Minute.
  • Wird ein Limit überschritten, antwortet die API mit 429, und der Header Retry-After nennt die Wartezeit in Sekunden. Wiederholt ungültige Schlüssel von einer IP-Adresse werden zeitweise gesperrt.
  • Ein Konto kann höchstens 20 aktive Schlüssel haben.

Codebeispiele

Die Beispiele prüfen den Schlüssel und listen die Dienste auf. Sie lesen den Schlüssel aus der Umgebungsvariable STORMHOST_API_KEY. Ein typischer Ablauf für Reseller: Dienste auflisten, Status prüfen und den Dienst bei Bedarf neu starten.

curl

curl https://stormhost.eu/api/v1/key \
  -H "Authorization: Bearer $STORMHOST_API_KEY"

curl "https://stormhost.eu/api/v1/services?status=active" \
  -H "Authorization: Bearer $STORMHOST_API_KEY"

curl -X POST https://stormhost.eu/api/v1/services/SERVICE_ID/power \
  -H "Authorization: Bearer $STORMHOST_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"action":"restart"}'

JavaScript (Node.js)

const API = "https://stormhost.eu/api/v1";
const headers = { Authorization: `Bearer ${process.env.STORMHOST_API_KEY}` };

const res = await fetch(`${API}/services`, { headers });
if (!res.ok) throw new Error((await res.json()).error);
const { data } = await res.json();

for (const s of data) console.log(s.id, s.name, s.status);

await fetch(`${API}/services/${data[0].id}/power`, {
  method: "POST",
  headers: { ...headers, "Content-Type": "application/json" },
  body: JSON.stringify({ action: "restart" }),
});

PHP

<?php
$api = "https://stormhost.eu/api/v1";
$key = getenv("STORMHOST_API_KEY");

function call(string $method, string $url, string $key, ?array $body = null): array {
    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_CUSTOMREQUEST => $method,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => ["Authorization: Bearer $key", "Content-Type: application/json"],
        CURLOPT_POSTFIELDS => $body ? json_encode($body) : null,
    ]);
    $out = json_decode(curl_exec($ch), true);
    curl_close($ch);
    return $out;
}

$services = call("GET", "$api/services", $key)["data"];
call("POST", "$api/services/{$services[0]['id']}/power", $key, ["action" => "restart"]);

Python

import os, requests

API = "https://stormhost.eu/api/v1"
s = requests.Session()
s.headers["Authorization"] = f"Bearer {os.environ['STORMHOST_API_KEY']}"

services = s.get(f"{API}/services").json()["data"]
for svc in services:
    print(svc["id"], svc["name"], svc["status"])

r = s.post(f"{API}/services/{services[0]['id']}/power", json={"action": "restart"})
r.raise_for_status()

Funktionsübersicht

Zu jeder Funktion gibt es Methode, Adresse, nötige Berechtigung, Parameter und eine Beispielantwort. Die Werte in den Beispielen sind erfunden.

Schlüssel und Konto

GET/keyAngaben zum API-Schlüssel

Gibt Name, Berechtigungen, Einschränkung auf Dienste und IP-Adressen sowie die Gültigkeit des Schlüssels zurück. Braucht keine Berechtigung und eignet sich zum Prüfen des Schlüssels.

Berechtigung: –

Beispielantwort

{
  "name": "Můj panel",
  "key": "shk_a1b2c3d4_…",
  "scopes": [
    "services:read",
    "services:power"
  ],
  "serviceIds": [],
  "allowedIps": [
    "203.0.113.10"
  ],
  "expiresAt": null,
  "createdAt": "2026-10-01T08:00:00.000Z"
}

Mögliche Fehler

  • 401invalid_key Der Schlüssel ist ungültig, abgelaufen oder widerrufen.
GET/meKontodaten

Gibt die Grunddaten des Kontos zurück, zu dem der Schlüssel gehört: E-Mail, Name, Firma, Firmennummer, USt-IdNr. und Land.

Berechtigung: account:read

Beispielantwort

{
  "id": "clx9k2m4p0000cus01abcdef",
  "email": "[email protected]",
  "firstName": "Jan",
  "lastName": "Novák",
  "companyName": null,
  "ico": null,
  "dic": null,
  "country": "CZ",
  "emailVerified": true,
  "createdAt": "2026-03-12T09:30:00.000Z"
}

Mögliche Fehler

  • 401invalid_key Das Konto des Schlüssels wurde nicht gefunden.

Dienste

GET/overview/metricsAktuelle Dienstmetriken

Gibt den aktuellen Zustand und die Auslastung von bis zu 8 Diensten auf einmal zurück: bei VPS und Gameservern Stromzustand, CPU, Arbeitsspeicher und Laufzeit, bei Minecraft die Spieler, bei Rackhousing die Leistungsaufnahme, bei Domains das Ablaufdatum. Lassen sich keine Daten ermitteln, hat der Dienst state: unavailable mit dem Grund in reason.

Berechtigung: services:read

Parameter in der Adresse

NameTypPflichtBeschreibung
idsstringneinKommagetrennte Dienst-IDs, höchstens 8. Ohne den Parameter kommen die ersten 8 Dienste zurück. Unbekannte IDs werden stillschweigend übersprungen. Ein auf bestimmte Dienste beschränkter Schlüssel darf nur deren IDs senden.
localestringneinSprache der Fehlermeldungen: cs, en, sk, pl oder de. Standard ist cs.

Beispielantwort

{
  "at": "2026-11-07T10:00:00.000Z",
  "ttlMs": 2500,
  "truncated": false,
  "services": [
    {
      "serviceId": "clx9k2m4p0000svc01abcdef",
      "sampledAt": "2026-11-07T09:59:58.000Z",
      "kind": "vps",
      "state": "ok",
      "power": "running",
      "cpuPercent": 12.5,
      "cpuAt": "2026-11-07T09:59:00.000Z",
      "memUsedMib": 1536,
      "memTotalMib": 4096,
      "uptimeSeconds": 864000,
      "cpuSeries": [
        {
          "t": 1794045540000,
          "v": 11.2
        },
        {
          "t": 1794045600000,
          "v": 12.5
        }
      ]
    },
    {
      "serviceId": "clx9k2m4p0001svc02abcdef",
      "sampledAt": "2026-11-07T09:59:58.000Z",
      "kind": "game",
      "state": "ok",
      "power": "running",
      "cpuPercent": 34.1,
      "memUsedMib": 2900,
      "memTotalMib": 6144,
      "uptimeSeconds": 7200,
      "players": {
        "state": "ok",
        "online": 5,
        "max": 20,
        "at": "2026-11-07T09:55:00.000Z",
        "stale": false
      }
    },
    {
      "serviceId": "clx9k2m4p0002svc03abcdef",
      "sampledAt": "2026-11-07T09:59:58.000Z",
      "kind": "domain",
      "state": "ok",
      "expiresOn": "2027-05-01"
    },
    {
      "serviceId": "clx9k2m4p0003svc04abcdef",
      "sampledAt": "2026-11-07T09:59:58.000Z",
      "kind": "vps",
      "state": "unavailable",
      "reason": "provider"
    }
  ]
}

Mögliche Fehler

  • 404not_found Der Schlüssel ist auf bestimmte Dienste beschränkt und ids enthält einen anderen Dienst.
  • 429rate_limited Limit von 40 Anfragen pro Minute überschritten.
  • 503unavailable Die Dienstliste kann gerade nicht geladen werden. Versuchen Sie es in ein paar Sekunden erneut.
GET/servicesDienste auflisten

Gibt Ihre Dienste und mit Ihnen geteilte Dienste zurück (Rolle member, ohne Preis und mit Ihren Berechtigungen). Ein auf bestimmte Dienste beschränkter Schlüssel sieht nur diese.

Berechtigung: services:read

Parameter in der Adresse

NameTypPflichtBeschreibung
statusstringneinFilter nach Status: PENDING, ACTIVE, SUSPENDED oder TERMINATED (Groß- und Kleinschreibung egal).
localestringneinSprache der Dienstnamen: cs, en, sk, pl oder de. Standard ist cs.

Beispielantwort

{
  "data": [
    {
      "id": "clx9k2m4p0000svc01abcdef",
      "name": "VPS Start",
      "type": "VPS",
      "kind": "vps",
      "status": "ACTIVE",
      "role": "owner",
      "plan": "vps-start",
      "address": "203.0.113.25",
      "priceCzk": 249,
      "currency": "CZK",
      "expiresAt": "2026-12-01T00:00:00.000Z",
      "createdAt": "2026-06-01T10:00:00.000Z"
    },
    {
      "id": "clx9k2m4p0001svc02abcdef",
      "name": "Minecraft server",
      "type": "GAME_SERVER",
      "kind": "game",
      "status": "ACTIVE",
      "role": "member",
      "permissions": [
        "power",
        "console"
      ],
      "plan": null,
      "address": "mc.example.com",
      "priceCzk": null,
      "currency": "CZK",
      "expiresAt": "2026-11-20T00:00:00.000Z",
      "createdAt": "2026-08-15T12:00:00.000Z"
    }
  ]
}
GET/services/{id}Dienstdetails

Gibt einen Dienst im gleichen Format wie die Dienstliste zurück. Funktioniert auch für gesperrte und beendete Dienste.

Berechtigung: services:read

Parameter in der Adresse

NameTypPflichtBeschreibung
localestringneinSprache des Dienstnamens und der Fehlermeldungen: cs, en, sk, pl oder de. Standard ist cs.

Beispielantwort

{
  "data": {
    "id": "clx9k2m4p0000svc01abcdef",
    "name": "VPS Start",
    "type": "VPS",
    "kind": "vps",
    "status": "ACTIVE",
    "role": "owner",
    "plan": "vps-start",
    "address": "203.0.113.25",
    "priceCzk": 249,
    "currency": "CZK",
    "expiresAt": "2026-12-01T00:00:00.000Z",
    "createdAt": "2026-06-01T10:00:00.000Z"
  }
}

Mögliche Fehler

  • 404 Der Dienst existiert nicht, gehört Ihnen nicht oder der Schlüssel hat keinen Zugriff darauf.
  • 400 Diese Art von Dienst wird von der API nicht unterstützt.
  • 403mfa_required Der Inhaber des geteilten Dienstes verlangt eine Zwei-Faktor-Authentifizierung, die in Ihrem Konto nicht aktiviert ist.

Dienste allgemein

POST/services/{id}/console-tokenToken für die Konsolenverbindung

Stellt ein einmaliges, 30 s gültiges Token für den Konsolen-Websocket eines VPS (VNC oder Terminal) oder Gameservers aus. Eine mit einem API-Token geöffnete Konsole läuft höchstens etwa eine Minute; nur aktive Dienste, Limit 10 pro Minute.

Berechtigung: services:console

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
modestringjaNur VPS: vnc oder term. Bei Gameservern ignoriert.

Beispielinhalt

{
  "mode": "vnc"
}

Beispielantwort

{
  "token": "eyJhbGciOi…example",
  "password": "example-rfb-ticket"
}

Mögliche Fehler

  • 400 Beim VPS fehlt mode oder ist ungültig.
  • 403 Fehlende Berechtigung Konsole beim geteilten Dienst.
  • 404 Dienst nicht gefunden oder ohne Konsole.
  • 409 Der Dienst ist nicht aktiv oder der VPS ist gesperrt (Wiederherstellung).
  • 412NOT_PROVISIONED Der Server ist noch nicht bereit.
  • 429 Mehr als 10 Token pro Minute.
GET/services/{id}/crashAbsturz- und Loganalyse des Servers

Analysiert Log, Crash-Report oder Konsolenausgabe eines Gameservers oder Bots und liefert Befunde mit Lösungsvorschlägen. Ändert nichts am Server; Befunde enthalten id und Parameter, keine fertigen Texte. Limit 10 Analysen pro Minute je Dienst.

Berechtigung: services:read

Parameter in der Adresse

NameTypPflichtBeschreibung
sourcestringneinauto (Standard), latest, crash-report, console oder file.
namestringneinDatei für source=file, z. B. logs/latest.log, crash-reports/crash-….txt oder hs_err_pid….log (max. 120 Zeichen).
liststringneinfiles liefert die Liste analysierbarer Dateien (höchstens 50).
langstringneinSprache der Meldungen: cs, en, sk, pl oder de.
tplstringnein1 = auch Vorschläge zulassen, die einen festen Konsolenbefehl senden.

Beispielantwort

{
  "result": {
    "v": 1,
    "kind": "mc",
    "findings": [
      {
        "id": "mc.oom",
        "sev": "critical",
        "p": {
          "heapMb": 2048
        },
        "evidence": [
          {
            "line": 412,
            "text": "java.lang.OutOfMemoryError: Java heap space"
          }
        ],
        "fix": {
          "type": "recalc-memory"
        },
        "alt": [
          {
            "type": "upgrade"
          }
        ]
      }
    ],
    "rootCause": {
      "cls": "java.lang.OutOfMemoryError",
      "msg": "Java heap space",
      "line": 412
    },
    "stats": {
      "lines": 1830,
      "truncated": false,
      "ms": 42,
      "timedOut": false,
      "crashReport": false
    }
  },
  "sources": [
    {
      "kind": "log",
      "name": "logs/latest.log",
      "mtime": 1762508000,
      "truncated": false
    }
  ]
}

Mögliche Fehler

  • 400bad-request Ungültiger Parameter. Code bad-name: Diese Datei kann nicht analysiert werden.
  • 403forbidden Fehlende Berechtigung Konsole oder Dateien beim geteilten Dienst.
  • 404no-source Kein Log gefunden, der Server ist evtl. noch nicht gelaufen.
  • 412not-ready Der Server ist noch nicht bereit.
  • 413too-large Das Log ist zu groß für die Analyse (über 16 MiB).
  • 429rate Limit überschritten. Code busy: Gerade werden andere Server analysiert.
  • 502failed Das Log konnte nicht geladen werden.
GET/services/{id}/databaseDatenbankserver auf dem VPS und Übersicht

Erkennt, ob auf dem VPS MariaDB/MySQL oder PostgreSQL läuft, und liefert nach dem Verbinden Version, Datenbanken und Benutzer. Nur VPS.

Berechtigung: services:database

Parameter in der Adresse

NameTypPflichtBeschreibung
localestringneinSprache des Grundes in connectError: cs, en, sk, pl oder de.

Beispielantwort

{
  "detection": {
    "mysql": {
      "installed": true,
      "listening": true
    },
    "postgres": {
      "installed": false,
      "listening": false
    },
    "os": {
      "id": "debian",
      "like": "",
      "name": "Debian GNU/Linux 12 (bookworm)"
    },
    "canAutoInstall": true,
    "install": {
      "running": false,
      "engine": null,
      "exitCode": null,
      "logTail": null
    }
  },
  "config": {
    "engine": "mysql",
    "port": 3306,
    "username": "stormhost_panel",
    "auto": true
  },
  "overview": {
    "version": "10.11.6-MariaDB",
    "databases": [
      {
        "name": "shop",
        "sizeBytes": 5242880,
        "tables": 14,
        "system": false
      }
    ],
    "users": [
      {
        "name": "shop",
        "host": "localhost",
        "databases": [
          "shop"
        ],
        "system": false
      }
    ]
  },
  "connectError": null
}

Mögliche Fehler

  • 403 Es fehlt die Berechtigung Datenbanken.
  • 401AUTH_FAILED Der VPS hat die Zugangsdaten abgelehnt.
  • 409HOST_KEY_CHANGED Der SSH-Schlüssel-Fingerabdruck des VPS hat sich geändert (neuer in presentedHostKey); bestätigen Sie ihn mit der Aktion trustHostKey.
  • 412NO_TARGET Der VPS hat noch keine Adresse oder Zugangsdaten (auch NO_CREDENTIALS).
  • 502UNREACHABLE Der VPS ist nicht erreichbar (auch TIMEOUT, FAILED).
POST/services/{id}/databaseInstallation, Verbindung, Datenbanken und Benutzer

Verwaltet den Datenbankserver auf einem VPS, gewählt über das Feld action. Die Installation läuft im Hintergrund (nur Debian/Ubuntu); das Löschen einer Datenbank oder eines Benutzers ist endgültig. Ein generiertes Passwort wird nur einmal zurückgegeben.

Berechtigung: services:database

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
actionstringjainstall, connectAuto, connectManual, disconnect, createDatabase, dropDatabase, createUser, dropUser, setPassword oder grant.
enginestringneininstall, connectAuto, connectManual: mysql oder postgres. connectAuto legt das Panel-Konto über lokalen Root-Zugriff an.
portintegerneinconnectManual: Port des Datenbankservers.
usernamestringneinconnectManual: Benutzer, mit dem sich das Panel verbindet.
passwordstringneinconnectManual: Passwort (Pflicht). createUser, setPassword: neues Passwort, 8–128 Zeichen; ohne wird eins erzeugt.
namestringneinDatenbankaktionen: Name der Datenbank oder des Benutzers, Buchstaben ohne Diakritika, Ziffern und Unterstrich, höchstens 63 Zeichen, nicht mit Ziffer beginnend.
createUserbooleanneincreateDatabase: auch einen gleichnamigen Benutzer mit vollen Rechten anlegen.
hoststringneincreateDatabase, createUser (MySQL): localhost (Standard) oder %. dropUser: bestimmter Host, sonst alle.
databasestringneincreateUser (optional), grant (Pflicht): Datenbank, auf die der Benutzer volle Rechte erhält.

Beispielinhalt

{
  "action": "createDatabase",
  "name": "shop",
  "createUser": true,
  "host": "localhost"
}

Beispielantwort

{
  "ok": true,
  "username": "shop",
  "password": "<generated>"
}

Mögliche Fehler

  • 400 Ungültige Anfrage, reservierter Name, Installation läuft bereits, das System unterstützt keine automatische Installation oder Fehler des Datenbankservers.
  • 412 Der Datenbankserver ist noch nicht verbunden.
  • 403 Es fehlt die Berechtigung Datenbanken.
  • 500 Interner Fehler (die Antwort enthält eine ref für den Support).
  • 401AUTH_FAILED Der VPS hat die Zugangsdaten abgelehnt.
  • 409HOST_KEY_CHANGED Der SSH-Schlüssel-Fingerabdruck des VPS hat sich geändert (neuer in presentedHostKey); bestätigen Sie ihn mit der Aktion trustHostKey.
  • 412NO_TARGET Der VPS hat noch keine Adresse oder Zugangsdaten (auch NO_CREDENTIALS).
  • 502UNREACHABLE Der VPS ist nicht erreichbar (auch TIMEOUT, FAILED).
GET/services/{id}/database/browseTabellen und Zeilen einer VPS-Datenbank

Ohne table kommen die Tabellen der Datenbank mit geschätzter Zeilenzahl und Größe. Mit table kommen Zeilen, 50 pro Seite. Nur VPS mit verbundenem Datenbankserver.

Berechtigung: services:database

Parameter in der Adresse

NameTypPflichtBeschreibung
dbstringjaName der Datenbank.
tablestringneinTabellenname; ohne ihn kommt die Tabellenliste.
schemastringneinPostgreSQL: Schema der Tabelle, Standard public.
pageintegerneinSeite ab 0, je 50 Zeilen.

Beispielantwort

{
  "columns": [
    "id",
    "name",
    "created_at"
  ],
  "rows": [
    [
      "1",
      "Alice",
      "2026-10-01 12:00:00"
    ],
    [
      "2",
      "Bob",
      "2026-10-03 08:30:00"
    ]
  ],
  "page": 0,
  "pageSize": 50,
  "total": 2
}

Mögliche Fehler

  • 400 Ungültiger Name oder Fehler des Datenbankservers.
  • 412 Der Datenbankserver ist noch nicht verbunden.
  • 403 Es fehlt die Berechtigung Datenbanken.
  • 401AUTH_FAILED Der VPS hat die Zugangsdaten abgelehnt.
  • 409HOST_KEY_CHANGED Der SSH-Schlüssel-Fingerabdruck des VPS hat sich geändert (neuer in presentedHostKey); bestätigen Sie ihn mit der Aktion trustHostKey.
  • 412NO_TARGET Der VPS hat noch keine Adresse oder Zugangsdaten (auch NO_CREDENTIALS).
  • 502UNREACHABLE Der VPS ist nicht erreichbar (auch TIMEOUT, FAILED).
POST/services/{id}/database/querySQL-Abfrage auf dem VPS ausführen

Führt eine SQL-Abfrage mit dem Konto aus, mit dem sich das Panel zum Datenbankserver des VPS verbindet. Höchstens 500 Zeilen, Limit 25 s. Die Abfrage kann Daten auch ändern oder löschen.

Berechtigung: services:database

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
sqlstringjaSQL-Abfrage, höchstens 100.000 Zeichen.
dbstringneinDatenbank, in der die Abfrage läuft.

Beispielinhalt

{
  "db": "shop",
  "sql": "SELECT id, name FROM customers ORDER BY id LIMIT 10"
}

Beispielantwort

{
  "columns": [
    "id",
    "name"
  ],
  "rows": [
    [
      "1",
      "Alice"
    ],
    [
      "2",
      "Bob"
    ]
  ],
  "rowCount": 2,
  "affectedRows": null,
  "truncated": false,
  "command": "SELECT",
  "durationMs": 7
}

Mögliche Fehler

  • 400 Ungültige Anfrage oder Fehler des Datenbankservers.
  • 412 Der Datenbankserver ist noch nicht verbunden.
  • 403 Es fehlt die Berechtigung Datenbanken.
  • 429 Höchstens 60 Abfragen pro Minute.
  • 401AUTH_FAILED Der VPS hat die Zugangsdaten abgelehnt.
  • 409HOST_KEY_CHANGED Der SSH-Schlüssel-Fingerabdruck des VPS hat sich geändert (neuer in presentedHostKey); bestätigen Sie ihn mit der Aktion trustHostKey.
  • 412NO_TARGET Der VPS hat noch keine Adresse oder Zugangsdaten (auch NO_CREDENTIALS).
  • 502UNREACHABLE Der VPS ist nicht erreichbar (auch TIMEOUT, FAILED).
GET/services/{id}/filesOrdner auf dem Server auflisten

Listet einen Ordner auf einem VPS (per SFTP) oder auf einem Gameserver bzw. Discord-Bot auf, höchstens 5000 Einträge. Beim VPS kommen Zugangsdaten ohne Passwort dazu.

Berechtigung: services:files

Parameter in der Adresse

NameTypPflichtBeschreibung
pathstringneinAbsoluter Ordnerpfad. Standard / bei Spielen und Bots, Home-Verzeichnis des Benutzers beim VPS.

Beispielantwort

{
  "path": "/home/app",
  "entries": [
    {
      "name": "logs",
      "type": "dir",
      "size": 4096,
      "mtime": 1762500000,
      "mode": "drwxr-xr-x",
      "owner": "app",
      "group": "app"
    },
    {
      "name": "config.yml",
      "type": "file",
      "size": 1832,
      "mtime": 1762489123,
      "mode": "-rw-r--r--",
      "owner": "app",
      "group": "app"
    },
    {
      "name": "current",
      "type": "link",
      "size": 12,
      "mtime": 1762400000,
      "mode": "lrwxrwxrwx",
      "owner": "app",
      "group": "app",
      "linkTarget": "/srv/releases/42",
      "linkType": "dir"
    }
  ],
  "truncated": false,
  "access": {
    "host": "203.0.113.20",
    "port": 22,
    "username": "root",
    "customCredentials": false,
    "hasDefaultPassword": true,
    "hostKey": "SHA256:AbCdEfGhIjKlMnOpQrStUvWxYz0123456789abcdefg"
  }
}

Mögliche Fehler

  • 400 Ungültiger Pfad oder SFTP-Fehler.
  • 403 Es fehlt die Berechtigung Dateien.
  • 404 Der Ordner existiert auf dem Gameserver nicht.
  • 401AUTH_FAILED Der VPS hat die Zugangsdaten abgelehnt.
  • 409HOST_KEY_CHANGED Der SSH-Schlüssel-Fingerabdruck des VPS hat sich geändert (neuer in presentedHostKey); bestätigen Sie ihn mit der Aktion trustHostKey.
  • 412NO_TARGET Der VPS hat noch keine Adresse oder Zugangsdaten (auch NO_CREDENTIALS).
  • 502UNREACHABLE Der VPS ist nicht erreichbar (auch TIMEOUT, FAILED).
POST/services/{id}/filesDateien anlegen, umbenennen, bearbeiten oder löschen

Führt eine Dateiaktion auf einem VPS, Gameserver oder Discord-Bot aus, gewählt über das Feld action. Löschen ist endgültig; beim VPS werden Ordner samt Inhalt gelöscht. Uploads gehen nicht über die API, nutzen Sie SFTP.

Berechtigung: services:files

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
actionstringjamkdir, touch, rename, delete, chmod, write; nur VPS und nur Besitzer: credentials, resetCredentials, trustHostKey; nur Spiele und Bots: compress, decompress.
pathstringneinmkdir, touch, rename, chmod, write, decompress: absoluter Pfad des Elements.
tostringneinrename: neuer absoluter Pfad.
pathsstring[]neindelete: 1–200 absolute Pfade.
modestringneinchmod: Rechte oktal, 3–4 Ziffern (z. B. 644).
contentstringneinwrite: kompletter neuer Dateiinhalt in UTF-8, höchstens 2 MB.
usernamestringneincredentials: SSH-Benutzer für den Dateimanager (statt root).
passwordstringneincredentials: Passwort des SSH-Benutzers, wird nach erfolgreicher Anmeldung verschlüsselt gespeichert.
portintegerneincredentials: SSH-Port 1–65535.
fingerprintstringneintrustHostKey: neuer Schlüssel-Fingerabdruck im Format SHA256:….
dirstringneincompress: Ordner mit den zu packenden Elementen.
namesstring[]neincompress: 1–200 Namen aus dem Ordner dir.
archiveNamestringneincompress: Name des .tar.gz-Archivs, höchstens 120 Zeichen.
intostringneindecompress: here (Standard) oder newFolder.
folderNamestringneindecompress: Name des neuen Ordners, höchstens 120 Zeichen.
localestringneinSprache der Meldungen: cs, en, sk, pl oder de. Standard cs.

Beispielinhalt

{
  "action": "write",
  "path": "/server.properties",
  "content": "motd=Můj server\nmax-players=20\n"
}

Beispielantwort

{
  "ok": true
}

Mögliche Fehler

  • 400 Ungültige Anfrage, Pfad oder Name; Systemordner und /proc, /sys, /dev können nicht geändert werden.
  • 403 Zugangsdaten ändert nur der Besitzer; oder die Berechtigung Dateien fehlt.
  • 409 Eine Datei oder ein Ordner mit diesem Namen existiert bereits.
  • 409JOB_RUNNING Auf dem Minecraft-Server läuft eine Softwareänderung oder Modpack-Installation.
  • 409ARCHIVE_BUSY Ein anderes Packen oder Entpacken läuft.
  • 413 Der Inhalt für write ist größer als 2 MB.
  • 429 Höchstens 10 Pack- und Entpackvorgänge pro 10 Minuten.
  • 401AUTH_FAILED Der VPS hat die Zugangsdaten abgelehnt.
  • 409HOST_KEY_CHANGED Der SSH-Schlüssel-Fingerabdruck des VPS hat sich geändert (neuer in presentedHostKey); bestätigen Sie ihn mit der Aktion trustHostKey.
  • 412NO_TARGET Der VPS hat noch keine Adresse oder Zugangsdaten (auch NO_CREDENTIALS).
  • 502UNREACHABLE Der VPS ist nicht erreichbar (auch TIMEOUT, FAILED).
GET/services/{id}/files/downloadDatei herunterladen oder Text lesen

Lädt eine Datei von einem VPS, Gameserver oder Discord-Bot herunter. Mit as=text kommt der Inhalt einer UTF-8-Textdatei als JSON, höchstens 1 MB.

Berechtigung: services:files

Parameter in der Adresse

NameTypPflichtBeschreibung
pathstringjaAbsoluter Dateipfad.
asstringneintext = Inhalt als JSON statt Download zurückgeben.

Beispielantwort

{
  "path": "/server.properties",
  "content": "motd=Můj server\nmax-players=20\n",
  "eol": "lf",
  "bom": false
}

Mögliche Fehler

  • 400 Ungültiger Pfad, keine reguläre Datei oder /proc, /sys, /dev auf dem VPS.
  • 413TOO_LARGE as=text: die Datei ist größer als 1 MB.
  • 415BINARY as=text: die Datei ist kein UTF-8-Text.
  • 403 Es fehlt die Berechtigung Dateien.
  • 401AUTH_FAILED Der VPS hat die Zugangsdaten abgelehnt.
  • 409HOST_KEY_CHANGED Der SSH-Schlüssel-Fingerabdruck des VPS hat sich geändert (neuer in presentedHostKey); bestätigen Sie ihn mit der Aktion trustHostKey.
  • 412NO_TARGET Der VPS hat noch keine Adresse oder Zugangsdaten (auch NO_CREDENTIALS).
  • 502UNREACHABLE Der VPS ist nicht erreichbar (auch TIMEOUT, FAILED).
GET/services/{id}/liveAktueller Serverstatus und Auslastung

Liefert den Energiestatus und die aktuelle CPU-, RAM-, Festplatten- und Netzwerkauslastung eines VPS oder Gameservers. Für laufende Überwachung live/stream verwenden; ist der Status nicht lesbar, kommt 200 mit ok: false.

Berechtigung: services:read

Parameter in der Adresse

NameTypPflichtBeschreibung
pollstringneinWert live für wiederholte Abfragen (alle 2 s); die Antwort stammt aus dem letzten Live-Messwert.

Beispielantwort

{
  "ok": true,
  "status": {
    "status": "ACTIVE",
    "details": {
      "vmStatus": "running",
      "gameState": null,
      "cpuPercent": 12.4,
      "memUsedMib": 1840,
      "memTotalMib": 4096,
      "diskUsedGb": 18.2,
      "diskTotalGb": 60,
      "netinMbps": 0.42,
      "netoutMbps": 1.1,
      "uptimeSeconds": 86400,
      "diskVolumes": [
        {
          "mountpoint": "/",
          "usedBytes": 19542261760,
          "totalBytes": 64424509440
        }
      ],
      "netInBps": 420000,
      "netOutBps": 1100000,
      "diskReadBytesPerSec": 0,
      "diskWriteBytesPerSec": 24576
    }
  }
}

Mögliche Fehler

  • 403mfa_required Der Inhaber des Dienstes verlangt von Mitgliedern die Zwei-Faktor-Authentifizierung.
  • 404 Dienst nicht gefunden.
  • 429 Mehr als 240 Anfragen pro Minute.
GET/services/{id}/live/streamLive-Statistiken über SSE

Öffnet einen Server-Sent-Events-Stream mit Auslastungswerten eines VPS oder Gameservers etwa jede Sekunde (hello, backfill, sample, disk, status, unavailable, end). Eine Verbindung mit API-Schlüssel endet nach etwa einer Minute mit end; dann neu verbinden.

Berechtigung: services:read

Beispielantwort

event: hello
data: {"v":1,"kind":"vps","intervalMs":1000,"serverNow":1762508460000}

event: sample
data: {"t":1762508461000,"power":"running","vmStatus":"running","gameState":null,"cpuPercent":8.3,"memUsedMib":1840,"memTotalMib":4096,"netInBps":420000,"netOutBps":1100000,"diskReadBytesPerSec":0,"diskWriteBytesPerSec":24576,"uptimeSeconds":86401}

event: end
data: {"reason":"rotate"}

Mögliche Fehler

  • 403mfa_required Der Inhaber des Dienstes verlangt von Mitgliedern die Zwei-Faktor-Authentifizierung.
  • 404 Dienst nicht gefunden.
  • 200 Andere Probleme kommen als end-Ereignis mit Grund: unsupported, busy (mit retryInMs), revoked, inactive, moved, rotate.
PATCH/services/{id}/nameDienst umbenennen

Setzt einen eigenen Dienstnamen, der danach im Feld name zurückgegeben wird (productName bleibt der Tarifname). null oder eine leere Zeichenkette stellt den ursprünglichen Namen wieder her. Nur Inhaber des Dienstes.

Berechtigung: services:settings

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
namestring | nulljaNeuer Name, höchstens 60 Zeichen.
localestringneinSprache der Fehlermeldungen (cs, en, sk, pl, de).

Beispielinhalt

{
  "name": "Survival server"
}

Beispielantwort

{
  "name": "Survival server"
}

Mögliche Fehler

  • 400invalid Der Name ist länger als 60 Zeichen oder der Body enthält andere Felder.
  • 404not_allowed Der Dienst gehört nicht zu Ihrem Konto.
GET/services/{id}/outletsStatus der PDU-Steckdosen und Ereignisse

Liefert den Status der Rackhousing-Steckdosen (an, aus, Leistung, Strom), ob Sie sie steuern dürfen, und die letzten 20 PDU-Ereignisse. Nur Rackhousing; ohne Steckdosen ist view null.

Berechtigung: services:read

Parameter in der Adresse

NameTypPflichtBeschreibung
beforestringneinEreignis-ID, ab der ältere Ereignisse geladen werden (Paging).

Beispielantwort

{
  "view": {
    "canControl": true,
    "controlBlocked": null,
    "measuredAt": "2026-11-07T09:41:00.000Z",
    "stale": false,
    "outlets": [
      {
        "n": 3,
        "state": "on",
        "pending": false,
        "powerW": 120,
        "currentA": 0.52
      }
    ],
    "events": [
      {
        "id": "clx9k2m4p0001",
        "at": "2026-11-06T18:12:00.000Z",
        "kind": "command",
        "severity": "info",
        "outlet": 3,
        "action": "reboot",
        "result": "ok",
        "actorType": "customer",
        "actor": "vy",
        "serviceRef": "#A1B2C3",
        "message": "Restart zásuvky 3 — provedeno."
      }
    ],
    "eventsMore": false,
    "eventsAvailable": true
  }
}

Mögliche Fehler

  • 400 Der Dienst ist kein Rackhousing.
  • 404 Dienst nicht gefunden.
POST/services/{id}/outletsSteckdosen schalten oder neu starten

Sendet einen Befehl an die PDU-Steckdosen Ihres Rackhousing-Dienstes. Nur bei aktivem Dienst, für den der Support die Steuerung freigegeben hat; Limit 6 pro Minute je Konto und 5 pro Minute je Dienst.

Berechtigung: services:power

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
outletsnumber[]jaSteckdosennummern 1–48 (1 bis 48 Einträge), nur Steckdosen dieses Dienstes.
commandstringjaon, off, reboot oder cancel (bricht einen ausstehenden Befehl ab).

Beispielinhalt

{
  "outlets": [
    3,
    4
  ],
  "command": "reboot"
}

Beispielantwort

{
  "ok": true,
  "outlets": [
    {
      "n": 3,
      "state": "on",
      "pending": true
    },
    {
      "n": 4,
      "state": "on",
      "pending": true
    }
  ]
}

Mögliche Fehler

  • 400not_yours Eine Steckdose gehört nicht zu diesem Dienst. Ohne Code: ungültiger Anfrage-Body.
  • 403not_allowed Die Steckdosensteuerung ist für den Dienst nicht aktiviert.
  • 409inactive Der Dienst ist nicht aktiv. Code no_config: Die PDU ist gerade nicht erreichbar.
  • 429 Anfragelimit überschritten.
  • 502pdu_failed Die PDU hat den Befehl nicht ausgeführt.
GET/services/{id}/powerStromverbrauch des Rackhousings

Liefert die Leistungsaufnahme der Steckdosen im Vergleich zur vereinbarten Leistung, kWh für diesen und den letzten Monat sowie eine Tagesübersicht. Nur Rackhousing, Daten aus der letzten PDU-Messung; ohne Steckdosen oder Daten ist view null.

Berechtigung: services:read

Beispielantwort

{
  "view": {
    "contractedW": 500,
    "currentW": 212,
    "measuredAt": "2026-11-07T09:41:00.000Z",
    "stale": false,
    "monthKwh": 38.4,
    "lastMonthKwh": 151.2,
    "month": {
      "y": 2026,
      "m": 11,
      "days": 30,
      "today": 7
    },
    "daily": [
      5.1,
      5.3,
      5.4,
      5.6,
      5.5,
      5.7,
      5.8,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null
    ],
    "outlets": [
      {
        "n": 3,
        "powerW": 120,
        "monthKwh": 21.6
      },
      {
        "n": 4,
        "powerW": 92,
        "monthKwh": 16.8
      }
    ]
  }
}

Mögliche Fehler

  • 400 Der Dienst ist kein Rackhousing.
  • 404 Der Dienst existiert nicht oder Sie haben keinen Zugriff.
POST/services/{id}/powerServer starten, stoppen oder neu starten

Startet, stoppt oder startet einen VPS oder Gameserver (auch einen Bot) neu. Nur bei aktivem Dienst, höchstens 5 Anfragen pro Minute und Dienst; der Abrechnungsstatus ändert sich nicht.

Berechtigung: services:power

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
actionstringjastart, stop oder restart.

Beispielinhalt

{
  "action": "restart"
}

Beispielantwort

{
  "ok": true
}

Mögliche Fehler

  • 400 action fehlt oder ist ungültig.
  • 404 Dienst nicht gefunden oder keine Energiesteuerung verfügbar (z. B. Rackhousing, Web).
  • 409 Der Dienst ist nicht aktiv, eine Softwareänderung läuft oder eine Wiederherstellung aus dem Backup läuft noch.
  • 429 Mehr als 5 Anfragen pro Minute für den Dienst.
  • 502 Die Aktion ist fehlgeschlagen, versuchen Sie es erneut.
GET/services/{id}/rackhousingRackhousing-Übersicht

Liefert Position im Rack, Höhe, vereinbarte Leistung, Ports mit Linkstatus und IP-Adressen eines Rackhousing-Dienstes. Der Portstatus stammt aus der letzten Abfrage; die Anfrage ändert nichts.

Berechtigung: services:read

Beispielantwort

{
  "view": {
    "site": "Praha",
    "rack": "R12",
    "unitRange": "U20–U21",
    "heightU": 2,
    "powerW": 500,
    "ports1g": 1,
    "ports10g": 1,
    "ports": [
      {
        "port": "port 3",
        "speed": "1g",
        "speedText": "1 Gbit",
        "status": "up"
      },
      {
        "port": "port 4",
        "speed": "10g",
        "speedText": "10 Gbit",
        "status": "down"
      }
    ],
    "ipv4": [
      {
        "address": "203.0.113.10",
        "prefix": 29,
        "gateway": "203.0.113.9"
      }
    ],
    "ipv6": "2001:db8:100::/48",
    "equipment": "1× server 2U",
    "polledAt": "2026-11-07T09:40:00.000Z"
  }
}

Mögliche Fehler

  • 400 Der Dienst ist kein Rackhousing.
  • 404 Dienst nicht gefunden.
GET/services/{id}/sftpSFTP-Zugangsdaten

Liefert Host, Port und Benutzernamen für SFTP eines Gameservers oder Bots; das Passwort wird nie zurückgegeben. Mitglieder geteilter Dienste erhalten nur owner: false. Die Funktion ist noch nicht freigeschaltet und liefert 404.

Berechtigung: services:secrets

Parameter in der Adresse

NameTypPflichtBeschreibung
langstringneinen für englische Meldungen, sonst Tschechisch.

Beispielantwort

{
  "owner": true,
  "host": "203.0.113.40",
  "port": 2022,
  "username": "user.1a2b3c4d",
  "canSetPassword": true
}

Mögliche Fehler

  • 404 SFTP ist noch nicht freigeschaltet oder der Dienst wurde nicht gefunden.
  • 400 Der Dienst ist weder Gameserver noch Bot.
  • 502 Die Daten konnten nicht geladen werden.
POST/services/{id}/sftpSFTP-Passwort setzen

Setzt das angegebene SFTP-Passwort eines Gameservers oder Bots; das Passwort wird nirgends gespeichert und der Inhaber erhält eine E-Mail. Nur Inhaber, Limit 5 pro Stunde, die Bestätigung im Portal ersetzt hier der Scope services:secrets. Die Funktion ist noch nicht freigeschaltet und liefert 404.

Berechtigung: services:secrets

Parameter in der Adresse

NameTypPflichtBeschreibung
langstringneinen für englische Meldungen, sonst Tschechisch.

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
actionstringjaImmer setPassword.
passwordstringjaNeues Passwort, 10–200 Zeichen, kein gängiges oder geleaktes Passwort.

Beispielinhalt

{
  "action": "setPassword",
  "password": "example-Sftp-Pass-2026"
}

Beispielantwort

{
  "ok": true,
  "username": "user.1a2b3c4d"
}

Mögliche Fehler

  • 400weak_password Das Passwort erfüllt die Regeln nicht oder der Body ist ungültig.
  • 403insufficient_scope Dem Schlüssel fehlt der Scope services:secrets. Code not_owner: Sie sind nicht Inhaber.
  • 404 SFTP ist noch nicht freigeschaltet.
  • 409admin_user SFTP für diesen Dienst richtet der Support ein. Weitere Codes: email_mismatch, foreign_server, inactive.
  • 429 Mehr als 5 Versuche pro Stunde.
  • 502failed Das Passwort konnte nicht gesetzt werden. Code unavailable: Der Dienst ist gerade nicht verfügbar.

VPS und Rackhousing

GET/services/{id}/backupsBackups des VPS auflisten

Liefert die Backups des VPS aus allen Speichern, nur aus der Zeit des aktuellen Inhabers. Ergebnis wird 20 s zwischengespeichert, Limit 10 Anfragen pro Minute; partial: true heißt, ein Speicher hat nicht geantwortet. Backups und Speicher haben undurchsichtige IDs (storageId eines Backups = ID eines Speichers in storages); die Backup-ID an backups/restore senden.

Berechtigung: services:backups

Beispielantwort

{
  "backups": [
    {
      "id": "Q2xP7rT0aN4mVb8sKe1wYg",
      "storageId": "h5Jd9LkQ2pWm0ZcR7tUv3A",
      "storageLabel": "Backup 1",
      "sizeBytes": 8589934592,
      "createdAt": 1762394400,
      "name": "vps-000001"
    }
  ],
  "storages": [
    {
      "id": "h5Jd9LkQ2pWm0ZcR7tUv3A",
      "label": "Backup 1",
      "enabled": true
    },
    {
      "id": "Xo3bN6qE8yTf1GsD4lHk9w",
      "label": "Backup 2",
      "enabled": false
    }
  ]
}

Mögliche Fehler

  • 403 Fehlende Berechtigung Backups beim geteilten Dienst.
  • 409 Der Dienst ist nicht aktiv oder eine Wiederherstellung läuft.
  • 412NOT_PROVISIONED Der VPS ist noch nicht bereit.
  • 429 Mehr als 10 Anfragen pro Minute.
  • 502 Backups konnten nicht geladen werden.
POST/services/{id}/backups/restoreVPS aus einem Backup wiederherstellen

Schaltet den VPS hart aus und überschreibt die Festplatte mit dem gewählten Backup; nicht umkehrbar. Bei größeren Festplatten läuft die Wiederherstellung im Hintergrund weiter (pending: true), danach lässt sich der VPS starten. Limit 3 pro Minute je Dienst.

Berechtigung: services:backups

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
idstringjaID des Backups aus der Liste backups.

Beispielinhalt

{
  "id": "Q2xP7rT0aN4mVb8sKe1wYg"
}

Beispielantwort

{
  "ok": true,
  "pending": true,
  "message": "Obnova ze zálohy běží. VPS půjde zapnout, až skončí (u větších disků i několik minut)."
}

Mögliche Fehler

  • 400 id fehlt.
  • 403 Das Backup gehört nicht zu diesem Dienst oder existiert nicht mehr.
  • 409 Der Dienst ist nicht aktiv oder eine andere Wiederherstellung läuft bereits.
  • 429 Mehr als 3 Versuche pro Minute.
  • 502 Die Wiederherstellung konnte nicht gestartet oder abgeschlossen werden.
GET/services/{id}/ddosVerfügbarkeit des Anti-DDoS-Schutzes

Gibt an, ob Anti-DDoS-Einstellungen für die IP-Adressen des VPS verfügbar sind. Liefert derzeit immer available: false; bei geteilten Diensten braucht ein Mitglied die Berechtigung Netzwerk.

Berechtigung: services:read

Beispielantwort

{
  "available": false
}

Mögliche Fehler

  • 400 Der Dienst ist kein VPS.
  • 409 Der Dienst ist nicht aktiv.
GET/services/{id}/firewallFirewall-Regeln des VPS

Liefert die Firewall-Einstellungen des VPS und alle Regeln, auch verwaltete (Feld managed), die nicht änderbar sind. Den Wert digest beim Bearbeiten einer Regel mitsenden.

Berechtigung: services:firewall

Beispielantwort

{
  "digest": "3f2a9c0d1e5b7a8c4d6e2f1a0b9c8d7e6f5a4b3c",
  "baseline": true,
  "enabled": true,
  "ipfilter": true,
  "macfilter": true,
  "policyIn": "DROP",
  "policyOut": "ACCEPT",
  "inboundDefault": "accept",
  "scannerBlock": true,
  "ipfilterEntries": [
    "203.0.113.25",
    "2001:db8:10::/64"
  ],
  "rules": [
    {
      "pos": 0,
      "managed": "censys",
      "type": "in",
      "action": "DROP",
      "proto": "",
      "dport": "",
      "sport": "",
      "source": "+dc/censys",
      "dest": "",
      "macro": "",
      "comment": "",
      "enable": true
    },
    {
      "pos": 1,
      "managed": null,
      "type": "in",
      "action": "DROP",
      "proto": "tcp",
      "dport": "3306",
      "sport": "",
      "source": "",
      "dest": "",
      "macro": "",
      "comment": "MySQL ven ne",
      "enable": true
    },
    {
      "pos": 2,
      "managed": "allowIn",
      "type": "in",
      "action": "ACCEPT",
      "proto": "",
      "dport": "",
      "sport": "",
      "source": "",
      "dest": "+guest/ipfilter-net0",
      "macro": "",
      "comment": "",
      "enable": true
    }
  ]
}

Mögliche Fehler

  • 403 Fehlende Berechtigung Firewall beim geteilten Dienst.
  • 409 Der Dienst ist nicht aktiv oder die Aktion ist gerade nicht möglich.
  • 412 Der VPS ist noch nicht bereit.
  • 502 Die Firewall konnte nicht geladen werden.
POST/services/{id}/firewallFirewall-Regeln des VPS bearbeiten

Fügt eine eigene Regel hinzu, bearbeitet, (de)aktiviert, löscht oder verschiebt sie, schaltet den eingehenden Standardverkehr um oder wendet die empfohlene Einrichtung an. Aktionen an einer Position brauchen digest aus GET; höchstens 50 eigene Regeln, Meldungen auf Tschechisch.

Berechtigung: services:firewall

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
actionstringjaadd, update, toggle, delete, move, setInbound oder applyBaseline.
posnumberneinFür update, toggle, delete und move: Position einer eigenen Regel aus GET.
digeststringneinFür update, toggle, delete und move: digest aus GET.
ruleobjectneinFür add und update: type (in, out), action (ACCEPT, DROP, REJECT), proto ("", tcp, udp, icmp, ipv6-icmp), dport, sport (z. B. 22, 80,443, 25565:25570; nur TCP und UDP), source, dest (IP oder Bereich, höchstens 10), comment (max. 100), enable.
enablebooleanneinFür toggle: Regel aktivieren oder deaktivieren.
directionstringneinFür move: up oder down (nur zwischen eigenen Regeln).
valuestringneinFür setInbound: accept oder drop (eingehender Standardverkehr).

Beispielinhalt

{
  "action": "add",
  "rule": {
    "type": "in",
    "action": "ACCEPT",
    "proto": "tcp",
    "dport": "22",
    "source": "198.51.100.0/24",
    "comment": "SSH z kanceláře"
  }
}

Beispielantwort

{
  "ok": true,
  "firewall": {
    "digest": "9b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c",
    "baseline": true,
    "enabled": true,
    "ipfilter": true,
    "macfilter": true,
    "policyIn": "DROP",
    "policyOut": "ACCEPT",
    "inboundDefault": "accept",
    "scannerBlock": true,
    "ipfilterEntries": [
      "203.0.113.25"
    ],
    "rules": []
  }
}

Mögliche Fehler

  • 400 Ungültiger Body oder ungültige Regel (Port, Adresse, Protokoll) oder mehr als 50 eigene Regeln.
  • 403 Eine verwaltete Regel ist nicht änderbar oder die Berechtigung Firewall fehlt.
  • 409 Die Firewall hat sich inzwischen geändert (digest neu laden), der Dienst ist nicht aktiv, eine Wiederherstellung läuft oder die empfohlene Einrichtung ist nicht anwendbar.
  • 502 Die Änderung konnte nicht gespeichert werden.
GET/services/{id}/historyAuslastungsverlauf des VPS

Liefert den Verlauf von CPU, RAM, Netzwerk und Festplatte eines VPS für den gewählten Zeitraum (höchstens 300 Punkte), CPU-Spitzen und den Traffic für 30 Tage und seit Monatsbeginn. Ergebnis wird 20 s zwischengespeichert, Limit 30 Anfragen pro Minute.

Berechtigung: services:read

Parameter in der Adresse

NameTypPflichtBeschreibung
rangestringneinhour, day, week, month oder year. Standard day.
langstringneinen für englische Fehlermeldungen, sonst Tschechisch.

Beispielantwort

{
  "range": "day",
  "points": [
    {
      "t": 1762473600,
      "cpu": 6.2,
      "ram": 44.8,
      "netIn": 52000,
      "netOut": 138000,
      "diskRead": 0,
      "diskWrite": 20480
    }
  ],
  "cpuPeak": [
    {
      "t": 1762473600,
      "cpu": 31.5
    }
  ],
  "cpu": {
    "avg": 7.1,
    "max": 64.2
  },
  "transfer30d": {
    "inBytes": 18253611008,
    "outBytes": 42949672960
  },
  "transferMonth": {
    "inBytes": 4294967296,
    "outBytes": 9663676416
  }
}

Mögliche Fehler

  • 400 Der Dienst ist kein VPS.
  • 409 Der VPS ist weder aktiv noch gesperrt oder kann gerade nicht geprüft werden.
  • 429 Mehr als 30 Anfragen pro Minute.
  • 502 Die Statistiken können gerade nicht geladen werden.
GET/services/{id}/installInstallationsstatus des VPS

Liefert die Phase einer VPS-Installation oder Neuinstallation (image, create, start, finish, done) und ob sie noch läuft. Geeignet zum Abfragen nach einer Neuinstallation, Limit 90 Anfragen pro Minute.

Berechtigung: services:read

Beispielantwort

{
  "status": "ACTIVE",
  "phase": "finish",
  "active": true,
  "source": "reinstall",
  "restarting": false,
  "running": true,
  "reboot": true,
  "failed": false
}

Mögliche Fehler

  • 400 Der Dienst ist kein VPS.
  • 404 Dienst nicht gefunden.
  • 429 Mehr als 90 Anfragen pro Minute.
GET/services/{id}/isoISO-Abbilder und angehängtes ISO

Liefert den ISO-Katalog, Ihre eigenen ISOs, Limits, das aktuell angehängte ISO mit Boot-Einstellung und den Status der letzten Aktion. Nur Inhaber des VPS.

Berechtigung: services:settings

Beispielantwort

{
  "available": true,
  "catalog": [
    {
      "id": "clx9a0iso0001",
      "kind": "catalog",
      "name": "Debian 13 netinst",
      "osFamily": "debian",
      "sizeBytes": 754974720,
      "createdAt": "2026-10-20T08:00:00.000Z",
      "lastUsedAt": null,
      "expiresAt": null
    }
  ],
  "own": [
    {
      "id": "clx9a0iso0002",
      "kind": "custom",
      "name": "Rescue tools",
      "osFamily": null,
      "sizeBytes": 524288000,
      "createdAt": "2026-11-02T12:00:00.000Z",
      "lastUsedAt": "2026-11-03T09:00:00.000Z",
      "expiresAt": "2026-12-03T09:00:00.000Z"
    }
  ],
  "limits": {
    "count": 2,
    "maxBytes": 10737418240,
    "retentionDays": 30
  },
  "status": {
    "attached": false,
    "bootFromIso": false,
    "isoId": null,
    "name": null
  },
  "job": null
}

Mögliche Fehler

  • 400 Der Dienst ist kein VPS.
  • 403 Sie sind nicht Inhaber des Dienstes.
  • 409 Der Dienst ist nicht aktiv.
POST/services/{id}/isoISO hinzufügen, anhängen oder abhängen

Je nach action eigenes ISO per HTTPS-Link hinzufügen, löschen, ISO an den VPS anhängen, Boot umschalten oder ISO auswerfen. Das Anhängen läuft im Hintergrund (Datei wird erst geladen); nur Inhaber, höchstens 2 eigene ISOs bis 10 GB.

Berechtigung: services:settings

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
actionstringjaadd, delete, attach, boot oder detach.
namestringneinFür add: ISO-Name (max. 80 Zeichen), sonst aus der Datei.
urlstringneinFür add: öffentlicher https://-Link zur ISO-Datei mit Größenangabe.
isoIdstringneinFür delete und attach: ISO-ID aus GET.
bootbooleanneinFür attach und boot: true = vom ISO booten, sonst von der Festplatte.

Beispielinhalt

{
  "action": "attach",
  "isoId": "clx9a0iso0001",
  "boot": true
}

Beispielantwort

{
  "ok": true,
  "job": {
    "id": "clx9r1t7w0004",
    "kind": "iso",
    "state": "running",
    "step": null,
    "startedAt": "2026-11-07T10:00:00.000Z",
    "updatedAt": "2026-11-07T10:00:00.000Z"
  }
}

Mögliche Fehler

  • 400url Der Link ist nicht nutzbar (kein HTTPS, nicht öffentliches Netz, über 10 GB, ohne Größe, keine Datei). Weitere Codes: limit, attached; ohne Code ungültige action.
  • 404not_found ISO nicht gefunden.
  • 409unavailable ISOs sind gerade nicht verfügbar. Ohne Code: Auf dem VPS läuft eine andere Aktion.
  • 429 Mehr als 10 hinzugefügte ISOs pro Tag.
  • 502 Die Aktion ist fehlgeschlagen.
GET/services/{id}/private-networkPrivate Netze am VPS-Standort

Liefert Ihre privaten Netze am VPS-Standort, deren Mitglieder, Limits und den Status dieses VPS in jedem Netz. Nur Inhaber des VPS.

Berechtigung: services:network

Beispielantwort

{
  "enabled": true,
  "scope": "location",
  "maxNetworks": 5,
  "maxMembers": 20,
  "priceCzk": null,
  "networks": [
    {
      "id": "clx9p7net0001",
      "name": "zalohy",
      "cidr": "10.20.0.0/24",
      "prefix": 24,
      "createdAt": "2026-10-18T08:00:00.000Z",
      "members": [
        {
          "serviceId": "clx9svc000001",
          "shortId": "#000001",
          "ipv4": "203.0.113.25",
          "address": "10.20.0.1",
          "state": "active",
          "isThis": true,
          "own": true
        }
      ],
      "me": {
        "address": "10.20.0.1",
        "mac": "BC:24:11:00:00:01",
        "nicIndex": 1,
        "state": "active",
        "cloudInit": false,
        "failed": false
      },
      "canDelete": false
    }
  ]
}

Mögliche Fehler

  • 403 Sie sind nicht Inhaber des Dienstes.
  • 409 Der Dienst ist nicht aktiv.
  • 503unavailable Private Netze sind gerade nicht verfügbar.
POST/services/{id}/private-networkNetz anlegen, anbinden oder trennen

Legt ein privates Netz an, bindet diesen VPS an oder trennt ihn, oder löscht ein leeres Netz. Das Anbinden braucht die empfohlene Firewall-Einrichtung; ist pendingRestart true, greift die Änderung nach einem VPS-Neustart.

Berechtigung: services:network

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
actionstringjacreate, attach, detach oder delete.
namestringneinFür create: Netzname, 1–40 Zeichen (Buchstaben, Ziffern, Leerzeichen, . _ -).
cidrstringneinFür create: privater Bereich /16 bis /29 ab der Netzadresse, z. B. 10.20.0.0/24.
networkIdstringneinFür attach, detach und delete: Netz-ID aus GET.
addressstring|nullneinFür attach: VPS-Adresse im Netz; leer = erste freie.
cloudInitbooleanneinFür attach: true = Adresse auch in cloud-init des VPS schreiben.

Beispielinhalt

{
  "action": "attach",
  "networkId": "clx9p7net0001",
  "address": "10.20.0.5"
}

Beispielantwort

{
  "ok": true,
  "address": "10.20.0.5",
  "mac": "BC:24:11:00:00:05",
  "pendingRestart": true,
  "view": {
    "enabled": true,
    "scope": "location",
    "maxNetworks": 5,
    "maxMembers": 20,
    "priceCzk": null,
    "networks": []
  }
}

Mögliche Fehler

  • 400invalid_request Ungültiger Body. Weitere Codes: name_invalid, cidr_invalid, address_invalid, address_outside, address_reserved.
  • 404network_not_found Netz nicht gefunden. Code not_member: Der VPS ist nicht im Netz.
  • 409firewall_required Zuerst die empfohlene Firewall-Einrichtung anwenden. Weitere Codes: cidr_overlap, limit_networks, limit_members, address_taken, network_full, not_empty, detaching, other_location, other_node, no_slot, vm_locked, disabled, no_vlan.
  • 412vm_not_ready Der VPS ist noch nicht bereit.
  • 502apply_failed Die Änderung konnte nicht abgeschlossen werden.
  • 503unavailable Private Netze sind gerade nicht verfügbar.
GET/services/{id}/rdnsReverse-DNS der VPS-Adressen

Liefert die PTR-Einträge der VPS-IP-Adressen: aktueller, Standard- und eigener Wert sowie die IPv6-Bereiche des Dienstes. Bei geteilten Diensten braucht ein Mitglied die Berechtigung Netzwerk.

Berechtigung: services:network

Beispielantwort

{
  "configured": true,
  "error": null,
  "entries": [
    {
      "ip": "203.0.113.25",
      "family": 4,
      "current": "mail.example.com",
      "default": "25.113.0.203.example.net",
      "custom": "mail.example.com"
    },
    {
      "ip": "2001:db8:10::2",
      "family": 6,
      "current": null,
      "default": "vps.example.net",
      "custom": null
    }
  ],
  "ranges": [
    {
      "cidr": "2001:db8:10::/64",
      "family": 6
    }
  ],
  "vmIpv6": "2001:db8:10::2"
}

Mögliche Fehler

  • 400 Der Dienst ist kein VPS.
  • 403 Fehlende Berechtigung Netzwerk beim geteilten Dienst.
  • 409 Der Dienst ist nicht aktiv.
POST/services/{id}/rdnsPTR-Eintrag setzen oder zurücksetzen

Setzt einen eigenen Reverse-DNS-Eintrag für eine dem VPS zugewiesene IP-Adresse oder stellt mit hostname null den Standard wieder her. Höchstens 32 eigene Einträge, Limit 20 Änderungen pro Minute; Meldungen auf Tschechisch.

Berechtigung: services:network

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
ipstringjaIPv4- oder IPv6-Adresse des Dienstes (auch aus seinem IPv6-Bereich).
hostnamestring|nulljaHostname, z. B. mail.example.com (max. 253 Zeichen); null oder leer = Standardeintrag.

Beispielinhalt

{
  "ip": "203.0.113.25",
  "hostname": "mail.example.com"
}

Beispielantwort

{
  "ok": true,
  "ip": "203.0.113.25",
  "ptr": "mail.example.com",
  "isDefault": false
}

Mögliche Fehler

  • 400 Ungültiger Hostname, Reverse- oder reservierte Domain oder mehr als 32 eigene Einträge.
  • 403 Die IP-Adresse gehört nicht zu diesem Dienst oder die Berechtigung Netzwerk fehlt.
  • 502 rDNS konnte gerade nicht gespeichert werden.
GET/services/{id}/reinstallSysteme für die VPS-Neuinstallation

Liefert die auf dem VPS installierbaren Systeme, das aktuelle System, den Zeitpunkt der letzten Neuinstallation und den Status der letzten Aktion. Nur Inhaber des Dienstes.

Berechtigung: services:read

Beispielantwort

{
  "options": [
    {
      "key": "ubuntu-2404",
      "label": "Ubuntu 24.04 LTS"
    },
    {
      "key": "debian-13",
      "label": "Debian 13"
    }
  ],
  "job": {
    "id": "clx9r1t7w0002",
    "kind": "reinstall",
    "state": "done",
    "step": null,
    "startedAt": "2026-11-01T10:00:00.000Z",
    "updatedAt": "2026-11-01T10:06:12.000Z",
    "finishedAt": "2026-11-01T10:06:12.000Z",
    "error": null
  },
  "os": "ubuntu-2404",
  "reinstalledAt": "2026-11-01T10:06:12.000Z"
}

Mögliche Fehler

  • 400 Der Dienst ist kein VPS.
  • 403 Sie sind nicht Inhaber des Dienstes.
  • 409 Der Dienst ist nicht aktiv.
POST/services/{id}/reinstallVPS neu installieren

Löscht die VPS-Festplatte und installiert das gewählte System; läuft im Hintergrund, Fortschritt über install. Das neue Root-Passwort steht nur in dieser Antwort. Nur Inhaber, höchstens 3-mal pro Tag; die Bestätigung im Portal ersetzt hier der Scope services:secrets.

Berechtigung: services:secrets

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
osstringjaSystemschlüssel aus GET, z. B. ubuntu-2404 oder debian-13.
sshKeysstringneinÖffentliche SSH-Schlüssel, einer pro Zeile, höchstens 10 (ssh-ed25519, ssh-rsa, ecdsa-…).

Beispielinhalt

{
  "os": "debian-13",
  "sshKeys": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIExampleKeyExampleKeyExampleKeyExample user@laptop"
}

Beispielantwort

{
  "started": true,
  "password": "example-Root-Pass-123",
  "job": {
    "id": "clx9r1t7w0003",
    "kind": "reinstall",
    "state": "running",
    "step": null,
    "startedAt": "2026-11-07T10:00:00.000Z",
    "updatedAt": "2026-11-07T10:00:00.000Z"
  }
}

Mögliche Fehler

  • 400 System fehlt oder ungültig, ungültiger SSH-Schlüssel oder mehr als 10 Schlüssel.
  • 403insufficient_scope Dem Schlüssel fehlt der Scope services:secrets oder Sie sind nicht Inhaber.
  • 409 Eine andere Aktion läuft, der VPS ist im Rettungsmodus, der Knoten ist ausgelastet oder die Neuinstallation ist nicht verfügbar.
  • 429 Die Neuinstallation lief in den letzten 24 Stunden bereits 3-mal.
  • 502 Die Neuinstallation konnte nicht gestartet werden.
POST/services/{id}/reveal-secretGespeichertes Root-Passwort des VPS anzeigen

Liefert das gespeicherte Root-Passwort des VPS aus Einrichtung, Neuinstallation oder letzter Änderung. Jede Anzeige wird protokolliert und der Inhaber erhält eine E-Mail; Limit 5 pro 10 Minuten, die Bestätigung im Portal ersetzt hier der Scope services:secrets.

Berechtigung: services:secrets

Beispielantwort

{
  "password": "example-Root-Pass-789"
}

Mögliche Fehler

  • 403insufficient_scope Dem Schlüssel fehlt der Scope services:secrets. Ohne Code: fehlende Berechtigung beim geteilten Dienst.
  • 404 Dienst nicht gefunden oder kein Passwort gespeichert.
  • 429 Mehr als 5 Anzeigen in 10 Minuten.
  • 503 Das Passwort kann gerade nicht angezeigt werden, versuchen Sie es erneut.
GET/services/{id}/root-passwordKann ein neues Root-Passwort gesetzt werden?

Prüft, ob das Root-Passwort des VPS gerade über den qemu-guest-agent geändert werden kann, und liefert sonst den Grund. Das Ergebnis wird 60 s zwischengespeichert.

Berechtigung: services:secrets

Parameter in der Adresse

NameTypPflichtBeschreibung
langstringneinen für englische Meldungen, sonst Tschechisch.

Beispielantwort

{
  "available": false,
  "reason": "stopped",
  "message": "VPS je vypnutá. Heslo jde nastavit jen u běžící VPS."
}

Mögliche Fehler

  • 400 Der Dienst ist kein VPS.
  • 403 Fehlende Berechtigung Geheimnisse beim geteilten Dienst.
  • 409 Der Dienst ist nicht aktiv.
POST/services/{id}/root-passwordNeues Root-Passwort für den VPS setzen

Erzeugt ein neues Root-Passwort, setzt es im laufenden VPS über den qemu-guest-agent und liefert es nur in dieser Antwort; der Inhaber erhält eine E-Mail. Limit 3 pro Stunde je Dienst und 10 pro Tag je Konto; die Bestätigung im Portal ersetzt hier der Scope services:secrets.

Berechtigung: services:secrets

Parameter in der Adresse

NameTypPflichtBeschreibung
langstringneinen für englische Meldungen, sonst Tschechisch.

Beispielantwort

{
  "password": "example-Root-Pass-456"
}

Mögliche Fehler

  • 403insufficient_scope Dem Schlüssel fehlt der Scope services:secrets. Ohne Code: fehlende Berechtigung beim geteilten Dienst.
  • 409 Das Passwort kann gerade nicht gesetzt werden; Feld reason: agent_down, stopped, rescue, command_disabled, not_configured, no_permission oder busy.
  • 429 Limit von 3 pro Stunde oder 10 pro Tag überschritten.
  • 502 Der Agent hat das Passwort nicht gesetzt, das alte gilt weiter (reason failed oder unavailable).

Gameserver

GET/services/{id}/alertsEinstellungen für Absturz- und Ausfallwarnungen

Gibt die Warnungseinstellungen eines Gameservers oder Discord-Bots zurück (E-Mail, Discord-Webhook, Ereignisse) sowie den Verlauf der letzten Warnungen. Die Webhook-Adresse wird nie zurückgegeben, nur ihr Ende. Nur für den Besitzer.

Berechtigung: services:settings

Parameter in der Adresse

NameTypPflichtBeschreibung
langstringneinSprache der Meldungen: en, sonst cs.

Beispielantwort

{
  "settings": {
    "enabled": true,
    "email": true,
    "discord": {
      "hint": "discord.com/api/webhooks/…ab12",
      "disabled": false
    },
    "events": {
      "crash": true,
      "down": true,
      "recovered": true,
      "cleanExit": false,
      "node": true
    },
    "includeLog": true,
    "updatedAt": "2026-11-02T18:20:00.000Z"
  },
  "history": [
    {
      "id": "alr_01",
      "at": "2026-11-06T21:14:03.000Z",
      "kind": "crash",
      "exitCode": 137,
      "oom": true,
      "reason": null,
      "cause": null,
      "suppressed": null,
      "channels": {
        "email": "sent",
        "discord": "sent"
      },
      "extra": 0,
      "downtimeMin": null
    }
  ]
}

Mögliche Fehler

  • 403 Nur für den Besitzer des Dienstes.
POST/services/{id}/alertsWarnungen speichern, testen oder abschalten

Ändert die Warnungseinstellungen, gewählt über das Feld action. Ein neuer Discord-Webhook wird nur gespeichert, wenn eine Testnachricht ankommt. Der Body darf keine anderen Felder enthalten. Nur für den Besitzer.

Berechtigung: services:settings

Parameter in der Adresse

NameTypPflichtBeschreibung
langstringneinSprache der Meldungen: en, sonst cs.

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
actionstringjasave, test (Testnachricht an den gespeicherten Webhook, einmal pro Minute und 5-mal pro Stunde), removeDiscord oder disable.
enabledbooleanneinsave: Überwachung einschalten.
emailbooleanneinsave: Warnungen per E-Mail an den Besitzer senden.
eventsobjectneinsave: welche Ereignisse gemeldet werden, Schlüssel crash, down, recovered, cleanExit, node (boolean).
includeLogbooleanneinsave: Ende des Logs anhängen.
webhookstringneinsave: neue Discord-Webhook-Adresse (https://discord.com/api/webhooks/…), höchstens 300 Zeichen.

Beispielinhalt

{
  "action": "save",
  "enabled": true,
  "email": true,
  "events": {
    "crash": true,
    "down": true,
    "recovered": true,
    "cleanExit": false,
    "node": true
  },
  "includeLog": true
}

Beispielantwort

{
  "ok": true,
  "settings": {
    "enabled": true,
    "email": true,
    "discord": null,
    "events": {
      "crash": true,
      "down": true,
      "recovered": true,
      "cleanExit": false,
      "node": true
    },
    "includeLog": true,
    "updatedAt": "2026-11-07T10:05:00.000Z"
  }
}

Mögliche Fehler

  • 400bad-request Ungültiger Body oder zusätzliche Felder.
  • 400webhook Die Adresse ist kein Discord-Webhook.
  • 400test-failed Die Testnachricht konnte nicht zugestellt werden.
  • 400no-webhook test: es ist kein Webhook gespeichert.
  • 400no-channel Aktive Überwachung braucht E-Mail oder einen Webhook.
  • 429rate Eine Testnachricht ist einmal pro Minute und 5-mal pro Stunde möglich.
  • 500failed Die Einstellungen konnten nicht gespeichert werden.
  • 403 Nur für den Besitzer des Dienstes.
GET/services/{id}/gameNetzwerk, Datenbanken, Backups oder Start

Gibt einen Teil der Einstellungen eines Gameservers oder Discord-Bots zurück, gewählt über den Parameter section. Datenbankpasswörter und geheime Variablenwerte erhalten nur der Besitzer und Mitglieder mit der Berechtigung Geheime Daten.

Berechtigung: services:settings

Parameter in der Adresse

NameTypPflichtBeschreibung
sectionstringjanetwork (Ports und SFTP), databases (Datenbanken), backups (Backups und Backup-Zusatz) oder startup (Startbefehl und Variablen).
localestringneinSprache der Meldungen bei verweigertem Zugriff: cs, en, sk, pl oder de.

Beispielantwort

{
  "allocations": [
    {
      "id": 1201,
      "ip": "203.0.113.10",
      "port": 25565,
      "notes": null,
      "primary": true
    },
    {
      "id": 1202,
      "ip": "203.0.113.10",
      "port": 25566,
      "notes": "Dynmap",
      "primary": false
    }
  ],
  "limit": 3,
  "sftp": {
    "ip": "203.0.113.10",
    "port": 2022
  }
}

Mögliche Fehler

  • 400 Der Abschnitt (section) fehlt oder ist unbekannt.
  • 403 Es fehlt die Berechtigung für diesen Abschnitt (Netzwerk, Datenbanken, Backups oder Einstellungen).
  • 412 Der Server ist im Game-Panel noch nicht verfügbar.
POST/services/{id}/gameDatenbanken, Backups, Variablen, Ports und Neuinstallation

Führt eine Aktion auf einem Gameserver oder Discord-Bot aus, gewählt über das Feld action. Wiederherstellen und Löschen eines Backups, Löschen einer Datenbank und Neuinstallation sind endgültig; die Neuinstallation stoppt den Server und überschreibt Dateien.

Berechtigung: services:settings

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
actionstringjacreateDatabase, rotateDatabasePassword, deleteDatabase, createBackup, restoreBackup, deleteBackup, lockBackup (sperrt oder entsperrt), setVariable, reinstall, addAllocation oder removeAllocation.
namestringneincreateDatabase: Datenbankname, 1–48 Zeichen (Buchstaben, Ziffern, Unterstrich), Pflicht. createBackup: optionaler Backup-Name, höchstens 191 Zeichen.
remotestringneincreateDatabase: von wo Verbindungen zur Datenbank erlaubt sind (IP-Adresse oder %). Standard % = von überall.
databaseIdstringneinrotateDatabasePassword, deleteDatabase: Datenbank-ID aus GET ?section=databases.
uuidstring (uuid)neinrestoreBackup, deleteBackup, lockBackup: Backup-UUID aus GET ?section=backups.
truncatebooleanneinrestoreBackup: vor der Wiederherstellung alle Serverdateien löschen. Standard false.
keystringneinsetVariable: Name der Startvariable (Großbuchstaben, Ziffern, Unterstrich).
valuestringneinsetVariable: neuer Wert, höchstens 4096 Zeichen, ohne Steuerzeichen.
allocationIdintegerneinremoveAllocation: Port-ID aus GET ?section=network. Der Hauptport kann nicht entfernt werden.
localestringneinSprache der Meldungen: cs, en, sk, pl oder de. Standard cs.

Beispielinhalt

{
  "action": "setVariable",
  "key": "MAX_PLAYERS",
  "value": "32"
}

Beispielantwort

{
  "ok": true,
  "value": "32"
}

Mögliche Fehler

  • 400 Ungültiger Anfragetext oder Datenbankname.
  • 400CONTROL_CHARS Der Variablenwert enthält Steuerzeichen.
  • 403 Fehlende Berechtigung für die Aktion; die Neuinstallation braucht zusätzlich Dateien und Ein-/Ausschalten.
  • 403SECRETS_REQUIRED Eine geheime Variable darf nur der Besitzer oder ein Mitglied mit der Berechtigung Geheime Daten ändern.
  • 403FILES_REQUIRED Die Code-Quelle des Discord-Bots kann nur mit der Berechtigung Dateien geändert werden.
  • 404 Das Backup existiert nicht.
  • 409MANAGED_VARIABLE Die Variable wird von StormHost verwaltet und kann nicht geändert werden.
  • 409MC_MANAGED_VARIABLE Bei Minecraft wird diese Variable im Tab Software gesetzt.
  • 409PROTECTED_ARGUMENT Freie Argumente dürfen geschützte Parameter (z. B. RCON) nicht überschreiben.
  • 409JOB_RUNNING Auf dem Minecraft-Server läuft gerade eine Softwareänderung.
  • 409PORT_LIMIT Das Paket hat keinen freien Port mehr.
  • 409NO_FREE_PORT Auf dem Knoten ist gerade kein Port frei.
  • 412 Der Server ist im Game-Panel noch nicht verfügbar.
GET/services/{id}/game/backup-downloadBackup des Gameservers herunterladen

Lädt das Backup-Archiv (.tar.gz) eines Gameservers oder Discord-Bots herunter. Das Archiv enthält alle Dateien einschließlich geheimer Daten, daher brauchen Mitglieder auch die Berechtigung Dateien.

Berechtigung: services:backups

Parameter in der Adresse

NameTypPflichtBeschreibung
uuidstring (uuid)jaBackup-UUID aus GET …/game?section=backups.
localestringneinSprache der Meldungen bei verweigertem Zugriff: cs, en, sk, pl oder de.

Beispielantwort

Binární soubor (Content-Type: application/gzip, Content-Disposition: attachment; filename="backup-….tar.gz")

Mögliche Fehler

  • 400 Die UUID fehlt oder ist ungültig.
  • 403 Es fehlt die Berechtigung Backups oder Dateien.
  • 404 Das Backup existiert nicht.
  • 502 Das Backup konnte nicht aus dem Game-Panel geladen werden.
  • 429 Höchstens 10 Downloads pro Minute.
GET/services/{id}/schedulesZeitpläne des Gameservers oder Bots

Gibt die geplanten Aufgaben (Neustart, Backup, Befehl, Start oder Stopp) eines Gameservers oder Discord-Bots zurück, mit nächster und letzter Ausführung, Limits und freien Backup-Plätzen.

Berechtigung: services:settings

Parameter in der Adresse

NameTypPflichtBeschreibung
localestringneinSprache der Texte in der Antwort: en, sonst cs.

Beispielantwort

{
  "schedules": [
    {
      "id": 41,
      "name": "Denní restart",
      "cron": {
        "minute": "0",
        "hour": "5",
        "dom": "*",
        "month": "*",
        "dow": "*"
      },
      "target": {
        "minute": "0",
        "hour": "5",
        "dom": "*",
        "month": "*",
        "dow": "*"
      },
      "active": true,
      "onlyWhenOnline": false,
      "processing": false,
      "stuck": false,
      "lastRunAt": "2026-11-07T04:00:00.000Z",
      "nextRunAt": "2026-11-08T04:00:00.000Z",
      "kind": "restart",
      "preset": {
        "kind": "restart",
        "repeat": {
          "kind": "daily",
          "time": "05:00"
        },
        "countdown": {
          "m5": true,
          "m1": true,
          "s10": true
        }
      },
      "origin": "portal",
      "author": "you",
      "lastResult": "ok",
      "lastResultCause": null,
      "allowed": true
    }
  ],
  "panelZone": {
    "expected": "Europe/Prague",
    "detected": "Europe/Prague",
    "ok": true,
    "preview": "Europe/Prague"
  },
  "backupSlots": 1,
  "canBackup": true,
  "backupAddonPriceCzk": 120,
  "game": "minecraft",
  "countdown": true,
  "mcVersion": "1.21.4",
  "isOwner": true,
  "permissions": {
    "console": true,
    "power": true,
    "backups": true
  },
  "limits": {
    "maxSchedules": 10,
    "nameMax": 60,
    "commandMax": 256,
    "messageMax": 100,
    "hourSteps": [
      1,
      2,
      3,
      4,
      6,
      8,
      12
    ]
  }
}

Mögliche Fehler

  • 403 Es fehlt die Berechtigung Einstellungen.
  • 412 Der Server ist im Game-Panel noch nicht verfügbar.
POST/services/{id}/schedulesZeitplan anlegen, ändern, ausführen oder löschen

Verwaltet Zeitpläne, gewählt über das Feld action. Ein Server hat höchstens 10 Zeitpläne; ein Befehl frühestens alle 15 Minuten, Neustart und Start oder Stopp stündlich, ein Backup einmal täglich und nur ein Backup-Zeitplan.

Berechtigung: services:settings

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
actionstringjacreate, update, delete, toggle (aktivieren oder deaktivieren), run (sofort ausführen, höchstens einmal pro Minute) oder unstick (hängenden Zeitplan freigeben).
scheduleIdintegerneinAlle Aktionen außer create: Zeitplan-ID aus GET.
presetobjectneincreate, update: kind restart (repeat, countdown {m5, m1, s10}, message bis 100 Zeichen), backup (repeat), command (repeat, command bis 256 Zeichen, onlyWhenOnline) oder power (repeat, signal start|stop).
preset.repeatobjectneinWiederholung: {kind: daily, time: "HH:MM"}, {kind: weekly, days: [0–6, 0 = Sonntag], time}, {kind: hours, every: 1|2|3|4|6|8|12, minute: 0–59} oder {kind: cron, expr}.
namestringneincreate, update: Name des Zeitplans, höchstens 60 Zeichen.
ackbooleanneincreate, update: bei einem Backup-Zeitplan muss es true sein (Bestätigung, dass das neue Backup das ältere ersetzt).
activebooleanneintoggle: true aktiviert, false deaktiviert.
localestringneinSprache der Meldungen: cs, en, sk, pl oder de. Standard cs.

Beispielinhalt

{
  "action": "create",
  "name": "Noční restart",
  "preset": {
    "kind": "restart",
    "repeat": {
      "kind": "daily",
      "time": "04:30"
    },
    "countdown": {
      "m5": true,
      "m1": true,
      "s10": false
    },
    "message": "Server se za chvíli restartuje."
  }
}

Beispielantwort

{
  "ok": true,
  "id": 42
}

Mögliche Fehler

  • 400INVALID Der Zeitplan ist nicht korrekt ausgefüllt.
  • 400GAP Der Zeitplan würde zu oft laufen.
  • 400BACKUP_ACK Bei einem Backup-Zeitplan fehlt ack: true.
  • 400COMMAND_FORBIDDEN Der Befehl würde den Server stoppen oder neu starten; nutzen Sie die Vorlage restart oder power.
  • 403FORBIDDEN Für den Zeitplan fehlt eine Berechtigung (je nach Aufgabe Konsole, Ein-/Ausschalten oder Backups).
  • 404NOT_FOUND Der Zeitplan existiert nicht.
  • 409LIMIT Der Server hat bereits 10 Zeitpläne.
  • 409BACKUP_SLOTS Geplante Backups brauchen den Backup-Zusatz.
  • 409BACKUP_EXISTS Ein Backup-Zeitplan existiert bereits.
  • 409NOT_EDITABLE Der Zeitplan wurde außerhalb des Portals erstellt; er kann nur deaktiviert oder gelöscht werden.
  • 409PANEL_TZ Zeitpläne zu einer festen Uhrzeit gehen gerade nicht, vorerst nur stündliche Wiederholung.
  • 409SUSPENDED Der Server ist gesperrt.
  • 409JOB_RUNNING Auf dem Minecraft-Server läuft eine Softwareänderung.
  • 429RATE Ein Zeitplan kann höchstens einmal pro Minute ausgeführt werden.
  • 502PARTIAL Der Zeitplan wurde nicht vollständig gespeichert und bleibt deaktiviert.
GET/services/{id}/vip-shopVIP-Shop des Minecraft-Servers

Gibt den VIP-Shop eines Minecraft-Servers zurück: Shopdaten, Artikel mit Preisaufschlüsselung, aktuelle Sätze und eine monatliche Verkaufsübersicht. Nur für den Besitzer.

Berechtigung: services:settings

Parameter in der Adresse

NameTypPflichtBeschreibung
langstringneinSprache der Meldungen: cs, en, sk, pl oder de. Standard cs.

Beispielantwort

{
  "view": {
    "state": {
      "mode": "live",
      "open": true,
      "checkoutOpen": true
    },
    "usable": true,
    "shop": {
      "id": "shp_3k9d",
      "slug": "muj-server",
      "title": "Můj server",
      "status": "active",
      "sellerName": "Jan Novák",
      "sellerIco": null,
      "sellerEmail": "[email protected]",
      "sellerAddress": null,
      "playerTerms": null,
      "termsVersion": "2026-10-29",
      "termsAcceptedAt": "2026-11-01T09:00:00.000Z",
      "termsCurrent": true,
      "suspendedReason": null,
      "createdAt": "2026-11-01T09:00:00.000Z"
    },
    "items": [
      {
        "id": "itm_8f2a",
        "title": "VIP na 30 dní",
        "description": "Barevné jméno a /fly",
        "priceCzk": 99,
        "category": "Ranky",
        "durationDays": 30,
        "commandsBuy": [
          "lp user {player} parent addtemp vip 30d"
        ],
        "commandsExpire": [],
        "active": true,
        "sortOrder": 0,
        "breakdown": null
      }
    ],
    "rates": null,
    "termsVersion": "2026-10-29",
    "summary": [
      {
        "month": "2026-11",
        "count": 3,
        "priceHaler": 29700,
        "commissionHaler": 1485,
        "feeHaler": 1020,
        "creditHaler": 27195
      }
    ]
  }
}

Mögliche Fehler

  • 400not_minecraft Der VIP-Shop gibt es nur für Minecraft-Server.
  • 404disabled Der VIP-Shop ist für das Konto gerade nicht verfügbar.
  • 503disabled Der VIP-Shop ist noch nicht bereit.
  • 500failed Die Aktion ist fehlgeschlagen.
  • 403 Nur für den Besitzer des Dienstes.
POST/services/{id}/vip-shopVIP-Shop und Artikel bearbeiten

Legt den VIP-Shop an oder bearbeitet ihn, pausiert ihn und verwaltet Artikel, gewählt über das Feld action. Shopdaten werden immer vollständig gesendet; beim Anlegen und nach geänderten Bedingungen ist terms: true nötig. Nur für den Besitzer.

Berechtigung: services:settings

Parameter in der Adresse

NameTypPflichtBeschreibung
langstringneinSprache der Meldungen: cs, en, sk, pl oder de. Standard cs.

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
actionstringjasaveShop, setStatus, saveItem oder deleteItem.
slugstringneinsaveShop: Shop-Adresse, 3–32 Zeichen a–z, 0–9 und Bindestrich.
titlestringneinsaveShop: Shopname (2–60 Zeichen). saveItem: Artikelname (2–60 Zeichen).
sellerNamestringneinsaveShop: Name oder Firma des Verkäufers (2–120 Zeichen).
sellerIcostringneinsaveShop: tschechische Firmennummer des Verkäufers (optional).
sellerEmailstringneinsaveShop: Kontakt-E-Mail des Verkäufers.
sellerAddressstringneinsaveShop: Adresse des Verkäufers, 5–200 Zeichen (optional).
playerTermsstringneinsaveShop: eigene Bedingungen für Spieler, höchstens 20.000 Zeichen (optional).
termsbooleanneinsaveShop: Zustimmung zu den Bedingungen für Shop-Betreiber.
statusstringneinsetStatus: active oder paused.
idstringneinsaveItem: Artikel-ID zum Bearbeiten (ohne ID wird ein neuer angelegt, höchstens 50). deleteItem: Artikel-ID (Pflicht).
descriptionstringneinsaveItem: Beschreibung, höchstens 500 Zeichen.
priceCzkintegerneinsaveItem: Preis in CZK, 10–10.000 (Pflicht).
categorystringneinsaveItem: Kategorie, höchstens 40 Zeichen.
durationDaysinteger | nullneinsaveItem: Laufzeit in Tagen 1–3650, null = dauerhaft.
commandsBuystring[]neinsaveItem: 1–10 Befehle nach dem Kauf, je bis 300 Zeichen; einzige Variable ist {player}; Befehle wie stop, restart, op sind nicht erlaubt.
commandsExpirestring[]neinsaveItem: höchstens 10 Befehle beim Ablauf.
activebooleanneinsaveItem: Artikel im Shop anbieten. Standard true.
sortOrderintegerneinsaveItem: Reihenfolge 0–10.000.

Beispielinhalt

{
  "action": "saveItem",
  "title": "VIP na 30 dní",
  "priceCzk": 99,
  "category": "Ranky",
  "durationDays": 30,
  "commandsBuy": [
    "lp user {player} parent addtemp vip 30d"
  ],
  "commandsExpire": [],
  "active": true
}

Beispielantwort

{
  "ok": true,
  "item": {
    "id": "itm_8f2a",
    "title": "VIP na 30 dní",
    "description": null,
    "priceCzk": 99,
    "category": "Ranky",
    "durationDays": 30,
    "commandsBuy": [
      "lp user {player} parent addtemp vip 30d"
    ],
    "commandsExpire": [],
    "active": true,
    "sortOrder": 0,
    "breakdown": null
  }
}

Mögliche Fehler

  • 400bad Ungültige Anfrage oder unbekannte Aktion.
  • 400 Ungültiges Feld; code und field nennen es, z. B. slug, title, seller_email, terms, item_price, command_denied.
  • 404no_shop Der Dienst hat noch keinen Shop.
  • 404item_not_found Der Artikel existiert nicht.
  • 409slug_taken Die Shop-Adresse ist vergeben.
  • 409suspended Der Shop wurde vom Betreiber gesperrt.
  • 409items_max Der Shop hat bereits 50 Artikel.
  • 400not_minecraft Der VIP-Shop gibt es nur für Minecraft-Server.
  • 500failed Die Aktion ist fehlgeschlagen.
  • 403 Nur für den Besitzer des Dienstes.
GET/services/{id}/vip-shop/salesVerkäufe und Zustellungen des VIP-Shops

Gibt die letzten 50 Verkäufe des VIP-Shops mit Zustellstatus der Befehle, Provision, Gebühr und gutgeschriebenem Guthaben zurück. Beträge in Heller (1/100 CZK). Funktioniert auch bei inaktivem Dienst. Nur für den Besitzer.

Berechtigung: services:settings

Parameter in der Adresse

NameTypPflichtBeschreibung
langstringneinSprache der Meldungen: cs, en, sk, pl oder de. Standard cs.
beforestring (ISO 8601)neinVerkäufe älter als dieser Zeitpunkt (Blättern).

Beispielantwort

{
  "sales": [
    {
      "id": "sal_51c0",
      "number": "VIP-2026-000123",
      "createdAt": "2026-11-05T19:02:11.000Z",
      "paidAt": "2026-11-05T19:03:40.000Z",
      "state": "paid",
      "refundState": null,
      "test": false,
      "itemTitle": "VIP na 30 dní",
      "durationDays": 30,
      "playerName": "Steve_42",
      "buyerEmail": "[email protected]",
      "priceHaler": 9900,
      "commissionHaler": 495,
      "feeHaler": 340,
      "creditHaler": 9065,
      "reversedHaler": null,
      "deliveries": [
        {
          "id": "dlv_77aa",
          "kind": "purchase",
          "state": "done",
          "attempts": 1,
          "nextAttemptAt": null,
          "doneAt": "2026-11-05T19:03:52.000Z",
          "lastErrorCode": null,
          "sent": 1,
          "total": 1
        }
      ]
    }
  ]
}

Mögliche Fehler

  • 404no_shop Der Dienst hat noch keinen Shop.
  • 400not_minecraft Der VIP-Shop gibt es nur für Minecraft-Server.
  • 500failed Die Aktion ist fehlgeschlagen.
  • 403 Nur für den Besitzer des Dienstes.
POST/services/{id}/vip-shop/salesZustellung der Befehle erneut versuchen

Versucht sofort erneut, die Befehle einer Zustellung an den Server zu senden. Höchstens 10-mal pro Minute je Dienst. Nur für den Besitzer.

Berechtigung: services:settings

Parameter in der Adresse

NameTypPflichtBeschreibung
langstringneinSprache der Meldungen: cs, en, sk, pl oder de. Standard cs.

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
actionstringjaretry.
deliveryIdstringjaZustellungs-ID aus GET (deliveries[].id).

Beispielinhalt

{
  "action": "retry",
  "deliveryId": "dlv_77aa"
}

Beispielantwort

{
  "ok": true,
  "state": "done",
  "code": null
}

Mögliche Fehler

  • 400bad Ungültige Anfrage.
  • 404no_shop Der Dienst hat noch keinen Shop.
  • 404delivery_not_found Die Zustellung existiert nicht.
  • 409delivery_state Die Zustellung kann gerade nicht wiederholt werden.
  • 429rate Höchstens 10 Versuche pro Minute.
  • 400not_minecraft Der VIP-Shop gibt es nur für Minecraft-Server.
  • 500failed Die Aktion ist fehlgeschlagen.
  • 403 Nur für den Besitzer des Dienstes.

Minecraft

GET/services/{id}/minecraft/datapacksDatapacks der aktiven Welt

Ohne Parameter liefert es die Datapacks der aktiven Welt. Mit `q` wird auf Modrinth für die Serverversion gesucht, mit `project` kommen die Versionen eines Datapacks.

Berechtigung: services:files

Parameter in der Adresse

NameTypPflichtBeschreibung
qstringneinSuchtext (höchstens 80 Zeichen).
offsetintegerneinVersatz in den Suchergebnissen, Standard 0.
projectstringneinModrinth-Projekt-ID oder Slug, liefert dessen Versionen mit Datei.

Beispielantwort

{
  "version": "1.21.4",
  "world": "world",
  "worldValid": true,
  "worldExists": true,
  "power": "running",
  "busy": null,
  "items": [
    {
      "name": "example-pack.zip",
      "kind": "zip",
      "size": 48211,
      "mtime": 1730970000,
      "source": "modrinth",
      "title": "Example Pack",
      "versionName": "1.2.0",
      "projectId": "AbCdEf12",
      "enabled": true,
      "compat": "ok"
    }
  ],
  "evidenceBroken": false,
  "canConsole": true,
  "maxUploadMb": 50
}

Mögliche Fehler

  • 409NOT_IMPORTED Die Server-Software ist noch nicht festgelegt, zuerst minecraft/software verwenden.
  • 412NO_PANEL Der Server ist im Spielpanel gerade nicht erreichbar.
  • 429 Zu viele Anfragen, bitte gleich noch einmal versuchen.
POST/services/{id}/minecraft/datapacksDatapacks installieren, entfernen, neu laden

`install` lädt ein Datapack von Modrinth in die aktive Welt, auf einem laufenden Server wirkt es erst nach `reload`. `remove` deaktiviert und löscht es, `reload` führt den Befehl `reload` aus (nur laufender Server, bei geteiltem Dienst mit der Berechtigung Konsole). Eigene ZIPs lassen sich über die API nicht hochladen.

Berechtigung: services:files

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
actionstringja`install`, `remove` oder `reload`.
projectIdstringneinNur `install`: Modrinth-Projekt-ID (1–64 Zeichen).
versionIdstringneinNur `install`: Versions-ID aus `GET ?project=` (1–16 Zeichen).
namestringneinNur `remove`: Datei- oder Ordnername des Datapacks aus der Liste (höchstens 120 Zeichen).

Beispielinhalt

{
  "action": "install",
  "projectId": "AbCdEf12",
  "versionId": "XyZ98765"
}

Beispielantwort

{
  "ok": true,
  "file": "example-pack.zip",
  "replaced": null,
  "needsReload": true,
  "packFormat": "61",
  "compat": "ok"
}

Mögliche Fehler

  • 400INVALID Ungültiger Anfrageinhalt.
  • 403FORBIDDEN `reload` ohne Berechtigung Konsole bei einem geteilten Dienst.
  • 404NO_SUCH_PACK In der Welt gibt es kein Datapack mit diesem Namen.
  • 409NAME_TAKEN Ein Datapack mit gleichem Namen existiert bereits, zuerst entfernen.
  • 409TOO_MANY Die Welt hat bereits 100 Datapacks.
  • 409NOT_RUNNING Der Server läuft nicht, bitte starten und erneut versuchen.
  • 409JOB Auf dem Server läuft gerade eine andere Änderung oder Add-on-Installation.
  • 422INCOMPATIBLE Diese Datapack-Version passt nicht zur Serverversion.
  • 422NO_PACK_MCMETA Die Datei ist kein gültiges Datapack (pack.mcmeta fehlt).
  • 429RATE_LIMITED Limit: Installieren und Entfernen 20 pro 10 Minuten, `reload` 10 pro 10 Minuten.
GET/services/{id}/minecraft/dnsEigene Serveradresse

Liefert den Stand der eigenen Adresse (A/AAAA- und SRV-Einträge), den Standardport und die direkte Adresse. Mit `check` wird nur geprüft, ob ein Name frei ist. Haben sich IP oder Port geändert, werden die Einträge beim Lesen angeglichen (`resynced`).

Berechtigung: services:network

Parameter in der Adresse

NameTypPflichtBeschreibung
checkstringneinZu prüfender Name, liefert `{ name, fqdn, available, code?, error? }`.
localestringneinSprache der Fehlermeldungen der Zugriffsprüfung: cs, en, sk, pl, de.

Beispielantwort

{
  "enabled": true,
  "zone": "play.example.com",
  "ttl": 300,
  "nameMin": 3,
  "nameMax": 32,
  "current": {
    "name": "mujserver",
    "fqdn": "mujserver.play.example.com",
    "zone": "play.example.com",
    "ip": "203.0.113.10",
    "port": 25565,
    "recordType": "A",
    "srvName": "_minecraft._tcp.mujserver.play.example.com",
    "createdAt": "2026-11-07T10:15:00.000Z",
    "updatedAt": null,
    "records": {
      "address": "ok",
      "srv": "ok"
    }
  },
  "allocation": {
    "ip": "203.0.113.10",
    "alias": null,
    "port": 25565
  },
  "directAddress": "203.0.113.10:25565",
  "allocationError": null,
  "allocationErrorCode": null,
  "recordsError": null,
  "recordsErrorCode": null,
  "resynced": false,
  "canManage": true
}

Mögliche Fehler

  • 400NOT_MINECRAFT Der Dienst ist kein Minecraft-Server.
  • 503PANEL Die Serververwaltung ist vorübergehend nicht verfügbar.
  • 500SETUP_FAILED Konnte nicht abgeschlossen werden, bitte später erneut versuchen.
POST/services/{id}/minecraft/dnsAdresse anlegen, ändern, entfernen

Legt die Adresse `<name>.<zone>` an, benennt sie um, löscht sie oder schreibt die Einträge für aktuelle IP und Port neu (`resync`). Der Dienst muss aktiv sein; höchstens 5 Änderungen pro Stunde und 20 pro Tag.

Berechtigung: services:network

Parameter in der Adresse

NameTypPflichtBeschreibung
localestringneinSprache der Fehlermeldungen der Zugriffsprüfung: cs, en, sk, pl, de.

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
actionstringja`create`, `rename`, `delete` oder `resync`.
namestringneinFür `create` und `rename`: 3–32 Zeichen, Kleinbuchstaben a–z, Ziffern und Bindestriche (nicht am Anfang oder Ende).

Beispielinhalt

{
  "action": "create",
  "name": "mujserver"
}

Beispielantwort

{
  "ok": true,
  "current": {
    "name": "mujserver",
    "fqdn": "mujserver.play.example.com",
    "zone": "play.example.com",
    "ip": "203.0.113.10",
    "port": 25565,
    "recordType": "A",
    "srvName": "_minecraft._tcp.mujserver.play.example.com",
    "createdAt": "2026-11-07T10:15:00.000Z",
    "updatedAt": null,
    "records": {
      "address": "ok",
      "srv": "ok"
    }
  }
}

Mögliche Fehler

  • 400INVALID Ungültiger Anfrageinhalt.
  • 400INVALID_NAME Der Name entspricht nicht den Regeln.
  • 400RESERVED Der Name ist reserviert.
  • 400SAME_NAME Der Server hat diese Adresse bereits.
  • 404NONE Der Server hat keine eigene Adresse.
  • 409TAKEN Die Adresse ist vergeben.
  • 409EXISTS Der Server hat bereits eine eigene Adresse, `rename` verwenden.
  • 409NO_ALLOCATION Der Server hat keinen Standardport.
  • 409NOT_PUBLIC Die Standardadresse des Servers ist nicht öffentlich.
  • 412NO_PANEL_LINK Der Server ist im Spielpanel gerade nicht erreichbar.
  • 429RATE_LIMITED Änderungslimit überschritten, bitte später erneut versuchen.
  • 503DISABLED Eigene Adressen sind gerade nicht verfügbar.
  • 502DNS Das Schreiben der DNS-Einträge ist fehlgeschlagen.
GET/services/{id}/minecraft/eulaStand der EULA-Zustimmung

Gibt an, ob die Minecraft-Lizenz in eula.txt akzeptiert ist. `accepted: null` bedeutet, dass die Datei noch nicht existiert.

Berechtigung: services:settings

Beispielantwort

{
  "accepted": false,
  "acceptedAt": null,
  "url": "https://aka.ms/MinecraftEULA"
}

Mögliche Fehler

  • 412 Der Server ist im Spielpanel gerade nicht erreichbar (Meldung `panel.unavailable` in `msg`).
  • 429 Zu viele Anfragen, bitte gleich noch einmal versuchen.
POST/services/{id}/minecraft/eulaEULA akzeptieren

Schreibt `eula=true` in eula.txt. Mit `start: true` wird ein ausgeschalteter Server zusätzlich gestartet (bei geteiltem Dienst mit der Berechtigung Stromversorgung). Limit 10 pro 10 Minuten.

Berechtigung: services:settings

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
acceptbooleanjaMuss `true` sein.
startbooleanneinNach der Zustimmung einen ausgeschalteten Server starten.

Beispielinhalt

{
  "accept": true,
  "start": true
}

Beispielantwort

{
  "ok": true,
  "accepted": true,
  "acceptedAt": "2026-11-07T10:15:00.000Z",
  "started": true,
  "startError": null,
  "startErrorMsg": null
}

Mögliche Fehler

  • 400 `accept: true` fehlt.
  • 403 `start` ohne Berechtigung Stromversorgung.
  • 409 Auf dem Server läuft gerade eine Änderung (Job).
  • 412 Der Server ist im Spielpanel gerade nicht erreichbar (Meldung `panel.unavailable` in `msg`).
GET/services/{id}/minecraft/gamerulesSpielregeln der aktiven Welt

Liefert die für die Serverversion gültigen Spielregeln mit aktuellem und Standardwert. Bei geteiltem Dienst ist die Berechtigung Konsole nötig.

Berechtigung: services:settings

Parameter in der Adresse

NameTypPflichtBeschreibung
langstringneinSprache der Regelnamen: `cs` (Standard) oder `en`.

Beispielantwort

{
  "version": "1.21.4",
  "world": "world",
  "worldValid": true,
  "power": "running",
  "busy": null,
  "perDimension": true,
  "source": "file",
  "fileAt": "2026-11-07T10:15:00.000Z",
  "pending": [],
  "rules": [
    {
      "id": "minecraft:keep_inventory",
      "name": "keepInventory",
      "type": "bool",
      "min": null,
      "max": null,
      "group": "players",
      "common": true,
      "label": "Keep inventory after death",
      "value": false,
      "default": false
    }
  ]
}

Mögliche Fehler

  • 409NOT_IMPORTED Die Server-Software ist noch nicht festgelegt, zuerst minecraft/software verwenden.
  • 412NO_PANEL Der Server ist im Spielpanel gerade nicht erreichbar.
  • 413FILE_TOO_LARGE Die Regeldatei ist zu groß.
  • 422FILE_CORRUPT Die Regeldatei ist beschädigt.
  • 429 Zu viele Anfragen, bitte gleich noch einmal versuchen.
POST/services/{id}/minecraft/gamerulesSpielregeln ändern

Setzt die Regeln per `gamerule`-Befehl auf dem laufenden Server, sie gelten sofort ohne Neustart. Höchstens 30 Regeln auf einmal, Limit 30 Anfragen pro 10 Minuten.

Berechtigung: services:settings

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
rulesobjectjaZuordnung von Regel-`id` (aus GET) zu einem `boolean` oder einer Ganzzahl.
allDimensionsbooleanneinAuf Paper und Abwandlungen in allen Dimensionen setzen, Standard `true`.

Beispielinhalt

{
  "rules": {
    "minecraft:keep_inventory": true,
    "minecraft:spawn_radius": 0
  },
  "allDimensions": true
}

Beispielantwort

{
  "ok": true,
  "world": "world",
  "results": [
    {
      "id": "minecraft:keep_inventory",
      "status": "set"
    },
    {
      "id": "minecraft:spawn_radius",
      "status": "unchanged"
    }
  ]
}

Mögliche Fehler

  • 400INVALID Ungültiger Anfrageinhalt.
  • 400NO_CHANGES `rules` ist leer.
  • 400UNKNOWN_RULE Die Regel gibt es in der Serverversion nicht (Feld `rule`).
  • 400INVALID_VALUE Ungültiger Regelwert (Feld `rule`).
  • 409NOT_RUNNING Der Server läuft nicht, bitte starten und erneut versuchen.
  • 409NOT_IMPORTED Die Server-Software ist noch nicht festgelegt, zuerst minecraft/software verwenden.
  • 409JOB Auf dem Server läuft gerade eine andere Änderung oder Add-on-Installation.
  • 429CONSOLE_BUSY Die Serverkonsole ist ausgelastet.
  • 412NO_PANEL Der Server ist im Spielpanel gerade nicht erreichbar.
GET/services/{id}/minecraft/jobStand der laufenden Serveränderung

Liefert den letzten Job (Software-Wechsel, Neuinstallation, Modpack, Welt) mit Schritt, Protokoll und Fortschritt. Nach dem Start etwa alle 2 s abfragen, bis `status` `done` oder `failed` ist; ein hängender Job wird mit `interrupted: true` auf `failed` gesetzt.

Berechtigung: services:settings

Beispielantwort

{
  "job": {
    "id": "k3j9x2m1q8",
    "kind": "switch",
    "status": "running",
    "step": "install",
    "log": [
      {
        "at": "2026-11-07T10:15:00.000Z",
        "key": "job.log.installing",
        "params": {
          "label": "Paper 1.21.4"
        }
      }
    ],
    "startedAt": "2026-11-07T10:15:00.000Z",
    "updatedAt": "2026-11-07T10:16:10.000Z",
    "error": null,
    "errorMsg": null,
    "progress": {
      "done": 42,
      "total": 168,
      "unit": "files",
      "bytesDone": null,
      "bytesTotal": null
    },
    "from": {
      "type": "paper",
      "version": "1.21.1",
      "build": "130"
    },
    "target": {
      "type": "paper",
      "version": "1.21.4",
      "build": "232"
    },
    "destructive": true,
    "finishedAt": null
  },
  "active": true
}

Mögliche Fehler

  • 429 Zu viele Anfragen, bitte gleich noch einmal versuchen.
POST/services/{id}/minecraft/jobAbgeschlossenen Job ausblenden

Blendet einen abgeschlossenen oder fehlgeschlagenen Job aus, damit GET ihn nicht mehr liefert. Laufende Jobs lassen sich nicht ausblenden.

Berechtigung: services:settings

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
actionstringjaImmer `dismiss`.
jobIdstringjaJob-`id` aus GET (8–40 Kleinbuchstaben und Ziffern).

Beispielinhalt

{
  "action": "dismiss",
  "jobId": "k3j9x2m1q8"
}

Beispielantwort

{
  "ok": true
}

Mögliche Fehler

  • 400 Ungültiger Anfrageinhalt (Meldungsschlüssel in `msg`).
  • 409 Der Job läuft noch oder ist nicht mehr der letzte.
GET/services/{id}/minecraft/modpacksModpacks: Stand, Suche und Vorschau

Ohne Parameter liefert es das installierte Modpack, zurückgelegte Dateien und die Warteschlange. `search` sucht auf Modrinth, `project` liefert ein Projekt mit Versionen, `preview` zeigt, was eine Installation täte (ändert nichts), `serverFiles=1` listet .mrpack-Dateien im Server-Stammverzeichnis.

Berechtigung: services:files

Parameter in der Adresse

NameTypPflichtBeschreibung
searchstringneinSuchtext auf Modrinth.
mcstringneinMit `search`: Minecraft-Version, z. B. `1.21.1`.
loaderstringneinMit `search`: `fabric`, `forge` oder `neoforge`.
sortstringneinMit `search`: `downloads`, `relevance` oder `newest`.
offsetintegerneinMit `search`: Versatz in den Ergebnissen.
projectstringneinProjekt-ID oder Slug; mit `preview=modrinth` nur die ID (8 Zeichen).
previewstringnein`modrinth` (mit `project` und `version`) oder `upload` (mit `upload`).
versionstringneinMit `preview=modrinth`: Versions-ID (8 Zeichen).
uploadstringneinMit `preview=upload`: `id` aus der Aktion `stageServerFile` (24 Hex-Zeichen).
modestringneinMit `preview`: `all` (Standard), `keep-world` oder `wipe`.
serverFilesstringnein`1` listet .mrpack-Dateien im Stammverzeichnis.

Beispielantwort

{
  "installed": null,
  "aside": null,
  "recovering": false,
  "server": {
    "type": "fabric",
    "version": "1.21.1",
    "memoryMib": 8192
  },
  "perms": {
    "install": true,
    "rollback": true,
    "deleteAside": true,
    "wipe": true,
    "replaceBackup": true
  },
  "queue": {
    "active": 0,
    "waiting": 0,
    "limit": 2
  },
  "limits": {
    "uploadMaxMb": 95,
    "serverFileMaxMb": 1024,
    "serverMb": 3072,
    "files": 30000
  }
}

Mögliche Fehler

  • 400 Ungültiges Projekt, Version, Upload oder Modus (Meldungsschlüssel in `msg`).
  • 429 Zu viele Anfragen, bitte gleich noch einmal versuchen.
POST/services/{id}/minecraft/modpacksModpack installieren oder zurücksetzen

`install` und `rollback` starten einen Hintergrund-Job (Antwort 202), den Fortschritt liefert minecraft/job. Der Server wird dabei gestoppt; `all` legt alte Dateien zurück (rückgängig mit `rollback`), `wipe` löscht alles (nur Inhaber). Limit 3 pro Stunde je Dienst (gemeinsam mit Software-Wechsel) und 10 pro Tag je Kunde; eigene .mrpack per SFTP hochladen und mit `stageServerFile` vorbereiten.

Berechtigung: services:files

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
actionstringja`install`, `rollback`, `deleteAside` oder `stageServerFile`.
originstringnein`install`: `modrinth` oder `mrpack` (eigene Datei).
projectIdstringnein`install` von Modrinth: Projekt-ID (8 Zeichen).
versionIdstringnein`install` von Modrinth: Versions-ID (8 Zeichen).
uploadIdstringnein`install` mit `mrpack`: `id` aus `stageServerFile` (24 Hex-Zeichen).
modestringnein`install`: `all` (alles ersetzen, Altes zurücklegen), `keep-world` (Welt und server.properties behalten) oder `wipe` (alles löschen, nur Inhaber).
replaceBackupbooleanneinBei vollen Backup-Plätzen das älteste Backup überschreiben (Inhaber oder Berechtigung Backups).
acceptEulabooleanneinDie Minecraft-Lizenz (EULA) bei der Installation akzeptieren.
confirmDowngradebooleanneinInstallation einer älteren Minecraft-Version als die der Welt bestätigen.
namestringnein`stageServerFile`: Name der .mrpack-Datei im Stammverzeichnis (bis 1 GB).

Beispielinhalt

{
  "action": "install",
  "origin": "modrinth",
  "projectId": "AbCdEf12",
  "versionId": "XyZ98765",
  "mode": "all",
  "acceptEula": true
}

Beispielantwort

{
  "ok": true,
  "job": {
    "id": "k3j9x2m1q8",
    "kind": "modpack",
    "status": "queued",
    "step": "queued",
    "log": [],
    "startedAt": "2026-11-07T10:15:00.000Z",
    "updatedAt": "2026-11-07T10:15:00.000Z",
    "error": null,
    "errorMsg": null,
    "progress": null
  },
  "warnings": []
}

Mögliche Fehler

  • 400 Ungültiger Anfrageinhalt (Meldungsschlüssel in `msg`).
  • 403 Berechtigungen Einstellungen, Dateien und Stromversorgung fehlen (Meldungsschlüssel in `msg`).
  • 403WIPE_OWNER Nur der Inhaber darf `wipe` verwenden.
  • 403BACKUP_PERMISSION `replaceBackup` ohne Berechtigung Backups.
  • 409JOB_RUNNING Auf dem Server läuft bereits ein anderer Job.
  • 409ADDON_RUNNING Eine Plugin- oder Mod-Installation läuft.
  • 409QUEUE_FULL Die Installationswarteschlange ist voll, bitte später erneut versuchen.
  • 409DISK Zu wenig Speicherplatz auf dem Server (`details.freeMb`, `details.needMb`).
  • 409DOWNGRADE Das Modpack nutzt eine ältere Minecraft-Version, mit `confirmDowngrade` bestätigen.
  • 422LOADER Der Loader des Modpacks lässt sich gerade nicht installieren.
  • 429 Installationslimit überschritten (stündlich je Dienst oder täglich je Kunde).
GET/services/{id}/minecraft/player-statsDiagramm der Spielerzahl

Liefert Diagrammpunkte der Online-Spieler für den Zeitraum mit Durchschnitt, Spitze und Rekord. Ist das Sammeln aus, ist `enabled` `false` und `points` leer.

Berechtigung: services:settings

Parameter in der Adresse

NameTypPflichtBeschreibung
rangestringnein`24h` (Standard, Punkte alle 5 min), `7d` (stündlich) oder `30d` (alle 4 h).

Beispielantwort

{
  "enabled": true,
  "collecting": true,
  "range": "24h",
  "canToggle": true,
  "bucketSec": 300,
  "points": [
    {
      "t": 1730973600000,
      "peak": 4,
      "avg": 2.5,
      "slots": 20,
      "state": "up"
    }
  ],
  "average": 2.1,
  "peak": {
    "online": 6,
    "at": "2026-11-07T10:15:00.000Z"
  },
  "record": {
    "online": 14,
    "at": "2026-10-20T19:40:00.000Z"
  },
  "last": {
    "at": "2026-11-07T10:15:00.000Z",
    "online": 3,
    "max": 20
  }
}

Mögliche Fehler

  • 503unavailable Das Spielerdiagramm ist noch nicht verfügbar.
  • 502ERROR Das Diagramm konnte nicht geladen werden.
  • 429 Zu viele Anfragen, bitte gleich noch einmal versuchen.
POST/services/{id}/minecraft/player-statsSpielerdiagramm ein- oder ausschalten

Schaltet das Erfassen der Spielerzahl ein oder aus. Ausschalten löscht alle gesammelten Daten des Dienstes (`deleted`). Limit 10 pro 10 Minuten.

Berechtigung: services:settings

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
enabledbooleanja`true` einschalten, `false` ausschalten und Daten löschen.

Beispielinhalt

{
  "enabled": false
}

Beispielantwort

{
  "ok": true,
  "enabled": false,
  "deleted": 2016
}

Mögliche Fehler

  • 400INVALID Ungültiger Anfrageinhalt.
  • 503unavailable Das Spielerdiagramm ist noch nicht verfügbar.
  • 429 Zu viele Anfragen, bitte gleich noch einmal versuchen.
GET/services/{id}/minecraft/playersSpieler, Whitelist, Operatoren und Banns

Liefert Whitelist, Operatoren, Banns und IP-Banns aus den Serverdateien, Einstellungen aus server.properties und Online-Spieler (nur mit Berechtigung Konsole). Mit `lookup` wird ein Nick bei Mojang geprüft.

Berechtigung: services:settings

Parameter in der Adresse

NameTypPflichtBeschreibung
lookupstringneinZu prüfender Spielername, liefert `{ lookup: { query, found, name, uuid } }` (Berechtigung Konsole).

Beispielantwort

{
  "power": "running",
  "busy": null,
  "canConsole": true,
  "version": "1.21.4",
  "settings": {
    "whitelist": true,
    "enforceWhitelist": false,
    "onlineMode": true,
    "opLevel": 4,
    "propsMissing": false
  },
  "propsInvalid": false,
  "floodgatePrefix": null,
  "online": {
    "online": 1,
    "max": 20,
    "players": [
      {
        "name": "Steve",
        "uuid": "0f3c1e2a-4b5d-4c6e-8f70-1a2b3c4d5e6f"
      }
    ],
    "truncated": false,
    "source": "console",
    "at": "2026-11-07T10:15:00.000Z"
  },
  "onlineError": null,
  "onlineErrorMsg": null,
  "lists": {
    "whitelist": {
      "status": "ok",
      "entries": [
        {
          "uuid": "0f3c1e2a-4b5d-4c6e-8f70-1a2b3c4d5e6f",
          "name": "Steve"
        }
      ]
    },
    "ops": {
      "status": "ok",
      "entries": [
        {
          "uuid": "0f3c1e2a-4b5d-4c6e-8f70-1a2b3c4d5e6f",
          "name": "Steve",
          "level": 4,
          "bypassesPlayerLimit": false
        }
      ]
    },
    "bans": {
      "status": "absent",
      "entries": []
    },
    "ipBans": {
      "status": "absent",
      "entries": []
    }
  },
  "known": [],
  "owner": true
}

Mögliche Fehler

  • 400INVALID_NICK Ungültiger Name in `lookup`.
  • 403FORBIDDEN `lookup` ohne Berechtigung Konsole.
  • 503MOJANG_BUSY Die Prüfung bei Mojang ist gerade nicht möglich, in einer Minute erneut versuchen.
  • 412 Der Server ist im Spielpanel gerade nicht erreichbar (Meldung `panel.unavailable` in `msg`).
  • 429 Zu viele Anfragen, bitte gleich noch einmal versuchen.
POST/services/{id}/minecraft/playersWhitelist, Operatoren, Banns und Kick

Auf einem laufenden Server per Befehl, auf einem gestoppten per Dateiänderung (`mode`). Bei geteiltem Dienst ist die Berechtigung Konsole nötig; Limit 30 Änderungen pro 10 Minuten je Dienst und 60 je Kunde.

Berechtigung: services:settings

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
actionstringja`whitelist-add`, `whitelist-remove`, `whitelist-toggle`, `op`, `deop`, `ban`, `pardon`, `pardon-ip`, `kick`, `bedrock-whitelist-add` oder `bedrock-whitelist-remove`.
nickstringneinSpielername (höchstens 40 Zeichen); bei `bedrock-*` der Bedrock-Spielername.
uuidstringneinUUID aus der Liste, zum Entfernen auf gestopptem Server auch ohne gültigen Namen.
levelintegernein`op`: Operator-Stufe 1–4.
bypassesPlayerLimitbooleannein`op`: der Operator kann einem vollen Server beitreten.
reasonstringnein`ban` und `kick`: Grund (höchstens 200 Zeichen).
ipstringnein`pardon-ip`: die gebannte IP-Adresse.
enabledbooleannein`whitelist-toggle` (Pflicht): Whitelist ein- oder ausschalten.

Beispielinhalt

{
  "action": "op",
  "nick": "Steve",
  "level": 4
}

Beispielantwort

{
  "ok": true,
  "mode": "command",
  "result": "done",
  "player": {
    "name": "Steve",
    "uuid": "0f3c1e2a-4b5d-4c6e-8f70-1a2b3c4d5e6f"
  }
}

Mögliche Fehler

  • 400INVALID Ungültiger Anfrageinhalt.
  • 400INVALID_NICK Ungültiger Name oder UUID.
  • 400INVALID_REASON Ungültiger Grund.
  • 400INVALID_IP Ungültige IP-Adresse.
  • 409NOT_RUNNING Die Aktion braucht einen laufenden Server (z. B. `kick`).
  • 409PLAYER_OFFLINE Der Spieler ist nicht online.
  • 409NO_FLOODGATE `bedrock-*`-Aktionen brauchen Floodgate.
  • 409CONFLICT Die Datei hat sich zwischenzeitlich geändert, erneut versuchen.
  • 409JOB Auf dem Server läuft eine andere Änderung.
  • 422PLAYER_UNKNOWN Es gibt keinen Spieler mit diesem Namen.
  • 429RATE_LIMITED Änderungslimit überschritten, bitte später erneut versuchen.
  • 503MOJANG_BUSY Die Prüfung bei Mojang ist gerade nicht möglich.
GET/services/{id}/minecraft/pluginsPlugins und Mods des Servers

Ohne Parameter listet es installierte Plugins oder Mods und `restartRequired`. Die Schalter `search`, `versions`, `plan` und `updates` brauchen keinen Wert (z. B. `?search&source=modrinth&q=maps`); `op` liefert den Stand einer Hintergrundinstallation.

Berechtigung: services:files

Parameter in der Adresse

NameTypPflichtBeschreibung
searchflagneinKatalogsuche (mit `source`, `q`, `offset`).
versionsflagneinKompatible Versionen eines Projekts (mit `source`, `project`).
planflagneinInstallationsvorschau mit Abhängigkeiten ohne Schreiben (mit `source`, `project`, `version`, `deps`).
updatesflagneinNeuere Versionen der über das Portal installierten Dateien.
sourcestringnein`modrinth` oder `hangar` (Hangar nur für Plugins).
qstringneinSuchtext.
offsetintegerneinVersatz in den Suchergebnissen.
projectstringneinProjekt-ID oder Slug (1–64 Zeichen).
versionstringneinMit `plan`: Versions-ID, sonst die neueste kompatible.
depsstringneinMit `plan`: `0` ohne Abhängigkeiten.
opstringneinOperations-ID (UUID) aus einer POST-Antwort mit 202.

Beispielantwort

{
  "context": {
    "type": "paper",
    "kind": "plugins",
    "gameVersion": "1.21.4",
    "versionKnown": true,
    "versionSource": "metadata",
    "dir": "/plugins"
  },
  "sources": [
    "modrinth",
    "hangar"
  ],
  "maxBytes": 104857600,
  "items": [
    {
      "file": "ExamplePlugin-1.2.0.jar",
      "filename": "ExamplePlugin-1.2.0.jar",
      "enabled": true,
      "size": 512000,
      "modifiedAt": 1730970000,
      "managed": true,
      "source": "modrinth",
      "projectId": "AbCdEf12",
      "title": "Example Plugin",
      "icon": null,
      "url": "https://modrinth.com/plugin/example-plugin",
      "versionId": "XyZ98765",
      "versionName": "1.2.0",
      "publishedAt": "2026-11-07T10:15:00.000Z",
      "installedAt": "2026-11-07T10:15:00.000Z",
      "installedByYou": true,
      "dependencyOf": null,
      "unverified": true,
      "fromModpack": null,
      "dataFolder": "ExamplePlugin"
    }
  ],
  "dataFolders": [
    "ExamplePlugin"
  ],
  "folderExists": true,
  "changedAt": "2026-11-07T10:15:00.000Z",
  "restartRequired": true,
  "serverState": "running",
  "jobRunning": false,
  "op": null
}

Mögliche Fehler

  • 400BAD_REQUEST Unbekannte Quelle, Projekt oder Version.
  • 400UNSUPPORTED_TYPE Der Servertyp unterstützt weder Plugins noch Mods (Vanilla).
  • 404OP_NOT_FOUND Die Operation existiert nicht oder ist abgelaufen.
  • 429RATE_LIMITED Limit für Katalogabfragen: 60 pro Minute.
  • 502SOURCE_ERROR Der Katalog antwortet gerade nicht.
POST/services/{id}/minecraft/pluginsPlugins und Mods installieren und verwalten

`install` und `update` laufen im Hintergrund: Die fertige Antwort kommt innerhalb von 40 s, sonst 202 mit `pending: true` und `op`; den Stand dann über `GET ?op=` lesen. Änderungen wirken nach einem Serverneustart; Limit 20 Änderungen pro 10 Minuten je Dienst.

Berechtigung: services:files

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
actionstringja`install`, `update`, `remove` oder `toggle`.
sourcestringnein`install`: `modrinth` oder `hangar`.
projectstringnein`install`: Projekt-ID oder Slug.
versionstringnein`install` und `update`: Versions-ID, sonst die neueste kompatible.
dependenciesbooleannein`install`: auch Pflichtabhängigkeiten installieren, Standard `true`.
skipstring[]nein`install`: zu überspringende Abhängigkeits-IDs (höchstens 50).
replacebooleannein`install`: kollidierende Dateien ersetzen, Standard `false`.
filestringnein`update`, `remove`, `toggle`: Dateiname aus der Liste (höchstens 255 Zeichen).
dataFolderstringnein`remove`: auch den Datenordner des Plugins löschen (Name aus `dataFolders`).
enabledbooleannein`toggle` (Pflicht): Datei aktivieren oder deaktivieren.

Beispielinhalt

{
  "action": "install",
  "source": "modrinth",
  "project": "example-plugin",
  "dependencies": true
}

Beispielantwort

{
  "ok": true,
  "op": {
    "id": "3f1c2a7e-9b4d-4e21-8c3a-5d6e7f809a1b",
    "action": "install",
    "status": "done",
    "step": "Hotovo",
    "stepMsg": {
      "key": "plugin.step.done"
    },
    "startedAt": "2026-11-07T10:15:00.000Z",
    "finishedAt": "2026-11-07T10:15:12.000Z",
    "result": {
      "installed": [
        {
          "file": "ExamplePlugin-1.2.0.jar",
          "title": "Example Plugin",
          "versionName": "1.2.0",
          "role": "target"
        }
      ],
      "removed": [],
      "skipped": [],
      "missing": []
    },
    "error": null,
    "errorMsg": null,
    "code": null,
    "data": null
  },
  "result": {
    "installed": [
      {
        "file": "ExamplePlugin-1.2.0.jar",
        "title": "Example Plugin",
        "versionName": "1.2.0",
        "role": "target"
      }
    ],
    "removed": [],
    "skipped": [],
    "missing": []
  }
}

Mögliche Fehler

  • 400BAD_REQUEST Ungültiger Anfrageinhalt oder Projekt-/Versionsangabe.
  • 404NOT_FOUND Datei oder Projekt nicht gefunden.
  • 404NO_VERSION Keine kompatible Version.
  • 409JOB_RUNNING Auf dem Server läuft eine andere Änderung.
  • 409INSTALLING Der Server wird gerade installiert.
  • 409EXISTS Die Datei existiert bereits, `replace` verwenden.
  • 409UP_TO_DATE Die Datei ist bereits aktuell.
  • 413TOO_LARGE Die Datei ist größer als 100 MB.
  • 422INCOMPATIBLE Die Version passt nicht zu diesem Server.
  • 422EXTERNAL Das Projekt lässt sich nur von der Autorenseite laden.
  • 429RATE_LIMITED Limit von 20 Änderungen pro 10 Minuten.
  • 502SOURCE_ERROR Der Katalog antwortet gerade nicht.
GET/services/{id}/minecraft/propertiesInhalt von server.properties

Liefert server.properties als Text und als Schlüsselliste mit `etag` zum Speichern. Geheime Werte (RCON- und Management-Protocol-Passwörter) sind maskiert; `reveal` zeigt einen, nur mit der Berechtigung Geheime Daten.

Berechtigung: services:settings

Parameter in der Adresse

NameTypPflichtBeschreibung
revealstringnein`rcon.password`, `management-server-secret` oder `management-server-tls-keystore-password`; liefert `{ key, value }`.

Beispielantwort

{
  "locked": [
    "server-ip",
    "server-port",
    "query.port"
  ],
  "secretKeys": [
    "rcon.password",
    "management-server-secret",
    "management-server-tls-keystore-password"
  ],
  "privilegedKeys": [
    "enable-rcon",
    "rcon.port",
    "management-server-enabled",
    "management-server-host",
    "management-server-port",
    "management-server-tls-enabled",
    "management-server-tls-keystore",
    "management-server-allowed-origins"
  ],
  "allocationPorts": [
    25565,
    25566
  ],
  "canSecrets": true,
  "canPower": true,
  "jobActive": false,
  "exists": true,
  "etag": "9b1f0c2d4e6a8b0c1d2e3f4a5b6c7d8e9f0a1b2c",
  "raw": "motd=A Minecraft Server\nmax-players=20\nrcon.password=********\n",
  "entries": [
    {
      "key": "motd",
      "value": "A Minecraft Server"
    },
    {
      "key": "max-players",
      "value": "20"
    },
    {
      "key": "rcon.password",
      "value": "********"
    }
  ]
}

Mögliche Fehler

  • 400 Unbekannter Schlüssel in `reveal`.
  • 403 `reveal` ohne Berechtigung Geheime Daten.
  • 422 Die Datei ist zu groß oder kein Text.
  • 412 Der Server ist im Spielpanel gerade nicht erreichbar (Meldung `panel.unavailable` in `msg`).
  • 429 Zu viele Anfragen, bitte gleich noch einmal versuchen.
POST/services/{id}/minecraft/propertiesserver.properties speichern

Speichert einzelne Schlüssel (`fields`) oder die ganze Datei (`raw`), immer mit dem `etag` aus GET. Gesperrte Schlüssel (IP und Ports) bleiben gleich, Geheimnisse und Fernverwaltung brauchen die Berechtigung Geheime Daten. Änderungen wirken nach einem Neustart, `restart: true` startet sofort neu (Berechtigung Stromversorgung).

Berechtigung: services:settings

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
etagstringja`etag` aus GET; `absent`, wenn die Datei nicht existiert.
fieldsobjectneinSchlüssel zu Wert (String, Zahl oder Boolean). Nicht zusammen mit `raw`.
rawstringneinGesamter Dateiinhalt (höchstens 80.000 Zeichen, Ergebnis bis 64 KB). Gesperrte und geheime Schlüssel werden auf den gespeicherten Wert zurückgesetzt.
createbooleanneinDatei aus Standardwerten anlegen, wenn sie noch nicht existiert.
restartbooleanneinNach dem Speichern den laufenden Server neu starten.

Beispielinhalt

{
  "etag": "9b1f0c2d4e6a8b0c1d2e3f4a5b6c7d8e9f0a1b2c",
  "fields": {
    "motd": "Vítejte",
    "max-players": 30
  },
  "restart": true
}

Beispielantwort

{
  "ok": true,
  "unchanged": false,
  "etag": "0c1d2e3f4a5b6c7d8e9f0a1b2c9b1f0c2d4e6a8b",
  "changed": [
    "motd",
    "max-players"
  ],
  "restored": [],
  "restarted": true,
  "restartError": null,
  "restartErrorMsg": null
}

Mögliche Fehler

  • 400 Ungültiger Anfrageinhalt (Meldungsschlüssel in `msg`).
  • 400UNKNOWN_KEY Der Schlüssel lässt sich nicht über `fields` ändern (Feld `key`).
  • 400LOCKED Der Schlüssel ist gesperrt (Feld `key`).
  • 400INVALID Ungültiger Schlüsselwert (Feld `key`).
  • 400RAW_INVALID Der Dateitext ist zu lang oder enthält unzulässige Zeichen.
  • 403SECRETS Änderung eines Geheimnisses oder der Fernverwaltung ohne Berechtigung Geheime Daten.
  • 403 `restart` ohne Berechtigung Stromversorgung.
  • 409CONFLICT Die Datei wurde zwischenzeitlich geändert, neuen `etag` holen.
  • 409NO_FILE Die Datei existiert nicht, `create: true` senden.
  • 409 Auf dem Server läuft eine Änderung (Job).
  • 412 Der Server ist im Spielpanel gerade nicht erreichbar (Meldung `panel.unavailable` in `msg`).
GET/services/{id}/minecraft/softwareServer-Software und verfügbare Versionen

Ohne Parameter liefert es Typ und Version, Änderungsverlauf, laufenden Job, Backup-Plätze, EULA und Berechtigungen. `versions` und `builds` listen Versionen und Builds eines Typs, `preview` zeigt die Auswirkung einer Änderung (Java, Image, Speicher, Warnungen) ohne Schreiben.

Berechtigung: services:settings

Parameter in der Adresse

NameTypPflichtBeschreibung
versionsstringneinServertyp: `paper`, `purpur`, `folia`, `vanilla`, `fabric`, `forge` oder `neoforge`; liefert bis zu 250 Versionen.
prereleasestringneinMit `versions`: `1` nimmt Vorabversionen auf.
buildsstringneinServertyp; mit `version` bis zu 100 Builds.
previewstringneinServertyp für die Änderungsvorschau (mit `version`, `build`).
versionstringneinMinecraft-Version (bei `preview` Standard `latest`).
buildstringneinMit `preview`: bestimmter Build oder Loader-Version.
unstablestringnein`1` erlaubt instabile Builds (`builds`, `preview`).

Beispielantwort

{
  "state": {
    "type": "paper",
    "version": "1.21.4",
    "build": "232",
    "loaderVersion": null,
    "javaMajor": 21,
    "launch": {
      "kind": "jar",
      "file": "server.jar"
    },
    "history": [],
    "importedAt": null,
    "installedAt": "2026-11-07T10:15:00.000Z"
  },
  "job": null,
  "jobActive": false,
  "server": {
    "memoryMib": 8192,
    "diskMib": 40960,
    "javaMajor": 21,
    "imageOfficial": true,
    "busy": null
  },
  "panelError": null,
  "clientError": null,
  "backups": {
    "used": 1,
    "limit": 3
  },
  "diskFreeMb": 35200,
  "diskFreeUnknown": false,
  "eula": {
    "accepted": true,
    "acceptedAt": "2026-11-07T10:15:00.000Z"
  },
  "importSuggestion": null,
  "perms": {
    "change": true,
    "import": true,
    "eula": true,
    "power": true,
    "skipBackup": true
  },
  "types": [
    "paper",
    "purpur",
    "folia",
    "vanilla",
    "fabric",
    "forge",
    "neoforge"
  ]
}

Mögliche Fehler

  • 400 Unbekannter Typ, Version oder Build (Meldungsschlüssel in `msg`).
  • 422 Version oder Build nicht gefunden.
  • 502 Die Versionsquelle antwortet gerade nicht.
  • 412 Der Server ist im Spielpanel gerade nicht erreichbar (Meldung `panel.unavailable` in `msg`).
  • 429 Zu viele Anfragen, bitte gleich noch einmal versuchen.
POST/services/{id}/minecraft/softwareServertyp und Version ändern

`switch` und `reinstall` starten einen Job (202), Fortschritt über minecraft/job: Der Server wird gestoppt, gesichert, die neue Software installiert und ein zuvor laufender Server wieder gestartet. Nötig ist ein freier Backup-Platz (sonst `skipBackup`, nur Inhaber); höchstens 3 pro Stunde. `import` hält nur fest, welche Software schon auf dem Server ist, und ändert nichts.

Berechtigung: services:settings

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
actionstringja`switch`, `reinstall` oder `import`.
typestringnein`switch` und `import`: `paper`, `purpur`, `folia`, `vanilla`, `fabric`, `forge` oder `neoforge`.
versionstringnein`switch` und `import`: Minecraft-Version (1–40 Zeichen), bei `switch` auch `latest`.
buildstringneinBuild oder Loader-Version, sonst die neueste stabile.
allowUnstablebooleannein`switch`: instabilen Build erlauben.
modestringnein`switch`: `keep` (Standard, nichts löschen), `clean` (alles außer Welt, Einstellungen und Spielerlisten löschen) oder `wipe` (alles löschen).
acceptEulabooleannein`switch` und `reinstall`: EULA akzeptieren.
confirmDowngradebooleannein`switch`: Wechsel auf eine ältere oder unbekannte Version bestätigen.
skipBackupbooleannein`switch` und `reinstall`: ohne Backup, nur Inhaber.

Beispielinhalt

{
  "action": "switch",
  "type": "paper",
  "version": "1.21.4",
  "mode": "keep",
  "acceptEula": true
}

Beispielantwort

{
  "ok": true,
  "job": {
    "id": "k3j9x2m1q8",
    "kind": "switch",
    "status": "queued",
    "step": "queued",
    "log": [],
    "startedAt": "2026-11-07T10:15:00.000Z",
    "updatedAt": "2026-11-07T10:15:00.000Z",
    "error": null,
    "errorMsg": null,
    "progress": null
  },
  "warnings": []
}

Mögliche Fehler

  • 400 Ungültiger Anfrageinhalt (Meldungsschlüssel in `msg`).
  • 403 Eine Änderung braucht die Berechtigungen Einstellungen, Dateien und Stromversorgung.
  • 403SKIP_BACKUP_OWNER Nur der Inhaber darf `skipBackup` verwenden.
  • 409JOB_RUNNING Auf dem Server läuft bereits ein anderer Job.
  • 409ADDON_RUNNING Eine Plugin- oder Mod-Installation läuft.
  • 409BACKUP_SLOT Die Backup-Plätze sind voll.
  • 409BACKUP_DISABLED Der Dienst hat keine Backups, die Änderung geht nur mit `skipBackup`.
  • 409DISK Zu wenig Speicherplatz (`details.freeMb`, `details.needMb`).
  • 409DOWNGRADE Ältere Version, mit `confirmDowngrade` bestätigen.
  • 409UNKNOWN_VERSION Die aktuelle Version ist unbekannt, mit `confirmDowngrade` bestätigen.
  • 409NOT_IMPORTED `reinstall` ohne bekannte Software, zuerst `import` oder `switch`.
  • 409INSTALLING Der Server installiert gerade oder stellt ein Backup wieder her.
  • 422NEED_BUILD `import`: bei Forge und NeoForge `build` angeben.
  • 429 Höchstens 3 Änderungen pro Stunde.
GET/services/{id}/minecraft/startupStartbefehl und Arbeitsspeicher

Liefert den aktuellen Startbefehl, die Heap-Größe, verfügbare JVM-Presets mit Heap-Vorschau, den gespeicherten Stand und das Risiko eines Speicherabsturzes. Mit `java=1` zusätzlich die angebotenen Java-Versionen.

Berechtigung: services:settings

Parameter in der Adresse

NameTypPflichtBeschreibung
javastringnein`1` ergänzt `javaOptions` (vom Egg angebotene Java-Versionen).

Beispielantwort

{
  "type": "paper",
  "imported": true,
  "javaMajor": 21,
  "arch": "x86_64",
  "envPrefix": true,
  "memoryMib": 8192,
  "launch": {
    "kind": "jar",
    "file": "server.jar"
  },
  "command": "java -Xms6656M -Xmx6656M -XX:+UseG1GC -jar server.jar nogui",
  "heapMb": 6656,
  "addons": 12,
  "modpack": false,
  "presets": [
    {
      "preset": "standard",
      "heapMb": 6656,
      "isDefault": true,
      "vectors": true
    },
    {
      "preset": "zgc",
      "heapMb": 5888,
      "isDefault": false,
      "vectors": true
    },
    {
      "preset": "none",
      "heapMb": 6656,
      "isDefault": false,
      "vectors": true
    }
  ],
  "defaultPreset": "standard",
  "vectors": true,
  "memory": null,
  "stored": {
    "preset": "standard",
    "heapMb": 6656,
    "memoryMib": 8192,
    "vectors": true,
    "extraFlags": [],
    "appliedAt": "2026-11-07T10:15:00.000Z",
    "custom": false,
    "hasPrevious": true,
    "check": null
  },
  "lastSync": null,
  "managed": true,
  "matchesStored": true,
  "drifted": false,
  "needsSync": false,
  "busy": null,
  "jobActive": false,
  "canPower": true,
  "canExtraFlags": true,
  "canJava": true
}

Mögliche Fehler

  • 502 Das Spielpanel antwortet gerade nicht.
  • 429 Zu viele Anfragen, bitte gleich noch einmal versuchen.
POST/services/{id}/minecraft/startupStartbefehl oder Java ändern

Ohne `action` (oder mit `apply`) wird ein JVM-Preset angewendet, `recalculate` berechnet den Heap für den aktuellen Speicher neu, `revert` stellt den vorherigen Befehl her, `java` wechselt das Image auf eine andere Java ohne Neuinstallation. Gilt ab dem nächsten Start, `restart: true` startet sofort neu (Berechtigung Stromversorgung).

Berechtigung: services:settings

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
actionstringnein`apply` (Standard), `recalculate`, `revert` oder `java`.
presetstringnein`apply` (Pflicht): `standard`, `zgc` (Java 21+), `proxy` oder `none`.
extraFlagsstring | string[]nein`apply`: eigene JVM-Flags (Text bis 4000 Zeichen oder bis 60 Einträge); neue Flags nur mit Berechtigung Stromversorgung.
dryRunbooleannein`apply`: nur den Befehl bauen, nichts speichern.
majorintegernein`java` (Pflicht): Java-Hauptversion 8–99.
restartbooleanneinNach der Änderung neu starten (ausgeschalteten Server starten).

Beispielinhalt

{
  "preset": "standard",
  "extraFlags": [],
  "restart": true
}

Beispielantwort

{
  "ok": true,
  "command": "java -Xms6656M -Xmx6656M -XX:+UseG1GC -jar server.jar nogui",
  "heapMb": 6656,
  "preset": "standard",
  "restarted": true,
  "restartError": null,
  "restartErrorMsg": null
}

Mögliche Fehler

  • 400 Ungültiger Anfrageinhalt (Meldungsschlüssel in `msg`).
  • 403EXTRA_FLAGS_PERMISSION Neue eigene Flags ohne Berechtigung Stromversorgung (Feld `token`).
  • 403 `restart` oder `java` ohne die nötigen Berechtigungen.
  • 409NEED_IMPORT Die Server-Software ist nicht festgelegt.
  • 409NO_MEMORY_LIMIT Der Server hat kein Speicherlimit.
  • 409CHANGED Der Start wurde zwischenzeitlich geändert.
  • 409 Ein Software-Wechsel oder eine Installation läuft.
  • 422PRESET Das Preset passt nicht zu dieser Java.
  • 422EXTRA_FLAGS Unzulässiges Flag (Feld `token`).
  • 422TOO_OLD `java`: Die Version ist für die Minecraft-Version zu alt.
  • 422NO_IMAGE `java`: kein Image für diese Java.
  • 429 Limit: Preset-Änderungen 10 pro Stunde, Java-Wechsel 3 pro Stunde.
GET/services/{id}/minecraft/textFarbiger Nick und Präfix: Optionen

Liefert, ob der Server läuft, die Textsyntax-Ära für die Version und welche Plugins (EssentialsX, LuckPerms, TAB) installiert sind. Bei geteiltem Dienst ist die Berechtigung Konsole nötig.

Berechtigung: services:settings

Beispielantwort

{
  "running": true,
  "state": "running",
  "version": "1.21.4",
  "era": "components",
  "eraKnown": true,
  "plugins": {
    "essentials": true,
    "luckperms": true,
    "tab": false
  }
}

Mögliche Fehler

  • 412 Der Server ist im Spielpanel gerade nicht erreichbar (Meldung `panel.unavailable` in `msg`).
  • 429 Zu viele Anfragen, bitte gleich noch einmal versuchen.
POST/services/{id}/minecraft/textFarbigen Text auf dem Server setzen

Baut aus `spans` oder `doc` auf dem Server einen Befehl (EssentialsX-Nick, LuckPerms- oder TAB-Präfix, Namensschild, tellraw) und schickt ihn an die Konsole des laufenden Servers. Limit 20 pro 10 Minuten.

Berechtigung: services:settings

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
actionstringja`essentials-nick`, `lp-prefix`, `tab-prefix`, `give-nametag` oder `tellraw`.
targetstringjaSpieler oder Gruppe (1–36 Zeichen); bei `tellraw` auch `@a`.
targetKindstringnein`lp-prefix` und `tab-prefix`: `group` (Standard) oder `player`.
priorityinteger | nullnein`lp-prefix`: Priorität 0–1000.
prefixFormatstringnein`lp-prefix`: `ampHex` (Standard), `amp`, `minimessage` oder `bungeeHex`.
tabFieldstringnein`tab-prefix`: `tabprefix` (Standard) oder `tagprefix`.
tabFormatstringnein`tab-prefix`: `tabGradient` (Standard), `ampHex` oder `minimessage`.
erastringneinSyntax-Ära (`legacy`, `json`, `jsonHex`, `components`, `snbt`), nur bei unbekannter Serverversion verwendet.
spansobject[]neinAbschnitte `{ text, color: "#rrggbb" | null, bold?, italic?, underlined?, strikethrough?, obfuscated? }`, höchstens 200. Entweder `spans` oder `doc` senden.
docobjectnein`{ segments: [{ text, fill, … }] }`, wobei `fill` `{ kind: "solid", color }`, `{ kind: "gradient", colors: [2–5 Farben] }` oder `{ kind: "rainbow" }` ist.

Beispielinhalt

{
  "action": "lp-prefix",
  "target": "vip",
  "targetKind": "group",
  "priority": 50,
  "doc": {
    "segments": [
      {
        "text": "[VIP] ",
        "fill": {
          "kind": "solid",
          "color": "#ffaa00"
        },
        "bold": true
      }
    ]
  }
}

Beispielantwort

{
  "ok": true,
  "command": "lp group vip meta setprefix 50 \"&#FFAA00&l[VIP] \"",
  "warnings": [],
  "delivered": null
}

Mögliche Fehler

  • 400INVALID Ungültiger Anfrageinhalt.
  • 400TARGET Ungültiger Spieler oder Gruppe.
  • 400PRIORITY Die Priorität muss eine Ganzzahl 0–1000 sein.
  • 400EMPTY Der Text ist leer.
  • 400TOO_LONG Der Text ist zu lang (Nick höchstens 64 Zeichen, sonst 256).
  • 400TOO_MANY_PARTS Der Text hat zu viele farbige Abschnitte.
  • 409JOB Auf dem Server läuft eine Änderung (Job).
  • 409 Der Server läuft nicht.
  • 429RATE_LIMITED Änderungslimit überschritten, bitte später erneut versuchen.
  • 412 Der Server ist im Spielpanel gerade nicht erreichbar (Meldung `panel.unavailable` in `msg`).
GET/services/{id}/minecraft/worldsWelten des Servers und vorbereitete Downloads

Liefert aktive und gespeicherte Welten (höchstens 5), vorbereitete Downloads, den laufenden Welt-Job, Backup-Plätze und den Serverstatus.

Berechtigung: services:files

Beispielantwort

{
  "active": "world",
  "activeValid": true,
  "worlds": [
    {
      "name": "world",
      "active": true,
      "exists": true,
      "extraFolders": [],
      "version": "1.21.4",
      "mtime": 1730970000,
      "seed": null,
      "createdAt": null
    },
    {
      "name": "creative",
      "active": false,
      "exists": true,
      "extraFolders": [],
      "version": "1.21.4",
      "mtime": 1730800000,
      "seed": "12345",
      "createdAt": "2026-11-01T18:00:00.000Z"
    }
  ],
  "unchecked": 0,
  "maxWorlds": 5,
  "exports": [
    {
      "id": "a1b2c3d4e5",
      "world": "world",
      "status": "ready",
      "createdAt": "2026-11-07T10:15:00.000Z",
      "expiresAt": "2026-11-07T12:15:00.000Z",
      "bytes": 104857600,
      "error": null,
      "errorMsg": null
    }
  ],
  "job": null,
  "jobOther": false,
  "backups": {
    "used": 1,
    "limit": 3,
    "free": true
  },
  "power": "running",
  "busy": null,
  "version": "1.21.4",
  "uploadMaxMb": 95,
  "canPower": true
}

Mögliche Fehler

  • 412NO_PANEL Der Server ist im Spielpanel gerade nicht erreichbar.
  • 429 Zu viele Anfragen, bitte gleich noch einmal versuchen.
POST/services/{id}/minecraft/worldsWelt exportieren, wechseln, löschen, neu

`export` bereitet ein Weltarchiv im Hintergrund vor (202), Download über worlds/download, höchstens 3 pro Stunde. `switch` und `reset` starten einen Job (202, Fortschritt über minecraft/job), der Server wird dabei gestoppt und wieder gestartet; `delete` löscht eine gespeicherte Welt dauerhaft. Außer bei `export` ist auch die Berechtigung Stromversorgung nötig; höchstens 10 Änderungen pro Stunde.

Berechtigung: services:files

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
actionstringja`export`, `switch`, `delete` oder `reset`.
worldstringnein`export`, `switch`, `delete`: Weltname aus der Liste (1–64 Zeichen).
oldstringnein`reset` (Pflicht): `delete` alte Welt löschen, `keep` als gespeicherte behalten.
keepAsstringnein`reset` mit `keep`: neuer Name der alten Welt (1–32 Zeichen A–Z, a–z, 0–9, _ und -).
seedstringnein`reset`: Seed der neuen Welt (höchstens 128 Zeichen), leer = zufällig.
levelTypestringnein`reset`: `normal` (Standard), `flat`, `large_biomes` oder `amplified`.
structuresbooleannein`reset`: Bauwerke generieren, Standard `true`.
confirmNoBackupbooleannein`reset` mit `delete`: Löschen ohne Backup bestätigen, wenn kein Backup-Platz frei ist.

Beispielinhalt

{
  "action": "reset",
  "old": "keep",
  "keepAs": "stary_svet",
  "seed": "",
  "levelType": "normal",
  "structures": true
}

Beispielantwort

{
  "ok": true,
  "job": {
    "id": "k3j9x2m1q8",
    "kind": "world-reset",
    "status": "queued",
    "step": "queued",
    "log": [],
    "startedAt": "2026-11-07T10:15:00.000Z",
    "updatedAt": "2026-11-07T10:15:00.000Z",
    "error": null,
    "errorMsg": null,
    "progress": null
  }
}

Mögliche Fehler

  • 400INVALID Ungültiger Anfrageinhalt.
  • 400BAD_NAME Ungültiger Weltname.
  • 400RESERVED_NAME Der Name gehört zu einem Serverordner.
  • 400BAD_SEED Ungültiger Seed.
  • 403FORBIDDEN Die Berechtigung Stromversorgung fehlt.
  • 404NO_SUCH_WORLD Die Welt ist nicht auf dem Server.
  • 409ACTIVE_WORLD Die Welt ist gerade aktiv.
  • 409NAME_TAKEN Ein Ordner mit diesem Namen existiert bereits.
  • 409TOO_MANY_WORLDS Ein Server kann höchstens 5 Welten haben.
  • 409NEEDS_CONFIRM Die alte Welt würde ohne Backup gelöscht, `confirmNoBackup: true` senden.
  • 409JOB_RUNNING Auf dem Server läuft bereits eine andere Änderung.
  • 409EXPORT_RUNNING Ein Welt-Download wird bereits vorbereitet.
  • 409DISK Zu wenig Speicherplatz auf dem Server.
  • 409STATE Der Server startet oder stoppt gerade.
  • 429RATE_LIMITED Änderungslimit überschritten, bitte später erneut versuchen.
  • 412NO_PANEL Der Server ist im Spielpanel gerade nicht erreichbar.
GET/services/{id}/minecraft/worlds/downloadVorbereitete Welt herunterladen

Lädt ein mit `export` vorbereitetes Archiv (ZIP oder tar.gz). Nach vollständigem Download wird das Archiv vom Server gelöscht; ein Download je Dienst gleichzeitig, höchstens 10 pro Stunde.

Berechtigung: services:files

Parameter in der Adresse

NameTypPflichtBeschreibung
idstringjaDownload-`id` aus `exports` (10 Hex-Zeichen).
formatstringnein`zip` (Standard) oder `tar.gz`.

Beispielantwort

HTTP/1.1 200 OK
Content-Type: application/zip
Content-Disposition: attachment; filename="world-2026-11-07.zip"

(binary archive)

Mögliche Fehler

  • 400INVALID `id` fehlt oder ist ungültig.
  • 404EXPORT_GONE Der Download ist nicht mehr vorbereitet, erneut vorbereiten.
  • 429DOWNLOAD_BUSY Ein Download läuft bereits.
  • 429RATE_LIMITED Zu viele Downloads.
  • 412NO_PANEL Der Server ist im Spielpanel gerade nicht erreichbar.

Domains

POST/services/{id}/domain/auth-infoAUTH-ID für Domaintransfer senden

Bittet den Registrar, die AUTH-ID (den Code für den Transfer der Domain zu einem anderen Registrar) per E-Mail an den Domaininhaber zu senden. Der Code wird nicht in der Antwort zurückgegeben. Nur für den Inhaber, höchstens 3-mal pro Stunde. Die Berechtigung services:secrets gibt es nur für Schlüssel, die auf IP-Adressen beschränkt sind.

Berechtigung: services:secrets

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
localestringneinSprache der Fehlermeldungen: cs, en, sk, pl oder de. Standard ist cs.

Beispielinhalt

{
  "locale": "cs"
}

Beispielantwort

{
  "ok": true
}

Mögliche Fehler

  • 400invalid Der Anfragetext enthält ein unbekanntes Feld.
  • 403 Nur der Inhaber der Domain darf das, nicht ein Mitglied eines geteilten Dienstes.
  • 404 Der Dienst existiert nicht, gehört Ihnen nicht oder der Schlüssel hat keinen Zugriff darauf.
  • 409inactive Die Domain ist noch nicht aktiv.
  • 429 Limit von 3 Anfragen pro Stunde überschritten.
  • 503unavailable Das Senden ist vorübergehend nicht möglich. Versuchen Sie es später erneut.
  • 422failed Der Registrar hat die Anfrage abgelehnt.
GET/services/{id}/domain/connectPlan für Verbindung der Domain mit einem Dienst

Ermittelt die DNS-Einträge, die die Domain oder eine Subdomain auf Ihren VPS oder Gameserver (Minecraft, FiveM) zeigen lassen, und zeigt, was in der Zone hinzukommt und was ersetzt wird. Ändert nichts. Bei einer Domain außerhalb unseres DNS kommt mode manual mit Einträgen zum manuellen Einrichten zurück.

Berechtigung: domains:read

Parameter in der Adresse

NameTypPflichtBeschreibung
servicestringjaID Ihres aktiven VPS oder Gameservers (Minecraft, FiveM). Geteilte Dienste gehen nicht.
hoststringjaName in der Domain: @ für die Domain selbst oder eine Subdomain (Buchstaben, Ziffern, Bindestriche, ohne * und _).
localestringneinSprache der Fehlermeldungen: cs, en, sk, pl oder de. Standard ist cs.

Beispielantwort

{
  "mode": "zone",
  "domain": "example.com",
  "host": "@",
  "kind": "vps",
  "records": [
    {
      "type": "A",
      "host": "@",
      "fqdn": "example.com",
      "value": "203.0.113.25",
      "ttl": 300
    },
    {
      "type": "AAAA",
      "host": "@",
      "fqdn": "example.com",
      "value": "2001:db8::25",
      "ttl": 300
    }
  ],
  "notes": [],
  "add": [
    {
      "type": "AAAA",
      "host": "@",
      "fqdn": "example.com",
      "value": "2001:db8::25",
      "ttl": 300
    }
  ],
  "replace": [
    {
      "type": "A",
      "host": "@",
      "fqdn": "example.com",
      "value": "198.51.100.7",
      "ttl": 3600
    }
  ],
  "unchanged": false,
  "withinLimit": true,
  "planHash": "3f9a0c1b2d4e5f60718293ab"
}

Mögliche Fehler

  • 403 Nur der Inhaber der Domain darf das, nicht ein Mitglied eines geteilten Dienstes.
  • 404 Der Dienst existiert nicht, gehört Ihnen nicht oder der Schlüssel hat keinen Zugriff darauf.
  • 409inactive Die Domain ist noch nicht aktiv.
  • 400host Ungültiger Name: @ für die Domain selbst oder eine Subdomain aus Buchstaben, Ziffern und Bindestrichen.
  • 404service Der Dienst existiert nicht, gehört Ihnen nicht, ist nicht aktiv oder kann nicht verbunden werden.
  • 409no_address Der Dienst hat keine öffentliche Adresse, auf die die Domain zeigen könnte.
  • 503unavailable Die Adresse des Dienstes oder der DNS-Status kann gerade nicht ermittelt werden.
  • 429 Limit von 60 Anfragen pro 10 Minuten überschritten.
POST/services/{id}/domain/connectDomain mit einem Dienst verbinden

Legt die geplanten Einträge in der Zone an (A, AAAA, bei Minecraft auch SRV _minecraft._tcp, TTL 300). Senden Sie den planHash aus GET; ersetzt der Plan bestehende Einträge, ist confirm: true nötig. Nur für Domains auf unserem DNS.

Berechtigung: domains:write

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
serviceIdstringjaID Ihres aktiven VPS oder Gameservers, wie bei GET.
hoststringjaName in der Domain, wie bei GET (@ oder Subdomain).
planHashstringjaFingerabdruck des Plans aus GET (24 Hex-Zeichen). Hat sich die Zone inzwischen geändert, kommt 409 changed mit einem neuen Plan.
confirmbooleanneinBestätigt, dass die bestehenden Einträge aus replace ersetzt werden. Pflicht, wenn replace nicht leer ist.
localestringneinSprache der Fehlermeldungen: cs, en, sk, pl oder de. Standard ist cs.

Beispielinhalt

{
  "serviceId": "clx9k2m4p0000svc01abcdef",
  "host": "@",
  "planHash": "3f9a0c1b2d4e5f60718293ab",
  "confirm": true
}

Beispielantwort

{
  "ok": true,
  "mode": "zone",
  "domain": "example.com",
  "host": "@",
  "kind": "vps",
  "records": [
    {
      "type": "A",
      "host": "@",
      "fqdn": "example.com",
      "value": "203.0.113.25",
      "ttl": 300
    },
    {
      "type": "AAAA",
      "host": "@",
      "fqdn": "example.com",
      "value": "2001:db8::25",
      "ttl": 300
    }
  ],
  "notes": [],
  "add": [],
  "replace": [],
  "unchanged": true,
  "withinLimit": true,
  "planHash": "3f9a0c1b2d4e5f60718293ab"
}

Mögliche Fehler

  • 400invalid Ein Pflichtfeld fehlt oder hat ein falsches Format.
  • 403 Nur der Inhaber der Domain darf das, nicht ein Mitglied eines geteilten Dienstes.
  • 404 Der Dienst existiert nicht, gehört Ihnen nicht oder der Schlüssel hat keinen Zugriff darauf.
  • 409inactive Die Domain ist noch nicht aktiv.
  • 400host Ungültiger Name: @ für die Domain selbst oder eine Subdomain aus Buchstaben, Ziffern und Bindestrichen.
  • 404service Der Dienst existiert nicht, gehört Ihnen nicht, ist nicht aktiv oder kann nicht verbunden werden.
  • 409no_address Der Dienst hat keine öffentliche Adresse, auf die die Domain zeigen könnte.
  • 503unavailable Die Adresse des Dienstes oder der DNS-Status kann gerade nicht ermittelt werden.
  • 409manual Die Domain nutzt nicht unser DNS. Richten Sie die Einträge bei Ihrem DNS-Anbieter ein.
  • 409changed Die Zone hat sich seit GET geändert. Die Antwort enthält den neuen Plan im Feld plan.
  • 409confirm Der Plan ersetzt bestehende Einträge und confirm: true fehlt. Die Antwort enthält den Plan im Feld plan.
  • 409limit Die Zone würde das Limit von 200 Einträgen überschreiten.
  • 429 Limit von 60 DNS-Änderungen pro 10 Minuten (gemeinsam mit Schreibzugriffen auf DNS-Einträge) überschritten.
GET/services/{id}/domain/dnsDNS-Einträge auflisten

Gibt die Einträge der Zone der Domain auf unserem DNS zurück (A, AAAA, CNAME, MX, TXT, SRV, CAA), die Nameserver und die Anzahl der Einträge im Verhältnis zum Limit von 200. delegated: false heißt, die Zone ist bereit, aber die Domain zeigt noch nicht auf unser DNS.

Berechtigung: domains:read

Parameter in der Adresse

NameTypPflichtBeschreibung
localestringneinSprache der Fehlermeldungen: cs, en, sk, pl oder de. Standard ist cs.

Beispielantwort

{
  "zone": "example.com",
  "unicode": "example.com",
  "records": [
    {
      "id": "a1b2c3d4e5f60718293a",
      "type": "A",
      "host": "@",
      "ttl": 3600,
      "value": "203.0.113.25",
      "fields": {
        "host": "@",
        "ttl": "3600",
        "address": "203.0.113.25"
      }
    },
    {
      "id": "b2c3d4e5f60718293a4b",
      "type": "MX",
      "host": "@",
      "ttl": 3600,
      "value": "10 mail.example.com",
      "fields": {
        "host": "@",
        "ttl": "3600",
        "preference": "10",
        "exchange": "mail.example.com"
      }
    },
    {
      "id": "c3d4e5f60718293a4b5c",
      "type": "TXT",
      "host": "@",
      "ttl": 3600,
      "value": "v=spf1 mx -all",
      "fields": {
        "host": "@",
        "ttl": "3600",
        "text": "v=spf1 mx -all"
      }
    }
  ],
  "nameservers": [
    "ns1.stormhost.eu",
    "ns2.stormhost.eu"
  ],
  "count": 3,
  "limit": 200,
  "delegated": true
}

Mögliche Fehler

  • 403 Nur der Inhaber der Domain darf das, nicht ein Mitglied eines geteilten Dienstes.
  • 404 Der Dienst existiert nicht, gehört Ihnen nicht oder der Schlüssel hat keinen Zugriff darauf.
  • 400 Der Dienst ist keine Domain.
  • 409inactive Die Domain ist noch nicht aktiv.
  • 409no_zone Die Domain hat keine Zone auf unserem DNS. Legen Sie sie über domain/zone an oder stellen Sie die Nameserver auf unsere um.
  • 503unavailable Der DNS-Server antwortet gerade nicht. Versuchen Sie es später erneut.
  • 422failed Die Änderung konnte nicht durchgeführt werden.
POST/services/{id}/domain/dnsDNS-Eintrag hinzufügen

Fügt der Zone der Domain auf unserem DNS einen Eintrag hinzu. Alle Werte in record werden als Text gesendet. Die Antwort enthält die ID des neuen Eintrags und die komplette neue Zonenliste.

Berechtigung: domains:write

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
recordobjectjaDer neue Eintrag.
record.typestringjaEintragstyp: A, AAAA, CNAME, MX, TXT, SRV oder CAA.
record.hoststringneinName: @ oder leer für die Domain selbst, ein relativer Name (www, _dmarc, *.dev) oder ein voller Name, der auf die Domain endet.
record.ttlstringneinTTL in Sekunden als Text, 60 bis 86400. Leer bedeutet 3600.
record.addressstringneinA: IPv4-Adresse, AAAA: IPv6-Adresse.
record.targetstringneinCNAME und SRV: Zielname (bei SRV auch . für keinen Dienst). Ein CNAME darf nicht auf der Domain selbst und nicht neben einem anderen Eintrag gleichen Namens stehen.
record.preferencestringneinMX: Priorität 0 bis 65535 als Text.
record.exchangestringneinMX: Name des Mailservers (keine IP-Adresse).
record.textstringneinTXT: Text bis 2000 Zeichen ohne Steuerzeichen.
record.prioritystringneinSRV: Priorität 0 bis 65535 als Text. Der SRV-Name muss die Form _dienst._protokoll haben (tcp, udp, tls, sctp).
record.weightstringneinSRV: Gewichtung 0 bis 65535 als Text.
record.portstringneinSRV: Port 0 bis 65535 als Text.
record.flagsstringneinCAA: Flag 0 oder 128 als Text.
record.tagstringneinCAA: issue, issuewild oder iodef.
record.valuestringneinCAA: bei issue und issuewild die Domain der Zertifizierungsstelle, bei iodef eine mailto:- oder https:-Adresse.
localestringneinSprache der Fehlermeldungen: cs, en, sk, pl oder de. Standard ist cs.

Beispielinhalt

{
  "record": {
    "type": "MX",
    "host": "@",
    "ttl": "3600",
    "preference": "10",
    "exchange": "mail.example.com"
  }
}

Beispielantwort

{
  "ok": true,
  "id": "b2c3d4e5f60718293a4b",
  "zone": "example.com",
  "unicode": "example.com",
  "records": [
    {
      "id": "a1b2c3d4e5f60718293a",
      "type": "A",
      "host": "@",
      "ttl": 3600,
      "value": "203.0.113.25",
      "fields": {
        "host": "@",
        "ttl": "3600",
        "address": "203.0.113.25"
      }
    },
    {
      "id": "b2c3d4e5f60718293a4b",
      "type": "MX",
      "host": "@",
      "ttl": 3600,
      "value": "10 mail.example.com",
      "fields": {
        "host": "@",
        "ttl": "3600",
        "preference": "10",
        "exchange": "mail.example.com"
      }
    },
    {
      "id": "c3d4e5f60718293a4b5c",
      "type": "TXT",
      "host": "@",
      "ttl": 3600,
      "value": "v=spf1 mx -all",
      "fields": {
        "host": "@",
        "ttl": "3600",
        "text": "v=spf1 mx -all"
      }
    }
  ],
  "nameservers": [
    "ns1.stormhost.eu",
    "ns2.stormhost.eu"
  ],
  "count": 3,
  "limit": 200,
  "delegated": true
}

Mögliche Fehler

  • 400 Der Eintrag hat die Prüfung nicht bestanden. Das Feld code nennt den Grund (z. B. type, host, host_zone, cname_apex, srv_host, ipv4, ipv6, target, text, ttl, caa_flags, caa_tag, caa_value, cname_conflict, duplicate, limit), das Feld field das betroffene Feld.
  • 403 Nur der Inhaber der Domain darf das, nicht ein Mitglied eines geteilten Dienstes.
  • 404 Der Dienst existiert nicht, gehört Ihnen nicht oder der Schlüssel hat keinen Zugriff darauf.
  • 400 Der Dienst ist keine Domain.
  • 409inactive Die Domain ist noch nicht aktiv.
  • 409no_zone Die Domain hat keine Zone auf unserem DNS. Legen Sie sie über domain/zone an oder stellen Sie die Nameserver auf unsere um.
  • 503unavailable Der DNS-Server antwortet gerade nicht. Versuchen Sie es später erneut.
  • 422failed Die Änderung konnte nicht durchgeführt werden.
  • 429 Limit von 60 Änderungen pro 10 Minuten überschritten.
PATCH/services/{id}/domain/dnsDNS-Eintrag ändern

Ändert einen Eintrag anhand der ID aus der Liste. Weggelassene oder leere Felder bleiben unverändert, der Typ lässt sich nicht ändern. Die ID ergibt sich aus dem Wert des Eintrags, nach einer Änderung von Name oder Wert liefert die Antwort also eine neue ID.

Berechtigung: domains:write

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
idstringjaID des Eintrags aus der Liste (20 Hex-Zeichen).
recordobjectjaZu ändernde Felder (wie beim Hinzufügen, ohne type).
record.hoststringneinName: @ oder leer für die Domain selbst, ein relativer Name (www, _dmarc, *.dev) oder ein voller Name, der auf die Domain endet.
record.ttlstringneinTTL in Sekunden als Text, 60 bis 86400. Leer bedeutet 3600.
record.addressstringneinA: IPv4-Adresse, AAAA: IPv6-Adresse.
record.targetstringneinCNAME und SRV: Zielname (bei SRV auch . für keinen Dienst). Ein CNAME darf nicht auf der Domain selbst und nicht neben einem anderen Eintrag gleichen Namens stehen.
record.preferencestringneinMX: Priorität 0 bis 65535 als Text.
record.exchangestringneinMX: Name des Mailservers (keine IP-Adresse).
record.textstringneinTXT: Text bis 2000 Zeichen ohne Steuerzeichen.
record.prioritystringneinSRV: Priorität 0 bis 65535 als Text. Der SRV-Name muss die Form _dienst._protokoll haben (tcp, udp, tls, sctp).
record.weightstringneinSRV: Gewichtung 0 bis 65535 als Text.
record.portstringneinSRV: Port 0 bis 65535 als Text.
record.flagsstringneinCAA: Flag 0 oder 128 als Text.
record.tagstringneinCAA: issue, issuewild oder iodef.
record.valuestringneinCAA: bei issue und issuewild die Domain der Zertifizierungsstelle, bei iodef eine mailto:- oder https:-Adresse.
localestringneinSprache der Fehlermeldungen: cs, en, sk, pl oder de. Standard ist cs.

Beispielinhalt

{
  "id": "a1b2c3d4e5f60718293a",
  "record": {
    "address": "203.0.113.26",
    "ttl": "600"
  }
}

Beispielantwort

{
  "ok": true,
  "id": "d4e5f60718293a4b5c6d",
  "zone": "example.com",
  "unicode": "example.com",
  "records": [
    {
      "id": "a1b2c3d4e5f60718293a",
      "type": "A",
      "host": "@",
      "ttl": 3600,
      "value": "203.0.113.25",
      "fields": {
        "host": "@",
        "ttl": "3600",
        "address": "203.0.113.25"
      }
    },
    {
      "id": "b2c3d4e5f60718293a4b",
      "type": "MX",
      "host": "@",
      "ttl": 3600,
      "value": "10 mail.example.com",
      "fields": {
        "host": "@",
        "ttl": "3600",
        "preference": "10",
        "exchange": "mail.example.com"
      }
    },
    {
      "id": "c3d4e5f60718293a4b5c",
      "type": "TXT",
      "host": "@",
      "ttl": 3600,
      "value": "v=spf1 mx -all",
      "fields": {
        "host": "@",
        "ttl": "3600",
        "text": "v=spf1 mx -all"
      }
    }
  ],
  "nameservers": [
    "ns1.stormhost.eu",
    "ns2.stormhost.eu"
  ],
  "count": 3,
  "limit": 200,
  "delegated": true
}

Mögliche Fehler

  • 400 Der Eintrag hat die Prüfung nicht bestanden. Das Feld code nennt den Grund (z. B. type, host, host_zone, cname_apex, srv_host, ipv4, ipv6, target, text, ttl, caa_flags, caa_tag, caa_value, cname_conflict, duplicate, limit), das Feld field das betroffene Feld.
  • 404not_found In der Zone gibt es keinen Eintrag mit dieser ID (er hat sich eventuell inzwischen geändert).
  • 403 Nur der Inhaber der Domain darf das, nicht ein Mitglied eines geteilten Dienstes.
  • 404 Der Dienst existiert nicht, gehört Ihnen nicht oder der Schlüssel hat keinen Zugriff darauf.
  • 400 Der Dienst ist keine Domain.
  • 409inactive Die Domain ist noch nicht aktiv.
  • 409no_zone Die Domain hat keine Zone auf unserem DNS. Legen Sie sie über domain/zone an oder stellen Sie die Nameserver auf unsere um.
  • 503unavailable Der DNS-Server antwortet gerade nicht. Versuchen Sie es später erneut.
  • 422failed Die Änderung konnte nicht durchgeführt werden.
  • 429 Limit von 60 Änderungen pro 10 Minuten überschritten.
DELETE/services/{id}/domain/dnsDNS-Eintrag löschen

Löscht einen Eintrag anhand der ID aus der Liste. Die ID wird im JSON-Anfragetext gesendet. Die Antwort enthält die aktualisierte Zonenliste.

Berechtigung: domains:write

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
idstringjaID des Eintrags aus der Liste (20 Hex-Zeichen).
localestringneinSprache der Fehlermeldungen: cs, en, sk, pl oder de. Standard ist cs.

Beispielinhalt

{
  "id": "c3d4e5f60718293a4b5c"
}

Beispielantwort

{
  "ok": true,
  "zone": "example.com",
  "unicode": "example.com",
  "records": [
    {
      "id": "a1b2c3d4e5f60718293a",
      "type": "A",
      "host": "@",
      "ttl": 3600,
      "value": "203.0.113.25",
      "fields": {
        "host": "@",
        "ttl": "3600",
        "address": "203.0.113.25"
      }
    },
    {
      "id": "b2c3d4e5f60718293a4b",
      "type": "MX",
      "host": "@",
      "ttl": 3600,
      "value": "10 mail.example.com",
      "fields": {
        "host": "@",
        "ttl": "3600",
        "preference": "10",
        "exchange": "mail.example.com"
      }
    },
    {
      "id": "c3d4e5f60718293a4b5c",
      "type": "TXT",
      "host": "@",
      "ttl": 3600,
      "value": "v=spf1 mx -all",
      "fields": {
        "host": "@",
        "ttl": "3600",
        "text": "v=spf1 mx -all"
      }
    }
  ],
  "nameservers": [
    "ns1.stormhost.eu",
    "ns2.stormhost.eu"
  ],
  "count": 3,
  "limit": 200,
  "delegated": true
}

Mögliche Fehler

  • 400invalid Die id fehlt oder hat ein falsches Format.
  • 404not_found In der Zone gibt es keinen Eintrag mit dieser ID.
  • 403 Nur der Inhaber der Domain darf das, nicht ein Mitglied eines geteilten Dienstes.
  • 404 Der Dienst existiert nicht, gehört Ihnen nicht oder der Schlüssel hat keinen Zugriff darauf.
  • 400 Der Dienst ist keine Domain.
  • 409inactive Die Domain ist noch nicht aktiv.
  • 409no_zone Die Domain hat keine Zone auf unserem DNS. Legen Sie sie über domain/zone an oder stellen Sie die Nameserver auf unsere um.
  • 503unavailable Der DNS-Server antwortet gerade nicht. Versuchen Sie es später erneut.
  • 422failed Die Änderung konnte nicht durchgeführt werden.
  • 429 Limit von 60 Änderungen pro 10 Minuten überschritten.
POST/services/{id}/domain/nameserversNameserver der Domain ändern

Ändert die Nameserver bei der Registry: ours = unser DNS (die Zone wird angelegt, falls sie fehlt), custom = eigene Server (2 bis 6), wedos = Standard-DNS des Registrars. Die Zone auf unserem DNS wird beim Wechsel nicht gelöscht, ein Zurückwechseln ist also möglich. Weltweit greift die Änderung erst nach Ablauf der TTL bei der Registry.

Berechtigung: domains:write

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
modestringjaours, custom oder wedos.
nameserversarrayneinNur bei custom: 2 bis 6 Server in der Form { name, ipv4?, ipv6? }.
nameservers[].namestringjaName des Servers, z. B. ns1.example.net.
nameservers[].ipv4stringneinIPv4-Adresse. Nur bei einem Server innerhalb der Domain selbst (z. B. ns1.example.com für example.com), dort ist mindestens eine Adresse nötig. Sonst ignoriert.
nameservers[].ipv6stringneinIPv6-Adresse, es gilt dasselbe wie bei ipv4.
localestringneinSprache der Fehlermeldungen: cs, en, sk, pl oder de. Standard ist cs.

Beispielinhalt

{
  "mode": "custom",
  "nameservers": [
    {
      "name": "ns1.example.com",
      "ipv4": "203.0.113.53"
    },
    {
      "name": "ns2.example.net"
    }
  ]
}

Beispielantwort

{
  "ok": true,
  "mode": "custom",
  "nsset": null,
  "nameservers": [
    "ns1.example.com",
    "ns2.example.net"
  ]
}

Mögliche Fehler

  • 400invalid Ungültiger Anfragetext (z. B. unbekannter mode).
  • 400ns_count Bei custom sind 2 bis 6 verschiedene Server nötig.
  • 400ns_name Ungültiger Servername. Das Feld index sagt, welcher.
  • 400ns_glue Ein Server innerhalb der Domain braucht eine IPv4- oder IPv6-Adresse.
  • 400ns_ip Ungültige IP-Adresse des Servers.
  • 400ns_ours Die eigenen Server sind nur unsere. Verwenden Sie mode ours.
  • 403 Nur der Inhaber der Domain darf das, nicht ein Mitglied eines geteilten Dienstes.
  • 404 Der Dienst existiert nicht, gehört Ihnen nicht oder der Schlüssel hat keinen Zugriff darauf.
  • 409inactive Die Domain ist noch nicht aktiv.
  • 429 Limit von 10 Änderungen pro 10 Minuten überschritten.
  • 503unavailable Registry oder DNS-Server ist gerade nicht erreichbar. Versuchen Sie es später erneut.
  • 422failed Die Registry hat die Änderung abgelehnt.
POST/services/{id}/domain/zoneZone auf unserem DNS vorbereiten

Legt eine leere Zone der Domain auf unserem DNS an, ohne die Nameserver zu ändern. Praktisch nach einem Domaintransfer: zuerst die Einträge über domain/dns anlegen, dann die NS umstellen. Einträge aus dem bisherigen DNS werden nicht übernommen. Existiert die Zone bereits, kommt ok: true und existed: true zurück.

Berechtigung: domains:write

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
localestringneinSprache der Fehlermeldungen: cs, en, sk, pl oder de. Standard ist cs.

Beispielinhalt

{
  "locale": "cs"
}

Beispielantwort

{
  "ok": true
}

Mögliche Fehler

  • 400invalid Der Anfragetext enthält ein unbekanntes Feld.
  • 403 Nur der Inhaber der Domain darf das, nicht ein Mitglied eines geteilten Dienstes.
  • 404 Der Dienst existiert nicht, gehört Ihnen nicht oder der Schlüssel hat keinen Zugriff darauf.
  • 409inactive Die Domain ist noch nicht aktiv.
  • 429 Limit von 10 Anfragen pro 10 Minuten überschritten.
  • 503not_ready Das DNS für Domains ist gerade nicht bereit. Versuchen Sie es später erneut.
  • 422failed Die Zone konnte nicht angelegt werden.

Zahlungen und Belege

GET/creditGuthaben und Verlauf

Gibt das Guthaben in CZK zurück, aufgeteilt in Bonus, nicht erstattbaren und erstattbaren Anteil, dazu offene Aufladungen und den Buchungsverlauf (50 pro Seite, neueste zuerst). Ist das Guthaben noch nicht verfügbar, kommt nur available: false zurück.

Berechtigung: billing:read

Parameter in der Adresse

NameTypPflichtBeschreibung
pageintegerneinSeite des Verlaufs ab 1. Standard ist 1.
localestringneinSprache der Fehlermeldungen: cs, en, sk, pl oder de. Standard ist cs.

Beispielantwort

{
  "available": true,
  "balanceCzk": 450,
  "bonusCzk": 50,
  "nonRefundableCzk": 0,
  "refundableCzk": 400,
  "pending": [
    {
      "orderId": "clx9k2m4p0001ord02abcdef",
      "invoiceId": "clx9k2m4p0001inv02abcdef",
      "number": "DK-2026-0007",
      "amountCzk": 200,
      "dueAt": "2026-11-14T23:59:59.000Z",
      "createdAt": "2026-11-06T12:00:00.000Z",
      "paymentStarted": false
    }
  ],
  "history": {
    "items": [
      {
        "id": "clx9k2m4p0000ctx01abcdef",
        "seq": 2,
        "type": "SPEND",
        "kind": null,
        "amountCzk": -249,
        "balanceAfterCzk": 450,
        "createdAt": "2026-11-02T10:15:00.000Z",
        "invoiceId": "clx9k2m4p0000inv01abcdef",
        "invoiceNumber": "2026-0042",
        "orderId": "clx9k2m4p0000ord01abcdef",
        "note": null,
        "refundRequestId": null
      },
      {
        "id": "clx9k2m4p0000ctx00abcdef",
        "seq": 1,
        "type": "TOPUP",
        "kind": null,
        "amountCzk": 699,
        "balanceAfterCzk": 699,
        "createdAt": "2026-10-20T08:00:00.000Z",
        "invoiceId": "clx9k2m4p0000inv00abcdef",
        "invoiceNumber": "DK-2026-0005",
        "orderId": "clx9k2m4p0000ord00abcdef",
        "note": null,
        "refundRequestId": null
      }
    ],
    "page": 1,
    "pages": 1,
    "total": 2
  }
}

Mögliche Fehler

  • 429rate_limited Limit von 60 Anfragen pro Minute überschritten.
POST/credit/payRechnung mit Guthaben bezahlen

Bezahlt eine offene Bestellrechnung (z. B. für einen neuen Dienst oder ein Upgrade) mit dem Guthaben des Kontos. Das Guthaben wird sofort abgezogen, die Einrichtung des Dienstes oder das Upgrade läuft nach der Antwort zu Ende. Rechnungen für Guthabenaufladungen lassen sich so nicht bezahlen.

Berechtigung: billing:write

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
invoiceIdstringjaID der offenen Rechnung.
expectedAmountCzknumberjaDer erwartete Rechnungsbetrag in CZK. Er muss genau dem Bestellpreis entsprechen, sonst kommt 409 amount_changed mit dem aktuellen Betrag.
ackOpenGatewaybooleanneinBestätigt, dass Sie mit Guthaben zahlen wollen, obwohl für die Rechnung eine Zahlung im Zahlungsgateway offen ist. Standard ist false.
localestringneinSprache der Fehlermeldungen: cs, en, sk, pl oder de. Standard ist cs.

Beispielinhalt

{
  "invoiceId": "clx9k2m4p0000inv01abcdef",
  "expectedAmountCzk": 249
}

Beispielantwort

{
  "ok": true,
  "orderId": "clx9k2m4p0000ord01abcdef",
  "amountCzk": 249,
  "balanceCzk": 201,
  "next": "/cs/order/clx9k2m4p0000ord01abcdef?credit=paid"
}

Mögliche Fehler

  • 400invalid Ein Pflichtfeld fehlt oder hat ein falsches Format.
  • 403locked Das Konto ist vorübergehend gesperrt.
  • 404invoice_not_found Die Rechnung existiert nicht oder gehört Ihnen nicht.
  • 409insufficient Das Guthaben reicht nicht. Die Antwort enthält balanceCzk und neededCzk.
  • 409amount_changed Der Betrag hat sich geändert. Der aktuelle steht in amountCzk.
  • 409closed Die Rechnung ist bereits bezahlt oder storniert.
  • 409expired Die Proformarechnung ist nach Fälligkeit verfallen.
  • 409upgrade_expired Das Upgrade-Angebot galt nur bis zum Ende des Abrechnungszeitraums und wurde storniert.
  • 409gateway_open Für die Rechnung ist eine Zahlung im Zahlungsgateway offen. Senden Sie ackOpenGateway: true.
  • 409payment_in_progress Eine Zahlung im Gateway läuft gerade.
  • 409paid_unreconciled Eine Zahlung ist bereits eingegangen, aber noch nicht zugeordnet.
  • 409topup_not_payable Eine Rechnung für eine Guthabenaufladung kann nicht mit Guthaben bezahlt werden.
  • 409not_payable Die Rechnung gehört zu keiner bezahlbaren Bestellung.
  • 409capacity Für den bestellten Dienst ist gerade keine Kapazität frei.
  • 409billing_profile_incomplete Die Rechnungsdaten des Kontos fehlen. Die Antwort enthält settingsUrl.
  • 409foreign_eu_vat Bestellungen von Unternehmen aus anderen EU-Ländern werden derzeit individuell bearbeitet.
  • 429rate_limited Limit von 10 Versuchen pro Minute überschritten.
  • 503unavailable Das Guthaben ist gerade nicht verfügbar.
  • 503gateway_check_failed Der Zahlungsstatus im Gateway kann gerade nicht geprüft werden. Versuchen Sie es später erneut.
  • 503capacity_busy Die Kapazität kann gerade nicht geprüft werden. Versuchen Sie es gleich erneut.
GET/invoicesBelege auflisten

Gibt die Belege des Kontos zurück, neueste zuerst, mit Positionen. Beträge sind in CZK.

Berechtigung: billing:read

Parameter in der Adresse

NameTypPflichtBeschreibung
statusstringneinFilter nach Status: PENDING, PAID, CANCELLED oder REFUNDED. Andere Werte werden ignoriert.
limitintegerneinAnzahl der Belege, 1 bis 200. Standard ist 50.

Beispielantwort

{
  "data": [
    {
      "id": "clx9k2m4p0000inv01abcdef",
      "number": "2026-0042",
      "status": "PAID",
      "totalCzk": 249,
      "currency": "CZK",
      "items": [
        {
          "description": "VPS Start (1 měsíc)",
          "priceCzk": 249,
          "quantity": 1
        }
      ],
      "dueAt": "2026-11-14T23:59:59.000Z",
      "paidAt": "2026-11-02T10:15:00.000Z",
      "createdAt": "2026-11-01T08:00:00.000Z"
    }
  ]
}
GET/invoices/{id}/pdfRechnungs-PDF

Lädt das PDF einer bezahlten oder erstatteten Rechnung herunter. Offene Belege haben kein PDF.

Berechtigung: billing:read

Parameter in der Adresse

NameTypPflichtBeschreibung
langstringneinen ergibt einen englischen Dateinamen, sonst einen tschechischen.

Beispielantwort

application/pdf (Content-Disposition: attachment; filename="faktura-2026-0042.pdf")

Mögliche Fehler

  • 404not_found Die Rechnung existiert nicht, gehört Ihnen nicht oder ist nicht bezahlt.
  • 409preparing Die Rechnung wird noch ausgestellt. Versuchen Sie es später erneut.
  • 429rate_limited Limit von 20 Downloads pro Minute überschritten.
  • 503not_ready Das PDF wird gerade vorbereitet. Versuchen Sie es in ein paar Sekunden erneut (Header Retry-After).
  • 503unavailable Das PDF kann gerade nicht geladen werden. Versuchen Sie es später erneut.
GET/services/{id}/external-invoices/{key}/pdfPDF einer Rechnung aus wiederkehrender Abrechnung

Lädt das PDF einer Rechnung für einen Dienst herunter, den Sie per wiederkehrender Rechnung außerhalb des Portals bezahlen. {key} ist der 22-stellige Rechnungsschlüssel aus der Zahlungsübersicht des Dienstes im Portal. Nur für den Inhaber des Dienstes (VPS, Gameserver, Webhosting).

Berechtigung: billing:read

Parameter in der Adresse

NameTypPflichtBeschreibung
langstringneinSprache des Dateinamens: cs, en, sk, pl oder de. Standard ist cs.

Beispielantwort

application/pdf (Content-Disposition: attachment; filename="faktura-2026-0042.pdf")

Mögliche Fehler

  • 404not_found Rechnung oder Dienst existiert nicht, gehört Ihnen nicht oder Sie sind nicht der Inhaber. Die Antwort ist immer gleich.
  • 429rate_limited Limit von 20 Downloads pro Minute überschritten.
  • 503not_ready Das PDF wird gerade vorbereitet. Versuchen Sie es in ein paar Sekunden erneut (Header Retry-After).
  • 503unavailable Das PDF kann gerade nicht geladen werden. Versuchen Sie es später erneut.
GET/services/{id}/game-upgradeOptionen zum Paketwechsel für Spiel oder Bot

Gibt das aktuelle Paket eines Gameservers oder Discord-Bots zurück, größere und kleinere Pakete mit Preisen und Aufpreis, den Backup-Zusatz sowie offene oder geplante Änderungen. Nur für den Besitzer.

Berechtigung: services:read

Parameter in der Adresse

NameTypPflichtBeschreibung
viewstringneinrestart = gibt nur { restartPending } zurück (ob der Server nach dem Paketwechsel auf einen Neustart wartet); funktioniert auch für Mitglieder.
localestringneinSprache der Texte in der Antwort: en, sonst cs.

Beispielantwort

{
  "product": "minecraft",
  "productName": "Minecraft",
  "current": {
    "planLabel": "Minecraft 4 GB",
    "packageId": "mc-4gb",
    "legacy": false,
    "memoryMib": 4096,
    "diskMib": 30720,
    "cpu": 200,
    "databases": 1,
    "allocations": 2,
    "backups": 0
  },
  "backups": {
    "included": 0,
    "addon": 0,
    "grandfathered": 0,
    "addonAvailable": true,
    "addonPriceCzk": 120,
    "addonUnitCzk": 0,
    "maxAddon": 1
  },
  "monthlyCzk": 249,
  "period": {
    "start": "2026-11-01T00:00:00.000Z",
    "end": "2026-12-01T00:00:00.000Z",
    "remainingDays": 24,
    "periodDays": 30
  },
  "packages": [
    {
      "id": "mc-6gb",
      "name": "Minecraft 6 GB",
      "cores": 3,
      "cpuUnlimited": false,
      "ramGb": 6,
      "diskGb": 45,
      "ports": 3,
      "databases": 2,
      "includedBackups": 0,
      "priceCzk": 349,
      "recommended": true,
      "fits": true,
      "message": null
    }
  ],
  "options": [
    {
      "packageId": "mc-6gb",
      "addon": 0,
      "monthlyCzk": 349,
      "chargeCzk": 80,
      "after": {
        "memoryMib": 6144,
        "diskMib": 46080,
        "cpu": 300,
        "databases": 2,
        "allocations": 3,
        "backups": 0
      }
    }
  ],
  "effectiveAt": "2026-12-01T00:00:00.000Z",
  "lowerPackages": [],
  "downgradeOptions": [],
  "removeBackup": {
    "available": false
  },
  "downgradeBlocker": null,
  "customStartup": false,
  "scheduled": null,
  "lastChange": null,
  "nextPeriodPriceCzk": 249,
  "pendingOrder": null,
  "upgradeInProgress": false,
  "blocker": null,
  "restartPending": false,
  "recurringMaxCzk": null,
  "billingIncomplete": false,
  "customerType": "consumer"
}

Mögliche Fehler

  • 403 Nur für den Besitzer des Dienstes.
  • 409unavailable Der Paketwechsel ist gerade nicht möglich (unbekanntes Paket oder Dienststatus).
  • 503 Das Game-Panel antwortet gerade nicht.
POST/services/{id}/game-upgradeGrößeres Paket bestellen oder kleineres planen

Ohne action (oder mit action order) wird eine Bestellung für ein größeres Paket oder den Backup-Zusatz mit Vorausrechnung angelegt; die Änderung erfolgt nach Zahlung. Ein kleineres Paket wird ab dem nächsten Zeitraum geplant, es wird nichts berechnet oder erstattet. Nur für den Besitzer.

Berechtigung: billing:write

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
actionstringneinorder (Standard), cancelPending (unbezahlte Bestellung stornieren), scheduleDowngrade (kleineres Paket ab dem nächsten Zeitraum) oder cancelScheduled (geplante Änderung stornieren).
packageIdstring | nullneinorder, scheduleDowngrade: ID des Zielpakets aus GET (packages, lowerPackages). Ohne bleibt das aktuelle Paket.
backupsintegerneinorder, scheduleDowngrade: Anzahl der Backup-Zusätze, 0 oder 1.
immediateStartRequestedbooleanneinorder: Verbraucher verlangt die sofortige Ausführung (AGB Art. 9.8). Ohne Firmennummer muss es true sein.
businessPurposebooleanneinorder: Erklärung, dass die Bestellung geschäftlichen Zwecken dient.
expectedChargeCzknumber | nullneinorder: der angezeigte Aufpreis. Weicht er ab, kommt 409 price_changed und es wird nichts angelegt.
expectedMonthlyCzknumber | nullneinorder, scheduleDowngrade: der angezeigte neue Monatspreis. Weicht er ab, kommt 409 price_changed.
changeIdstringneincancelScheduled: ID der geplanten Änderung (scheduled.id aus GET); passt sie nicht, kommt 409 changed.
localestringneinSprache der Meldungen: cs, en, sk, pl oder de. Standard cs.

Beispielinhalt

{
  "packageId": "mc-6gb",
  "backups": 0,
  "immediateStartRequested": true,
  "expectedChargeCzk": 80,
  "expectedMonthlyCzk": 349,
  "locale": "cs"
}

Beispielantwort

{
  "orderId": "ord_7Hq2mX9pLk",
  "chargeCzk": 80,
  "monthlyToCzk": 349,
  "scheduledCancelled": false
}

Mögliche Fehler

  • 400 Ungültige Anfrage oder ein Paket, das nicht gewählt werden kann.
  • 400immediate_start_required Ein Verbraucher muss immediateStartRequested: true senden.
  • 403 Nur für den Besitzer des Dienstes.
  • 404none cancelScheduled: es gibt keine geplante Änderung.
  • 409billing_profile_incomplete Die Rechnungsdaten des Kontos sind unvollständig.
  • 409pending_order Es gibt bereits eine unbezahlte Upgrade-Bestellung (orderId in der Antwort).
  • 409upgrade_in_progress Ein bezahltes Upgrade wird noch ausgeführt.
  • 409price_changed Der Preis hat sich geändert; die Antwort enthält newChargeCzk und newMonthlyCzk.
  • 409capacity Das größere Paket passt nicht auf den Server.
  • 409does_not_fit scheduleDowngrade: die Daten passen nicht in das kleinere Paket (Gründe in reasons).
  • 409transfer_pending Der Dienst wartet auf eine Übertragung.
  • 409refund_open Für den Dienst läuft ein Widerruf oder eine Erstattung.
  • 409renewal_paid Der nächste Zeitraum ist zum Preis des geplanten kleineren Pakets bezahlt.
  • 409change_applying Das kleinere Paket wird gerade eingerichtet.
  • 409too_late cancelScheduled: die Änderung gilt bereits.
  • 503price_list_unavailable Die Preisliste kann gerade nicht geladen werden; es wird nichts berechnet.
GET/services/{id}/order-upgradeUpgrade-Angebot für den VPS

Liefert die aktuelle VPS-Ausstattung, den Monatspreis, Sätze, die höchstmöglichen Werte laut freier Kapazität, den Abrechnungszeitraum und eine eventuell offene Upgrade-Bestellung. Nur Inhaber.

Berechtigung: services:read

Parameter in der Adresse

NameTypPflichtBeschreibung
localestringneinen für englische Texte, sonst Tschechisch.

Beispielantwort

{
  "tier": "vps-performance",
  "tierName": "VPS Performance",
  "current": {
    "cores": 2,
    "ramGb": 4,
    "diskGb": 60,
    "ipv4": 1
  },
  "monthlyCzk": 390,
  "rates": {
    "perCore": 0,
    "perGbRam": 95,
    "perGbDisk": 0,
    "perIpv4": 60
  },
  "priceList": {
    "fp": "a1b2c3d4",
    "rates": {
      "perCore": 0,
      "perGbRam": 95,
      "perGbDisk": 0,
      "perIpv4": 60
    },
    "packages": [],
    "diskAddon": {
      "perGb": 2,
      "stepGb": 10
    }
  },
  "limits": {
    "max": {
      "cores": 16,
      "ramGb": 24,
      "diskGb": 500,
      "ipv4": 5
    },
    "staticMax": {
      "cores": 16,
      "ramGb": 32,
      "diskGb": 500,
      "ipv4": 5
    }
  },
  "capacity": "limited",
  "unavailable": null,
  "upgradeInProgress": false,
  "period": {
    "start": "2026-11-01T00:00:00.000Z",
    "end": "2026-12-01T00:00:00.000Z",
    "remainingDays": 24,
    "periodDays": 30
  },
  "pendingOrder": null,
  "pendingRestart": false,
  "ipv4Pending": 0,
  "recurringMaxCzk": null,
  "billingIncomplete": false,
  "customerType": "consumer"
}

Mögliche Fehler

  • 400 Der Dienst ist kein VPS.
  • 403 Sie sind nicht Inhaber des Dienstes.
  • 409 Der Dienst ist nicht aktiv.
POST/services/{id}/order-upgradeVPS-Upgrade bestellen

Erstellt eine VPS-Upgrade-Bestellung mit Vorschussrechnung über den anteiligen Betrag bis Periodenende; das Upgrade erfolgt erst nach Zahlung. Der Server berechnet nach RAM, die Festplatte kann nur wachsen; action cancelPending storniert eine offene Bestellung.

Berechtigung: billing:write

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
actionstringneinorder (Standard) oder cancelPending.
ramGbnumberneinNeuer RAM in GB (1–32); vCPU ergibt sich aus dem RAM. Fehlt = unverändert.
diskGbnumberneinFestplatte in GB (20–500), nur nach oben.
ipv4numberneinAnzahl der IPv4-Adressen (1–5).
coresnumberneinvCPU (1–16); bei RAM-basiertem Preis wird es berechnet.
localestringneinSprache der Meldungen und der Bestellbeschreibung: cs, en, sk, pl oder de.
immediateStartRequestedbooleanneinVerbraucher: true = Antrag auf sofortige Ausführung; ohne ihn entsteht keine Bestellung.
businessPurposebooleanneinKonto mit Firmennummer: true = Erklärung des gewerblichen Zwecks (dann ist sofortige Ausführung nicht nötig).
expectedChargeCzknumberneinAngezeigter Betrag; weicht er ab = 409 price_changed.
expectedMonthlyCzknumberneinAngezeigter neuer Monatspreis; weicht er ab = 409 price_changed.

Beispielinhalt

{
  "ramGb": 8,
  "diskGb": 100,
  "locale": "cs",
  "immediateStartRequested": true,
  "expectedChargeCzk": 312,
  "expectedMonthlyCzk": 780
}

Beispielantwort

{
  "orderId": "clx9o4ord0001",
  "chargeCzk": 312,
  "monthlyToCzk": 780
}

Mögliche Fehler

  • 400immediate_start_required Antrag auf sofortige Ausführung fehlt. Ohne Code: ungültige Werte (Feld field) oder nichts erhöht.
  • 409pending_order Es gibt bereits eine offene Bestellung (orderId). Weitere Codes: billing_profile_incomplete, foreign_eu_vat, unavailable, transfer_pending, upgrade_in_progress, refund_open, renewal_payment, renewal_overdue, capacity.
  • 409price_changed Der Preis hat sich geändert; neue Werte in newChargeCzk und newMonthlyCzk, nichts wurde angelegt.
  • 503capacity_unknown Freie Kapazität kann gerade nicht geprüft werden. Code price_list_unavailable: Preisliste gerade nicht ladbar.
GET/services/{id}/renewalVerlängerungs- und Zahlungsstatus

Liefert den Verlängerungsstatus, das Ende des bezahlten Zeitraums, die nächste Zahlung, automatische Zahlungen und den Verlauf der Zahlungsaufforderungen. Für VPS, Spiele, Web und Domains; Mitglieder geteilter Dienste erhalten nur managed, status und paidUntil.

Berechtigung: services:read

Parameter in der Adresse

NameTypPflichtBeschreibung
localestringneinen für englische Texte, sonst Tschechisch.

Beispielantwort

{
  "serviceId": "clx9svc000001",
  "managed": true,
  "status": "awaiting_payment",
  "paidUntil": "2026-12-01T00:00:00.000Z",
  "owner": {
    "nextPayment": {
      "amountCzk": 390,
      "periodStart": "2026-12-01T00:00:00.000Z",
      "periodEnd": "2027-01-01T00:00:00.000Z",
      "issueAt": "2026-11-17T00:00:00.000Z",
      "dueAt": "2026-12-01T00:00:00.000Z",
      "method": "manual",
      "invoice": {
        "orderId": "clx9o4ord0002",
        "invoiceId": "clx9i5inv0002",
        "number": "ZF2026110042",
        "status": "PENDING",
        "payUrl": "/cs/order/clx9o4ord0002"
      }
    },
    "suspendAt": null,
    "terminateAt": null,
    "autoPay": {
      "credit": {
        "enabled": true,
        "globallyAllowed": true,
        "held": false,
        "balanceCzk": 120,
        "sufficient": false
      },
      "card": {
        "enabled": false,
        "available": false,
        "last4": null,
        "maxAmountCzk": null,
        "unavailableReason": null
      }
    },
    "endAtTermEnd": null,
    "canPay": true,
    "canExtendEarly": false,
    "canEndAtTermEnd": true,
    "history": []
  }
}

Mögliche Fehler

  • 400 Dieser Diensttyp hat keine Verlängerung im Portal (z. B. Rackhousing).
  • 404not_found Dienst nicht gefunden.
POST/services/{id}/renewalBezahlen oder früher verlängern

Liefert die offene Zahlungsaufforderung oder stellt früher eine für den nächsten Zeitraum aus (höchstens einen Zeitraum im Voraus), mit Zahlungslink. Eine neue Aufforderung liefert 201; nur Inhaber, Limit 20 pro Stunde, Body als application/json.

Berechtigung: billing:write

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
actionstringjaImmer pay.
localestringneinSprache der Meldungen und der Aufforderung: cs, en, sk, pl oder de.

Beispielinhalt

{
  "action": "pay",
  "locale": "cs"
}

Beispielantwort

{
  "orderId": "clx9o4ord0003",
  "payUrl": "/cs/order/clx9o4ord0003",
  "created": true
}

Mögliche Fehler

  • 400invalid Ungültiger Body.
  • 409not_allowed Verlängern ist gerade nicht möglich. Weitere Codes: not_managed, terminated, term_end, payment_started, failed.
  • 429rate_limited Mehr als 20 Anfragen pro Stunde.
  • 503failed Die Aufforderung konnte gerade nicht ausgestellt werden.
PATCH/services/{id}/renewalAutomatische Zahlungen und Kündigung zum Periodenende

Schaltet Zahlung per Guthaben und Karte ein oder aus und reicht eine Kündigung zum Ende des bezahlten Zeitraums ein oder zieht sie zurück. Die Kündigung storniert offene Zahlungsaufforderungen ohne Zahlung, der Dienst endet mit dem Zeitraum, es folgt eine Bestätigung per E-Mail. Nur Inhaber, Body als application/json.

Berechtigung: billing:write

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
autoCreditbooleanneinVerlängerung automatisch aus dem Guthaben zahlen.
autoCardbooleanneinVerlängerung automatisch mit der gespeicherten Karte zahlen.
endAtTermEndbooleanneintrue = Kündigung zum Ende des bezahlten Zeitraums, false = Kündigung zurückziehen.
localestringneinSprache der Meldungen: cs, en, sk, pl oder de.

Beispielinhalt

{
  "endAtTermEnd": true,
  "locale": "cs"
}

Beispielantwort

{
  "serviceId": "clx9svc000001",
  "managed": true,
  "status": "ending",
  "paidUntil": "2026-12-01T00:00:00.000Z",
  "owner": {
    "nextPayment": null,
    "suspendAt": null,
    "terminateAt": null,
    "autoPay": {
      "credit": {
        "enabled": true,
        "globallyAllowed": true,
        "held": false,
        "balanceCzk": 120,
        "sufficient": null
      },
      "card": {
        "enabled": false,
        "available": false,
        "last4": null,
        "maxAmountCzk": null,
        "unavailableReason": null
      }
    },
    "endAtTermEnd": {
      "requestedAt": "2026-11-07T10:00:00.000Z",
      "by": "customer",
      "termEnd": "2026-12-01T00:00:00.000Z"
    },
    "canPay": false,
    "canExtendEarly": false,
    "canEndAtTermEnd": false,
    "history": []
  }
}

Mögliche Fehler

  • 400invalid Ungültiger Body (andere als erlaubte Felder).
  • 404not_allowed Der Dienst gehört nicht zu Ihrem Konto.
  • 409not_managed Für den Dienst ist kein Zeitraum festgelegt. Weitere Codes: terminated, not_active, period_over, too_late, payment_started.
  • 415 Der Body ist nicht application/json.
GET/services/{id}/web-upgradeAngebot für einen höheren Webhosting-Tarif

Liefert den aktuellen Webhosting-Tarif und höhere Tarife mit Aufpreis bis Periodenende. Derzeit kommt 409 coming_soon, Webhosting ist online noch nicht änderbar; nur Inhaber.

Berechtigung: services:read

Parameter in der Adresse

NameTypPflichtBeschreibung
localestringneinen für englische Texte, sonst Tschechisch.

Beispielantwort

{
  "current": {
    "tier": "starter",
    "name": "Starter",
    "storageGb": 10,
    "sites": 1
  },
  "monthlyCzk": 59,
  "period": {
    "start": "2026-11-01T00:00:00.000Z",
    "end": "2026-12-01T00:00:00.000Z",
    "remainingDays": 24,
    "periodDays": 30
  },
  "options": [
    {
      "tier": "business",
      "name": "Business",
      "storageGb": 30,
      "sites": 5,
      "priceCzk": 119,
      "monthlyCzk": 119,
      "chargeCzk": 48
    }
  ],
  "pendingOrder": null,
  "upgradeInProgress": false,
  "blocker": null,
  "recurringMaxCzk": null,
  "billingIncomplete": false,
  "customerType": "consumer"
}

Mögliche Fehler

  • 409coming_soon Ein Tarifwechsel kann noch nicht online bestellt werden. Code unavailable: Tarif nicht bestimmbar oder der Dienst erlaubt kein Upgrade.
  • 400 Der Dienst ist kein Webhosting.
  • 403 Sie sind nicht Inhaber des Dienstes.
POST/services/{id}/web-upgradeHöheren Webhosting-Tarif bestellen

Erstellt eine Bestellung für einen höheren Tarif mit Vorschussrechnung über den anteiligen Betrag; die Änderung erfolgt nach Zahlung, ein niedrigerer Tarif ist nicht möglich. Derzeit kommt 409 coming_soon; action cancelPending storniert eine offene Bestellung.

Berechtigung: billing:write

Anfrageinhalt (JSON)

NameTypPflichtBeschreibung
actionstringneinorder (Standard) oder cancelPending.
tierstringjaFür order: business oder pro (nur höher als der aktuelle).
localestringneinSprache der Meldungen und der Bestellbeschreibung: cs, en, sk, pl oder de.
immediateStartRequestedbooleanneinVerbraucher: true = Antrag auf sofortige Ausführung; ohne ihn entsteht keine Bestellung.
businessPurposebooleanneinKonto mit Firmennummer: true = Erklärung des gewerblichen Zwecks.
expectedChargeCzknumberneinAngezeigter Betrag; weicht er ab = 409 price_changed.
expectedMonthlyCzknumberneinAngezeigter neuer Monatspreis; weicht er ab = 409 price_changed.

Beispielinhalt

{
  "tier": "business",
  "locale": "cs",
  "immediateStartRequested": true
}

Beispielantwort

{
  "orderId": "clx9o4ord0004",
  "chargeCzk": 48,
  "monthlyToCzk": 119
}

Mögliche Fehler

  • 409coming_soon Ein Tarifwechsel kann noch nicht online bestellt werden. Weitere Codes: price_changed, pending_order, billing_profile_incomplete, unavailable, unknown_current.
  • 400downgrade Ein niedrigerer oder gleicher Tarif ist nicht möglich. Weitere Codes: unknown_tier, immediate_start_required.
  • 503price_list_unavailable Die Preisliste ist gerade nicht ladbar, es wird nichts berechnet.

Sicherheit

  • Jede Anwendung und jede Umgebung sollte einen eigenen Schlüssel mit möglichst wenigen Berechtigungen haben. Gelangt einer nach außen, widerrufen Sie nur diesen.
  • Widerrufen Sie Schlüssel, die Sie nicht brauchen. In der Schlüsselliste sehen Sie, wann und von wo ein Schlüssel zuletzt verwendet wurde.
  • Für sensible Aktionen (Neuinstallation, Passwörter, Domain-Transfer) verwenden Sie einen auf die IP-Adresse Ihres Servers beschränkten Schlüssel.
  • Widerrufen Sie einen kompromittierten Schlüssel sofort im Kundenkonto und erstellen Sie einen neuen. Bei Verdacht auf Missbrauch schreiben Sie uns.

Was die API nicht kann

  • Anmeldung, Passwort, Zwei-Faktor-Authentifizierung, Passkeys und angemeldete Geräte
  • Teilen eines Dienstes mit anderen Konten und Übertragung eines Dienstes
  • Widerruf des Vertrags und Rückerstattungen
  • Erstellen weiterer API-Schlüssel
  • Hochladen von Dateien (nutzen Sie SFTP, die Zugangsdaten erhalten Sie über die API)