Primeiros passos
Introdução
A API Panel KVM permite gerir por programação os VPS KVM da sua conta LWS: inventário, monitorização, alimentação, reinstalação, snapshots, cópias de segurança, firewall, rede e chaves SSH. Reproduz o que o painel de cliente KVM permite fazer, para os seus scripts, a sua integração contínua ou a sua monitorização.
Início rápido
1. Crie a sua chave de API. No painel KVM, abra a página API / MCP, reservada à conta principal. Indique o endereço IP a partir do qual serão feitas as suas chamadas, ative o acesso, gere a chave e, em seguida, escolha os VPS que ela poderá gerir: todos ou uma seleção. Uma chave que ainda não abrange nenhum VPS funciona, mas a sua lista de VPS está vazia. A chave só é apresentada por inteiro uma única vez: copie-a de imediato.
2. Guarde-a numa variável de ambiente, tal como fazem todos os exemplos desta documentação:
export LWS_API_KEY="lws_live_sk_7Yc2Kp9RtNwQ4mZ8Bx3Vf1Hd6Ls0AjE2"
3. Verifique se funciona:
curl https://panelkvm.lwspanel.com/api/v1/me \
-H "Authorization: Bearer $LWS_API_KEY"
A resposta indica a conta, o nível de permissão da chave e o número de VPS que ela abrange.
4. Liste os seus VPS:
curl https://panelkvm.lwspanel.com/api/v1/servers \
-H "Authorization: Bearer $LWS_API_KEY"
Cada VPS é identificado pelo seu vmid, que irá reutilizar em todas as outras chamadas.
5. Execute uma ação e acompanhe-a. Reinicie um 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"}'
A resposta contém uma tarefa ("id": "tsk_000002e1"). Consulte-a até o seu estado ser succeeded:
curl https://panelkvm.lwspanel.com/api/v1/tasks/tsk_000002e1 \
-H "Authorization: Bearer $LWS_API_KEY"
Autenticação
Cada pedido transporta a chave no cabeçalho Authorization, segundo o esquema Bearer. Nunca a transmita num URL: os registos de acesso guardam os endereços.
A chave configura-se na página API / MCP do painel:
- Endereços autorizados (obrigatório): IPv4, IPv6 ou intervalos CIDR. O acesso não pode ser ativado sem pelo menos um endereço. Uma chamada proveniente de outro endereço é recusada (
403 ip_not_allowed). - Ativação: um interruptor corta o acesso sem eliminar a chave (
401 access_disabled). - Regeneração: uma nova chave invalida a anterior de imediato, e o titular da conta é avisado por e-mail.
Permissões e âmbito
Cada chave recebe um nível de permissão:
| Nível | Valor | O que autoriza |
|---|---|---|
| Apenas leitura | read |
Todas as consultas: inventário, estado, métricas, listas, tarefas, registo de atividade. |
| Operação | exploitation |
Apenas leitura, mais: alimentação, criação de snapshot e de cópia de segurança, imagens ISO, DNS reverso, chaves SSH, criação e modificação de conjuntos de regras, aplicação de um conjunto, ativação da firewall, pedido de desbloqueio da porta 25. |
| Completo | full |
Operação, mais as operações irreversíveis ou que expõem o servidor: reinstalação, modo de resgate, palavra-passe root, restauro e eliminação de snapshot, restauro de cópia de segurança, desativação da firewall, remoção e eliminação de conjuntos de regras. |
O nível exigido figura no início de cada operação. Uma chamada acima do nível concedido é recusada (403 insufficient_scope), e a resposta indica o nível exigido em required_level.
O nível escolhe-se na página API / MCP do painel. A passagem para o nível Completo tem de ser confirmada por um código enviado por e-mail ao titular da conta; regressar a um nível inferior não o exige.
O âmbito da chave abrange todos os VPS da conta, incluindo os adquiridos posteriormente, ou uma seleção de VPS. Um VPS fora do âmbito responde exatamente como um VPS inexistente (404 vm_not_found).
Pedidos e respostas
- As trocas fazem-se em JSON, codificado em UTF-8. Os corpos dos pedidos são enviados com
Content-Type: application/json. - Um recurso é devolvido em
data. - Uma lista é devolvida em
data, acompanhada de um blocometa. As listas longas (VPS, tarefas, registo de atividade) são paginadas porpage(predefinição1) eper_page(predefinição25, no máximo100); as listas curtas são devolvidas na totalidade. - As datas seguem o formato ISO 8601 com fuso horário:
2027-03-14T00:00:00+01:00. - Os volumes são expressos em bytes, com exceção de
min_memory_gbno catálogo de sistemas. - Os identificadores são cadeias de caracteres, incluindo
vmid:"116807". Apenasaccount_id, emGET /me, é um número. - Cada resposta inclui um cabeçalho
X-Request-Id. Comunique-o ao suporte LWS em qualquer reporte: permite encontrar a chamada exata.
{
"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 }
}
Operações assíncronas
As operações marcadas com [Differed] (arranque, reinstalação, snapshot, cópia de segurança, firewall…) não são executadas durante o pedido: são colocadas em fila e respondem 202 Accepted com a tarefa criada.
{
"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
}
]
}
}
Acompanhe depois a tarefa com Consultar uma tarefa, a cada poucos segundos, até status ser succeeded ou failed. Consultar com mais frequência não acelera nada e consome a sua quota.
Só pode ser executada uma operação do mesmo tipo de cada vez num VPS: um segundo pedido é recusado (409 task_already_running) e a resposta indica a tarefa em curso em task_id.
Um VPS bloqueado pelo hipervisor também recusa as escritas (409 server_locked). O campo reason indica o que fazer: operation_in_progress, há uma operação em curso, tente novamente após o prazo do cabeçalho Retry-After; suspended, o VPS está em hibernação, inicie-o primeiro; support_notified, o bloqueio é anómalo, a equipa LWS foi avisada e está a intervir, não vale a pena tentar repetidamente.
Durante uma intervenção anunciada pela LWS no servidor anfitrião de um VPS (atualização, reinício…), se esse servidor deixar de responder, as escritas nesse VPS e as leituras que consultam o hipervisor são recusadas (503 server_maintenance). O campo maintenance da resposta indica a sua natureza e o fim previsto, e o cabeçalho Retry-After o prazo aconselhado antes de tentar novamente. O inventário e a ficha do VPS continuam a responder, com status: maintenance.
As restantes escritas (imagens ISO, DNS reverso, palavra-passe root, chaves SSH, conjuntos de regras) são imediatas e devolvem diretamente o seu resultado.
Erros
Os erros são devolvidos no 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"
}
Baseie o seu tratamento em code, que é estável. detail destina-se a um humano e pode mudar. Consoante o erro, a resposta inclui também errors (detalhe por parâmetro), required_level, task_id, lock e reason, ou retry_after.
| HTTP | Código | Causa |
|---|---|---|
| 400 | bad_request |
Corpo ilegível (JSON mal formado). |
| 400 | validation_failed |
Parâmetro inválido; errors detalha cada campo incorreto. |
| 401 | invalid_token |
Cabeçalho Authorization ausente ou mal formado, chave desconhecida ou entretanto regenerada. |
| 401 | access_disabled |
Acesso à API cortado para esta conta (interruptor da página «API / MCP»), ou serviço de API temporariamente indisponível. |
| 403 | ip_not_allowed |
Endereço de origem ausente dos endereços autorizados. |
| 403 | insufficient_scope |
Nível da chave insuficiente; required_level indica o nível exigido. |
| 404 | vm_not_found |
VPS inexistente ou fora do âmbito da chave (os dois casos são propositadamente indistinguíveis). |
| 404 | snapshot_not_found, backup_not_found, set_not_found, ssh_key_not_found, task_not_found |
Recurso desconhecido neste VPS ou nesta conta. |
| 404 | not_found |
Rota inexistente. |
| 405 | method_not_allowed |
Verbo não previsto num caminho existente; o cabeçalho Allow lista os verbos aceites. |
| 409 | task_already_running |
Já está em curso uma operação do mesmo tipo neste VPS; task_id identifica-a. |
| 409 | server_locked |
VPS bloqueado pelo hipervisor; reason indica se é preciso tentar novamente, iniciá-lo ou aguardar pela equipa LWS. |
| 409 | service_suspended |
VPS desativado ou expirado: as leituras continuam possíveis, as escritas não. |
| 409 | invalid_state |
Ação incompatível com o estado atual. |
| 409 | quota_exceeded |
Limite funcional atingido (3 snapshots, 10 conjuntos de regras por VPS). |
| 422 | unsupported_operation |
Função indisponível neste VPS (nomeadamente, agente QEMU ausente). |
| 429 | rate_limited |
Quota de chamadas excedida: respeite Retry-After. |
| 500 | internal_error |
Erro inesperado: transmita o request_id ao suporte. |
| 502 | hypervisor_unreachable |
Hipervisor momentaneamente inacessível: tente novamente. |
| 502 | upstream_unavailable |
Dependência interna indisponível (inventário, cópias de segurança, catálogo…): tente novamente. |
| 503 | server_maintenance |
Servidor anfitrião em intervenção anunciada pela LWS e inacessível: escritas e leituras no hipervisor recusadas até ao fim previsto (maintenance); respeite Retry-After. |
Quotas
As chamadas são limitadas por conta, numa janela deslizante de uma hora, segundo três famílias independentes:
| Família | Limite | Operações abrangidas |
|---|---|---|
read |
3600 chamadas por hora | Todas as consultas (GET) |
mutation |
300 chamadas por hora | As escritas correntes |
heavy |
6 chamadas por hora por VPS, 60 por conta | Snapshots (criar, restaurar, eliminar), cópias de segurança (iniciar, restaurar), reinstalação |
Uma operação pesada está sujeita a dois limites: o do VPS visado e o da conta. O limite por VPS evita que um mesmo servidor seja solicitado em ciclo, sem penalizar as contas com muitos VPS; a mensagem de recusa indica qual dos dois limites foi atingido.
Para poupar os hipervisores, o estado e as métricas instantâneas de um VPS são guardados em cache durante 15 segundos, e o histórico de métricas entre 1 minuto e 1 hora consoante o período. Consultar com mais frequência devolve o mesmo valor e consome quota sem qualquer benefício.
As respostas às chamadas autenticadas indicam o estado da quota nos cabeçalhos X-RateLimit-Limit, X-RateLimit-Remaining e X-RateLimit-Reset. Uma chamada autenticada mas recusada (parâmetro inválido, nível insuficiente, conflito…) também consome crédito; uma chamada rejeitada na autenticação, dirigida a uma rota inexistente ou recusada por excesso (429) não consome. Atingido o limite, a API responde 429 rate_limited: aguarde o número de segundos indicado pelo cabeçalho Retry-After antes de tentar novamente.