Show Codex reset credits directly in the macOS app

Open 💬 1 comment Opened Jun 18, 2026 by coygeek

Summary

Please add first-class visibility for Codex rate-limit reset credits in the macOS Codex app.

There appears to already be account-backed data for free Codex usage resets. A small local script can read the current user's Codex auth, call the reset-credit endpoint, and show:

  1. how many resets are available
  2. when each reset was granted
  3. when each reset expires

This would be useful directly inside the app, near existing usage/limits UI, because reset credits are valuable but currently easy to miss.

Why this matters

Users can have free reset credits available without an obvious in-app place to see them. That creates a small but meaningful discoverability gap:

  • users may not know they have resets available
  • users may not know when resets expire
  • users may not know whether a reset has already been redeemed
  • support/debugging conversations about usage limits are harder than necessary

The current usage UI already communicates remaining time and weekly usage. Reset credits fit naturally into that same surface.

Requested behavior

In the macOS Codex app, show a compact reset-credit section in the usage/account area when reset credits exist.

Suggested fields:

  • N resets available
  • for each reset: grant date and expiry date
  • optional status: available, redeeming, redeemed, expired
  • optional action: reset usage, if the account is eligible and the reset flow is supported

If no reset credits exist, the app can either hide the section or show a small "No resets available" state, depending on the existing usage UI pattern.

Workaround / proof of utility

This works today as a local read-only workaround using Codex Desktop auth:

#!/usr/bin/env python3
import json
import urllib.request
from datetime import datetime
from pathlib import Path
from zoneinfo import ZoneInfo

API_URL = "https://chatgpt.com/backend-api/wham/rate-limit-reset-credits"
AUTH_PATH = Path.home() / ".codex" / "auth.json"
TIMEZONE = "America/Vancouver"


def fmt(timestamp):
    if not timestamp:
        return "not set"
    parsed = datetime.fromisoformat(timestamp.replace("Z", "+00:00"))
    return parsed.astimezone(ZoneInfo(TIMEZONE)).strftime("%Y-%m-%d %I:%M:%S %p %Z")


auth = json.loads(AUTH_PATH.read_text())
tokens = auth["tokens"]

headers = {
    "Authorization": f"Bearer {tokens['access_token']}",
    "OpenAI-Beta": "codex-1",
    "originator": "Codex Desktop",
}

account_id = tokens.get("account_id")
if account_id:
    headers["ChatGPT-Account-ID"] = account_id

request = urllib.request.Request(API_URL, headers=headers)
payload = json.loads(urllib.request.urlopen(request, timeout=30).read().decode())
credits = payload.get("credits") or []

print(f"1. resets available: {payload.get('available_count', 0)}")
print("2. granted: " + ("; ".join(fmt(c.get("granted_at")) for c in credits) or "none"))
print("3. expires: " + ("; ".join(fmt(c.get("expires_at")) for c in credits) or "none"))

Example output:

1. resets available: 1
2. granted: 2026-06-17 05:38:38 PM PDT
3. expires: 2026-07-17 05:38:38 PM PDT

The workaround intentionally prints only the useful reset-credit summary. It does not print auth tokens, account IDs, credit IDs, or the full response payload.

Possible UI placement

The natural location is the macOS app's account or usage menu, close to existing usage remaining information.

One possible presentation:

Usage remaining
5h                         77%
Weekly                     94%

Reset credits
1 reset available
Granted Jun 17, 2026
Expires Jul 17, 2026

If multiple resets are available, list each expiry date or show a compact expandable row.

Acceptance criteria

  • macOS app shows the number of available Codex reset credits when present.
  • macOS app shows grant and expiry dates for each reset credit.
  • macOS app does not expose sensitive auth/account identifiers in the UI, logs, diagnostics, screenshots, or copied text.
  • UI handles zero, one, and multiple reset credits.
  • UI handles redeemed, redeeming, expired, and available states if those statuses are returned.
  • Date/time rendering uses the user's local timezone.
  • If a redeem/reset action is added, it has a confirmation step and clearly reports success/failure.

Notes

The workaround uses an existing backend endpoint that appears to be used by Codex Desktop-authenticated sessions:

GET https://chatgpt.com/backend-api/wham/rate-limit-reset-credits

Headers used by the workaround:

Authorization: Bearer <local Codex token>
ChatGPT-Account-ID: <local account id, when present>
OpenAI-Beta: codex-1
originator: Codex Desktop

The product request is not for users to rely on this private endpoint directly. The request is to expose the same useful information through the supported macOS app UI.

View original on GitHub ↗

This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗