rootmail

Core concepts

Rate limits

How throttling works and how to handle a 429.

The API is rate-limited per key to keep the platform fast and fair. When you exceed the limit you get a 429 rate_limited; back off and retry.

A resilient client retries 429s with exponential backoff and jitter:

retry.ts
async function withRetry<T>(fn: () => Promise<T>, tries = 5): Promise<T> {
  for (let i = 0; ; i++) {
    try {
      return await fn();
    } catch (e) {
      if (i >= tries || !(e instanceof RootMailError) || e.status !== 429) throw e;
      await new Promise((r) => setTimeout(r, 2 ** i * 200 + Math.random() * 100));
    }
  }
}
noteSend volume itself is governed by your plan's blocks and daily caps, not the request rate limit — the two are separate.