DurinDoor
Guides

Usage and quota

Where to look when an account runs out, which window each provider reports, how cooldowns and retention work, and how to adjust prices.

DurinDoor keeps two sets of numbers, and it helps to keep them apart:

  • Usage is what this install counted: requests, tokens, latency, and an estimated cost. It lives on Dashboard → Usage (/dashboard/usage). Monitoring usage covers that page.
  • Quota is what the provider says is left on the account. It lives on Dashboard → Quota Tracker (/dashboard/quota), and routing reads it. Quota tracking covers how snapshots and preflight work.

Resetting usage never touches upstream quota, and the provider's own dashboard is still the billing authority.

When an account runs out

Open Quota Tracker and find the connection. A row that is exhausted or cooling down shows when it resets.

If the numbers look stale, use the account's Refresh (bypass cache) action. The dashboard calls GET /api/usage/{connectionId}?refresh=1, which skips the fresh quota cache but still honors provider 429 cooldowns. The existing ?force=1 API flag remains supported.

If the provider supports quota preflight and you have another eligible account, routing can skip the exhausted connection. Otherwise add a connection or put the model in a combo with a fallback member.

A provider without a usage fetcher shows Usage API not implemented for <provider>. That is expected; see the table below.

What each provider reports

These providers have a usage fetcher. The window names are the ones the Quota Tracker shows.

ProviderWindows
Claude Codesession (5h), weekly (7d), per-model weekly rows
OpenAI Codexsession, weekly, and a review family for *-review models
GitHub Copilotchat, completions, premium interactions; monthly quotas otherwise
CursorIncluded spend, Auto mode, API usage, On-demand (individual and team pool), per-model rows
Antigravity, agyper-model rows, Gemini Weekly, Claude & GPT Weekly
KimiWeekly, Rolling 5-hour
MiniMax, MiniMax CNper-model 5-hour and weekly
DeepSeekaccount balance in currency
OpenCode Goweekly, monthly
Grok CLICredits, On-demand, Prepaid, Monthly

Also covered, with provider-specific rows: Gemini CLI, Kiro, Qoder, Qwen, Bailian Coding Plan, iFlow, Ollama, GLM, GLM CN, Vercel AI Gateway, CodeBuddy CN, xAI, and Grok Web. xAI falls back to 30 days of local history when its API has nothing.

Being in this list does not mean routing uses the number. Preflight only reads providers that have a quota policy; the list is on Quota tracking. Everything else relies on the upstream returning 429.

Per-provider notes: Claude Code, OpenAI Codex, Cursor, Antigravity, Kiro.

You can hide individual reported rows per connection in the limits view if a provider reports buckets you do not care about. The choice is stored per connection. Claude model-scoped weekly windows omitted by an account appear as muted — / not reported placeholders when a sibling on the current page reports that window. These placeholders cannot be hidden and do not imply available or exhausted quota; they are excluded from totals and routing. See Claude Code quota.

Cooldowns

For retryable upstream failures, DurinDoor temporarily locks the account or model and tries another eligible connection. Terminal errors stop the request. Some provider capacity or setup errors have special handling.

TriggerLock
429 or a rate-limit or capacity messageExponential: BACKOFF_BASE_MS (2000) doubled per level, capped at BACKOFF_MAX_MS (300000) and BACKOFF_MAX_LEVEL (15)
401, 403, 404Two minutes
402Two minutes, and the error is terminal for that request
Provider reset hint (for example Antigravity's reset timestamp, Kiro's monthly reset)Until that time

A 429 sent to the client carries Retry-After when the cooldown is known. The full behaviour is on Troubleshooting. The backoff variables are on Environment variables.

Retention

Nothing is pruned by default. Turn on Auto-clean old data under Profile → Observability to delete usage history, request details, timeline traces, and quota snapshots older than the window you pick (30 days unless you change it; presets 7, 15, 30, 60, or 90, or a custom value from 1 to 3650). The sweep runs hourly, starting a minute after boot. Clean now runs it at once. Over HTTP it is GET and POST /api/data-retention.

There is no CSV export for usage. Download Backup under Profile → Data & Backups saves portable configuration JSON, including API-key lifetime totals, but not request usage history, request details, or timeline events. To preserve that history, use an engine-level backup: the SQLite database or a PostgreSQL dump. See Data management.

Prices

Estimated cost uses the built-in model prices. Override a model's price on Settings → Pricing (/dashboard/settings/pricing) or through /api/pricing (GET, PATCH, DELETE to reset). New requests use the new price. Rows already stored keep their original estimate. Compare estimates with provider billing before using them for financial decisions.

On this page

Edit on GitHub