Coloca um servidor na rede
POST /cloud/network/private-networks/{id}/servers
Escopo do token: networks:write · aceita Idempotency-Key. Recurso: Redes privadas.
Só servidores da mesma região (422 cloud.other_region), numa região com switch_automated (409 cloud.private_networks_unavailable fora dela). O servidor recebe um endereço sugerido da sub-rede e o job cloud-network leva a VLAN à porta do switch dele (connecting → active ou failed, com a resposta do switch em apply_error). Colocar de novo um servidor failed tenta outra vez. 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/network/private-networks/b7ad1a4c-5186-49fc-a761-c6de92f6ceea/servers" \ -H "Authorization: Bearer $HALVER_API_TOKEN" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: $(uuidgen)" \ -d '{ "server_id": "307d7f63-0f00-4d4b-bc28-839d359e13a3"}'package main
import ( "crypto/rand" "fmt" "io" "net/http" "os" "strings" "time")
func main() { body := strings.NewReader(`{ "server_id": "307d7f63-0f00-4d4b-bc28-839d359e13a3"}`) req, err := http.NewRequest(http.MethodPost, "https://dash.halver.com.br/api/v1/cloud/network/private-networks/b7ad1a4c-5186-49fc-a761-c6de92f6ceea/servers", 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/network/private-networks/b7ad1a4c-5186-49fc-a761-c6de92f6ceea/servers", 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={ "server_id": "307d7f63-0f00-4d4b-bc28-839d359e13a3", }, 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:
b7ad1a4c-5186-49fc-a761-c6de92f6ceea.
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.
-
server_idstring (uuid) obrigatório
{ "server_id": "307d7f63-0f00-4d4b-bc28-839d359e13a3"}Respostas
Seção intitulada “Respostas”Rede privada.
Campos da resposta
-
apply_errorstring obrigatório -
created_atstring (date-time) obrigatório -
descriptionstring obrigatório -
idstring (uuid) obrigatório -
regionobject obrigatório-
codestring obrigatório -
idstring (uuid) obrigatório -
namestring obrigatório
-
-
serversarray de object obrigatório-
addressstring obrigatórioEndereço sugerido ao servidor na sub-rede.
-
apply_errorstring obrigatórioÚltima resposta do switch a uma mudança que não passou (“” quando nenhuma).
-
hostnamestring obrigatório -
idstring (uuid) obrigatório -
server_idstring (uuid) obrigatório -
statusstring obrigatórioA porta do switch do servidor, configurada pelo job
cloud-network: connecting = a VLAN indo para a porta; failed = o switch recusou ou não aplicou a tempo; removing = a VLAN saindo da porta. Um de:connecting,active,failed,removing.
-
-
statusstring obrigatórioUm de:
configuring,active,deleting,failed. -
subnetstring obrigatórioSub-rede da rede (ex. 10.240.0.0/24).
-
vlan_idinteger obrigatórioVID que o cliente configura no sistema (802.1Q).
{ "apply_error": "", "created_at": "2026-10-20T18:00:00Z", "description": "Banco de dados", "id": "b7ad1a4c-5186-49fc-a761-c6de92f6ceea", "region": { "code": "br-mg-1", "id": "8c48d558-f6ba-472a-b7f4-e834d7d06d10", "name": "Minas Gerais" }, "servers": [ { "address": "198.51.100.20", "apply_error": "", "hostname": "web-01", "id": "6b7b19c5-375a-43fa-a24b-74fc1462808d", "server_id": "307d7f63-0f00-4d4b-bc28-839d359e13a3", "status": "connecting" } ], "status": "active", "subnet": "10.20.30.0/24", "vlan_id": 3001}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). | private_network.not_found |
| 409 | Conflito (unicidade ou operação concorrente em andamento). | idempotency.in_progress, cloud.private_networks_unavailable |
| 422 | Entrada válida, mas viola uma regra de negócio. | idempotency.key_reused, cloud.other_region |
{ "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "o token não tem o escopo networks:write; crie um token com esse escopo em Desenvolvedores › Tokens de API", "code": "api_token.insufficient_scope", "request_id": "6f1c0b2a9e4d7c3b5a8f0e1d"}