Skip to content
Select themeSelect language

get_api_management_v1_workspaces_slug_budget

GET
/api/management/v1/workspaces/{slug}/budget
Media typeapplication/json
object
alerts
required
Array<string>
api_mode_controls
required

{ api_key, oauth, system } ⇒ bool toggles. Runtime stays serde_json::Value; the spec types it as a Record<string, bool>.

object
key
additional properties
boolean
connected_subscriptions

#1026 — the OAuth subscriptions CONNECTED to this workspace, read from agent_oauth_tokens, independent of whether a quota window was ever measured. This is the surface’s PRESENCE source: deriving presence from per_provider_windows is what forced the #626 B1 seed to write a phantom window for every provider. With presence here, the seed can be provider-true and a provider with no readable quota (quota_readability == "none") shows as an account without a gauge instead of an empty gauge that never fills.

Array<object>

#1026 — one OAuth subscription CONNECTED to this workspace, independent of whether any quota window has ever been measured for it.

Presence and measurement are two different facts. The usage surface used to derive presence from provider_quota_state rows, which is precisely why the #626 B1 connect seed had to write two phantom windows for EVERY provider (without a row a fresh connect read as “No subscription credentials connected”). With presence sourced here, the seed is free to be provider-true — and a provider whose quota is not readable at all can be shown honestly, as an account with no gauge rather than an empty gauge.

object
account_email

OAuth account e-mail (or provider handle); None when the provider exposed none.

string | null
credential_id
required

The agent_oauth_tokens row id — the same id the windows carry as credential_id, so the FE joins the two without a heuristic.

string format: uuid
plan_label

Plan/tier badge from agent_oauth_tokens.plan_label (mig 263); None for every OIDC provider (openai/google return no plan at connect).

string | null
provider
required
string
quota_readability
required

'probe' (a live provider endpoint answers) · 'harness' (only the harness reports windows, so a measurement appears after the first task) · 'none' (no producer exists — no quota is readable for this provider). From the declarative sc_svc_foundation::provider_windows table.

string
critical_threshold_percent
required
number format: double
effective_month_spend_usd
required
number format: double
fill_target

The operator’s target window saturation in [0.0, 1.0] (e.g. 0.85) driving the throttling_soon warning, from the autonomy policy. None → the surface falls back to the Balanced default (GOTCHA-FILLTARGET).

number | null format: double
hard_stop
required
boolean
inflight_reserved_usd
required
number format: double
month_spend_usd
required
number format: double
monthly_cap_usd
number | null format: double
per_provider_summary

#626 Nutzung — the same windows summed per (provider, window_type, scope) across a provider’s connected accounts (the “2 KONTEN · summiert” popover header). Derived from per_provider_windows; empty when there are no windows.

Array<object>

#626 Nutzung — one provider’s windows summed across its connected accounts, for the “2 KONTEN · summiert” popover header. One summary per (provider, window_type, scope) over the per-account [ProviderWindowStatus] list (the FE still lists the per-account rows underneath). Computed by calculations::aggregate_windows_by_provider.

object
account_count
required

How many distinct accounts (credentials) contribute to this summary.

integer format: int64
fill_pct
required

Percent of the summed window consumed, 0.0..=100.0; 0.0 when limit is None.

number format: double
limit

Sum of limit across the accounts — None when ANY account’s limit is unknown (an unknown limit is not assumed zero; the summed gauge would mislead).

number | null format: double
provider
required
string
scope
required

all (overall budget) or model:<id> (a per-model sub-budget) — windows are summed only within the SAME scope (an all window is never folded into a per-model one).

string
used
required

Sum of used across the accounts in this group.

number format: double
window_type
required

'rolling_5h' | 'weekly' | 'monthly'.

string
per_provider_windows

ADR 0045 Stage 2a — per-credential subscription/API saturation windows (one entry per (provider, window)), computed from the provider_quota_state snapshots by calculations::window_status. Empty on an API-key-only workspace with no quota snapshots (the $-bars above still apply).

Array<object>

ADR 0045 Stage 2a — one provider-quota window in the usage surface. Serialized by GET /api/settings/budget and GET /workspaces/{id}/usage. The COMPUTATION (from a [crate::services::provider_quota::QuotaState]) lives in calculations::window_status; this is the wire shape (+ Default so callers compile before that computation lands).

object
account_email

Human label for the credential’s account (OAuth account email), resolved in load_budget_status. None when unresolved (e.g. an Anthropic OAuth token whose scopes return no email — see the OAuth-email follow-up).

string | null
account_role

#626 Nutzung — 'primary' | 'overflow', DERIVED at read time (no column): per provider, the credential with the MOST headroom in its all-scope window is the primary (the one the quota-aware dispatcher prefers, mirroring provider_quota::multi_key::resolve_credential_with_most_headroom); the rest are overflow. Account-level — the same role is stamped on EVERY window of a credential (incl. its per-model windows). None when the provider has a single account (no overflow concept).

string | null
credential_id
required

The credential this window belongs to. Lets the FE list per-account windows distinctly when one provider has several connected accounts (#555).

string format: uuid
credential_type
required

'oauth_subscription' | 'api_key' — drives the FE capability detection (saturation gauges show only for subscription credentials).

string
fill_pct
required

Percent of the window consumed, 0.0..=100.0. 0.0 when the limit is unknown.

number format: double
limit

None = unknown limit (a new/Unsupported credential) ⇒ no gauge, no warning.

number | null format: double
measured_at
required

#1025 — WHEN this snapshot was written (provider_quota_state.updated_at, set to now() on every upsert). The DTO carried window_start / resets_at / minutes_to_refresh but no measurement time at all, so the surface could not say how OLD a reading is — a two-week-stale gauge looked exactly like a fresh one. Required (the column is NOT NULL), so the FE never has to guess.

string format: date-time
measurement
required

#1026 — the PROVENANCE CLASS of this window, folded from [Self::source] by sc_svc_foundation::provider_windows::measurement_class: 'provider' (read from the provider, its harness, or a real 429) · 'estimate' (OUR spend arithmetic — telemetry; the provider reported nothing) · 'pending' (seeded, never measured). The FE must NOT render an estimate as a provider measurement: telemetry_estimate fills used from workspace_month_spend_ledger and limit from 80 % of the configured $-cap, yet it lands in the same subscription-saturation list as a real probe.

string
minutes_to_refresh

Whole minutes until resets_at; None if unknown.

integer | null format: int64
plan_label

#626 Nutzung — the subscription plan/tier badge (“Max 20x”, “ChatGPT Pro”, …) read off the credential’s agent_oauth_tokens.plan_label (migration 263), resolved in load_budget_status. None for an API key, a legacy row, or any provider whose OAuth profile body exposed no plan at connect.

string | null
provider
required
string
reset_credits

#626 D4.3 — the count of REDEEMABLE rate-limit-reset credits the provider advertises for this credential window (Codex rateLimitResetCredits.availableCount, migration 270). None = no reset-credit surface (every non-Codex window, and a Codex window probed before the spine read it). The FE renders it as a chip; the redeem/consume action is a follow-up.

integer | null format: int32
resets_at

When the window resets; None if unknown.

string | null format: date-time
scope
required

#626 H2 — the window’s scope: all (the credential’s overall budget) or model:<id> (a per-model sub-budget, e.g. a Codex Spark or Claude Sonnet window). ALWAYS present (the DB enforces NOT NULL DEFAULT 'all' and the projection clones it verbatim), so it is a REQUIRED string in the contract — no #[serde(default)] (this DTO is serialize-only; the attribute would only drop it from the OpenAPI required set). The FE renders per-model windows distinctly and sums per-account windows under one provider.

string
source
required

'real_limit_hit' | 'status_probe' | 'telemetry' | 'default' | 'task_boundary' — snapshot provenance so the FE can distinguish a hard hit from a low-confidence estimate.

string
throttling_soon
required

True when fill_pct is within the throttling band of fill_target — the FE surfaces an amber “approaching limit” state.

boolean
used
required
number format: double
window_start
required
string format: date-time
window_type
required

'rolling_5h' | 'weekly' | 'monthly'.

string
provider_inflight_reserved_usd
required

Per-provider in-flight reservation (USD). Runtime stays serde_json::Value; the spec types it as a Record<string, number>.

object
key
additional properties
number format: double
provider_monthly_caps_usd
required

Per-provider monthly cap (USD). Runtime stays serde_json::Value; the spec types it as a Record<string, number>.

object
key
additional properties
number format: double
provider_spend_usd
required

Per-provider month spend (USD). Runtime stays serde_json::Value; the spec types it as a Record<string, number>.

object
key
additional properties
number format: double
remaining_usd
number | null format: double
status
required
string
threshold_alerts_percent
required
Array<number>
warning_threshold_percent
required
number format: double
Examplegenerated
{
"alerts": [
"example"
],
"api_mode_controls": {
"additionalProperty": true
},
"connected_subscriptions": [
{
"account_email": "example",
"credential_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"plan_label": "example",
"provider": "example",
"quota_readability": "example"
}
],
"critical_threshold_percent": 1,
"effective_month_spend_usd": 1,
"fill_target": 1,
"hard_stop": true,
"inflight_reserved_usd": 1,
"month_spend_usd": 1,
"monthly_cap_usd": 1,
"per_provider_summary": [
{
"account_count": 1,
"fill_pct": 1,
"limit": 1,
"provider": "example",
"scope": "example",
"used": 1,
"window_type": "example"
}
],
"per_provider_windows": [
{
"account_email": "example",
"account_role": "example",
"credential_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"credential_type": "example",
"fill_pct": 1,
"limit": 1,
"measured_at": "2026-04-15T12:00:00Z",
"measurement": "example",
"minutes_to_refresh": 1,
"plan_label": "example",
"provider": "example",
"reset_credits": 1,
"resets_at": "2026-04-15T12:00:00Z",
"scope": "example",
"source": "example",
"throttling_soon": true,
"used": 1,
"window_start": "2026-04-15T12:00:00Z",
"window_type": "example"
}
],
"provider_inflight_reserved_usd": {
"additionalProperty": 1
},
"provider_monthly_caps_usd": {
"additionalProperty": 1
},
"provider_spend_usd": {
"additionalProperty": 1
},
"remaining_usd": 1,
"status": "example",
"threshold_alerts_percent": [
1
],
"warning_threshold_percent": 1
}