DéveloppeursAPI REST
Référence de l’API REST
URL de base : https://panel.hostwolf.net/api/client
Authentification : envoyez Authorization: Bearer ptlc_... et Accept: application/json. Créez des clés dans Compte → Clés API. Une clé peut être limitée à certaines adresses ; voir la liste d’adresses IP autorisées.
L’API est compatible avec l’API client de Pterodactyl, donc les outils et bibliothèques Pterodactyl existants fonctionnent avec elle. Les endpoints propres à Hostwolf sont marqués HW.
Conventions#
Réponses. Les objets seuls arrivent enveloppés sous la forme {"object": "server", "attributes": {...}}. Les listes arrivent sous la forme {"object": "list", "data": [...], "meta": {...}}. Les endpoints propres à Hostwolf renvoient du JSON simple.
Pagination. Les listes paginées acceptent ?page= et ?per_page= (100 max. pour les serveurs, 50 pour les sauvegardes) et renvoient meta.pagination avec total, count, per_page, current_page et total_pages.
Erreurs.
{
"errors": [
{ "code": "ValidationException", "status": "422", "detail": "The name field is required." }
]
}
Certains endpoints Hostwolf renvoient plutôt {"error": "...", "code": "..."}, par ex. 409 downgrade_requires_reset lors du passage d’un jeu à une version plus ancienne, ou 422 unknown_version pour une version qui n’existe pas.
Codes de statut :
204: succès, sans contenu.401: clé absente, erronée ou révoquée.403: permission manquante (sous-utilisateurs), serveur suspendu, ou requête venant d’une adresse hors de la liste d’adresses IP autorisées de la clé.404: introuvable.409: le serveur est occupé (installation, restauration ou transfert).422: erreur de validation.429: limite de requêtes atteinte.Retry-Afterindique combien de secondes attendre ; voir les limites.502: le nœud du serveur est injoignable, ou le serveur doit être démarré.
Identifiants de serveur. {server} est l’identifier du serveur, les 8 caractères de son URL dans le panel. L’UUID complet fonctionne aussi.
Compte#
SDK : hw.account · hw.servers.list · Panel : Paramètres du compte
| Méthode | Chemin | Corps / requête | Remarques |
|---|---|---|---|
| GET | / | page, per_page, filter[*], type | Vos serveurs (paginé) |
| GET | /permissions | Toutes les clés de permission des sous-utilisateurs | |
| GET | /account | Votre compte | |
| PUT | /account/email | email, password | |
| PUT | /account/password | current_password, password, password_confirmation | |
| PUT | /account/profile HW | first_name, last_name | Nom affiché |
| PUT | /account/language HW | language : en-GB en-US de fr es fi ; currency en option (auto, USD, EUR…) | Langue du panneau et devise des prix |
| POST DELETE | /account/avatar HW | image : data URL (PNG/JPEG/WebP, 512 Ko max.) | avatar_url dans /account devient alors un chemin sur le panneau |
| GET | /account/activity | page, filter[event], sort | Paginé |
| GET PUT | /account/notifications HW | email_enabled, email_address, discord_enabled, discord_webhook, notify_deploy | Alertes pour tout le compte |
| POST | /account/notifications/test HW | Envoie un test à chaque canal activé ; results est vide si aucun ne l’est | |
| GET PUT | /account/curseforge HW | key (null l’efface) | Votre propre clé API CurseForge |
| GET PUT | /account/factorio HW | username, token | Identifiants du portail de mods Factorio |
| GET | /account/api-keys | ||
| POST | /account/api-keys | description, allowed_ips[] (IP ou plages CIDR, 50 max.) | La clé est attributes.identifier suivi de meta.secret_token, affichée une seule fois |
| DELETE | /account/api-keys/{identifier} | ||
| GET | /account/ssh-keys | Pour le SFTP | |
| POST | /account/ssh-keys | name, public_key | |
| POST | /account/ssh-keys/remove | fingerprint |
Serveurs#
SDK : hw.servers · hw.startup · MCP : list_servers, get_server, power_server, send_command
| Méthode | Chemin | Corps / requête | Remarques |
|---|---|---|---|
| GET | /servers/{server} | include=egg,subusers | Détails, allocations, variables de démarrage, region HW |
| GET | /servers/{server}/resources | current_state, CPU, mémoire, disque, réseau, temps de fonctionnement | |
| GET | /servers/{server}/activity | page, filter[event] | Paginé |
| POST | /servers/{server}/power | signal: start stop restart kill | 204 |
| POST | /servers/{server}/command | command | Le serveur doit être démarré |
| GET | /servers/{server}/websocket | Jeton de console, voir Console | |
| POST | /servers/{server}/settings/rename | name, description | |
| POST | /servers/{server}/settings/reinstall | Relance le script d’installation | |
| PUT | /servers/{server}/settings/docker-image | docker_image | Une des images de l’egg |
| GET | /servers/{server}/startup | Variables, plus meta.startup_command et meta.docker_images | |
| PUT | /servers/{server}/startup/variable | key, value | key est le nom de la variable d’environnement, par ex. MINECRAFT_VERSION |
Fichiers#
SDK : hw.files · MCP : list_files, read_file, write_file, delete_files
Tous les chemins sont relatifs à la racine du serveur. root est le dossier dans lequel se trouvent les entrées de files.
| Méthode | Chemin | Corps / requête | Remarques |
|---|---|---|---|
| GET | /servers/{server}/files/list | directory | |
| GET | /servers/{server}/files/contents | file | Texte brut. Un fichier manquant renvoie 500 depuis le nœud ; le SDK le signale en 404 |
| POST | /servers/{server}/files/write | ?file= ; texte brut comme contenu | Crée ou écrase |
| GET | /servers/{server}/files/download | file | attributes.url : URL signée à usage unique |
| GET | /servers/{server}/files/upload | URL signée : POST multipart files vers url&directory=/path | |
| PUT | /servers/{server}/files/rename | root, files[]: {from, to} | Déplace aussi |
| POST | /servers/{server}/files/copy | location | |
| POST | /servers/{server}/files/delete | root, files[] | |
| POST | /servers/{server}/files/create-folder | root, name | |
| POST | /servers/{server}/files/compress | root, files[] | Renvoie l’archive |
| POST | /servers/{server}/files/decompress | root, file | |
| POST | /servers/{server}/files/chmod | root, files[]: {file, mode} | |
| POST | /servers/{server}/files/pull | url, directory, filename, use_header, foreground | Le serveur télécharge une URL |
Sauvegardes#
SDK : hw.backups · MCP : create_backup, restore_backup, list_backups · Limite : 2 sauvegardes par 10 minutes.
| Méthode | Chemin | Corps / requête | Remarques |
|---|---|---|---|
| GET | /servers/{server}/backups | page, per_page | Paginé |
| POST | /servers/{server}/backups | name, ignored, is_locked | S’exécute en arrière-plan |
| GET | /servers/{server}/backups/{uuid} | completed_at est renseigné une fois terminé | |
| GET | /servers/{server}/backups/{uuid}/download | URL signée | |
| POST | /servers/{server}/backups/{uuid}/lock | Verrouiller / déverrouiller | |
| POST | /servers/{server}/backups/{uuid}/restore | truncate | truncate: true supprime d’abord tous les fichiers |
| DELETE | /servers/{server}/backups/{uuid} | ||
| GET PUT | /servers/{server}/hostwolf/smart-backups HW | enabled | Sauvegardes automatiques avant les changements risqués |
Jeu, joueurs et diagnostic HW#
| Méthode | Chemin | Corps / requête | Remarques |
|---|---|---|---|
| GET | /servers/{server}/game/versions | supported, current, versions | |
| POST | /servers/{server}/game/version | version, reset_world, force | Change de version et réinstalle. 409 downgrade_requires_reset pour les versions plus anciennes, 422 unknown_version pour celles absentes de /game/versions |
| GET | /servers/{server}/hostwolf/game-settings | Paramètres lisibles, regroupés par fichier de configuration. supported: false pour les jeux qui n’en ont pas, comme Minecraft Java (modifiez plutôt server.properties) | |
| PUT | /servers/{server}/hostwolf/game-settings | values: {id: "value"}, restart | Les booléens valent "true" / "false" |
| GET | /servers/{server}/hostwolf/diagnostics | Vérifications « Fix my server » avec niveau de gravité | |
| GET | /servers/{server}/players | Nombre en ligne, maximum, noms (Minecraft) | |
| GET | /servers/{server}/hostwolf/players | Liste des joueurs en direct via RCON/query, et actions prises en charge | |
| POST | /servers/{server}/hostwolf/players/{action} | player: {name, steamid, id}, message | action: kick ban unban broadcast |
Mods, plugins et modpacks HW#
SDK : hw.addons, hw.modpacks · MCP : search_addons, install_addon, install_modpack · Jeux pris en charge : jeux
| Méthode | Chemin | Corps / requête | Remarques |
|---|---|---|---|
| GET | /servers/{server}/addons | Sources prises en charge, dossier d’installation, frameworks, mode Workshop | |
| GET | /servers/{server}/addons/search | source, q, page | Les sources dépendent du jeu : modrinth, curseforge, hangar, spigot, umod, thunderstore… |
| GET | /servers/{server}/addons/versions | source, project | Indique les versions compatibles |
| POST | /servers/{server}/addons/install | source, project, version | Omettez version pour la plus récente compatible |
| GET | /servers/{server}/addons/installed | updates=1 | Addons installés avec les mises à jour disponibles, plus les fichiers manuels |
| DELETE | /servers/{server}/addons/installed/{id} | ||
| POST | /servers/{server}/addons/manual/delete | file | Supprimer un fichier ajouté à la main |
| POST | /servers/{server}/addons/upload | multipart file | par ex. un plugin .jar |
| POST | /servers/{server}/addons/featured | project | Addons mis en avant en un clic |
| PUT | /servers/{server}/addons/framework | framework | par ex. Oxide/Carbon, BepInEx |
| POST | /servers/{server}/addons/cs2 | repair | CS2 : Metamod + CounterStrikeSharp |
| GET PUT | /servers/{server}/addons/workshop | items[] | Éléments ou collection du Steam Workshop |
| GET | /servers/{server}/addons/modpacks | Modpack actuel et résultat de son dernier démarrage | |
| GET | /servers/{server}/addons/modpacks/search | q, page, category, source | source : modrinth ou curseforge |
| GET | /servers/{server}/addons/modpacks/versions | project, source | |
| POST | /servers/{server}/addons/modpacks | project, version, fresh_world, source | Remplace les mods et le loader. 404 si le projet ou la version n’existe pas |
| DELETE | /servers/{server}/addons/modpacks |
Planifications#
SDK : hw.schedules · MCP : create_schedule, list_schedules
| Méthode | Chemin | Corps / requête | Remarques |
|---|---|---|---|
| GET | /servers/{server}/schedules | Inclut les tâches | |
| POST | /servers/{server}/schedules | name, minute, hour, day_of_month, month, day_of_week, is_active, only_when_online | Champs cron, UTC |
| GET POST DELETE | /servers/{server}/schedules/{id} | comme pour la création | POST met à jour |
| POST | /servers/{server}/schedules/{id}/execute | Exécuter maintenant | |
| POST | /servers/{server}/schedules/{id}/tasks | action (command power backup), payload, time_offset, continue_on_failure | |
| POST DELETE | /servers/{server}/schedules/{id}/tasks/{task} | comme pour la création | POST met à jour |
Réseau, bases de données et sous-utilisateurs#
| Méthode | Chemin | Corps / requête | Remarques |
|---|---|---|---|
| GET | /servers/{server}/network/allocations | Ports | |
| POST | /servers/{server}/network/allocations | Attribue automatiquement un autre port (si l’offre le permet) | |
| POST | /servers/{server}/network/allocations/{id} | notes | |
| POST | /servers/{server}/network/allocations/{id}/primary | ||
| DELETE | /servers/{server}/network/allocations/{id} | ||
| GET | /servers/{server}/databases | include=password | Aussi on_node, remote_ips, remote_anywhere, remote_address |
| GET | /servers/{server}/databases/service HW | status (none provisioning ready unreachable failed), local_address, public_address, other_servers | |
| POST | /servers/{server}/databases | database, remote_ips[], remote_anywhere | 202 avec l’état du service pendant que la première base démarre (voir ci-dessous) |
| POST | /servers/{server}/databases/{id}/rotate-password | ||
| POST | /servers/{server}/databases/{id}/remote HW | remote_ips[] (IPv4 publiques, 10 max.), remote_anywhere | Remplace la liste ; [] ferme l’accès depuis l’extérieur |
| GET | /servers/{server}/databases/{id}/export HW | Téléchargement .sql.gz. 6 par minute | |
| POST | /servers/{server}/databases/{id}/import HW | file (multipart, .sql ou .sql.gz, 50 Mo max.) | 204. 6 par minute |
| DELETE | /servers/{server}/databases/{id} | ||
| GET | /servers/{server}/users | Sous-utilisateurs | |
| POST | /servers/{server}/users | public_id, permissions[] | Ajoute un compte Hostwolf existant par son identifiant public (HW-XXXXXX, sur la page de ce compte) |
| GET POST DELETE | /servers/{server}/users/{uuid} | permissions[] | POST met à jour |
Les bases de données tournent sur la machine du serveur. Le premier POST /databases sur un serveur démarre le service de bases de données, ce qui prend environ 40 secondes, et répond 202 Accepted avec l’état du service ({"object": "hostwolf_database_service", "attributes": {"status": "provisioning", …}}) au lieu de la base. Interrogez GET /databases jusqu’à ce qu’elle apparaisse, ou utilisez databases.create(id, name, { wait: true }). Les bases suivantes sont créées immédiatement (200). Les serveurs de jeu se connectent à host.address (172.18.0.1:3306) ; remote_address ne fonctionne que depuis les remote_ips que vous autorisez, ou depuis n’importe où avec remote_anywhere. Voir le guide des bases de données.
Extras du serveur HW#
| Méthode | Chemin | Corps / requête | Remarques |
|---|---|---|---|
| GET PUT | /servers/{server}/hostwolf/notifications | webhook_url, clear_webhook, events | Alertes Discord : démarré, arrêté, planté, sauvegardes, joueurs |
| POST | /servers/{server}/hostwolf/notifications/test | ||
| GET | /servers/{server}/hostwolf/domain | Domaine personnalisé et les enregistrements nécessaires | |
| POST | /servers/{server}/hostwolf/domain/check | hostname | Vérifie le DNS en direct |
| PUT DELETE | /servers/{server}/hostwolf/domain | hostname | |
| GET | /servers/{server}/hostwolf/network | Sur un proxy Velocity/BungeeCord : ses entrées et les serveurs que vous pouvez y relier | |
| POST | /servers/{server}/hostwolf/network/link | servers[]: {id, key}, lobby, restart | |
| POST | /servers/{server}/hostwolf/network/unlink | id, restart | |
| POST | /servers/{server}/hostwolf/network/fabric-proxy | id | Installe FabricProxy-Lite sur un backend Fabric |
Offres et commandes HW#
SDK : hw.store · MCP : get_plans_and_prices, list_orders · Prix lisibles : tarifs
Lecture seule. Commande, résiliation et paiement se font dans le panel.
| Méthode | Chemin | Remarques |
|---|---|---|
| GET | /store/catalog | Jeux, tailles d’offre, régions et prix en direct par région |
| GET | /store/orders | Commandes en attente, actives et récemment échouées |
| GET | /store/billing | Toutes les commandes avec prix, renouvellement, résiliation et remboursement |
Console#
SDK : hw.console(), hw.tail() · MCP : get_console
La console en direct est un websocket sur le nœud qui exécute votre serveur.
GET /servers/{server}/websocketrenvoie{"data": {"token": "...", "socket": "wss://..."}}.- Connectez-vous à
socketavec un en-têteOrigin: https://panel.hostwolf.net. - Envoyez
{"event": "auth", "args": ["<token>"]}et attendezauth success. - Envoyez
{"event": "send logs", "args": [null]}pour rejouer la sortie récente.
Les messages sont du JSON de la forme {"event": "...", "args": [...]}.
Événements que vous recevez :
console outputstatusstats(une chaîne JSON)install outputdaemon messageetdaemon errortoken expiring: récupérez un nouveau jeton et renvoyezauth.token expired
Événements que vous pouvez envoyer :
send commandavec le texte de la commande.set stateavecstart,stop,restartoukill.send logssend stats
Le SDK s’occupe de tout cela : hw.console(id) ou hw.tail(id).
SFTP#
Les fichiers sont aussi accessibles en SFTP. Utilisez l’adresse de sftp_details renvoyée par GET /servers/{server}, avec le nom d’utilisateur <your username>.<server identifier>. Connectez-vous avec le mot de passe du panel ou une clé SSH ajoutée dans /account/ssh-keys.