Requirements Model
The FOCUS Requirements Model is a machine-readable representation of FOCUS normative requirements for a given version. It defines applicability criteria, check functions, dataset entry points, and requirement dependencies used to evaluate dataset conformance.
atlon.io ships two model artifacts:
| FOCUS version | Internal model version | File |
|---|---|---|
| 1.2 | 1.2.0.1 | model-1.2.json |
| 1.3 | 1.3.0.1 | model-1.3.json |
The two models share the same overall shape, but 1.3 introduces a second dataset (ContractCommitment), a new entity type (Object for nested JSON schemas like ContractApplied and AllocatedMethodDetails), and a different rule-ID prefix scheme. Where the two diverge, this guide notes which version a snippet describes.
Model structure
The JSON file has five top-level sections. The 1.3 shape:
{
"Details": { "ModelVersion": "1.3", "FOCUSVersion": "1.3" },
"ApplicabilityCriteria": { /* 20 applicability criteria */ },
"CheckFunctions": { /* function definitions */ },
"ModelDatasets": {
"CostAndUsage": { "ModelRules": ["CAU-CostAndUsage-D-000-M"] },
"ContractCommitment": { "ModelRules": ["CCT-ContractCommitment-D-000-M"] }
},
"ModelRules": { /* 933 rule definitions */ }
}
The 1.2 shape is the same except ModelDatasets lists a single entry (CostAndUsage, root rule CostAndUsage-D-000-M), ApplicabilityCriteria has 18 entries, and ModelRules has 621 entries.
| Section | Purpose |
|---|---|
Details | Model and FOCUS version numbers |
ApplicabilityCriteria | Applicability criteria that gate conditional requirements |
CheckFunctions | Definitions of all check functions (what arguments they take) |
ModelDatasets | Entry points: one root rule per dataset |
ModelRules | All rule definitions, keyed by rule ID. 621 in 1.2, 933 in 1.3 |
Source of truth and build pipeline
The Requirements Model originates from the FOCUS_Spec repository. The upstream source files live under specification/requirements_model/:
| Source file(s) | Purpose |
|---|---|
model_details.json | Model and FOCUS version numbers |
applicability_criteria.json | Provider capability flag definitions |
check_functions.json | Check function signatures |
model_datasets.json | Dataset entry points |
model_rules/datasets/*.json | Dataset-level orchestration (D-000/001/002 composites + per-column presence rules). 1.2 has one file (costandusage.json); 1.3 has two (cost_and_usage.json, contract_commitment.json) |
model_rules/columns/*.json | Per-column rule files. 57 in 1.2; 77 unique columns in 1.3 (65 in CostAndUsage, 13 in ContractCommitment, with BillingCurrency shared) |
model_rules/attributes/*.json | Attribute rule files (cross-cutting requirements such as column handling) |
model_rules/objects/*.json | (1.3 only) Nested-object schemas, currently ContractAppliedObject and AllocatedMethodDetailsObject |
The upstream build_json.py script merges all source files into a single build/model-{version}.json artifact. That built artifact is what ships in the validator.
Requirements Model integrity
The upstream Requirements Model test suite enforces these invariants:
- Every
ModelRuleIdreferenced in a Requirement or ConditionCheckModelRulemust appear in that rule'sDependenciesarray - Every
-C-000-column composite must list its column's presence rule in Dependencies:CostAndUsage-D-*in 1.2;CAU-CostAndUsage-D-*orCCT-ContractCommitment-D-*in 1.3 - Rule IDs follow strict
{Reference}-{EntityCode}-{NNN}-{ArtifactStatus}format - The artifact status suffix (
M/C/O) is consistent with requirement level classification (Mandatory, Conditional, Optional)
These guarantees ensure dependency integrity and referential consistency across the model graph.
Rule anatomy
Every rule has this structure (1.3 example):
"CAU-BilledCost-C-001-M": {
"Function": "Type",
"Reference": "BilledCost",
"EntityType": "Column",
"Notes": "",
"ModelVersionIntroduced": "1.2",
"Status": "Active",
"ApplicabilityCriteria": [],
"Type": "Static",
"ValidationCriteria": {
"MustSatisfy": "BilledCost MUST be of type Decimal.",
"Keyword": "MUST",
"Requirement": {
"CheckFunction": "TypeDecimal",
"ColumnName": "BilledCost"
},
"Condition": {},
"Dependencies": []
}
}
In 1.2 the same rule is keyed BilledCost-C-001-M (no dataset prefix). The body is otherwise identical.
| Field | Description |
|---|---|
Function | Rule category: Presence, Type, Format, Nullability, Validation, or Composite |
Reference | The column or entity this rule applies to |
EntityType | Dataset (structural checks), Column (value checks), Attribute (cross-cutting format rules), or Object (1.3+: nested-JSON schema rules) |
Status | Active or Deprecated |
ApplicabilityCriteria | Applicability criteria required for this rule to apply |
Type | Static (automatable) or Dynamic (requires human judgment) |
ValidationCriteria.MustSatisfy | Human-readable requirement text |
ValidationCriteria.Keyword | RFC 2119 keyword: MUST, MUST NOT, RECOMMENDED, MAY, etc. |
ValidationCriteria.Requirement | The check to perform (function + arguments) |
ValidationCriteria.Condition | Row-level filter: rule only applies to rows matching this condition |
ValidationCriteria.Dependencies | Other rule IDs that must complete before this rule runs |
Rule ID convention
Every rule ID follows the pattern:
[{DatasetPrefix}-]{Reference}-{EntityCode}-{SequenceNumber}-{ArtifactStatus}
The leading DatasetPrefix segment is 1.3 only. 1.2 has a single dataset, so its rule IDs omit the prefix.
| Segment | Values | Examples |
|---|---|---|
| DatasetPrefix (1.3 only) | CAU for CostAndUsage, CCT for ContractCommitment | CAU-, CCT- |
| Reference | Column name or dataset name (CostAndUsage, ContractCommitment) | BilledCost, ContractCommitmentId |
| EntityCode | D = Dataset, C = Column, A = Attribute, O = Object (1.3+) | — |
| SequenceNumber | 3-digit, zero-padded. 000 = composite root | 000, 001, 005 |
| ArtifactStatus | M = Mandatory, C = Conditional, O = Optional | — |
Examples:
| 1.2 rule ID | 1.3 rule ID | Meaning |
|---|---|---|
CostAndUsage-D-006-M | CAU-CostAndUsage-D-006-M | Dataset-level rule #6 for BilledCost presence (MUST) |
BilledCost-C-001-M | CAU-BilledCost-C-001-M | Column-level rule #1 for BilledCost type (MUST) |
BilledCost-C-005-C | CAU-BilledCost-C-005-C | Column-level rule #5 for BilledCost conditional validation |
BilledCost-C-000-M | CAU-BilledCost-C-000-M | Composite root aggregating all BilledCost rules |
| — | CCT-ContractCommitmentId-C-001-M | (1.3 only) ContractCommitmentId type rule, in the ContractCommitment dataset |
| — | CAU-ContractAppliedObject-O-001-M | (1.3 only) Object-schema rule on the nested ContractApplied JSON |
Note: the ArtifactStatus suffix reflects the requirement level classification in the model artifact, not the RFC keyword of an individual requirement statement.
Rule hierarchy
The model is a directed acyclic graph (DAG) of AND/OR composites with leaf rules at the bottom. 1.2 has one root (CostAndUsage-D-000-M); 1.3 has one root per dataset — CAU-CostAndUsage-D-000-M and CCT-ContractCommitment-D-000-M. A given validation run walks the DAG rooted at the dataset you selected.
The four-tier shape, shown with 1.3 rule IDs:
Tier 0: CAU-CostAndUsage-D-000-M Root composite (AND) [1.3]
CCT-ContractCommitment-D-000-M Root composite (AND) [1.3, separate dataset]
CostAndUsage-D-000-M Root composite (AND) [1.2 equivalent]
|
+-- Tier 1a: …D-001-M Presence composite (AND of every D-NNN-* under it)
| +-- CAU-CostAndUsage-D-006-M ColumnPresent("BilledCost") [MUST]
| +-- CAU-CostAndUsage-D-007-C ColumnPresent("BillingAccountType") [Conditional]
| +-- CAU-CostAndUsage-D-035-M ColumnPresent("BillingCurrency") [MUST]
| +-- ... (71 presence rules under CAU in 1.3; 13 under CCT; 63 in 1.2)
|
+-- Tier 1b: …D-002-M Validation composite (AND of all C-000 composites)
+-- CAU-BilledCost-C-000-M Column composite (AND)
| +-- CAU-BilledCost-C-001-M Type check
| +-- CAU-BilledCost-C-002-M Format check
| +-- CAU-BilledCost-C-003-M Nullability check
| +-- CAU-BilledCost-C-004-M Validation check
| +-- CAU-BilledCost-C-005-C Conditional validation
| +-- CAU-BilledCost-C-006-M Dynamic (skipped)
| +-- CAU-BilledCost-C-007-M Dynamic (skipped)
|
+-- CAU-BillingCurrency-C-000-M Column composite (AND)
| +-- ...
+-- ... (one composite per column in the dataset)
Tier 0 is the dataset root (one per dataset). Tier 1a checks "are all required columns present?" Tier 1b checks "do column values pass?" Each column composite (Tier 2) groups its leaf rules (Tier 3) with an AND. The two dataset DAGs in 1.3 share leaf rules where columns overlap (BillingCurrency is present in both CAU and CCT).
Rule types
Presence
Checks whether a column exists in the dataset. These are Dataset-level rules (EntityType: "Dataset"). 1.3 example:
"CAU-CostAndUsage-D-006-M": {
"Function": "Presence",
"Reference": "BilledCost",
"EntityType": "Dataset",
"ValidationCriteria": {
"MustSatisfy": "BilledCost MUST be present in a FOCUS dataset.",
"Requirement": { "CheckFunction": "ColumnPresent", "ColumnName": "BilledCost" }
}
}
If a column is missing, all downstream rules for that column are automatically failed/skipped.
Type
Checks the column's data type. Three check functions:
| CheckFunction | Expected types |
|---|---|
TypeString | VARCHAR |
TypeDecimal | DECIMAL, DOUBLE, FLOAT |
TypeDateTime | TIMESTAMP, DATE, or ISO 8601 string patterns |
"CAU-BilledCost-C-001-M": {
"Function": "Type",
"ValidationCriteria": {
"Requirement": { "CheckFunction": "TypeDecimal", "ColumnName": "BilledCost" }
}
}
Format
Checks value patterns and formats. Six format check functions:
| CheckFunction | What it validates |
|---|---|
FormatNumeric | Decimal/scientific notation |
FormatString | Non-empty string values |
FormatDateTime | ISO 8601 UTC timestamps |
FormatCurrency | 3-letter uppercase codes (regex) |
FormatUnit | FOCUS unit format (e.g., "GB", "Hours", "Count") |
FormatKeyValue | Valid JSON key-value objects |
Additional specialized check:
CheckNationalCurrency— validates against ISO 4217 currency code list
Nullability
Checks null handling. Reuses CheckNotValue or CheckValue with Value: null:
"CAU-BilledCost-C-003-M": {
"Function": "Nullability",
"ValidationCriteria": {
"MustSatisfy": "BilledCost MUST NOT be null.",
"Keyword": "MUST NOT",
"Requirement": { "CheckFunction": "CheckNotValue", "ColumnName": "BilledCost", "Value": null }
}
}
Some nullability rules are conditional, "column MUST be null when another column has a specific value":
"CAU-CommitmentDiscountName-C-004-C": {
"Function": "Nullability",
"ValidationCriteria": {
"MustSatisfy": "CommitmentDiscountName MUST be null when CommitmentDiscountId is null.",
"Requirement": { "CheckFunction": "CheckValue", "ColumnName": "CommitmentDiscountName", "Value": null },
"Condition": { "CheckFunction": "CheckValue", "ColumnName": "CommitmentDiscountId", "Value": null }
}
}
Validation
Business logic checks on data values. Uses various check functions:
| CheckFunction | Purpose |
|---|---|
CheckValue | Column equals a specific value |
CheckNotValue | Column does not equal a specific value |
CheckSameValue | Two columns have the same value |
CheckNotSameValue | Two columns have different values |
CheckDecimalValue | Valid decimal number |
CheckGreaterOrEqualThanValue | Numeric >= threshold |
CheckDistinctCount | Distinct count across column groups |
ColumnByColumnEqualsColumnValue | col_a * col_b == col_c |
Example — conditional cross-column validation:
"CAU-BilledCost-C-005-C": {
"Function": "Validation",
"ValidationCriteria": {
"MustSatisfy": "BilledCost MUST be 0 where ProviderName != InvoiceIssuerName.",
"Requirement": { "CheckFunction": "CheckValue", "ColumnName": "BilledCost", "Value": 0 },
"Condition": { "CheckFunction": "CheckNotSameValue",
"ColumnAName": "ProviderName", "ColumnBName": "InvoiceIssuerName" },
"Dependencies": ["CAU-ProviderName-C-000-M", "CAU-InvoiceIssuerName-C-000-M"]
}
}
Composite
Logical grouping of child rules using AND or OR. Composites reference children via CheckModelRule:
"CAU-BilledCost-C-000-M": {
"Function": "Composite",
"ValidationCriteria": {
"Requirement": {
"CheckFunction": "AND",
"Items": [
{ "CheckFunction": "CheckModelRule", "ModelRuleId": "CAU-BilledCost-C-001-M" },
{ "CheckFunction": "CheckModelRule", "ModelRuleId": "CAU-BilledCost-C-002-M" },
{ "CheckFunction": "CheckModelRule", "ModelRuleId": "CAU-BilledCost-C-003-M" },
...
]
},
"Dependencies": [
"CAU-CostAndUsage-D-006-M",
"CAU-BilledCost-C-001-M", "CAU-BilledCost-C-002-M", "CAU-BilledCost-C-003-M", ...
]
}
}
- AND composites pass only if ALL children pass
- OR composites pass if ANY child passes (used for complex applicability logic)
Object (1.3+)
Some FOCUS 1.3 columns hold nested JSON whose internal structure is itself part of the spec, like ContractApplied and AllocatedMethodDetails today. These are represented as a separate Object entity (EntityType: "Object", EntityCode O in the rule ID) with their own composite tree. Object rules use JSONCheckPathType to walk a JSONPath inside the column value:
"CAU-ContractAppliedObject-O-020-M": {
"Function": "Type",
"EntityType": "Object",
"ValidationCriteria": {
"MustSatisfy": "\"ContractId\" MUST be of type String.",
"Requirement": {
"CheckFunction": "JSONCheckPathType",
"ColumnName": "ContractApplied",
"Path": "$.Elements[*].ContractId",
"ExpectedType": "String"
}
}
}
The wrapping column composite (e.g. CAU-ContractApplied-C-000-C) depends on the object composite (CAU-ContractAppliedObject-O-000-C), so a malformed nested JSON value cascades up to the column-level result.
Dependencies and execution order
How dependencies work
Dependencies are declared in three ways:
- Structural: composite rules implicitly depend on their children (via
CheckModelRulereferences inItems) - Explicit: rules list other rule IDs in their
Dependenciesarray (e.g., a conditional validation that needs another column's composite to pass first) - Presence gating: the engine's post-processing automatically cascades presence failures to all rules for that column
Execution sequence for a column
The dependency graph produces this execution order per column (1.3 rule IDs shown; 1.2 omits the CAU- prefix):
1. CAU-CostAndUsage-D-006-M Presence "Is BilledCost present?"
| (if absent, everything below cascades to fail/skip)
2. CAU-BilledCost-C-001-M Type "Is it Decimal?"
3. CAU-BilledCost-C-002-M Format "Matches NumericFormat?"
4. CAU-BilledCost-C-003-M Nullability "No nulls?"
5. CAU-BilledCost-C-004-M Validation "Valid decimal values?"
6. CAU-BilledCost-C-005-C Validation "BilledCost=0 when ProviderName != InvoiceIssuerName?"
7. CAU-BilledCost-C-006-M Dynamic --> SKIPPED
8. CAU-BilledCost-C-007-M Dynamic --> SKIPPED
| (all results aggregated)
9. CAU-BilledCost-C-000-M Composite AND of rules 2-8
The engine builds a topological sort of the full DAG and processes rules layer by layer. Rules in the same layer (no dependencies between them) could theoretically run in parallel.
Cross-column dependencies
Some rules depend on other columns being validated first. For example, CAU-BilledCost-C-005-C depends on CAU-ProviderName-C-000-M and CAU-InvoiceIssuerName-C-000-M because its condition references both columns. This means the entire ProviderName and InvoiceIssuerName validation must complete before this rule can execute.
Gating mechanisms
Three mechanisms control whether a rule applies:
1. Applicability criteria (dataset-level gate)
Provider capability flags that enable or disable entire groups of rules. If a provider doesn't support a feature, the related rules are marked non-applicable and skipped.
"CAU-CostAndUsage-D-007-C": {
"Function": "Presence",
"Reference": "BillingAccountType",
"ApplicabilityCriteria": ["MULTIPLE_BILLING_ACCOUNT_TYPES_SUPPORTED"]
}
1.2 has 18 applicability criteria; 1.3 adds two more (CONTRACT_COMMITMENTS_SUPPORTED, DATA_GENERATOR_SPLIT_COST_ALLOCATION_SUPPORTED) for a total of 20:
| Criteria | Version | Columns affected |
|---|---|---|
AVAILABILITY_ZONE_SUPPORTED | 1.2, 1.3 | AvailabilityZone |
CAPACITY_RESERVATION_SUPPORTED | 1.2, 1.3 | CapacityReservationId, CapacityReservationStatus |
COMMITMENT_DISCOUNT_SUPPORTED | 1.2, 1.3 | CommitmentDiscount* (7 columns) |
USAGE_MEASUREMENT_SUPPORTED | 1.2, 1.3 | ConsumedQuantity, ConsumedUnit |
NEGOTIATED_PRICING_SUPPORTED | 1.2, 1.3 | ContractedUnitPrice |
PUBLIC_PRICE_LIST_SUPPORTED | 1.2, 1.3 | ListUnitPrice, Sku* columns |
UNIT_PRICING_SUPPORTED | 1.2, 1.3 | Sku* columns (combined with above) |
MULTIPLE_PRICING_CATEGORIES_SUPPORTED | 1.2, 1.3 | PricingCategory |
PRICING_BILLING_CURRENCY_DIFFERENCES_SUPPORTED | 1.2, 1.3 | PricingCurrency, PricingCurrency* columns |
VIRTUAL_CURRENCY_SUPPORTED | 1.2, 1.3 | PricingCurrency* columns |
REGION_SUPPORTED | 1.2, 1.3 | RegionId, RegionName |
BILLING_BASED_ON_PROVISIONED_RESOURCES_SUPPORTED | 1.2, 1.3 | ResourceId, ResourceName, ResourceType |
RESOURCE_TYPE_ASSIGNMENT_SUPPORTED | 1.2, 1.3 | ResourceType (combined with above) |
SUB_ACCOUNT_SUPPORTED | 1.2, 1.3 | SubAccountId, SubAccountName |
MULTIPLE_SUB_ACCOUNT_TYPES_SUPPORTED | 1.2, 1.3 | SubAccountType |
MULTIPLE_BILLING_ACCOUNT_TYPES_SUPPORTED | 1.2, 1.3 | BillingAccountType |
ACCOUNT_NAMING_SUPPORTED | 1.2, 1.3 | BillingAccountName |
TAGGING_SUPPORTED | 1.2, 1.3 | Tags |
CONTRACT_COMMITMENTS_SUPPORTED | 1.3 | ContractApplied (in CAU); gates the entire ContractCommitment dataset |
DATA_GENERATOR_SPLIT_COST_ALLOCATION_SUPPORTED | 1.3 | AllocatedMethodId, AllocatedMethodDetails, AllocatedResourceId, AllocatedResourceName, AllocatedTags |
When a presence rule is non-applicable, ALL downstream rules for that column are also marked non-applicable.
2. Conditions (row-level gate)
A rule can have a Condition that limits which rows it applies to:
"Condition": {
"CheckFunction": "CheckNotSameValue",
"ColumnAName": "ProviderName",
"ColumnBName": "InvoiceIssuerName"
}
The rule is only evaluated on rows where the condition is true. Rows that don't match are excluded from violation counts.
3. Static vs Dynamic (automatable gate)
- Static rules have a
Requirementwith aCheckFunctionand can be executed automatically via SQL - Dynamic rules have an empty
Requirement: {}and represent requirements that need human judgment or external data (e.g., "BilledCost MUST be denominated in BillingCurrency" requires knowing the actual currency of each charge)
Dynamic rules are always skipped during automated validation and reported as informational.
Requirement keywords
The Keyword field uses BCP 14 terminology (RFC 2119 and RFC 8174) and drives skip behavior:
| Keyword | Rule suffix | Engine behavior |
|---|---|---|
MUST | -M | Always executed. Failure = violation. |
MUST NOT | -M | Always executed. Failure = violation. |
SHOULD / SHOULD NOT | -C | Executed if applicability criteria are met. |
RECOMMENDED | -C or -O | Varies by rule — some conditional, some optional. |
MAY / OPTIONAL | -O | Skipped entirely (not a requirement). |
Validation modes
The engine supports two validation modes via the mode query parameter:
| Mode | Rules included | Data loaded? | Use case |
|---|---|---|---|
full | All rules under the selected dataset's root composite | Yes (DuckDB) | Complete validation of structure and data values |
schema | Presence rules only | No | Near-instant column presence check, reads CSV header row or Parquet schema metadata without loading any data |
The active rule count depends on the version and dataset you pick:
| Version | Dataset | Approx. total rules | Approx. presence rules |
|---|---|---|---|
| 1.2 | CostAndUsage | 621 | 63 |
| 1.3 | CostAndUsage | ~870 | 71 |
| 1.3 | ContractCommitment | ~60 | 13 |
Schema mode reads only the CSV header row (csv.reader, one next()) or Parquet schema (pyarrow.parquet.read_schema), then compares against expected columns from the FOCUS model metadata. Zero data rows are loaded, making it near-instant on any file size.
Column reference
The two model versions differ in their column rosters. FOCUS 1.2 has a single dataset with 57 columns. FOCUS 1.3 grows CostAndUsage to 65 columns and introduces a separate ContractCommitment dataset with 13 columns (BillingCurrency is shared between the two datasets, so the unique-column total is 77).
FOCUS 1.2 — CostAndUsage (57 columns)
The model contains 63 Presence rules due to conditional variants.
Mandatory columns (always required)
| Column | Data Type | Rules |
|---|---|---|
| BilledCost | Decimal | Type, NumericFormat, not null, valid decimal, conditional (=0 for third-party charges) |
| BillingAccountId | String | Type, StringFormat, not null |
| BillingAccountName | String | Type, StringFormat, not null |
| BillingCurrency | String | Type, CurrencyFormat (ISO 4217), not null |
| BillingPeriodEnd | DateTime | Type, DateTimeFormat, not null |
| BillingPeriodStart | DateTime | Type, DateTimeFormat, not null, must be < BillingPeriodEnd |
| ChargeCategory | String | Type, StringFormat, not null, allowed values check |
| ChargeClass | String | Type, StringFormat, conditional nullability |
| ChargeDescription | String | Type, StringFormat, not null |
| ChargePeriodEnd | DateTime | Type, DateTimeFormat, not null |
| ChargePeriodStart | DateTime | Type, DateTimeFormat, not null, must be < ChargePeriodEnd |
| ContractedCost | Decimal | Type, NumericFormat, not null, valid decimal |
| EffectiveCost | Decimal | Type, NumericFormat, not null, valid decimal, commitment discount rules |
| InvoiceIssuerName | String | Type, StringFormat, not null |
| ListCost | Decimal | Type, NumericFormat, not null, valid decimal |
| PricingQuantity | Decimal | Type, NumericFormat, conditional nullability |
| PricingUnit | String | Type, UnitFormat, conditional nullability |
| ProviderName | String | Type, StringFormat, not null |
| PublisherName | String | Type, StringFormat, not null |
| ServiceCategory | String | Type, StringFormat, not null, allowed values check |
| ServiceName | String | Type, StringFormat, not null |
Conditionally required columns (based on provider capabilities)
| Column | Data Type | Rules |
|---|---|---|
| AvailabilityZone | String | Type, StringFormat, conditional nullability |
| BillingAccountType | String | Type, StringFormat, not null |
| CapacityReservationId | String | Type, StringFormat, conditional nullability |
| CapacityReservationStatus | String | Type, StringFormat, conditional nullability, allowed values |
| CommitmentDiscountCategory | String | Type, StringFormat, conditional nullability, allowed values |
| CommitmentDiscountId | String | Type, StringFormat, conditional nullability |
| CommitmentDiscountName | String | Type, StringFormat, conditional nullability |
| CommitmentDiscountQuantity | Decimal | Type, NumericFormat, conditional nullability |
| CommitmentDiscountStatus | String | Type, StringFormat, conditional nullability, allowed values |
| CommitmentDiscountType | String | Type, StringFormat, conditional nullability |
| CommitmentDiscountUnit | String | Type, UnitFormat, conditional nullability |
| ConsumedQuantity | Decimal | Type, NumericFormat, conditional nullability |
| ConsumedUnit | String | Type, UnitFormat, conditional nullability |
| ContractedUnitPrice | Decimal | Type, NumericFormat, conditional nullability |
| ListUnitPrice | Decimal | Type, NumericFormat, conditional nullability |
| PricingCategory | String | Type, StringFormat, conditional nullability, allowed values |
| PricingCurrency | String | Type, CurrencyFormat, conditional nullability |
| PricingCurrencyContractedUnitPrice | Decimal | Type, NumericFormat, conditional nullability |
| PricingCurrencyEffectiveCost | Decimal | Type, NumericFormat, conditional nullability |
| PricingCurrencyListUnitPrice | Decimal | Type, NumericFormat, conditional nullability |
| RegionId | String | Type, StringFormat, conditional nullability |
| RegionName | String | Type, StringFormat, conditional nullability |
| ResourceId | String | Type, StringFormat, conditional nullability |
| ResourceName | String | Type, StringFormat, conditional nullability |
| ResourceType | String | Type, StringFormat, conditional nullability |
| SkuId | String | Type, StringFormat, conditional nullability |
| SkuMeter | String | Type, StringFormat, conditional nullability |
| SkuPriceDetails | KeyValue | KeyValueFormat, conditional nullability |
| SkuPriceId | String | Type, StringFormat, conditional nullability |
| SubAccountId | String | Type, StringFormat, conditional nullability |
| SubAccountName | String | Type, StringFormat, conditional nullability |
| SubAccountType | String | Type, StringFormat, conditional nullability |
| Tags | KeyValue | KeyValueFormat, conditional nullability |
Optional columns
| Column | Data Type | Rules |
|---|---|---|
| ChargeFrequency | String | Type, StringFormat, allowed values (rules skipped as MAY/OPTIONAL) |
| InvoiceId | String | Type, StringFormat (rules skipped as RECOMMENDED) |
| ServiceSubcategory | String | Type, StringFormat (rules skipped as RECOMMENDED) |
FOCUS 1.3 — CostAndUsage (65 columns)
The 1.3 CostAndUsage dataset retains every 1.2 column and adds 8 new ones (HostProviderName, ServiceProviderName, ContractApplied, and the five Allocated* fields). The model contains 71 Presence rules: 65 columns plus 6 conditional variants. ContractApplied and AllocatedMethodDetails are validated as nested-JSON Object schemas (see the Object rule type above for how their internal shape is enforced).
Mandatory columns (always required)
| Column | Data Type | Rules |
|---|---|---|
| BilledCost | Decimal | Type, NumericFormat, not null, valid decimal, conditional (=0 for third-party charges) |
| BillingAccountId | String | Type, StringFormat, not null |
| BillingAccountName | String | Type, StringFormat, not null |
| BillingCurrency | String | Type, CurrencyFormat (ISO 4217), not null |
| BillingPeriodEnd | DateTime | Type, DateTimeFormat, not null |
| BillingPeriodStart | DateTime | Type, DateTimeFormat, not null, must be < BillingPeriodEnd |
| ChargeCategory | String | Type, StringFormat, not null, allowed values check |
| ChargeClass | String | Type, StringFormat, conditional nullability |
| ChargeDescription | String | Type, StringFormat, not null |
| ChargePeriodEnd | DateTime | Type, DateTimeFormat, not null |
| ChargePeriodStart | DateTime | Type, DateTimeFormat, not null, must be < ChargePeriodEnd |
| ContractedCost | Decimal | Type, NumericFormat, not null, valid decimal |
| EffectiveCost | Decimal | Type, NumericFormat, not null, valid decimal, commitment discount rules |
| HostProviderName | String | Type, StringFormat, not null |
| InvoiceIssuerName | String | Type, StringFormat, not null |
| ListCost | Decimal | Type, NumericFormat, not null, valid decimal |
| PricingQuantity | Decimal | Type, NumericFormat, conditional nullability |
| PricingUnit | String | Type, UnitFormat, conditional nullability |
| ProviderName | String | Type, StringFormat, not null |
| PublisherName | String | Type, StringFormat, not null |
| ServiceCategory | String | Type, StringFormat, not null, allowed values check |
| ServiceName | String | Type, StringFormat, not null |
| ServiceProviderName | String | Type, StringFormat, not null |
Conditionally required columns (based on provider capabilities)
| Column | Data Type | Rules |
|---|---|---|
| AllocatedMethodDetails | Object (JSON) | Object schema (AllocatedMethodDetailsObject), conditional nullability (SHOULD) |
| AllocatedMethodId | String | Type, StringFormat, conditional nullability |
| AllocatedResourceId | String | Type, StringFormat, conditional nullability |
| AllocatedResourceName | String | Type, StringFormat, conditional nullability |
| AllocatedTags | KeyValue | KeyValueFormat, conditional nullability |
| AvailabilityZone | String | Type, StringFormat, conditional nullability |
| BillingAccountType | String | Type, StringFormat, not null |
| CapacityReservationId | String | Type, StringFormat, conditional nullability |
| CapacityReservationStatus | String | Type, StringFormat, conditional nullability, allowed values |
| CommitmentDiscountCategory | String | Type, StringFormat, conditional nullability, allowed values |
| CommitmentDiscountId | String | Type, StringFormat, conditional nullability |
| CommitmentDiscountName | String | Type, StringFormat, conditional nullability |
| CommitmentDiscountQuantity | Decimal | Type, NumericFormat, conditional nullability |
| CommitmentDiscountStatus | String | Type, StringFormat, conditional nullability, allowed values |
| CommitmentDiscountType | String | Type, StringFormat, conditional nullability |
| CommitmentDiscountUnit | String | Type, UnitFormat, conditional nullability |
| ConsumedQuantity | Decimal | Type, NumericFormat, conditional nullability |
| ConsumedUnit | String | Type, UnitFormat, conditional nullability |
| ContractApplied | Object (JSON) | Object schema (ContractAppliedObject), conditional nullability |
| ContractedUnitPrice | Decimal | Type, NumericFormat, conditional nullability |
| ListUnitPrice | Decimal | Type, NumericFormat, conditional nullability |
| PricingCategory | String | Type, StringFormat, conditional nullability, allowed values |
| PricingCurrency | String | Type, CurrencyFormat, conditional nullability |
| PricingCurrencyContractedUnitPrice | Decimal | Type, NumericFormat, conditional nullability |
| PricingCurrencyEffectiveCost | Decimal | Type, NumericFormat, conditional nullability |
| PricingCurrencyListUnitPrice | Decimal | Type, NumericFormat, conditional nullability |
| RegionId | String | Type, StringFormat, conditional nullability |
| RegionName | String | Type, StringFormat, conditional nullability |
| ResourceId | String | Type, StringFormat, conditional nullability |
| ResourceName | String | Type, StringFormat, conditional nullability |
| ResourceType | String | Type, StringFormat, conditional nullability |
| SkuId | String | Type, StringFormat, conditional nullability |
| SkuMeter | String | Type, StringFormat, conditional nullability |
| SkuPriceDetails | KeyValue | KeyValueFormat, conditional nullability |
| SkuPriceId | String | Type, StringFormat, conditional nullability |
| SubAccountId | String | Type, StringFormat, conditional nullability |
| SubAccountName | String | Type, StringFormat, conditional nullability |
| SubAccountType | String | Type, StringFormat, conditional nullability |
| Tags | KeyValue | KeyValueFormat, conditional nullability |
Optional columns
| Column | Data Type | Rules |
|---|---|---|
| ChargeFrequency | String | Type, StringFormat, allowed values (rules skipped as MAY/OPTIONAL) |
| InvoiceId | String | Type, StringFormat (rules skipped as RECOMMENDED) |
| ServiceSubcategory | String | Type, StringFormat (rules skipped as RECOMMENDED) |
FOCUS 1.3 — ContractCommitment (13 columns)
The ContractCommitment dataset describes the contracts and commitments that CostAndUsage charges roll up to. All 13 columns are mandatory; none gate on applicability criteria. BillingCurrency is the only column shared with CostAndUsage. There are no conditional or optional columns in this dataset.
Mandatory columns (always required)
| Column | Data Type | Rules |
|---|---|---|
| BillingCurrency | String | Type, CurrencyFormat (ISO 4217), not null. Shared with CostAndUsage |
| ContractCommitmentCategory | String | Type, StringFormat, not null, allowed values check |
| ContractCommitmentCost | Decimal | Type, NumericFormat, not null, valid decimal |
| ContractCommitmentDescription | String | Type, StringFormat, not null |
| ContractCommitmentId | String | Type, StringFormat, not null |
| ContractCommitmentPeriodEnd | DateTime | Type, DateTimeFormat, not null |
| ContractCommitmentPeriodStart | DateTime | Type, DateTimeFormat, not null, must be < ContractCommitmentPeriodEnd |
| ContractCommitmentQuantity | Decimal | Type, NumericFormat, not null, valid decimal |
| ContractCommitmentType | String | Type, StringFormat, not null, allowed values check |
| ContractCommitmentUnit | String | Type, UnitFormat, not null |
| ContractId | String | Type, StringFormat, not null |
| ContractPeriodEnd | DateTime | Type, DateTimeFormat, not null |
| ContractPeriodStart | DateTime | Type, DateTimeFormat, not null, must be < ContractPeriodEnd |