Reinstala um servidor
POST /cloud/servers/{id}/reinstall
Escopo do token: servers:delete · aceita Idempotency-Key · continua em segundo plano. Recurso: Servidores.
Apaga os discos e instala de novo; sistema, chaves e user data opcionais. user_data ausente mantém o do servidor (roda de novo), vazio remove e um documento novo substitui. Aceita Idempotency-Key.
Exemplo de requisição
Seção intitulada “Exemplo de requisição”Os exemplos leem o token da variável de ambiente HALVER_API_TOKEN (um token sc_live_… criado em Desenvolvedores › Tokens de API). Nunca escreva o token no código.
curl -X POST "https://dash.halver.com.br/api/v1/cloud/servers/307d7f63-0f00-4d4b-bc28-839d359e13a3/reinstall" \ -H "Authorization: Bearer $HALVER_API_TOKEN" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: $(uuidgen)" \ -d '{ "os_image_id": "180cadfe-7099-445b-9dce-3a86af179a17", "ssh_key_ids": [ "f14f67d8-9ae9-4217-991b-854a52150ae7" ], "user_data": "#cloud-config\npackages:\n - nginx\nruncmd:\n - systemctl enable --now nginx\n"}'package main
import ( "crypto/rand" "fmt" "io" "net/http" "os" "strings" "time")
func main() { body := strings.NewReader(`{ "os_image_id": "180cadfe-7099-445b-9dce-3a86af179a17", "ssh_key_ids": [ "f14f67d8-9ae9-4217-991b-854a52150ae7" ], "user_data": "#cloud-config\npackages:\n - nginx\nruncmd:\n - systemctl enable --now nginx\n"}`) req, err := http.NewRequest(http.MethodPost, "https://dash.halver.com.br/api/v1/cloud/servers/307d7f63-0f00-4d4b-bc28-839d359e13a3/reinstall", body) if err != nil { panic(err) } req.Header.Set("Authorization", "Bearer "+os.Getenv("HALVER_API_TOKEN")) req.Header.Set("Content-Type", "application/json") // Guarde a chave e repita a mesma numa nova tentativa desta operação. req.Header.Set("Idempotency-Key", rand.Text()) client := &http.Client{Timeout: 30 * time.Second} resp, err := client.Do(req) if err != nil { panic(err) } defer resp.Body.Close() out, err := io.ReadAll(resp.Body) if err != nil { panic(err) } fmt.Println(resp.Status) fmt.Println(string(out))}import osimport uuid
import requests
resp = requests.post( "https://dash.halver.com.br/api/v1/cloud/servers/307d7f63-0f00-4d4b-bc28-839d359e13a3/reinstall", headers={ "Authorization": f"Bearer {os.environ['HALVER_API_TOKEN']}", # Guarde a chave e repita a mesma numa nova tentativa desta operação. "Idempotency-Key": str(uuid.uuid4()), }, json={ "os_image_id": "180cadfe-7099-445b-9dce-3a86af179a17", "ssh_key_ids": [ "f14f67d8-9ae9-4217-991b-854a52150ae7", ], "user_data": "#cloud-config\npackages:\n - nginx\nruncmd:\n - systemctl enable --now nginx\n", }, timeout=30,)resp.raise_for_status()print(resp.json())Parâmetros
Seção intitulada “Parâmetros”Parâmetros do caminho
Seção intitulada “Parâmetros do caminho”-
idstring (uuid) obrigatórioExemplo:
307d7f63-0f00-4d4b-bc28-839d359e13a3.
Cabeçalhos
Seção intitulada “Cabeçalhos”-
Idempotency-KeystringChave de idempotência (draft-ietf-httpapi-idempotency-key-header-07): de 1 a 255 caracteres ASCII visíveis, como string de Structured Field (
"…") ou texto puro; gere uma nova (um UUID) para cada operação. Vale por 24 horas, por conta e credencial (o token, ou o usuário no painel). A mesma chave com a mesma requisição (método, caminho, query e corpo) repete a resposta guardada (status e corpo) comIdempotent-Replayed: true, sem cobrar nem criar de novo; com outra requisição responde 422idempotency.key_reused; enquanto a primeira roda, 409idempotency.in_progresscomRetry-After. Toda resposta fica guardada, inclusive 5xx (uma falha pode vir depois de uma cobrança); só 401, 403, 409 e 429, que dizem que nada rodou, liberam a chave. Uma chave presa por uma requisição que morreu é liberada depois de 10 minutos. Veja Idempotência.
Corpo da requisição
Seção intitulada “Corpo da requisição”application/json, obrigatório.
-
disk_layoutstring pode ser nuloLegado (use storage, que tem precedência): single é o disco padrão (ext4 no Proxmox VE) e raid1 o espelho do primeiro par de discos iguais (ZFS RAID 1 no Proxmox VE). Sem storage nem disk_layout, a reinstalação mantém o armazenamento da última quando o novo sistema o aceita como está, senão usa o padrão do sistema. Um de:
single,raid1,null. -
os_image_idstring (uuid) pode ser nulo -
passwordboolean pode ser nuloGera uma nova senha (enviada por e-mail); ausente mantém a escolha da última instalação.
-
ssh_key_idsarray de string (uuid) pode ser nulo -
storageobjectOs discos do plano (ids de disk_slots), o sistema de arquivos e o nível de RAID. Um pool usa discos iguais (mesmo tipo e tamanho); ext4 e XFS usam um disco; um sistema de imagem usa um disco, ou dois em RAID 1 quando oferece; cada nível do ZFS pede o seu mínimo de discos; a escolha inclui o boot_slot do plano, quando ele existe. Os discos fora da escolha ficam livres.
-
disksarray de string obrigatório -
filesystemstringzfs (padrão no Proxmox VE), ext4 ou xfs; vazio nos sistemas de imagem.
-
raidstringsingle, raid0, raid1, raid10, raidz-1, raidz-2 ou raidz-3; obrigatório no ZFS com mais de um disco.
-
-
user_datastring pode ser nuloAusente ou nulo mantém o user data do servidor; vazio remove; um documento substitui (regras do deploy). Até 90000 caracteres.
{ "os_image_id": "180cadfe-7099-445b-9dce-3a86af179a17", "ssh_key_ids": [ "f14f67d8-9ae9-4217-991b-854a52150ae7" ], "user_data": "#cloud-config\npackages:\n - nginx\nruncmd:\n - systemctl enable --now nginx\n"}Respostas
Seção intitulada “Respostas”Servidor em reinstalação.
Cabeçalhos:
Idempotent-Replayed:truequando a resposta foi repetida de uma requisição anterior com a mesmaIdempotency-Key. Convenção desta API, como a de outras; o rascunho da IETF não define cabeçalho de repetição.Retry-After: Segundos sugeridos até consultar de novo (GET /cloud/operations/{id}ou o recurso): a operação segue em segundo plano e avança a cada 10 s.
Campos da resposta
-
cancel_atstring (date) obrigatório pode ser nuloÚltimo dia da assinatura cancelada (fim do período pago); depois dele a máquina volta ao estoque.
-
contract_idstring (uuid) obrigatório pode ser nulo -
created_atstring (date-time) obrigatório -
descriptionstringDescrição livre do cliente (até 500 caracteres).
-
disk_layoutstring obrigatórioLegado (veja storage) - raid1 quando a última instalação é um RAID 1, senão single. Um de:
single,raid1. -
end_customer_refstring pode ser nuloId do cliente final no sistema do revendedor: agrupa servidores, não é único. Id opaco, sem dado pessoal (nem nome nem CPF), com a mesma regra do
external_id. Nulo quando não informado. -
external_idstring pode ser nuloId do pedido no sistema do revendedor: único na conta entre os servidores não removidos. Id opaco, sem dado pessoal (nem nome nem CPF): de 1 a 128 caracteres entre letras sem acento, números e
. _ : -. Nulo quando não informado. -
first_invoice_idstring (uuid) obrigatório pode ser nuloFatura cobrada na compra.
-
hostnamestring obrigatório -
idstring (uuid) obrigatório -
ipv4string obrigatório -
ipv4_gatewaystring obrigatório -
ipv4_prefixinteger obrigatório -
monthly_centsinteger (int64) obrigatórioO que o servidor custa por mês: a recorrência do contrato dele (com reajustes), não o preço atual do plano, que vale só para servidores novos.
-
operationstring obrigatórioUm de:
deploy,reinstall,wipe,delete,""(vazio). -
operation_idstring (uuid) pode ser nuloA última operação do servidor (deploy, reinstall, wipe ou delete); acompanhe por
GET /cloud/operations/{id}. -
osobject obrigatório-
codestring obrigatório -
familystring obrigatório -
idstring (uuid) obrigatório -
install_methodstring obrigatórioimage grava uma imagem de disco; installer inicia o instalador oficial do sistema (Proxmox VE); none não instala nada (o cliente instala o próprio sistema pela IPMI). Um de:
image,installer,none. -
login_userstring obrigatórioUsuário de acesso ao sistema instalado.
-
namestring obrigatório -
password_requiredboolean obrigatórioO sistema é usado com senha (painel web do Proxmox VE).
-
raid1boolean obrigatórioO sistema instala num espelho (RAID 1) de dois discos iguais.
-
storageobject obrigatórioO que o cliente escolhe nos discos deste sistema. O instalador do Proxmox VE grava ZFS (padrão, recomendado), ext4 ou XFS; ext4 e XFS vão num disco, o ZFS num disco ou nos níveis de RAID. Um sistema de imagem vai num disco (o sistema de arquivos é o da imagem) ou, quando o motor tem a versão dele para espelho, em RAID 1 de dois discos iguais.
-
default_filesystemstring obrigatórioUm de:
zfs,ext4,xfs,""(vazio). -
filesystemsarray de string obrigatórioSistemas de arquivos que o instalador grava; vazio nos sistemas de imagem. Um de:
zfs,ext4,xfs. -
levelsarray de object obrigatório-
even_disksboolean obrigatórioO nível usa discos em pares (RAID 10).
-
filesystemsarray de string obrigatórioSistemas de arquivos que oferecem o nível; vazio nos sistemas de imagem. Um de:
zfs,ext4,xfs. -
levelstring obrigatórioUm de:
single,raid0,raid1,raid10,raidz-1,raidz-2,raidz-3. -
max_disksinteger obrigatório0 é sem limite.
-
min_disksinteger obrigatório
-
-
-
versionstring obrigatório
-
-
password_loginboolean obrigatórioCada instalação gera uma senha e a envia por e-mail.
-
planobject obrigatório-
activeboolean obrigatório -
bandwidth_mbpsinteger obrigatórioLimite de banda; 0 é a porta inteira.
-
boot_slotstringDisco pelo qual o servidor inicia (id de disk_slots): o sistema precisa incluí-lo, sozinho ou num pool de discos iguais. As máquinas iniciam em BIOS legado só pelo primeiro disco. Ausente quando qualquer disco inicia o servidor.
-
codestring obrigatório -
coresinteger obrigatório -
cpustring obrigatório -
cpu_threadsinteger obrigatório -
created_atstring (date-time) obrigatório -
disk_slotsarray de object obrigatórioOs discos do plano um a um, onde o sistema pode ser instalado.
-
idstring obrigatório<tipo>-<GB>-<n>, por exemplo ssd-128-2: o segundo SSD de 128 GB do plano.
-
modelstring obrigatório -
size_gbinteger obrigatório -
typestring obrigatórioUm de:
nvme,ssd,hdd.
-
-
disksarray de object obrigatórioDiscos mínimos que a máquina precisa ter.
-
countinteger obrigatório -
modelstring -
size_gbinteger obrigatório -
typestring obrigatórioUm de:
nvme,ssd,hdd.
-
-
idstring (uuid) obrigatório -
memory_gbinteger obrigatório -
monthly_centsinteger (int64) obrigatório -
namestring obrigatório -
port_speed_mbpsinteger obrigatórioVelocidade da porta entregue.
-
product_idstring (uuid) obrigatório pode ser nulo -
raid1boolean obrigatórioO plano tem dois discos iguais, então o servidor pode espelhá-los (RAID 1).
-
traffic_tbinteger obrigatórioTráfego mensal em TB; 0 é ilimitado.
-
-
powerstring obrigatórioUm de:
on,off,unknown. -
siteobject obrigatório-
activeboolean obrigatório -
citystring obrigatório -
codestring obrigatório -
countrystring obrigatório -
created_atstring (date-time) obrigatório -
idstring (uuid) obrigatório -
namestring obrigatório -
region_idstring (uuid) obrigatórioRegião do local; os IPs das máquinas vêm dos blocos dela.
-
-
ssh_keysinteger obrigatórioQuantidade de chaves instaladas no último deploy.
-
statusstring obrigatórioUm de:
pending_payment,deploying,active,failed,wiping,empty,deleting,deleted. -
stepsarray de object obrigatório-
finished_atstring (date-time) obrigatório pode ser nulo -
messagestring obrigatório -
namestring obrigatórioUm de:
prepare,erase,install,configure,reboot,ready,release. -
started_atstring (date-time) obrigatório pode ser nulo -
statusstring obrigatórioUm de:
pending,running,done,failed.
-
-
storageobject obrigatórioOnde a última instalação pôs o sistema.
-
disksarray de object obrigatório-
idstring obrigatório<tipo>-<GB>-<n>, por exemplo ssd-128-2: o segundo SSD de 128 GB do plano.
-
modelstring obrigatório -
size_gbinteger obrigatório -
typestring obrigatórioUm de:
nvme,ssd,hdd.
-
-
filesystemstring obrigatórioVazio nos sistemas de imagem (o sistema de arquivos é o da imagem). Um de:
zfs,ext4,xfs,""(vazio). -
raidstring obrigatórioUm de:
single,raid0,raid1,raid10,raidz-1,raidz-2,raidz-3. -
summarystring obrigatório
-
-
suspended_atstring (date-time) obrigatório pode ser nuloDesligado por falta de pagamento, com os dados mantidos; volta a ser ligado sozinho quando a fatura é paga. Enquanto isso, power, reinstalação, apagar, cancelar e VPN da IPMI respondem 409
cloud.server_suspended. -
tagsarray de stringTags do cliente, em ordem alfabética e sem repetição.
-
terminated_atstring (date-time) obrigatório pode ser nuloEncerrado na hora pela equipe. O cliente continua vendo a página do servidor (o aviso leva até ela) mesmo depois de removido, só com o texto fixo da categoria.
-
termination_categorystring obrigatórioPor que a equipe encerrou o servidor (vazio quando não foi encerrado pela equipe). Um de:
""(vazio),abuse,fraud,customer_request,internal_test,delinquency,other. -
user_data_sha256string pode ser nuloSHA-256 (hex) do user data das instalações; o conteúdo nunca é devolvido. Nulo sem user data.
-
user_data_sizeintegerTamanho do user data em bytes (0 sem user data).
{ "cancel_at": null, "contract_id": "751e7c9a-fae2-4027-9be3-5728dfce8982", "created_at": "2026-10-20T18:00:00Z", "description": "Servidor de produção", "disk_layout": "raid1", "end_customer_ref": null, "external_id": null, "first_invoice_id": "36d56e13-ffa3-4af3-acc1-14aa538fb0ab", "hostname": "web-01", "id": "307d7f63-0f00-4d4b-bc28-839d359e13a3", "ipv4": "203.0.113.10", "ipv4_gateway": "203.0.113.1", "ipv4_prefix": 29, "monthly_cents": 79900, "operation": "deploy", "operation_id": "38b54c25-1f8d-40fe-8cb1-649ddb710f23", "os": { "code": "ubuntu-24.04", "family": "ubuntu", "id": "180cadfe-7099-445b-9dce-3a86af179a17", "install_method": "image", "login_user": "ubuntu", "name": "Ubuntu 24.04 LTS", "password_required": false, "raid1": true, "storage": { "default_filesystem": "", "filesystems": [], "levels": [ { "even_disks": false, "filesystems": [], "level": "raid1", "max_disks": 2, "min_disks": 2 } ] }, "version": "24.04" }, "password_login": false, "plan": { "active": true, "bandwidth_mbps": 0, "boot_slot": "", "code": "c1.small.ssd", "cores": 4, "cpu": "Intel(R) Xeon(R) CPU E3-1270 v6 @ 3.80GHz", "cpu_threads": 8, "created_at": "2026-10-20T18:00:00Z", "disk_slots": [ { "id": "ssd-128-2", "model": "", "size_gb": 128, "type": "ssd" } ], "disks": [ { "count": 2, "model": "", "size_gb": 128, "type": "ssd" } ], "id": "a30bf51c-7749-4ed5-8983-8201f864273b", "memory_gb": 32, "monthly_cents": 79900, "name": "c1.small.ssd · Supermicro X11", "port_speed_mbps": 1000, "product_id": "a3052a82-1c61-48d1-8feb-612bf80ff949", "raid1": true, "traffic_tb": 0 }, "power": "on", "site": { "active": true, "city": "Varginha", "code": "mg-1", "country": "BR", "created_at": "2026-10-20T18:00:00Z", "id": "4afc7034-1b53-4b2a-bc4c-d831d6e39028", "name": "Minas Gerais 01", "region_id": "7991b4f0-3bd8-47f3-bd3c-30b5d9ac664e" }, "ssh_keys": 1, "status": "active", "steps": [ { "finished_at": null, "message": "", "name": "prepare", "started_at": null, "status": "done" } ], "storage": { "disks": [ { "id": "ssd-128-2", "model": "", "size_gb": 128, "type": "ssd" } ], "filesystem": "", "raid": "raid1", "summary": "ZFS RAID 1 em 2× SSD 128 GB" }, "suspended_at": null, "tags": [ "env=prod" ], "terminated_at": null, "termination_category": "", "user_data_sha256": "9f2c4e1b7a3d5f8e0c6b2a4d8e1f3a5c7b9d0e2f4a6c8e0b1d3f5a7c9e1b3d5f", "user_data_size": 92}Todo erro vem como application/problem+json (RFC 9457), com um code estável, a mensagem em português em detail, o motivo de cada campo em errors (nos erros de validação) e o request_id, que você informa ao suporte. Veja a lista completa de códigos.
| Status | Quando | Códigos |
|---|---|---|
| 400 | Requisição inválida (JSON malformado, campo desconhecido, parâmetro inválido ou falha de validação). | validation_failed, request.invalid_json, idempotency.invalid_key |
| 401 | Não autenticado (token ausente, inválido ou expirado; credenciais inválidas). | auth.unauthorized |
| 403 | Autenticado, mas sem permissão para a área ou a operação. | api_token.insufficient_scope |
| 404 | Recurso não encontrado (ou fora do escopo do usuário). | server.not_found |
| 409 | Conflito (unicidade ou operação concorrente em andamento). | idempotency.in_progress |
| 422 | Entrada válida, mas viola uma regra de negócio. | idempotency.key_reused |
| 503 | Dependência (gateway de pagamento, consulta de CEP) temporariamente indisponível. | — |
{ "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "o token não tem o escopo servers:delete; crie um token com esse escopo em Desenvolvedores › Tokens de API", "code": "api_token.insufficient_scope", "request_id": "6f1c0b2a9e4d7c3b5a8f0e1d"}