Skip to main content

Claude Code usage monitor — fetches rate limits from Anthropic's API

Project description

ccusage

Claude Code usage monitor. Fetches your real rate limit data from Anthropic's API and displays it in the Claude Code statusline.

Example output

ccusage command:

Plan: max_5x
  Session (5h)         39%  resets 1h26m
  Week (all)           15%  resets 143h26m
  Week (Sonnet)        39%  resets 65h26m
  Extra usage          $0.00 / $1000.00

Claude Code statusline (self-caching — refreshes from API when stale, no daemon needed):

~/projects/myapp [Opus 4.6] 5h:39% 7d:15% son:39% | $1.37 | max_5x | reset:1h26m

Install

uv tool install ccusage

Then run:

# Check usage once
ccusage

# Run the daemon (keeps usage-limits.json updated)
ccusage daemon

Configure the statusline in ~/.claude/settings.json:

{
  "statusLine": {
    "type": "command",
    "command": "ccusage statusline"
  }
}

Commands

Command Description
ccusage Show current usage (colored terminal output)
ccusage json Print raw JSON
ccusage daemon [-i SECS] Run in foreground, refresh every 5 min (customizable)
ccusage statusline Claude Code statusline (self-caching, no daemon needed)
ccusage install Print setup instructions

How Claude Code rate limiting works

Discovered by inspecting Claude Code's bundled cli.js (v2.1.32).

Data sources

Claude Code gets rate limit data from two places:

  1. /api/oauth/usage endpoint — Called by the /status slash command. Returns utilization percentages and reset times for each rate limit bucket. Requires the anthropic-beta: oauth-2025-04-20 header.

  2. Response headers on every API call — Every message response includes headers like:

    • anthropic-ratelimit-unified-{claim}-utilization (0-100 float)
    • anthropic-ratelimit-unified-{claim}-reset (unix timestamp)
    • anthropic-ratelimit-unified-status (allowed / allowed_warning / rejected)
    • anthropic-ratelimit-unified-fallback (available when fallback models are available)
    • anthropic-ratelimit-unified-overage-status / overage-reset
    • anthropic-ratelimit-unified-representative-claim

Rate limit types

Type Key in API response Description
five_hour five_hour Rolling 5-hour session window
seven_day seven_day Rolling 7-day all-models window
seven_day_sonnet seven_day_sonnet Rolling 7-day Sonnet-specific window
seven_day_opus seven_day_opus Rolling 7-day Opus-specific window
overage extra_usage Extra/overage usage (if enabled)

The flat seven_day_* keys above are all null now — the live quota data lives in a structured limits array, which ccusage reads. Each entry is self-describing: kind (session / weekly_all / weekly_scoped), percent, resets_at, and for scoped limits a scope.model.display_name. Model-scoped weekly windows (Opus, Sonnet, and a newly added Fable) are keyed by their model name, so any new one is auto-detected and displayed with no code change (e.g. scope.model.display_name: "Fable" → "Week (Fable)", statusline fab:).

API response format

GET https://api.anthropic.com/api/oauth/usage
Authorization: Bearer <oauth_access_token>
anthropic-beta: oauth-2025-04-20
{
    "five_hour": {
        "utilization": 35.0,
        "resets_at": "2026-02-06T22:00:00+00:00"
    },
    "seven_day": {
        "utilization": 14.0,
        "resets_at": "2026-02-12T20:00:00+00:00"
    },
    "seven_day_sonnet": {
        "utilization": 39.0,
        "resets_at": "2026-02-09T14:00:00+00:00"
    },
    "seven_day_opus": null,
    "seven_day_oauth_apps": null,
    "seven_day_cowork": null,
    "iguana_necktie": null,
    "extra_usage": {
        "is_enabled": true,
        "monthly_limit": 100000,
        "used_credits": 0.0,
        "utilization": null
    }
}

Authentication

The OAuth token lives at ~/.claude/.credentials.json:

{
    "claudeAiOauth": {
        "accessToken": "sk-ant-oat01-...",
        "refreshToken": "sk-ant-ort01-...",
        "expiresAt": 1770412938485,
        "subscriptionType": "team",
        "rateLimitTier": "default_claude_max_5x"
    }
}

The access token expires roughly hourly. When it's expired (or rejected with a 401/403), ccusage refreshes it itself using the refreshToken and writes the rotated credentials back to .credentials.json — the same flow Claude Code uses, so the two stay in sync and no active Claude Code session is needed.

Warning thresholds (from cli.js)

Claude Code shows inline warnings based on these thresholds:

five_hour:  90% utilization when 72% of window has passed
seven_day:  75% at 60%, 50% at 35%, 25% at 15%

Other endpoints found in cli.js

  • /api/oauth/profile — User profile
  • /api/oauth/account/settings — Account settings
  • /api/claude_code/policy_limits — Org policy limits (needs organizationUuid)
  • /api/organization/claude_code_first_token_date — Org onboarding date

Local files Claude Code uses

File Written by Contains
~/.claude/.credentials.json Claude Code OAuth tokens, plan tier
~/.claude/stats-cache.json Claude Code Local usage stats (message counts, token counts per model)
~/.claude/usage-limits.json ccusage daemon Cached API usage data (this tool)
~/.claude/statsig/ Claude Code Feature flags, experiment assignments

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ccusage-0.1.8.tar.gz (10.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ccusage-0.1.8-py3-none-any.whl (10.1 kB view details)

Uploaded Python 3

File details

Details for the file ccusage-0.1.8.tar.gz.

File metadata

  • Download URL: ccusage-0.1.8.tar.gz
  • Upload date:
  • Size: 10.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for ccusage-0.1.8.tar.gz
Algorithm Hash digest
SHA256 f9ae6a5dcac3615a6eb0fde84e01ec318288a4b63e7357d28d1588b5560d415f
MD5 421b1db0d929150bfbfd6913c7ca4b01
BLAKE2b-256 bffb6272ea7b87c495e80fbc0bf7c158faaa844c2cf3c0713be25d1c8f014e76

See more details on using hashes here.

Provenance

The following attestation bundles were made for ccusage-0.1.8.tar.gz:

Publisher: publish.yml on wakamex/ccusage

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ccusage-0.1.8-py3-none-any.whl.

File metadata

  • Download URL: ccusage-0.1.8-py3-none-any.whl
  • Upload date:
  • Size: 10.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for ccusage-0.1.8-py3-none-any.whl
Algorithm Hash digest
SHA256 8b797dca79717a9131f14acf7122d1360eddff7442aac74070555c7d2c179184
MD5 686cf7f0123aa28b136a8a858d781967
BLAKE2b-256 b4cc7f2a369d829f2ed859fe78297fbe39637bb40eee2650a1b38cf8b0b07d62

See more details on using hashes here.

Provenance

The following attestation bundles were made for ccusage-0.1.8-py3-none-any.whl:

Publisher: publish.yml on wakamex/ccusage

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page