Skip to main content
The Usage page shows what your organization ran and spent: totals for a time range, a runs-per-day chart, spend by model, the quota for the current period, and a request log with one row per model call. Use it to check what a run cost, to see how close you are to a spend limit, or to find a failed run. Open it at console.opentype.dev/usage. It needs the usage_read scope, which every role holds. Every figure comes from the same usage routes your code can call, listed at the end of this page.
Usage page with run, token, spend and error-rate totals, a runs-per-day chart, and period spend and token quotas

Usage with sample figures

Pick a range

The range tabs in the header are 24h, 7d and 30d; 30d is the default. Ranges count whole UTC days up to now: The line under the title states the exact window, for example last 7d · 2026-09-18 to 2026-09-24 14:05 UTC · counted from settled accounting rows. The range applies to the totals, the chart, spend by model and the request log. It does not apply to Quota, this period, which always covers the current calendar month.

Totals

Five figures sit across the top. Amounts under a cent show four decimals, such as $0.0019, so small spend does not read as $0.00. A single decision run can cost less than 0.0001,whichshowsas‘0.0001, which shows as `0.0000`. See Models and pricing for the price per token.

Runs per day

Runs per day has one bar per UTC day in the range, scaled to the busiest day; its meta shows that peak, such as peak 214 · UTC. Hover a bar to see its date, its run count and its spend. Days with no runs are drawn flat rather than skipped. The last bar is today, labelled partial because the day is not over.

Spend by model

Spend by model groups the request log by model. It has one row today: Neon 1.1, served by OpenType. Its meta says what it is built from, such as from the last 200 attempts: it adds up the same rows as the request log, so in a busy range it covers the newest 200 calls rather than the whole range. The Spend total at the top always covers the whole range.

Quota, this period

Quota, this period shows where the organization stands against its limits for the current quota period, the calendar month in UTC. Its meta shows when the period ends, such as resets 2026-10-01. The panel reads the same figures the API checks when it admits a run, so this panel and a refusal never disagree. When a run would pass the period’s spend or token limit, POST /v1/runs refuses it with 429 organization_spend_quota_exhausted or 429 organization_token_quota_exhausted, before anything is read or charged. The limits reset at the start of the next period. See Spend limits and quotas. The same period spend appears in the sidebar as Spend this period, against the cap.

Request log

The Request log has one row per model call, newest first, from an append-only record: rows are added, never changed. It shows the newest 200 calls in the range; the count above it reads, for example, 37 of 200 attempts. A run usually makes one call; a run that was retried has one row per attempt.

Filter the log

The filter bar above the log narrows the rows already loaded:
  • Run ID: a search box (placeholder run_…) that matches any part of the run ID.
  • Status: Status: any, or a status from the rows loaded, such as failed.
  • Model: Model: any, or Neon 1.1.
Choose Apply to filter and Clear filters to reset. The range and filters stay in the page address, so you can bookmark or share a filtered view.
The log prints run IDs with hyphens, run_a4314b6c-c08f-4bd8-8140-99a613abeb44, while the Playground and POST /v1/runs print them without, run_a4314b6cc08f4bd8814099a613abeb44. Both name the same run, and GET /v1/usage/runs/{run_id} accepts both. To find a run in the log, search for run_ plus its first 8 characters, such as run_a4314b6c, which are the same in both forms.
With filters that match nothing, the log reads No attempt matches these filters: clear a filter or widen the range. With no calls in the range at all, it reads No attempt in this window.

A new organization

Until the organization has run anything in the range, the totals are replaced by No usage recorded yet: Usage is written when a run settles. Send a request from the Playground or with an API key and this page fills in. Choose Open the Playground to run one.
Usage page for a new organization with no runs recorded yet

Usage before the first run

A run shows up in the totals as soon as it is created, and its cost once it settles, which for a decision run is when its answer comes back.

When figures are missing

The page never shows a figure it could not read as zero.

Read the same figures from code

Each panel is one API route, and all of them need usage_read. A key created with the Read only set on API keys has it. Windows are UTC timestamps in exactly the form 2026-09-01T00:00:00Z, sent together or not at all. Leaving both out means the current quota period.
GET /v1/usage answers with the figures behind the totals. Money is integer micro-USD: 1,000,000 is $1.
Here one run is still in flight and holds 0.02(‘unsettledmicros:20000‘),so∗∗Spend∗∗reads‘0.02 (`unsettled_micros: 20000`), so **Spend** reads `0.0200` (settled plus held) until the run settles. Usage reporting covers every route and field.
  • Usage reporting - every usage route, its fields, and how to build your own reports.
  • Spend limits and quotas - the period limits, the per-request ceiling, and the 429 refusals.
  • Billing - the balance that each run’s cost is charged against.
  • Models and pricing - the price per token behind every Cost figure.
  • Request IDs - tie a row in the log to the request your code sent.