FOCUS 1.4 Validator

Validate a FOCUS dataset against the 1.4 specification: mandatory columns, data types, nullability, allowed values and currency codes. Every finding quotes the specification line it came from. The official validator supports 1.3 and caps uploads at 10 MB; this has no cap and runs in your browser.

Checks a billing export against FOCUS 1.4123 columns across 4 datasets, of which 47 are new in this version. Rules are derived from the specification rather than written by hand, so every finding quotes the requirement it came from. Browse the column dictionary or read what changed in 1.4.

Nothing is uploaded. This site has no backend to upload to — the file is parsed by JavaScript in this tab, which you can confirm in your network tab. There is no file-size cap either; the limit is your browser’s memory.

Frequently asked questions

Does the official FOCUS validator support 1.4?

Not yet. The FinOps Foundation's validator supports 1.3 conformance testing, and 1.4 support is scheduled for later in Q3 2026. Its hosted build also caps uploads at 10 MB and is positioned for sample data rather than production exports. That gap is why this exists, and it is a deliberately temporary one — when the Foundation ships 1.4 support, theirs is the canonical implementation and you should use it.

What is new in FOCUS 1.4?

Forty-seven columns across two new datasets. Invoice Detail carries invoice charges, payment terms and purchase order numbers so finance can reconcile against the same data FinOps uses; Billing Period carries period boundaries and status. Contract Commitment gained substantial detail on commitment models, payment structures and lifecycle status. The column dictionary on this site documents every one of them.

Is my billing data uploaded anywhere?

No. This site has no backend at all — there is no server to upload to, which you can confirm in your browser's network tab. The file is read and checked by JavaScript in the page. That is a structural property of how the site is built rather than a promise in a privacy policy, and it is why there is no file-size cap: the only limit is your browser's memory.

Why does an unknown column not count as an error?

Because FOCUS permits custom columns. A provider carrying its own identifiers alongside the standard ones is conformant, and flagging those as errors would make almost every real export look broken. Unknown columns are reported as information, and the report notes which of them do not use the conventional "x_" prefix — that prefix is what lets a consumer skip them safely.

Why does a missing Conditional column not count as an error?

Because the condition lives in the provider's circumstances rather than in the file. A Conditional column is required only when the situation it describes applies — a commitment discount column is not required of a bill with no commitments on it. Only Mandatory columns are checked for presence.

How is the conformance score calculated?

Coverage of the mandatory columns, less a capped penalty for value-level errors. A missing mandatory column weighs far more heavily than a handful of malformed values, because an export missing BillingCurrency cannot be consumed at all whereas a few bad timestamps are fixable in place. Warnings and custom columns are deliberately excluded — neither makes a file non-conformant.

Conformance is the beginning, not the end.

Finitizer ingests FOCUS from every provider you run, normalises what they still disagree about, and reports cost, commitment coverage and allocation across all of it — without you maintaining the pipeline.