Skip to main content
EngageFabric uses rate limiting to ensure fair usage and protect the platform from abuse.

Rate Limit Tiers

TierAPI RequestsEvents/minWebSocket Connections
Free100/min500/min10
Starter500/min2,500/min50
Pro1,000/min10,000/min200
EnterpriseCustomCustomCustom

Rate Limit Headers

Every API response includes rate limit information:
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1699900000
HeaderDescription
X-RateLimit-LimitMaximum requests per window
X-RateLimit-RemainingRequests remaining in current window
X-RateLimit-ResetUnix timestamp when the limit resets

Rate Limit Response

When you exceed the rate limit, you’ll receive a 429 Too Many Requests response:
{
  "error": {
    "code": "RATE_LIMITED",
    "message": "Rate limit exceeded. Retry after 60 seconds.",
    "details": {
      "limit": 100,
      "window": "1 minute",
      "retryAfter": 60
    },
    "requestId": "req-abc123",
    "timestamp": "2025-01-21T10:00:00Z"
  }
}
The Retry-After header indicates how many seconds to wait:
HTTP/1.1 429 Too Many Requests
Retry-After: 60

Rate Limit Types

API Rate Limits

Applied per project API key:
Tier     Limit
Free     100 requests/minute
Starter  500 requests/minute
Pro      1,000 requests/minute

IP Rate Limits

Applied globally per IP address:
10,000 requests/minute per IP
Sharing API keys across multiple clients can quickly exhaust rate limits. Use one API key per deployment environment.

Event Ingestion Limits

Special limits for the /events endpoint:
TierEvents/minBurst
Free50050
Starter2,500250
Pro10,0001,000
Events support burst capacity using a token bucket algorithm.

WebSocket Limits

Limit TypeValue
Events per second10
Subscriptions per connection50
Message size64KB

Handling Rate Limits

Retry Strategy

Implement exponential backoff when rate limited:
async function fetchWithRetry(url, options, maxRetries = 3) {
  for (let i = 0; i < maxRetries; i++) {
    const response = await fetch(url, options);

    if (response.status === 429) {
      const retryAfter = response.headers.get('Retry-After') || 60;
      const delay = Math.min(
        parseInt(retryAfter) * 1000,
        Math.pow(2, i) * 1000
      );

      console.log(`Rate limited. Waiting ${delay}ms...`);
      await new Promise(r => setTimeout(r, delay));
      continue;
    }

    return response;
  }

  throw new Error('Max retries exceeded');
}

Batch Requests

For events, use batch tracking to reduce API calls:
// Instead of multiple calls
for (const event of events) {
  await client.events.track(event); // Multiple API calls
}

// Use batch tracking
await client.events.trackBatch(events); // Single API call

Monitor Usage

Track your rate limit usage via response headers:
const response = await fetch('/api/v1/players', {
  headers: { 'X-API-Key': apiKey }
});

const limit = response.headers.get('X-RateLimit-Limit');
const remaining = response.headers.get('X-RateLimit-Remaining');

if (remaining < 10) {
  console.warn('Rate limit almost exhausted');
}

Abuse Detection

EngageFabric monitors for abusive patterns:
  • Rapid repeated requests
  • Unusual event patterns
  • Coordinated attacks
Projects exhibiting abuse may be temporarily suspended.
If you believe you’ve been incorrectly rate limited, contact support with your requestId for investigation.

Increasing Limits

Need higher limits? Options include:
  1. Upgrade your tier: Higher tiers have increased limits
  2. Enterprise plan: Custom limits for your needs
  3. Temporary increase: Contact support for special events

Contact Sales

Need custom rate limits? Contact our sales team