Repository navigation
[Feature]: display provider-reported subscription / plan renewal dates in Providers #1060
Description
Area
Web Dashboard → Providers / account metadata
Problem
OpenCodex currently exposes operational account information such as quota/rate-limit state and reset timing, but users may also need to know when a paid subscription, token plan, or account entitlement actually expires or renews.
These are different concepts.
In particular, this issue must not treat OAuth/access-token expiration as subscription expiration.
OAuth credentials may expire and refresh while the user's underlying subscription remains active. Displaying that timestamp as "subscription expires" or "plan renews" would be misleading.
Goal
Where a provider exposes authoritative subscription or entitlement metadata, surface that information in the Providers dashboard.
Examples of useful provider-reported fields include:
Plan renews: Aug 25, 2026
Subscription expires: Sep 1, 2026
Billing period ends: Aug 31, 2026
Entitlement valid until: Aug 20, 2026
The exact terminology should follow what the provider's source actually represents.
Data-source requirement
A displayed subscription/plan date must come from a source that actually represents the provider's subscription, entitlement, billing period, or plan validity.
Acceptable sources may include:
- an authenticated provider account/subscription API;
- provider quota metadata that explicitly includes plan renewal or entitlement expiry;
- account metadata returned by an official provider endpoint;
- an equivalent provider-native source with documented semantics.
Do not infer a plan date from:
- OAuth access-token expiry;
- OAuth refresh-token expiry;
- API-key expiration;
- session expiration;
- quota reset time;
- rate-limit reset time;
- arbitrary credential-file timestamps.
If a provider does not expose trustworthy plan metadata, OpenCodex should simply omit this field for that provider.
Provider capability
Support should be capability-driven rather than assuming that every provider exposes the same metadata.
A provider/account may expose zero or more concepts such as:
quotaResetAt
billingPeriodEndsAt
planRenewsAt
subscriptionExpiresAt
entitlementExpiresAt
The implementation does not need to manufacture a single universal timestamp when the upstream semantics differ.
Where possible, normalize provider-native metadata into a small typed OpenCodex account/subscription metadata contract while preserving the meaning of the source field.
Dashboard behavior
When authoritative metadata exists, show it alongside the corresponding provider/account in the Providers dashboard.
Examples:
Plan renews Aug 25, 2026
Subscription expires Sep 1, 2026
Billing period ends in 12 days
Requirements:
- display the correct semantic label;
- format dates using the active locale;
- handle unavailable/unknown metadata without warnings or fake placeholders;
- clearly distinguish plan/subscription timing from quota-reset timing;
- do not expose credential secrets or raw provider payloads.
Multi-account providers
For providers with multiple accounts, the metadata belongs to the individual account unless the provider explicitly defines it at a shared subscription level.
Do not copy one account's subscription date onto unrelated accounts merely because they use the same provider.
Previous implementation attempt
PR #1081 attempted part of this issue but was closed unmerged.
It exposed an existing OAuth/Codex credential expiresAt value and rendered it as account expiration.
That is not sufficient for this feature.
The maintainer review identified two separate problems:
- the changed locale catalogs did not compile;
- more importantly, the displayed value represented renewable OAuth token expiry rather than actual subscription/plan expiry.
Any future implementation should reuse only infrastructure that is semantically appropriate. Credential expiration and subscription expiration must remain distinct fields.
Suggested implementation order
For each supported provider:
- identify an authoritative provider-native source for subscription/plan metadata;
- document what each upstream timestamp means;
- normalize that metadata into a safe management DTO;
- add focused parsing/contract tests;
- expose it in the Providers UI;
- add localized presentation and GUI regression coverage.
Provider support can be delivered incrementally. One trustworthy provider is better than pretending all providers expose a common subscription date.
Out of scope
This issue does not require:
- calculating billing dates heuristically;
- scraping provider websites;
- treating rate-limit resets as subscription renewals;
- treating OAuth token expiry as plan expiry;
- implementing provider billing or payments;
- displaying sensitive credential metadata.
Acceptance criteria
- At least one provider has an authoritative subscription/plan metadata source.
- The source semantics are documented and tested.
- OAuth/access-token expiry remains distinct from subscription/plan expiry.
- Quota/rate-limit reset timestamps remain distinct from subscription/plan timing.
- Provider/account management DTOs expose only safe normalized metadata.
- The Providers dashboard displays the correct semantic label and localized date.
- Missing metadata is handled cleanly.
- Multi-account providers associate metadata with the correct account.
- No subscription date is fabricated when a provider does not expose one.
- Additional providers can add support without changing the basic UI/data contract.
- Accepted implementation is merged into
dev.
Related work
- feat(providers): display account subscription / plan expiration date in dashboard (#1060) #1081 — closed, unmerged attempt that exposed credential expiry; useful as prior-art only, not as a correct data source for this feature.
Activity
github-actions commentedon Aug 5, 2026
Automated translation bookkeeping — detected language: English.
lidge-jun commentedon Aug 6, 2026
Keeping this open — the idea is wanted. The draft PR attached to this campaign was closed with specific technical feedback (see the PR thread); the ideas stay tracked here. What gets a fast review: small, rebased, independently testable slices that wire the runtime/data path first and the UI second, one concern per PR.
[-][Feature]: Display account subscription / plan expiration date in Providers dashboard (#providers)[/-][+][Feature]: display provider-reported subscription / plan renewal dates in Providers[/+]lidge-jun commentedon Aug 19, 2026
리뷰 · 우선순위 42 / 80
현재
dev의 Providers 표면은 운영 쿼터/레이트 리밋과 리셋 시각을 보여 줍니다.src/providers/quota.ts의 정규화 모델은fiveHourPercent,weeklyPercent, 리셋 타임스탬프 같은 창입니다.planRenewsAt,subscriptionExpiresAt,billingPeriodEndsAt,entitlementExpiresAt는 소스에서 검색되지 않습니다. 구독/플랜 갱신일을 보여주는 계약은 아직 없습니다.이슈가 원하는 것은 프로바이더가 권위 있는 구독· entitlements·청구 기간을 줄 때만 그 날짜를 표시하는 것입니다. OAuth 액세스/리프레시 만료, API 키 만료, 세션 만료, 쿼터 리셋, 레이트 리밋 리셋을 “구독 만료”로 쓰면 안 됩니다. 자격 증명은 돌고 구독은 살아 있는 경우가 흔합니다.
네이티브 신뢰성보다 위생이 점수입니다. 잘못된 날짜는 사용자에게 결제 사실을 속입니다. 프로바이더마다 의미가 다르므로 하나의 만능 타임스탬프를 만들면 안 됩니다. 업스트림이 없으면 필드를 생략하는 것이 맞습니다. 초안 PR이 닫힌 이유도 데이터 경로 없이 UI를 그린 점과 같습니다.
Windows/서비스 이슈가 아니고, 프로바이더 호환은 능력 탐지형이어야 합니다. ChatGPT, Claude, Antigravity, Z.AI가 같은 필드를 준다고 가정하면 안 됩니다. 계정 메타데이터 계약에 소스 필드 의미를 보존해야 합니다.
해결방안은 프로바이더별로 구독/청구 API가 있는지부터 확인하고, 있는 곳만 typed 메타데이터를 채운 뒤 Providers UI에 원문 의미를 붙여 그리는 것입니다. 쿼터 리셋 시각을 재사용하지 않습니다. 패치는 추측하지 않으며, 현재 트리에 구독 갱신 필드는 없습니다.
이 댓글은 grok-bot이 작성했습니다
lidge-jun commentedon Aug 19, 2026
리뷰 · 우선순위 42 / 80 · 유지
Providers에 구독/플랜 갱신일을 보여 달라는 요청. OAuth 토큰 만료, 쿼타 리셋, API 키 만료를 구독일로 쓰면 안 됨. #1081이 credential
expiresAt를 계정 만료로 그려서 머지 안 됨.유지함. 프로바이더가 진짜 플랜/빌링/엔타이틀먼트 날짜를 줄 때만 표시. 없으면 필드 자체를 숨김. 계정마다 따로. 추측해서 만들지 말 것.
해결방안: 프로바이더별 공식 소스 → typed metadata → Providers UI. 토큰 expiry와 구독 expiry는 필드 분리.
이 댓글은 grok-bot이 작성했습니다
devlog: quota-window and backlog roadmap (260826) (#2644)
lidge-jun commentedon Aug 26, 2026
Landed via #2660 at 7181ebd
devlog: quota-window and backlog roadmap (260826) (lidge-jun#2644)
devlog: quota-window and backlog roadmap (260826) (lidge-jun#2644)