Dashboard →

Platform

AI Bill and billing imports

Bring in what your AI providers actually bill, then see one total for a date range: each provider counted once, from its invoice, its account report or Token Meter's metered estimate, with metered spend reconciled against the invoice.

Where it lives and who can use it

The AI Bill is Analytics › Bill, in team workspaces, for owners and admins. Billing connections and CSV uploads are in Settings › Providers, and imported provider data is in Data health › Provider usage; both are for owners and admins, in team and Freelancer workspaces. The Freelancer plan allows 5 provider connections; other plans have no cap. Old /ai-bills links open Analytics › Bill.

Where billing data comes from

Provider-reported billing is stored separately from usage metered by the SDK, the router or OpenTelemetry, and is never merged with it. The AI Bill picks one source per provider, as described in How the total is worked out.

SourceProviders
Provider invoice (settled billing)OpenAI (Costs and Usage API, Admin API key), Anthropic (cost report, Admin API key), Google (Cloud Billing BigQuery export), Bedrock (AWS Cost Explorer through a cross-account role), Azure OpenAI (Azure Cost Management through a service principal).
Account reportOpenRouter, xAI, Vercel AI Gateway and Fireworks report spend in US dollars, which counts toward the total. Mistral and DeepInfra send raw reports with no US dollar amount, which are kept but never added to a total.
Manual bill import (CSV)Any provider, including Together AI, LiteLLM gateway and Other, which have no automatic connection.
Metered estimateEvery provider you send usage for: observed token usage priced at the configured model rates, including your private rates.

Fireworks costs are rated costs from its usage reports, not a settled invoice. They count toward the total like other account reports.

Connect a provider account

  1. Open Settings › Providers and choose the Connect account tab (or Connect an account while nothing is connected).
  2. Pick the Provider. The form shows that provider's reporting tier and what it cannot report.
  3. Enter a Connection name, the provider's account identifier and the credential (see the table below). Connect each provider account once.
  4. Choose Connect and sync. Token Meter checks the credential with the provider before saving, stores it encrypted, and queues the first import.
ProviderWhat you enter
OpenAIAn Admin API key (organization admin key). OpenAI organization ID (optional) is only a label. ChatGPT workspace ID (optional) also reads Codex activity for AI Impact from the ChatGPT Enterprise usage API; the key then needs the enterprise.analytics.usage.read permission. Without it, billing sync is unaffected.
AnthropicAnthropic organization ID and an Admin API key.
GoogleCloud Billing account ID, a Service-account JSON key with access to query your billing export, the BigQuery export project and BigQuery export dataset, and the AI service names from your billing export (comma-separated); only those services are imported. For Vertex AI token usage, also grant the service account Monitoring Viewer on the projects that call Vertex.
BedrockAWS account ID, a Cross-account role ARN in that account and an optional External ID. Token Meter's worker must be allowed to assume the role and read Bedrock costs; this is checked on the first sync. For token usage, also allow cloudwatch:ListMetrics and cloudwatch:GetMetricData.
Azure OpenAIAzure subscription ID, Tenant ID, Client ID, Client secret and the Azure OpenAI resource IDs (comma-separated, from that subscription). The service principal needs Cost Management access. For token usage per deployment, also give it Monitoring Reader and Reader on those resources.
OpenRouterOpenRouter account / organization ID and a Management key.
xAIxAI team ID and a Management key.
Vercel AI GatewayVercel team slug and an AI Gateway API key created under AI Gateway › API Keys in that team. Needs a Vercel Pro or Enterprise team.
FireworksFireworks account ID and an account reporting API key.
MistralMistral organization ID and an Admin API key. Optional Mistral workspace ID and Mistral API zone (Global, US or EU) filters.
DeepInfraDeepInfra account ID and an account reporting auth token.

The cloud usage permissions above are optional. Without them the billing sync still works and the connection says token usage is unavailable.

What gets imported

  • History: up to 90 days on the first import. OpenRouter serves 30 completed days. Monthly-only reports (Mistral, DeepInfra) include only complete billing periods inside that window.
  • Days are UTC. The current day is not requested, and provider settlement delays can hold back a few more recent days.
  • Sync schedule: each connection syncs again about every hour, or once a day for Google, Bedrock, Azure OpenAI, Mistral and DeepInfra. Account reports re-read the last few days on each sync, so provider corrections replace earlier figures.

Vercel AI Gateway

  • The key reads spend for the whole Vercel team.
  • Vercel bills report queries to your team ($5 per 1,000). Each sync makes one query plus one per day with traffic; the first import makes at most 91.
  • Requests that use your own provider keys show as $0, because that spend is billed on your provider account.
  • Extra breakdowns (optional): Tag, User, Own keys vs Vercel credits and API key. Each adds a report query per day with traffic. Breakdown rows overlap (one request counts once per tag), so they are shown beside the Gateway's models and never added to a total.

Manage connections

The Connections tab of Settings › Providers shows one card per connection, with its status and the history imported so far.

StatusMeaning
Awaiting first syncSaved; the first import has not finished yet.
Synced 5m agoThe last sync succeeded. Hover for the exact time.
Needs attentionThe last sync failed. The card shows the error; Explain this error queues a plain-language explanation with steps (the error is sent with keys, ARNs and account numbers removed).
Disconnected · history keptThe credential was erased; imported data stays.
  • View history opens that connection in Data health › Provider usage.
  • Sync now queues a sync. If one is already queued or running, nothing new is queued.
  • Edit credentials (in the ⋯ menu) rotates the key. The provider cannot be changed; enter the credential again and choose Save credentials and sync. Rotating never counts against a plan's connection cap.
  • Backfill history re-imports the provider's full available history. Rows already imported are updated in place, not duplicated. It uses provider API quota.
  • Disconnect asks you to type the connection name. The stored credential is erased and imported history is kept. Reconnect opens the edit form, where you enter the credential again.
  • Backfills and disconnects are recorded in the workspace's audit log.

Manual bill import (CSV)

Use it for a provider without an automatic connection, or to load an invoice you already have. It is on Settings › Providers, below the connections.

ColumnRule
billing_dayRequired. A YYYY-MM-DD date.
skuRequired. The provider's line item name.
amount_usdRequired. The amount in US dollars.
model_idOptional. Lines without a model show as unmapped spend.
token_classOptional. input, output, cache_read, cache_write, reasoning or unit.
quantityOptional. A number.
source_currency, source_amountOptional. The original currency (3-letter ISO 4217 code) and amount, kept for reference.
project_or_keyOptional. The project or key the line belongs to.
invoice.csv
billing_day,sku,amount_usd,model_id,token_class,quantity
2026-10-01,Input tokens,12.40,llama-3.3-70b,input,15500000
2026-10-01,Output tokens,8.10,llama-3.3-70b,output,2700000
  1. Choose the Provider and the file (at most 5,000 rows and 2 MB), then Upload & preview.
  2. The preview shows total, valid and invalid rows, the total amount of the valid rows, each invalid row with its reason, and a sample of the rows to import. Nothing is in your AI Bill yet.
  3. Choose Confirm import to write the valid rows, or Discard. Invalid rows are skipped; fix them in the file and upload again.
  • Recent uploads are listed with their state: Awaiting confirm, Processing, Imported or Failed.
  • Uploading the exact same file again opens the earlier upload instead of creating a new one.
  • A row identical to one already imported (same provider, day, SKU, model, token class, project or key and amount) is updated, not added twice.
  • Imported rows count as that provider's invoice in the AI Bill. They are not reconciled against metered spend.

How the total is worked out

Total AI spend, this range at the top of Analytics › Bill covers the chosen range (This month, Previous month, 30d or 90d, in UTC days). Each line is shown separately:

LineWhat it adds
Provider invoicesFor each provider with invoice lines in the range: the sum of those lines.
Provider account reportsFor each provider with no invoice lines but a US dollar account report: the report's spend, plus metered spend on the days the report does not reach yet (shown as of which metered, on days the reports do not cover yet).
Metered, no invoice or reportFor every other provider: the metered estimate.
Coding tools, pay-as-you-goPay-as-you-go dollars of coding tools (vendor-reported or token-priced), unless the provider that bills them has its invoice imported. See below.
SaaS seats, run-rate prorated to N daysThe current monthly seat run-rate from Licenses × days in the range × 12 ÷ 365. A run-rate, not billed seats.
Commitment overage, separately billedOverage recorded on Contracts that is billed separately from the provider invoice.
Credits & adjustmentsNet credits and adjustments dated in the range, subtracted.

So each provider counts once: its invoice, else its account report, else metered. A provider is never counted from two sources for the same day.

  • An invoice covers the whole range. When a provider has any invoice line in the range, its invoice total is used and metered spend is not added, even for recent days the invoice has not reached yet.
  • Account reports count whole periods. Only report periods that lie entirely inside the range are added; a period is never prorated.
  • Coding tools. Claude Code and Claude chat on API keys are billed by Anthropic, Gemini CLI by Google, and Codex on an OpenAI API key by OpenAI. When that provider's invoice is imported for the range, the tool's spend is already inside it, so it is left out and shown as Coding-tool spend already inside a provider invoice (disclosure). Codex from the ChatGPT Enterprise feed, and tools billed by no imported provider, are always added.

What the total leaves out

The page lists these under the total:

  • Cursor usage-based spend, which is not collected yet.
  • Expense imports. They are used to find unmanaged AI tools, and they repeat bills already counted here.
  • The API-equivalent value of subscription use, which is not money spent.
  • Account reports with no US dollar amount (Mistral, DeepInfra, or a report in another currency). The provider is named in the note.

Possible overlap

Claude Code and Codex calls sent through the Token Meter router are metered too, so they can appear in both metered and coding-tool spend.

Google coverage is partial. With a Google connection, per-model usage comes from Vertex AI Cloud Monitoring only. Gemini Developer API (AI Studio) traffic is not in metered estimates or reconciliation unless you send it through the SDK or an observed gateway; the Cloud Billing export may still include its spend.

The provider table

Below the total, three tiles show Metered spend, Provider invoice lines (with the number of imported lines) and Drift. The table has one row per provider; the provider name opens its requests. It shows every source side by side and never adds them up.

ColumnMeaning
Metered spendToken usage priced at model rates.
Provider invoiceSum of imported invoice lines, or not imported.
Account reportAccount-report spend for whole periods in the range (hover for the days covered), no USD amount, or -.
DriftInvoice minus metered on reconciled days. See Reconciliation.
ReconciliationMatched, Drift detected, Awaiting invoice or Not comparable.
Requests / UnpricedMetered requests, and how many had no price.
Invoice qty / Lines / Projects/keysQuantity, line count and distinct projects or keys on the invoice lines.
UnmappedInvoice dollars not tied to a model.
Invoice throughThe last day with an invoice line.

Unmapped spend is expected for some line items: Google cache storage, audio, image, video, tuned models and SKUs shared by two models; Bedrock models other than Claude; Azure fine-tuning, realtime, audio, image and preview meters.

Reconciliation

Every day at 07:00 UTC, Token Meter compares metered spend with invoice lines from connected importers, per provider and day. Drift is the invoice minus metered spend. A day is within tolerance when the drift is at most 2% of the invoice; a day with no invoiced amount matches only if metered spend is also zero.

StatusMeaning
MatchedEvery reconciled day in the range is within 2%.
Drift detectedInvoice evidence exists, but at least one day differs by more than 2%.
Awaiting invoiceNo settled invoice has been reconciled for this provider in the range.
Not comparableThere is no invoice, only a US dollar account report. Raw or rated reports are not suitable for invoice reconciliation.
  • The Drift column reads no invoice import without invoice lines, not reconciled when lines exist but no day has been compared (CSV uploads are never reconciled), - under 50 cents, and is amber when outside tolerance.
  • To make metered spend match a negotiated contract, add a private rate under Settings › Providers. It outranks the public list price for this workspace; a start date up to 365 days back reprices usage from that day.
  • Azure OpenAI subscriptions billed in a currency other than US dollars are not reconciled.

Contracts and credits

The Contracts tab of Analytics › Bill tracks commitments, credits and settlement state separately from metered usage and invoices. Nothing there rewrites an imported invoice line.

  • Add a contract tracks a minimum-spend commitment against your imported invoice totals for the contract's window. Record a period's consumption (blank amount imports the invoice lines) and any separately billed overage. Overage enters the total only when Overage already appears in provider invoice is unticked.
  • Add a credit or adjustment: a Credit reduces spend; an Adjustment goes either direction. It applies on the date you give and is subtracted once from the AI Bill total.
  • Set settlement state records accounts-payable status (invoiced, paid, disputed) for one provider and month.

Data health › Provider usage

Everything the connections imported, up to 90 days, shown separately from metered estimates and from invoice reconciliation. Missing measurements read Unavailable; nothing is inferred.

TabWhat it shows
Provider detailWhat each provider can report (request usage, model usage, account cost, invoice reconciliation, workspace, API key, member), and your connected accounts.
Attribution coveragePer model: the provider's total, what per-call metering saw, and how much carries a team or a person.
Imported reportsEvery account report row with its period, tokens, requests, spending, currency and the provider's own fields. Spending totals per provider are at the top.
By provider, account, team, team member, modelNormalized provider usage. Per-key and per-member splits come from the OpenAI and Anthropic usage connectors.
Unmapped identitiesProvider users, API keys and projects not yet tied to anyone. Map each to a member or a team.

Evidence labels: SDK-metered is captured from an instrumented request, Provider-reported comes from the provider's usage or cost API and may be rated or provisional, and Invoice-confirmed matches a settled invoice or verified invoice import.

For the per-call metering behind the metered estimate, see the Quickstart and Providers.

Troubleshooting

Message or symptomWhat to check
Your plan allows 5 provider connections and you are using 5Disconnect one or upgrade the plan. Editing an existing connection always works.
This provider account already has a connectionUse Edit credentials on the existing card instead of connecting it again.
Edit the existing connection to set its provider account ID before adding another accountAn older connection has no account ID. Add it there first.
Vercel only serves AI Gateway spend reports to Pro and Enterprise teamsThe key belongs to a Hobby or Pro trial team.
The role must belong to the specified AWS accountThe account number inside the role ARN must match the AWS account ID.
Specify Azure OpenAI resource IDs from this subscriptionEach resource ID must start with /subscriptions/<subscription id>/resourceGroups/ and name a Microsoft.CognitiveServices account.
Connection is unavailable, its account identity changed, or a sync is runningWait for the running sync to finish and save again. The account ID of a connection cannot be changed.
Needs attention on a cardRead the error, or choose Explain this error. Google and Azure access to the export or subscription is first tested on the first sync.
A provider's invoice is lower than expected this monthThe invoice is used for the whole range, and the newest days may not be settled yet. Check Invoice through.
no USD amount in Account reportThe report has no US dollar figure (Mistral, DeepInfra, or another currency); it is not added to the total.
Missing required column(s)The CSV header must contain billing_day, sku and amount_usd.