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.

StarterProfessionalEnterprise
50 rpm100 rpm200 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:

NameDescription
x-ratelimit-limitMaximum number of request allowed in the time window
x-ratelimit-remainingCurrent number of requests remaining in the current time window specified in x-ratelimit-reset.
x-ratelimit-resetNext 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-reset, it will take 10 minutes before your burst requests are replenished.

x-ratelimit-burst-remainingCurrent 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:

NameDescription
retry-afterHow 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 though
X-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.

GuardX-Front-TierLimitGrouped ByRoutes
Analytics11 req / 3sglobalPOST /analytics/reports, POST /analytics/exports
Per-resource25 req / 1sroute + resource (see subsequent table)see subsequent table
Searchsearch40% rate limitglobalGET /conversations/search/:query
Message seenmessage-seen10 req / message / hourmessagePOST /messages/:message_id/seen
App object linksdynamic-object60 req / 60sglobalPOST /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_idaccount_id
POST /applications/:application_uid/eventsevent type (+ object)
POST /inboxes/:inbox_id/channelschannel 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_idteammate_id
POST /channels/:channel_id/messageschannel_id + recipients
POST /conversations/:conversation_id/messagesconversation_id
POST /channels/:channel_id/incoming_messageschannel + 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_messagesinbox_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