EntwicklerREST-API

REST-API-Referenz

Basis-URL: https://panel.hostwolf.net/api/client

Authentifizierung: sende Authorization: Bearer ptlc_... und Accept: application/json. Schlüssel erstellst du unter Konto → API-Schlüssel. Ein Schlüssel lässt sich auf bestimmte Adressen beschränken; siehe IP-Freigabeliste.

Die API ist mit der Pterodactyl-Client-API kompatibel, bestehende Pterodactyl-Tools und -Bibliotheken funktionieren also damit. Hostwolf-eigene Endpunkte sind markiert mit HW.

Konventionen#

Antworten. Einzelne Objekte kommen verpackt als {"object": "server", "attributes": {...}}. Listen kommen als {"object": "list", "data": [...], "meta": {...}}. Hostwolf-eigene Endpunkte liefern einfaches JSON.

Paginierung. Paginierte Listen akzeptieren ?page= und ?per_page= (max. 100 für Server, 50 für Backups) und liefern meta.pagination mit total, count, per_page, current_page und total_pages.

Fehler.

{
  "errors": [
    { "code": "ValidationException", "status": "422", "detail": "The name field is required." }
  ]
}

Manche Hostwolf-Endpunkte liefern stattdessen {"error": "...", "code": "..."}, z. B. 409 downgrade_requires_reset beim Wechsel eines Spiels auf eine ältere Version oder 422 unknown_version für eine Version, die es nicht gibt.

Statuscodes:

  • 204: erfolgreich, ohne Inhalt.
  • 401: Schlüssel fehlt, ist falsch oder widerrufen.
  • 403: fehlende Berechtigung (Subuser), ein gesperrter Server oder eine Anfrage von einer Adresse außerhalb der IP-Freigabeliste des Schlüssels.
  • 404: nicht gefunden.
  • 409: der Server ist beschäftigt (Installation, Wiederherstellung oder Umzug).
  • 422: Validierungsfehler.
  • 429: Ratenlimit erreicht. Retry-After gibt die Wartezeit in Sekunden an; siehe Limits.
  • 502: der Node des Servers ist nicht erreichbar oder der Server muss laufen.

Server-IDs. {server} ist der identifier des Servers, die 8 Zeichen in seiner Panel-URL. Die vollständige UUID funktioniert auch.

Konto#

MethodePfadInhalt / QueryHinweise
GET/page, per_page, filter[*], typeDeine Server (paginiert)
GET/permissionsAlle Berechtigungsschlüssel für Subuser
GET/accountDein Konto
PUT/account/emailemail, password
PUT/account/passwordcurrent_password, password, password_confirmation
PUT/account/profile HWfirst_name, last_nameAnzeigename
PUT/account/language HWlanguage: en-GB en-US de fr es fi; optional currency (auto, USD, EUR…)Panel-Sprache und Währung der Preise
POST DELETE/account/avatar HWimage: Data-URL (PNG/JPEG/WebP, max. 512 KB)avatar_url in /account ist danach ein Pfad auf dem Panel
GET/account/activitypage, filter[event], sortPaginiert
GET PUT/account/notifications HWemail_enabled, email_address, discord_enabled, discord_webhook, notify_deployKontoweite Benachrichtigungen
POST/account/notifications/test HWSendet einen Test an jeden aktivierten Kanal; results ist leer, wenn keiner aktiv ist
GET PUT/account/curseforge HWkey (null löscht ihn)Dein eigener CurseForge-API-Schlüssel
GET PUT/account/factorio HWusername, tokenZugangsdaten für das Factorio-Mod-Portal
GET/account/api-keys
POST/account/api-keysdescription, allowed_ips[] (IPs oder CIDR-Bereiche, max. 50)Der Schlüssel ist attributes.identifier, gefolgt von meta.secret_token; wird nur einmal angezeigt
DELETE/account/api-keys/{identifier}
GET/account/ssh-keysFür SFTP
POST/account/ssh-keysname, public_key
POST/account/ssh-keys/removefingerprint

Server#

MethodePfadInhalt / QueryHinweise
GET/servers/{server}include=egg,subusersDetails, Zuweisungen, Startvariablen, region HW
GET/servers/{server}/resourcescurrent_state, CPU, Arbeitsspeicher, Speicherplatz, Netzwerk, Laufzeit
GET/servers/{server}/activitypage, filter[event]Paginiert
POST/servers/{server}/powersignal: start stop restart kill204
POST/servers/{server}/commandcommandServer muss laufen
GET/servers/{server}/websocketKonsolen-Token, siehe Konsole
POST/servers/{server}/settings/renamename, description
POST/servers/{server}/settings/reinstallFührt das Installationsskript erneut aus
PUT/servers/{server}/settings/docker-imagedocker_imageEines der Images des Eggs
GET/servers/{server}/startupVariablen, plus meta.startup_command und meta.docker_images
PUT/servers/{server}/startup/variablekey, valuekey ist der Name der Umgebungsvariable, z. B. MINECRAFT_VERSION

Dateien#

Alle Pfade sind relativ zum Serververzeichnis. root ist das Verzeichnis, in dem die files-Einträge liegen.

MethodePfadInhalt / QueryHinweise
GET/servers/{server}/files/listdirectory
GET/servers/{server}/files/contentsfileRohtext. Eine fehlende Datei liefert 500 vom Node; das SDK meldet sie als 404
POST/servers/{server}/files/write?file=; Rohtext als InhaltErstellt oder überschreibt
GET/servers/{server}/files/downloadfileattributes.url: signierte Einmal-URL
GET/servers/{server}/files/uploadSignierte URL: POST multipart files an url&directory=/path
PUT/servers/{server}/files/renameroot, files[]: {from, to}Verschiebt auch
POST/servers/{server}/files/copylocation
POST/servers/{server}/files/deleteroot, files[]
POST/servers/{server}/files/create-folderroot, name
POST/servers/{server}/files/compressroot, files[]Liefert das Archiv
POST/servers/{server}/files/decompressroot, file
POST/servers/{server}/files/chmodroot, files[]: {file, mode}
POST/servers/{server}/files/pullurl, directory, filename, use_header, foregroundServer lädt eine URL herunter

Backups#

SDK: hw.backups · MCP: create_backup, restore_backup, list_backups · Limit: 2 Backups pro 10 Minuten.

MethodePfadInhalt / QueryHinweise
GET/servers/{server}/backupspage, per_pagePaginiert
POST/servers/{server}/backupsname, ignored, is_lockedLäuft im Hintergrund
GET/servers/{server}/backups/{uuid}completed_at ist gesetzt, sobald es fertig ist
GET/servers/{server}/backups/{uuid}/downloadSignierte URL
POST/servers/{server}/backups/{uuid}/lockSperre umschalten
POST/servers/{server}/backups/{uuid}/restoretruncatetruncate: true löscht vorher alle Dateien
DELETE/servers/{server}/backups/{uuid}
GET PUT/servers/{server}/hostwolf/smart-backups HWenabledAutomatische Backups vor riskanten Änderungen

Spiel, Spieler und Diagnose HW#

MethodePfadInhalt / QueryHinweise
GET/servers/{server}/game/versionssupported, current, versions
POST/servers/{server}/game/versionversion, reset_world, forceWechselt und installiert neu. 409 downgrade_requires_reset bei älteren Versionen, 422 unknown_version bei Versionen, die nicht in /game/versions stehen
GET/servers/{server}/hostwolf/game-settingsVerständliche Einstellungen, nach Konfigurationsdatei gruppiert. supported: false bei Spielen ohne sie, etwa Java-Minecraft (bearbeite dort server.properties)
PUT/servers/{server}/hostwolf/game-settingsvalues: {id: "value"}, restartBool-Werte sind "true" / "false"
GET/servers/{server}/hostwolf/diagnostics„Fix my server“-Prüfungen mit Schweregrad
GET/servers/{server}/playersAnzahl online, Maximum, Namen (Minecraft)
GET/servers/{server}/hostwolf/playersLive-Spielerliste über RCON/Query und unterstützte Aktionen
POST/servers/{server}/hostwolf/players/{action}player: {name, steamid, id}, messageaction: kick ban unban broadcast

Mods, Plugins und Modpacks HW#

MethodePfadInhalt / QueryHinweise
GET/servers/{server}/addonsUnterstützte Quellen, Installationsverzeichnis, Frameworks, Workshop-Modus
GET/servers/{server}/addons/searchsource, q, pageQuellen hängen vom Spiel ab: modrinth, curseforge, hangar, spigot, umod, thunderstore…
GET/servers/{server}/addons/versionssource, projectMarkiert kompatible Versionen
POST/servers/{server}/addons/installsource, project, versionversion weglassen für die neueste kompatible
GET/servers/{server}/addons/installedupdates=1Installierte Addons mit verfügbaren Updates, plus manuelle Dateien
DELETE/servers/{server}/addons/installed/{id}
POST/servers/{server}/addons/manual/deletefileEine manuell hinzugefügte Datei entfernen
POST/servers/{server}/addons/uploadmultipart filez. B. ein Plugin als .jar
POST/servers/{server}/addons/featuredprojectEmpfohlene Addons mit einem Klick
PUT/servers/{server}/addons/frameworkframeworkz. B. Oxide/Carbon, BepInEx
POST/servers/{server}/addons/cs2repairCS2: Metamod + CounterStrikeSharp
GET PUT/servers/{server}/addons/workshopitems[]Steam-Workshop-Inhalte oder -Kollektion
GET/servers/{server}/addons/modpacksAktuelles Modpack und Ergebnis des letzten Starts
GET/servers/{server}/addons/modpacks/searchq, page, category, sourcesource: modrinth oder curseforge
GET/servers/{server}/addons/modpacks/versionsproject, source
POST/servers/{server}/addons/modpacksproject, version, fresh_world, sourceErsetzt Mods und Loader. 404, wenn das Projekt oder die Version nicht existiert
DELETE/servers/{server}/addons/modpacks

Zeitpläne#

MethodePfadInhalt / QueryHinweise
GET/servers/{server}/schedulesEnthält die Aufgaben
POST/servers/{server}/schedulesname, minute, hour, day_of_month, month, day_of_week, is_active, only_when_onlineCron-Felder, UTC
GET POST DELETE/servers/{server}/schedules/{id}wie beim ErstellenPOST aktualisiert
POST/servers/{server}/schedules/{id}/executeJetzt ausführen
POST/servers/{server}/schedules/{id}/tasksaction (command power backup), payload, time_offset, continue_on_failure
POST DELETE/servers/{server}/schedules/{id}/tasks/{task}wie beim ErstellenPOST aktualisiert

Netzwerk, Datenbanken und Subuser#

MethodePfadInhalt / QueryHinweise
GET/servers/{server}/network/allocationsPorts
POST/servers/{server}/network/allocationsWeiteren Port automatisch zuweisen (sofern der Tarif es erlaubt)
POST/servers/{server}/network/allocations/{id}notes
POST/servers/{server}/network/allocations/{id}/primary
DELETE/servers/{server}/network/allocations/{id}
GET/servers/{server}/databasesinclude=passwordAußerdem on_node, remote_ips, remote_anywhere, remote_address
GET/servers/{server}/databases/service HWstatus (none provisioning ready unreachable failed), local_address, public_address, other_servers
POST/servers/{server}/databasesdatabase, remote_ips[], remote_anywhere202 mit dem Dienststatus, während die erste Datenbank startet (siehe unten)
POST/servers/{server}/databases/{id}/rotate-password
POST/servers/{server}/databases/{id}/remote HWremote_ips[] (öffentliche IPv4, max. 10), remote_anywhereErsetzt die Liste; [] schließt den Zugriff von außen
GET/servers/{server}/databases/{id}/export HW.sql.gz-Download. 6 pro Minute
POST/servers/{server}/databases/{id}/import HWfile (multipart, .sql oder .sql.gz, max. 50 MB)204. 6 pro Minute
DELETE/servers/{server}/databases/{id}
GET/servers/{server}/usersSubuser
POST/servers/{server}/userspublic_id, permissions[]Fügt ein bestehendes Hostwolf-Konto über seine öffentliche ID hinzu (HW-XXXXXX, auf dessen Kontoseite)
GET POST DELETE/servers/{server}/users/{uuid}permissions[]POST aktualisiert

Datenbanken laufen auf dem eigenen Rechner des Servers. Das erste POST /databases auf einem Server startet den Datenbankdienst, was etwa 40 Sekunden dauert, und antwortet statt mit der Datenbank mit 202 Accepted und dem Dienststatus ({"object": "hostwolf_database_service", "attributes": {"status": "provisioning", …}}). Frage GET /databases ab, bis sie erscheint, oder nutze databases.create(id, name, { wait: true }). Weitere Datenbanken werden sofort angelegt (200). Gameserver verbinden sich mit host.address (172.18.0.1:3306); remote_address funktioniert nur von den remote_ips, die du erlaubst, oder von überall mit remote_anywhere. Siehe die Datenbank-Anleitung.

Server-Extras HW#

MethodePfadInhalt / QueryHinweise
GET PUT/servers/{server}/hostwolf/notificationswebhook_url, clear_webhook, eventsDiscord-Benachrichtigungen: gestartet, gestoppt, abgestürzt, Backups, Spieler
POST/servers/{server}/hostwolf/notifications/test
GET/servers/{server}/hostwolf/domainEigene Domain und die nötigen DNS-Einträge
POST/servers/{server}/hostwolf/domain/checkhostnamePrüft das aktuelle DNS
PUT DELETE/servers/{server}/hostwolf/domainhostname
GET/servers/{server}/hostwolf/networkAuf einem Velocity/BungeeCord-Proxy: seine Einträge und die Server, die du verbinden kannst
POST/servers/{server}/hostwolf/network/linkservers[]: {id, key}, lobby, restart
POST/servers/{server}/hostwolf/network/unlinkid, restart
POST/servers/{server}/hostwolf/network/fabric-proxyidInstalliert FabricProxy-Lite auf einem Fabric-Backend

Tarife und Bestellungen HW#

SDK: hw.store · MCP: get_plans_and_prices, list_orders · Preise zum Lesen: Preise

Nur lesend. Bestellung, Kündigung und Zahlung laufen über das Panel.

MethodePfadHinweise
GET/store/catalogSpiele, Tarifgrößen, Regionen und aktuelle Preise je Region
GET/store/ordersOffene, aktive und kürzlich fehlgeschlagene Bestellungen
GET/store/billingAlle Bestellungen mit Preis, Verlängerung, Kündigung und Erstattungsstatus

Konsole#

Die Live-Konsole ist ein Websocket auf dem Node, auf dem dein Server läuft.

  1. GET /servers/{server}/websocket liefert {"data": {"token": "...", "socket": "wss://..."}}.
  2. Verbinde dich mit socket und einem Header Origin: https://panel.hostwolf.net.
  3. Sende {"event": "auth", "args": ["<token>"]} und warte auf auth success.
  4. Sende {"event": "send logs", "args": [null]}, um die letzten Ausgaben erneut zu erhalten.

Nachrichten sind JSON in der Form {"event": "...", "args": [...]}.

Events, die du empfängst:

  • console output
  • status
  • stats (ein JSON-String)
  • install output
  • daemon message und daemon error
  • token expiring: neues Token holen und auth erneut senden.
  • token expired

Events, die du senden kannst:

  • send command mit dem Befehlstext.
  • set state mit start, stop, restart oder kill.
  • send logs
  • send stats

Das SDK übernimmt das alles: hw.console(id) oder hw.tail(id).

SFTP#

Dateien sind auch per SFTP erreichbar. Verwende die Adresse aus sftp_details von GET /servers/{server} mit dem Benutzernamen <your username>.<server identifier>. Melde dich mit deinem Panel-Passwort oder einem SSH-Schlüssel an, den du unter /account/ssh-keys hinzugefügt hast.

Hängst du fest oder fehlt ein Endpunkt? Schreib uns unter game.hostwolf.net/contact oder support@hostwolf.net.