Skip to main content
The Cal.com Platform API implements rate limiting to ensure fair usage and system stability. Rate limits vary based on your authentication method and can be customized for specific endpoints.

Default Rate Limits

Rate limits are applied per authentication method over a 60-second window:

API Key

120 requests per 60 seconds

OAuth Client

500 requests per 60 seconds

Access Token

500 requests per 60 seconds

Unauthenticated (IP)

120 requests per 60 seconds

Rate Limit Headers

Every API response includes rate limit information in the headers:

Header Description

Example Response Headers

Rate Limit Tiers

Rate limits are tracked separately for each authentication method:

API Key Rate Limit

Identifier: api_key_{hashed_key}
Default Limits:
  • Limit: 120 requests
  • TTL: 60 seconds
  • Block Duration: 60 seconds

OAuth Client Rate Limit

Identifier: oauth_client_{hashed_client_id} When using the X-Cal-Client-ID header:
Default Limits:
  • Limit: 500 requests
  • TTL: 60 seconds
  • Block Duration: 60 seconds

Access Token Rate Limit

Identifier: access_token_{hashed_token} When using OAuth access tokens:
Default Limits:
  • Limit: 500 requests
  • TTL: 60 seconds
  • Block Duration: 60 seconds

IP-Based Rate Limit

Identifier: ip_{hashed_ip} For unauthenticated requests or as a fallback:
Default Limits:
  • Limit: 120 requests
  • TTL: 60 seconds
  • Block Duration: 60 seconds

Custom Rate Limits

Certain API keys can have custom rate limits configured. When custom limits are applied, you’ll see additional headers:

Custom Rate Limit Example

An API key with multiple rate limit tiers:
This configuration allows:
  • 120 requests per minute (default tier)
  • 10 requests per second (burst tier)

Endpoint-Specific Rate Limits

Some endpoints may have custom rate limits using the @Throttle decorator:
When an endpoint has a custom limit, you’ll see both headers:

Rate Limit Exceeded

When you exceed the rate limit, you’ll receive a 429 Too Many Requests response:
Response Headers:
The Retry-After header indicates how many seconds to wait before retrying.

Rate Limit Storage

Rate limits are tracked using Redis with the following storage pattern:

Example Keys

Best Practices

Always check X-RateLimit-Remaining headers to track your usage:
When you receive a 429 response, implement exponential backoff:
OAuth clients and access tokens have higher rate limits (500 vs 120 requests per minute):
  • Use API keys for low-volume integrations
  • Use OAuth for production applications with higher traffic
  • Consider OAuth for applications with multiple users
Reduce API calls by caching responses:
Instead of making multiple requests, use list endpoints with filters:

Rate Limit Implementation

The Platform API uses a custom throttler guard (CustomThrottlerGuard) that:
  1. Identifies the request source (API key, OAuth client, access token, or IP)
  2. Retrieves rate limits from database or uses defaults
  3. Tracks request count in Redis
  4. Applies multiple rate limit tiers (default + custom)
  5. Blocks requests when any limit is exceeded
  6. Returns headers with current rate limit status

Implementation Details

Webhook Rate Limits

Webhook deliveries are not subject to the same rate limits, but they have their own delivery constraints:
  • Maximum of 5 delivery attempts per webhook event
  • Exponential backoff between retries (1s, 2s, 4s, 8s, 16s)
  • 30-second timeout per delivery attempt
See Webhooks for more details.

Environment Variables

Rate limits can be configured via environment variables:

Upgrading Rate Limits

For enterprise customers or high-volume applications, custom rate limits can be configured:
  1. Contact sales@cal.com
  2. Discuss your usage requirements
  3. Receive custom API key with higher limits
  4. Custom limits are stored in the database and cached in Redis

Example Custom Configuration

Enterprise API key with custom limits:
This provides:
  • 1,000 requests per minute
  • 50 requests per second
  • 100,000 requests per day

Testing Rate Limits

Test your rate limit handling:

Monitoring Rate Limits

Track your API usage with monitoring:

Next Steps

Authentication

Learn about authentication methods

Webhooks

Set up event notifications

Best Practices

Optimize your API usage

Error Handling

Handle rate limit errors