Rate limits
Standard rate limits
By default, Front's API rate limit starts at 50 requests per minute and varies depending on your plan. Rate limits are enforced on a per-company basis rather than a per-token basis.
| Starter | Professional | Enterprise |
|---|---|---|
| 50 rpm | 100 rpm | 200 rpm |
Rate limit increases beyond the default limits require the Professional plan or higher. See our API rate limit add-on documentation for further details.
Rate limits are in place to protect our infrastructure and ensure the reliability of the platform for all customers.
Rate limits for the integrations you use / Partner rate limits
Note that API requests made by a partner integration on behalf of a company via OAuth have a separate rate limit of 120 rpm (enforced on a per-company basis). This means that API requests made by integrations installed by a customer do not count against the customer’s rate limit (the only exception to this is the Zapier integration).
Rate limits for the servers you connect to your apps
Front allows you to configure servers for authorization in your apps. The rate limit for making calls to these servers is 600 rpm.
Monitor your rate limit with API headers
Every API call response will contain three headers related to the rate-limiting:
| Name | Description |
|---|---|
x-ratelimit-limit | Maximum number of request allowed in the time window |
x-ratelimit-remaining | Current number of requests remaining in the current time window specified in x-ratelimit-reset. |
x-ratelimit-reset | Next UNIX timestamp when the number of remaining requests will be reset. This will never be more than 1 minute out. |
x-ratelimit-burst-limit | An additional allowance of requests that can be made after you have exceeded your rate limit. This extra allowance helps you deal with occasional spikes in traffic. This burst limit is equal to half of your plan's rate limit (including any API add-ons you have purchased). If you exceed the burst limit within the current time window specified in |
x-ratelimit-burst-remaining | Current number of burst requests remaining in the 10-minute time window since you sent the first burst request. |
When the rate limit is exceeded, the server will respond with a 429 Too Many Requests HTTP code. You will additionally receive the following headers:
| Name | Description |
|---|---|
retry-after | How many seconds you need to wait before you can retry the request |
x-front-tier | (Optional) Present only on requests to endpoints with additional burst rate limiting. Indicates which limit this request exceeded. |
Rate limited API response
If you exceed an API rate limit, you should expect to receive a JSON object response with a structure similar to this example;
{
"_error": {
"status": 429,
"title": "Too Many Requests",
"message": "Rate limit exceeded. Please retry in 44148 milliseconds."
}
}Example
Refer to the Sample Application for an example of how to implement rate limiting in your integrations.
Additional rate-limiting
Some resource-intensive routes are subject to additional rate guards to prevent strain on Front's infrastructure. These guards typically have short TTLs and limit sudden bursts of requests. The limit will depend on the resources needed to fulfill the request. Please see the list below.
Responses for rate-guarded requests carry the X-Front-Tier header. If a guard causes a request to be rejected, you will receive a 429 response with the header Retry-After, even thoughX-RateLimit-Remaining may be greater than 0. This is because the limits do not affect each other.
Please wait Retry-After seconds before safely retrying the request. Your integration should not intentionally encounter rate limits; if you do get rate-limited, you should observe the Retry-After header and avoid subsequent requests to the same guard bucket.
| Guard | X-Front-Tier | Limit | Grouped By | Routes |
|---|---|---|---|---|
| Analytics | 1 | 1 req / 3s | global | POST /analytics/reports, POST /analytics/exports |
| Per-resource | 2 | 5 req / 1s | route + resource (see subsequent table) | see subsequent table |
| Search | search | 40% rate limit | global | GET /conversations/search/:query |
| Message seen | message-seen | 10 req / message / hour | message | POST /messages/:message_id/seen |
| App object links | dynamic-object | 60 req / 60s | global | POST /links |
You can find more details about the per-resource guards below. The "Grouped By" column explains any additional group keys beyond the route and resource.
| Route(s) | Grouped By |
|---|---|
POST /accounts | |
PATCH /accounts/:account_id | account_id |
POST /applications/:application_uid/events | event type (+ object) |
POST /inboxes/:inbox_id/channels | channel type |
PATCH /knowledge_bases/:kb_id/content,PATCH /knowledge_bases/:kb_id/locales/:locale/content,POST /knowledge_bases/:kb_id/articles,POST /knowledge_bases/:kb_id/locales/:locale/articles | kb_id (per route) |
PATCH /knowledge_base_articles/:kba_id/content,PATCH /knowledge_base_articles/:kba_id/locales/:locale/content | kba_id (per route) |
PATCH /teammates/:teammate_id | teammate_id |
POST /channels/:channel_id/messages | channel_id + recipients |
POST /conversations/:conversation_id/messages | conversation_id |
POST /channels/:channel_id/incoming_messages | channel + derived conversation reference |
POST /channels/:channel_id/inbound_messages,PUT /channels/:channel_id/conversations/:conv_ext_id/messages/:message_ext_id,POST /channels/:channel_id/outbound_message | channel + external conversation reference (per route) |
POST /inboxes/:inbox_id/imported_messages | inbox_id + recipients |
PATCH /conversations/:conversation_id,PUT /conversations/:conversation_id/assignee,PATCH /conversations/:conversation_id/reminders | shared per conversation_id across routes |
POST/DELETE /conversations/:conversation_id/tags,POST/DELETE /conversations/:conversation_id/links | shared per conversation_id across requests |
Updated 7 days ago
