Skip to main content

Limits by plan

PlanRequests / minuteRequests / dayMax scenarios per request
Starter (Free)101003
Growth1001,0003
EnterpriseCustomCustom3
Need higher limits? Upgrade your plan or contact us for an Enterprise quote.

Rate limit headers

Every API response includes these headers:
X-RateLimit-Limit: 10
X-RateLimit-Remaining: 8
X-RateLimit-Reset: 1713085320
X-RateLimit-Reset is a Unix timestamp indicating when the limit resets.

Handling 429 errors

When you exceed the rate limit, the API returns 429 Too Many Requests:
{
  "statusCode": 429,
  "error": "Too Many Requests",
  "message": "Rate limit exceeded. Retry after 2025-04-14T10:45:00Z",
  "retryAfter": "2025-04-14T10:45:00Z"
}
Implement exponential backoff with jitter:
import time
import random
import requests

def request_with_retry(url: str, headers: dict, params: dict, max_retries: int = 5):
    for attempt in range(max_retries):
        resp = requests.get(url, headers=headers, params=params)

        if resp.status_code != 429:
            resp.raise_for_status()
            return resp.json()

        retry_after = int(resp.headers.get("Retry-After", 2 ** attempt))
        jitter = random.uniform(0, 1)
        sleep_time = retry_after + jitter

        print(f"Rate limited. Retrying in {sleep_time:.1f}s (attempt {attempt + 1}/{max_retries})")
        time.sleep(sleep_time)

    raise Exception("Max retries exceeded")

Tips for staying within limits

  • Cache responses — KPI data doesn’t change in real-time. Cache results for 5–15 minutes.
  • Use interval=FY for AI agents that need summary data — it’s one request instead of 12 monthly requests.
  • Batch scenario comparisons — Pass up to 3 scenarios in a single request instead of making 3 separate calls.
  • Avoid polling — Don’t repeatedly fetch the same endpoint. Listen for webhook events (coming soon) to know when scenario data has been updated.