Skip to main content

Visão Geral

A API Vision Wallet implementa rate limiting para garantir estabilidade, segurança e uso justo dos recursos. Diferentes tipos de rotas têm limites diferentes baseados no método de autenticação.

Limites por Tipo de Rota

Rotas Autenticadas (com API Key)

Rotas que requerem autenticação via API Key têm os seguintes limites:
MétricaValor
Limite10 requisições por segundo
Equivalente600 requisições por minuto
Janela1 segundo
IdentificadorAPI Key
O rate limit é aplicado por API Key, permitindo que você tenha múltiplas API Keys para aumentar sua capacidade total.

Rotas Admin

Rotas administrativas têm limites ainda mais restritivos:
MétricaValor
Limite30 requisições por minuto
Janela60 segundos
IdentificadorAPI Key

Rotas de Registro

A rota de registro de usuário tem um cooldown especial:
MétricaValor
Cooldown30 segundos entre requisições
IdentificadorAPI Key ou IP

Headers de Rate Limit

Todas as respostas incluem headers informativos sobre o rate limit:
X-RateLimit-Limit: 10
X-RateLimit-Remaining: 7
X-RateLimit-Reset: 1698765432

Descrição dos Headers

X-RateLimit-Limit
integer
O número máximo de requisições permitidas na janela de tempo atual.
X-RateLimit-Remaining
integer
O número de requisições restantes na janela de tempo atual.
X-RateLimit-Reset
timestamp
Timestamp Unix (segundos) indicando quando a janela de rate limit será resetada.

Resposta 429 (Too Many Requests)

Quando o rate limit é excedido, você receberá uma resposta HTTP 429:
{
  "success": false,
  "error": "Too Many Requests",
  "message": "Rate limit exceeded. Please try again in 5 seconds",
  "retryAfter": 5
}

Campos da Resposta

error
string
required
Tipo do erro: “Too Many Requests”
message
string
required
Mensagem descritiva indicando quanto tempo esperar antes de tentar novamente.
retryAfter
integer
required
Número de segundos para aguardar antes de fazer uma nova requisição.

Estratégias para Lidar com Rate Limiting

1. Implementar Backoff Exponencial

Quando receber um erro 429, implemente backoff exponencial antes de tentar novamente:
async function makeRequestWithRetry(url, options, maxRetries = 3) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    try {
      const response = await fetch(url, options);
      
      if (response.status === 429) {
        const data = await response.json();
        const waitTime = data.retryAfter || Math.pow(2, attempt);
        console.log(`Rate limited. Waiting ${waitTime} seconds...`);
        await new Promise(resolve => setTimeout(resolve, waitTime * 1000));
        continue;
      }
      
      return response;
    } catch (error) {
      if (attempt === maxRetries - 1) throw error;
      await new Promise(resolve => setTimeout(resolve, Math.pow(2, attempt) * 1000));
    }
  }
}

2. Monitorar Headers de Rate Limit

Monitore os headers X-RateLimit-Remaining para evitar atingir o limite:
async function makeRequest(url, apiKey) {
  const response = await fetch(url, {
    headers: {
      'X-API-Key': apiKey
    }
  });
  
  const remaining = parseInt(response.headers.get('X-RateLimit-Remaining'));
  const resetTime = parseInt(response.headers.get('X-RateLimit-Reset'));
  
  if (remaining < 2) {
    const waitTime = resetTime - Math.floor(Date.now() / 1000);
    console.log(`Rate limit quase esgotado. Aguardando ${waitTime} segundos...`);
    await new Promise(resolve => setTimeout(resolve, waitTime * 1000));
  }
  
  return response;
}

3. Usar Cache Quando Possível

Algumas rotas têm cache implementado. Use essas rotas para reduzir o número de requisições:
  • GET /api/v1/payment/list - Cache de 60 segundos
  • GET /api/v1/withdraw/list - Cache de 60 segundos
  • GET /api/v1/user/balance - Cache variável

4. Agrupar Operações

Em vez de fazer múltiplas requisições individuais, use endpoints de listagem quando possível: Ineficiente:
# 10 requisições individuais
GET /api/v1/payment/get/payment_1
GET /api/v1/payment/get/payment_2
# ... mais 8 requisições
Eficiente:
# 1 requisição para listar todos
GET /api/v1/payment/list?limit=10

5. Usar Múltiplas API Keys

Se você precisa de maior capacidade, crie múltiplas API Keys e distribua as requisições entre elas:
const apiKeys = [
  'vw_live_key1...',
  'vw_live_key2...',
  'vw_live_key3...'
];

let currentKeyIndex = 0;

function getNextApiKey() {
  const key = apiKeys[currentKeyIndex];
  currentKeyIndex = (currentKeyIndex + 1) % apiKeys.length;
  return key;
}

async function makeRequest(url) {
  const apiKey = getNextApiKey();
  return fetch(url, {
    headers: { 'X-API-Key': apiKey }
  });
}
Distribuir requisições entre múltiplas API Keys pode ajudar, mas certifique-se de que cada API Key tenha as permissões necessárias para as operações que você está realizando.

Exemplos de Rate Limiting

Exemplo: Rate Limit em Rotas Autenticadas

# Primeiras 10 requisições em 1 segundo - OK
for i in {1..10}; do
  curl -H "X-API-Key: sua_key" https://api.visionwallet.com.br/api/v1/user/balance
done

# 11ª requisição - 429 Too Many Requests
curl -H "X-API-Key: sua_key" https://api.visionwallet.com.br/api/v1/user/balance
# Resposta: {"error": "Too Many Requests", "retryAfter": 1}

Boas Práticas

Sempre monitore os headers de rate limit: Use X-RateLimit-Remaining para saber quantas requisições você ainda pode fazer.
Implemente retry com backoff: Não faça requisições imediatamente após receber 429. Aguarde o tempo indicado em retryAfter.
Use cache quando possível: Reduza o número de requisições usando dados em cache.
Agrupe operações: Use endpoints de listagem em vez de múltiplas requisições individuais.
Teste em ambiente de desenvolvimento primeiro: Entenda os limites antes de fazer deploy em produção.

Próximos Passos