Skip to main content
Each API key may make 60 requests per minute by default. The limit is per key, not per IP address or per company, so separate integrations with separate keys never starve each other.

Headers

Responses to authenticated requests, including a per-minute 429, report the key’s current per-minute window:
A few roster sync responses carry no X-RateLimit-* headers: 411 and 413, and a 409 or 429 refusal of a sync body larger than 100 KB, which is refused before the key’s window is read. On a 429 for the hourly sync budget, the headers still describe the per-minute window; Retry-After is the value to follow.

When you exceed the limit

The API returns 429 Too Many Requests with a Retry-After header in seconds:
Wait at least Retry-After seconds before the next request. Do not retry in a tight loop: requests made while limited do not succeed.

Roster sync limits

PUT /v1/employees/sync writes thousands of rows, so it has two extra limits on top of the per-minute one: A 409 means another sync of your company is still running, or the platform is briefly busy with other syncs. It is not counted against your hourly budget. Retry after the delay.

Staying within the limit

Leaderboards are cached by TeamBuilder for up to 30 seconds, and stats and catalogue data change slowly. Serve your pages from your own cache and refresh it on a timer, instead of calling the API on every page view. See Leaderboards: refresh cadence.
Walk lists with limit=100. A full walk then costs one request per 100 items.
For an overview of all departments, one GET /v1/leaderboard/by-department call replaces a filtered leaderboard call per department.
Slow down when X-RateLimit-Remaining runs low, rather than waiting for a 429.

Higher limits

If your integration genuinely needs more, for example a large company’s nightly export, email contact@teambuilder.ge with the key’s purpose and expected volume. Limits can be raised per key.
A separate per-IP ceiling protects the API before authentication. It is far above what any single key can use, so a well-behaved integration never meets it; if many keys share one egress IP and do hit it, the response is the same 429 with Retry-After.