Usage and events
Spend, tokens and provider attempts over time, with detailed usage events.
The Usage page shows what the app has done. The Apps list summarises the same numbers for the month.
Daily usage by provider
A stacked daily chart for the last 7, 30 or 90 days, by Cost, Requests or Tokens, one colour per provider.
Breakdown
A table over the same range, grouped by one dimension:
| Dimension | Answers |
|---|---|
| By model | Which models cost what |
| By model author | Spend on Google's, OpenAI's or Anthropic's models, on any route |
| By provider | Which provider type served the traffic |
| By gateway | Traffic through Cloudflare or Vercel AI Gateway versus direct |
| By credential source | Your own key versus a gateway's key |
| By user | Who spent what. On an iOS app, offered when its budget is measured per user |
| By install | Which install spent what: one copy of an iOS app on one device. Offered on iOS apps whose budget is measured per install, the default |
| By status | Served requests and provider errors |
| By cost source | Whether cost was computed locally, reported by the provider, or unresolved |
| By route | Provider slug and path |
| By endpoint | Each custom endpoint |
| By app version | The X-App-Version header, so you can see whether a problem is one release |
Columns are Requests, Total input, Cached input, Cache write, Output and Cost. Total input counts every prompt token, including those read from or written to the provider's prompt cache, so the two cache columns are shares of it.
Model, provider and status breakdowns reach back over the whole history. The other dimensions come from the raw event log, which is kept for a bounded period; totals are never lost.
Recent events
Every provider attempt, newest first, with When, User · key (on an iOS app, User · install, naming the install beside the user), Model, Route, Tokens, Cost, Latency and Status. The route shows the endpoint slug where one was used, the gateway it went through, and for OpenRouter the provider that actually served it.
Filter by status:
| Status | Meaning |
|---|---|
ok | Served by the provider |
provider_error | The provider refused or failed the request |
Requests stopped before contacting a provider appear as samples in Auth & Errors. They do not add usage requests, tokens or cost. Provider errors still appear here because the provider was contacted; a fallback request can have more than one provider attempt.
Where a cost comes from
Each event records how its cost was arrived at.
- computed: priced locally from the catalog or the provider's custom pricing. This is the normal case.
- reported: the provider said what the request cost, and that figure is used. xAI and OpenRouter do this.
- unresolved: the provider answered successfully but reported no usage
the gateway could read, so the request consumed no budget. Shown as
unresolved rather than
$0.00.
The usual cause of an unresolved event is a client that disconnected from a stream before the final chunk carrying the usage arrived. The generation stops when the client disconnects, but what was generated up to then is unmetered. A sustained count of unresolved events on one app or user is worth a look, and per-user rate limits bound how much can go unmetered. See Model pricing.
Through the API
GET /v1/admin/apps/{app}/usage?month=YYYY-MMfor totals.GET /v1/admin/apps/{app}/usage/timeseries?from=&to=for the daily chart.GET /v1/admin/apps/{app}/usage/breakdown?by=model&from=&to=wherebyis one ofmodel,model_author,provider,provider_slug,provider_gateway,credential_source,user,install,status,cost_source,route,endpoint,app_version.GET /v1/admin/apps/{app}/events?limit=&status=&user=&install=&model=&before_id=for the event list, paged bynext_before_id. Each event carriesinstall_id, the install's App Attest key id on an iOS app andnullon a server app.