Pular para o conteúdo

O que é limitado ​

A maior parte da API REST não tem limite de requisições. Em particular, as rotas que você chama com uma chave REST para enviar notificações e gerenciar Apps, Templates, Segments e Devices respondem sem nenhum throttle por requisição, e nenhum header X-RateLimit-* é enviado em nenhuma rota.

Um pequeno conjunto de rotas tem um orçamento, por serem abertas à internet, sensíveis ou custosas. Quando o orçamento se esgota, a rota responde 429 com este corpo e um header Retry-After com os segundos restantes na janela atual:

json
{ "error": { "code": "rate_limited", "message": "too many requests, try again later" } }

Como o limite é contado ​

  • Janelas fixas de um minuto. O contador recomeça quando a janela termina, então Retry-After é de no máximo 60 segundos.
  • Os contadores ficam no Redis e são compartilhados entre as réplicas.
  • Cada orçamento é contado por IP do cliente, por dispositivo ou por usuário, conforme as tabelas abaixo. O IP é o que o servidor enxerga; atrás de um proxy, ele considera apenas os proxies confiáveis configurados para o deployment.
  • Se o Redis estiver indisponível, a requisição é permitida. Uma queda do contador não pode bloquear as pessoas, então um limite não é uma garantia de proteção.

Limites por rota ​

Rotas voltadas ao dispositivo usadas pelos SDKs, por dispositivo:

RotaLimite por minuto
POST /v1/apps/{app_id}/in-app-messages/eligible30
POST /v1/apps/{app_id}/in-app-messages/{id}/events120

Rotas do painel (autenticadas por sessão):

RotaLimite por minutoContado por
Push de teste para um dispositivo10usuário e App
Prévia de segmento60usuário e App
Billing: leitura atualizada do plano30usuário
Billing: confirmar uma sessão de checkout5usuário
Upload de mídia30IP do cliente
Testar as configurações de armazenamento de mídia10IP do cliente

Rotas de login, conta e setup, por IP do cliente:

RotaLimite por minuto
Login e reautenticação10
Refresh30
Aceitar convite10
Esqueci a senha5
Redefinir senha, verificar token de redefinição, verificar e-mail, definir senha10 cada
OAuth início, callback, cadastro20, 30, 5
Onboarding da empresa5

Os números vêm do código do servidor desta versão e podem mudar entre versões. Alguns orçamentos são compartilhados por nome entre rotas: login e reautenticação contam contra os mesmos 10 por minuto.

Tratando um 429 ​

  • Espere pelo menos Retry-After segundos antes de repetir a mesma chamada. Não repita em loop apertado.
  • Os SDKs de In-App esperam Retry-After: um 429 em eligible espera quando ele é de 60 segundos ou menos (no máximo 3 esperas) e, caso contrário, desiste pelo resto da sessão; um 429 em events pausa a fila por Retry-After, limitado entre 1 e 300 segundos, e o evento é reenviado com o mesmo event_id.
  • Não trate 429 como motivo para descartar dados: mantenha os eventos na fila e envie-os depois com o mesmo event_id.

Velocidade de envio de push por plano ​

Separadamente dos limites de requisição acima, o plano limita quantas entregas Android (FCM) o Notti inicia por minuto para um App: 100 no Free, 250 no Start, 500 no Pro e 1.000 no Business. O excedente é agendado para os minutos seguintes, não rejeitado, então a chamada de API que envia a notificação ainda responde normalmente e nenhum 429 está envolvido. As entregas iOS não são afetadas. Veja Uso e cobrança.

429 de saída do FCM e do APNs ​

O worker de entrega do Notti também lê respostas 429 Too Many Requests vindas do FCM e do APNs enquanto envia notificações. Ele as trata como erros de entrega com nova tentativa e espera antes de enviar de novo ao dispositivo. Isso é throttling do lado do provedor no trecho de saída, sem relação com a rapidez com que você pode chamar esta API, e não é exposto a você como chamador.

Orientações práticas ​

  • Enviar para um Segment grande é uma única chamada de API; a entrega é distribuída internamente por Device, então você não precisa limitar os envios para ficar abaixo de uma quantidade de dispositivos.
  • Ao automatizar operações em massa em Apps, Templates ou Segments, nenhum teto é aplicado hoje, mas mantenha a concorrência razoável: o backend ainda tem capacidade real de CPU, banco de dados e Redis por trás.