DesarrolladoresAPI REST

Referencia de la API REST

URL base: https://panel.hostwolf.net/api/client

Autenticación: envía Authorization: Bearer ptlc_... y Accept: application/json. Crea claves en Cuenta → Claves API. Una clave puede limitarse a ciertas direcciones; consulta la lista de IP permitidas.

La API es compatible con la API de cliente de Pterodactyl, así que las herramientas y bibliotecas de Pterodactyl existentes funcionan con ella. Los endpoints exclusivos de Hostwolf llevan la marca HW.

Convenciones#

Respuestas. Los objetos individuales llegan envueltos como {"object": "server", "attributes": {...}}. Las listas llegan como {"object": "list", "data": [...], "meta": {...}}. Los endpoints exclusivos de Hostwolf devuelven JSON simple.

Paginación. Las listas paginadas aceptan ?page= y ?per_page= (máx. 100 para servidores, 50 para copias de seguridad) y devuelven meta.pagination con total, count, per_page, current_page y total_pages.

Errores.

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

Algunos endpoints de Hostwolf devuelven en su lugar {"error": "...", "code": "..."}, p. ej. 409 downgrade_requires_reset al cambiar un juego a una versión anterior, o 422 unknown_version para una versión que no existe.

Códigos de estado:

  • 204: correcto, sin contenido.
  • 401: falta la clave, es incorrecta o está revocada.
  • 403: falta de permiso (subusuarios), un servidor suspendido o una petición desde una dirección fuera de la lista de IP permitidas de la clave.
  • 404: no encontrado.
  • 409: el servidor está ocupado (instalando, restaurando o transfiriéndose).
  • 422: error de validación.
  • 429: límite de peticiones alcanzado. Retry-After indica cuántos segundos esperar; consulta los límites.
  • 502: no se puede contactar con el nodo del servidor, o el servidor debe estar encendido.

IDs de servidor. {server} es el identifier del servidor, los 8 caracteres de su URL en el panel. El UUID completo también sirve.

Cuenta#

MétodoRutaCuerpo / consultaNotas
GET/page, per_page, filter[*], typeTus servidores (paginado)
GET/permissionsTodas las claves de permiso de subusuarios
GET/accountTu cuenta
PUT/account/emailemail, password
PUT/account/passwordcurrent_password, password, password_confirmation
PUT/account/profile HWfirst_name, last_nameNombre visible
PUT/account/language HWlanguage: en-GB en-US de fr es fi; currency opcional (auto, USD, EUR…)Idioma del panel y moneda de los precios
POST DELETE/account/avatar HWimage: URL de datos (PNG/JPEG/WebP, máx. 512 KB)avatar_url en /account pasa a ser una ruta en el panel
GET/account/activitypage, filter[event], sortPaginado
GET PUT/account/notifications HWemail_enabled, email_address, discord_enabled, discord_webhook, notify_deployAvisos para toda la cuenta
POST/account/notifications/test HWEnvía una prueba a cada canal activado; results está vacío si no hay ninguno
GET PUT/account/curseforge HWkey (null la borra)Tu propia clave API de CurseForge
GET PUT/account/factorio HWusername, tokenCredenciales del portal de mods de Factorio
GET/account/api-keys
POST/account/api-keysdescription, allowed_ips[] (IP o rangos CIDR, máx. 50)La clave es attributes.identifier seguido de meta.secret_token; se muestra una sola vez
DELETE/account/api-keys/{identifier}
GET/account/ssh-keysPara SFTP
POST/account/ssh-keysname, public_key
POST/account/ssh-keys/removefingerprint

Servidores#

MétodoRutaCuerpo / consultaNotas
GET/servers/{server}include=egg,subusersDetalles, asignaciones, variables de arranque, region HW
GET/servers/{server}/resourcescurrent_state, CPU, memoria, disco, red, tiempo encendido
GET/servers/{server}/activitypage, filter[event]Paginado
POST/servers/{server}/powersignal: start stop restart kill204
POST/servers/{server}/commandcommandEl servidor debe estar encendido
GET/servers/{server}/websocketToken de consola, ver Consola
POST/servers/{server}/settings/renamename, description
POST/servers/{server}/settings/reinstallVuelve a ejecutar el script de instalación
PUT/servers/{server}/settings/docker-imagedocker_imageUna de las imágenes del egg
GET/servers/{server}/startupVariables, más meta.startup_command y meta.docker_images
PUT/servers/{server}/startup/variablekey, valuekey es el nombre de la variable de entorno, p. ej. MINECRAFT_VERSION

Archivos#

Todas las rutas son relativas a la raíz del servidor. root es la carpeta donde están las entradas de files.

MétodoRutaCuerpo / consultaNotas
GET/servers/{server}/files/listdirectory
GET/servers/{server}/files/contentsfileTexto sin formato. Un archivo que falta devuelve 500 desde el nodo; el SDK lo informa como 404
POST/servers/{server}/files/write?file=; texto sin formato como cuerpoCrea o sobrescribe
GET/servers/{server}/files/downloadfileattributes.url: URL firmada de un solo uso
GET/servers/{server}/files/uploadURL firmada: POST multipart files a url&directory=/path
PUT/servers/{server}/files/renameroot, files[]: {from, to}También mueve
POST/servers/{server}/files/copylocation
POST/servers/{server}/files/deleteroot, files[]
POST/servers/{server}/files/create-folderroot, name
POST/servers/{server}/files/compressroot, files[]Devuelve el archivo comprimido
POST/servers/{server}/files/decompressroot, file
POST/servers/{server}/files/chmodroot, files[]: {file, mode}
POST/servers/{server}/files/pullurl, directory, filename, use_header, foregroundEl servidor descarga una URL

Copias de seguridad#

SDK: hw.backups · MCP: create_backup, restore_backup, list_backups · Límite: 2 copias de seguridad cada 10 minutos.

MétodoRutaCuerpo / consultaNotas
GET/servers/{server}/backupspage, per_pagePaginado
POST/servers/{server}/backupsname, ignored, is_lockedSe ejecuta en segundo plano
GET/servers/{server}/backups/{uuid}completed_at se rellena al terminar
GET/servers/{server}/backups/{uuid}/downloadURL firmada
POST/servers/{server}/backups/{uuid}/lockBloquear o desbloquear
POST/servers/{server}/backups/{uuid}/restoretruncatetruncate: true borra antes todos los archivos
DELETE/servers/{server}/backups/{uuid}
GET PUT/servers/{server}/hostwolf/smart-backups HWenabledCopias automáticas antes de cambios arriesgados

Juego, jugadores y diagnóstico HW#

MétodoRutaCuerpo / consultaNotas
GET/servers/{server}/game/versionssupported, current, versions
POST/servers/{server}/game/versionversion, reset_world, forceCambia y reinstala. 409 downgrade_requires_reset para versiones anteriores, 422 unknown_version para versiones que no están en /game/versions
GET/servers/{server}/hostwolf/game-settingsAjustes legibles, agrupados por archivo de configuración. supported: false en juegos sin ellos, como Minecraft Java (edita server.properties en su lugar)
PUT/servers/{server}/hostwolf/game-settingsvalues: {id: "value"}, restartLos booleanos son "true" / "false"
GET/servers/{server}/hostwolf/diagnosticsComprobaciones de «Fix my server» con su gravedad
GET/servers/{server}/playersJugadores conectados, máximo, nombres (Minecraft)
GET/servers/{server}/hostwolf/playersLista de jugadores en vivo por RCON/query y acciones disponibles
POST/servers/{server}/hostwolf/players/{action}player: {name, steamid, id}, messageaction: kick ban unban broadcast

Mods, plugins y modpacks HW#

MétodoRutaCuerpo / consultaNotas
GET/servers/{server}/addonsFuentes compatibles, carpeta de instalación, frameworks, modo Workshop
GET/servers/{server}/addons/searchsource, q, pageLas fuentes dependen del juego: modrinth, curseforge, hangar, spigot, umod, thunderstore…
GET/servers/{server}/addons/versionssource, projectMarca las versiones compatibles
POST/servers/{server}/addons/installsource, project, versionOmite version para la más reciente compatible
GET/servers/{server}/addons/installedupdates=1Addons instalados con actualizaciones disponibles, más los archivos manuales
DELETE/servers/{server}/addons/installed/{id}
POST/servers/{server}/addons/manual/deletefileEliminar un archivo añadido a mano
POST/servers/{server}/addons/uploadmultipart filep. ej. un plugin .jar
POST/servers/{server}/addons/featuredprojectAddons destacados con un clic
PUT/servers/{server}/addons/frameworkframeworkp. ej. Oxide/Carbon, BepInEx
POST/servers/{server}/addons/cs2repairCS2: Metamod + CounterStrikeSharp
GET PUT/servers/{server}/addons/workshopitems[]Elementos o colección de Steam Workshop
GET/servers/{server}/addons/modpacksModpack actual y resultado de su último arranque
GET/servers/{server}/addons/modpacks/searchq, page, category, sourcesource: modrinth o curseforge
GET/servers/{server}/addons/modpacks/versionsproject, source
POST/servers/{server}/addons/modpacksproject, version, fresh_world, sourceSustituye los mods y el loader. 404 si el proyecto o la versión no existe
DELETE/servers/{server}/addons/modpacks

Programaciones#

MétodoRutaCuerpo / consultaNotas
GET/servers/{server}/schedulesIncluye las tareas
POST/servers/{server}/schedulesname, minute, hour, day_of_month, month, day_of_week, is_active, only_when_onlineCampos cron, UTC
GET POST DELETE/servers/{server}/schedules/{id}igual que al crearPOST actualiza
POST/servers/{server}/schedules/{id}/executeEjecutar ahora
POST/servers/{server}/schedules/{id}/tasksaction (command power backup), payload, time_offset, continue_on_failure
POST DELETE/servers/{server}/schedules/{id}/tasks/{task}igual que al crearPOST actualiza

Red, bases de datos y subusuarios#

MétodoRutaCuerpo / consultaNotas
GET/servers/{server}/network/allocationsPuertos
POST/servers/{server}/network/allocationsAsigna automáticamente otro puerto (si el plan lo permite)
POST/servers/{server}/network/allocations/{id}notes
POST/servers/{server}/network/allocations/{id}/primary
DELETE/servers/{server}/network/allocations/{id}
GET/servers/{server}/databasesinclude=passwordTambién 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 con el estado del servicio mientras arranca la primera base de datos (ver abajo)
POST/servers/{server}/databases/{id}/rotate-password
POST/servers/{server}/databases/{id}/remote HWremote_ips[] (IPv4 públicas, máx. 10), remote_anywhereSustituye la lista; [] cierra el acceso desde fuera
GET/servers/{server}/databases/{id}/export HWDescarga .sql.gz. 6 por minuto
POST/servers/{server}/databases/{id}/import HWfile (multipart, .sql o .sql.gz, máx. 50 MB)204. 6 por minuto
DELETE/servers/{server}/databases/{id}
GET/servers/{server}/usersSubusuarios
POST/servers/{server}/userspublic_id, permissions[]Añade una cuenta de Hostwolf existente por su ID pública (HW-XXXXXX, en la página de esa cuenta)
GET POST DELETE/servers/{server}/users/{uuid}permissions[]POST actualiza

Las bases de datos funcionan en la propia máquina del servidor. El primer POST /databases en un servidor arranca el servicio de bases de datos, lo que tarda unos 40 segundos, y responde 202 Accepted con el estado del servicio ({"object": "hostwolf_database_service", "attributes": {"status": "provisioning", …}}) en lugar de la base de datos. Consulta GET /databases hasta que aparezca, o usa databases.create(id, name, { wait: true }). Las siguientes se crean al momento (200). Los servidores de juego se conectan a host.address (172.18.0.1:3306); remote_address solo funciona desde las remote_ips que permitas, o desde cualquier sitio con remote_anywhere. Consulta la guía de bases de datos.

Extras del servidor HW#

MétodoRutaCuerpo / consultaNotas
GET PUT/servers/{server}/hostwolf/notificationswebhook_url, clear_webhook, eventsAvisos de Discord: iniciado, detenido, caído, copias de seguridad, jugadores
POST/servers/{server}/hostwolf/notifications/test
GET/servers/{server}/hostwolf/domainDominio propio y los registros que necesita
POST/servers/{server}/hostwolf/domain/checkhostnameComprueba el DNS actual
PUT DELETE/servers/{server}/hostwolf/domainhostname
GET/servers/{server}/hostwolf/networkEn un proxy Velocity/BungeeCord: sus entradas y los servidores que puedes enlazar
POST/servers/{server}/hostwolf/network/linkservers[]: {id, key}, lobby, restart
POST/servers/{server}/hostwolf/network/unlinkid, restart
POST/servers/{server}/hostwolf/network/fabric-proxyidInstala FabricProxy-Lite en un backend de Fabric

Planes y pedidos HW#

SDK: hw.store · MCP: get_plans_and_prices, list_orders · Precios legibles: precios

Solo lectura. Los pedidos, cancelaciones y pagos se hacen en el panel.

MétodoRutaNotas
GET/store/catalogJuegos, tamaños de plan, regiones y precios en vivo por región
GET/store/ordersPedidos pendientes, activos y fallidos recientes
GET/store/billingTodos los pedidos con precio, renovación, cancelación y reembolso

Consola#

La consola en vivo es un websocket en el nodo donde se ejecuta tu servidor.

  1. GET /servers/{server}/websocket devuelve {"data": {"token": "...", "socket": "wss://..."}}.
  2. Conéctate a socket con una cabecera Origin: https://panel.hostwolf.net.
  3. Envía {"event": "auth", "args": ["<token>"]} y espera a auth success.
  4. Envía {"event": "send logs", "args": [null]} para volver a recibir la salida reciente.

Los mensajes son JSON con la forma {"event": "...", "args": [...]}.

Eventos que recibes:

  • console output
  • status
  • stats (una cadena JSON)
  • install output
  • daemon message y daemon error
  • token expiring: pide un token nuevo y vuelve a enviar auth.
  • token expired

Eventos que puedes enviar:

  • send command con el texto del comando.
  • set state con start, stop, restart o kill.
  • send logs
  • send stats

El SDK se encarga de todo esto: hw.console(id) o hw.tail(id).

SFTP#

También puedes acceder a los archivos por SFTP. Usa la dirección de sftp_details que devuelve GET /servers/{server}, con el usuario <your username>.<server identifier>. Inicia sesión con la contraseña del panel o con una clave SSH añadida en /account/ssh-keys.

¿Atascado, o te falta un endpoint? Escríbenos en game.hostwolf.net/contact o a support@hostwolf.net.