Limite
100 requests por minuto por chave, compartilhado entre todos os endpoints. Se você fizer 50 requests em/estoque + 60 em /precos no mesmo minuto = 110, o 101º cai em 429.
Resposta ao exceder
Ao ultrapassar, o próximo request recebe:Retry-After traz segundos até a janela liberar.
Estratégia de retentativa recomendada
1
Detecte o 429
Cheque
response.status === 429 ou response.error.code === "RATE_LIMIT".2
Leia Retry-After
Use o valor do header como tempo de espera (em segundos). Se ausente, use fallback de 60 segundos.
3
Aguarde
sleep(retry_after) antes de retentar. Não faça backoff exponencial em cima disso — a resposta já traz o tempo exato.4
Retente uma vez
Se ainda vier
429, use jitter (backoff aleatório de 5–15s) pra evitar sincronização com outros integradores.Boas práticas pra evitar rate limit
1. Use batches (até 500 itens)
Em vez de 500 chamadas dePOST /estoque com 1 SKU cada, faça 1 chamada com 500 SKUs. Isso reduz drasticamente uso de rate limit e latência.
2. Controle concorrência do lado do integrador
Se você tem 3 processos rodando estoque simultâneos, eles disputam a mesma cota. Use fila (BullMQ, Sidekiq, Celery, etc) com concurrency = 1 pra sincronizações que precisam ser sequenciais.3. Sync incremental, não full
- Use
updated_sincenoGET /produtoseGET /pedidos— só puxa o que mudou - Guarde o
atualizado_emdo último item processado como cursor
4. Separe chaves por integração
Se o mesmo integrador tem 2 casos de uso muito distintos (ex: sync de catálogo vs pull de pedidos), peça 2 chaves separadas. Cada uma tem sua cota de 100/min.Escalabilidade
O rate limit atual é in-memory por instância do backend da loja. Em cenários com mais de uma instância rodando em paralelo (deploy multi-region ou auto-scaling), o limite efetivo pode escalar até100 × N. Aceitável pro volume atual — se você precisar de garantias mais rígidas (Redis-backed shared limit), abra ticket no suporte.
Como testar sem exceder
- Ambiente de staging (quando disponível) tem o mesmo limite mas dados isolados — pode estressar sem afetar produção
- Rode com
curl -w "@time-fmt"pra medir tempo entre requests - Em desenvolvimento local, o backend responde do mesmo endpoint — comportamento idêntico