Qorven enforces two kinds of limits: gateway-level (IP and tenant, protect the server) and channel-level (per-binding, respect provider limits).

Gateway-level

From the default config.toml:
[limits]
# Max requests per second per IP (burst 20).
ip_rate_per_sec = 10
ip_rate_burst   = 20

# Max concurrent plan-run requests per tenant.
tenant_concurrent_runs = 5

# Sustained tenant rate (req/min across all endpoints).
tenant_rate_per_min = 600

# Max request body (protects against large uploads).
max_body_mb = 10
If a tenant hits the rate limit, the gateway returns 429 Too Many Requests with a Retry-After header. The CLI and web UI honour it.

Channel-level

Each channel binding has its own outbound quota. Telegram’s default:
qorven channels show telegram-bot
# outbound_rate_per_sec: 30
# outbound_rate_per_min: 1500
# per_user_rate_per_min: 60
These match Telegram’s published limits; raising beyond their ceiling will get your bot rate-limited by Telegram itself.
Raising rate limits on Meta channels (WhatsApp, Facebook Messenger) without Meta’s approval will get your account flagged. Stay within the public tier until Meta upgrades your messaging limit.

Per-provider LLM quotas

The LLM side has its own limits, enforced by the provider (OpenAI, Anthropic, etc.). Qorven handles them with automatic failover:
  1. Try provider A’s first key
  2. On 429 → try A’s next key
  3. All of A’s keys exhausted → try provider B
  4. All providers exhausted → report error to the user
See failover.

Quota dashboard

Web UI → Usage → Quotas shows:
  • IP-level: current vs. limit for connected clients
  • Tenant-level: concurrent runs, req/min
  • Channel-level: messages/min per binding
  • Provider-level: tokens/min per key

Raising limits

For self-hosted, edit config.toml:
[limits]
tenant_concurrent_runs = 50
tenant_rate_per_min = 10000
Restart. No migration required. For channel-level, depends on the provider — most require you to verify and request higher tiers. Details per-channel:

Telegram — unlimited for premium bots

WhatsApp — tier 1/2/3/4/5

Slack — per-app rate buckets

Email (SMTP) — provider-specific

When quotas fire

Gateway hit the IP rate limit. Usually a client bug (retry loop). Check qorven logs --filter rate_limit.exceeded.
Channel-level outbound limit. The Qor attempted to reply, the quota said no, the reply is retried on backoff. Eventually delivers unless the backlog overflows.
Provider-level. Failover kicks in; if all providers are exhausted you’ll see ERROR agent.loop.all_models_failed. Time to add more keys or a different provider.

Where next

Failover

How LLM calls rotate across keys and providers.

Debounce

The inbound side: merging rapid messages.

Usage page

Monitoring tokens + cost + throughput.