Rate Limits
Understand how Unipile enforces rate limiting to protect your integrations and stay within provider constraints. Learn how rules apply to methods, error handling, and configuration.
Overview
Each provider supported by Unipile (LinkedIn, Gmail, WhatsApp, etc.) applies its own rate limits to manage traffic and prevent abuse. If those limits are exceeded, the provider may temporarily block the account, flag it as suspicious, or restrict access — which can lead to degraded service or disconnections.
To avoid this and keep your integrations stable, Unipile enforces its own rate limiting at the Methods API level. Requests that exceed the allowed threshold are rejected by Unipile before they are sent to the provider. This:
- Protects your accounts from being throttled or banned by providers
- Keeps behavior consistent when calling external APIs
- Reduces the risk of errors caused by provider-side limits
All configured rate-limit values and time windows are visible in the Rate Limits tab of the Unipile Dashboard.

For provider-specific quotas and behavior recommendations, see Limits and Restrictions.
How rate limits apply to methods
In the Dashboard, All methods shows a limit applied uniformly to every Methods API route. Each route has its own counter for each connected account: requests to one route do not use another route's allowance. A row showing a specific method adds a limit for that route only, such as sending a message or an invitation. It counts requests and uses time windows in exactly the same way as the All methods limit.
When a route has an additional limit, both limits apply to its requests. Unipile checks the route-specific limit first, then the All methods limit for that route. If either is exceeded, Unipile rejects the request immediately with 429 Too Many Requests; the next limit is not checked for that request.
Each of these limits can have up to two independent time windows, each with its own request allowance and reset time. For example, the Dashboard may show a one-minute and a one-day window for the same limit. A request must fit within every applicable window to proceed. Within each limit, shorter windows are checked first. When one window rejects a request, later windows and limits are not checked for that request.
These are rate limits, not calendar-based quotas. Each limit uses a rolling fixed window that starts with the first request when no window is active. Its duration is fixed from that request; later requests count toward the same window without moving its expiry. Once it expires, the next request starts a new window. For example, if a one-minute window starts at 14:23:17, it expires at 14:24:17, not at 14:24:00. Likewise, a one-day window lasts 24 hours from its first request; it does not reset at midnight. Counters are separate for each connected account, so requests for one account do not use another account's allowance.
Good to know
- Each provider has its own constraints. For example, some providers apply stricter limits than others when sending messages, so rate limit configurations may vary by provider.
- Requests served from cache do not count toward rate limits because they are not forwarded to the provider. See Manage Cache for details.
Examples
The values below are illustrative; your provider's configured limits are shown in the Dashboard.
Suppose All methods allows 100 requests per day. For one connected account, GET /chats and POST /chats/{chat_id}/messages/send each have their own counter. If the GET requests are not served from cache, the 101st GET /chats request in its active day window is rejected, but those GET requests do not use the send-message route's allowance.
Now suppose the send-message route also allows 10 requests per minute. Its 11th request in the active minute window is rejected by the route-specific limit, even though the All methods window still has room. If 100 send-message requests are spread across the day without exceeding 10 in any minute, the next request can instead be rejected by the All methods limit, even when the route-specific minute window has room.
When you exceed the limits
API response
When a Unipile rate limit rejects a request, the API returns:
- HTTP status:
429 Too Many Requests - Error type:
api/too_many_requests
The response body follows the standard error shape (RFC 7807), including type, title, detail, and req_id.
Check the error type
provider/too_many_requestsmeans the provider's own rate limit was reached, not Unipile's. Unipile does not control that limit. This often happens when a Unipile limit has been set too high to stop requests before they reach the provider's threshold. The response-header guidance below applies to Unipile's rate limiter: for a429, use it only whentypeisapi/too_many_requests. Even ifx-ratelimit-*headers appear on a provider429, they do not describe the provider's limit or give a reliable provider retry time.
Read the response headers
Unipile's x-ratelimit-* headers describe the request allowance and reset time for one window. A request that Unipile rejects with 429 (type: api/too_many_requests) also includes retry-after:
| Header | Meaning |
|---|---|
x-ratelimit-limit | Maximum requests allowed in the window shown. |
x-ratelimit-remaining | Requests left in that window. |
x-ratelimit-reset | Seconds until that window expires. |
retry-after | Seconds to wait before retrying after a Unipile 429. |
For a request evaluated by Unipile's rate limiter, an accepted response shows the last applicable window checked. A Unipile 429 shows the first window that rejected the request. The headers do not identify whether that window belongs to All methods or an additional route-specific limit, and they do not report the state of other applicable windows. Compare the limit and window with the values in the Dashboard, but do not assume a matching value uniquely identifies the rule. See the header reference for details.
For example, an accepted request might return:
HTTP/1.1 200 OK
x-ratelimit-limit: 50
x-ratelimit-remaining: 12
x-ratelimit-reset: 24
This window allows 50 requests, has 12 remaining, and expires in 24 seconds. You can slow requests as the remaining count falls. Another applicable window could still reject a request sooner.
Example: both limits reached
Suppose a send-message route has an additional limit of 10 requests per minute and the All methods limit is 50 requests per day. If both windows are full, the route-specific window rejects the next request first. A response could include:
HTTP/1.1 429 Too Many Requests
x-ratelimit-limit: 10
x-ratelimit-remaining: 0
x-ratelimit-reset: 34
retry-after: 34
Wait at least 34 seconds before retrying. These headers describe only the route-specific window in this example. Once it expires, the All methods window may still reject the next request with its own retry-after value.
Example: two windows for one limit
Suppose All methods has 5 requests per minute and 100 requests per day, with no additional limit on the requested route. If the minute window is full, a 429 shows x-ratelimit-limit: 5 and the minute window's retry-after. If the minute window later expires while the day window remains full, the next request can return a 429 with x-ratelimit-limit: 100 and the day window's retry-after. In each case, follow the retry-after in the response you received; the earlier response did not report the other window's state.
Provider rate limits
When the provider’s rate limiter is hit (for example, because it uses a different or stricter window), the API returns:
- HTTP status:
429 Too Many Requests - Error type:
provider/too_many_requests
A provider/too_many_requests response means the request reached the provider. Unipile cannot reliably determine when the provider will accept another request, so its retry timing is less predictable than for api/too_many_requests.
Configuring rate limits
The values shown in the Dashboard start with recommended defaults based on each provider's limits. You can adjust an All methods limit or a limit for a specific route to fit your usage, and reset a customized value to the recommendation at any time.
Increasing a limit means accepting the risk that requests reach the provider's rate limiter and return provider/too_many_requests. Unipile tracks provider rate limit changes and updates its recommended defaults to stay aligned with upstream constraints.
If a customized limit causes a provider 429, Unipile cannot provide a reliable retry time for that response. Use the recommended values when predictable retry behavior matters.
Related topics
- Manage Cache — Reduce provider calls and rate limit hits by using cached GET responses
- Error responses — Full list of error types and how to handle them
- Limits and Restrictions — Provider-specific quotas and best practices
Updated 9 days ago