API requests are rate-limited per token to ensure fair usage and system stability.
Limits
Section titled “Limits”| Limit | Value |
|---|---|
| Requests per minute | 60 |
Limits apply per API token. If your integration uses multiple tokens, each token has its own independent limit.
Handling 429 responses
Section titled “Handling 429 responses”When you exceed the limit, the API returns 429 Too Many Requests with a Retry-After header:
HTTP/1.1 429 Too Many RequestsContent-Type: application/jsonRetry-After: 60
{ "errors": ["Rate limit exceeded"] }The Retry-After value is the number of seconds to wait before retrying.
import requestsimport time
def api_get(url, token, retries=3): for attempt in range(retries): response = requests.get(url, headers={"Authorization": f"Bearer {token}"}) if response.status_code == 429: wait = int(response.headers.get("Retry-After", 60)) print(f"Rate limited. Waiting {wait}s...") time.sleep(wait) continue response.raise_for_status() return response.json() raise Exception("Rate limit retries exhausted")Staying within limits
Section titled “Staying within limits”For bulk operations — syncing a large inventory, importing many projects — space out requests to stay under 1 request per second on average.
If your integration consistently needs more than 60 requests per minute, contact support to discuss higher limits for your account.