Skip to main content

Overview

SmartLead applies rate limits to protect the platform and ensure fair access for all users. This guide explains the rate limit structure, how to detect when you’re being throttled, and strategies for building efficient integrations.

Rate Limit Structure

SmartLead enforces rate limits on a per-API-key basis:
This plan-wide limit applies to your API key across all endpoints combined. A mix of campaign, lead, and analytics requests all count toward the same limit.

Endpoint-Specific Rate Limits

A small number of endpoints are expensive enough to serve that they carry their own dedicated rate limit, independent of the plan-wide limit above. These limits stack on top of the plan-wide limit rather than replacing it:
  • Requests to these endpoints still count toward your plan-wide quota.
  • Having plan-wide quota remaining does not let you exceed the endpoint’s own limit.
  • Each endpoint has its own counter, so they do not consume each other’s budget.
The window starts on your first request to that endpoint and resets 60 seconds later. Exceeding it returns 429 Too Many Requests with a plain-text body rather than the JSON error shape shown below:
429 - Too Many Requests
Endpoint-specific 429s do not include Retry-After or X-RateLimit-* headers, so the backoff helpers on this page cannot read a retry delay from them. Fall back to a fixed wait of up to 60 seconds for these endpoints.
If you are polling these endpoints for changes, use their time-filter parameters (event_time_gt on leads-statistics, event_time_from / event_time_to on all-leads-activities, start_date / end_date on domain-wise-health-metrics) to fetch only what changed since your last call, and request the maximum page size so each of your 10 requests does as much work as possible.

Detecting Rate Limits

When you exceed the limit, the API returns a 429 Too Many Requests response:

Rate Limit Headers

Check response headers to monitor your usage:
Python

Backoff Strategies

Exponential Backoff with Jitter

The recommended approach for handling rate limits:
Python

Proactive Rate Limiting

Instead of waiting for 429s, track your usage and throttle proactively:
Python
Set your client-side limit to 80% of the actual limit (e.g., 50 requests/minute when the limit is 60). This buffer accounts for timing differences and prevents edge-case throttling.

Optimizing Request Patterns

Batch Operations

Instead of making individual requests per lead, use batch endpoints:
Python

Cache Responses

Cache data that doesn’t change often to reduce API calls:
Python

Use Webhooks Instead of Polling

Instead of polling for new replies every few seconds:
Python
Set up a webhook to receive events in real time with zero API calls:
Python
See the Webhook Integration Guide for full details.

Parallelize with Rate Awareness

When you need to make many requests, use controlled concurrency:
Python

Troubleshooting

Check if another integration or script is using the same API key. Rate limits are per-key, not per-client. Consider using separate API keys for different integrations.
Review your request patterns — are you polling when you could use webhooks? Are you making individual requests when batch endpoints are available? If you genuinely need higher limits, contact SmartLead support about Enterprise plans.
Default to exponential backoff starting at 1 second. Most rate limit windows reset within 60 seconds.

What’s Next?

Error Handling Guide

Handle all API errors gracefully

Best Practices

Build production-grade SmartLead integrations