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:
{ "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:
| Rota | Limite por minuto |
|---|---|
POST /v1/apps/{app_id}/in-app-messages/eligible | 30 |
POST /v1/apps/{app_id}/in-app-messages/{id}/events | 120 |
Rotas do painel (autenticadas por sessão):
| Rota | Limite por minuto | Contado por |
|---|---|---|
| Push de teste para um dispositivo | 10 | usuário e App |
| Prévia de segmento | 60 | usuário e App |
| Billing: leitura atualizada do plano | 30 | usuário |
| Billing: confirmar uma sessão de checkout | 5 | usuário |
| Upload de mídia | 30 | IP do cliente |
| Testar as configurações de armazenamento de mídia | 10 | IP do cliente |
Rotas de login, conta e setup, por IP do cliente:
| Rota | Limite por minuto |
|---|---|
| Login e reautenticação | 10 |
| Refresh | 30 |
| Aceitar convite | 10 |
| Esqueci a senha | 5 |
| Redefinir senha, verificar token de redefinição, verificar e-mail, definir senha | 10 cada |
| OAuth início, callback, cadastro | 20, 30, 5 |
| Onboarding da empresa | 5 |
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-Aftersegundos antes de repetir a mesma chamada. Não repita em loop apertado. - Os SDKs de In-App esperam
Retry-After: um429emeligibleespera quando ele é de 60 segundos ou menos (no máximo 3 esperas) e, caso contrário, desiste pelo resto da sessão; um429emeventspausa a fila porRetry-After, limitado entre 1 e 300 segundos, e o evento é reenviado com o mesmoevent_id. - Não trate
429como motivo para descartar dados: mantenha os eventos na fila e envie-os depois com o mesmoevent_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.