Ir al contenido

Límites de tasa

La API limita las peticiones por segundo por equipo (no por clave):

Plan Peticiones por segundo
Free 10
Pro 10
Scale 25
Enterprise A medida

El límite de Resend es de 2 peticiones por segundo. Un lote de hasta 100 correos es una petición, así que puedes enviar miles de correos por segundo dentro del límite.

Los límites se aplican en ventanas de un segundo. Las sesiones del panel no tienen límite de tasa. Las cuotas de envío (Planes y cuotas) son independientes de los límites de peticiones.

Toda respuesta incluye:

Encabezado Significado
ratelimit-limit Peticiones permitidas por ventana (por ejemplo 10).
ratelimit-remaining Peticiones restantes en la ventana actual.
ratelimit-reset Segundos hasta que se reinicia la ventana (1).
retry-after Solo en 429: segundos que hay que esperar antes de reintentar (1).
HTTP/1.1 429 Too Many Requests
ratelimit-limit: 10
ratelimit-remaining: 0
ratelimit-reset: 1
retry-after: 1
{ "statusCode": 429, "name": "rate_limit_exceeded", "message": "Too many requests. You can only make 10 requests per second." }
import { SpacePost, type SendEmailOptions } from "@spacepost/node";
const spacepost = new SpacePost();
async function sendWithRetry(email: SendEmailOptions, key: string, attempts = 5) {
for (let i = 0; i < attempts; i++) {
const { data, error } = await spacepost.emails.send(email, { idempotencyKey: key });
if (!error) return data;
if (error.name !== "rate_limit_exceeded") throw new Error(`${error.name}: ${error.message}`);
await new Promise((r) => setTimeout(r, 1000 * (i + 1)));
}
throw new Error("rate limited");
}

Reutiliza siempre la misma Idempotency-Key en los reintentos para que no se repita una petición que en realidad tuvo éxito.

  • Prefiere los lotes a muchos envíos individuales.
  • Encola los envíos en un worker en segundo plano y limita su concurrencia a tu límite.
  • Reparte las tareas de importación (por ejemplo, la creación de contactos) a un ritmo constante.