Limites
Requisições por segundo, cotas de envio por plano e os tamanhos máximos de cada recurso.
#Requisições por segundo
Cada time tem um limite de requisições por segundo, somando todas as chaves. O valor depende do plano:
| Plano | Requisições por segundo |
|---|---|
| Grátis | 5 |
| Profissional | 10 |
| Escala | 20 |
| Empresarial | 50 |
Valores atualizados da GET /plans ao abrir a página.
O limite em vigor para o seu time aparece em GET /usage (rate_limit). Os apps que têm só uma chave de envio também enxergam o limite: GET /usage aceita chaves sending_access, e os cabeçalhos X-RateLimit-* vêm em toda resposta, inclusive no envio. Toda resposta traz os cabeçalhos:
| Cabeçalho | Descrição |
|---|---|
X-RateLimit-Limit | Requisições permitidas por segundo. |
X-RateLimit-Remaining | Quantas ainda cabem no segundo atual. |
Retry-After | Só no 429: segundos até poder tentar de novo. |
X-RateLimit-Reset | Só no 429: quando o limite zera (Unix timestamp). |
Passou do limite, a resposta é 429 rate_limit_exceeded. Para enviar muitos e-mails, use o envio em lote: 100 e-mails contam como uma requisição.
O limite é do time, não da chave, e vale também para o servidor MCP. Os SDKs leem os cabeçalhos para você: postal.rateLimit (Node.js) e $postal->rateLimit() (PHP) guardam o limite da última resposta, mesmo com uma chave só de envio, e esperam o Retry-After antes de repetir um 429.
#Cotas de envio
Os envios contam quando o e-mail é criado (inclusive agendados e testes de template). Cada destinatário de uma campanha, cada teste de campanha e cada e-mail de automação também conta. O dia e o mês são contados em UTC.
| Plano | Por dia | Por mês |
|---|---|---|
| Grátis | 100 | 3.000 |
| Profissional | Sem limite | 50.000 |
| Escala | Sem limite | 100.000 |
| Empresarial | Sem limite | Sob medida |
Valores atualizados da GET /plans ao abrir a página.
Ao atingir a cota, os envios recebem 429 daily_quota_exceeded ou 429 monthly_quota_exceeded (no SMTP, 452 4.5.3). Uma campanha que esbarra na cota no meio do envio fica pausada e continua sozinha quando ela renova; um envio de automação falha, e a execução também. Nos planos que permitem, você pode ativar o envio além da cota no painel, em Cobrança: os e-mails extras são cobrados por mil, sem bloqueio. O plano continua o mesmo; você paga só pelos pacotes a mais, na próxima fatura. Acompanhe o consumo em GET /usage.
Reputação da conta. O limite diário que vale é o menor entre o do plano e o teto da reputação da conta: uma pontuação de 0 a 100 que começa em 0 nas contas novas e sobe a cada dia de envios sem bounces nem reclamações. Nos níveis 1 a 4, o teto é de 500, 2.000, 5.000 e 10.000 e-mails por dia; no nível 5, vale só o limite do plano. O limite em vigor está em emails.daily.limit de GET /usage, com plan_limit (o do plano) e limited_by (plan ou reputation), e o bloco reputation traz a pontuação, o nível e o próximo nível. Quando é a reputação que limita, a mensagem do 429 daily_quota_exceeded diz o nível e o teto.
Adicional de envios. Quando o plano do time tem um limite mensal e oferece o Adicional de envios, o dono ou um admin compra, num pagamento único, uma reserva de envios que só é usada depois que a cota mensal acaba: primeiro a cota do plano, depois a reserva (um crédito por e-mail, os que vencem antes primeiro), depois o envio além da cota, se o time o ligou, e só então a recusa. As campanhas não usam a reserva, os e-mails para endereços de teste não gastam crédito, e o limite diário do plano continua valendo. A mensagem do 429 monthly_quota_exceeded diz onde comprar quando dá. Veja Adicional de envios e a referência da API.
Reputação de envio
Para proteger a entrega de todos, a Postal pausa os envios de um time quando, nos últimos 7 dias, os bounces permanentes passam do limite do nível da reputação da conta (3% no nível 1, 4% no nível 2 e 5% do nível 3 em diante), as reclamações de spam passam de 0,3% ou o conteúdo rejeitado pelos provedores passa de 5% dos e-mails enviados. As taxas são julgadas a partir de 100 envios no período nos níveis 1 a 3 e de 1.000 nos níveis 4 e 5. Nos níveis 1 a 3, a Postal também olha as últimas 24 horas, e os bounces de todos os tipos acima de 15% também pausam. Nas primeiras 24 horas depois do primeiro envio do time, a pausa por bounces permanentes só acontece acima do dobro do limite. Os endereços de teste não entram na conta. Cada pausa tira 40 pontos da reputação da conta. O e-mail de pausa lista até 10 endereços com os bounces mais recentes (eles já ficam suprimidos). Enquanto os envios estão pausados, eles recebem 403 sending_paused. Peça a revisão no painel (não há endpoint público para isso) ou pelo formulário de contato para liberar.
Como ser avisado antes e como detectar a pausa: quando os bounces permanentes chegam ao aviso do nível (2% no nível 1, 2,5% no nível 2 e 3% do nível 3 em diante) ou as reclamações a 0,15%, os donos e administradores do time recebem um aviso por e-mail, antes da pausa (um quando a taxa cruza o nível; o próximo só se ela piorar 1 ponto percentual, ou 0,1 nas reclamações, ou depois de 7 dias); ao pausar, recebem outro. Pela API, assine os eventos sending.paused e sending.resumed dos webhooks para alertar a sua equipe na hora, ou consulte GET /usage, que traz sending.paused, paused_at, o reason e review_requested_at (quando a revisão foi pedida). Um lote de convites ou de e-mails com endereços errados é a causa mais comum: valide os endereços antes de enviar e trate os bounces recebidos nos webhooks.
Endereços suprimidos: um bounce permanente põe o endereço na lista de supressão automaticamente. Se a pessoa corrigiu o e-mail, remova com DELETE /suppressions/{id} ou em lote com POST /suppressions/batch/remove e o envio volta a funcionar.
#Recursos por plano
Planos e preços: postal.so/precos ou, por API, GET /plans (público, sem chave).
| Grátis | Profissional | Escala | Empresarial | |
|---|---|---|---|---|
| Domínios | 3 | 10 | 1.000 | Sem limite |
| Inboxes | 3 | 10 | 100 | Sem limite |
| Inboxes no seu domínio | Não | Sim | Sim | Sim |
| Pessoas no time | 3 | 10 | Sem limite | Sem limite |
| Créditos de IA por mês | 10 | 100 | 1.000 | Sem limite |
| Execuções de automação por mês | 1.000 | 10.000 | 100.000 | Sem limite |
| Contatos (plano de marketing) | 1.000 | 5.000 | 50.000 | Sem limite |
| Segmentos (plano de marketing) | 3 | Sem limite | Sem limite | Sem limite |
| Campanhas por mês (plano de marketing) | Sem limite | Sem limite | Sem limite | Sem limite |
| Layouts | 10 | Sem limite | Sem limite | Sem limite |
| Testes A/B nas automações | Não | Sim | Sim | Sim |
| Créditos de validação de e-mails por mês (plano de marketing) | 100 | 5.000 | 50.000 | Sem limite |
| Conexões de CRM (plano de marketing) | 0 | 1 | 5 | Sem limite |
| Integrações com apps (plano de marketing) | 1 | 3 | 10 | Sem limite |
Valores atualizados da GET /plans ao abrir a página.
Times podem ter limites ajustados individualmente. O valor que vale para você é sempre o de GET /usage.
#Limites e recursos do plano
Cada plano define, por time, quantas coisas você pode ter e quais recursos estão incluídos. Passar do limite de um item ou usar um recurso que o plano não inclui responde 403 plan_limit_reached, com uma mensagem que diz qual. A lista completa, com o texto de cada recurso e se a API já o aplica (enforced), vem em GET /plans (feature_catalog), e os valores do seu time em GET /usage. Nos números, null é ilimitado e 0 é não incluído; nos recursos liga/desliga, 1 é incluído e 0 não.
Quantidade
Só bloqueiam a criação de mais um item. O que já existe nunca é apagado.
Contatos acima do limite. O limite de contatos do plano de marketing também pode ser ultrapassado, como o de e-mails: em Cobrança, o dono ou admin do time liga Continuar adicionando contatos acima do limite do plano (um botão para cada produto, desligado por padrão). Ligado, importações, formulários, a API e as integrações de CRM deixam de recusar com 403 plan_limit_reached ao chegar no limite, e os contatos extras são cobrados por pacote de 1.000 (arredondando para cima) na próxima fatura, sem trocar de plano. O que se cobra é o maior número de contatos que o time teve no período de cobrança (ou de contatos que receberam campanhas no ciclo, se for maior: veja abaixo), e apagar contatos depois não baixa o que já foi medido. Descadastrados e endereços suprimidos contam como contato, como sempre. Só vale com assinatura de marketing ativa, num plano que permita excedente e que tenha preço de contatos extras; sem isso, o limite continua recusando. A mensagem de recusa diz como ligar quando a opção está disponível.
Adicional de contatos. Quando o plano de marketing do time oferece o Adicional de contatos, o dono ou um admin soma contatos ao limite sem trocar de plano: o preço do pacote entra na fatura da assinatura e o limite passa a ser o do plano mais o dos pacotes. O limite que a API confere (403 plan_limit_reached) e o que GET /usage mostra já incluem os pacotes. Só valem com um plano de marketing pago e ativo. Veja Adicional de contatos e a referência da API.
Contatos que recebem campanhas no ciclo
O limite de contatos do plano de marketing (com o Adicional de contatos) vale também para quem recebe campanhas: no ciclo de uso do time (o mês que renova no dia do seu plano), as campanhas e os e-mails de automação podem ir para até esse número de contatos diferentes. Cada endereço conta uma vez por ciclo. Quem já recebeu campanha no ciclo continua contando até a renovação, mesmo se for apagado, e apagar e criar de novo o mesmo endereço não conta duas vezes. Apagar contatos que ainda não receberam campanha libera espaço na hora. Enviar várias campanhas para os mesmos contatos não consome mais. Os e-mails transacionais não contam.
Exemplo, com limite de 50.000 contatos: enviar 5 campanhas para os mesmos 50.000 contatos no ciclo está dentro do plano. Apagar os 50.000 que já receberam e importar outros 50.000 no mesmo ciclo passa do limite: a campanha para os novos é recusada até a renovação.
Uma campanha que passaria do limite é recusada inteira, sem enviar nada, com 422 cycle_recipients_limit, uma mensagem com os números, a data da renovação e o que fazer, e o bloco cycle_recipients (new, used, limit, remaining e resets_at). A Postal confere de novo quando uma campanha agendada vai sair: se não couber mais, ela fica pausada com o mesmo motivo. Um e-mail de automação para um contato que ainda não recebeu nada no ciclo, com o limite cheio, é pulado. O dono e os admins recebem um e-mail ao chegar a 80% e a 100%. Com o excedente de contatos ligado, nada é recusado e os contatos acima do limite são cobrados como contatos extras. Sem limite de contatos, não há limite de destinatários. O contador está em GET /usage (marketing_recipients) e em Configurações › Uso, e o efeito de uma campanha, antes de enviar, em GET /broadcasts/audience.
| Chave | O que conta | Onde bloqueia |
|---|---|---|
domains | Domínios de envio | POST /domains e a reivindicação de domínio |
inboxes | Inboxes | POST /inboxes |
templates | Templates | POST /templates e duplicar |
layouts | Layouts | POST /layouts e duplicar |
api_keys | Chaves de API | POST /api-keys |
webhooks | Endpoints de webhook | POST /webhooks |
team_members | Pessoas no time (convites pendentes contam) | Convidar pessoas, no painel |
contacts | Contatos | Criar contatos pela API, por importação, formulário ou integração |
segments | Segmentos | POST /segments e unificar segmentos |
topics | Tópicos | POST /topics |
forms | Formulários | POST /forms |
automations | Automações (ativas ou não) | POST /automations |
broadcasts_per_month | Campanhas enviadas ou agendadas no mês (UTC) | Enviar ou agendar uma campanha |
crm_connections | Conexões de CRM | Criar a conexão |
app_integrations | Integrações com apps (Stripe, Supabase, Clerk, Firebase, Auth0) | Criar a integração |
attachments_mb | Tamanho total dos anexos de um e-mail, em MB. 0 não permite anexos; vazio (null) usa o limite da plataforma, de 40 MB | Enviar e-mails com anexos |
Outros limites mensais não dão 403: emails_per_day e emails_per_month dão 429 (veja cotas de envio); ai_credits, 429 ai_credits_exhausted; email_verifications_per_month, 403 se o plano não inclui a validação de e-mails e 429 verification_credits_exhausted quando os créditos acabam; e automation_runs: acima do limite, as novas execuções de automação não começam (ficam como skipped).
Recursos liga/desliga
| Chave | O que libera | Onde bloqueia |
|---|---|---|
batch_sending | Envio em lote | POST /emails/batch |
scheduled_sending | Agendamento de envios | scheduled_at em POST /emails |
test_addresses | Endereços de teste simulados | Enviar para @sandbox.postal.so |
smtp_access | Envio por SMTP | O SMTP recusa a mensagem com 550 5.7.1 |
engagement_tracking | Rastreio de aberturas e cliques | Ligar open_tracking ou click_tracking num domínio (os que já rastreiam continuam) |
custom_domain_records | Return-Path e subdomínio de rastreio próprios | custom_return_path e tracking_subdomain novos ou alterados |
shared_email_links | Links para compartilhar e-mails | POST /emails/{id}/share |
custom_inbound_domains | Inboxes e recebimento no seu domínio | Criar inboxes e ativar capabilities.receiving em domínios próprios |
inbox_agent | Agente de IA da inbox | Ligar o agente numa inbox |
exports | Exportações em CSV | POST /exports e a exportação das respostas de formulários |
mcp_access | Servidor MCP | O endpoint /mcp |
restricted_api_keys | Chaves só de envio ou restritas a um domínio | POST /api-keys com permission: "sending_access" (as chaves já criadas continuam valendo) |
dynamic_segments | Segmentos dinâmicos | Criar um segmento dinâmico (os existentes continuam) |
form_analytics | Análise dos formulários | GET /forms/overview e GET /forms/{id}/analytics, com as respostas por pergunta e a exportação da análise |
automation_experiments | Testes A/B nas automações | Passos de experimento A/B |
postal_branding | Selo “Enviado com Postal” (invertido: 1 é ter o selo) | Esconder o selo em um formulário |
retention_days, priority_support, uptime_sla e dedicated_manager são informativos: a API não bloqueia nada por eles (a retenção é de 30 dias para todos, e o suporte é combinado à parte).
Quando o plano cai
Quando o plano muda, a quantidade que o time já tem pode passar do novo limite. Nada é apagado: de domínios, inboxes, templates, layouts, chaves de API, webhooks, automações, segmentos, tópicos e formulários, os mais antigos até o limite continuam ativos e os mais novos ficam com paused_by_plan: true. Um item pausado aparece nas listas e pode ser lido e excluído, mas não alterado nem usado: o domínio não envia, a chave de API não autentica, o webhook não recebe eventos, o template não envia, o formulário sai do ar, a automação não dispara, o segmento não serve de público e a inbox não roda o agente (ela continua recebendo e-mails). Qualquer tentativa de alterar responde 403 paused_by_plan. Os itens voltam sozinhos quando o plano, a faixa de volume ou a contagem permitem, e GET /usage lista o que está pausado em paused. Contatos, pessoas no time e conexões não são pausados: o limite só impede adicionar mais.
As cotas de e-mails por mês e o número de contatos seguem a faixa de volume contratada (veja Planos), e um time pode ter limites ajustados individualmente. O valor que vale para você é sempre o de GET /usage.
A escala de volume é feita de faixas definidas pela Postal (por exemplo 3.000, 50.000, 100.000 e 250.000 e-mails por mês): cada plano atende algumas dessas faixas, com o preço de cada uma, e acima da última faixa só o plano sob medida atende. A lista das faixas e das que cada plano atende está em GET /plans (volume_bands e bands).
#Tamanhos e quantidades
| O quê | Limite |
|---|---|
Destinatários em to | 50 por e-mail |
E-mails por lote (POST /emails/batch) | 100 |
| Anexos | 40 MB no total por e-mail (menos, se o plano limitar: attachments_mb) |
| Anexos de respostas, mensagens e rascunhos da inbox | Até 10 arquivos e 40 MB no total |
| Mensagem pelo SMTP | 40 MB e 50 destinatários |
Agendamento (scheduled_at) | Até 30 dias no futuro |
Endereços de teste ([email protected]…) | Não contam na cota de envio, nem nas taxas de bounce e de reclamação da reputação; o limite de requisições por segundo vale |
| Tags | 50 por e-mail; nome e valor com até 256 caracteres |
| Assunto e valores de cabeçalho | 998 caracteres |
| Itens por página nas listas | 100 |
Idempotency-Key | 256 caracteres, guardada por 24 horas |
Imagens (POST /assets) | 5 MB |
| Exportações em andamento | 3 por time |
Link público de um e-mail (POST /emails/{id}/share) | Vale de 1 minuto a 48 horas |
Métricas (GET /emails/metrics) | Até 10.000 períodos e 100 IDs em cada filtro |
Instruções de DNS por e-mail (POST /domains/{id}/instructions) | Até 5 destinatários; 3 por minuto e 10 por hora por time; 5 por dia para cada endereço |
| Respostas encaminhadas por e-mail com detecção de respostas | 20 |
Origens a ignorar num webhook (skip_sources) | 20 |
| Importações de contatos | CSV de até 20 MB; 3 em andamento por time |
Contatos por requisição em POST /contacts/batch | 10.000 |
| Etiquetas por requisição de contato | 50 |
| Contatos por operação de etiqueta em massa | 1.000 |
| Validação de e-mails | Até 200.000 endereços por lista; 2 listas em andamento por time |
| Segmento dinâmico | 10 grupos de condições e 20 condições no total |
| Segmentos numa mesclagem | 20 |
| Propriedades de contato | 100 por time; valores de texto com até 1.000 caracteres |
| Variáveis de um template | 50 |
| Envios a um formulário público | 5 por minuto por IP |
| Agendamento de campanhas | Até 30 dias no futuro |
| Teste de campanha | 5 endereços |
Eventos (POST /events) | Nome com até 100 caracteres; properties com até 16 KB |
| Automações | 100 passos; 10 filtros no gatilho; 20 ações por update_contact; espera de até 365 dias |
| Passo de webhook das automações | 3 tentativas, 15 segundos cada |
| Retenção de e-mails, webhooks e logs | 30 dias |
| Retenção de eventos | 90 dias |
| Arquivos de exportação | 7 dias; o link de download vale por 1 hora |
| Resultados da validação de e-mails | 7 dias para o resultado de cada endereço e o CSV; a validação em si fica 30 dias |