Empresa brasileira · Entrega automática · Suporte em português Seg a sex, 9h as 18h · PIX em reais
ProxyBox
Documentação técnica

API de proxy: gerencie seus IPs por código

REST simples em JSON para comprar IPs com o saldo da conta, listar proxies, testar conexão, trocar IP com falha técnica, renovar (inclusive sozinho, pelo saldo) e cancelar sem abrir o painel. Autenticação por token com escopo de leitura ou escrita — o mesmo que move o botão “Testar” do painel, exposto para o seu script.

Base URL
proxybox.com.br
Autenticação
Bearer token
Rate limit
60/min leitura
Formato
JSON

Para quem é essa API

Não substitui o painel — é para quando você quer o mesmo dado ou ação sem clicar.

Monitoramento próprio

Puxar status e vigência dos proxies para o seu Zabbix, Grafana ou script de cron, sem entrar no painel toda hora.

Automação com n8n

Disparar o teste de conexão antes de abrir uma sessão de automação e abortar o fluxo se o IP não responder.

Agências com muitos IPs

Listar todos os proxies da conta e cruzar com a sua própria planilha ou CRM, em vez de exportar manualmente.

Revenda e integração

Comprar um IP quando o seu cliente entra, deixar renovando sozinho pelo saldo e cancelar quando ele sai, tudo pelo seu sistema.

Autenticação

Toda chamada leva um Bearer token no cabeçalho Authorization. Gere a chave em Minha conta → API Keys; o segredo aparece uma única vez, guardamos só o hash.

read Lista e consulta proxies, pedidos, catálogo, saldo e trocas de IP, e simula preço. Não compra, não testa, não troca nem renova.
write Inclui tudo do read, mais comprar com saldo, gerar PIX de depósito, testar, troca técnica, renovar, ligar a renovação automática e cancelar.
  • Guardamos só o hash SHA-256 — o segredo em texto puro não fica em lugar nenhum além da tela em que você o copiou.
  • Até 10 chaves ativas por conta. Revogue a qualquer momento sem afetar as outras.
  • Rate limit contado por chave — outra chave sua, ou de outra conta no mesmo IP, não divide a sua cota.
Cabeçalho obrigatório
Authorization: Bearer pb_a1b2c3_9f8e7d6c5b4a3f2e1d0c...
Exemplo de erro (401)
{
  "error": "unauthenticated",
  "message": "Envie o header Authorization: Bearer <sua chave>."
}

Comece em 1 minuto

Listar os seus proxies — a chamada mais simples, na linguagem que você já usa.

curl "https://proxybox.com.br/api/v1/proxies" \
  -H "Authorization: Bearer pb_a1b2c3_..." \
  -H "Accept: application/json"
import requests

r = requests.get(
    "https://proxybox.com.br/api/v1/proxies",
    headers={"Authorization": "Bearer pb_a1b2c3_..."},
)
print(r.json())
const res = await fetch("https://proxybox.com.br/api/v1/proxies", {
  headers: { Authorization: "Bearer pb_a1b2c3_..." },
});
const { data } = await res.json();
console.log(data);
$ch = curl_init("https://proxybox.com.br/api/v1/proxies");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    "Authorization: Bearer pb_a1b2c3_...",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = json_decode(curl_exec($ch), true);

Endpoints

Proxies, compra e pedidos, carteira e números SMS. A senha só aparece na consulta de 1 proxy, de 1 pedido ou na resposta da compra — nunca na listagem.

Proxies

GET /proxies read

Lista os proxies da conta, paginados. Os campos de credencial (senha, string de conexão) não vêm aqui — só em GET /proxies/{id}.

status opcional — filtra pelo status exato (ex: active)
per_page opcional — padrão 25, máximo 100
{
  "data": [
    {
      "id": 42,
      "label": "IPv4 Ads",
      "status": "active",
      "type": "ipv4",
      "country": "BR",
      "host": "br1.proxybox.io",
      "http_port": 8080,
      "socks5_port": 1080,
      "username": "pb_9f2a1c",
      "plan": "IPv4 Brasil",
      "is_trial": false,
      "expires_at": "2026-11-10T00:00:00+00:00",
      "days_to_expire": 30,
      "can_renew": true,
      "can_replace": true,
      "auto_renew": true,
      "auto_renew_payment": "wallet"
    }
  ],
  "meta": { "current_page": 1, "last_page": 1, "per_page": 25, "total": 1 }
}
GET /proxies/{id} read

Detalhe de um proxy, incluindo password e connection_string prontos para colar na sua ferramenta.

Proxy de outra conta ou ID inexistente devolvem a mesma resposta 404 — de propósito, para não confirmar se um ID existe quando não é seu.

{
  "data": {
    "id": 42,
    "label": "IPv4 Ads",
    "status": "active",
    "...": "...",
    "password": "S3nh4Gerada",
    "connection_string": "http://pb_9f2a1c:[email protected]:8080"
  }
}
POST /proxies/{id}/test write

Dispara uma conexão HTTPS real pelo proxy e devolve IP de saída, operadora e latência — o mesmo teste do botão “Testar” no painel. O resultado fica registrado no histórico do proxy.

Responde 200 quando o teste passa e 422 quando falha — o corpo muda de formato, não é erro de chamada.

// 200 — sucesso
{
  "data": {
    "ok": true,
    "ip": "191.96.10.42",
    "country": "Brazil",
    "city": "São Paulo",
    "asn": "AS262589",
    "org": "Operadora XY",
    "latency_ms": 148,
    "checked_at": "10/09/2026 14:32"
  }
}

// 422 — falha
{
  "data": {
    "ok": false,
    "error": "Autenticação recusada (407)",
    "hint": "Usuário ou senha não conferem."
  }
}
POST /proxies/{id}/replace write

O mesmo fluxo do botão Não funciona no painel: testa o túnel e só pede a troca do IP se a falha for técnica (timeout, host mudo, 407 com a senha do painel). A equipe confirma a troca, sem custo e com o mesmo vencimento; o IP novo aparece em GET /proxies e o dono da conta recebe e-mail. Proxy no ar, verificador fora ou plano por GB não geram troca — a resposta diz o que fazer.

200 quando o diagnóstico conclui (incluindo “está no ar” ou “IP substituído”). 202 quando a falha foi confirmada e a troca está com a equipe (pending_approval; chamar de novo não abre outro pedido). 422 quando não dá para trocar agora. Ban de plataforma continua fora desta rota.

Quando existe pedido de troca, a resposta traz replacement com o id e a situação — acompanhe em GET /replacements/{id}. Opcional: motivo (até 500 caracteres, a equipe lê junto do pedido) e o cabeçalho Idempotency-Key: repetir a chamada com a mesma chave em até 24 horas devolve o mesmo resultado, sem testar nem pedir de novo.

// Corpo (opcional)
{ "motivo": "timeout no login do cliente desde 14h" }

// 200 — substituído
{
  "data": {
    "ok": true,
    "action": "replaced",
    "message": "IP substituído. A vigência original foi mantida.",
    "replaced_id": 42,
    "proxy": { "id": 87, "host": "br2.proxybox.io", "...": "..." }
  }
}

// 202 — falha confirmada, troca com a equipe
{
  "data": {
    "ok": false,
    "action": "pending_approval",
    "message": "Confirmamos a falha neste IP e a nossa equipe já foi avisada.",
    "replacement": {
      "id": 318,
      "status": "pending",
      "status_url": "https://proxybox.com.br/api/v1/replacements/318"
    }
  }
}

// 200 — está no ar (não troca)
{
  "data": {
    "ok": true,
    "action": "healthy",
    "message": "O proxy está no ar."
  }
}

// 422 — verificador ou cota
{
  "data": {
    "ok": false,
    "action": "retry",
    "message": "O verificador não respondeu"
  }
}
GET /replacements/{id} read

Situação de um pedido de troca de IP feito em POST /proxies/{id}/replace (ou no botão Não funciona do painel). Só consulta: não testa, não pede nem troca nada.

pending falha confirmada, pedido com a equipe; o IP não mudou
approved troca aprovada, o IP novo está sendo liberado
failed a troca ainda não saiu; a equipe resolve e avisa por e-mail
denied encerrado sem troca: o IP voltou a funcionar
done IP trocado: new_proxy traz o IP novo com usuário e senha

GET /proxies/{id}/replacement devolve a troca em curso ou concluída daquele IP (ou o último pedido dele); sem pedido, 404 com no_replacement. Consulte a cada poucos minutos: final: true indica que a situação não muda mais. A troca é sem custo e mantém o vencimento; o IP antigo sai de linha.

// 200 — trocado
{
  "data": {
    "id": 318,
    "proxy_id": 42,
    "status": "done",
    "final": true,
    "via": "api",
    "reason": "timeout no login do cliente desde 14h",
    "requested_at": "2026-10-10T14:02:11+00:00",
    "decided_at": "2026-10-10T14:20:40+00:00",
    "new_proxy_id": 87,
    "new_proxy": {
      "id": 87,
      "host": "br2.proxybox.io",
      "http_port": 8080,
      "username": "pb_7c1d",
      "password": "N0vaSenha",
      "expires_at": "2026-11-10T00:00:00+00:00",
      "...": "..."
    }
  }
}

// 404 — pedido de outra conta ou inexistente
{
  "error": "not_found",
  "message": "Pedido de troca não encontrado ou não pertence a esta conta."
}
POST /proxies/{id}/renew write

Dois jeitos. Sem corpo: devolve o link de checkout do plano do proxy para você concluir o pagamento. Com {"payment_method": "wallet"}: renova agora, debitando o saldo da carteira, e mantém o mesmo IP.

Opcional: period em meses (padrão 1) e o cabeçalho Idempotency-Key para a nova tentativa não renovar duas vezes. Elegibilidade: proxy ativo, plano à venda, não ser trial e o fornecedor renovar o mesmo IP. Responde 200 quando a extensão sai na hora e 202 quando o fornecedor demora (já pago; termina sozinho). Saldo insuficiente: 402. Renovação deste IP já em andamento: 409, sem nova cobrança. Em plano de lote, renova o lote inteiro.

// 200 — elegível
{
  "data": {
    "proxy_id": 42,
    "sku": "ipv4-br-30d",
    "checkout_url": "https://proxybox.com.br/checkout/ipv4-br-30d",
    "message": "Abra o checkout para concluir o pagamento."
  }
}

// 200 — renovado com saldo (payment_method: wallet)
{
  "data": {
    "number": "PB261007A1B2C",
    "kind": "renewal",
    "status": "delivered",
    "amount_brl": 50.0,
    "payment_method": "wallet",
    "renewed_proxy_ids": [42]
  }
}

// 422 — não elegível
{
  "error": "not_renewable",
  "message": "Este proxy não está elegível para renovação
    (precisa estar ativo, com plano vigente e não ser trial)."
}
POST /proxies/{id}/auto-renew write

Liga ou desliga a renovação automática de um IP (em plano de lote, do lote inteiro). Pela API ela é paga com o saldo da carteira: alguns dias antes do vencimento o sistema debita o saldo e estende o mesmo IP. Para desligar a renovação pelo saldo na conta toda, use POST /wallet/auto-renew com {"enabled": false}.

Sem saldo suficiente, nada é cobrado: a conta recebe um e-mail, o IP segue até o vencimento e o sistema tenta de novo no dia seguinte. O campo auto_renew_last_error do proxy mostra o motivo.

enabled obrigatório — true ou false
period opcional — meses por renovação (padrão 1)
// Corpo
{ "enabled": true }

// 200
{
  "data": {
    "id": 42,
    "auto_renew": true,
    "auto_renew_period_months": 1,
    "auto_renew_payment": "wallet",
    "expires_at": "2026-11-06T20:36:30+00:00",
    "...": "..."
  }
}
POST /proxies/{id}/cancel write

Cancela o IP no fim do período: desliga a renovação automática e o IP continua funcionando até expires_at. Depois disso ele vence. Em plano de lote, cancela o lote inteiro (os IPs vêm em lot_proxy_ids).

Sem multa e sem fidelidade. O período já pago não é devolvido proporcionalmente.

// 200
{
  "data": {
    "id": 42,
    "auto_renew": false,
    "expires_at": "2026-11-06T20:36:30+00:00",
    "canceled": true,
    "message": "Renovação cancelada. O IP funciona até
      2026-11-06T20:36:30+00:00 e depois vence."
  }
}

Compra e pedidos

A compra pela API é paga com o saldo da carteira: coloque saldo por PIX (pelo painel ou por POST /wallet/deposits) e compre sem nova cobrança. Os preços e descontos por volume são os mesmos do site. Nos planos por IP, a faixa conta os IPs do pedido somados aos IPs ativos do mesmo tipo na conta, então comprar 1 IP por chamada não perde o desconto. Passo a passo completo, do saldo ao cancelamento, em como integrar a compra de IP ao seu sistema.

GET /catalog read

Planos que podem ser comprados pela API, com preço por IP (e por país, quando o plano deixa escolher), descontos por volume, períodos que o fornecedor vende agora e se há entrega disponível (available).

Use o sku daqui no POST /orders. Planos por cidade (São Paulo, Niterói, Irecê) têm SKU próprio.

{
  "data": [
    {
      "sku": "isp-br-30d",
      "name": "ISP Residencial",
      "type": "isp",
      "country": "BR",
      "city": null,
      "duration_days": 30,
      "price_brl": 50,
      "max_quantity": 100,
      "periods_months": [1, 3],
      "extra_device_price_brl": 16.9,
      "volume_discounts": [
        { "min_quantity": 5, "discount_percent": 6 },
        { "min_quantity": 10, "discount_percent": 12 }
      ],
      "period_discounts": { "1": 0, "3": 10 },
      "volume_counts_active_ips": true,
      "fixed_ip": false,
      "available": true
    }
  ]
}
GET /quote read

Simula quanto a compra (ou a renovação) custa agora, com a mesma conta do checkout: desconto por volume (somando os IPs ativos do mesmo tipo e país na conta), desconto por período, preço por país e dispositivos extras. Diz se há entrega disponível (available; quando não há, note explica) e lista os períodos vendidos agora, com o total de cada um. Não compra nem reserva nada.

plano obrigatório — o sku do GET /catalog
quantidade opcional — padrão 1 (em lote fechado, sempre 1)
periodo opcional — meses (padrão 1)
pais só em planos com país à escolha
dispositivos_extra opcional — 0, 3, 5 ou 10
renovar_ids opcional — IDs de proxy para simular a renovação (ex.: 42,43)

Também aceita os nomes do POST /orders (sku, quantity, period, country, extra_devices). Dado inválido responde 422 com a mensagem do campo. O preço vale para a hora da consulta: a compra cobra o valor do momento em que é feita.

// GET /quote?plano=ipv4-br-30d&quantidade=10&periodo=3
{
  "data": {
    "kind": "purchase",
    "sku": "ipv4-br-30d",
    "currency": "BRL",
    "quantity": 10,
    "period_months": 3,
    "unit_price_brl": 30.0,
    "subtotal_brl": 810.0,
    "period_discount_percent": 10,
    "volume_discount_percent": 12,
    "discount_brl": 97.2,
    "total_brl": 712.8,
    "monthly_equivalent_brl": 23.76,
    "active_ips_counted": 0,
    "available": true,
    "note": null,
    "periods": [
      { "months": 1, "discount_percent": 0, "total_brl": 264.0 },
      { "months": 3, "discount_percent": 10, "total_brl": 712.8 },
      "..."
    ],
    "balance_brl": 800.0,
    "balance_covers": true
  }
}

// 200 — período sem entrega agora
{
  "data": {
    "sku": "isp-br-30d",
    "period_months": 6,
    "available": false,
    "note": "Este plano não está disponível por esse
      período agora. Escolha outro período.",
    "...": "..."
  }
}
POST /orders write

Compra e entrega na mesma chamada. Responde 201 com IP, porta, usuário e senha quando a entrega sai na hora. Se o fornecedor demorar, responde 202 com "status": "processing": o pagamento já foi feito, o sistema segue tentando a entrega sozinho e você consulta GET /orders/{número}.

sku obrigatório — do GET /catalog
quantity opcional — padrão 1
period opcional — meses (padrão 1)
extra_devices opcional — dispositivos extras no mesmo IP
country só em planos com país à escolha
auto_renew opcional — true liga a renovação automática pelo saldo

Mande o cabeçalho Idempotency-Key (ex.: o ID do seu cliente + número do IP). Se a conexão cair e você repetir a chamada com a mesma chave, recebe o mesmo pedido em vez de comprar de novo. No ISP Brasil, para renovação automática, compre 1 IP por chamada. Se o IP entregue não puder renovar mantendo o endereço, a resposta traz warnings e a renovação dele fica desligada. Em lote fechado, quantity é sempre 1.

// Corpo
{ "sku": "isp-br-30d", "quantity": 1, "auto_renew": true }

// 201 — entregue
{
  "data": {
    "number": "PB261007A1B2C",
    "kind": "purchase",
    "status": "delivered",
    "amount_brl": 50.0,
    "payment_method": "wallet",
    "idempotency_key": "cliente-42-ip-1",
    "proxies": [
      {
        "id": 87,
        "host": "200.0.0.10",
        "http_port": 12323,
        "socks5_port": 12324,
        "username": "u_8f2a",
        "password": "S3nh4Gerada",
        "expires_at": "2026-11-06T20:36:30+00:00",
        "auto_renew": true,
        "auto_renew_payment": "wallet"
      }
    ]
  }
}

// 402 — saldo insuficiente (nada é cobrado)
{
  "error": "insufficient_balance",
  "amount_brl": 153.8,
  "balance_brl": 100.0,
  "missing_brl": 53.8
}
GET /orders/{número} read

Situação de um pedido: delivered (IP pronto), processing (pago, entrega em andamento) ou awaiting_payment. Traz os IPs do pedido com a senha.

GET /orders lista os pedidos da conta, paginados (filtro opcional status, per_page até 100).

{
  "data": {
    "number": "PB261007A1B2C",
    "kind": "purchase",
    "status": "processing",
    "paid_at": "2026-10-07T20:36:30+00:00",
    "proxies": []
  }
}

Carteira

O saldo paga as compras e as renovações feitas pela API. O depósito por PIX é o mesmo do painel, com o mesmo bônus por faixa de valor.

GET /wallet read

Saldo atual, se a renovação automática pelo saldo está ligada na conta, limites de depósito e faixas de bônus.

{
  "data": {
    "balance_brl": 150.0,
    "auto_renew_with_balance": true,
    "min_deposit_brl": 50,
    "max_deposit_brl": 10000,
    "deposit_bonus": [
      { "min_brl": 100, "max_brl": 199.99, "bonus_percent": 5 }
    ]
  }
}
POST /wallet/deposits write

Gera um PIX de depósito e devolve o copia e cola. Quando o PIX é pago o saldo entra sozinho; GET /wallet/deposits/{id} confere na hora.

amount obrigatório — em reais
document CPF ou CNPJ — só na primeira vez
phone celular com DDD — só na primeira vez
payer_name opcional
// Corpo
{ "amount": 500, "document": "11222333000181",
  "phone": "11987654321" }

// 201
{
  "data": {
    "id": 31,
    "status": "pending",
    "amount_brl": 500.0,
    "bonus_brl": 75.0,
    "pix_copy_paste": "00020126...",
    "pix_expires_at": "2026-10-07T21:06:30+00:00"
  }
}

Números SMS

Só leitura, igual ao resto da v1 — dá para checar se o código chegou sem abrir o painel. A compra em si (escolher o serviço e pagar) continua só em Números SMS no painel; a API não expõe endpoint de compra.

GET /sms-numbers read

Lista os números SMS comprados pela conta, paginados, do mais recente para o mais antigo.

status opcional — waiting, received, expired, cancelled, refunded ou failed
per_page opcional — padrão 25, máximo 100
{
  "data": [
    {
      "id": 913,
      "service": "whatsapp",
      "phone_number": "+5571968183648",
      "status": "received",
      "code": "739394",
      "price_brl": 0.6,
      "created_at": "2026-09-11T01:43:34+00:00",
      "received_at": "2026-09-11T01:43:41+00:00",
      "expires_at": "2026-09-11T01:53:34+00:00"
    }
  ],
  "meta": { "current_page": 1, "last_page": 1, "per_page": 25, "total": 1 }
}
GET /sms-numbers/{id} read

Consulta um número específico e atualiza contra o fornecedor na hora — o mesmo polling que a tela do painel faz. Dá para chamar em loop numa automação até status deixar de ser waiting.

Número de outra conta ou ID inexistente devolvem a mesma resposta 404 — de propósito.

{
  "data": {
    "id": 913,
    "service": "whatsapp",
    "phone_number": "+5571968183648",
    "status": "waiting",
    "code": null,
    "price_brl": 0.6,
    "created_at": "2026-09-11T01:43:34+00:00",
    "received_at": null,
    "expires_at": "2026-09-11T01:53:34+00:00"
  }
}

// 404 — não encontrado ou não é seu
{
  "error": "not_found",
  "message": "Número não encontrado ou não pertence a esta conta."
}

Erros e limites

Todo erro vem em JSON, com o mesmo status HTTP que a chamada equivalente pelo painel geraria.

Status Quando acontece Corpo
401 Sem token, ou token inválido/revogado {"error":"unauthenticated","message":"..."}
403 Chave read tentando endpoint write {"error":"forbidden","message":"..."}
404 Proxy, pedido, pedido de troca, depósito ou número SMS não existe, ou não é da sua conta {"error":"not_found","message":"..."}
402 Saldo da carteira não cobre a compra ou a renovação (nada é cobrado) {"error":"insufficient_balance","missing_brl":...}
409 Compra, renovação ou pedido de troca com a mesma chave já em andamento, ou renovação deste IP já paga e em andamento (nada é cobrado de novo) {"error":"request_in_progress"|"renewal_in_progress",...}
422 Teste falhou, troca recusada, renovação inelegível ou dado da compra ou da simulação de preço inválido {"ok":false,...} ou {"error":"not_renewable",...}
429 Rate limit da chave estourado {"message":"Too Many Attempts."}

A resposta 429 também traz os cabeçalhos X-RateLimit-Limit, X-RateLimit-Remaining e Retry-After em segundos.

Perguntas sobre a API

A API tem custo além do plano?
Não. Está incluída em qualquer conta com proxy ativo — não é um plano ou add-on separado.
Dá para comprar um proxy novo pela API?
Sim, com o saldo da carteira. Coloque saldo por PIX (pelo painel ou pelo POST /wallet/deposits) e use o POST /orders. Na maioria dos casos o IP sai na mesma chamada; se o fornecedor demorar, o pedido fica em processing, o sistema segue tentando e você consulta pelo número. O /replace continua só para falha técnica.
A renovação automática e o cancelamento funcionam pela API?
Sim. O POST /proxies/{id}/auto-renew liga a renovação pelo saldo e o POST /proxies/{id}/cancel desliga: o IP vale até o fim do período pago e depois vence, sem multa. Sem saldo na hora da renovação, nada é cobrado, a conta recebe um aviso e o sistema tenta de novo no dia seguinte. O POST /wallet/auto-renew desliga a renovação pelo saldo na conta toda, e o mesmo interruptor aparece em Minha conta no painel.
Posso trocar um IP que está funcionando por outro?
Não. A troca é para IP com falha técnica, sem custo, até 3 vezes por período contratado. Para ter outro endereço, compre um IP novo e cancele o antigo.
Dá para comprar um número SMS pela API?
Não. Os endpoints de SMS são só leitura — servem para consultar se o código chegou. A compra de número continua só em Números SMS no painel.
Como vocês guardam minha chave?
Só o hash SHA-256. O valor em texto puro existe uma única vez, na tela em que você gera a chave. Se perder, revogue e gere outra — não recuperamos o valor original.
O rate limit é por chave ou por IP?
Por chave. Gerar uma segunda chave não soma cota com a primeira nem depende do seu IP — cada uma tem o próprio limite de 60 req/min em leitura e 20 em escrita.
A API substitui o painel?
Não. Ela cobre automação, compra com saldo e monitoramento. Tickets de suporte e configuração de conta continuam no painel.
Tem SDK ou biblioteca oficial?
Ainda não. É REST simples em JSON com Bearer token — qualquer cliente HTTP resolve, como nos exemplos acima.
Posso revogar uma chave comprometida na hora?
Sim, em Minha conta → API Keys. A revogação é imediata; a próxima chamada com aquele token já recebe 401.

Pronto para automatizar?

A chave é gerada no painel em menos de um minuto. Escopo read para monitorar, write quando precisar agir.

Suporte em português Fale no WhatsApp