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.
| Provider | Windows |
|---|---|
| Claude Code | session (5h), weekly (7d), per-model weekly rows |
| OpenAI Codex | session, weekly, and a review family for *-review models |
| GitHub Copilot | chat, completions, premium interactions; monthly quotas otherwise |
| Cursor | Included spend, Auto mode, API usage, On-demand (individual and team pool), per-model rows |
Antigravity, agy | per-model rows, Gemini Weekly, Claude & GPT Weekly |
| Kimi | Weekly, Rolling 5-hour |
| MiniMax, MiniMax CN | per-model 5-hour and weekly |
| DeepSeek | account balance in currency |
| OpenCode Go | weekly, monthly |
| Grok CLI | Credits, 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.
| Trigger | Lock |
|---|---|
| 429 or a rate-limit or capacity message | Exponential: BACKOFF_BASE_MS (2000) doubled per level, capped at BACKOFF_MAX_MS (300000) and BACKOFF_MAX_LEVEL (15) |
| 401, 403, 404 | Two minutes |
| 402 | Two 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.