Guides

Rate Limiting

Per-key rate limits protect against burst traffic and runaway token consumption. When a limit is hit, the gateway returns HTTP 429 with headers that tell you exactly when to retry.

Limit types

RPMRequests per minute
Counts every request in a fixed 60-second window. Resets every minute. Good for protecting against burst spikes from a single client.
TPDTokens per day
Cumulative prompt + completion tokens across all requests. Resets at midnight UTC. Good for capping total daily cost for a key.
Limits are configured per API key at the platform level. Contact support@inferexai.in to set or adjust limits for your keys. If no limit is configured, the key has no rate limit.

429 response — RPM

text
HTTP/1.1 429 Too Many Requests
Retry-After: 42
X-RateLimit-Limit-RPM: 60
Content-Type: application/json

{"detail": "rate limit exceeded — too many requests per minute"}
  • Retry-After — seconds until the current window expires. Sleep this long before retrying.
  • X-RateLimit-Limit-RPM — the configured RPM limit for this key.

429 response — TPD

text
HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit-TPD: 500000
X-RateLimit-Used-TPD: 500000
Content-Type: application/json

{"detail": "daily token limit exceeded — resets at midnight UTC"}
  • X-RateLimit-Limit-TPD — the daily token limit.
  • X-RateLimit-Used-TPD — tokens consumed today. Resets at midnight UTC — no Retry-After header is set.

Handling 429 in Python

rate_limit.py
import time
from inferexai import InferexAI, InferexAIError

client = InferexAI(api_key="sk-live-your-key")

def chat_with_rate_limit(messages, max_retries=5):
    for attempt in range(max_retries):
        try:
            return client.chat.completions.create(
                model="default",
                messages=messages,
            )
        except InferexAIError as e:
            if e.status != 429:
                raise
            retry_after = int(e.response.headers.get("Retry-After", "10"))
            print(f"Rate limited. Retrying in {retry_after}s...")
            time.sleep(retry_after)
    raise RuntimeError("Rate limit retries exhausted")

Handling 429 in Node.js

rate_limit.ts
import InferexAI from "inferexai";

const client = new InferexAI({ apiKey: "sk-live-your-key" });

async function chatWithRateLimit(messages, maxRetries = 5) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    try {
      return await client.chat.completions.create({
        model: "default",
        messages,
      });
    } catch (err) {
      if (err?.status !== 429) throw err;
      const retryAfter = parseInt(err.headers?.["retry-after"] ?? "10", 10);
      console.log(`Rate limited. Retrying in ${retryAfter}s...`);
      await new Promise(r => setTimeout(r, retryAfter * 1000));
    }
  }
  throw new Error("Rate limit retries exhausted");
}

Tips

Always read the Retry-After header rather than using a fixed backoff — it tells you exactly how long to wait.
For voice agents and real-time applications, set RPM conservatively and use streaming to reduce perceived latency.
TPD limits reset at midnight UTC, not midnight in your local timezone.
Create separate keys per application. If one app hits its limit, other keys are unaffected.
Monitor per-key token usage in Dashboard → Observability to tune limits before they bite in production.