Limites de uso (rate limit)
Entenda quantas chamadas a API do GS Engage aceita por minuto e como tratar o erro 429 com backoff para não travar sua integração.
Limites de uso (rate limit)
Quantas chamadas cabem por minuto, o que acontece quando você passa do limite e como se recuperar com elegância.
Toda integração saudável faz pausas. O GS Engage limita quantas chamadas você pode fazer por minuto para proteger a estabilidade da plataforma para todo mundo — inclusive para você. Esse teto é o que chamamos de rate limit (limite de requisições por período).
A boa notícia: respeitar o limite é simples. Se você seguir as práticas desta página, sua integração quase nunca vai esbarrar nele — e, quando esbarrar, vai se recuperar sozinha.
Requisição, leitura e escrita
Cada chamada à API é uma requisição. Uma leitura apenas consulta dados (métodos GET e HEAD). Uma escrita cria, altera ou remove dados (POST, PUT, PATCH, DELETE). Os limites são contados separadamente para leitura e escrita.
A janela é fixa de 60 segundos. A cada novo minuto, a contagem zera.
| Tipo de operação | Métodos HTTP | Limite | Janela |
|---|---|---|---|
| Leitura | GET, HEAD | 200 requisições | 60 segundos |
| Escrita | POST, PUT, PATCH, DELETE | 100 requisições | 60 segundos |
Na prática, isso é bastante folga para o dia a dia. Listar cadências, buscar leads e acompanhar prospecções cabe com sobra nas 200 leituras por minuto. As 100 escritas por minuto cobrem criação de leads em lote, notas e finalização de prospecções sem apertar.
Sem ambiente de teste separado
Lembre-se: não existe sandbox no GS Engage. Toda chamada é real e conta para o limite. Ao experimentar, prefira operações de leitura — elas são mais generosas (200/min) e não alteram nada.
Se você ultrapassar o teto dentro da janela de 60 segundos, a próxima chamada não é atendida: a API responde com o status HTTP 429 (Too Many Requests, ou "requisições demais").
Junto com o 429 vem o header Retry-After, que diz em quantos segundos você pode tentar de novo. Ele é a informação mais importante da resposta — é a própria API te dizendo o tempo exato de espera.
HTTP/1.1 429 Too Many Requests
Retry-After: 12
X-RateLimit-Limit: 200
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 12Essa resposta significa, em português: "você atingiu o limite; espere 12 segundos e siga em frente". Não é um erro da sua chave nem dos seus dados — é só um pedido de pausa.
Não insista imediatamente
Repetir a chamada na hora, sem esperar, só piora a situação: você continua recebendo 429 e adia ainda mais a volta ao normal. Espere o tempo indicado no Retry-After.
Toda resposta traz headers que mostram sua situação atual em relação ao limite. Vale a pena lê-los para se antecipar, sem precisar esperar o 429 chegar.
| Header | O que informa |
|---|---|
X-RateLimit-Limit | O teto total de requisições na janela atual (ex.: 200 para leitura). |
X-RateLimit-Remaining | Quantas requisições ainda restam na janela atual. Quando chega a 0, a próxima vira 429. |
X-RateLimit-Reset | Em quantos segundos a janela reinicia e a contagem volta ao topo. |
Retry-After | Aparece só no 429: quantos segundos esperar antes de tentar de novo. |
Uma leitura útil: se o X-RateLimit-Remaining está caindo rápido e chegando perto de 0, é hora de reduzir o ritmo — não de acelerar.
Backoff é a técnica de aumentar a espera a cada nova tentativa, em vez de insistir no mesmo intervalo. Backoff exponencial dobra o tempo a cada tentativa (1s, 2s, 4s, 8s...), dando à API espaço para respirar.
A regra de ouro é simples: se a resposta trouxer Retry-After, respeite esse valor. Ele é preciso. Use o backoff exponencial apenas como plano B, quando o header não estiver disponível.
graph TD
A["Faz a requisição"] --> B{"Resposta 429?"}
B -->|Não| C["Segue o fluxo normal"]
B -->|Sim| D{"Tem Retry-After?"}
D -->|Sim| E["Espera os segundos indicados"]
D -->|Não| F["Espera com backoff exponencial (1s, 2s, 4s...)"]
E --> G["Tenta de novo"]
F --> GO gatilho abaixo é comum: você faz uma chamada e, se levar um 429, espera o tempo certo e tenta de novo automaticamente.
async function chamarComRetry(url, options = {}, tentativas = 5) {
for (let i = 0; i < tentativas; i++) {
const resp = await fetch(url, options);
if (resp.status !== 429) {
return resp; // deu certo (ou é outro erro que você trata separado)
}
// Respeita o Retry-After; se não vier, faz backoff exponencial.
const retryAfter = Number(resp.headers.get("Retry-After"));
const esperaSegundos = retryAfter || Math.pow(2, i);
console.log(`Rate limit atingido. Aguardando ${esperaSegundos}s...`);
await new Promise((r) => setTimeout(r, esperaSegundos * 1000));
}
throw new Error("Limite de tentativas esgotado após vários 429.");
}
// Uso: a apiKey vai como query param na URL
const resp = await chamarComRetry(
"https://api.gsengage.com/api/v1/leads?apiKey=SUA_CHAVE"
);import time
import requests
def chamar_com_retry(url, tentativas=5, **kwargs):
for i in range(tentativas):
resp = requests.get(url, **kwargs)
if resp.status_code != 429:
return resp # deu certo (ou é outro erro que você trata separado)
# Respeita o Retry-After; se não vier, faz backoff exponencial.
retry_after = resp.headers.get("Retry-After")
espera = int(retry_after) if retry_after else 2 ** i
print(f"Rate limit atingido. Aguardando {espera}s...")
time.sleep(espera)
raise RuntimeError("Limite de tentativas esgotado após vários 429.")
# Uso: a apiKey vai como query param na URL
resp = chamar_com_retry(
"https://api.gsengage.com/api/v1/leads?apiKey=SUA_CHAVE"
)Quando esse trecho retorna sem erro, significa que a chamada passou dentro do limite e seus dados chegaram — a espera aconteceu de forma transparente, sem você perder a requisição.
Antes de considerar sua integração pronta, passe por esta lista. Ela evita a maioria dos 429 antes que eles aconteçam.
Checklist de rate limit
0/6- Respeitar o
Retry-After: ele é a espera exata que a própria API recomenda. - Paginar com um
limitmaior para percorrer listas grandes em menos requisições. - Guardar em cache dados que mudam pouco (como os campos personalizados) e reconsultar só quando necessário.
- Repetir a chamada imediatamente após um 429 — isso só prolonga o bloqueio.
- Buscar página por página com
limitpequeno quando você poderia trazer muito mais de uma vez. - Consultar o mesmo recurso repetidamente em um loop apertado.
Menos chamadas com paginação
Ao listar leads, prospecções ou conversas, use os parâmetros limit e page. Aumentar o limit traz mais itens por resposta e reduz o número de requisições — cada página economizada é uma chamada que não conta para o seu limite. Veja os detalhes em Paginação e ordenação.
Leitura e escrita compartilham o mesmo limite?
Não. São contadores separados: 200 leituras por minuto e 100 escritas por minuto. Gastar suas leituras não consome suas escritas, e vice-versa.
A janela é deslizante ou fixa?
É fixa de 60 segundos. A cada novo minuto, a contagem reinicia do zero. O header X-RateLimit-Reset diz em quantos segundos isso acontece.
Recebi um 429. Fiz algo errado?
Não. O 429 não é um erro da sua chave nem dos seus dados — é apenas um pedido para desacelerar. Espere o tempo do Retry-After e continue normalmente.
Uso Zapier, Make ou n8n. Preciso me preocupar com isso?
Menos, porque essas ferramentas costumam repetir chamadas com espera automaticamente. Ainda assim, evite disparar volumes altos em rajada e prefira agendar execuções espaçadas.
Este artigo foi útil?
Autenticação com apiKey
Aprenda a criar sua apiKey, usá-la na URL das chamadas e proteger essa chave como se fosse uma senha.
Paginação, filtros e ordenação
Percorra listas grandes do GS Engage página por página, filtre por status ou cadência e ordene os resultados — do jeito certo para relatórios de BI.