Limits
The following limits apply to each category of the Novu system. Each category has an independent bucket of request tokens to consume from. Each category has a different limit of requests per second (RPS), with the endpoints in each category shown below.| Category | Free | Pro | Team | Enterprise | Endpoints |
|---|---|---|---|---|---|
| Events | 60 RPS | 240 RPS | 600 RPS | 6K RPS | Trigger |
| Configuration | 20 RPS | 80 RPS | 200 RPS | 2k RPS | Subscribers, Topics, Channel Connections, Channel Endpoints, Workflows |
| Global | 30 RPS | 120 RPS | 300 RPS | 3K RPS | All other endpoints including context endpoints consume request tokens from this category |
- Standard requests (example:
POST /v1/events/trigger,POST /v2/subscribers/) cost 1 request token.
POST /v1/events/trigger API 600 times per second. If you exceed this limit, you will receive a 429 error response.- Bulk requests (example:
POST /v1/events/trigger/bulk,POST /v1/subscribers/bulk) cost 100 request tokens.
POST /v1/subscribers/bulk API 2 times per second. If you exceed this limit, you will receive a 429 error response.HTTP response headers
When integrating with Novu API, it’s important to consider the rate limiting HTTP headers included in the response. These headers help you manage your API usage and avoid hitting rate limits.RateLimit-Remaining- Indicates the remaining number of request tokens in the current window.RateLimit-Limit- Indicates the total number of request tokens available in the current window.RateLimit-Reset- Indicates the number of seconds until the current window resets and the request token limit is fully replenished.RateLimit-Policy- Defines the details of the applied rate limiting policy.Retry-After- Specifies the number of seconds to wait before making another request.
Rate limit errors
When you exceed the rate limit, the API returns429 Too Many Requests with a JSON body:
Retry-After header with the number of seconds to wait before retrying. See Errors for the full error response format.
Handling rate limits
When you receive a429, wait for the duration in the Retry-After header before retrying. For sustained traffic, use exponential backoff with jitter so retries spread out and do not all hit the limit at once:
RateLimit-Remaining header on successful responses to slow down before you hit the limit.
Related documentation
- Errors — HTTP status codes and error response format
- Idempotency — Safely retry requests without creating duplicates