Rate Limits
We enforce API call rate limits to protect our infrastructure from excessive request rates, to keep Close fast and stable for everyone. These limits are high enough that typical API workflows aren't affected. However, please do code your integration to follow the rule below:
If you receive a response status code of 429 (Too Many Requests), please
sleep/pause for the number of seconds specified by the rate_reset
value before
making additional requests to that endpoint. See below for the specific
response format.
Rate limits are enforced per endpoint group. Endpoint groups are used to provide more granular control by grouping endpoint URL paths and methods (e.g. GET, PUT, etc.) together. For instance, GETs to /api/v1/lead/ and POSTs/PUTs to /api/v1/activity/ may be counted as two different API groups. This allows us to offer a higher limit on lightweight requests than we would be able to on more resource intensive request types.
API requests are limited at a per Organization level across all users' API keys. We also enforce a lower rate limit per API key, which helps ensure that an individual heavy integration doesn't cause other lightweight integrations (on separate API keys) to get rate limited unnecessarily. The per Organization limit is currently 3 times higher than individual API key rate limits, meaning that if the API key rate limit maximum requests per second (RPS) is 20 RPS, the organization wide limit would be 60 RPS for that same endpoint group. This allows you to use 3 API keys at their maximum RPS and not hit the Organization rate limit until you add a 4th key making additional requests. The 429 response provides details to identify which limit and endpoint group was hit.
Most API responses will have the ratelimit
header to provide rate limiting
statistics about the limit it's closest to hitting. Per the RFC spec, this
header will contain three values:
limit
: Request limit enforced for this endpoint, some endpoints may allow bursting over this limitremaining
: Requests left in the enforcement windowreset
: Seconds remaining before this enforcement window ends (as a decimal).
For example, the full header might look like:
RateLimit: limit=100, remaining=50, reset=5
Note: previously rate limit headers x-rate-limit-limit
,
x-rate-limit-remaining
, x-rate-limit-reset
were included, however they have
been replaced by the above single RateLimit
value.
Each 429
response is guaranteed to have the ratelimit
header set as well as
the retry-after
header as per RFC 7231 (equivalent to x-rate-limit-reset
rounded up to the next integer).
Note: previously data was provided in the response body, however that
information should be gathered from the RateLimit
header instead.
Some API endpoints may have stricter (unpredictable) rate limits and may trigger
a 429 even if the user agent places requests within the enforcement window. In
these scenarios only the rate_reset
values and retry-after
header may be
set.
Note: We recommend using the rate_reset
value instead of the retry-after
header for a more accurate wait time.