Rate Limits
Requests to the Flowcase API are rate-limited per account across all API keys.
Limits
| Endpoints | Requests per second | Requests per minute |
|---|---|---|
| All (unless noted below) | 5 | 150 |
/api/v1/cvs/download, /api/v1/data_export |
0.5 (1 every 2s) | 10 |
Rate limiting is enforced across an entire account's API usage, so make sure any clients you build:
- Add throttling to your HTTP client so it never exceeds the per-second or per-minute limits.
- Implement exponential backoff when receiving a
429 Too Many Requestsresponse. - Pause between requests to stay within the allowed rate.
- Account for other integrations on the same account: if one exhausts the allowance, all others will be rate-limited too.
Python client example
A small Python client built on requests and the standard library. It:
- Retries on
429responses. - Backs off exponentially between retries.
- Handles request errors.
- Prints each retry attempt.
import time
from typing import Dict, Optional
import requests
MAX_RETRIES = 3
BASE_DELAY = 5 # seconds
def make_request(
url: str,
api_key: str,
method: str = "GET",
payload: Optional[Dict] = None,
) -> Dict:
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {api_key}",
}
for attempt in range(MAX_RETRIES):
try:
response = requests.request(
method=method,
url=url,
headers=headers,
json=payload,
)
if response.status_code == 429:
delay = BASE_DELAY * (2**attempt)
print(f"Rate limited, retry {attempt + 1} of {MAX_RETRIES} in {delay}s")
time.sleep(delay)
continue
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
if attempt == MAX_RETRIES - 1:
raise
print(f"Request error ({e}), retry {attempt + 1} of {MAX_RETRIES}")
time.sleep(BASE_DELAY * (2**attempt))
raise RuntimeError(f"Still rate limited after {MAX_RETRIES} attempts: {url}")
# Example usage
api_key = "MYKEY"
account = "MYACCOUNT"
try:
users = make_request(f"https://{account}.flowcase.com/api/v2/users/search", api_key)
print(users)
except Exception as e:
print(f"Request failed: {e}")