Supyagent
Connected Accounts

Usage & Billing

API call quotas, rate limits, pricing tiers, overage billing, and usage monitoring for the Connected Accounts API.

Usage & Billing

The Connected Accounts API uses a tiered pricing model with per-minute rate limits and monthly API call quotas.

Pricing Tiers

FreeProEnterprise
Monthly API calls1,000100,000Unlimited
Requests per minute303001,000
Overage behaviorHard block$0.50 per 1,000 callsN/A
Platform credits100/month10,000/monthUnlimited
Credit overageHard block$0.01/creditN/A

Free Tier

  • 1,000 API calls per month with a hard cap — no overage allowed
  • 30 requests per minute
  • When the monthly limit is reached, all requests return 429 until the next billing cycle
  • Ideal for development and testing

Pro Tier

  • 100,000 API calls per month included
  • 300 requests per minute
  • Overage is billed at $0.50 per 1,000 calls ($0.0005 per call) via Stripe metered billing
  • Requests continue to work past the monthly limit — you're never hard-blocked
  • Upgrade at Settings > Billing in the dashboard

Enterprise Tier

  • Unlimited API calls with no monthly cap
  • 1,000 requests per minute
  • Custom pricing — contact us

Rate Limit Headers

Every API response includes rate limit information in the headers:

HeaderDescriptionExample
X-RateLimit-LimitMonthly API call quota1000
X-RateLimit-RemainingCalls remaining this month847
X-RateLimit-Minute-LimitPer-minute limit for your tier30
X-RateLimit-Minute-RemainingRequests remaining in current minute28
Retry-AfterSeconds until you can retry (only when rate limited)45

Reading Rate Limit Headers

const response = await fetch(
  "https://app.supyagent.com/api/v1/accounts",
  {
    headers: { "Authorization": "Bearer sk_live_your_key_here" },
  }
);

const monthlyLimit = response.headers.get("X-RateLimit-Limit");
const monthlyRemaining = response.headers.get("X-RateLimit-Remaining");
const minuteLimit = response.headers.get("X-RateLimit-Minute-Limit");
const minuteRemaining = response.headers.get("X-RateLimit-Minute-Remaining");

console.log(`Monthly: ${monthlyRemaining}/${monthlyLimit}`);
console.log(`Minute: ${minuteRemaining}/${minuteLimit}`);

if (response.status === 429) {
  const retryAfter = response.headers.get("Retry-After");
  console.log(`Rate limited — retry in ${retryAfter}s`);
}
import requests

response = requests.get(
    "https://app.supyagent.com/api/v1/accounts",
    headers={"Authorization": "Bearer sk_live_your_key_here"},
)

monthly_limit = response.headers.get("X-RateLimit-Limit")
monthly_remaining = response.headers.get("X-RateLimit-Remaining")
minute_limit = response.headers.get("X-RateLimit-Minute-Limit")
minute_remaining = response.headers.get("X-RateLimit-Minute-Remaining")

print(f"Monthly: {monthly_remaining}/{monthly_limit}")
print(f"Minute: {minute_remaining}/{minute_limit}")

if response.status_code == 429:
    retry_after = response.headers.get("Retry-After")
    print(f"Rate limited — retry in {retry_after}s")
# Use -v to see response headers
curl -v https://app.supyagent.com/api/v1/accounts \
  -H "Authorization: Bearer sk_live_your_key_here" 2>&1 | grep -i "x-ratelimit\|retry-after"

Handling Rate Limits

Implementing Retry Logic

async function requestWithRetry(
  url: string,
  options: RequestInit,
  maxRetries = 3
): Promise<Response> {
  for (let attempt = 0; attempt <= maxRetries; attempt++) {
    const response = await fetch(url, options);

    if (response.status !== 429) return response;

    const retryAfter = parseInt(
      response.headers.get("Retry-After") || "60",
      10
    );
    const delay = retryAfter * 1000 * Math.pow(2, attempt);

    console.log(`Rate limited. Retrying in ${delay / 1000}s...`);
    await new Promise(resolve => setTimeout(resolve, delay));
  }

  throw new Error("Max retries exceeded");
}
import time

def request_with_retry(method, url, max_retries=3, **kwargs):
    for attempt in range(max_retries + 1):
        response = requests.request(method, url, **kwargs)

        if response.status_code != 429:
            return response

        retry_after = int(response.headers.get("Retry-After", 60))
        delay = retry_after * (2 ** attempt)

        print(f"Rate limited. Retrying in {delay}s...")
        time.sleep(delay)

    raise Exception("Max retries exceeded")

Payment Status

If your Stripe payment fails and your subscription enters past_due status, all API requests are blocked regardless of your tier. The API returns:

{
  "ok": false,
  "error": "Payment past due. Please update your payment method."
}

Update your payment method at Settings > Billing in the dashboard. API access resumes immediately after successful payment.

Usage Alerts

Supyagent automatically monitors usage and creates alerts for:

AlertSeverityTrigger
Approaching quotaWarning80% of monthly quota reached
Quota reachedCritical100% of monthly quota reached
Usage spikeCritical5x increase from your average
High error rateWarningOver 50% of requests failing

Alerts are visible in the dashboard at Settings > Usage.

Platform Credits

In addition to API call quotas, certain platform services consume credits:

ServiceCost
Web search1 credit/query
OCR1 credit/page
File upload1 credit/upload
Database query1 credit/query
Database export2 credits/export
Speech-to-text5 credits/minute
Text-to-speech10 credits/1K characters
Code execution5 base + 1/10 seconds
Video analysis10 credits/minute
Browser visit5 credits/page
Browser agent20 base + 5/turn
Image generation50 credits/image
Video generation50 credits/second

Credit limits follow the same tier structure: Free (100/month, hard block), Pro (10,000/month, $0.01/credit overage), Enterprise (unlimited).