Limites de requisição

Quantas requisições cada estabelecimento pode fazer por janela de tempo.

Como funciona

Os limites são aplicados por estabelecimento (empresaId da credencial) e por ambiente. Sandbox e produção têm os mesmos limites. Ao exceder, a API responde 429 Too Many Requests com o header Retry-After, em segundos.

Grupos e limites

GrupoLimiteRotas
Pesado15 / 60sGET /v1/store/merchants, GET /v1/store/merchants/{merchantId}, GET /v1/orders
Relatórios15 / 60sGET /v1/orders/summary, /grouped, /sectors, /products e /options (cota única entre as cinco rotas)
Catálogo100 / 180sCupons, avaliações, formas de pagamento e rotas de delivery e presencial em /v1/store
Polling15 / 300sGET /v1/orders/polling
Demais300 / 180sClientes, catálogo (/v1/catalog), GET /v1/orders/{orderId}, criação e edição de pedidos e demais rotas

As rotas de OAuth (/v1/oauth/token e /v1/oauth/revoke) não entram nos limites. Prefira webhooks a consultas repetidas para reduzir o número de requisições.

No polling, o intervalo recomendado é de 30 segundos. Ao passar da cota, o 429 traz um Retry-After de poucos segundos, sem penalidade: respeite o header e siga.

Como tratar o 429

  • Leia o Retry-After (em segundos) e espere esse tempo antes de tentar de novo.
  • Não repita durante o bloqueio: no uso indevido, insistir aumenta a penalidade.
  • Use a message para distinguir os casos: a de uso indevido cita "the same query was repeated"; a de cota é apenas "Too Many Requests".

Uso indevido

Além dos limites por janela de tempo, as consultas de pedidos, relatórios e detalhe do pedido têm uma proteção contra a repetição automática da mesma consulta. Ela protege o sistema do restaurante de consultas que não produzem informação nova.

Rotas afetadas

RotaConsulta
GET /v1/ordersHistórico de pedidos
GET /v1/orders/summaryResumo de vendas
GET /v1/orders/summary/groupedResumo por dimensão
GET /v1/orders/summary/sectorsRanking por setor
GET /v1/orders/summary/productsRanking por produto
GET /v1/orders/summary/optionsRanking por opção
GET /v1/orders/{orderId}Detalhe do pedido (contado por pedido)

Não entram: GET /v1/orders/polling e as rotas de criação e edição de pedidos.

A regra

A mesma consulta — mesma rota, mesmos filtros — não pode se repetir 20 vezes ou mais por hora.

O período observado depende da rota:

RotasPeríodo observado
GET /v1/orders/{orderId}Na última hora
GET /v1/orders e os cinco GET /v1/orders/summary*Em cada uma de duas horas seguidas

No detalhe, reler o mesmo pedido nesse ritmo interrompe o laço já na primeira hora. No histórico e nos relatórios, um pico isolado não bloqueia: o padrão precisa persistir por duas horas seguidas.

"Mesma consulta" é a URL completa com a querystring. Trocar o período, o groupBy ou a página faz uma consulta diferente.

No detalhe do pedido, a contagem é por pedido: percorrer pedidos diferentes não conta. Nenhum pedido muda a ponto de justificar 20 leituras na mesma hora; para saber de mudanças, use webhook ou polling.

A repetição nesse ritmo é uso indevido, mesmo respeitando os limites por janela.

Onde fica a linha

Periodicidade da sua rotinaChamadas por horaResultado
A cada 1 hora1Liberado
A cada 10 minutos6Liberado
A cada 5 minutos12Liberado
A cada 4 minutos15Liberado
A cada 3 minutos20Bloqueado
A cada 1 minuto60Bloqueado

Na prática, use intervalos de 5 minutos ou mais: nesse ritmo nenhuma das janelas é atingida.

Proteção contra repetição da mesma consulta

RotaLimite da mesma consultaPeríodo
GET /v1/orders e os cinco GET /v1/orders/summary*20 por horaDuas horas seguidas
GET /v1/orders/{orderId}20 por hora, para o mesmo pedidoUma hora
GET /v1/orders/pollingFora desta regra (cota própria, sem penalidade)—

A resposta

Todas as rotas da lista ficam bloqueadas para o estabelecimento, não apenas a consulta que disparou. O bloqueio vale para o empresaId da credencial no ambiente em que ocorreu (produção ou sandbox).


HTTP/1.1 429 Too Many Requests
Retry-After: 900


{
  "message": "Too Many Requests: the same query was repeated too many times; reduce the polling frequency. See https://docs.beefood.app/docs/limites",
  "status": 429
}

O status é o mesmo dos limites por janela. A diferença está na message, que cita the same query was repeated, e no tempo maior em Retry-After.

A penalidade aumenta

O primeiro bloqueio dura 15 minutos e dobra a cada nova detecção, até 24 horas.

DetecçãoDuração
1ª15 minutos
2ª30 minutos
3ª1 hora
4ª2 horas
5ª4 horas
6ª8 horas
7ª16 horas
8ª em diante24 horas

As chamadas que recebem 429 continuam contando. O degrau só sobe com uma chamada nova feita depois do bloqueio em vigor.

Parando o laço, o bloqueio atual é o último e expira sozinho, sem chamado. Após 24 horas sem reincidência, a contagem volta ao primeiro degrau.

Como ajustar a integração

  • Pedidos em tempo real: use webhooks. Se não puder recebê-los, use GET /v1/orders/polling a cada 30 segundos, que está fora desta regra.

  • Acompanhar um pedido: não reconsulte GET /v1/orders/{orderId} em laço. Use webhooks ou o polling.

  • Relatórios: consulte em intervalos de 5 minutos ou mais e guarde o resultado em cache. Para dias fechados, consulte uma vez e reaproveite.

  • Pedido específico: use GET /v1/orders/{orderId} em vez de listar e filtrar.

  • Resposta 429: respeite o Retry-After. Repetir a chamada durante o bloqueio aumenta a penalidade.

Perguntas frequentes

Fui bloqueado mas minha rotina é legítima. Verifique o intervalo: a linha fica entre 3 e 4 minutos. Use 5 minutos ou mais; se seu caso não se encaixa, fale com o suporte.

O bloqueio afeta meus outros aplicativos? Sim. A penalidade é do estabelecimento, não da credencial; todas as integrações do restaurante no mesmo ambiente são afetadas.

Paginar conta como repetição? Não, cada página é uma consulta diferente. Reiniciar a varredura a cada poucos minutos, porém, repete a página 1 e pode disparar a regra.

Preciso pedir desbloqueio? Não. Corrigida a frequência, a penalidade expira sozinha.