Per iniziare
Introduzione
L'API Panel KVM consente di gestire in modo programmatico i VPS KVM del Suo account LWS: inventario, monitoraggio, alimentazione, reinstallazione, snapshot, backup, firewall, rete e chiavi SSH. Offre le stesse funzioni del pannello clienti KVM, per i Suoi script, la Sua integrazione continua o il Suo monitoraggio.
Avvio rapido
1. Crei la Sua chiave API. Nel pannello KVM, apra la pagina API / MCP, riservata all'account principale. Indichi l'indirizzo IP da cui partiranno le Sue chiamate, attivi l'accesso, generi la chiave, quindi scelga i VPS che potrà gestire: tutti o una selezione. Una chiave che non copre ancora alcun VPS funziona, ma il suo elenco di VPS è vuoto. La chiave viene mostrata per intero una sola volta: la copi subito.
2. La salvi in una variabile d'ambiente, come fanno tutti gli esempi di questa documentazione:
export LWS_API_KEY="lws_live_sk_7Yc2Kp9RtNwQ4mZ8Bx3Vf1Hd6Ls0AjE2"
3. Verifichi che funzioni:
curl https://panelkvm.lwspanel.com/api/v1/me \
-H "Authorization: Bearer $LWS_API_KEY"
La risposta indica l'account, il livello di permessi della chiave e il numero di VPS che copre.
4. Elenchi i Suoi VPS:
curl https://panelkvm.lwspanel.com/api/v1/servers \
-H "Authorization: Bearer $LWS_API_KEY"
Ogni VPS è identificato dal suo vmid, che riutilizzerà in tutte le altre chiamate.
5. Avvii un'azione e ne segua l'avanzamento. Riavvii 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 risposta contiene un task ("id": "tsk_000002e1"). Lo interroghi finché il suo stato non è succeeded:
curl https://panelkvm.lwspanel.com/api/v1/tasks/tsk_000002e1 \
-H "Authorization: Bearer $LWS_API_KEY"
Autenticazione
Ogni richiesta trasmette la chiave nell'intestazione Authorization, secondo lo schema Bearer. Non la inserisca mai in un URL: i log di accesso conservano gli indirizzi.
La chiave si configura dalla pagina API / MCP del pannello:
- Indirizzi autorizzati (obbligatorio): IPv4, IPv6 o intervalli CIDR. L'accesso non può essere attivato senza almeno un indirizzo. Una chiamata proveniente da un altro indirizzo viene rifiutata (
403 ip_not_allowed). - Attivazione: un interruttore disattiva l'accesso senza eliminare la chiave (
401 access_disabled). - Rigenerazione: una nuova chiave invalida immediatamente quella precedente e il titolare dell'account ne viene informato via e-mail.
Permessi e ambito
Ogni chiave riceve un livello di permessi:
| Livello | Valore | Cosa consente |
|---|---|---|
| Sola lettura | read |
Tutte le consultazioni: inventario, stato, metriche, elenchi, task, registro attività. |
| Operatività | exploitation |
Sola lettura, più: alimentazione, creazione di snapshot e di backup, immagini ISO, DNS inverso, chiavi SSH, creazione e modifica di set di regole, applicazione di un set, attivazione del firewall, richiesta di sblocco della porta 25. |
| Completo | full |
Operatività, più le operazioni irreversibili o che espongono il server: reinstallazione, modalità rescue, password root, ripristino ed eliminazione di snapshot, ripristino di backup, disattivazione del firewall, rimozione ed eliminazione di set di regole. |
Il livello richiesto è indicato all'inizio di ogni operazione. Una chiamata che supera il livello concesso viene rifiutata (403 insufficient_scope) e la risposta indica il livello necessario in required_level.
Il livello si sceglie nella pagina API / MCP del pannello. Il passaggio al livello Completo deve essere confermato con un codice inviato via e-mail al titolare dell'account; il ritorno a un livello inferiore non lo richiede.
L'ambito della chiave copre tutti i VPS dell'account, compresi quelli acquistati in seguito, oppure una selezione di VPS. Un VPS fuori ambito risponde esattamente come un VPS inesistente (404 vm_not_found).
Richieste e risposte
- Gli scambi avvengono in JSON, con codifica UTF-8. I corpi delle richieste vanno inviati con
Content-Type: application/json. - Una risorsa viene restituita in
data. - Un elenco viene restituito in
data, accompagnato da un bloccometa. Gli elenchi lunghi (VPS, task, registro attività) sono paginati conpage(predefinito1) eper_page(predefinito25, al massimo100); gli elenchi brevi vengono restituiti per intero. - Le date seguono il formato ISO 8601 con fuso orario:
2027-03-14T00:00:00+01:00. - I volumi sono espressi in byte, ad eccezione di
min_memory_gbnel catalogo dei sistemi. - Gli identificativi sono stringhe,
vmidcompreso:"116807". Soloaccount_id, inGET /me, è un numero. - Ogni risposta include un'intestazione
X-Request-Id. La comunichi al supporto LWS per qualsiasi segnalazione: consente di ritrovare la chiamata esatta.
{
"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 }
}
Operazioni asincrone
Le operazioni contrassegnate da [Differed] (avvio, reinstallazione, snapshot, backup, firewall…) non vengono eseguite durante la richiesta: vengono messe in coda e rispondono 202 Accepted con il task creato.
{
"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
}
]
}
}
Segua poi il task con Consultare un task, a intervalli di qualche secondo, finché status non vale succeeded o failed. Interrogarlo più spesso non accelera nulla e consuma la Sua quota.
Su un VPS può essere eseguita una sola operazione dello stesso tipo alla volta: una seconda richiesta viene rifiutata (409 task_already_running) e la risposta indica il task in corso in task_id.
Anche un VPS bloccato dall'hypervisor rifiuta le scritture (409 server_locked). Il campo reason indica cosa fare: operation_in_progress, è in corso un'operazione, riprovi dopo il tempo indicato dall'intestazione Retry-After; suspended, il VPS è in ibernazione, lo avvii prima; support_notified, il blocco è anomalo, il team LWS è stato avvisato e sta intervenendo, è inutile riprovare a ripetizione.
Durante un intervento annunciato da LWS sul server host di un VPS (aggiornamento, riavvio…), se tale server non risponde più, le scritture su quel VPS e le letture che interrogano l'hypervisor vengono rifiutate (503 server_maintenance). Il campo maintenance della risposta ne precisa la natura e la fine prevista, e l'intestazione Retry-After il tempo consigliato prima di riprovare. L'inventario e la scheda del VPS continuano a rispondere, con status: maintenance.
Le altre scritture (immagini ISO, DNS inverso, password root, chiavi SSH, set di regole) sono immediate e restituiscono direttamente il loro risultato.
Errori
Gli errori vengono restituiti nel 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"
}
Basi la Sua gestione su code, che è stabile. detail è destinato a un essere umano e può cambiare. A seconda dell'errore, la risposta contiene anche errors (dettaglio per parametro), required_level, task_id, lock e reason, oppure retry_after.
| HTTP | Codice | Causa |
|---|---|---|
| 400 | bad_request |
Corpo illeggibile (JSON non valido). |
| 400 | validation_failed |
Parametro non valido; errors descrive ogni campo errato. |
| 401 | invalid_token |
Intestazione Authorization assente o non valida, chiave sconosciuta o rigenerata nel frattempo. |
| 401 | access_disabled |
Accesso API disattivato per questo account (interruttore della pagina «API / MCP») o servizio API temporaneamente non disponibile. |
| 403 | ip_not_allowed |
Indirizzo di origine assente dagli indirizzi autorizzati. |
| 403 | insufficient_scope |
Livello della chiave insufficiente; required_level indica il livello necessario. |
| 404 | vm_not_found |
VPS inesistente o fuori dall'ambito della chiave (i due casi sono volutamente indistinguibili). |
| 404 | snapshot_not_found, backup_not_found, set_not_found, ssh_key_not_found, task_not_found |
Risorsa sconosciuta su questo VPS o su questo account. |
| 404 | not_found |
Percorso inesistente. |
| 405 | method_not_allowed |
Metodo non previsto su un percorso esistente; l'intestazione Allow elenca i metodi accettati. |
| 409 | task_already_running |
Un'operazione dello stesso tipo è già in corso su questo VPS; task_id la indica. |
| 409 | server_locked |
VPS bloccato dall'hypervisor; reason indica se riprovare, avviarlo o attendere il team LWS. |
| 409 | service_suspended |
VPS disattivato o scaduto: le letture restano possibili, le scritture no. |
| 409 | invalid_state |
Azione incompatibile con lo stato attuale. |
| 409 | quota_exceeded |
Limite funzionale raggiunto (3 snapshot, 10 set di regole per VPS). |
| 422 | unsupported_operation |
Funzione non disponibile su questo VPS (in particolare, agente QEMU assente). |
| 429 | rate_limited |
Quota di chiamate superata: rispetti Retry-After. |
| 500 | internal_error |
Errore imprevisto: trasmetta il request_id al supporto. |
| 502 | hypervisor_unreachable |
Hypervisor momentaneamente irraggiungibile: riprovi. |
| 502 | upstream_unavailable |
Dipendenza interna non disponibile (inventario, backup, catalogo…): riprovi. |
| 503 | server_maintenance |
Server host in intervento annunciato da LWS e irraggiungibile: scritture e letture sull'hypervisor rifiutate fino alla fine prevista (maintenance); rispetti Retry-After. |
Quote
Le chiamate sono limitate per account, su una finestra mobile di un'ora, secondo tre famiglie indipendenti:
| Famiglia | Limite | Operazioni interessate |
|---|---|---|
read |
3.600 chiamate all'ora | Tutte le consultazioni (GET) |
mutation |
300 chiamate all'ora | Le scritture ordinarie |
heavy |
6 chiamate all'ora per VPS, 60 per account | Snapshot (creare, ripristinare, eliminare), backup (avviare, ripristinare), reinstallazione |
Un'operazione pesante è soggetta a due limiti: quello del VPS interessato e quello dell'account. Il limite per VPS evita che uno stesso server venga sollecitato in loop, senza penalizzare gli account con molti VPS; il messaggio di rifiuto indica quale dei due limiti è stato raggiunto.
Per non sovraccaricare gli hypervisor, lo stato e le metriche istantanee di un VPS vengono memorizzati nella cache per 15 secondi, e la cronologia delle metriche da 1 minuto a 1 ora a seconda del periodo. Interrogare più spesso restituisce lo stesso valore e consuma quota senza alcun vantaggio.
Le risposte alle chiamate autenticate indicano lo stato della quota nelle intestazioni X-RateLimit-Limit, X-RateLimit-Remaining e X-RateLimit-Reset. Anche una chiamata autenticata ma rifiutata (parametro non valido, livello insufficiente, conflitto…) consuma credito; una chiamata respinta in fase di autenticazione, diretta a un percorso inesistente o rifiutata per superamento della quota (429) non ne consuma. Una volta raggiunto il limite, l'API risponde 429 rate_limited: attenda il numero di secondi indicato dall'intestazione Retry-After prima di riprovare.