Free FOCUS checker

Is your billing data FOCUS?

Drop a cost and usage CSV to see what stops it conforming to FOCUS 1.4: missing columns, rule failures with the rows that break them, and how your headers map. Got an Anthropic, OpenAI or Together AI bill? Convert it to FOCUS 1.4. Everything runs in your browser, so nothing is uploaded.

Drop a CSV here or · or

Your file never leaves this browser tab. The checks run on your device and nothing is uploaded.

What your provider supports

Decides which conditional columns are required, as the spec's applicability criteria do.

Converter

Turn your AI bill into FOCUS 1.4

Tested on real Console exports

In the Claude Console, export the Cost page (platform.claude.com/cost) and, for exact token-level rows, the Usage page (platform.claude.com/usage) for the same dates. You get one FOCUS row per day, model and token type: uncached input, cache writes (5 minute and 1 hour), cache reads and output, each priced on its own.

Drop both CSVs here or

Cost export · required
—
Usage export · recommended
—

Converted in this tab. Only the public price list is downloaded; your files are never sent anywhere.

The exports don’t include your organization ID. Use the one in Console settings, or keep this placeholder.

Also on the command line

The same checker and converters as an open-source (MIT) CLI, for scripts and CI. Files stay on your machine.

npx ai-bill-to-focus convert cost.csv usage.csv -o focus.csv --check
npx ai-bill-to-focus check focus.csv

More free tools: the AI spend calculator and the agent loop cost calculator.

What FOCUS is, and why AI bills rarely conform

FOCUS, the FinOps Open Cost and Usage Specification, is the FinOps Foundation's common schema for billing data: one set of column names, types and rules, so a FinOps team can put AWS, Azure, Google Cloud and SaaS spend in the same table and query it the same way. The major clouds now export FOCUS natively. Direct AI API providers mostly don't: their usage and cost exports use their own column names, daily or monthly buckets and provider-specific token types.

The usual gaps when an AI bill is hand-converted are dates without a time and Z (FOCUS wants UTC ISO 8601, e.g. 2026-10-01T00:00:00Z), custom columns without the x_ prefix, costs written as whole numbers so CSV readers type them as integers, and the SKU and pricing columns, which need one row per token type (input, output, cache read, cache write) rather than one row per model.

Prompt-cache tokens: the easiest way to get an AI bill wrong

Providers count cached input differently. OpenAI's prompt token count already includes the cached tokens, which are a subset of it. Anthropic reports uncached input, cache reads and cache writes as three separate, non-overlapping counts. Treat them the same way and you either count cached tokens twice or miss them, and cache reads and writes are priced differently from ordinary input on both. In FOCUS each belongs on its own row, with its own SKU and unit price.

Frequently asked questions

What does the FOCUS checker check?

It runs the row-level rules of the FinOps Foundation's own FOCUS rule models (the ones the official focus-validator uses) for FOCUS 1.2, 1.3 and 1.4: which columns must be present, data types, nullability, allowed values, date, currency, unit and JSON formats, and cross-column rules such as ListCost = ListUnitPrice × PricingQuantity. Rules that need an invoice, another dataset or the provider's own records are listed as not checkable from a file.

Is my billing data uploaded anywhere?

No. The file is read and checked by JavaScript in your browser tab. Only anonymous counts (row count, column count, number of errors) are recorded for product analytics; no values from the file leave your device.

Is a clean result the same as FOCUS conformance?

No. A clean result means the file passes every rule that can be checked from the file itself. Conformance also covers rules about invoices, the provider's price list and how the data was generated. For a full report, run the official focus-validator from the FinOps Foundation.

Why do my results differ from focus-validator?

Deliberate differences. A rule with several applicability criteria applies here only when all of them are ticked, as the spec wording says ("supports X and publishes Y"); focus-validator applies it when any one is. And a few rules that focus-validator reports wrongly on valid data (open issues on its GitHub) are evaluated here as the spec text reads. One 1.2 rule, InvoiceId-C-005-C, is counted as not checkable: its rule model leaves out the condition that it applies only to charges on an invoice, so as encoded it fails every usage row.

How does the Anthropic converter price each row?

The Claude Console Cost export rounds every row to the cent, so small rows such as a day of cache reads show $0.00. With the Usage export added, each row is priced as tokens times the public Anthropic price (cache writes at 1.25x input for 5 minutes and 2x for 1 hour, cache reads at the cache-read rate), and kept only if it matches the Cost export to the cent. Rows that do not match, or that have no tokens, keep the Anthropic figure and are marked in x_PriceSource.

Is there a command-line version?

Yes: ai-bill-to-focus on npm runs the same checker and converters locally, for scripts and CI. For example, npx ai-bill-to-focus convert cost.csv usage.csv -o focus.csv --check converts a provider export and checks the result, and npx ai-bill-to-focus check focus.csv exits non-zero when a file has FOCUS errors. It is open source under the MIT license.

Which capabilities should I tick for an OpenAI or Anthropic bill?

The "AI API bill" preset: account naming, tagging, usage measurement, unit pricing and a public price list. Direct AI APIs don't have regions, availability zones, commitment discounts or negotiated pricing in the sense FOCUS means, so those columns are not required of them.