Rate Limits
Synapse enforces rate limits to ensure fair usage and platform stability. Limits vary by plan and can be overridden per API key.
Default Limits by Plan
| Plan | Requests / Minute | Requests / Hour | Monthly Emails |
|---|---|---|---|
| Free | 60 | 1,000 | 1,000 |
| Starter | 300 | 10,000 | 10,000 |
| Growth | 1,000 | 50,000 | 100,000 |
| Enterprise | Custom | Custom | Unlimited |
Rate limits apply per API key. If you have multiple keys, each has its own limit. JWT-authenticated dashboard requests share a separate per-user limit.
Rate Limit Headers
Every response includes rate limit information:
| Header | Description | Example |
|---|---|---|
X-RateLimit-Limit | Maximum requests allowed in the current window | 300 |
X-RateLimit-Remaining | Requests remaining in the current window | 247 |
X-RateLimit-Reset | Unix timestamp when the window resets | 1711901700 |
Retry-After | Seconds until the next request is allowed (only on 429 responses) | 42 |
Example Response Headers
429 Response
When you exceed the rate limit:
Handling Rate Limits
Exponential Backoff (Recommended)
JavaScript
Always use the Retry-After header value instead of a fixed delay. The server knows the optimal wait time based on your current window state.
Endpoint-Specific Limits
Some endpoints have stricter limits independent of the per-key rate:
| Endpoint | Limit | Reason |
|---|---|---|
POST /v1/events | Same as plan | Primary ingestion endpoint |
POST /v1/send | Same as plan | Prevents email flooding |
POST /v1/contacts/bulk | 10 / minute | Batch operations are expensive |
GET /v1/analytics/export | 5 / hour | CSV exports run heavy queries |
POST /v1/segments/{id}/evaluate | 30 / minute | Evaluation runs real-time queries |
Per-Key Rate Limit Override
API keys can have custom rate limits that override the plan default:
This is set during key creation or updated via the dashboard. The override cannot exceed the maximum for your plan tier.
Monthly Email Limits
Independent of request rate limits, each plan has a monthly email sending cap:
| Plan | Monthly Emails | What Counts |
|---|---|---|
| Free | 1,000 | Each sent or suppressed email log |
| Starter | 10,000 | Same |
| Growth | 100,000 | Same |
| Enterprise | Unlimited | -- |
When the monthly limit is reached, email send requests return 403:
The counter resets on the first day of each billing period (or when subscription.renewed webhook fires).
Best Practices
- Monitor
X-RateLimit-Remaining-- Proactively slow down before hitting the limit - Use idempotency keys -- Safe retries after rate limit errors without duplicate processing
- Batch contacts, not events -- Use
POST /v1/contacts/bulkfor imports, but send events individually for real-time processing - Use the SDK -- Both the Python and JavaScript SDKs handle rate limit retries automatically with exponential backoff
- Contact support for Enterprise -- If you need higher limits, custom rate tiers are available on Enterprise plans