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
| Free | Pro | Enterprise | |
|---|---|---|---|
| Monthly API calls | 1,000 | 100,000 | Unlimited |
| Requests per minute | 30 | 300 | 1,000 |
| Overage behavior | Hard block | $0.50 per 1,000 calls | N/A |
| Platform credits | 100/month | 10,000/month | Unlimited |
| Credit overage | Hard block | $0.01/credit | N/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
429until 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:
| Header | Description | Example |
|---|---|---|
X-RateLimit-Limit | Monthly API call quota | 1000 |
X-RateLimit-Remaining | Calls remaining this month | 847 |
X-RateLimit-Minute-Limit | Per-minute limit for your tier | 30 |
X-RateLimit-Minute-Remaining | Requests remaining in current minute | 28 |
Retry-After | Seconds 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:
| Alert | Severity | Trigger |
|---|---|---|
| Approaching quota | Warning | 80% of monthly quota reached |
| Quota reached | Critical | 100% of monthly quota reached |
| Usage spike | Critical | 5x increase from your average |
| High error rate | Warning | Over 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:
| Service | Cost |
|---|---|
| Web search | 1 credit/query |
| OCR | 1 credit/page |
| File upload | 1 credit/upload |
| Database query | 1 credit/query |
| Database export | 2 credits/export |
| Speech-to-text | 5 credits/minute |
| Text-to-speech | 10 credits/1K characters |
| Code execution | 5 base + 1/10 seconds |
| Video analysis | 10 credits/minute |
| Browser visit | 5 credits/page |
| Browser agent | 20 base + 5/turn |
| Image generation | 50 credits/image |
| Video generation | 50 credits/second |
Credit limits follow the same tier structure: Free (100/month, hard block), Pro (10,000/month, $0.01/credit overage), Enterprise (unlimited).
API Reference
Complete endpoint reference for the Connected Accounts API — authentication, request formats, response shapes, and error codes.
Testing & Development
Set up a local development environment for the Connected Accounts API — OAuth callback URLs, provider configuration, and testing without a frontend.