Rate Limits
Understand request quotas, response headers, and how to handle rate-limited responses.
Default limits
Rate limits are applied per API key using a sliding window. Each key has a general requests-per-minute (RPM) limit, plus tighter caps on expensive operations.
| Limiter | Applies to | Default |
|---|---|---|
| General | All endpoints | 120 RPM |
| DealMap generation | POST /dealmap/generate | 20 RPM |
| DealMap generation (workspace) | POST /dealmap/generate, all keys in a workspace combined | 40 RPM |
| Outreach | POST /outreach | 60 RPM |
The general RPM limit may vary by plan; 120 requests per minute is the default per key. The DealMap generation (20 RPM) and outreach (60 RPM) caps are hard limits applied to all API keys, and DealMap generation is also capped at 40 RPM per workspace across all of its keys.
Batch in parallel
DealMap generation takes roughly 15–45 seconds per company, so work through a list in parallel rather than one request at a time: up to 10 concurrent DealMap generations and up to 10 concurrent outreach requests per key. On a 429, wait the Retry-After seconds and retry only the rejected requests.
Response headers
Every API response includes rate-limit headers so you can track your remaining quota:
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests allowed in the current window. |
X-RateLimit-Remaining | Requests remaining in the current window. |
X-RateLimit-Reset | Seconds until the window resets. |
HTTP/1.1 200 OK
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 57
X-RateLimit-Reset: 42
Content-Type: application/jsonHandling 429 responses
When you exceed the rate limit, the API returns 429 Too Many Requests. Use the X-RateLimit-Reset header to determine when to retry.
{
"error": "Rate limit exceeded. Try again in 18 seconds."
}Retry strategy
Read X-RateLimit-Reset and wait that many seconds before retrying. If the header is missing, use exponential backoff starting at 1 second.