Límites
Solicitudes por segundo, cuotas de envío por plan y los tamaños máximos de cada recurso.
#Solicitudes por segundo
Cada equipo tiene un límite de solicitudes por segundo, sumando todas las claves. El valor depende del plan:
| Plan | Peticiones por segundo |
|---|---|
| Gratis | 5 |
| Profesional | 10 |
| Escala | 20 |
| Empresarial | 50 |
Valores actualizados desde GET /plans al abrir la página.
El límite vigente para tu equipo aparece en GET /usage (rate_limit). Las apps que tienen una sola clave de envío también ven el límite: GET /usage acepta claves sending_access, y los encabezados X-RateLimit-* llegan en todas las respuestas, incluida la del envío. Toda respuesta incluye los encabezados:
| Encabezado | Descripción |
|---|---|
X-RateLimit-Limit | Solicitudes permitidas por segundo. |
X-RateLimit-Remaining | Cuántas caben todavía en el segundo actual. |
Retry-After | Solo en el 429: segundos hasta poder volver a intentarlo. |
X-RateLimit-Reset | Solo en el 429: cuándo se restablece el límite (Unix timestamp). |
Si superas el límite, la respuesta es 429 rate_limit_exceeded. Para enviar muchos correos, usa el envío por lotes: 100 correos cuentan como una solicitud.
El límite es del equipo, no de la clave, y también vale para el servidor MCP. Los SDKs leen los encabezados por ti: postal.rateLimit (Node.js) y $postal->rateLimit() (PHP) guardan el límite de la última respuesta, incluso con una clave solo de envío, y esperan el Retry-After antes de repetir un 429.
#Cuotas de envío
Los envíos cuentan cuando se crea el correo (incluidos los programados y las pruebas de plantilla). Cada destinatario de una campaña, cada prueba de campaña y cada correo de automatización también cuenta. El día y el mes se cuentan en UTC.
| Plan | Por día | Por mes |
|---|---|---|
| Gratis | 100 | 3.000 |
| Profesional | Sin límite | 50.000 |
| Escala | Sin límite | 100.000 |
| Empresarial | Sin límite | A medida |
Valores actualizados desde GET /plans al abrir la página.
Al alcanzar la cuota, los envíos reciben 429 daily_quota_exceeded o 429 monthly_quota_exceeded (en SMTP, 452 4.5.3). Una campaña que choca con la cuota a mitad del envío queda pausada y continúa sola cuando la cuota se renueva; un envío de automatización falla, y la ejecución también. En los planes que lo permiten, puedes activar el envío por encima de la cuota en el panel, en Facturación: los correos extra se cobran por millar, sin bloqueo. El plan sigue siendo el mismo; solo pagas por los paquetes adicionales, en la próxima factura. Sigue el consumo en GET /usage.
Reputación de la cuenta. El límite diario vigente es el menor entre el del plan y el tope de la reputación de la cuenta: una puntuación de 0 a 100 que empieza en 0 en las cuentas nuevas y sube con cada día de envíos sin rebotes ni quejas. En los niveles 1 a 4, el tope es de 500, 2.000, 5.000 y 10.000 correos por día; en el nivel 5, solo vale el límite del plan. El límite vigente está en emails.daily.limit de GET /usage, con plan_limit (el del plan) y limited_by (plan o reputation), y el bloque reputation trae la puntuación, el nivel y el siguiente nivel. Cuando es la reputación la que limita, el mensaje del 429 daily_quota_exceeded indica el nivel y el tope.
Adicional de envíos. Cuando el plan del equipo tiene un límite mensual y ofrece el Adicional de envíos, el propietario o un administrador compra, con un pago único, una reserva de envíos que solo se usa después de agotada la cuota mensual: primero la cuota del plan, después la reserva (un crédito por correo, los que vencen antes primero), después el envío por encima de la cuota, si el equipo lo activó, y solo entonces el rechazo. Las campañas no usan la reserva, los correos a direcciones de prueba no gastan crédito, y el límite diario del plan se sigue aplicando. El mensaje del 429 monthly_quota_exceeded dice dónde comprar cuando se puede. Consulta Adicional de envíos y la referencia de la API.
Reputación de envío
Para proteger la entrega de todos, Postal pausa los envíos de un equipo cuando, en los últimos 7 días, los rebotes permanentes superan el límite del nivel de la reputación de la cuenta (3% en el nivel 1, 4% en el nivel 2 y 5% a partir del nivel 3), las quejas de spam superan el 0,3% o el contenido rechazado por los proveedores supera el 5% de los correos enviados. Las tasas se juzgan a partir de 100 envíos en el período en los niveles 1 a 3 y de 1.000 en los niveles 4 y 5. En los niveles 1 a 3, Postal también mira las últimas 24 horas, y los rebotes de todos los tipos por encima del 15% también pausan. En las primeras 24 horas después del primer envío del equipo, la pausa por rebotes permanentes solo ocurre por encima del doble del límite. Las direcciones de prueba no entran en la cuenta. Cada pausa resta 40 puntos a la reputación de la cuenta. El correo de pausa lista hasta 10 direcciones con los rebotes más recientes (ya quedan suprimidas). Mientras los envíos están pausados, reciben 403 sending_paused. Pide la revisión en el panel (no hay endpoint público para ello) o por el formulario de contacto para que los reactiven.
Cómo recibir un aviso antes y cómo detectar la pausa: cuando los rebotes permanentes llegan al aviso del nivel (2% en el nivel 1, 2,5% en el nivel 2 y 3% a partir del nivel 3) o las quejas al 0,15%, los propietarios y administradores del equipo reciben un aviso por correo electrónico, antes de la pausa (uno cuando la tasa cruza el nivel; el siguiente solo si empeora 1 punto porcentual, o 0,1 en las quejas, o pasados 7 días); al pausarse, reciben otro. Por la API, suscríbete a los eventos sending.paused y sending.resumed de los webhooks para alertar a tu equipo al instante, o consulta GET /usage, que incluye sending.paused, paused_at, el reason y review_requested_at (cuándo se pidió la revisión). Un lote de invitaciones o de correos con direcciones erróneas es la causa más común: valida las direcciones antes de enviar y gestiona los rebotes recibidos en los webhooks.
Direcciones suprimidas: un rebote permanente añade la dirección a la lista de supresión automáticamente. Si la persona corrigió su correo electrónico, quítala con DELETE /suppressions/{id} o por lotes con POST /suppressions/batch/remove y el envío vuelve a funcionar.
#Recursos por plan
Planes y precios: postal.so/precos o, por API, GET /plans (público, sin clave).
| Gratis | Profesional | Escala | Empresarial | |
|---|---|---|---|---|
| Dominios | 3 | 10 | 1.000 | Sin límite |
| Buzones de entrada | 3 | 10 | 100 | Sin límite |
| Buzones de entrada en tu dominio | No | Sí | Sí | Sí |
| Personas en el equipo | 3 | 10 | Sin límite | Sin límite |
| Créditos de IA por mes | 10 | 100 | 1.000 | Sin límite |
| Ejecuciones de automatización por mes | 1.000 | 10.000 | 100.000 | Sin límite |
| Contactos (plan de marketing) | 1.000 | 5.000 | 50.000 | Sin límite |
| Segmentos (plan de marketing) | 3 | Sin límite | Sin límite | Sin límite |
| Campañas por mes (plan de marketing) | Sin límite | Sin límite | Sin límite | Sin límite |
| Layouts | 10 | Sin límite | Sin límite | Sin límite |
| Pruebas A/B en las automatizaciones | No | Sí | Sí | Sí |
| Créditos de verificación de correos por mes (plan de marketing) | 100 | 5.000 | 50.000 | Sin límite |
| Conexiones de CRM (plan de marketing) | 0 | 1 | 5 | Sin límite |
| Integraciones con apps (plan de marketing) | 1 | 3 | 10 | Sin límite |
Valores actualizados desde GET /plans al abrir la página.
Los equipos pueden tener límites ajustados individualmente. El valor que cuenta para ti es siempre el de GET /usage.
#Límites y recursos del plan
Cada plan define, por equipo, cuántas cosas puedes tener y qué recursos están incluidos. Superar el límite de un elemento o usar un recurso que el plan no incluye responde 403 plan_limit_reached, con un mensaje que indica cuál. La lista completa, con el texto de cada recurso y si la API ya lo aplica (enforced), está en GET /plans (feature_catalog), y los valores de tu equipo en GET /usage. En los números, null es ilimitado y 0 es no incluido; en los recursos de activado/desactivado, 1 es incluido y 0 no.
Cantidad
Solo bloquean la creación de un elemento más. Lo que ya existe nunca se borra.
Contactos por encima del límite. El límite de contactos del plan de marketing también se puede superar, como el de correos: en Facturación, el propietario o administrador del equipo activa Seguir añadiendo contactos por encima del límite del plan (un botón para cada producto, desactivado de forma predeterminada). Con la opción activada, las importaciones, los formularios, la API y las integraciones de CRM dejan de rechazar con 403 plan_limit_reached al llegar al límite, y los contactos extra se cobran por paquete de 1.000 (redondeando hacia arriba) en la próxima factura, sin cambiar de plan. Lo que se cobra es el mayor número de contactos que el equipo tuvo en el período de facturación (o de contactos que recibieron campañas en el ciclo, si es mayor: consulta más abajo), y borrar contactos después no reduce lo que ya se midió. Los contactos dados de baja y las direcciones suprimidas cuentan como contacto, como siempre. Solo vale con una suscripción de marketing activa, en un plan que permita excedente y que tenga precio de contactos extra; si no, el límite sigue rechazando. El mensaje de rechazo indica cómo activarlo cuando la opción está disponible.
Adicional de contactos. Cuando el plan de marketing del equipo ofrece el Adicional de contactos, el propietario o un administrador suma contactos al límite sin cambiar de plan: el precio del paquete entra en la factura de la suscripción y el límite pasa a ser el del plan más el de los paquetes. El límite que comprueba la API (403 plan_limit_reached) y el que muestra GET /usage ya incluyen los paquetes. Solo valen con un plan de marketing de pago y activo. Mira Adicional de contactos y la referencia de la API.
Contactos que reciben campañas en el ciclo
El límite de contactos del plan de marketing (con el Adicional de contactos) también vale para quien recibe campañas: en el ciclo de uso del equipo (el mes que se renueva el día de tu plan), las campañas y los correos de automatización pueden ir a hasta ese número de contactos diferentes. Cada dirección cuenta una vez por ciclo. Quien ya recibió una campaña en el ciclo sigue contando hasta la renovación, aunque se elimine, y eliminar y volver a crear la misma dirección no cuenta dos veces. Eliminar contactos que aún no recibieron una campaña libera espacio al instante. Enviar varias campañas a los mismos contactos no consume más. Los correos transaccionales no cuentan.
Ejemplo, con un límite de 50.000 contactos: enviar 5 campañas a los mismos 50.000 contactos en el ciclo está dentro del plan. Eliminar los 50.000 que ya recibieron una e importar otros 50.000 en el mismo ciclo pasa del límite: la campaña a los nuevos se rechaza hasta la renovación.
Una campaña que pasaría del límite se rechaza entera, sin enviar nada, con 422 cycle_recipients_limit, un mensaje con los números, la fecha de renovación y qué hacer, y el bloque cycle_recipients (new, used, limit, remaining y resets_at). Postal comprueba de nuevo cuando una campaña programada va a salir: si ya no cabe, queda en pausa con el mismo motivo. Un correo de automatización a un contacto que aún no recibió nada en el ciclo, con el límite lleno, se omite. El propietario y los administradores reciben un correo al llegar al 80% y al 100%. Con el excedente de contactos activado, no se rechaza nada y los contactos por encima del límite se cobran como contactos extra. Sin límite de contactos, no hay límite de destinatarios. El contador está en GET /usage (marketing_recipients) y en Configuración › Uso, y el efecto de una campaña, antes de enviarla, en GET /broadcasts/audience.
| Clave | Qué cuenta | Dónde bloquea |
|---|---|---|
domains | Dominios de envío | POST /domains y la reclamación de dominio |
inboxes | Buzones de entrada | POST /inboxes |
templates | Plantillas | POST /templates y duplicar |
layouts | Layouts | POST /layouts y duplicar |
api_keys | Claves de API | POST /api-keys |
webhooks | Endpoints de webhook | POST /webhooks |
team_members | Personas en el equipo (las invitaciones pendientes cuentan) | Invitar personas, en el panel |
contacts | Contactos | Crear contactos por la API, por importación, formulario o integración |
segments | Segmentos | POST /segments y unificar segmentos |
topics | Temas | POST /topics |
forms | Formularios | POST /forms |
automations | Automatizaciones (activas o no) | POST /automations |
broadcasts_per_month | Campañas enviadas o programadas en el mes (UTC) | Enviar o programar una campaña |
crm_connections | Conexiones de CRM | Crear la conexión |
app_integrations | Integraciones con apps (Stripe, Supabase, Clerk, Firebase, Auth0) | Crear la integración |
attachments_mb | Tamaño total de los adjuntos de un correo, en MB. 0 no permite adjuntos; vacío (null) usa el límite de la plataforma, de 40 MB | Enviar correos con adjuntos |
Otros límites mensuales no dan 403: emails_per_day y emails_per_month dan 429 (consulta las cuotas de envío); ai_credits, 429 ai_credits_exhausted; email_verifications_per_month, 403 si el plan no incluye la verificación de correos y 429 verification_credits_exhausted cuando se agotan los créditos; y automation_runs: por encima del límite, las nuevas ejecuciones de automatización no empiezan (quedan como skipped).
Recursos de activado/desactivado
| Clave | Qué habilita | Dónde bloquea |
|---|---|---|
batch_sending | Envío en lote | POST /emails/batch |
scheduled_sending | Programación de envíos | scheduled_at en POST /emails |
test_addresses | Direcciones de prueba simuladas | Enviar a @sandbox.postal.so |
smtp_access | Envío por SMTP | El SMTP rechaza el mensaje con 550 5.7.1 |
engagement_tracking | Seguimiento de aperturas y clics | Activar open_tracking o click_tracking en un dominio (los que ya hacen seguimiento continúan) |
custom_domain_records | Return-Path y subdominio de seguimiento propios | custom_return_path y tracking_subdomain nuevos o modificados |
shared_email_links | Enlaces para compartir correos | POST /emails/{id}/share |
custom_inbound_domains | Buzones de entrada y recepción en tu dominio | Crear buzones de entrada y activar capabilities.receiving en dominios propios |
inbox_agent | Agente de IA del buzón de entrada | Activar el agente en un buzón de entrada |
exports | Exportaciones en CSV | POST /exports y la exportación de las respuestas de formularios |
mcp_access | Servidor MCP | El endpoint /mcp |
restricted_api_keys | Claves solo de envío o restringidas a un dominio | POST /api-keys con permission: "sending_access" (las claves ya creadas siguen valiendo) |
dynamic_segments | Segmentos dinámicos | Crear un segmento dinámico (los existentes continúan) |
form_analytics | Análisis de los formularios | GET /forms/overview y GET /forms/{id}/analytics, con las respuestas por pregunta y la exportación del análisis |
automation_experiments | Pruebas A/B en las automatizaciones | Pasos de experimento A/B |
postal_branding | Sello “Enviado con Postal” (invertido: 1 es tener el sello) | Ocultar el sello en un formulario |
retention_days, priority_support, uptime_sla y dedicated_manager son informativos: la API no bloquea nada por ellos (la retención es de 30 días para todos, y el soporte se acuerda aparte).
Cuando el plan baja
Cuando el plan cambia, la cantidad que el equipo ya tiene puede superar el nuevo límite. No se borra nada: de dominios, buzones de entrada, plantillas, layouts, claves de API, webhooks, automatizaciones, segmentos, temas y formularios, los más antiguos hasta el límite siguen activos y los más nuevos quedan con paused_by_plan: true. Un elemento pausado aparece en las listas y se puede leer y eliminar, pero no modificar ni usar: el dominio no envía, la clave de API no autentica, el webhook no recibe eventos, la plantilla no envía, el formulario deja de estar publicado, la automatización no se dispara, el segmento no sirve de público y el buzón de entrada no ejecuta el agente (sigue recibiendo correos). Cualquier intento de modificarlo responde 403 paused_by_plan. Los elementos vuelven solos cuando el plan, el tramo de volumen o el recuento lo permiten, y GET /usage lista lo que está pausado en paused. Los contactos, las personas del equipo y las conexiones no se pausan: el límite solo impide añadir más.
Las cuotas de correos por mes y el número de contactos siguen el tramo de volumen contratado (consulta Planes), y un equipo puede tener límites ajustados individualmente. El valor que cuenta para ti es siempre el de GET /usage.
La escala de volumen se compone de tramos definidos por Postal (por ejemplo 3.000, 50.000, 100.000 y 250.000 correos por mes): cada plan cubre algunos de esos tramos, con el precio de cada uno, y por encima del último tramo solo lo cubre el plan a medida. La lista de los tramos y de los que cubre cada plan está en GET /plans (volume_bands y bands).
#Tamaños y cantidades
| Qué | Límite |
|---|---|
Destinatarios en to | 50 por correo |
Correos por lote (POST /emails/batch) | 100 |
| Adjuntos | 40 MB en total por correo (menos, si el plan lo limita: attachments_mb) |
| Adjuntos de respuestas, mensajes y borradores del buzón de entrada | Hasta 10 archivos y 40 MB en total |
| Mensaje por SMTP | 40 MB y 50 destinatarios |
Programación (scheduled_at) | Hasta 30 días en el futuro |
Direcciones de prueba ([email protected]…) | No cuentan en la cuota de envío, ni en las tasas de rebote y de queja de la reputación; el límite de solicitudes por segundo sí se aplica |
| Etiquetas | 50 por correo; nombre y valor de hasta 256 caracteres |
| Asunto y valores de encabezado | 998 caracteres |
| Elementos por página en las listas | 100 |
Idempotency-Key | 256 caracteres, guardada durante 24 horas |
Imágenes (POST /assets) | 5 MB |
| Exportaciones en curso | 3 por equipo |
Enlace público de un correo (POST /emails/{id}/share) | Vale de 1 minuto a 48 horas |
Métricas (GET /emails/metrics) | Hasta 10.000 períodos y 100 IDs en cada filtro |
Instrucciones de DNS por correo (POST /domains/{id}/instructions) | Hasta 5 destinatarios; 3 por minuto y 10 por hora por equipo; 5 por día para cada dirección |
| Respuestas reenviadas por correo con detección de respuestas | 20 |
Orígenes que se ignoran en un webhook (skip_sources) | 20 |
| Importaciones de contactos | CSV de hasta 20 MB; 3 en curso por equipo |
Contactos por solicitud en POST /contacts/batch | 10.000 |
| Etiquetas por solicitud de contacto | 50 |
| Contactos por operación de etiquetado masivo | 1.000 |
| Verificación de correos | Hasta 200.000 direcciones por lista; 2 listas en curso por equipo |
| Segmento dinámico | 10 grupos de condiciones y 20 condiciones en total |
| Segmentos en una combinación | 20 |
| Propiedades del contacto | 100 por equipo; valores de texto de hasta 1.000 caracteres |
| Variables de una plantilla | 50 |
| Envíos a un formulario público | 5 por minuto por IP |
| Programación de campañas | Hasta 30 días en el futuro |
| Prueba de campaña | 5 direcciones |
Eventos (POST /events) | Nombre de hasta 100 caracteres; properties de hasta 16 KB |
| Automatizaciones | 100 pasos; 10 filtros en el disparador; 20 acciones por update_contact; espera de hasta 365 días |
| Paso de webhook de las automatizaciones | 3 intentos, 15 segundos cada uno |
| Retención de correos, webhooks y registros | 30 días |
| Retención de eventos | 90 días |
| Archivos de exportación | 7 días; el enlace de descarga vale 1 hora |
| Resultados de la verificación de correos | 7 días para el resultado de cada dirección y el CSV; la verificación en sí se conserva 30 días |