OpenRouter Analytics in the navigation is the platform's upstream usage record: what the provider accounts spend, how that squares against the platform's own ledger, and which models the provider offers in each region. Use it to reconcile a window of spend, to see which companies' traffic earns or costs money, and to catch a model that has disappeared upstream.
The header subtitle reads: "OpenRouter-side usage per company, cross-checked against the platform ledger."
This is a DataMind staff area. It is visible to staff accounts and sits outside the client console. Its rows are unmasked: they carry the real models and the platform's upstream costs and margins.
| Tab | What it answers |
|---|---|
| Live | Today's upstream spend and requests. |
| Double accounting | Upstream spend against the ledger, per company, with a per-day drill. |
| Reports | The synced key, model and day cube, by key or by model. |
| Financial | What each company's window earned or cost, in its own currency. |
| Live analytics | Fixed views over the provider's analytics: spend, latency and cache hit rate. |
| Model listing | Which models the provider offers per region, and when that changed. |
The page opens on Double accounting. The open tab is kept in the address, so a tab can be shared as a link and the browser's back button works, and changing tabs keeps the date window you chose: the tabs answer the same question at different grains.
Double accounting puts two sides of the same spend next to each other: what the provider reported, and what the platform's ledger recorded as the reconciled upstream cost.
No usage in this window - run a sync if the snapshot looks stale.To trace a single request into the provider's own record, use the All-companies request log.
The drill lists Date (UTC), Req OR, Req ledger, Tok in OR, Tok in ledger, Tok out OR, Tok out ledger, Cached tok, OR spend, Ledger cost, Cache saved, Δ spend and Notes, with No per-day usage for this window. when the drill is empty.
The Notes column collects the flags:
provisional on the current UTC day.{n} unreconciled while ledger rows still await the upstream check.{n} keys counting the upstream keys a company's day spans; a key rotation shows up here.no OR data or no ledger rows when one side of the comparison is missing for that day.A delta is only a finding once it grows: it is flagged when it clears a cent in the summary table, and on a daily row when it clears the larger of a cent and one percent of the upstream spend.
Reports reads the synced cube: key, model and UTC day. Choose the grain with By key and By model, set From (UTC) and To (UTC), and read the stats Window spend and Requests above the table. The panel's note reads: "Aggregated from the synced key × model × day cube (UTC days), sorted by spend. Click a row for its per-day breakdown."
Unattributed badge; its spend cannot be billed to a company.No usage in this window - run a sync if the snapshot looks stale. and, in the drill, No per-day usage for this window.Financial shows what each company's window earned or cost, in that company's own currency.
PAYG base + PAYG margin + premium overage + standard overage + subscription - spend - OpenRouter fee - gifted credit. Pay-as-you-go is a cost pass-through, so its upstream spend is subtracted in full.OpenRouter fee applied shows the percent in use. The fee percent itself is set under Platform settings: integrations.- for Net income, with the note "Nobody was billed for this spend, so there is no net to report - attribute the key and it moves onto a company row."No company earned or cost anything in this window. and, in the drill, No money and no traffic on any day of this window.Live shows today's account-level numbers from the provider's analytics API: Spend today (upstream cost) and Requests today, under a Today (UTC) heading. The reading is cached on the server for about five minutes, so refreshing more often than that returns the same numbers; Refresh asks for it again.
Live analytics holds four fixed views over a 7, 14 or 31 day window: Spend by model, Spend by company, Latency by model and Cache hit rate. Its note reads: "Live from OpenRouter's analytics API (5-minute cache). Spend here is DataMind's upstream cost, not client billing." Empty: No upstream data for this window.
When the provider's analytics API cannot be reached, the live readings fail with Upstream analytics is unavailable; the synced tabs keep working from the stored snapshot.
The tab tracks what the provider makes available, region by region, not what the platform sells: the curated list lives on Model catalog. Its description reads: "OpenRouter availability per region - scanned hourly; a scan diffs the live listing against the stored state."
{n} models. Status reads Active or Retired; a retirement is recorded with its date, and a returning model becomes Active again.added or retired.Listing scan finished toast with one line per region, such as {region}: bootstrap (N models), {region}: +N added, M retired (+K unlisted) or {region}: aborted. A failed scan reads Scan failed, and the toast turns to a warning variant when any region aborted.No listing rows for these filters - run a scan if the state looks stale. and No listing events for these filters.What a scan does, and does not do:
:free, are ignored on both sides of the scan, so they never reach the state table or the history.bootstrap, and raises no events.Sync now backfills the snapshot that the Double accounting, Reports and Financial tabs read. It re-pulls a trailing window from the provider's analytics API: 7 days by default, up to 30. The sync also runs on its own schedule, every six hours.
OpenRouter usage synced with {rows} row(s) for {fromDate}. . {toDate}, and appends - ⚠ {n} unattributed key(s) when the window contains keys that match no platform key. The warning variant is used whenever unattributed keys are found; a failed sync reads Sync failed.The provider's analytics are cached server-side for about five minutes, so refreshing again within that window returns the same numbers. The other tabs read the synced snapshot, which Sync now and the six-hourly schedule keep current.
It marks the current UTC day. The provider's numbers settle late: every sync re-pulls the last few days and updates them, so a day's row keeps converging until the window slides past it. Treat the latest day as not final.
It counts ledger rows whose upstream check is still outstanding. They close their part of the delta after the next reconciliation sweep.
The provider's reported spend for the window versus the ledger's reconciled upstream cost. It is treated as a finding only once it clears a cent in the summary table; on a daily row, once it clears the larger of a cent and one percent of the upstream spend.
Every row is in its own company's currency, so adding the money across rows would be a wrong number, not a rounded one. The All bar totals traffic and USD spend only.
Nobody was billed for that spend: its upstream key matches no platform key, so there is no payer and no currency to report a net in. Attribute the key and the spend moves onto a company row.
Events fire only for models the platform offers to clients. When a model that is not offered disappears, its state flips to Retired but no event is raised; the scan's run report shows it as an unlisted retirement.
That region is marked aborted and nothing is retired there. A failed or empty read is never treated as a mass retirement, and the other regions still complete their part of the scan.
Up to 30 days, which is the retention of the provider's analytics API; the default window is 7 days.
No. It re-buckets the day columns and moves the pay-as-you-go figures and the range bounds; the monthly totals stay anchored to the billing wall clock the invoices closed on.
No. One shared filter set backs every tab, and the window you chose is kept in the address, so a shared or reloaded link keeps it too.