Open Agent Spend Attribution (OASA) Specification
Version 0.2.0 · Published 2026-09-14 · Revised 2026-10-27
Read the specification at oasaspec.org
The specification is published at oasaspec.org. That site is the authoritative copy: the current specification, the JSON schemas, the best-practices guide, the FOCUS mapping, and earlier versions. The current version is 0.2.0. The prior pin is 0.1.3.
Current 0.2.0 · Prior pin 0.1.3 · github.com/onaro-io/agent-spend-attribution
What OASA is
OASA is an open record format for agent spend attribution. It names the agent, the task, and the cost object, and it joins runtime telemetry, normalized billing, and payment settlement into one auditable ledger — a system of record for agent spend.
It is written to sit with OpenTelemetry GenAI conventions and the FOCUS billing specification. The record format is licensed CC BY 4.0.
OASA is the record format behind FinOps for agentic AI.
Why Onaro published it
OpenTelemetry already describes what an agent did. FOCUS already describes what a provider charged. The record that names who the spend belongs to was missing. Onaro published OASA so that record is defined in the open, under CC BY 4.0, and anyone can implement it.
The case for the record is The Missing Ledger.
What version 0.1.3 adds
Version 0.1.3 records where four values came from: the agent, the owner, the cost center, and the project. When a producer sets one of them, it can say how that value was chosen, which system minted the native identity, and what that identity was. schema_version stays "0.1". Records that omit provenance stay valid.
A producer tries sources in this order: declared, manual, mapped, inherited, then rule. If none of the four values is set, the record can give one reason: no_identity, identity_not_mapped, tag_missing, seat_without_owner, not_on_bill, or mapping_conflict. The order and the reasons are in Resolution order and Unattributed reasons.
A mapping record binds one native identifier, such as a project or an API key, to those fields for a span of time. mapped is recorded only when a mapping record supplied the value. On a bill, the tag keys oasa_cost_center, oasa_agent, oasa_owner, and oasa_project are a declared value. See Mapping records and Tagging convention.
On an OpenTelemetry span, agent_id comes from oasa.agent.id. gen_ai.agent.id, or else gen_ai.main_agent.id, is copied to external_identity_ref with identity_scheme set to other. oasa.cost_center, oasa.agent.owner, and oasa.project.id fill the matching fields, each declared. A record that followed the 0.1.2 row and stored gen_ai.agent.id in agent_id remains valid. See OASA ↔ OpenTelemetry GenAI and Per-field provenance.
The rules, field tables, and examples are in the 0.1.3 specification. Version 0.1.3 is pinned at oasaspec.org/spec/v0.1.3/. The record schema is oasa-record.schema.json. A short guide is Attributing agent spend. The FOCUS mapping joins these records to a FOCUS export. Earlier versions remain at 0.1.2, 0.1.1, and 0.1. Source and issues: github.com/onaro-io/agent-spend-attribution.
Related: The Missing Ledger · Agent spend attribution