API Docs

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 Requests response.
  • 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 429 responses.
  • 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}")