Primeros pasos
Introducción
La API Panel KVM permite gestionar mediante programación los VPS KVM de su cuenta LWS: inventario, supervisión, alimentación, reinstalación, snapshots, copias de seguridad, cortafuegos, red y claves SSH. Ofrece lo mismo que el panel de cliente KVM, para sus scripts, su integración continua o su supervisión.
Inicio rápido
1. Cree su clave API. En el panel KVM, abra la página API / MCP, reservada a la cuenta principal. Declare la dirección IP desde la que se realizarán sus llamadas, active el acceso, genere la clave y elija los VPS que podrá controlar: todos o una selección. Una clave que aún no cubre ningún VPS funciona, pero su lista de VPS está vacía. La clave completa solo se muestra una vez: cópiela de inmediato.
2. Guárdela en una variable de entorno, como hacen todos los ejemplos de esta documentación:
export LWS_API_KEY="lws_live_sk_7Yc2Kp9RtNwQ4mZ8Bx3Vf1Hd6Ls0AjE2"
3. Compruebe que funciona:
curl https://panelkvm.lwspanel.com/api/v1/me \
-H "Authorization: Bearer $LWS_API_KEY"
La respuesta indica la cuenta, el nivel de permisos de la clave y el número de VPS que cubre.
4. Liste sus VPS:
curl https://panelkvm.lwspanel.com/api/v1/servers \
-H "Authorization: Bearer $LWS_API_KEY"
Cada VPS se identifica por su vmid, que utilizará en todas las demás llamadas.
5. Lance una acción y sígala. Reinicie un VPS:
curl -X POST https://panelkvm.lwspanel.com/api/v1/servers/116807/power \
-H "Authorization: Bearer $LWS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"action": "reboot"}'
La respuesta contiene una tarea ("id": "tsk_000002e1"). Consúltela hasta que su estado sea succeeded:
curl https://panelkvm.lwspanel.com/api/v1/tasks/tsk_000002e1 \
-H "Authorization: Bearer $LWS_API_KEY"
Autenticación
Cada petición incluye la clave en el encabezado Authorization, con el esquema Bearer. No la transmita nunca en una URL: los registros de acceso conservan las direcciones.
La clave se configura desde la página API / MCP del panel:
- Direcciones autorizadas (obligatorio): IPv4, IPv6 o rangos CIDR. El acceso no puede activarse sin al menos una dirección. Una llamada procedente de otra dirección se rechaza (
403 ip_not_allowed). - Activación: un interruptor corta el acceso sin eliminar la clave (
401 access_disabled). - Regeneración: una nueva clave invalida la anterior de inmediato, y se avisa por correo electrónico al titular de la cuenta.
Permisos y alcance
Cada clave recibe un nivel de permisos:
| Nivel | Valor | Qué permite |
|---|---|---|
| Solo lectura | read |
Todas las consultas: inventario, estado, métricas, listas, tareas, registro de actividad. |
| Explotación | exploitation |
Solo lectura y, además: alimentación, creación de snapshots y de copias de seguridad, imágenes ISO, DNS inverso, claves SSH, creación y modificación de conjuntos de reglas, aplicación de un conjunto, activación del cortafuegos, solicitud de desbloqueo del puerto 25. |
| Completo | full |
Explotación y, además, las operaciones irreversibles o que exponen el servidor: reinstalación, modo rescate, contraseña root, restauración y eliminación de snapshots, restauración de copias de seguridad, desactivación del cortafuegos, retirada y eliminación de conjuntos de reglas. |
El nivel requerido figura al principio de cada operación. Una llamada que supera el nivel concedido se rechaza (403 insufficient_scope), y la respuesta indica el nivel exigido en required_level.
El nivel se elige en la página API / MCP del panel. El paso al nivel Completo debe confirmarse mediante un código enviado por correo electrónico al titular de la cuenta; volver a un nivel inferior no lo requiere.
El alcance de la clave cubre todos los VPS de la cuenta, incluidos los que se contraten más adelante, o bien una selección de VPS. Un VPS fuera del alcance responde exactamente igual que un VPS inexistente (404 vm_not_found).
Peticiones y respuestas
- Los intercambios se realizan en JSON, codificado en UTF-8. Los cuerpos de las peticiones se envían con
Content-Type: application/json. - Un recurso se devuelve dentro de
data. - Una lista se devuelve dentro de
data, acompañada de un bloquemeta. Las listas largas (VPS, tareas, registro de actividad) se paginan conpage(por defecto1) yper_page(por defecto25, como máximo100); las listas cortas se devuelven completas. - Las fechas siguen el formato ISO 8601 con desfase horario:
2027-03-14T00:00:00+01:00. - Los volúmenes se expresan en bytes, salvo
min_memory_gben el catálogo de sistemas. - Los identificadores son cadenas, incluido
vmid:"116807". Soloaccount_id, enGET /me, es un número. - Cada respuesta incluye un encabezado
X-Request-Id. Indíquelo al soporte de LWS en cualquier incidencia: permite localizar la llamada exacta.
{
"data": [
{
"id": "tsk_000002e1",
"status": "succeeded",
"action": "server.reboot",
"vmid": "116807",
"description": "Demande de reboot du serveur VPS-116807",
"created_at": "2026-08-20T14:31:02+02:00",
"finished_at": "2026-08-20T14:31:40+02:00"
}
],
"meta": { "page": 1, "per_page": 25, "total": 1, "total_pages": 1 }
}
Operaciones asíncronas
Las operaciones marcadas como [Differed] (arranque, reinstalación, snapshot, copia de seguridad, cortafuegos…) no se ejecutan durante la petición: se ponen en cola y responden 202 Accepted con la tarea creada.
{
"data": {
"tasks": [
{
"id": "tsk_000002e1",
"status": "pending",
"action": "server.reboot",
"vmid": "116807",
"description": "Demande de reboot du serveur VPS-116807",
"created_at": "2026-08-20T14:31:02+02:00",
"finished_at": null
}
]
}
}
A continuación, siga la tarea con Consultar una tarea cada pocos segundos, hasta que status sea succeeded o failed. Consultarla con más frecuencia no acelera nada y consume su cuota.
Solo puede ejecutarse a la vez una operación de un mismo tipo en un VPS: una segunda solicitud se rechaza (409 task_already_running) y la respuesta identifica la tarea en curso en task_id.
Un VPS bloqueado por el hipervisor también rechaza las escrituras (409 server_locked). El campo reason indica qué hacer: operation_in_progress, hay una operación en curso, vuelva a intentarlo tras el plazo del encabezado Retry-After; suspended, el VPS está en hibernación, arránquelo primero; support_notified, el bloqueo es anómalo, el equipo de LWS ha sido avisado y está interviniendo, no tiene sentido reintentar en bucle.
Durante una intervención anunciada por LWS en el servidor anfitrión de un VPS (actualización, reinicio…), si dicho servidor deja de responder, se rechazan las escrituras en ese VPS y las lecturas que consultan el hipervisor (503 server_maintenance). El campo maintenance de la respuesta precisa su naturaleza y el fin previsto, y el encabezado Retry-After, el plazo recomendado antes de reintentar. El inventario y la ficha del VPS siguen respondiendo, con status: maintenance.
Las demás escrituras (imágenes ISO, DNS inverso, contraseña root, claves SSH, conjuntos de reglas) son inmediatas y devuelven directamente su resultado.
Errores
Los errores se devuelven en formato application/problem+json:
{
"type": "https://docs.lws.fr/kvm/errors/vm-not-found",
"title": "VPS introuvable",
"status": 404,
"code": "vm_not_found",
"detail": "Aucun VPS 999999 sur ce compte.",
"request_id": "3f9a1c07b2e45d18"
}
Base su tratamiento en code, que es estable. detail está dirigido a una persona y puede cambiar. Según el error, la respuesta también incluye errors (detalle por parámetro), required_level, task_id, lock y reason, o retry_after.
| HTTP | Código | Causa |
|---|---|---|
| 400 | bad_request |
Cuerpo ilegible (JSON mal formado). |
| 400 | validation_failed |
Parámetro no válido; errors detalla cada campo erróneo. |
| 401 | invalid_token |
Encabezado Authorization ausente o mal formado, clave desconocida o regenerada desde entonces. |
| 401 | access_disabled |
Acceso a la API cortado para esta cuenta (interruptor de la página «API / MCP») o servicio de API temporalmente no disponible. |
| 403 | ip_not_allowed |
Dirección de origen ausente de las direcciones autorizadas. |
| 403 | insufficient_scope |
Nivel de la clave insuficiente; required_level indica el nivel exigido. |
| 404 | vm_not_found |
VPS inexistente o fuera del alcance de la clave (ambos casos son deliberadamente indistinguibles). |
| 404 | snapshot_not_found, backup_not_found, set_not_found, ssh_key_not_found, task_not_found |
Recurso desconocido en este VPS o en esta cuenta. |
| 404 | not_found |
Ruta inexistente. |
| 405 | method_not_allowed |
Verbo no previsto en una ruta existente; el encabezado Allow enumera los verbos aceptados. |
| 409 | task_already_running |
Ya hay una operación del mismo tipo en curso en este VPS; task_id la identifica. |
| 409 | server_locked |
VPS bloqueado por el hipervisor; reason indica si hay que reintentar, arrancarlo o esperar al equipo de LWS. |
| 409 | service_suspended |
VPS desactivado o caducado: las lecturas siguen siendo posibles, las escrituras no. |
| 409 | invalid_state |
Acción incompatible con el estado actual. |
| 409 | quota_exceeded |
Límite funcional alcanzado (3 snapshots, 10 conjuntos de reglas por VPS). |
| 422 | unsupported_operation |
Función no disponible en este VPS (en particular, agente QEMU ausente). |
| 429 | rate_limited |
Cuota de llamadas superada: respete Retry-After. |
| 500 | internal_error |
Error inesperado: facilite el request_id al soporte. |
| 502 | hypervisor_unreachable |
Hipervisor momentáneamente inaccesible: vuelva a intentarlo. |
| 502 | upstream_unavailable |
Dependencia interna no disponible (inventario, copias de seguridad, catálogo…): vuelva a intentarlo. |
| 503 | server_maintenance |
Servidor anfitrión en una intervención anunciada por LWS e inaccesible: se rechazan las escrituras y las lecturas en el hipervisor hasta el fin previsto (maintenance); respete Retry-After. |
Cuotas
Las llamadas se limitan por cuenta, en una ventana deslizante de una hora, según tres familias independientes:
| Familia | Límite | Operaciones afectadas |
|---|---|---|
read |
3600 llamadas por hora | Todas las consultas (GET) |
mutation |
300 llamadas por hora | Las escrituras habituales |
heavy |
6 llamadas por hora por VPS, 60 por cuenta | Snapshots (crear, restaurar, eliminar), copias de seguridad (lanzar, restaurar), reinstalación |
Una operación pesada está sujeta a dos límites: el del VPS afectado y el de la cuenta. El límite por VPS evita que un mismo servidor se solicite en bucle, sin penalizar a las cuentas con muchos VPS; el mensaje de rechazo indica cuál de los dos límites se ha alcanzado.
Para no sobrecargar los hipervisores, el estado y las métricas instantáneas de un VPS se almacenan en caché durante 15 segundos, y el historial de métricas entre 1 minuto y 1 hora según el período. Consultar con más frecuencia devuelve el mismo valor y consume cuota sin aportar nada.
Las respuestas a las llamadas autenticadas indican el estado de la cuota en los encabezados X-RateLimit-Limit, X-RateLimit-Remaining y X-RateLimit-Reset. Una llamada autenticada pero rechazada (parámetro no válido, nivel insuficiente, conflicto…) también consume cuota; una llamada rechazada en la autenticación, dirigida a una ruta inexistente o rechazada por exceso de cuota (429) no la consume. Una vez alcanzado el límite, la API responde 429 rate_limited: espere el número de segundos indicado en el encabezado Retry-After antes de volver a intentarlo.