Tudo o que você faz clicando no painel — ligar o servidor, mandar um comando no console, editar um arquivo — também pode ser feito por uma requisição HTTP. É o que permite um bot de Discord reiniciar o servidor de Minecraft com um comando, um script religar o servidor se ele cair ou uma rotina salvar um arquivo de configuração todo dia.
Este guia mostra como criar a chave que dá esse acesso e como usá-la nas operações mais comuns.
A chave age em nome da sua conta. Ela não tem permissões separadas: o que você pode fazer no painel, ela também pode, em todos os servidores da conta. As operações mais usadas são:
say, whitelist add ou save-all.bot do discord. São pelo menos 4 caracteres, e é esse nome que vai te dizer, meses depois, qual chave apagar.A janela Sua Chave API mostra a chave completa, que começa com ptlc_. Copie e guarde num lugar seguro: ela não é mostrada de novo. Se perder, apague a chave e crie outra.
Cada chamada precisa dizer em qual servidor agir. O identificador aparece na barra de endereço quando você abre o servidor no painel:
https://app.redhosting.com.br/server/1a2b3c4d
O identificador é a parte depois de /server/ — no exemplo, 1a2b3c4d. Os exemplos abaixo usam SEU_SERVIDOR no lugar dele e SUA_CHAVE no lugar da chave.
Toda requisição leva três cabeçalhos: a chave, e a indicação de que a conversa é em JSON. Este comando lista os servidores da conta e confirma que a chave funciona:
curl https://app.redhosting.com.br/api/client \
-H "Authorization: Bearer SUA_CHAVE" \
-H "Accept: application/json"
A resposta traz um item para cada servidor. O campo identifier de cada um é o mesmo identificador do passo anterior.
curl https://app.redhosting.com.br/api/client/servers/SEU_SERVIDOR/resources \
-H "Authorization: Bearer SUA_CHAVE" \
-H "Accept: application/json"
O campo current_state diz o estado: running, starting, stopping ou offline. Em resources vêm a memória e o disco em bytes e a CPU em porcentagem.
curl -X POST https://app.redhosting.com.br/api/client/servers/SEU_SERVIDOR/power \
-H "Authorization: Bearer SUA_CHAVE" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"signal": "restart"}'
O signal aceita start, stop, restart e kill. Prefira stop: ele desliga com calma e deixa o servidor salvar o que está em memória. O kill corta na hora, como tirar da tomada, e pode corromper o mundo ou arquivos abertos.
curl -X POST https://app.redhosting.com.br/api/client/servers/SEU_SERVIDOR/command \
-H "Authorization: Bearer SUA_CHAVE" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"command": "say Reinicio em 5 minutos"}'
O comando vai para o console exatamente como se você tivesse digitado lá. O servidor precisa estar ligado; desligado, a resposta é erro 502.
Para listar uma pasta:
curl "https://app.redhosting.com.br/api/client/servers/SEU_SERVIDOR/files/list?directory=/" \
-H "Authorization: Bearer SUA_CHAVE" \
-H "Accept: application/json"
Para ler um arquivo — a resposta é o conteúdo puro, não JSON:
curl "https://app.redhosting.com.br/api/client/servers/SEU_SERVIDOR/files/contents?file=/server.properties" \
-H "Authorization: Bearer SUA_CHAVE"
Para gravar, o corpo da requisição é o novo conteúdo inteiro do arquivo, que é substituído:
curl -X POST "https://app.redhosting.com.br/api/client/servers/SEU_SERVIDOR/files/write?file=/motd.txt" \
-H "Authorization: Bearer SUA_CHAVE" \
-H "Accept: application/json" \
--data-binary @motd.txt
Resumo dos endereços. Todos começam com https://app.redhosting.com.br/api/client/servers/SEU_SERVIDOR:
| Ação | Método | Endereço |
|---|---|---|
| Estado e consumo | GET | /resources |
| Ligar, desligar, reiniciar | POST | /power |
| Comando no console | POST | /command |
| Listar pasta | GET | /files/list?directory=/ |
| Ler arquivo | GET | /files/contents?file=/caminho |
| Gravar arquivo | POST | /files/write?file=/caminho |
| Listar backups | GET | /backups |
Um script em Node.js (versão 18 ou mais nova) que confere o estado e liga o servidor quando o encontra desligado. A chave vem de uma variável de ambiente, e não escrita no código — é assim que ela não vai parar no GitHub junto com o resto.
const PAINEL = 'https://app.redhosting.com.br/api/client';
const SERVIDOR = 'SEU_SERVIDOR';
const cabecalhos = {
Authorization: `Bearer ${process.env.PAINEL_API_KEY}`,
Accept: 'application/json',
'Content-Type': 'application/json',
};
async function conferir() {
const resposta = await fetch(`${PAINEL}/servers/${SERVIDOR}/resources`, { headers: cabecalhos });
if (!resposta.ok) throw new Error(`API respondeu ${resposta.status}`);
const { attributes } = await resposta.json();
if (attributes.current_state === 'offline') {
await fetch(`${PAINEL}/servers/${SERVIDOR}/power`, {
method: 'POST',
headers: cabecalhos,
body: JSON.stringify({ signal: 'start' }),
});
console.log('Servidor estava desligado — ligando.');
}
}
conferir().catch((erro) => console.error(erro.message));
Rodando a cada poucos minutos, por um agendamento do sistema, ele religa o servidor depois de uma queda. Não rode em intervalo curto demais: veja o limite de requisições na próxima seção.
| Resposta | O que significa | O que fazer |
|---|---|---|
| 401 | A chave não foi aceita. | Confira se copiou a chave inteira, com o ptlc_, e se o cabeçalho é Authorization: Bearer. Uma chave apagada no painel para de funcionar na hora. |
| 403 | A chave funciona, mas não aqui. | O IP de onde a requisição saiu não está em IPs Permitidos, ou sua conta é subusuária do servidor sem a permissão dessa ação. |
| 404 | Servidor ou arquivo não encontrado. | Confira o identificador de 8 caracteres e o caminho do arquivo, que começa com /. |
| 409 | O servidor não pode fazer isso agora. | Ele está instalando, sendo transferido ou suspenso. Espere terminar. |
| 429 | Requisições demais. | O painel aceita até 256 requisições por minuto por conta. Espace as chamadas. |
| 502 | O servidor precisa estar ligado. | Acontece ao enviar comando com o servidor desligado. Ligue antes. |
.env que esteja no .gitignore, nunca dentro do código.Antes de colocar o script para rodar
stop, e não kill, para desligar.
/server/.