pub struct CursorSnapshot {
pub plan: String,
pub auto_pct: i32,
pub api_pct: i32,
pub total_pct: i32,
pub unlimited: bool,
pub on_demand_enabled: bool,
pub on_demand_used_cents: Option<i64>,
pub on_demand_limit_cents: Option<i64>,
pub reset_at: Option<DateTime<Utc>>,
pub cycle_start: Option<DateTime<Utc>>,
}Expand description
Cursor — the two included-usage pools the dashboard shows, from the
undocumented cursor.com/api/usage-summary endpoint (the same one the
dashboard’s own frontend calls), authenticated with the session token the
Cursor IDE wrote to its local state.vscdb.
Since Cursor’s mid-2026 pricing, a plan’s included compute is split into two
quota pools, each shown as a percentage: Cursor Models (Auto + Composer,
autoPercentUsed) and Other Models (named / third-party, apiPercentUsed).
Overflow past either pool falls to on-demand spend. Percentages are integers
(rounded from the wire floats) to match the dashboard and every other
vendor’s integer-percent convention; they can exceed 100 when a pool is over
its included allowance.
Fields§
§plan: StringMembership label, title-cased from membershipType (e.g. “Ultra”).
auto_pct: i32“Cursor Models” pool — Auto + Composer (autoPercentUsed, rounded).
api_pct: i32“Other Models” pool — named / third-party (apiPercentUsed, rounded).
total_pct: i32Overall included usage (totalPercentUsed, rounded) — the dashboard’s
“you’ve used N% of your included total usage” headline.
unlimited: booltrue when the plan reports isUnlimited — the pools don’t cap and the
percentages are not meaningful.
on_demand_enabled: boolWhether on-demand (overage) spend is turned on (onDemand.enabled).
on_demand_used_cents: Option<i64>On-demand spend in cents (onDemand.used), when Cursor reports it.
on_demand_limit_cents: Option<i64>Configured on-demand spending limit in cents (onDemand.limit).
reset_at: Option<DateTime<Utc>>End of the current billing cycle (billingCycleEnd) — when the pools
reset.
cycle_start: Option<DateTime<Utc>>Start of the current billing cycle (billingCycleStart), when the API
sends it. With reset_at it gives the exact window length the pace
projection needs; absent, no window length is reported at all.
Implementations§
Source§impl CursorSnapshot
impl CursorSnapshot
Sourcepub fn cycle_window(&self) -> Option<Duration>
pub fn cycle_window(&self) -> Option<Duration>
Length of the current billing cycle, but only when the API stated both
ends and they are ordered. None otherwise — older responses and every
snapshot cached before billingCycleStart existed omit the start, and a
guessed month would reach a frontend as an exact window and be paced as
one. window_secs is absent instead; the reset time still shows.
Trait Implementations§
Source§impl Clone for CursorSnapshot
impl Clone for CursorSnapshot
Source§fn clone(&self) -> CursorSnapshot
fn clone(&self) -> CursorSnapshot
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for CursorSnapshot
impl Debug for CursorSnapshot
impl Eq for CursorSnapshot
Source§impl PartialEq for CursorSnapshot
impl PartialEq for CursorSnapshot
impl StructuralPartialEq for CursorSnapshot
Auto Trait Implementations§
impl Freeze for CursorSnapshot
impl RefUnwindSafe for CursorSnapshot
impl Send for CursorSnapshot
impl Sync for CursorSnapshot
impl Unpin for CursorSnapshot
impl UnsafeUnpin for CursorSnapshot
impl UnwindSafe for CursorSnapshot
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more