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
- Ö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.
- 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.
- 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.
| Berechtigung | Was sie erlaubt |
|---|---|
account:read | Kontodaten (nur lesen) |
services:read | Dienstliste, Status und Statistiken |
services:power | Starten, stoppen, neu starten |
services:console | Konsole |
services:network | Netzwerk: rDNS, privates Netz, Adressen |
services:firewall | Firewall |
services:files | Dateien, Welten, Plugins und Mods |
services:database | Datenbanken |
services:backups | Backups und Wiederherstellung |
services:settings | Diensteinstellungen (Spiele, Bots, Planer, Warnungen, ISO) |
services:secrets | Sensibel: Neuinstallation, Passwörter, SFTP, Domain-Transfercodenur mit IP-Beschränkung |
domains:read | DNS-Einträge (nur lesen) |
domains:write | DNS-Einträge und Nameserver (Änderungen) |
billing:read | Belege 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.
| Status | Code | Bedeutung |
|---|---|---|
| 400 | cookies_not_allowed | Die Anfrage enthält Cookies. Die API wird nur mit einem Schlüssel genutzt. |
| 401 | missing_key | Der Header Authorization mit dem Schlüssel fehlt. |
| 401 | invalid_key | Der Schlüssel ist ungültig, abgelaufen oder widerrufen. |
| 403 | ip_not_allowed | Der Schlüssel kann von dieser IP-Adresse nicht verwendet werden. |
| 403 | insufficient_scope | Dem Schlüssel fehlt die nötige Berechtigung (Feld requiredScope). |
| 403 | email_unverified | Die E-Mail-Adresse des Kontos ist nicht bestätigt. |
| 404 | not_found | Unbekannte 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). |
| 405 | method_not_allowed | Methode nicht erlaubt, der Header Allow nennt die erlaubten. |
| 429 | rate_limited | Limit überschritten, erneut versuchen nach der Zeit im Header Retry-After. |
| 503 | unavailable | Vorü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
- 401
invalid_keyDer 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
- 401
invalid_keyDas 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
ids | string | nein | Kommagetrennte 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. |
locale | string | nein | Sprache 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
- 404
not_foundDer Schlüssel ist auf bestimmte Dienste beschränkt und ids enthält einen anderen Dienst. - 429
rate_limitedLimit von 40 Anfragen pro Minute überschritten. - 503
unavailableDie 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
status | string | nein | Filter nach Status: PENDING, ACTIVE, SUSPENDED oder TERMINATED (Groß- und Kleinschreibung egal). |
locale | string | nein | Sprache 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
locale | string | nein | Sprache 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.
- 403
mfa_requiredDer 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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
mode | string | ja | Nur 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).
- 412
NOT_PROVISIONEDDer 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
source | string | nein | auto (Standard), latest, crash-report, console oder file. |
name | string | nein | Datei für source=file, z. B. logs/latest.log, crash-reports/crash-….txt oder hs_err_pid….log (max. 120 Zeichen). |
list | string | nein | files liefert die Liste analysierbarer Dateien (höchstens 50). |
lang | string | nein | Sprache der Meldungen: cs, en, sk, pl oder de. |
tpl | string | nein | 1 = 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
- 400
bad-requestUngültiger Parameter. Code bad-name: Diese Datei kann nicht analysiert werden. - 403
forbiddenFehlende Berechtigung Konsole oder Dateien beim geteilten Dienst. - 404
no-sourceKein Log gefunden, der Server ist evtl. noch nicht gelaufen. - 412
not-readyDer Server ist noch nicht bereit. - 413
too-largeDas Log ist zu groß für die Analyse (über 16 MiB). - 429
rateLimit überschritten. Code busy: Gerade werden andere Server analysiert. - 502
failedDas 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
locale | string | nein | Sprache 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.
- 401
AUTH_FAILEDDer VPS hat die Zugangsdaten abgelehnt. - 409
HOST_KEY_CHANGEDDer SSH-Schlüssel-Fingerabdruck des VPS hat sich geändert (neuer in presentedHostKey); bestätigen Sie ihn mit der Aktion trustHostKey. - 412
NO_TARGETDer VPS hat noch keine Adresse oder Zugangsdaten (auch NO_CREDENTIALS). - 502
UNREACHABLEDer 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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
action | string | ja | install, connectAuto, connectManual, disconnect, createDatabase, dropDatabase, createUser, dropUser, setPassword oder grant. |
engine | string | nein | install, connectAuto, connectManual: mysql oder postgres. connectAuto legt das Panel-Konto über lokalen Root-Zugriff an. |
port | integer | nein | connectManual: Port des Datenbankservers. |
username | string | nein | connectManual: Benutzer, mit dem sich das Panel verbindet. |
password | string | nein | connectManual: Passwort (Pflicht). createUser, setPassword: neues Passwort, 8–128 Zeichen; ohne wird eins erzeugt. |
name | string | nein | Datenbankaktionen: Name der Datenbank oder des Benutzers, Buchstaben ohne Diakritika, Ziffern und Unterstrich, höchstens 63 Zeichen, nicht mit Ziffer beginnend. |
createUser | boolean | nein | createDatabase: auch einen gleichnamigen Benutzer mit vollen Rechten anlegen. |
host | string | nein | createDatabase, createUser (MySQL): localhost (Standard) oder %. dropUser: bestimmter Host, sonst alle. |
database | string | nein | createUser (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).
- 401
AUTH_FAILEDDer VPS hat die Zugangsdaten abgelehnt. - 409
HOST_KEY_CHANGEDDer SSH-Schlüssel-Fingerabdruck des VPS hat sich geändert (neuer in presentedHostKey); bestätigen Sie ihn mit der Aktion trustHostKey. - 412
NO_TARGETDer VPS hat noch keine Adresse oder Zugangsdaten (auch NO_CREDENTIALS). - 502
UNREACHABLEDer 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
db | string | ja | Name der Datenbank. |
table | string | nein | Tabellenname; ohne ihn kommt die Tabellenliste. |
schema | string | nein | PostgreSQL: Schema der Tabelle, Standard public. |
page | integer | nein | Seite 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.
- 401
AUTH_FAILEDDer VPS hat die Zugangsdaten abgelehnt. - 409
HOST_KEY_CHANGEDDer SSH-Schlüssel-Fingerabdruck des VPS hat sich geändert (neuer in presentedHostKey); bestätigen Sie ihn mit der Aktion trustHostKey. - 412
NO_TARGETDer VPS hat noch keine Adresse oder Zugangsdaten (auch NO_CREDENTIALS). - 502
UNREACHABLEDer 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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
sql | string | ja | SQL-Abfrage, höchstens 100.000 Zeichen. |
db | string | nein | Datenbank, 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.
- 401
AUTH_FAILEDDer VPS hat die Zugangsdaten abgelehnt. - 409
HOST_KEY_CHANGEDDer SSH-Schlüssel-Fingerabdruck des VPS hat sich geändert (neuer in presentedHostKey); bestätigen Sie ihn mit der Aktion trustHostKey. - 412
NO_TARGETDer VPS hat noch keine Adresse oder Zugangsdaten (auch NO_CREDENTIALS). - 502
UNREACHABLEDer 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
path | string | nein | Absoluter 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.
- 401
AUTH_FAILEDDer VPS hat die Zugangsdaten abgelehnt. - 409
HOST_KEY_CHANGEDDer SSH-Schlüssel-Fingerabdruck des VPS hat sich geändert (neuer in presentedHostKey); bestätigen Sie ihn mit der Aktion trustHostKey. - 412
NO_TARGETDer VPS hat noch keine Adresse oder Zugangsdaten (auch NO_CREDENTIALS). - 502
UNREACHABLEDer 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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
action | string | ja | mkdir, touch, rename, delete, chmod, write; nur VPS und nur Besitzer: credentials, resetCredentials, trustHostKey; nur Spiele und Bots: compress, decompress. |
path | string | nein | mkdir, touch, rename, chmod, write, decompress: absoluter Pfad des Elements. |
to | string | nein | rename: neuer absoluter Pfad. |
paths | string[] | nein | delete: 1–200 absolute Pfade. |
mode | string | nein | chmod: Rechte oktal, 3–4 Ziffern (z. B. 644). |
content | string | nein | write: kompletter neuer Dateiinhalt in UTF-8, höchstens 2 MB. |
username | string | nein | credentials: SSH-Benutzer für den Dateimanager (statt root). |
password | string | nein | credentials: Passwort des SSH-Benutzers, wird nach erfolgreicher Anmeldung verschlüsselt gespeichert. |
port | integer | nein | credentials: SSH-Port 1–65535. |
fingerprint | string | nein | trustHostKey: neuer Schlüssel-Fingerabdruck im Format SHA256:…. |
dir | string | nein | compress: Ordner mit den zu packenden Elementen. |
names | string[] | nein | compress: 1–200 Namen aus dem Ordner dir. |
archiveName | string | nein | compress: Name des .tar.gz-Archivs, höchstens 120 Zeichen. |
into | string | nein | decompress: here (Standard) oder newFolder. |
folderName | string | nein | decompress: Name des neuen Ordners, höchstens 120 Zeichen. |
locale | string | nein | Sprache 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.
- 409
JOB_RUNNINGAuf dem Minecraft-Server läuft eine Softwareänderung oder Modpack-Installation. - 409
ARCHIVE_BUSYEin 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.
- 401
AUTH_FAILEDDer VPS hat die Zugangsdaten abgelehnt. - 409
HOST_KEY_CHANGEDDer SSH-Schlüssel-Fingerabdruck des VPS hat sich geändert (neuer in presentedHostKey); bestätigen Sie ihn mit der Aktion trustHostKey. - 412
NO_TARGETDer VPS hat noch keine Adresse oder Zugangsdaten (auch NO_CREDENTIALS). - 502
UNREACHABLEDer 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
path | string | ja | Absoluter Dateipfad. |
as | string | nein | text = 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.
- 413
TOO_LARGEas=text: die Datei ist größer als 1 MB. - 415
BINARYas=text: die Datei ist kein UTF-8-Text. - 403 Es fehlt die Berechtigung Dateien.
- 401
AUTH_FAILEDDer VPS hat die Zugangsdaten abgelehnt. - 409
HOST_KEY_CHANGEDDer SSH-Schlüssel-Fingerabdruck des VPS hat sich geändert (neuer in presentedHostKey); bestätigen Sie ihn mit der Aktion trustHostKey. - 412
NO_TARGETDer VPS hat noch keine Adresse oder Zugangsdaten (auch NO_CREDENTIALS). - 502
UNREACHABLEDer 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
poll | string | nein | Wert 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
- 403
mfa_requiredDer 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
- 403
mfa_requiredDer 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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
name | string | null | ja | Neuer Name, höchstens 60 Zeichen. |
locale | string | nein | Sprache der Fehlermeldungen (cs, en, sk, pl, de). |
Beispielinhalt
{
"name": "Survival server"
}Beispielantwort
{
"name": "Survival server"
}Mögliche Fehler
- 400
invalidDer Name ist länger als 60 Zeichen oder der Body enthält andere Felder. - 404
not_allowedDer 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
before | string | nein | Ereignis-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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
outlets | number[] | ja | Steckdosennummern 1–48 (1 bis 48 Einträge), nur Steckdosen dieses Dienstes. |
command | string | ja | on, 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
- 400
not_yoursEine Steckdose gehört nicht zu diesem Dienst. Ohne Code: ungültiger Anfrage-Body. - 403
not_allowedDie Steckdosensteuerung ist für den Dienst nicht aktiviert. - 409
inactiveDer Dienst ist nicht aktiv. Code no_config: Die PDU ist gerade nicht erreichbar. - 429 Anfragelimit überschritten.
- 502
pdu_failedDie 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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
action | string | ja | start, 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
lang | string | nein | en 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
lang | string | nein | en für englische Meldungen, sonst Tschechisch. |
Anfrageinhalt (JSON)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
action | string | ja | Immer setPassword. |
password | string | ja | Neues 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
- 400
weak_passwordDas Passwort erfüllt die Regeln nicht oder der Body ist ungültig. - 403
insufficient_scopeDem Schlüssel fehlt der Scope services:secrets. Code not_owner: Sie sind nicht Inhaber. - 404 SFTP ist noch nicht freigeschaltet.
- 409
admin_userSFTP für diesen Dienst richtet der Support ein. Weitere Codes: email_mismatch, foreign_server, inactive. - 429 Mehr als 5 Versuche pro Stunde.
- 502
failedDas 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.
- 412
NOT_PROVISIONEDDer 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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
id | string | ja | ID 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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
action | string | ja | add, update, toggle, delete, move, setInbound oder applyBaseline. |
pos | number | nein | Für update, toggle, delete und move: Position einer eigenen Regel aus GET. |
digest | string | nein | Für update, toggle, delete und move: digest aus GET. |
rule | object | nein | Fü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. |
enable | boolean | nein | Für toggle: Regel aktivieren oder deaktivieren. |
direction | string | nein | Für move: up oder down (nur zwischen eigenen Regeln). |
value | string | nein | Fü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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
range | string | nein | hour, day, week, month oder year. Standard day. |
lang | string | nein | en 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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
action | string | ja | add, delete, attach, boot oder detach. |
name | string | nein | Für add: ISO-Name (max. 80 Zeichen), sonst aus der Datei. |
url | string | nein | Für add: öffentlicher https://-Link zur ISO-Datei mit Größenangabe. |
isoId | string | nein | Für delete und attach: ISO-ID aus GET. |
boot | boolean | nein | Fü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
- 400
urlDer 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. - 404
not_foundISO nicht gefunden. - 409
unavailableISOs 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.
- 503
unavailablePrivate 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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
action | string | ja | create, attach, detach oder delete. |
name | string | nein | Für create: Netzname, 1–40 Zeichen (Buchstaben, Ziffern, Leerzeichen, . _ -). |
cidr | string | nein | Für create: privater Bereich /16 bis /29 ab der Netzadresse, z. B. 10.20.0.0/24. |
networkId | string | nein | Für attach, detach und delete: Netz-ID aus GET. |
address | string|null | nein | Für attach: VPS-Adresse im Netz; leer = erste freie. |
cloudInit | boolean | nein | Fü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
- 400
invalid_requestUngültiger Body. Weitere Codes: name_invalid, cidr_invalid, address_invalid, address_outside, address_reserved. - 404
network_not_foundNetz nicht gefunden. Code not_member: Der VPS ist nicht im Netz. - 409
firewall_requiredZuerst 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. - 412
vm_not_readyDer VPS ist noch nicht bereit. - 502
apply_failedDie Änderung konnte nicht abgeschlossen werden. - 503
unavailablePrivate 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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
ip | string | ja | IPv4- oder IPv6-Adresse des Dienstes (auch aus seinem IPv6-Bereich). |
hostname | string|null | ja | Hostname, 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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
os | string | ja | Systemschlüssel aus GET, z. B. ubuntu-2404 oder debian-13. |
sshKeys | string | nein | Ö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.
- 403
insufficient_scopeDem 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
- 403
insufficient_scopeDem 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
lang | string | nein | en 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
lang | string | nein | en für englische Meldungen, sonst Tschechisch. |
Beispielantwort
{
"password": "example-Root-Pass-456"
}Mögliche Fehler
- 403
insufficient_scopeDem 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
lang | string | nein | Sprache 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
lang | string | nein | Sprache der Meldungen: en, sonst cs. |
Anfrageinhalt (JSON)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
action | string | ja | save, test (Testnachricht an den gespeicherten Webhook, einmal pro Minute und 5-mal pro Stunde), removeDiscord oder disable. |
enabled | boolean | nein | save: Überwachung einschalten. |
email | boolean | nein | save: Warnungen per E-Mail an den Besitzer senden. |
events | object | nein | save: welche Ereignisse gemeldet werden, Schlüssel crash, down, recovered, cleanExit, node (boolean). |
includeLog | boolean | nein | save: Ende des Logs anhängen. |
webhook | string | nein | save: 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
- 400
bad-requestUngültiger Body oder zusätzliche Felder. - 400
webhookDie Adresse ist kein Discord-Webhook. - 400
test-failedDie Testnachricht konnte nicht zugestellt werden. - 400
no-webhooktest: es ist kein Webhook gespeichert. - 400
no-channelAktive Überwachung braucht E-Mail oder einen Webhook. - 429
rateEine Testnachricht ist einmal pro Minute und 5-mal pro Stunde möglich. - 500
failedDie 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
section | string | ja | network (Ports und SFTP), databases (Datenbanken), backups (Backups und Backup-Zusatz) oder startup (Startbefehl und Variablen). |
locale | string | nein | Sprache 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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
action | string | ja | createDatabase, rotateDatabasePassword, deleteDatabase, createBackup, restoreBackup, deleteBackup, lockBackup (sperrt oder entsperrt), setVariable, reinstall, addAllocation oder removeAllocation. |
name | string | nein | createDatabase: Datenbankname, 1–48 Zeichen (Buchstaben, Ziffern, Unterstrich), Pflicht. createBackup: optionaler Backup-Name, höchstens 191 Zeichen. |
remote | string | nein | createDatabase: von wo Verbindungen zur Datenbank erlaubt sind (IP-Adresse oder %). Standard % = von überall. |
databaseId | string | nein | rotateDatabasePassword, deleteDatabase: Datenbank-ID aus GET ?section=databases. |
uuid | string (uuid) | nein | restoreBackup, deleteBackup, lockBackup: Backup-UUID aus GET ?section=backups. |
truncate | boolean | nein | restoreBackup: vor der Wiederherstellung alle Serverdateien löschen. Standard false. |
key | string | nein | setVariable: Name der Startvariable (Großbuchstaben, Ziffern, Unterstrich). |
value | string | nein | setVariable: neuer Wert, höchstens 4096 Zeichen, ohne Steuerzeichen. |
allocationId | integer | nein | removeAllocation: Port-ID aus GET ?section=network. Der Hauptport kann nicht entfernt werden. |
locale | string | nein | Sprache 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.
- 400
CONTROL_CHARSDer Variablenwert enthält Steuerzeichen. - 403 Fehlende Berechtigung für die Aktion; die Neuinstallation braucht zusätzlich Dateien und Ein-/Ausschalten.
- 403
SECRETS_REQUIREDEine geheime Variable darf nur der Besitzer oder ein Mitglied mit der Berechtigung Geheime Daten ändern. - 403
FILES_REQUIREDDie Code-Quelle des Discord-Bots kann nur mit der Berechtigung Dateien geändert werden. - 404 Das Backup existiert nicht.
- 409
MANAGED_VARIABLEDie Variable wird von StormHost verwaltet und kann nicht geändert werden. - 409
MC_MANAGED_VARIABLEBei Minecraft wird diese Variable im Tab Software gesetzt. - 409
PROTECTED_ARGUMENTFreie Argumente dürfen geschützte Parameter (z. B. RCON) nicht überschreiben. - 409
JOB_RUNNINGAuf dem Minecraft-Server läuft gerade eine Softwareänderung. - 409
PORT_LIMITDas Paket hat keinen freien Port mehr. - 409
NO_FREE_PORTAuf 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
uuid | string (uuid) | ja | Backup-UUID aus GET …/game?section=backups. |
locale | string | nein | Sprache 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
locale | string | nein | Sprache 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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
action | string | ja | create, update, delete, toggle (aktivieren oder deaktivieren), run (sofort ausführen, höchstens einmal pro Minute) oder unstick (hängenden Zeitplan freigeben). |
scheduleId | integer | nein | Alle Aktionen außer create: Zeitplan-ID aus GET. |
preset | object | nein | create, 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.repeat | object | nein | Wiederholung: {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}. |
name | string | nein | create, update: Name des Zeitplans, höchstens 60 Zeichen. |
ack | boolean | nein | create, update: bei einem Backup-Zeitplan muss es true sein (Bestätigung, dass das neue Backup das ältere ersetzt). |
active | boolean | nein | toggle: true aktiviert, false deaktiviert. |
locale | string | nein | Sprache 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
- 400
INVALIDDer Zeitplan ist nicht korrekt ausgefüllt. - 400
GAPDer Zeitplan würde zu oft laufen. - 400
BACKUP_ACKBei einem Backup-Zeitplan fehlt ack: true. - 400
COMMAND_FORBIDDENDer Befehl würde den Server stoppen oder neu starten; nutzen Sie die Vorlage restart oder power. - 403
FORBIDDENFür den Zeitplan fehlt eine Berechtigung (je nach Aufgabe Konsole, Ein-/Ausschalten oder Backups). - 404
NOT_FOUNDDer Zeitplan existiert nicht. - 409
LIMITDer Server hat bereits 10 Zeitpläne. - 409
BACKUP_SLOTSGeplante Backups brauchen den Backup-Zusatz. - 409
BACKUP_EXISTSEin Backup-Zeitplan existiert bereits. - 409
NOT_EDITABLEDer Zeitplan wurde außerhalb des Portals erstellt; er kann nur deaktiviert oder gelöscht werden. - 409
PANEL_TZZeitpläne zu einer festen Uhrzeit gehen gerade nicht, vorerst nur stündliche Wiederholung. - 409
SUSPENDEDDer Server ist gesperrt. - 409
JOB_RUNNINGAuf dem Minecraft-Server läuft eine Softwareänderung. - 429
RATEEin Zeitplan kann höchstens einmal pro Minute ausgeführt werden. - 502
PARTIALDer 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
lang | string | nein | Sprache 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
- 400
not_minecraftDer VIP-Shop gibt es nur für Minecraft-Server. - 404
disabledDer VIP-Shop ist für das Konto gerade nicht verfügbar. - 503
disabledDer VIP-Shop ist noch nicht bereit. - 500
failedDie 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
lang | string | nein | Sprache der Meldungen: cs, en, sk, pl oder de. Standard cs. |
Anfrageinhalt (JSON)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
action | string | ja | saveShop, setStatus, saveItem oder deleteItem. |
slug | string | nein | saveShop: Shop-Adresse, 3–32 Zeichen a–z, 0–9 und Bindestrich. |
title | string | nein | saveShop: Shopname (2–60 Zeichen). saveItem: Artikelname (2–60 Zeichen). |
sellerName | string | nein | saveShop: Name oder Firma des Verkäufers (2–120 Zeichen). |
sellerIco | string | nein | saveShop: tschechische Firmennummer des Verkäufers (optional). |
sellerEmail | string | nein | saveShop: Kontakt-E-Mail des Verkäufers. |
sellerAddress | string | nein | saveShop: Adresse des Verkäufers, 5–200 Zeichen (optional). |
playerTerms | string | nein | saveShop: eigene Bedingungen für Spieler, höchstens 20.000 Zeichen (optional). |
terms | boolean | nein | saveShop: Zustimmung zu den Bedingungen für Shop-Betreiber. |
status | string | nein | setStatus: active oder paused. |
id | string | nein | saveItem: Artikel-ID zum Bearbeiten (ohne ID wird ein neuer angelegt, höchstens 50). deleteItem: Artikel-ID (Pflicht). |
description | string | nein | saveItem: Beschreibung, höchstens 500 Zeichen. |
priceCzk | integer | nein | saveItem: Preis in CZK, 10–10.000 (Pflicht). |
category | string | nein | saveItem: Kategorie, höchstens 40 Zeichen. |
durationDays | integer | null | nein | saveItem: Laufzeit in Tagen 1–3650, null = dauerhaft. |
commandsBuy | string[] | nein | saveItem: 1–10 Befehle nach dem Kauf, je bis 300 Zeichen; einzige Variable ist {player}; Befehle wie stop, restart, op sind nicht erlaubt. |
commandsExpire | string[] | nein | saveItem: höchstens 10 Befehle beim Ablauf. |
active | boolean | nein | saveItem: Artikel im Shop anbieten. Standard true. |
sortOrder | integer | nein | saveItem: 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
- 400
badUngü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.
- 404
no_shopDer Dienst hat noch keinen Shop. - 404
item_not_foundDer Artikel existiert nicht. - 409
slug_takenDie Shop-Adresse ist vergeben. - 409
suspendedDer Shop wurde vom Betreiber gesperrt. - 409
items_maxDer Shop hat bereits 50 Artikel. - 400
not_minecraftDer VIP-Shop gibt es nur für Minecraft-Server. - 500
failedDie 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
lang | string | nein | Sprache der Meldungen: cs, en, sk, pl oder de. Standard cs. |
before | string (ISO 8601) | nein | Verkä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
- 404
no_shopDer Dienst hat noch keinen Shop. - 400
not_minecraftDer VIP-Shop gibt es nur für Minecraft-Server. - 500
failedDie 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
lang | string | nein | Sprache der Meldungen: cs, en, sk, pl oder de. Standard cs. |
Anfrageinhalt (JSON)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
action | string | ja | retry. |
deliveryId | string | ja | Zustellungs-ID aus GET (deliveries[].id). |
Beispielinhalt
{
"action": "retry",
"deliveryId": "dlv_77aa"
}Beispielantwort
{
"ok": true,
"state": "done",
"code": null
}Mögliche Fehler
- 400
badUngültige Anfrage. - 404
no_shopDer Dienst hat noch keinen Shop. - 404
delivery_not_foundDie Zustellung existiert nicht. - 409
delivery_stateDie Zustellung kann gerade nicht wiederholt werden. - 429
rateHöchstens 10 Versuche pro Minute. - 400
not_minecraftDer VIP-Shop gibt es nur für Minecraft-Server. - 500
failedDie 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
q | string | nein | Suchtext (höchstens 80 Zeichen). |
offset | integer | nein | Versatz in den Suchergebnissen, Standard 0. |
project | string | nein | Modrinth-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
- 409
NOT_IMPORTEDDie Server-Software ist noch nicht festgelegt, zuerst minecraft/software verwenden. - 412
NO_PANELDer 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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
action | string | ja | `install`, `remove` oder `reload`. |
projectId | string | nein | Nur `install`: Modrinth-Projekt-ID (1–64 Zeichen). |
versionId | string | nein | Nur `install`: Versions-ID aus `GET ?project=` (1–16 Zeichen). |
name | string | nein | Nur `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
- 400
INVALIDUngültiger Anfrageinhalt. - 403
FORBIDDEN`reload` ohne Berechtigung Konsole bei einem geteilten Dienst. - 404
NO_SUCH_PACKIn der Welt gibt es kein Datapack mit diesem Namen. - 409
NAME_TAKENEin Datapack mit gleichem Namen existiert bereits, zuerst entfernen. - 409
TOO_MANYDie Welt hat bereits 100 Datapacks. - 409
NOT_RUNNINGDer Server läuft nicht, bitte starten und erneut versuchen. - 409
JOBAuf dem Server läuft gerade eine andere Änderung oder Add-on-Installation. - 422
INCOMPATIBLEDiese Datapack-Version passt nicht zur Serverversion. - 422
NO_PACK_MCMETADie Datei ist kein gültiges Datapack (pack.mcmeta fehlt). - 429
RATE_LIMITEDLimit: 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
check | string | nein | Zu prüfender Name, liefert `{ name, fqdn, available, code?, error? }`. |
locale | string | nein | Sprache 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
- 400
NOT_MINECRAFTDer Dienst ist kein Minecraft-Server. - 503
PANELDie Serververwaltung ist vorübergehend nicht verfügbar. - 500
SETUP_FAILEDKonnte 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
locale | string | nein | Sprache der Fehlermeldungen der Zugriffsprüfung: cs, en, sk, pl, de. |
Anfrageinhalt (JSON)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
action | string | ja | `create`, `rename`, `delete` oder `resync`. |
name | string | nein | Fü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
- 400
INVALIDUngültiger Anfrageinhalt. - 400
INVALID_NAMEDer Name entspricht nicht den Regeln. - 400
RESERVEDDer Name ist reserviert. - 400
SAME_NAMEDer Server hat diese Adresse bereits. - 404
NONEDer Server hat keine eigene Adresse. - 409
TAKENDie Adresse ist vergeben. - 409
EXISTSDer Server hat bereits eine eigene Adresse, `rename` verwenden. - 409
NO_ALLOCATIONDer Server hat keinen Standardport. - 409
NOT_PUBLICDie Standardadresse des Servers ist nicht öffentlich. - 412
NO_PANEL_LINKDer Server ist im Spielpanel gerade nicht erreichbar. - 429
RATE_LIMITEDÄnderungslimit überschritten, bitte später erneut versuchen. - 503
DISABLEDEigene Adressen sind gerade nicht verfügbar. - 502
DNSDas 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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
accept | boolean | ja | Muss `true` sein. |
start | boolean | nein | Nach 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
lang | string | nein | Sprache 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
- 409
NOT_IMPORTEDDie Server-Software ist noch nicht festgelegt, zuerst minecraft/software verwenden. - 412
NO_PANELDer Server ist im Spielpanel gerade nicht erreichbar. - 413
FILE_TOO_LARGEDie Regeldatei ist zu groß. - 422
FILE_CORRUPTDie 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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
rules | object | ja | Zuordnung von Regel-`id` (aus GET) zu einem `boolean` oder einer Ganzzahl. |
allDimensions | boolean | nein | Auf 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
- 400
INVALIDUngültiger Anfrageinhalt. - 400
NO_CHANGES`rules` ist leer. - 400
UNKNOWN_RULEDie Regel gibt es in der Serverversion nicht (Feld `rule`). - 400
INVALID_VALUEUngültiger Regelwert (Feld `rule`). - 409
NOT_RUNNINGDer Server läuft nicht, bitte starten und erneut versuchen. - 409
NOT_IMPORTEDDie Server-Software ist noch nicht festgelegt, zuerst minecraft/software verwenden. - 409
JOBAuf dem Server läuft gerade eine andere Änderung oder Add-on-Installation. - 429
CONSOLE_BUSYDie Serverkonsole ist ausgelastet. - 412
NO_PANELDer 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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
action | string | ja | Immer `dismiss`. |
jobId | string | ja | Job-`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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
search | string | nein | Suchtext auf Modrinth. |
mc | string | nein | Mit `search`: Minecraft-Version, z. B. `1.21.1`. |
loader | string | nein | Mit `search`: `fabric`, `forge` oder `neoforge`. |
sort | string | nein | Mit `search`: `downloads`, `relevance` oder `newest`. |
offset | integer | nein | Mit `search`: Versatz in den Ergebnissen. |
project | string | nein | Projekt-ID oder Slug; mit `preview=modrinth` nur die ID (8 Zeichen). |
preview | string | nein | `modrinth` (mit `project` und `version`) oder `upload` (mit `upload`). |
version | string | nein | Mit `preview=modrinth`: Versions-ID (8 Zeichen). |
upload | string | nein | Mit `preview=upload`: `id` aus der Aktion `stageServerFile` (24 Hex-Zeichen). |
mode | string | nein | Mit `preview`: `all` (Standard), `keep-world` oder `wipe`. |
serverFiles | string | nein | `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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
action | string | ja | `install`, `rollback`, `deleteAside` oder `stageServerFile`. |
origin | string | nein | `install`: `modrinth` oder `mrpack` (eigene Datei). |
projectId | string | nein | `install` von Modrinth: Projekt-ID (8 Zeichen). |
versionId | string | nein | `install` von Modrinth: Versions-ID (8 Zeichen). |
uploadId | string | nein | `install` mit `mrpack`: `id` aus `stageServerFile` (24 Hex-Zeichen). |
mode | string | nein | `install`: `all` (alles ersetzen, Altes zurücklegen), `keep-world` (Welt und server.properties behalten) oder `wipe` (alles löschen, nur Inhaber). |
replaceBackup | boolean | nein | Bei vollen Backup-Plätzen das älteste Backup überschreiben (Inhaber oder Berechtigung Backups). |
acceptEula | boolean | nein | Die Minecraft-Lizenz (EULA) bei der Installation akzeptieren. |
confirmDowngrade | boolean | nein | Installation einer älteren Minecraft-Version als die der Welt bestätigen. |
name | string | nein | `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`).
- 403
WIPE_OWNERNur der Inhaber darf `wipe` verwenden. - 403
BACKUP_PERMISSION`replaceBackup` ohne Berechtigung Backups. - 409
JOB_RUNNINGAuf dem Server läuft bereits ein anderer Job. - 409
ADDON_RUNNINGEine Plugin- oder Mod-Installation läuft. - 409
QUEUE_FULLDie Installationswarteschlange ist voll, bitte später erneut versuchen. - 409
DISKZu wenig Speicherplatz auf dem Server (`details.freeMb`, `details.needMb`). - 409
DOWNGRADEDas Modpack nutzt eine ältere Minecraft-Version, mit `confirmDowngrade` bestätigen. - 422
LOADERDer 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
range | string | nein | `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
- 503
unavailableDas Spielerdiagramm ist noch nicht verfügbar. - 502
ERRORDas 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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
enabled | boolean | ja | `true` einschalten, `false` ausschalten und Daten löschen. |
Beispielinhalt
{
"enabled": false
}Beispielantwort
{
"ok": true,
"enabled": false,
"deleted": 2016
}Mögliche Fehler
- 400
INVALIDUngültiger Anfrageinhalt. - 503
unavailableDas 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
lookup | string | nein | Zu 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
- 400
INVALID_NICKUngültiger Name in `lookup`. - 403
FORBIDDEN`lookup` ohne Berechtigung Konsole. - 503
MOJANG_BUSYDie 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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
action | string | ja | `whitelist-add`, `whitelist-remove`, `whitelist-toggle`, `op`, `deop`, `ban`, `pardon`, `pardon-ip`, `kick`, `bedrock-whitelist-add` oder `bedrock-whitelist-remove`. |
nick | string | nein | Spielername (höchstens 40 Zeichen); bei `bedrock-*` der Bedrock-Spielername. |
uuid | string | nein | UUID aus der Liste, zum Entfernen auf gestopptem Server auch ohne gültigen Namen. |
level | integer | nein | `op`: Operator-Stufe 1–4. |
bypassesPlayerLimit | boolean | nein | `op`: der Operator kann einem vollen Server beitreten. |
reason | string | nein | `ban` und `kick`: Grund (höchstens 200 Zeichen). |
ip | string | nein | `pardon-ip`: die gebannte IP-Adresse. |
enabled | boolean | nein | `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
- 400
INVALIDUngültiger Anfrageinhalt. - 400
INVALID_NICKUngültiger Name oder UUID. - 400
INVALID_REASONUngültiger Grund. - 400
INVALID_IPUngültige IP-Adresse. - 409
NOT_RUNNINGDie Aktion braucht einen laufenden Server (z. B. `kick`). - 409
PLAYER_OFFLINEDer Spieler ist nicht online. - 409
NO_FLOODGATE`bedrock-*`-Aktionen brauchen Floodgate. - 409
CONFLICTDie Datei hat sich zwischenzeitlich geändert, erneut versuchen. - 409
JOBAuf dem Server läuft eine andere Änderung. - 422
PLAYER_UNKNOWNEs gibt keinen Spieler mit diesem Namen. - 429
RATE_LIMITEDÄnderungslimit überschritten, bitte später erneut versuchen. - 503
MOJANG_BUSYDie 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
search | flag | nein | Katalogsuche (mit `source`, `q`, `offset`). |
versions | flag | nein | Kompatible Versionen eines Projekts (mit `source`, `project`). |
plan | flag | nein | Installationsvorschau mit Abhängigkeiten ohne Schreiben (mit `source`, `project`, `version`, `deps`). |
updates | flag | nein | Neuere Versionen der über das Portal installierten Dateien. |
source | string | nein | `modrinth` oder `hangar` (Hangar nur für Plugins). |
q | string | nein | Suchtext. |
offset | integer | nein | Versatz in den Suchergebnissen. |
project | string | nein | Projekt-ID oder Slug (1–64 Zeichen). |
version | string | nein | Mit `plan`: Versions-ID, sonst die neueste kompatible. |
deps | string | nein | Mit `plan`: `0` ohne Abhängigkeiten. |
op | string | nein | Operations-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
- 400
BAD_REQUESTUnbekannte Quelle, Projekt oder Version. - 400
UNSUPPORTED_TYPEDer Servertyp unterstützt weder Plugins noch Mods (Vanilla). - 404
OP_NOT_FOUNDDie Operation existiert nicht oder ist abgelaufen. - 429
RATE_LIMITEDLimit für Katalogabfragen: 60 pro Minute. - 502
SOURCE_ERRORDer 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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
action | string | ja | `install`, `update`, `remove` oder `toggle`. |
source | string | nein | `install`: `modrinth` oder `hangar`. |
project | string | nein | `install`: Projekt-ID oder Slug. |
version | string | nein | `install` und `update`: Versions-ID, sonst die neueste kompatible. |
dependencies | boolean | nein | `install`: auch Pflichtabhängigkeiten installieren, Standard `true`. |
skip | string[] | nein | `install`: zu überspringende Abhängigkeits-IDs (höchstens 50). |
replace | boolean | nein | `install`: kollidierende Dateien ersetzen, Standard `false`. |
file | string | nein | `update`, `remove`, `toggle`: Dateiname aus der Liste (höchstens 255 Zeichen). |
dataFolder | string | nein | `remove`: auch den Datenordner des Plugins löschen (Name aus `dataFolders`). |
enabled | boolean | nein | `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
- 400
BAD_REQUESTUngültiger Anfrageinhalt oder Projekt-/Versionsangabe. - 404
NOT_FOUNDDatei oder Projekt nicht gefunden. - 404
NO_VERSIONKeine kompatible Version. - 409
JOB_RUNNINGAuf dem Server läuft eine andere Änderung. - 409
INSTALLINGDer Server wird gerade installiert. - 409
EXISTSDie Datei existiert bereits, `replace` verwenden. - 409
UP_TO_DATEDie Datei ist bereits aktuell. - 413
TOO_LARGEDie Datei ist größer als 100 MB. - 422
INCOMPATIBLEDie Version passt nicht zu diesem Server. - 422
EXTERNALDas Projekt lässt sich nur von der Autorenseite laden. - 429
RATE_LIMITEDLimit von 20 Änderungen pro 10 Minuten. - 502
SOURCE_ERRORDer 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
reveal | string | nein | `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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
etag | string | ja | `etag` aus GET; `absent`, wenn die Datei nicht existiert. |
fields | object | nein | Schlüssel zu Wert (String, Zahl oder Boolean). Nicht zusammen mit `raw`. |
raw | string | nein | Gesamter Dateiinhalt (höchstens 80.000 Zeichen, Ergebnis bis 64 KB). Gesperrte und geheime Schlüssel werden auf den gespeicherten Wert zurückgesetzt. |
create | boolean | nein | Datei aus Standardwerten anlegen, wenn sie noch nicht existiert. |
restart | boolean | nein | Nach 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`).
- 400
UNKNOWN_KEYDer Schlüssel lässt sich nicht über `fields` ändern (Feld `key`). - 400
LOCKEDDer Schlüssel ist gesperrt (Feld `key`). - 400
INVALIDUngültiger Schlüsselwert (Feld `key`). - 400
RAW_INVALIDDer Dateitext ist zu lang oder enthält unzulässige Zeichen. - 403
SECRETSÄnderung eines Geheimnisses oder der Fernverwaltung ohne Berechtigung Geheime Daten. - 403 `restart` ohne Berechtigung Stromversorgung.
- 409
CONFLICTDie Datei wurde zwischenzeitlich geändert, neuen `etag` holen. - 409
NO_FILEDie 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
versions | string | nein | Servertyp: `paper`, `purpur`, `folia`, `vanilla`, `fabric`, `forge` oder `neoforge`; liefert bis zu 250 Versionen. |
prerelease | string | nein | Mit `versions`: `1` nimmt Vorabversionen auf. |
builds | string | nein | Servertyp; mit `version` bis zu 100 Builds. |
preview | string | nein | Servertyp für die Änderungsvorschau (mit `version`, `build`). |
version | string | nein | Minecraft-Version (bei `preview` Standard `latest`). |
build | string | nein | Mit `preview`: bestimmter Build oder Loader-Version. |
unstable | string | nein | `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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
action | string | ja | `switch`, `reinstall` oder `import`. |
type | string | nein | `switch` und `import`: `paper`, `purpur`, `folia`, `vanilla`, `fabric`, `forge` oder `neoforge`. |
version | string | nein | `switch` und `import`: Minecraft-Version (1–40 Zeichen), bei `switch` auch `latest`. |
build | string | nein | Build oder Loader-Version, sonst die neueste stabile. |
allowUnstable | boolean | nein | `switch`: instabilen Build erlauben. |
mode | string | nein | `switch`: `keep` (Standard, nichts löschen), `clean` (alles außer Welt, Einstellungen und Spielerlisten löschen) oder `wipe` (alles löschen). |
acceptEula | boolean | nein | `switch` und `reinstall`: EULA akzeptieren. |
confirmDowngrade | boolean | nein | `switch`: Wechsel auf eine ältere oder unbekannte Version bestätigen. |
skipBackup | boolean | nein | `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.
- 403
SKIP_BACKUP_OWNERNur der Inhaber darf `skipBackup` verwenden. - 409
JOB_RUNNINGAuf dem Server läuft bereits ein anderer Job. - 409
ADDON_RUNNINGEine Plugin- oder Mod-Installation läuft. - 409
BACKUP_SLOTDie Backup-Plätze sind voll. - 409
BACKUP_DISABLEDDer Dienst hat keine Backups, die Änderung geht nur mit `skipBackup`. - 409
DISKZu wenig Speicherplatz (`details.freeMb`, `details.needMb`). - 409
DOWNGRADEÄltere Version, mit `confirmDowngrade` bestätigen. - 409
UNKNOWN_VERSIONDie aktuelle Version ist unbekannt, mit `confirmDowngrade` bestätigen. - 409
NOT_IMPORTED`reinstall` ohne bekannte Software, zuerst `import` oder `switch`. - 409
INSTALLINGDer Server installiert gerade oder stellt ein Backup wieder her. - 422
NEED_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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
java | string | nein | `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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
action | string | nein | `apply` (Standard), `recalculate`, `revert` oder `java`. |
preset | string | nein | `apply` (Pflicht): `standard`, `zgc` (Java 21+), `proxy` oder `none`. |
extraFlags | string | string[] | nein | `apply`: eigene JVM-Flags (Text bis 4000 Zeichen oder bis 60 Einträge); neue Flags nur mit Berechtigung Stromversorgung. |
dryRun | boolean | nein | `apply`: nur den Befehl bauen, nichts speichern. |
major | integer | nein | `java` (Pflicht): Java-Hauptversion 8–99. |
restart | boolean | nein | Nach 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`).
- 403
EXTRA_FLAGS_PERMISSIONNeue eigene Flags ohne Berechtigung Stromversorgung (Feld `token`). - 403 `restart` oder `java` ohne die nötigen Berechtigungen.
- 409
NEED_IMPORTDie Server-Software ist nicht festgelegt. - 409
NO_MEMORY_LIMITDer Server hat kein Speicherlimit. - 409
CHANGEDDer Start wurde zwischenzeitlich geändert. - 409 Ein Software-Wechsel oder eine Installation läuft.
- 422
PRESETDas Preset passt nicht zu dieser Java. - 422
EXTRA_FLAGSUnzulässiges Flag (Feld `token`). - 422
TOO_OLD`java`: Die Version ist für die Minecraft-Version zu alt. - 422
NO_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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
action | string | ja | `essentials-nick`, `lp-prefix`, `tab-prefix`, `give-nametag` oder `tellraw`. |
target | string | ja | Spieler oder Gruppe (1–36 Zeichen); bei `tellraw` auch `@a`. |
targetKind | string | nein | `lp-prefix` und `tab-prefix`: `group` (Standard) oder `player`. |
priority | integer | null | nein | `lp-prefix`: Priorität 0–1000. |
prefixFormat | string | nein | `lp-prefix`: `ampHex` (Standard), `amp`, `minimessage` oder `bungeeHex`. |
tabField | string | nein | `tab-prefix`: `tabprefix` (Standard) oder `tagprefix`. |
tabFormat | string | nein | `tab-prefix`: `tabGradient` (Standard), `ampHex` oder `minimessage`. |
era | string | nein | Syntax-Ära (`legacy`, `json`, `jsonHex`, `components`, `snbt`), nur bei unbekannter Serverversion verwendet. |
spans | object[] | nein | Abschnitte `{ text, color: "#rrggbb" | null, bold?, italic?, underlined?, strikethrough?, obfuscated? }`, höchstens 200. Entweder `spans` oder `doc` senden. |
doc | object | nein | `{ 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
- 400
INVALIDUngültiger Anfrageinhalt. - 400
TARGETUngültiger Spieler oder Gruppe. - 400
PRIORITYDie Priorität muss eine Ganzzahl 0–1000 sein. - 400
EMPTYDer Text ist leer. - 400
TOO_LONGDer Text ist zu lang (Nick höchstens 64 Zeichen, sonst 256). - 400
TOO_MANY_PARTSDer Text hat zu viele farbige Abschnitte. - 409
JOBAuf dem Server läuft eine Änderung (Job). - 409 Der Server läuft nicht.
- 429
RATE_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
- 412
NO_PANELDer 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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
action | string | ja | `export`, `switch`, `delete` oder `reset`. |
world | string | nein | `export`, `switch`, `delete`: Weltname aus der Liste (1–64 Zeichen). |
old | string | nein | `reset` (Pflicht): `delete` alte Welt löschen, `keep` als gespeicherte behalten. |
keepAs | string | nein | `reset` mit `keep`: neuer Name der alten Welt (1–32 Zeichen A–Z, a–z, 0–9, _ und -). |
seed | string | nein | `reset`: Seed der neuen Welt (höchstens 128 Zeichen), leer = zufällig. |
levelType | string | nein | `reset`: `normal` (Standard), `flat`, `large_biomes` oder `amplified`. |
structures | boolean | nein | `reset`: Bauwerke generieren, Standard `true`. |
confirmNoBackup | boolean | nein | `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
- 400
INVALIDUngültiger Anfrageinhalt. - 400
BAD_NAMEUngültiger Weltname. - 400
RESERVED_NAMEDer Name gehört zu einem Serverordner. - 400
BAD_SEEDUngültiger Seed. - 403
FORBIDDENDie Berechtigung Stromversorgung fehlt. - 404
NO_SUCH_WORLDDie Welt ist nicht auf dem Server. - 409
ACTIVE_WORLDDie Welt ist gerade aktiv. - 409
NAME_TAKENEin Ordner mit diesem Namen existiert bereits. - 409
TOO_MANY_WORLDSEin Server kann höchstens 5 Welten haben. - 409
NEEDS_CONFIRMDie alte Welt würde ohne Backup gelöscht, `confirmNoBackup: true` senden. - 409
JOB_RUNNINGAuf dem Server läuft bereits eine andere Änderung. - 409
EXPORT_RUNNINGEin Welt-Download wird bereits vorbereitet. - 409
DISKZu wenig Speicherplatz auf dem Server. - 409
STATEDer Server startet oder stoppt gerade. - 429
RATE_LIMITEDÄnderungslimit überschritten, bitte später erneut versuchen. - 412
NO_PANELDer 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
id | string | ja | Download-`id` aus `exports` (10 Hex-Zeichen). |
format | string | nein | `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
- 400
INVALID`id` fehlt oder ist ungültig. - 404
EXPORT_GONEDer Download ist nicht mehr vorbereitet, erneut vorbereiten. - 429
DOWNLOAD_BUSYEin Download läuft bereits. - 429
RATE_LIMITEDZu viele Downloads. - 412
NO_PANELDer 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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
locale | string | nein | Sprache der Fehlermeldungen: cs, en, sk, pl oder de. Standard ist cs. |
Beispielinhalt
{
"locale": "cs"
}Beispielantwort
{
"ok": true
}Mögliche Fehler
- 400
invalidDer 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.
- 409
inactiveDie Domain ist noch nicht aktiv. - 429 Limit von 3 Anfragen pro Stunde überschritten.
- 503
unavailableDas Senden ist vorübergehend nicht möglich. Versuchen Sie es später erneut. - 422
failedDer 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
service | string | ja | ID Ihres aktiven VPS oder Gameservers (Minecraft, FiveM). Geteilte Dienste gehen nicht. |
host | string | ja | Name in der Domain: @ für die Domain selbst oder eine Subdomain (Buchstaben, Ziffern, Bindestriche, ohne * und _). |
locale | string | nein | Sprache 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.
- 409
inactiveDie Domain ist noch nicht aktiv. - 400
hostUngültiger Name: @ für die Domain selbst oder eine Subdomain aus Buchstaben, Ziffern und Bindestrichen. - 404
serviceDer Dienst existiert nicht, gehört Ihnen nicht, ist nicht aktiv oder kann nicht verbunden werden. - 409
no_addressDer Dienst hat keine öffentliche Adresse, auf die die Domain zeigen könnte. - 503
unavailableDie 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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
serviceId | string | ja | ID Ihres aktiven VPS oder Gameservers, wie bei GET. |
host | string | ja | Name in der Domain, wie bei GET (@ oder Subdomain). |
planHash | string | ja | Fingerabdruck des Plans aus GET (24 Hex-Zeichen). Hat sich die Zone inzwischen geändert, kommt 409 changed mit einem neuen Plan. |
confirm | boolean | nein | Bestätigt, dass die bestehenden Einträge aus replace ersetzt werden. Pflicht, wenn replace nicht leer ist. |
locale | string | nein | Sprache 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
- 400
invalidEin 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.
- 409
inactiveDie Domain ist noch nicht aktiv. - 400
hostUngültiger Name: @ für die Domain selbst oder eine Subdomain aus Buchstaben, Ziffern und Bindestrichen. - 404
serviceDer Dienst existiert nicht, gehört Ihnen nicht, ist nicht aktiv oder kann nicht verbunden werden. - 409
no_addressDer Dienst hat keine öffentliche Adresse, auf die die Domain zeigen könnte. - 503
unavailableDie Adresse des Dienstes oder der DNS-Status kann gerade nicht ermittelt werden. - 409
manualDie Domain nutzt nicht unser DNS. Richten Sie die Einträge bei Ihrem DNS-Anbieter ein. - 409
changedDie Zone hat sich seit GET geändert. Die Antwort enthält den neuen Plan im Feld plan. - 409
confirmDer Plan ersetzt bestehende Einträge und confirm: true fehlt. Die Antwort enthält den Plan im Feld plan. - 409
limitDie 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
locale | string | nein | Sprache 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.
- 409
inactiveDie Domain ist noch nicht aktiv. - 409
no_zoneDie Domain hat keine Zone auf unserem DNS. Legen Sie sie über domain/zone an oder stellen Sie die Nameserver auf unsere um. - 503
unavailableDer DNS-Server antwortet gerade nicht. Versuchen Sie es später erneut. - 422
failedDie Ä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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
record | object | ja | Der neue Eintrag. |
record.type | string | ja | Eintragstyp: A, AAAA, CNAME, MX, TXT, SRV oder CAA. |
record.host | string | nein | Name: @ oder leer für die Domain selbst, ein relativer Name (www, _dmarc, *.dev) oder ein voller Name, der auf die Domain endet. |
record.ttl | string | nein | TTL in Sekunden als Text, 60 bis 86400. Leer bedeutet 3600. |
record.address | string | nein | A: IPv4-Adresse, AAAA: IPv6-Adresse. |
record.target | string | nein | CNAME 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.preference | string | nein | MX: Priorität 0 bis 65535 als Text. |
record.exchange | string | nein | MX: Name des Mailservers (keine IP-Adresse). |
record.text | string | nein | TXT: Text bis 2000 Zeichen ohne Steuerzeichen. |
record.priority | string | nein | SRV: Priorität 0 bis 65535 als Text. Der SRV-Name muss die Form _dienst._protokoll haben (tcp, udp, tls, sctp). |
record.weight | string | nein | SRV: Gewichtung 0 bis 65535 als Text. |
record.port | string | nein | SRV: Port 0 bis 65535 als Text. |
record.flags | string | nein | CAA: Flag 0 oder 128 als Text. |
record.tag | string | nein | CAA: issue, issuewild oder iodef. |
record.value | string | nein | CAA: bei issue und issuewild die Domain der Zertifizierungsstelle, bei iodef eine mailto:- oder https:-Adresse. |
locale | string | nein | Sprache 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.
- 409
inactiveDie Domain ist noch nicht aktiv. - 409
no_zoneDie Domain hat keine Zone auf unserem DNS. Legen Sie sie über domain/zone an oder stellen Sie die Nameserver auf unsere um. - 503
unavailableDer DNS-Server antwortet gerade nicht. Versuchen Sie es später erneut. - 422
failedDie Ä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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
id | string | ja | ID des Eintrags aus der Liste (20 Hex-Zeichen). |
record | object | ja | Zu ändernde Felder (wie beim Hinzufügen, ohne type). |
record.host | string | nein | Name: @ oder leer für die Domain selbst, ein relativer Name (www, _dmarc, *.dev) oder ein voller Name, der auf die Domain endet. |
record.ttl | string | nein | TTL in Sekunden als Text, 60 bis 86400. Leer bedeutet 3600. |
record.address | string | nein | A: IPv4-Adresse, AAAA: IPv6-Adresse. |
record.target | string | nein | CNAME 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.preference | string | nein | MX: Priorität 0 bis 65535 als Text. |
record.exchange | string | nein | MX: Name des Mailservers (keine IP-Adresse). |
record.text | string | nein | TXT: Text bis 2000 Zeichen ohne Steuerzeichen. |
record.priority | string | nein | SRV: Priorität 0 bis 65535 als Text. Der SRV-Name muss die Form _dienst._protokoll haben (tcp, udp, tls, sctp). |
record.weight | string | nein | SRV: Gewichtung 0 bis 65535 als Text. |
record.port | string | nein | SRV: Port 0 bis 65535 als Text. |
record.flags | string | nein | CAA: Flag 0 oder 128 als Text. |
record.tag | string | nein | CAA: issue, issuewild oder iodef. |
record.value | string | nein | CAA: bei issue und issuewild die Domain der Zertifizierungsstelle, bei iodef eine mailto:- oder https:-Adresse. |
locale | string | nein | Sprache 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.
- 404
not_foundIn 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.
- 409
inactiveDie Domain ist noch nicht aktiv. - 409
no_zoneDie Domain hat keine Zone auf unserem DNS. Legen Sie sie über domain/zone an oder stellen Sie die Nameserver auf unsere um. - 503
unavailableDer DNS-Server antwortet gerade nicht. Versuchen Sie es später erneut. - 422
failedDie Ä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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
id | string | ja | ID des Eintrags aus der Liste (20 Hex-Zeichen). |
locale | string | nein | Sprache 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
- 400
invalidDie id fehlt oder hat ein falsches Format. - 404
not_foundIn 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.
- 409
inactiveDie Domain ist noch nicht aktiv. - 409
no_zoneDie Domain hat keine Zone auf unserem DNS. Legen Sie sie über domain/zone an oder stellen Sie die Nameserver auf unsere um. - 503
unavailableDer DNS-Server antwortet gerade nicht. Versuchen Sie es später erneut. - 422
failedDie Ä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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
mode | string | ja | ours, custom oder wedos. |
nameservers | array | nein | Nur bei custom: 2 bis 6 Server in der Form { name, ipv4?, ipv6? }. |
nameservers[].name | string | ja | Name des Servers, z. B. ns1.example.net. |
nameservers[].ipv4 | string | nein | IPv4-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[].ipv6 | string | nein | IPv6-Adresse, es gilt dasselbe wie bei ipv4. |
locale | string | nein | Sprache 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
- 400
invalidUngültiger Anfragetext (z. B. unbekannter mode). - 400
ns_countBei custom sind 2 bis 6 verschiedene Server nötig. - 400
ns_nameUngültiger Servername. Das Feld index sagt, welcher. - 400
ns_glueEin Server innerhalb der Domain braucht eine IPv4- oder IPv6-Adresse. - 400
ns_ipUngültige IP-Adresse des Servers. - 400
ns_oursDie 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.
- 409
inactiveDie Domain ist noch nicht aktiv. - 429 Limit von 10 Änderungen pro 10 Minuten überschritten.
- 503
unavailableRegistry oder DNS-Server ist gerade nicht erreichbar. Versuchen Sie es später erneut. - 422
failedDie 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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
locale | string | nein | Sprache der Fehlermeldungen: cs, en, sk, pl oder de. Standard ist cs. |
Beispielinhalt
{
"locale": "cs"
}Beispielantwort
{
"ok": true
}Mögliche Fehler
- 400
invalidDer 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.
- 409
inactiveDie Domain ist noch nicht aktiv. - 429 Limit von 10 Anfragen pro 10 Minuten überschritten.
- 503
not_readyDas DNS für Domains ist gerade nicht bereit. Versuchen Sie es später erneut. - 422
failedDie 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
page | integer | nein | Seite des Verlaufs ab 1. Standard ist 1. |
locale | string | nein | Sprache 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
- 429
rate_limitedLimit 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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
invoiceId | string | ja | ID der offenen Rechnung. |
expectedAmountCzk | number | ja | Der erwartete Rechnungsbetrag in CZK. Er muss genau dem Bestellpreis entsprechen, sonst kommt 409 amount_changed mit dem aktuellen Betrag. |
ackOpenGateway | boolean | nein | Bestätigt, dass Sie mit Guthaben zahlen wollen, obwohl für die Rechnung eine Zahlung im Zahlungsgateway offen ist. Standard ist false. |
locale | string | nein | Sprache 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
- 400
invalidEin Pflichtfeld fehlt oder hat ein falsches Format. - 403
lockedDas Konto ist vorübergehend gesperrt. - 404
invoice_not_foundDie Rechnung existiert nicht oder gehört Ihnen nicht. - 409
insufficientDas Guthaben reicht nicht. Die Antwort enthält balanceCzk und neededCzk. - 409
amount_changedDer Betrag hat sich geändert. Der aktuelle steht in amountCzk. - 409
closedDie Rechnung ist bereits bezahlt oder storniert. - 409
expiredDie Proformarechnung ist nach Fälligkeit verfallen. - 409
upgrade_expiredDas Upgrade-Angebot galt nur bis zum Ende des Abrechnungszeitraums und wurde storniert. - 409
gateway_openFür die Rechnung ist eine Zahlung im Zahlungsgateway offen. Senden Sie ackOpenGateway: true. - 409
payment_in_progressEine Zahlung im Gateway läuft gerade. - 409
paid_unreconciledEine Zahlung ist bereits eingegangen, aber noch nicht zugeordnet. - 409
topup_not_payableEine Rechnung für eine Guthabenaufladung kann nicht mit Guthaben bezahlt werden. - 409
not_payableDie Rechnung gehört zu keiner bezahlbaren Bestellung. - 409
capacityFür den bestellten Dienst ist gerade keine Kapazität frei. - 409
billing_profile_incompleteDie Rechnungsdaten des Kontos fehlen. Die Antwort enthält settingsUrl. - 409
foreign_eu_vatBestellungen von Unternehmen aus anderen EU-Ländern werden derzeit individuell bearbeitet. - 429
rate_limitedLimit von 10 Versuchen pro Minute überschritten. - 503
unavailableDas Guthaben ist gerade nicht verfügbar. - 503
gateway_check_failedDer Zahlungsstatus im Gateway kann gerade nicht geprüft werden. Versuchen Sie es später erneut. - 503
capacity_busyDie 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
status | string | nein | Filter nach Status: PENDING, PAID, CANCELLED oder REFUNDED. Andere Werte werden ignoriert. |
limit | integer | nein | Anzahl 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
lang | string | nein | en ergibt einen englischen Dateinamen, sonst einen tschechischen. |
Beispielantwort
application/pdf (Content-Disposition: attachment; filename="faktura-2026-0042.pdf")Mögliche Fehler
- 404
not_foundDie Rechnung existiert nicht, gehört Ihnen nicht oder ist nicht bezahlt. - 409
preparingDie Rechnung wird noch ausgestellt. Versuchen Sie es später erneut. - 429
rate_limitedLimit von 20 Downloads pro Minute überschritten. - 503
not_readyDas PDF wird gerade vorbereitet. Versuchen Sie es in ein paar Sekunden erneut (Header Retry-After). - 503
unavailableDas 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
lang | string | nein | Sprache 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
- 404
not_foundRechnung oder Dienst existiert nicht, gehört Ihnen nicht oder Sie sind nicht der Inhaber. Die Antwort ist immer gleich. - 429
rate_limitedLimit von 20 Downloads pro Minute überschritten. - 503
not_readyDas PDF wird gerade vorbereitet. Versuchen Sie es in ein paar Sekunden erneut (Header Retry-After). - 503
unavailableDas 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
view | string | nein | restart = gibt nur { restartPending } zurück (ob der Server nach dem Paketwechsel auf einen Neustart wartet); funktioniert auch für Mitglieder. |
locale | string | nein | Sprache 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.
- 409
unavailableDer 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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
action | string | nein | order (Standard), cancelPending (unbezahlte Bestellung stornieren), scheduleDowngrade (kleineres Paket ab dem nächsten Zeitraum) oder cancelScheduled (geplante Änderung stornieren). |
packageId | string | null | nein | order, scheduleDowngrade: ID des Zielpakets aus GET (packages, lowerPackages). Ohne bleibt das aktuelle Paket. |
backups | integer | nein | order, scheduleDowngrade: Anzahl der Backup-Zusätze, 0 oder 1. |
immediateStartRequested | boolean | nein | order: Verbraucher verlangt die sofortige Ausführung (AGB Art. 9.8). Ohne Firmennummer muss es true sein. |
businessPurpose | boolean | nein | order: Erklärung, dass die Bestellung geschäftlichen Zwecken dient. |
expectedChargeCzk | number | null | nein | order: der angezeigte Aufpreis. Weicht er ab, kommt 409 price_changed und es wird nichts angelegt. |
expectedMonthlyCzk | number | null | nein | order, scheduleDowngrade: der angezeigte neue Monatspreis. Weicht er ab, kommt 409 price_changed. |
changeId | string | nein | cancelScheduled: ID der geplanten Änderung (scheduled.id aus GET); passt sie nicht, kommt 409 changed. |
locale | string | nein | Sprache 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.
- 400
immediate_start_requiredEin Verbraucher muss immediateStartRequested: true senden. - 403 Nur für den Besitzer des Dienstes.
- 404
nonecancelScheduled: es gibt keine geplante Änderung. - 409
billing_profile_incompleteDie Rechnungsdaten des Kontos sind unvollständig. - 409
pending_orderEs gibt bereits eine unbezahlte Upgrade-Bestellung (orderId in der Antwort). - 409
upgrade_in_progressEin bezahltes Upgrade wird noch ausgeführt. - 409
price_changedDer Preis hat sich geändert; die Antwort enthält newChargeCzk und newMonthlyCzk. - 409
capacityDas größere Paket passt nicht auf den Server. - 409
does_not_fitscheduleDowngrade: die Daten passen nicht in das kleinere Paket (Gründe in reasons). - 409
transfer_pendingDer Dienst wartet auf eine Übertragung. - 409
refund_openFür den Dienst läuft ein Widerruf oder eine Erstattung. - 409
renewal_paidDer nächste Zeitraum ist zum Preis des geplanten kleineren Pakets bezahlt. - 409
change_applyingDas kleinere Paket wird gerade eingerichtet. - 409
too_latecancelScheduled: die Änderung gilt bereits. - 503
price_list_unavailableDie 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
locale | string | nein | en 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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
action | string | nein | order (Standard) oder cancelPending. |
ramGb | number | nein | Neuer RAM in GB (1–32); vCPU ergibt sich aus dem RAM. Fehlt = unverändert. |
diskGb | number | nein | Festplatte in GB (20–500), nur nach oben. |
ipv4 | number | nein | Anzahl der IPv4-Adressen (1–5). |
cores | number | nein | vCPU (1–16); bei RAM-basiertem Preis wird es berechnet. |
locale | string | nein | Sprache der Meldungen und der Bestellbeschreibung: cs, en, sk, pl oder de. |
immediateStartRequested | boolean | nein | Verbraucher: true = Antrag auf sofortige Ausführung; ohne ihn entsteht keine Bestellung. |
businessPurpose | boolean | nein | Konto mit Firmennummer: true = Erklärung des gewerblichen Zwecks (dann ist sofortige Ausführung nicht nötig). |
expectedChargeCzk | number | nein | Angezeigter Betrag; weicht er ab = 409 price_changed. |
expectedMonthlyCzk | number | nein | Angezeigter 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
- 400
immediate_start_requiredAntrag auf sofortige Ausführung fehlt. Ohne Code: ungültige Werte (Feld field) oder nichts erhöht. - 409
pending_orderEs 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. - 409
price_changedDer Preis hat sich geändert; neue Werte in newChargeCzk und newMonthlyCzk, nichts wurde angelegt. - 503
capacity_unknownFreie 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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
locale | string | nein | en 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).
- 404
not_foundDienst 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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
action | string | ja | Immer pay. |
locale | string | nein | Sprache 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
- 400
invalidUngültiger Body. - 409
not_allowedVerlängern ist gerade nicht möglich. Weitere Codes: not_managed, terminated, term_end, payment_started, failed. - 429
rate_limitedMehr als 20 Anfragen pro Stunde. - 503
failedDie 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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
autoCredit | boolean | nein | Verlängerung automatisch aus dem Guthaben zahlen. |
autoCard | boolean | nein | Verlängerung automatisch mit der gespeicherten Karte zahlen. |
endAtTermEnd | boolean | nein | true = Kündigung zum Ende des bezahlten Zeitraums, false = Kündigung zurückziehen. |
locale | string | nein | Sprache 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
- 400
invalidUngültiger Body (andere als erlaubte Felder). - 404
not_allowedDer Dienst gehört nicht zu Ihrem Konto. - 409
not_managedFü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
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
locale | string | nein | en 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
- 409
coming_soonEin 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)
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
action | string | nein | order (Standard) oder cancelPending. |
tier | string | ja | Für order: business oder pro (nur höher als der aktuelle). |
locale | string | nein | Sprache der Meldungen und der Bestellbeschreibung: cs, en, sk, pl oder de. |
immediateStartRequested | boolean | nein | Verbraucher: true = Antrag auf sofortige Ausführung; ohne ihn entsteht keine Bestellung. |
businessPurpose | boolean | nein | Konto mit Firmennummer: true = Erklärung des gewerblichen Zwecks. |
expectedChargeCzk | number | nein | Angezeigter Betrag; weicht er ab = 409 price_changed. |
expectedMonthlyCzk | number | nein | Angezeigter 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
- 409
coming_soonEin Tarifwechsel kann noch nicht online bestellt werden. Weitere Codes: price_changed, pending_order, billing_profile_incomplete, unavailable, unknown_current. - 400
downgradeEin niedrigerer oder gleicher Tarif ist nicht möglich. Weitere Codes: unknown_tier, immediate_start_required. - 503
price_list_unavailableDie 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)