Rate Limit

O que é o Rate Limit?

É um limite que define o quanto alguma ação consegue ser executada dentro de um espaço de tempo.

Como funciona o rate limit?

O Rate Limit determina quantas requisições um usuário pode realizar em um período determinado de tempo para uma das rotas de nossa aplicação. Por exemplo, um usuário não pode executar mais do que 10 requisições no período de um segundo e quando a cota limite de requisições neste período for excedida, o usuário irá receber um código de erro na resposta, informando que o limite foi excedido.

No Pagar.me, caso em alguma situação seja ultrapassado o limite de requisições em alguma de nossas rotas, será retornado o código de erro HTTP 429 e a mensagem “Too Many Requests” ou a mensagem “Rate limit exceeded” por nossa API.

Quais são os limites de cada rota da API do Pagar.me?

O Pagar.Me verifica o limite de requisição para suas rotas considerando duas unidades de tempo:

  • Minuto
  • Segundo

Sendo assim, é possível que um bloqueio ocorra para determinado conjunto de requisições de acordo com a quantidade de envios dentro de mais de um período de tempo.

RotaMétodoRequisições por segundoRequisições por minuto
/:model/:model_id/eventsGET4Não Aplicado
/:model/:model_id/operationsGET3Não Aplicado
/:model/:model_id/postbacksGET3Não Aplicado
/:model/:model_id/postbacks/:id/redeliverPOST3Não Aplicado
/balanceGET4300
/balance/operationsGET6Não Aplicado
/bank_accountsPOST3Não Aplicado
/bank_accountsGET2Não Aplicado
/boletos/:idGET30Não Aplicado
/bulkPOST3Não Aplicado
/cardsGET8400
/companiesPOST1Não Aplicado
/companyGET12700
/customers/:idGET5Não Aplicado
/ordersGET10Não Aplicado
/orders/:idGET3Não Aplicado
/payablesGET12700
/payables/:idGET10Não Aplicado
/payment_links/:idGET15Não Aplicado
/recipient/:idPUT3Não Aplicado
/recipientsPOST5300
/recipients/:idGET5Não Aplicado
/recipients/:id/balanceGET5300
/recipients/:recipient_id/balance/operationsGET6300
/recipients/:recipient_id/balance/operations.(csv|xlsx)GET5Não Aplicado
/recipients/:recipient_id/bulk_anticipations/limitsGET10Não Aplicado
/searchGET7400
/subscriptionsGET5300
/subscriptions/:idGET13Não Aplicado
/subscriptions(|.:format)GET5Não Aplicado
/subscriptions/:id/transactionsGET13Não Aplicado
/terminal/aidsGET10Não Aplicado
/terminal/capksGET10Não Aplicado
/transactions(|.:format)GET12700
/transactions/:idGET10Não Aplicado
/transactions/:transaction_id/payablesGET10Não Aplicado
/transactions/calculate_installments_amountGET100Não Aplicado
/transactions/:transaction_id/send_receiptPOST10Não Aplicado
/transfersPOST3Não Aplicado
/transfers/:idGET5Não Aplicado
/transfers/limitsGET3Não Aplicado
/zipcodes/:idGET30Não Aplicado

Para rotas de GET que não estão listadas nesta tabela, aplica-se o limite padrão de 4 requisições por segundo.

Para rotas de POST e PUT não listadas na tabela, não se aplica nenhum rate limit.

❗️

Alteração dos limites

O Pagar.me pode alterar o limite das rotas de acordo com a necessidade de mantermos a qualidade em nossos serviços. Você pode checar sempre que necessário estes limites nesta página da documentação.

Como adaptar meu sistema para atender a esse limite?

É possível adaptar suas diretrizes de envio de requisições, a partir de cabeçalhos (headers) para que vocês tenham um melhor controle de sua integração.
Para isso disponibilizamos as seguintes informações no header de cada resposta da API:

X-RateLimit-Limit
X-RateLimit-Remaining
X-RateLimit-Reset
Retry-After
Campo no HeaderDescrição
X-RateLimit-Limitindica a cota limite em unidades de requisições em uma janela de tempo
X-RateLimit-Remainingindica a cota restante em unidades de requisições dentro de uma janela de tempo.
X-RateLimit-Resetindica o horário no padrão epoch time que ocorrerá o reset da contagem da cota limite de unidades de requisições dentro da janela de tempo atual, portanto a partir deste horário, uma nova cota de requisições estará disponível.
Retry-Afterindica os segundos para que seja realizado o reset da cota limite dentro de determinada janela de tempo.

Como exemplo, se for retornado os headers no horário Mon, 05 Aug 2019 09:27:00 GMT em uma requisição que ocorreu o erro HTTP 429:

Retry-After: 5 
X-RateLimit-Reset: 1564997225 
X-RateLimit-Limit: 100
X-Ratelimit-Remaining: 0

Significa que a cota em unidades de requisições desta rota, possui um limite de 100 requisições dentro de uma janela de tempo pré-definida e já foram realizadas as 100 requisições dentro deste período e que, em 5 segundos ( Mon, 05 Aug 2019 09:27:05 GMT ), este limite será resetado e uma nova cota de requisições será disponibilizada.

Existem diversas bibliotecas disponíveis para clientes HTTP que podem auxiliar nas definições e gerenciamento de políticas de envio de requisições, como a axios-rate-limit para o cliente Axios ou outras bibliotecas como o Limiter para Ruby ou limiter para node.js.

Outro solução que pode auxiliar o gerenciamento de requisições é aplicar um algoritmo de backoff exponencial em vez de uma lógica de nova tentativa. Esse algoritmo fornece melhor controle de fluxo para tais cenários.

O backoff exponencial aguardará tempos progressivamente mais longos entre as novas tentativas de solicitação assim atendendo aos limites de cada rota.
Abaixo apresentamos um exemplo de código de envio de retentativa de uma requisição utilizando o algoritmo de backoff exponencial em cada tentativa.

algoritmo BackoffExponencial
início
   inteiro numeroDeTentativas <- 0
   logico sistemaDeveRetentar <- falso
   constante inteiro numeroMaximoDeRetentativas <- 5
   faça
       se (numeroDeTentativas > 0)
           aguarde por 2^numeroDeTentativas x 200 milissegundos antes de continuar
       respostaDaAPIPagarme <- Resultado da Requisição
       se (respostaDaAPIPagarme == "429 - rate limit excedido")
           sistemaDeveRetentar <- verdadeiro
       senão
           sistemaDeveRetentar <- falso
       numeroDeTentativas <- numeroDeTentativas + 1
   enquanto (sistemaDeveRetentar E numeroDeTentativas < numeroMaximoDeRetentativas)
fim

Quando esse limite entra em vigor?

No dia 05/07, vamos mudar os limites relacionados ao “Rate Limit” em diversas rotas de nossa API.