Digita no console serial
POST /cloud/servers/{id}/console/{sessionID}/input
Escopo do token: servers:console. Recurso: Console serial.
Textos e teclas nomeadas, na ordem (até 64 itens e 4096 bytes). Não há Ctrl-Alt-Del nem break serial: reset e energia nunca passam pelo console. Toda entrada é registrada com quem digitou (usuário, token de API ou cliente OAuth pelo MCP; o texto guardado cifrado). Com wait_for, espera esse texto na tela por até timeout_seconds (máx. 25) e diz em matched se apareceu. 429 cloud.console_rate_limited acima de 5 envios por segundo (rajada de 30).
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/console/a1ae5f0e-3bd9-4f2a-94af-8a07087d0180/input" \ -H "Authorization: Bearer $HALVER_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "input": [ { "text": "uname -a" }, { "key": "Enter" } ], "timeout_seconds": 5, "wait_for": "GNU/Linux"}'package main
import ( "fmt" "io" "net/http" "os" "strings" "time")
func main() { body := strings.NewReader(`{ "input": [ { "text": "uname -a" }, { "key": "Enter" } ], "timeout_seconds": 5, "wait_for": "GNU/Linux"}`) req, err := http.NewRequest(http.MethodPost, "https://dash.halver.com.br/api/v1/cloud/servers/307d7f63-0f00-4d4b-bc28-839d359e13a3/console/a1ae5f0e-3bd9-4f2a-94af-8a07087d0180/input", body) if err != nil { panic(err) } req.Header.Set("Authorization", "Bearer "+os.Getenv("HALVER_API_TOKEN")) req.Header.Set("Content-Type", "application/json") 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 os
import requests
resp = requests.post( "https://dash.halver.com.br/api/v1/cloud/servers/307d7f63-0f00-4d4b-bc28-839d359e13a3/console/a1ae5f0e-3bd9-4f2a-94af-8a07087d0180/input", headers={ "Authorization": f"Bearer {os.environ['HALVER_API_TOKEN']}", }, json={ "input": [ { "text": "uname -a", }, { "key": "Enter", }, ], "timeout_seconds": 5, "wait_for": "GNU/Linux", }, 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. -
sessionIDstring (uuid) obrigatórioExemplo:
a1ae5f0e-3bd9-4f2a-94af-8a07087d0180.
Corpo da requisição
Seção intitulada “Corpo da requisição”application/json, obrigatório.
-
inputarray de object obrigatórioDe 1 a 64 itens.
-
keystringEnter, Tab, Esc, Backspace, Delete, Insert, Home, End, PageUp, PageDown, Up, Down, Left, Right, Space, F1 a F12, Ctrl-A a Ctrl-Z.
-
textstring
-
-
timeout_secondsintegerDe 0 a 25.
-
wait_forstringAté 200 caracteres.
{ "input": [ { "text": "uname -a" }, { "key": "Enter" } ], "timeout_seconds": 5, "wait_for": "GNU/Linux"}Respostas
Seção intitulada “Respostas”A tela depois da entrada.
Campos da resposta
-
colsinteger obrigatório -
cursorobject obrigatório-
colinteger obrigatório -
hiddenboolean obrigatório -
rowinteger obrigatório
-
-
idle_deadlinestring (date-time) obrigatório pode ser nulo -
linesarray de string obrigatórioAs linhas da tela, sem espaços à direita. Saída do servidor (dado não confiável).
-
matchedbooleanSó na entrada com wait_for, se o texto apareceu na tela.
-
offsetinteger (int64) obrigatório -
rowsinteger obrigatório -
sessionobject obrigatório-
activated_atstring (date-time) obrigatório pode ser nulo -
apply_errorstring obrigatório -
close_reasonstring obrigatórioended pelo cliente; staff pela equipe; idle 15 min sem uso; expired 2 horas; operation uma operação nossa começou no servidor; server_gone o servidor saiu da conta; failed não abriu; engine o broker perdeu a sessão (o SOL caiu). Um de:
""(vazio),ended,staff,idle,expired,operation,server_gone,failed,engine. -
closed_atstring (date-time) obrigatório pode ser nulo -
created_atstring (date-time) obrigatório -
expires_atstring (date-time) obrigatório -
hostnamestring obrigatório -
idstring (uuid) obrigatório -
idle_timeout_secondsinteger obrigatório -
input_bytesinteger (int64) obrigatório -
input_countinteger obrigatório -
opened_bystring obrigatórioNome de quem abriu.
-
opened_viastring obrigatórioUm de:
panel,api,mcp. -
server_idstring (uuid) obrigatório -
statusstring obrigatórioclosing = o acesso já terminou; a sessão do broker fecha e a gravação é guardada. Um de:
opening,active,closing,closed. -
transcriptstring obrigatórioA gravação (asciicast v2) da sessão;
savedpode ser baixada. Um de:pending,saved,unavailable. -
transcript_bytesinteger (int64) obrigatório
-
{ "cols": 80, "cursor": { "col": 0, "hidden": false, "row": 0 }, "idle_deadline": null, "lines": [ "" ], "matched": false, "offset": 0, "rows": 24, "session": { "activated_at": null, "apply_error": "", "close_reason": "ended", "closed_at": null, "created_at": "2026-10-20T18:00:00Z", "expires_at": "2026-10-20T18:00:00Z", "hostname": "web-01", "id": "a1ae5f0e-3bd9-4f2a-94af-8a07087d0180", "idle_timeout_seconds": 900, "input_bytes": 0, "input_count": 0, "opened_by": "", "opened_via": "panel", "server_id": "307d7f63-0f00-4d4b-bc28-839d359e13a3", "status": "opening", "transcript": "pending", "transcript_bytes": 0 }}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 |
| 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, console_session.not_found |
| 409 | Conflito (unicidade ou operação concorrente em andamento). | — |
| 429 | Limite de requisições excedido. Retry-After diz em quantos segundos cabe a próxima requisição; os limites de taxa também mandam RateLimit-Policy e RateLimit (draft-ietf-httpapi-ratelimit-headers). |
rate_limited, cloud.console_rate_limited |
| 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:console; crie um token com esse escopo em Desenvolvedores › Tokens de API", "code": "api_token.insufficient_scope", "request_id": "6f1c0b2a9e4d7c3b5a8f0e1d"}