API DE IP ADICIONAL PARA REVENDA

Peça, pague e renove IPs adicionais da sua conta Cloud direto do seu sistema: PIX ou crédito, vencimentos, suspensão e webhooks de cada etapa.

API de IP adicional

Visão geral

A API de IP adicional é para revendas Cloud da Vitt Host. Com ela, o seu sistema pede um IPv4 adicional, recebe a cobrança (PIX ou crédito da conta) e, depois do pagamento, o IP entra sozinho na sua conta Cloud do Virtualizor, pronto para usar numa VPS. Cada IP é um serviço mensal: a API também mostra o vencimento, as faturas de renovação, a suspensão por atraso e avisa cada etapa por webhook.

  • Pedido e entrega automáticos: paga a fatura, o IP é comprado, configurado e entregue sem intervenção.
  • PIX na resposta: o pedido já volta com o copia e cola e o QR Code.
  • Renovação: vencimento, valor e fatura em aberto em cada IP, com filtros para o que vence ou está em atraso.
  • Renovação automática com crédito: adicione crédito por PIX e as renovações se pagam sozinhas.
  • Webhooks assinados para pagamento, ativação, vencimento, suspensão e encerramento.

Para usar a API, peça ao suporte a sua chave de API e, se quiser webhooks, informe a URL que vai recebê-los. Junto com a URL você recebe o segredo do webhook, usado para conferir a assinatura.

Início rápido

1. Confira a chave e veja o preço e o seu crédito:

curl
curl -s https://vitthost.com.br/central/api_ips.php/v1/conta \
  -H "Authorization: Bearer $VITT_IP_KEY"

2. Peça um IP. O Idempotency-Key é um valor único seu para este pedido: se a rede cair, reenvie com o mesmo valor e você recebe o mesmo pedido, sem duplicar.

curl
curl -s -X POST https://vitthost.com.br/central/api_ips.php/v1/ips \
  -H "Authorization: Bearer $VITT_IP_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: pedido-cliente-1234-001" \
  -d '{"referencia": "cliente-1234", "pagamento": "pix"}'

3. A resposta (201) traz o pedido com status: "aguardando_pagamento" e o objeto pix. Mostre o copia e cola ou o QR Code ao seu cliente.

4. Quando o PIX for pago, você recebe os webhooks ip.pago e depois ip.ativo. Sem webhook, consulte GET /v1/ips/{id} a cada poucos minutos até status: "ativo". O campo rede traz IP, máscara, gateway e MAC.

Endereço e autenticação

Todas as rotas ficam em:

URL base
https://vitthost.com.br/central/api_ips.php/v1/…

Se o seu cliente HTTP ou proxy não repassar o caminho depois do .php, use o parâmetro rota, que funciona igual: https://vitthost.com.br/central/api_ips.php?rota=/v1/ips. Só HTTPS.

A chave tem o formato vip_<prefixo>_<segredo> e vai em um destes cabeçalhos:

cabeçalhos
Authorization: Bearer vip_xxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# ou, se o seu servidor remove o Authorization:
X-Api-Key: vip_xxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

A chave dá acesso a cobranças da sua conta. Guarde-a no servidor, nunca no navegador ou num app. Se vazar, peça uma nova ao suporte: a antiga para de funcionar na hora.

GET /v1 é público e responde {"api": "ips", "versao": 1, …}. Serve para testar se o endereço e a rota chegam até a API.

Convenções

  • JSON em UTF-8 no corpo das requisições e respostas. Envie Content-Type: application/json nos POST.
  • Valores em dinheiro são texto com duas casas e ponto: "17.00". Moeda em moeda (hoje, BRL).
  • Datas e horas (campos *_em) são ISO 8601 em UTC: 2026-10-17T01:54:10Z.
  • Datas de vencimento (vencimento, suspensao_prevista_em, encerramento_previsto_em) são só a data, AAAA-MM-DD, no horário de Brasília.
  • Erros sempre no formato {"erro": {"codigo": "…", "mensagem": "…"}} com o status HTTP certo. Programe em cima do codigo, que é estável; a mensagem é para pessoas e pode mudar. Veja a lista.
  • Listas vêm em {"dados": [...]}. GET /v1/ips também traz pagina, por_pagina e total.
  • Limites: hoje, 60 requisições por minuto por chave (acima disso, 429 muitas_requisicoes com Retry-After) e um limite de pedidos por 24 horas, que aparece em GET /v1/conta.
  • Idempotência: as rotas que criam cobrança (POST /v1/ips e POST /v1/credito) exigem o cabeçalho Idempotency-Key (1 a 100 caracteres: letras, números, _ - : .). Mesmo valor e mesmo corpo devolvem a mesma resposta (com Idempotent-Replayed: true) por 7 dias; mesmo valor com outro corpo dá 422 idempotencia_conflito. Respostas 5xx não ficam gravadas: repita com a mesma chave.

Ciclo de vida do IP

aguardando_pagamento→provisionando→ativo⇄suspenso→cancelando→cancelado
statusO que significa
aguardando_pagamentoPedido criado, fatura em aberto. Se não for paga no prazo (validade_pedido_h em /v1/conta), o pedido vira expirado e a fatura é cancelada.
provisionandoPago. O IP está sendo comprado e configurado. O campo etapa diz onde está: fila, reserva, entrega, rede, painel. Costuma levar poucos minutos.
ativoIP na sua conta Cloud. rede traz IP, máscara, gateway e MAC.
suspensoFatura de renovação em atraso. Pague para reativar. Veja Renovação.
cancelandoEncerramento em andamento.
canceladoPedido cancelado ou IP encerrado e devolvido.
expiradoA fatura do pedido não foi paga no prazo.
em_analiseNossa equipe está conferindo o pedido e já foi avisada. Nada a fazer do seu lado.
estornadoO valor pago voltou como crédito na sua conta.

Rede do IP: sem vps_id, o IP vem com um MAC virtual próprio (rede.mac): use esse MAC na placa de rede da VPS que for receber o IP. Com vps_id, o IP entra no MAC da própria VPS (rede.mac_da_vps: true): basta adicionar o IP à VPS, sem trocar a placa de rede.

Renovação e vencimento

Cada IP ativo é cobrado por mês. Todo IP ativo ou suspenso traz o campo vencimento e o objeto renovacao:

  1. Alguns dias antes do vencimento (hoje, 7) é gerada a fatura de renovação: webhook fatura.gerada, e ela aparece em renovacao.fatura_em_aberto.
  2. Perto do vencimento (hoje, a partir de 3 dias antes): webhook fatura.vencendo.
  3. Passou do vencimento sem pagamento: webhook fatura.vencida; renovacao.em_atraso fica true.
  4. Na data de renovacao.suspensao_prevista_em, o IP é suspenso (ip.suspenso). Conforme a configuração da sua conta, a suspensão também bloqueia todo o tráfego de entrada do IP na rede (ip.bloqueado; campo bloqueio).
  5. Um dia antes de renovacao.encerramento_previsto_em: webhook ip.encerramento_proximo, o último aviso.
  6. Na data de encerramento, o IP é encerrado e devolvido ao data center (ip.cancelado). Isso não tem volta: o mesmo endereço não pode ser recuperado.

Pagar a fatura em qualquer ponto antes do encerramento resolve tudo: o IP volta a ativo (ip.reativado), o bloqueio sai (ip.desbloqueado) e o vencimento passa para o mês seguinte (fatura.paga). Pague pelo PIX (GET /v1/ips/{id}/pix) ou com crédito (POST /v1/faturas/{id}/pagar-com-credito).

As datas de suspensão e encerramento seguem as regras da Vitt Host no momento do cálculo (hoje: suspensão 1 dia e encerramento 6 dias depois do vencimento). Use sempre os campos suspensao_prevista_em e encerramento_previsto_em, em vez de fixar esses números no seu sistema.

Para montar a sua rotina de cobrança, use os filtros:

exemplos
# IPs que vencem nos próximos 7 dias (ordenados pelo vencimento)
GET /v1/ips?vence_em_ate=7

# IPs com renovação em atraso
GET /v1/ips?em_atraso=1

# Faturas vencidas e não pagas
GET /v1/faturas?vencidas=1

Renovação automática com crédito

Com saldo de crédito na conta, as renovações dos IPs se pagam sozinhas:

  1. Crie uma fatura de crédito com POST /v1/credito e pague o PIX que volta na resposta.
  2. Quando o pagamento cai, o valor entra como crédito e, em até 5 minutos, quita as faturas de renovação de IP já em aberto, da que vence primeiro para a última (só as que o saldo cobre por inteiro). Você recebe credito.adicionado com a lista em faturas_pagas, e fatura.paga para cada uma.
  3. As próximas faturas de renovação já nascem pagas com o crédito disponível.

O saldo atual está em GET /v1/credito e em GET /v1/conta.

Conta e locais

GET /v1/conta#

Dados da revenda, crédito, preço do IP e limites.

resposta 200
{
  "revenda": "Sua Empresa LTDA",
  "credito": "34.00",
  "moeda": "BRL",
  "preco_mensal_ip": "17.00",
  "pedidos_24h": 2,
  "limite_diario": 100,
  "webhook": "https://seu-sistema.com.br/webhooks/vitt",
  "validade_pedido_h": 24
}

GET /v1/locais#

Os locais (data centers) que vendem IP adicional. Use o codigo no campo local do pedido; sem local, vale o marcado como padrao.

resposta 200
{
  "dados": [
    { "codigo": "ca-1", "nome": "Canadá 1", "padrao": true }
  ]
}

IPs

POST /v1/ips#

Pede um IP adicional. Exige Idempotency-Key. Cria o pedido e a fatura e responde 201 com o pedido (com o PIX, se pagamento for pix) e o cabeçalho Location: /v1/ips/{id}.

CampoTipoDescrição
referenciatexto (até 64)Seu identificador do pedido (cliente, plano…). Único por revenda: repetir dá 409 referencia_repetida.
pagamentotextopix (padrão) ou credito. Com credito, o valor é debitado na hora do saldo da conta; sem saldo suficiente, 402 credito_insuficiente e nada é criado.
vps_idnúmeroVPS da sua conta Cloud que vai receber o IP. O IP entra no MAC dela. A VPS precisa estar num local que vende IP.
localtextoCódigo de GET /v1/locais. Sem ele, o padrão. Com vps_id, omita: vale o local da VPS.
corpo
{ "referencia": "cliente-1234-vps-88", "pagamento": "pix", "vps_id": 88 }

GET /v1/ips#

Lista os seus pedidos de IP, do mais novo para o mais antigo (com filtro de vencimento, do que vence primeiro).

CampoTipoDescrição
statustextoUm dos status do ciclo de vida.
referenciatextoO pedido com esta referência.
vence_em_atenúmero (0 a 365)Só IPs ativos ou suspensos que vencem em até N dias (inclui os já vencidos).
em_atraso1 ou 0Só IPs com fatura de renovação vencida e não paga.
paginanúmeroPágina, a partir de 1.
por_paginanúmero (1 a 100)Itens por página. Padrão 25.
resposta 200
{ "dados": [ { …pedido… } ], "pagina": 1, "por_pagina": 25, "total": 4 }

GET /v1/ips/{id}#

Um pedido. Se estiver aguardando pagamento por PIX, vem com o PIX.

GET /v1/ips/{id}/pix#

O PIX da fatura em aberto do pedido: a do próprio pedido, se ainda não pago, ou a de renovação que vence primeiro, se o IP está ativo ou suspenso. Chame de novo quando o PIX anterior expirar: um novo é gerado. Sem fatura em aberto: 409 sem_fatura_aberta.

resposta 200
{
  "fatura": { "id": 301, "status": "em_aberto", "total": "17.00", "a_pagar": "17.00", "moeda": "BRL", "vencimento": "2026-11-16" },
  "pix": {
    "copia_e_cola": "00020126…6304ABCD",
    "qr_code_png_base64": "iVBORw0KGgo…",
    "valor": "17.00",
    "expira_em": "2026-11-16T15:30:00Z"
  }
}

DELETE /v1/ips/{id}#

Antes do pagamento, cancela o pedido e a fatura (cancelado). Com o IP ativo ou suspenso, encerra o IP (cancelando → cancelado): ele sai da sua conta e é devolvido ao data center, sem volta. Se o IP ainda estiver em uso numa VPS, o encerramento para em em_analise até ele ser retirado. Em outros status: 409 estado.

Faturas

GET /v1/faturas#

As faturas dos seus IPs (a primeira de cada pedido e as renovações) e as faturas de crédito, da mais nova para a mais antiga (até 100).

CampoTipoDescrição
statustextoem_aberto, paga ou cancelada.
vencidas1 ou 0Só as em aberto com vencimento já passado.
tipotextoip ou credito.
resposta 200
{
  "dados": [
    { "id": 301, "status": "em_aberto", "total": "17.00", "a_pagar": "17.00", "moeda": "BRL",
      "vencimento": "2026-11-16", "tipo": "ip", "servicos": [217] }
  ]
}

GET /v1/faturas/{id}#

Uma fatura, com tipo e servicos.

GET /v1/faturas/{id}/pix#

O PIX de uma fatura em aberto (de IP ou de crédito). Mesma resposta de GET /v1/ips/{id}/pix.

POST /v1/faturas/{id}/pagar-com-credito#

Paga a fatura inteira com o crédito da conta e devolve a fatura atualizada. Crédito menor que o valor: 402 credito_insuficiente (nada é debitado). Fatura de crédito: 409 fatura_de_credito.

Crédito

GET /v1/credito#

Saldo de crédito e as últimas 20 faturas de crédito.

resposta 200
{
  "credito": "34.00",
  "moeda": "BRL",
  "faturas": [
    { "id": 310, "status": "paga", "total": "50.00", "a_pagar": "0.00", "moeda": "BRL", "vencimento": "2026-11-10", "tipo": "credito" }
  ]
}

POST /v1/credito#

Cria uma fatura de crédito e responde 201 com a fatura e o PIX. Exige Idempotency-Key. Paga, o valor vira crédito e quita as renovações em aberto (veja Renovação automática).

CampoTipoDescrição
valor obrigatóriotextoValor em reais, com ponto e até 2 casas: "50.00". De 2.00 a 2000.00 por fatura.
curl
curl -s -X POST https://vitthost.com.br/central/api_ips.php/v1/credito \
  -H "Authorization: Bearer $VITT_IP_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: credito-2026-11-001" \
  -d '{"valor": "50.00"}'
resposta 201
{
  "fatura": { "id": 310, "status": "em_aberto", "total": "50.00", "a_pagar": "50.00", "moeda": "BRL", "vencimento": "2026-11-10", "tipo": "credito" },
  "pix": { "copia_e_cola": "00020126…", "qr_code_png_base64": "iVBORw0KGgo…", "valor": "50.00", "expira_em": null }
}

Se o PIX não puder ser gerado na hora, pix vem null com pix_erro: peça depois em GET /v1/faturas/{id}/pix.

Objetos

Pedido (IP)

pedido
{
  "id": 42,
  "referencia": "cliente-1234-vps-88",
  "status": "ativo",
  "etapa": null,
  "pagamento": "pix",
  "local": "ca-1",
  "vps_id": null,
  "ip": "203.0.113.10",
  "rede": {
    "ip": "203.0.113.10",
    "mascara": "255.255.255.0",
    "gateway": "203.0.113.254",
    "mac": "00:50:56:00:ab:cd",
    "mac_da_vps": false
  },
  "servico_id": 217,
  "vencimento": "2026-11-16",
  "renovacao": {
    "vencimento": "2026-11-16",
    "dias_para_vencer": 3,
    "em_atraso": false,
    "valor_renovacao": "17.00",
    "ciclo": "mensal",
    "fatura_em_aberto": {
      "id": 301, "status": "em_aberto", "total": "17.00", "a_pagar": "17.00",
      "moeda": "BRL", "vencimento": "2026-11-16"
    },
    "suspensao_prevista_em": "2026-11-17",
    "encerramento_previsto_em": "2026-11-22"
  },
  "bloqueio": null,
  "fatura": { "id": 260, "status": "paga", "total": "17.00", "a_pagar": "0.00", "moeda": "BRL", "vencimento": "2026-10-16" },
  "pix": null,
  "mensagem": "IP ativo na sua conta Cloud. Use-o ao criar ou editar uma VPS.",
  "criado_em": "2026-10-17T01:54:10Z",
  "pago_em": "2026-10-17T01:55:06Z",
  "ativado_em": "2026-10-17T02:03:41Z",
  "encerrado_em": null
}
CampoTipoDescrição
idnúmeroId do pedido.
referenciatexto ou nullA que você enviou.
status · etapatextoVeja Ciclo de vida. etapa só em provisionando.
pagamentotextopix, credito ou whmcs (pedido feito fora da API).
local · vps_idtexto · númeroOnde o IP fica e a VPS de destino, se informada.
ip · redetexto · objetoPreenchidos com o IP ativo, suspenso ou encerrando. rede: ip, mascara, gateway, mac, mac_da_vps.
servico_idnúmeroId do serviço na Vitt Host (aparece em servicos das faturas).
vencimentodata ou nullPróximo vencimento (IP ativo ou suspenso).
renovacaoobjeto ou nullVeja abaixo. Só em IP ativo ou suspenso.
bloqueiotexto ou nullbloqueando, bloqueado, desbloqueando ou null (sem bloqueio de rede).
faturaobjetoA fatura do pedido (a primeira). Renovações estão em renovacao.fatura_em_aberto e em /v1/faturas.
pix · pix_erroobjeto · textoSó em GET /v1/ips/{id} e na criação, aguardando pagamento por PIX.
mensagemtextoTexto pronto para mostrar ao seu cliente.
criado_em · pago_em · ativado_em · encerrado_emdata e hora (UTC)Marcos do pedido.

Renovação

CampoTipoDescrição
vencimentodataData do vencimento que está valendo (com atraso, a da fatura mais antiga em aberto).
dias_para_vencernúmeroDias até o vencimento; negativo quando já venceu.
em_atrasobooleanotrue com fatura de renovação vencida e não paga.
valor_renovacao · ciclotextoValor de cada renovação e o ciclo (mensal).
fatura_em_abertofatura ou nullA fatura de renovação em aberto que vence primeiro.
suspensao_prevista_emdata ou nullQuando o IP será suspenso se a fatura não for paga. null sem fatura em aberto ou já suspenso.
encerramento_previsto_emdata ou nullQuando o IP será encerrado (sem volta) se a fatura não for paga.

Fatura

CampoTipoDescrição
idnúmeroNúmero da fatura.
statustextoem_aberto, paga, cancelada, reembolsada, em_cobranca ou outro.
total · a_pagartextoValor total e quanto ainda falta pagar.
moeda · vencimentotexto · dataMoeda e data de vencimento.
tipotextoip ou credito (nas rotas de faturas).
servicoslista de númerosServiços (IPs) cobrados na fatura.

PIX

CampoTipoDescrição
copia_e_colatextoO código PIX copia e cola.
qr_code_png_base64textoImagem PNG do QR Code em base64, sem o prefixo data:. Para exibir: <img src="data:image/png;base64,…">.
valortextoValor do PIX.
expira_emdata e hora ou nullValidade, quando informada. Expirou? Peça outro na rota /pix.

Webhooks

Com uma URL cadastrada, cada evento é enviado como POST em JSON. Responda com qualquer status 2xx em até 10 segundos para confirmar. Sem confirmação, reenviamos depois de 1 min, 5 min, 30 min, 2 h, 12 h e 24 h; depois disso o evento é descartado (o estado continua consultável pela API). A entrega é "pelo menos uma vez": use o id do evento para ignorar repetições.

requisição
POST /sua-url HTTP/1.1
Content-Type: application/json
User-Agent: VittHost-Webhooks/1.0
X-Vitt-Evento: ip.ativo
X-Vitt-Evento-Id: evt_3f9a1c0b7d2e4a6b8c9d0e1f
X-Vitt-Assinatura: t=1792200000,v1=5b2c…e91

{
  "id": "evt_3f9a1c0b7d2e4a6b8c9d0e1f",
  "tipo": "ip.ativo",
  "criado_em": "2026-10-17T02:03:41Z",
  "dados": { …pedido… }
}

Conferindo a assinatura

X-Vitt-Assinatura tem o horário do envio (t, Unix) e v1 = HMAC-SHA256 do texto "<t>.<corpo cru>" com o segredo do webhook, em hexadecimal. Confira com o corpo cru (antes de decodificar o JSON) e recuse envios com mais de 5 minutos.

PHP
<?php
$segredo = getenv('VITT_WEBHOOK_SECRET');
$corpo = file_get_contents('php://input');
$partes = [];
foreach (explode(',', $_SERVER['HTTP_X_VITT_ASSINATURA'] ?? '') as $p) {
    [$k, $v] = array_pad(explode('=', trim($p), 2), 2, '');
    $partes[$k] = $v;
}
$t = (int) ($partes['t'] ?? 0);
$esperada = hash_hmac('sha256', $t . '.' . $corpo, $segredo);
if ($t <= 0 || abs(time() - $t) > 300 || !hash_equals($esperada, $partes['v1'] ?? '')) {
    http_response_code(401);
    exit;
}
$evento = json_decode($corpo, true);
// ignore se $evento['id'] já foi processado; senão, trate $evento['tipo']
http_response_code(200);
Node.js
const crypto = require('crypto');

// use o corpo cru: app.use(express.raw({ type: 'application/json' }))
function assinaturaValida(segredo, cabecalho, corpoCru) {
  const partes = Object.fromEntries(String(cabecalho || '').split(',').map(p => p.trim().split('=')));
  const t = Number(partes.t || 0);
  if (!t || Math.abs(Date.now() / 1000 - t) > 300 || !partes.v1) return false;
  const esperada = crypto.createHmac('sha256', segredo).update(t + '.' + corpoCru).digest('hex');
  return esperada.length === partes.v1.length &&
    crypto.timingSafeEqual(Buffer.from(esperada), Buffer.from(partes.v1));
}

Eventos

tipoQuandodados
ip.pagoA fatura do pedido foi paga. O IP começa a ser provisionado.Pedido
ip.ativoO IP está pronto na sua conta Cloud (campo rede preenchido).Pedido
ip.falhouO pedido parou para conferência da nossa equipe (status em_analise). Não é preciso fazer nada; avisamos quando andar.Pedido
ip.suspensoO IP foi suspenso por fatura de renovação em atraso.Pedido
ip.bloqueadoO tráfego do IP foi bloqueado na rede por causa da suspensão.Pedido
ip.reativadoA fatura em atraso foi paga e o IP voltou a ativo.Pedido
ip.desbloqueadoO bloqueio de rede do IP foi retirado.Pedido
ip.encerramento_proximoO IP será encerrado hoje ou amanhã se a fatura não for paga. Último aviso.Aviso de renovação
ip.canceladoO pedido foi cancelado ou o IP foi encerrado.Pedido
ip.expiradoO pedido foi cancelado porque a fatura não foi paga no prazo.Pedido
fatura.geradaFoi gerada a fatura de renovação de um IP.Fatura
fatura.vencendoA fatura de renovação vence nos próximos dias (hoje, até 3 dias antes).Aviso de renovação
fatura.vencidaA fatura de renovação passou do vencimento sem pagamento.Aviso de renovação
fatura.pagaA fatura de renovação de um IP foi paga.Fatura
credito.adicionadoUma fatura de crédito foi paga e o valor entrou na sua conta.Crédito
testeEnviado por POST /v1/webhooks/teste.{"mensagem": "…"}
  • Pedido: o pedido completo, com renovacao quando o IP está ativo ou suspenso.
  • Fatura: {"pedido_id", "servico_id", "ip", "fatura"}.
  • Aviso de renovação: {"pedido_id", "servico_id", "ip", "fatura", "renovacao"}. Cada aviso sai uma vez por fatura e IP.
  • Crédito: {"fatura", "valor", "faturas_pagas", "credito", "moeda"}: a fatura de crédito paga, as faturas quitadas com o crédito e o saldo depois disso.

POST /v1/webhooks/teste#

Envia um evento teste para a sua URL e responde 202 com {"evento_id", "url"}. Sem URL cadastrada: 409 sem_webhook.

Erros

exemplo
HTTP/1.1 422 Unprocessable Entity

{ "erro": { "codigo": "valor", "mensagem": "\"valor\" vai de 2.00 a 2000.00 por fatura de crédito." } }
HTTPcodigoSignificado
400json_invalidoO corpo não é um objeto JSON.
400idempotency_keyFalta o cabeçalho Idempotency-Key ou ele está fora do formato.
401sem_chaveA chave de API não foi enviada.
401chave_invalidaA chave de API não existe ou está errada.
402credito_insuficienteO crédito da conta não cobre o valor. Nada foi criado nem debitado.
403revenda_desativadaO acesso da revenda à API está desativado. Fale com o suporte.
404rota_inexistenteO caminho ou o método não existe.
404nao_encontradoO pedido ou a fatura não existe ou não é da sua conta.
404vps_nao_encontradaA VPS informada em vps_id não está na sua conta Cloud.
405metodoMétodo não aceito nesta rota (veja o cabeçalho Allow).
409em_andamentoOutra requisição com a mesma Idempotency-Key ainda está sendo processada. Repita em instantes.
409referencia_repetidaJá existe pedido com esta referencia. Para reenviar o mesmo pedido, repita a Idempotency-Key.
409estadoO pedido não pode ser cancelado no status atual.
409sem_fatura_abertaO pedido não tem fatura em aberto.
409fatura_nao_abertaA fatura não está em aberto.
409fatura_de_creditoFatura de crédito não pode ser paga com crédito. Pague pelo PIX.
409sem_webhookNenhuma URL de webhook cadastrada para a revenda.
422idempotencia_conflitoEsta Idempotency-Key já foi usada com outro corpo.
422referencia · pagamento · vps_id · local · valorO campo do corpo indicado no código está inválido; a mensagem diz o formato esperado.
422local_invalido · local_conflitoO local não existe, ou não é o local da VPS informada.
422vps_sem_ip_adicional · vps_sem_macA VPS não pode receber um IP adicional.
422status · tipo · vencidas · vence_em_ate · em_atrasoFiltro de listagem inválido.
429muitas_requisicoesLimite de requisições por minuto. Espere o tempo do cabeçalho Retry-After.
429limite_diarioLimite de pedidos em 24 horas da revenda.
500erro_internoErro do nosso lado; ficou registrado. Repita em alguns minutos com a mesma Idempotency-Key.
503indisponivelA API ou o local estão indisponíveis no momento (veja Retry-After).
503pagamento_indisponivelA cobrança está indisponível no momento. Nada foi criado; repita mais tarde com a mesma Idempotency-Key.
503pix_indisponivelNão foi possível gerar o PIX agora. Peça de novo em alguns minutos.

Boas práticas

  • Uma Idempotency-Key por operação, gerada e guardada antes de enviar. Em timeout ou erro 5xx, reenvie com a mesma chave: nunca crie um pedido "novo" para tentar de novo.
  • Use referencia com o id do seu cliente ou serviço, para achar o pedido depois com GET /v1/ips?referencia=….
  • Prefira webhooks a consultas repetidas. Se consultar, espere pelo menos 1 minuto entre chamadas do mesmo pedido.
  • Rotina diária de renovação: GET /v1/ips?vence_em_ate=7 para avisar seus clientes, e GET /v1/ips?em_atraso=1 para agir antes de encerramento_previsto_em.
  • Mantenha crédito na conta para que as renovações se paguem sozinhas e nenhum IP em uso seja suspenso.
  • Mostre a mensagem do pedido ao seu cliente: ela já está escrita para isso.

Dúvidas ou pedido de chave: abra um ticket na central do cliente. Para gerenciar VPS da conta Cloud, veja também a API do Virtualizor para revenda.