Zum Inhalt springen

Rate Limits

Die API begrenzt Anfragen pro Sekunde und Team (nicht pro Schlüssel):

Plan Anfragen pro Sekunde
Free 10
Pro 10
Scale 25
Enterprise Individuell

Das Limit von Resend liegt bei 2 Anfragen pro Sekunde. Ein Batch mit bis zu 100 E-Mails ist eine Anfrage, sodass du innerhalb des Limits Tausende E-Mails pro Sekunde senden kannst.

Limits gelten in Ein-Sekunden-Fenstern. Dashboard-Sitzungen unterliegen keinem Rate Limit. Versandkontingente (Pläne und Kontingente) sind von den Anfragelimits getrennt.

Jede Antwort enthält:

Header Bedeutung
ratelimit-limit Erlaubte Anfragen pro Fenster (zum Beispiel 10).
ratelimit-remaining Verbleibende Anfragen im aktuellen Fenster.
ratelimit-reset Sekunden, bis das Fenster zurückgesetzt wird (1).
retry-after Nur bei 429: Sekunden, die vor dem erneuten Versuch zu warten sind (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");
}

Verwende bei Wiederholungen immer denselben Idempotency-Key, damit eine Anfrage, die tatsächlich erfolgreich war, nicht wiederholt wird.

  • Bevorzuge Batches gegenüber vielen Einzelsendungen.
  • Reihe Sendungen in einem Hintergrund-Worker ein und begrenze seine Parallelität auf dein Limit.
  • Verteile Import-Jobs (zum Beispiel das Anlegen von Kontakten) in gleichmäßigem Tempo.