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-After indique 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#

MéthodeCheminCorps / requêteRemarques
GET/page, per_page, filter[*], typeVos serveurs (paginé)
GET/permissionsToutes les clés de permission des sous-utilisateurs
GET/accountVotre compte
PUT/account/emailemail, password
PUT/account/passwordcurrent_password, password, password_confirmation
PUT/account/profile HWfirst_name, last_nameNom affiché
PUT/account/language HWlanguage : 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 HWimage : data URL (PNG/JPEG/WebP, 512 Ko max.)avatar_url dans /account devient alors un chemin sur le panneau
GET/account/activitypage, filter[event], sortPaginé
GET PUT/account/notifications HWemail_enabled, email_address, discord_enabled, discord_webhook, notify_deployAlertes pour tout le compte
POST/account/notifications/test HWEnvoie un test à chaque canal activé ; results est vide si aucun ne l’est
GET PUT/account/curseforge HWkey (null l’efface)Votre propre clé API CurseForge
GET PUT/account/factorio HWusername, tokenIdentifiants du portail de mods Factorio
GET/account/api-keys
POST/account/api-keysdescription, 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-keysPour le SFTP
POST/account/ssh-keysname, public_key
POST/account/ssh-keys/removefingerprint

Serveurs#

MéthodeCheminCorps / requêteRemarques
GET/servers/{server}include=egg,subusersDétails, allocations, variables de démarrage, region HW
GET/servers/{server}/resourcescurrent_state, CPU, mémoire, disque, réseau, temps de fonctionnement
GET/servers/{server}/activitypage, filter[event]Paginé
POST/servers/{server}/powersignal: start stop restart kill204
POST/servers/{server}/commandcommandLe serveur doit être démarré
GET/servers/{server}/websocketJeton de console, voir Console
POST/servers/{server}/settings/renamename, description
POST/servers/{server}/settings/reinstallRelance le script d’installation
PUT/servers/{server}/settings/docker-imagedocker_imageUne des images de l’egg
GET/servers/{server}/startupVariables, plus meta.startup_command et meta.docker_images
PUT/servers/{server}/startup/variablekey, valuekey est le nom de la variable d’environnement, par ex. MINECRAFT_VERSION

Fichiers#

Tous les chemins sont relatifs à la racine du serveur. root est le dossier dans lequel se trouvent les entrées de files.

MéthodeCheminCorps / requêteRemarques
GET/servers/{server}/files/listdirectory
GET/servers/{server}/files/contentsfileTexte 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 contenuCrée ou écrase
GET/servers/{server}/files/downloadfileattributes.url : URL signée à usage unique
GET/servers/{server}/files/uploadURL signée : POST multipart files vers url&directory=/path
PUT/servers/{server}/files/renameroot, files[]: {from, to}Déplace aussi
POST/servers/{server}/files/copylocation
POST/servers/{server}/files/deleteroot, files[]
POST/servers/{server}/files/create-folderroot, name
POST/servers/{server}/files/compressroot, files[]Renvoie l’archive
POST/servers/{server}/files/decompressroot, file
POST/servers/{server}/files/chmodroot, files[]: {file, mode}
POST/servers/{server}/files/pullurl, directory, filename, use_header, foregroundLe serveur télécharge une URL

Sauvegardes#

SDK : hw.backups · MCP : create_backup, restore_backup, list_backups · Limite : 2 sauvegardes par 10 minutes.

MéthodeCheminCorps / requêteRemarques
GET/servers/{server}/backupspage, per_pagePaginé
POST/servers/{server}/backupsname, ignored, is_lockedS’exécute en arrière-plan
GET/servers/{server}/backups/{uuid}completed_at est renseigné une fois terminé
GET/servers/{server}/backups/{uuid}/downloadURL signée
POST/servers/{server}/backups/{uuid}/lockVerrouiller / déverrouiller
POST/servers/{server}/backups/{uuid}/restoretruncatetruncate: true supprime d’abord tous les fichiers
DELETE/servers/{server}/backups/{uuid}
GET PUT/servers/{server}/hostwolf/smart-backups HWenabledSauvegardes automatiques avant les changements risqués

Jeu, joueurs et diagnostic HW#

MéthodeCheminCorps / requêteRemarques
GET/servers/{server}/game/versionssupported, current, versions
POST/servers/{server}/game/versionversion, reset_world, forceChange 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-settingsParamè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-settingsvalues: {id: "value"}, restartLes booléens valent "true" / "false"
GET/servers/{server}/hostwolf/diagnosticsVérifications « Fix my server » avec niveau de gravité
GET/servers/{server}/playersNombre en ligne, maximum, noms (Minecraft)
GET/servers/{server}/hostwolf/playersListe des joueurs en direct via RCON/query, et actions prises en charge
POST/servers/{server}/hostwolf/players/{action}player: {name, steamid, id}, messageaction: kick ban unban broadcast

Mods, plugins et modpacks HW#

MéthodeCheminCorps / requêteRemarques
GET/servers/{server}/addonsSources prises en charge, dossier d’installation, frameworks, mode Workshop
GET/servers/{server}/addons/searchsource, q, pageLes sources dépendent du jeu : modrinth, curseforge, hangar, spigot, umod, thunderstore…
GET/servers/{server}/addons/versionssource, projectIndique les versions compatibles
POST/servers/{server}/addons/installsource, project, versionOmettez version pour la plus récente compatible
GET/servers/{server}/addons/installedupdates=1Addons installés avec les mises à jour disponibles, plus les fichiers manuels
DELETE/servers/{server}/addons/installed/{id}
POST/servers/{server}/addons/manual/deletefileSupprimer un fichier ajouté à la main
POST/servers/{server}/addons/uploadmultipart filepar ex. un plugin .jar
POST/servers/{server}/addons/featuredprojectAddons mis en avant en un clic
PUT/servers/{server}/addons/frameworkframeworkpar ex. Oxide/Carbon, BepInEx
POST/servers/{server}/addons/cs2repairCS2 : Metamod + CounterStrikeSharp
GET PUT/servers/{server}/addons/workshopitems[]Éléments ou collection du Steam Workshop
GET/servers/{server}/addons/modpacksModpack actuel et résultat de son dernier démarrage
GET/servers/{server}/addons/modpacks/searchq, page, category, sourcesource : modrinth ou curseforge
GET/servers/{server}/addons/modpacks/versionsproject, source
POST/servers/{server}/addons/modpacksproject, version, fresh_world, sourceRemplace les mods et le loader. 404 si le projet ou la version n’existe pas
DELETE/servers/{server}/addons/modpacks

Planifications#

MéthodeCheminCorps / requêteRemarques
GET/servers/{server}/schedulesInclut les tâches
POST/servers/{server}/schedulesname, minute, hour, day_of_month, month, day_of_week, is_active, only_when_onlineChamps cron, UTC
GET POST DELETE/servers/{server}/schedules/{id}comme pour la créationPOST met à jour
POST/servers/{server}/schedules/{id}/executeExécuter maintenant
POST/servers/{server}/schedules/{id}/tasksaction (command power backup), payload, time_offset, continue_on_failure
POST DELETE/servers/{server}/schedules/{id}/tasks/{task}comme pour la créationPOST met à jour

Réseau, bases de données et sous-utilisateurs#

MéthodeCheminCorps / requêteRemarques
GET/servers/{server}/network/allocationsPorts
POST/servers/{server}/network/allocationsAttribue 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}/databasesinclude=passwordAussi 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 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 HWremote_ips[] (IPv4 publiques, 10 max.), remote_anywhereRemplace la liste ; [] ferme l’accès depuis l’extérieur
GET/servers/{server}/databases/{id}/export HWTéléchargement .sql.gz. 6 par minute
POST/servers/{server}/databases/{id}/import HWfile (multipart, .sql ou .sql.gz, 50 Mo max.)204. 6 par minute
DELETE/servers/{server}/databases/{id}
GET/servers/{server}/usersSous-utilisateurs
POST/servers/{server}/userspublic_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éthodeCheminCorps / requêteRemarques
GET PUT/servers/{server}/hostwolf/notificationswebhook_url, clear_webhook, eventsAlertes Discord : démarré, arrêté, planté, sauvegardes, joueurs
POST/servers/{server}/hostwolf/notifications/test
GET/servers/{server}/hostwolf/domainDomaine personnalisé et les enregistrements nécessaires
POST/servers/{server}/hostwolf/domain/checkhostnameVérifie le DNS en direct
PUT DELETE/servers/{server}/hostwolf/domainhostname
GET/servers/{server}/hostwolf/networkSur un proxy Velocity/BungeeCord : ses entrées et les serveurs que vous pouvez y relier
POST/servers/{server}/hostwolf/network/linkservers[]: {id, key}, lobby, restart
POST/servers/{server}/hostwolf/network/unlinkid, restart
POST/servers/{server}/hostwolf/network/fabric-proxyidInstalle 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éthodeCheminRemarques
GET/store/catalogJeux, tailles d’offre, régions et prix en direct par région
GET/store/ordersCommandes en attente, actives et récemment échouées
GET/store/billingToutes les commandes avec prix, renouvellement, résiliation et remboursement

Console#

La console en direct est un websocket sur le nœud qui exécute votre serveur.

  1. GET /servers/{server}/websocket renvoie {"data": {"token": "...", "socket": "wss://..."}}.
  2. Connectez-vous à socket avec un en-tête Origin: https://panel.hostwolf.net.
  3. Envoyez {"event": "auth", "args": ["<token>"]} et attendez auth success.
  4. 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 output
  • status
  • stats (une chaîne JSON)
  • install output
  • daemon message et daemon error
  • token expiring : récupérez un nouveau jeton et renvoyez auth.
  • token expired

Événements que vous pouvez envoyer :

  • send command avec le texte de la commande.
  • set state avec start, stop, restart ou kill.
  • send logs
  • send 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.

Bloqué, ou il manque un endpoint ? Écrivez-nous sur game.hostwolf.net/contact ou à support@hostwolf.net.