OfficeGest

Rate limits

Request limits of the OfficeGest API v2, the headers that report them and how to handle a 429

The API v2 applies two limits to every integration. When either is reached, the request is refused with HTTP 429 and data.code RATE_LIMITED.

The two limits

LimitDefaultCounted perWindow
Per minute200 requestsCompany and client IP address60 seconds from the first request of the window
Monthly100,000 requestsCompanyThe number of days of the current month, from the first request of the window. It does not reset on the 1st of the month.

The per-minute limit follows the limit in your license: if your contract has a higher limit, the API uses it with no change to your integration. Both limits may also be adjusted by support.

To read the limits that apply to your company, call GET /api/v2/utils/license: rate_limit_per_minute and rate_limit_per_month are the values the API enforces.

Only the operations that document a 429 response in their reference page are limited.

Headers and fields on every response

A successful JSON response reports the per-minute limit in its headers and both limits in meta. File downloads, such as PDF reports, do not carry them.

HeaderDescription
X-RateLimit-LimitRequests allowed per minute.
X-RateLimit-RemainingRequests left in the current minute window.
FieldDescription
meta.throttle_limitRequests allowed per minute.
meta.throttle_remainingRequests left in the current minute window.
meta.monthly_limitRequests allowed in the monthly window.
meta.monthly_remainingRequests left in the monthly window.

Every request counts toward the monthly limit, including a request refused by the per-minute limit.

When a limit is reached

The body follows the error format:

{
  "data": {
    "code": "RATE_LIMITED",
    "message": "Too many requests from same IP address."
  },
  "meta": {
    "trace_id": "9f86d081884c7d659a2feaa0c55ad01568f3a1c2b4d5e",
    "throttle_limit": 200,
    "throttle_remaining": 0,
    "throttle_reset": 26,
    "retry_after": "2026-10-20T16:30:16+01:00",
    "monthly_limit": 100000,
    "monthly_remaining": 98600
  }
}
HeaderPer-minute limitMonthly limitDescription
Retry-AfterYesYesSeconds to wait before retrying.
X-RateLimit-LimitYesNoRequests allowed per minute.
X-RateLimit-RemainingYesNoAlways 0.
X-RateLimit-ResetYesNoUnix timestamp, in seconds, when the minute window resets.

To tell the two apart, read meta: the per-minute limit returns meta.throttle_*, and the monthly limit returns meta.monthly_limit and meta.monthly_remaining with the message Too many requests in current month. In both cases meta.retry_after is the moment, in ISO 8601, from which you can retry.

Waiting before retrying

Wait the number of seconds in Retry-After, then send the request again. Do not retry in a loop without waiting: every refused request still counts toward the monthly limit.

curl -i https://{name}.officegest.com/api/v2/stocks/articles \
  -H "Authorization: Bearer <access_token>" \
  -H "Accept: application/json"
async function requestWithRetry(url, options, maxAttempts = 3) {
  for (let attempt = 1; attempt <= maxAttempts; attempt++) {
    const response = await fetch(url, options);

    if (response.status !== 429) {
      return response;
    }

    const seconds = Number(response.headers.get('Retry-After') ?? 60);
    await new Promise((resolve) => setTimeout(resolve, seconds * 1000));
  }

  throw new Error('Rate limit still exceeded after retrying');
}

A 429 from the monthly limit carries a Retry-After of hours or days. Stop sending requests until then, or contact support to review your limit.

Internal traffic

Requests that originate from your organization's own internal network, as configured by your OfficeGest administrator for your deployment, are not subject to either limit. This is an infrastructure-level setting your administrator configures for your installation; it cannot be requested or triggered from the client side of an individual API call.