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-Afterindica 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#
SDK: hw.account · hw.servers.list · Panel: Ajustes de la cuenta
| Método | Ruta | Cuerpo / consulta | Notas |
|---|---|---|---|
| GET | / | page, per_page, filter[*], type | Tus servidores (paginado) |
| GET | /permissions | Todas las claves de permiso de subusuarios | |
| GET | /account | Tu cuenta | |
| PUT | /account/email | email, password | |
| PUT | /account/password | current_password, password, password_confirmation | |
| PUT | /account/profile HW | first_name, last_name | Nombre visible |
| PUT | /account/language HW | language: 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 HW | image: URL de datos (PNG/JPEG/WebP, máx. 512 KB) | avatar_url en /account pasa a ser una ruta en el panel |
| GET | /account/activity | page, filter[event], sort | Paginado |
| GET PUT | /account/notifications HW | email_enabled, email_address, discord_enabled, discord_webhook, notify_deploy | Avisos para toda la cuenta |
| POST | /account/notifications/test HW | Envía una prueba a cada canal activado; results está vacío si no hay ninguno | |
| GET PUT | /account/curseforge HW | key (null la borra) | Tu propia clave API de CurseForge |
| GET PUT | /account/factorio HW | username, token | Credenciales del portal de mods de Factorio |
| GET | /account/api-keys | ||
| POST | /account/api-keys | description, 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-keys | Para SFTP | |
| POST | /account/ssh-keys | name, public_key | |
| POST | /account/ssh-keys/remove | fingerprint |
Servidores#
| Método | Ruta | Cuerpo / consulta | Notas |
|---|---|---|---|
| GET | /servers/{server} | include=egg,subusers | Detalles, asignaciones, variables de arranque, region HW |
| GET | /servers/{server}/resources | current_state, CPU, memoria, disco, red, tiempo encendido | |
| GET | /servers/{server}/activity | page, filter[event] | Paginado |
| POST | /servers/{server}/power | signal: start stop restart kill | 204 |
| POST | /servers/{server}/command | command | El servidor debe estar encendido |
| GET | /servers/{server}/websocket | Token de consola, ver Consola | |
| POST | /servers/{server}/settings/rename | name, description | |
| POST | /servers/{server}/settings/reinstall | Vuelve a ejecutar el script de instalación | |
| PUT | /servers/{server}/settings/docker-image | docker_image | Una de las imágenes del egg |
| GET | /servers/{server}/startup | Variables, más meta.startup_command y meta.docker_images | |
| PUT | /servers/{server}/startup/variable | key, value | key 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étodo | Ruta | Cuerpo / consulta | Notas |
|---|---|---|---|
| GET | /servers/{server}/files/list | directory | |
| GET | /servers/{server}/files/contents | file | Texto 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 cuerpo | Crea o sobrescribe |
| GET | /servers/{server}/files/download | file | attributes.url: URL firmada de un solo uso |
| GET | /servers/{server}/files/upload | URL firmada: POST multipart files a url&directory=/path | |
| PUT | /servers/{server}/files/rename | root, files[]: {from, to} | También mueve |
| 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[] | Devuelve el archivo comprimido |
| 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 | El 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étodo | Ruta | Cuerpo / consulta | Notas |
|---|---|---|---|
| GET | /servers/{server}/backups | page, per_page | Paginado |
| POST | /servers/{server}/backups | name, ignored, is_locked | Se ejecuta en segundo plano |
| GET | /servers/{server}/backups/{uuid} | completed_at se rellena al terminar | |
| GET | /servers/{server}/backups/{uuid}/download | URL firmada | |
| POST | /servers/{server}/backups/{uuid}/lock | Bloquear o desbloquear | |
| POST | /servers/{server}/backups/{uuid}/restore | truncate | truncate: true borra antes todos los archivos |
| DELETE | /servers/{server}/backups/{uuid} | ||
| GET PUT | /servers/{server}/hostwolf/smart-backups HW | enabled | Copias automáticas antes de cambios arriesgados |
Juego, jugadores y diagnóstico HW#
| Método | Ruta | Cuerpo / consulta | Notas |
|---|---|---|---|
| GET | /servers/{server}/game/versions | supported, current, versions | |
| POST | /servers/{server}/game/version | version, reset_world, force | Cambia 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-settings | Ajustes 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-settings | values: {id: "value"}, restart | Los booleanos son "true" / "false" |
| GET | /servers/{server}/hostwolf/diagnostics | Comprobaciones de «Fix my server» con su gravedad | |
| GET | /servers/{server}/players | Jugadores conectados, máximo, nombres (Minecraft) | |
| GET | /servers/{server}/hostwolf/players | Lista de jugadores en vivo por RCON/query y acciones disponibles | |
| POST | /servers/{server}/hostwolf/players/{action} | player: {name, steamid, id}, message | action: kick ban unban broadcast |
Mods, plugins y modpacks HW#
SDK: hw.addons, hw.modpacks · MCP: search_addons, install_addon, install_modpack · Juegos compatibles: juegos
| Método | Ruta | Cuerpo / consulta | Notas |
|---|---|---|---|
| GET | /servers/{server}/addons | Fuentes compatibles, carpeta de instalación, frameworks, modo Workshop | |
| GET | /servers/{server}/addons/search | source, q, page | Las fuentes dependen del juego: modrinth, curseforge, hangar, spigot, umod, thunderstore… |
| GET | /servers/{server}/addons/versions | source, project | Marca las versiones compatibles |
| POST | /servers/{server}/addons/install | source, project, version | Omite version para la más reciente compatible |
| GET | /servers/{server}/addons/installed | updates=1 | Addons instalados con actualizaciones disponibles, más los archivos manuales |
| DELETE | /servers/{server}/addons/installed/{id} | ||
| POST | /servers/{server}/addons/manual/delete | file | Eliminar un archivo añadido a mano |
| POST | /servers/{server}/addons/upload | multipart file | p. ej. un plugin .jar |
| POST | /servers/{server}/addons/featured | project | Addons destacados con un clic |
| PUT | /servers/{server}/addons/framework | framework | p. ej. Oxide/Carbon, BepInEx |
| POST | /servers/{server}/addons/cs2 | repair | CS2: Metamod + CounterStrikeSharp |
| GET PUT | /servers/{server}/addons/workshop | items[] | Elementos o colección de Steam Workshop |
| GET | /servers/{server}/addons/modpacks | Modpack actual y resultado de su último arranque | |
| GET | /servers/{server}/addons/modpacks/search | q, page, category, source | source: modrinth o curseforge |
| GET | /servers/{server}/addons/modpacks/versions | project, source | |
| POST | /servers/{server}/addons/modpacks | project, version, fresh_world, source | Sustituye los mods y el loader. 404 si el proyecto o la versión no existe |
| DELETE | /servers/{server}/addons/modpacks |
Programaciones#
SDK: hw.schedules · MCP: create_schedule, list_schedules
| Método | Ruta | Cuerpo / consulta | Notas |
|---|---|---|---|
| GET | /servers/{server}/schedules | Incluye las tareas | |
| POST | /servers/{server}/schedules | name, minute, hour, day_of_month, month, day_of_week, is_active, only_when_online | Campos cron, UTC |
| GET POST DELETE | /servers/{server}/schedules/{id} | igual que al crear | POST actualiza |
| POST | /servers/{server}/schedules/{id}/execute | Ejecutar ahora | |
| POST | /servers/{server}/schedules/{id}/tasks | action (command power backup), payload, time_offset, continue_on_failure | |
| POST DELETE | /servers/{server}/schedules/{id}/tasks/{task} | igual que al crear | POST actualiza |
Red, bases de datos y subusuarios#
| Método | Ruta | Cuerpo / consulta | Notas |
|---|---|---|---|
| GET | /servers/{server}/network/allocations | Puertos | |
| POST | /servers/{server}/network/allocations | Asigna 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}/databases | include=password | También 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 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 HW | remote_ips[] (IPv4 públicas, máx. 10), remote_anywhere | Sustituye la lista; [] cierra el acceso desde fuera |
| GET | /servers/{server}/databases/{id}/export HW | Descarga .sql.gz. 6 por minuto | |
| POST | /servers/{server}/databases/{id}/import HW | file (multipart, .sql o .sql.gz, máx. 50 MB) | 204. 6 por minuto |
| DELETE | /servers/{server}/databases/{id} | ||
| GET | /servers/{server}/users | Subusuarios | |
| POST | /servers/{server}/users | public_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étodo | Ruta | Cuerpo / consulta | Notas |
|---|---|---|---|
| GET PUT | /servers/{server}/hostwolf/notifications | webhook_url, clear_webhook, events | Avisos de Discord: iniciado, detenido, caído, copias de seguridad, jugadores |
| POST | /servers/{server}/hostwolf/notifications/test | ||
| GET | /servers/{server}/hostwolf/domain | Dominio propio y los registros que necesita | |
| POST | /servers/{server}/hostwolf/domain/check | hostname | Comprueba el DNS actual |
| PUT DELETE | /servers/{server}/hostwolf/domain | hostname | |
| GET | /servers/{server}/hostwolf/network | En un proxy Velocity/BungeeCord: sus entradas y los servidores que puedes enlazar | |
| 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 | Instala 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étodo | Ruta | Notas |
|---|---|---|
| GET | /store/catalog | Juegos, tamaños de plan, regiones y precios en vivo por región |
| GET | /store/orders | Pedidos pendientes, activos y fallidos recientes |
| GET | /store/billing | Todos los pedidos con precio, renovación, cancelación y reembolso |
Consola#
SDK: hw.console(), hw.tail() · MCP: get_console
La consola en vivo es un websocket en el nodo donde se ejecuta tu servidor.
GET /servers/{server}/websocketdevuelve{"data": {"token": "...", "socket": "wss://..."}}.- Conéctate a
socketcon una cabeceraOrigin: https://panel.hostwolf.net. - Envía
{"event": "auth", "args": ["<token>"]}y espera aauth success. - 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 outputstatusstats(una cadena JSON)install outputdaemon messageydaemon errortoken expiring: pide un token nuevo y vuelve a enviarauth.token expired
Eventos que puedes enviar:
send commandcon el texto del comando.set stateconstart,stop,restartokill.send logssend 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.