API Reference
API Rate Limits
To ensure a consistent experience for all users, the Waitlister API implements rate limiting. This page explains our rate limits and provides best practices for handling them in your applications.
Rate Limit Overview
Rate limits vary based on your plan and endpoint type. The limits are based on requests per minute (RPM), per account and endpoint, so API keys on the same account share them.
Rate Limits by Plan and Endpoint Type
| Plan | Subscriber Endpoints | List Subscribers | Log View & Stats Endpoints | Create Waitlist | List Waitlists | Get Account |
|---|---|---|---|---|---|---|
| Free | Sign-up only, 10 RPM¹ | — | Stats only, 10 RPM¹ | 5 RPM¹ | 10 RPM¹ | 20 RPM¹ |
| Launch | Sign-up only, 10 RPM¹ | — | Stats only, 10 RPM¹ | 5 RPM¹ | 10 RPM¹ | 20 RPM¹ |
| Pro | Sign-up only, 10 RPM¹ | — | Stats only, 10 RPM¹ | 5 RPM¹ | 10 RPM¹ | 20 RPM¹ |
| Growth | 60 RPM | 300 RPM | 200 RPM | 5 RPM | 60 RPM | 60 RPM |
| Business | 120 RPM | 600 RPM | 400 RPM | 5 RPM | 60 RPM | 120 RPM |
¹ Free, Launch and Pro plans need an account API key (wl_acct_…) — per-waitlist API keys require the Growth plan or higher. With an account key, these plans can check the key (Get Account), create waitlists, add subscribers, read stats, and manage landing pages; the other subscriber endpoints (list, get, update, delete), tags, and log view stay Growth+.
Landing Page Endpoints
| Plan | Read | Create or update | Publish | AI generate |
|---|---|---|---|---|
| Free, Launch, Pro | 30 RPM | 5 RPM | 3 RPM | 2 RPM |
| Growth, Business | 60 RPM | 10 RPM | 5 RPM | 2 RPM |
Endpoint Categories
- Subscriber Endpoints: All endpoints related to managing subscribers, including:
- Adding subscribers (
/sign-up) - Getting subscriber details (
/subscribers/{id-or-email}) - Updating subscribers (
/subscribers/{id-or-email}) - Deleting subscribers (
/subscribers/{id-or-email}) - Listing tags (
/tags)
- Adding subscribers (
- List Subscribers: The paginated subscriber list (
GET /subscribers) - Log View & Stats Endpoints: The analytics endpoints for logging page views (
/log-view) and reading social-proof numbers (/stats) - Waitlists Endpoints: The account-scoped endpoints for creating (
POST /api/v1/waitlists) and listing (GET /api/v1/waitlists) waitlists - Get Account: The account-scoped key check (
GET /api/v1/me). Available on every plan with an account key
These limits help in the following ways:
- Consistent performance for all users
- Protection against accidental infinite loops
- Prevention of API abuse
Rate Limit Headers
When you make an API request, we include headers that provide information about your current rate limit status.
| Header | Description |
|---|---|
X-RateLimit-Limit | The maximum number of requests allowed per minute |
X-RateLimit-Remaining | The number of requests remaining in the current rate limit window |
X-RateLimit-Reset | When the oldest request in the current window expires and frees up capacity (Unix timestamp, in seconds) |
For example:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 45
X-RateLimit-Reset: 1683741600
A 429 response also includes a Retry-After header and data.retry_after in the body, both giving the number of seconds to wait.
Increasing Your Rate Limits
If you need higher rate limits:
- Upgrade Your Plan:
- The Growth plan provides the full API, with 60 RPM on most subscriber endpoints
- The Business plan doubles most Growth limits
- Contact Support: For enterprise-level needs, contact us through the public contact form to discuss custom rate limits.
Monitoring Your API Usage
To prevent hitting rate limits, monitor your API usage regularly.
- Check rate limit headers in your API responses
- Implement logging of API calls and response headers
- Set up alerts when approaching rate limits
- Review your API usage patterns to identify optimization opportunities
Best Practices for Rate Limit Management
- Implement Exponential Backoff: When receiving a 429 error, wait and retry with increasing delaysjavascript
function fetchWithBackoff(url, options, attempt = 1) { return fetch(url, options) .then(response => { if (response.status === 429 && attempt <= 5) { const delay = Math.min(Math.pow(2, attempt) * 1000, 30000); return new Promise(resolve => setTimeout(resolve, delay)) .then(() => fetchWithBackoff(url, options, attempt + 1)); } return response; }); } - Batch Requests When Possible: Instead of making many small requests, batch operations where appropriate
- Cache Responses: Store responses locally to reduce the number of API calls needed
By following these best practices, you can make sure your application interacts smoothly with the Waitlister API while respecting the rate limits.
