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.
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.
- 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.
Authorization: Bearer pb_a1b2c3_9f8e7d6c5b4a3f2e1d0c...
{
"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
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}.
active)
{
"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 }
}
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"
}
}
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."
}
}
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"
}
}
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.
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."
}
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)."
}
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.
// 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",
"...": "..."
}
}
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.
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
}
]
}
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.
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.",
"...": "..."
}
}
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}.
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
}
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.
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 }
]
}
}
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.
// 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.
Lista os números SMS comprados pela conta, paginados, do mais recente para o mais antigo.
waiting, received, expired, cancelled, refunded ou failed
{
"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 }
}
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?
Dá para comprar um proxy novo pela API?
A renovação automática e o cancelamento funcionam pela API?
Posso trocar um IP que está funcionando por outro?
Dá para comprar um número SMS pela API?
Como vocês guardam minha chave?
O rate limit é por chave ou por IP?
A API substitui o painel?
Tem SDK ou biblioteca oficial?
Posso revogar uma chave comprometida na hora?
Pronto para automatizar?
A chave é gerada no painel em menos de um minuto. Escopo read para monitorar, write quando precisar agir.