logo
logo

Introdução

Rate Limit, ou limite de requisição, é o número máximo de requisições que um único aplicativo pode fazer em um determinado período de tempo. Quando o aplicativo excede esse limite, a solicitação da API falhará e retornará um código de status HTTP 429 (Too Many Requests).Esses limites nos ajudam a fornecer uma API confiável e escalável para todos os usuários.

Como funcionam

Cada módulo e endpoint da API do iFood possui políticas específicas de limites de requisição. Os limites variam com base em:
  • O endpoint específico sendo acessado.
  • O tipo da sua aplicação.
  • Janela de tempo (por minuto, hora ou dia).

Tratamento de erros 429

Se você receber um erro 429:
  1. Revise o comportamento da sua aplicação.
  2. Verifique se há código que possa estar em um loop.
  3. Implemente recuo exponecial e lógica de novas. tentativas.
  4. Considere armazenar respostas em cache quando apropriado.
Muitos erros 429 ocorrem quando aplicações entram em estado de loop devido a falhas inesperadas. Verifique se sua aplicação realmente precisa fazer requisições frequentes ao endpoint afetado.

Boas práticas

  • Implemente monitoramento de taxa de requisições na sua aplicação.
  • Adicione tratamento de erros específico para respostas 429.
  • Use nossos cabeçalhos de resposta para acompanhar seu uso atual:
    • X-RateLimit-Limit: Sua alocação total de requisições.
    • X-RateLimit-Remaining: Requisições restantes na janela atual.
    • X-RateLimit-Reset: Tempo (em segundos) até que seu limite seja redefinido.
Confira esse artigo sobre Boas práticas com as APIs do iFood.

Limites específicos por módulo

Confira abaixo os limites específicos de requisição que se aplicam a cada módulo.
EndpointLimite
POST /oauth/token20 req/min
POST /oauth/userCode20 req/min
EndpointLimite
GET /events:polling6000 req/min
POST /events/acknowledgment6000 req/min
GET /orders/{id}3000 req/min
GET /orders/{id}/virtual-bag1000 req/s
POST /orders/{id}/confirm3000 req/min
POST /orders/{id}/startPreparation3000 req/min
POST /orders/{id}/readyToPickup3000 req/min
POST /orders/{id}/dispatch3000 req/min
POST /orders/{id}/requestCancellation300 req/min
POST /orders/{id}/tracking5000 req/min
POST /order/v1.0/disputes/{disputeId}/accept1000 req/min
POST /order/v1.0/disputes/{disputeId}/reject1000 req/min
POST /order/v1.0/disputes/{disputeId}/alternatives/{alternativeId}1000 req/min
EndpointLimite
GET /merchants/{merchantId}/deliveryAvailabilities4000 req/min
GET /orders/{orderId}/deliveryAvailabilities4000 req/min
POST /merchants/{merchantId}/order4000 req/min
POST /orders/{orderId}/requestDriver4000 req/min
POST /orders/{orderId}/cancel600 req/min
POST /orders/{orderId}/cancelRequestDriver600 req/min
POST /orders/{orderId}/userConfirmAddress500 req/min
POST /orders/{orderId}/deliveryAddressChangeRequest500 req/min
POST /orders/{orderId}/acceptDeliveryAddressChange500 req/min
POST /orders/{orderId}/denyDeliveryAddressChange500 req/min
GET /orders/{orderId}/safeDelivery500 req/min
EndpointLimite
GET /merchants100 req/min
GET /merchants/{merchantId}300 req/min
GET /merchants/{merchantId}/status20000 req/min
GET /merchants/{merchantId}/interruptions100 req/min
POST /merchants/{merchantId}/interruptions200 req/min
DELETE /merchants/{merchantId}/interruptions/{interruptionId}100 req/min
GET /merchants/{merchantId}/opening-hours100 req/min
PUT /merchants/{merchantId}/opening-hours100 req/min
EndpointLimite
GET /merchants/{merchantId}/reviews2000 req/min
GET /merchants/{merchantId}/reviews/{reviewId}2000 req/min
POST /merchants/{merchantId}/reviews/{reviewId}/answers2000 req/min
GET /merchants/{merchantId}/summary2000 req/min
EndpointLimite
GET /merchants/{merchantId}/sales1000 req/min
GET /merchants/{merchantId}/payments1000 req/min
GET /merchants/{merchantId}/paymentDetails1000 req/min
GET /merchants/{merchantId}/occurrences1000 req/min
GET /merchants/{merchantId}/maintenanceFees1000 req/min
GET /merchants/{merchantId}/incomeTaxes1000 req/min
GET /merchants/{merchantId}/periods?competence={competence}1000 req/min
GET /merchants/{merchantId}/chargeCancellations1000 req/min
GET /merchants/{merchantId}/cancellations1000 req/min
GET /merchants/{merchantId}/receivableRecords1000 req/min
GET /merchants/{merchantId}/salesAdjustments1000 req/min
GET /merchants/{merchantId}/salesBenefits1000 req/min
GET /merchants/{merchantId}/adjustmentsBenefits1000 req/min
EndpointLimite
Todos os endpoints do módulo Catalog15000 req/min
EndpointLimite
GET /merchants/{merchantId}/catalogs/{catalogId}/categories3000 req/min
POST /merchants/{merchantId}/catalogs/{catalogId}/categories3000 req/min
GET /merchants/{merchantId}/catalogs/{catalogId}/categories/{categoryId}3000 req/min
PATCH /merchants/{merchantId}/catalogs/{catalogId}/categories/{categoryId}3000 req/min
GET /merchants/{merchantId}/categories/{categoryId}/items3000 req/min
DELETE /merchants/{merchantId}/categories/{categoryId}3000 req/min
GET /merchants/{merchantId}/catalogs3000 req/min
GET /merchants/{merchantId}/catalogs/{catalogId}/unsellableItems3000 req/min
GET /merchants/{merchantId}/catalogs/{groupId}/sellableItems3000 req/min
GET /merchants/{merchantId}/catalogs/{catalogId}/changelog3000 req/min
GET /merchants/{merchantId}/catalog/version3000 req/min
GET /merchants/{merchantId}/products3000 req/min
POST /merchants/{merchantId}/products3000 req/min
PUT /merchants/{merchantId}/products/{productId}3000 req/min
DELETE /merchants/{merchantId}/products/{productId}3000 req/min
PATCH /merchants/{merchantId}/products/status5000 req/min
PATCH /merchants/{merchantId}/products/price5000 req/min
GET /merchants/{merchantId}/product/{productId}3000 req/min
GET /merchants/{merchantId}/products/externalCode/{externalCode}3000 req/min
DELETE /merchants/{merchantId}/categories/{categoryId}/products/{productId}3000 req/min
GET /merchants/{merchantId}/items/{itemId}/flat3000 req/min
PATCH /merchants/{merchantId}/item/price5000 req/min
PATCH /merchants/{merchantId}/item/status5000 req/min
PATCH /merchants/{merchantId}/item/externalCode3000 req/min
PUT /merchants/{merchantId}/items3000 req/min
GET /merchants/{merchantId}/optionGroups5000 req/min
DELETE /merchants/{merchantId}/optionGroups/{optionGroupId}3000 req/min
PATCH /merchants/{merchantId}/optionGroups/{optionGroupId}5000 req/min
DELETE /merchants/{merchantId}/optionGroups/{optionGroupId}/products/{productId}5000 req/min
PATCH /merchants/{merchantId}/optionGroups/{optionGroupId}/status5000 req/min
DELETE /merchants/{merchantId}/optionGroups/{optionGroupId}/products/{productId}/option5000 req/min
PATCH /merchants/{merchantId}/options/price5000 req/min
PATCH /merchants/{merchantId}/options/status5000 req/min
PATCH /merchants/{merchantId}/options/externalCode5000 req/min
GET /merchants/{merchantId}/batch/{batchId}5000 req/min
POST /merchants/{merchantId}/inventory5000 req/min
GET /merchants/{merchantId}/inventory/{productId}5000 req/min
POST /merchants/{merchantId}/inventory/batchDelete5000 req/min
POST /merchants/{merchantId}/version/upgrade3000 req/min
POST /merchants/{merchantId}/version/downgrade3000 req/min
EndpointLimite
POST /merchants/{merchantId}/promotions1000 req/min
EndpointLimite
POST /ingestion/{merchantId}1000 req/s
PATCH /ingestion/{merchantId}1000 req/s
EndpointLimite
POST /logistics/v1.0/orders/{id}/assignDriver3000 req/min
POST /logistics/v1.0/orders/{id}/goingToOrigin3000 req/min
POST /logistics/v1.0/orders/{id}/arrivedAtOrigin3000 req/min
POST /logistics/v1.0/orders/{id}/dispatch3000 req/min
POST /logistics/v1.0/orders/{id}/arrivedAtDestination3000 req/min
POST /logistics/v1.0/orders/{id}/verifyDeliveryCode3000 req/min
EndpointLimit
POST /orders/{id}/startSeparation1000 req/s
POST /orders/{id}/endSeparation1000 req/s
POST /orders/{id}/items1000 req/s
PATCH /orders/{id}/items/{uniqueId}1000 req/s
DELETE /orders/{id}/items/{uniqueId}1000 req/s