Rate Limits
Understand API rate limits by plan tier and how to handle throttled requests.
The Wireflow API enforces rate limits to ensure fair usage and platform stability. Limits vary by plan tier.
Limits by Plan
| Plan | Requests per Minute | Executions per Minute | Daily Executions |
|---|---|---|---|
| Free | 10 | 10 | 50 |
| Starter | 20 | 10 | 200 |
| Pro | 60 | 10 | 1,000 |
| Enterprise | 200 | 10 | Unlimited |
The Executions per Minute limit applies to workflow execution requests specifically (POST /workflows/{id}/execute) and is the same across all plans to prevent runaway automation. The Requests per Minute limit covers all other API calls.
Response Headers
Every API response includes rate limit headers:
| Header | Description |
|---|---|
X-RateLimit-Limit |
Maximum requests allowed in the current window |
X-RateLimit-Remaining |
Requests remaining in the current window |
X-RateLimit-Reset |
Unix timestamp (seconds since epoch) when the window resets |
Retry-After |
Seconds to wait before retrying — relative duration (only on 429) |
Note:
X-RateLimit-Resetis an absolute Unix timestamp (e.g.1711036800), whileRetry-Afteris a relative number of seconds to wait (e.g.42). Both are standard HTTP headers but represent time differently.
Example headers:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 45
X-RateLimit-Reset: 1711036800
Handling 429 Responses
When you exceed the rate limit, the API returns 429 Too Many Requests:
{
"error": "Too many workflow executions. Please try again later.",
"retryAfter": 1711036800
}
Use exponential backoff to retry:
async function requestWithBackoff(url, options, maxRetries = 3) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
const res = await fetch(url, options);
if (res.status !== 429) return res;
const retryAfter = res.headers.get('Retry-After');
const delay = retryAfter
? parseInt(retryAfter) * 1000
: Math.pow(2, attempt) * 1000;
await new Promise((r) => setTimeout(r, delay));
}
throw new Error('Rate limit exceeded after retries');
}
Best Practices
- Check
X-RateLimit-Remainingbefore making requests to avoid hitting limits. - Use exponential backoff when you receive a
429. Don't retry immediately. - Batch operations where possible — update multiple nodes in a single workflow save instead of making separate calls.
- Cache responses for read-heavy workloads. Workflow definitions don't change frequently.
- Contact us at [email protected] if you need higher limits for your use case.