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 versionInternal model versionFile
1.21.2.0.1model-1.2.json
1.31.3.0.1model-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.

SectionPurpose
DetailsModel and FOCUS version numbers
ApplicabilityCriteriaApplicability criteria that gate conditional requirements
CheckFunctionsDefinitions of all check functions (what arguments they take)
ModelDatasetsEntry points: one root rule per dataset
ModelRulesAll 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.jsonModel and FOCUS version numbers
applicability_criteria.jsonProvider capability flag definitions
check_functions.jsonCheck function signatures
model_datasets.jsonDataset entry points
model_rules/datasets/*.jsonDataset-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/*.jsonPer-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/*.jsonAttribute 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 ModelRuleId referenced in a Requirement or Condition CheckModelRule must appear in that rule's Dependencies array
  • Every -C-000- column composite must list its column's presence rule in Dependencies: CostAndUsage-D-* in 1.2; CAU-CostAndUsage-D-* or CCT-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.

FieldDescription
FunctionRule category: Presence, Type, Format, Nullability, Validation, or Composite
ReferenceThe column or entity this rule applies to
EntityTypeDataset (structural checks), Column (value checks), Attribute (cross-cutting format rules), or Object (1.3+: nested-JSON schema rules)
StatusActive or Deprecated
ApplicabilityCriteriaApplicability criteria required for this rule to apply
TypeStatic (automatable) or Dynamic (requires human judgment)
ValidationCriteria.MustSatisfyHuman-readable requirement text
ValidationCriteria.KeywordRFC 2119 keyword: MUST, MUST NOT, RECOMMENDED, MAY, etc.
ValidationCriteria.RequirementThe check to perform (function + arguments)
ValidationCriteria.ConditionRow-level filter: rule only applies to rows matching this condition
ValidationCriteria.DependenciesOther 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.

SegmentValuesExamples
DatasetPrefix (1.3 only)CAU for CostAndUsage, CCT for ContractCommitmentCAU-, CCT-
ReferenceColumn name or dataset name (CostAndUsage, ContractCommitment)BilledCost, ContractCommitmentId
EntityCodeD = Dataset, C = Column, A = Attribute, O = Object (1.3+)
SequenceNumber3-digit, zero-padded. 000 = composite root000, 001, 005
ArtifactStatusM = Mandatory, C = Conditional, O = Optional

Examples:

1.2 rule ID1.3 rule IDMeaning
CostAndUsage-D-006-MCAU-CostAndUsage-D-006-MDataset-level rule #6 for BilledCost presence (MUST)
BilledCost-C-001-MCAU-BilledCost-C-001-MColumn-level rule #1 for BilledCost type (MUST)
BilledCost-C-005-CCAU-BilledCost-C-005-CColumn-level rule #5 for BilledCost conditional validation
BilledCost-C-000-MCAU-BilledCost-C-000-MComposite 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 datasetCAU-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:

CheckFunctionExpected types
TypeStringVARCHAR
TypeDecimalDECIMAL, DOUBLE, FLOAT
TypeDateTimeTIMESTAMP, 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:

CheckFunctionWhat it validates
FormatNumericDecimal/scientific notation
FormatStringNon-empty string values
FormatDateTimeISO 8601 UTC timestamps
FormatCurrency3-letter uppercase codes (regex)
FormatUnitFOCUS unit format (e.g., "GB", "Hours", "Count")
FormatKeyValueValid 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:

CheckFunctionPurpose
CheckValueColumn equals a specific value
CheckNotValueColumn does not equal a specific value
CheckSameValueTwo columns have the same value
CheckNotSameValueTwo columns have different values
CheckDecimalValueValid decimal number
CheckGreaterOrEqualThanValueNumeric >= threshold
CheckDistinctCountDistinct count across column groups
ColumnByColumnEqualsColumnValuecol_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:

  1. Structural: composite rules implicitly depend on their children (via CheckModelRule references in Items)
  2. Explicit: rules list other rule IDs in their Dependencies array (e.g., a conditional validation that needs another column's composite to pass first)
  3. 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:

CriteriaVersionColumns affected
AVAILABILITY_ZONE_SUPPORTED1.2, 1.3AvailabilityZone
CAPACITY_RESERVATION_SUPPORTED1.2, 1.3CapacityReservationId, CapacityReservationStatus
COMMITMENT_DISCOUNT_SUPPORTED1.2, 1.3CommitmentDiscount* (7 columns)
USAGE_MEASUREMENT_SUPPORTED1.2, 1.3ConsumedQuantity, ConsumedUnit
NEGOTIATED_PRICING_SUPPORTED1.2, 1.3ContractedUnitPrice
PUBLIC_PRICE_LIST_SUPPORTED1.2, 1.3ListUnitPrice, Sku* columns
UNIT_PRICING_SUPPORTED1.2, 1.3Sku* columns (combined with above)
MULTIPLE_PRICING_CATEGORIES_SUPPORTED1.2, 1.3PricingCategory
PRICING_BILLING_CURRENCY_DIFFERENCES_SUPPORTED1.2, 1.3PricingCurrency, PricingCurrency* columns
VIRTUAL_CURRENCY_SUPPORTED1.2, 1.3PricingCurrency* columns
REGION_SUPPORTED1.2, 1.3RegionId, RegionName
BILLING_BASED_ON_PROVISIONED_RESOURCES_SUPPORTED1.2, 1.3ResourceId, ResourceName, ResourceType
RESOURCE_TYPE_ASSIGNMENT_SUPPORTED1.2, 1.3ResourceType (combined with above)
SUB_ACCOUNT_SUPPORTED1.2, 1.3SubAccountId, SubAccountName
MULTIPLE_SUB_ACCOUNT_TYPES_SUPPORTED1.2, 1.3SubAccountType
MULTIPLE_BILLING_ACCOUNT_TYPES_SUPPORTED1.2, 1.3BillingAccountType
ACCOUNT_NAMING_SUPPORTED1.2, 1.3BillingAccountName
TAGGING_SUPPORTED1.2, 1.3Tags
CONTRACT_COMMITMENTS_SUPPORTED1.3ContractApplied (in CAU); gates the entire ContractCommitment dataset
DATA_GENERATOR_SPLIT_COST_ALLOCATION_SUPPORTED1.3AllocatedMethodId, 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 Requirement with a CheckFunction and 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:

KeywordRule suffixEngine behavior
MUST-MAlways executed. Failure = violation.
MUST NOT-MAlways executed. Failure = violation.
SHOULD / SHOULD NOT-CExecuted if applicability criteria are met.
RECOMMENDED-C or -OVaries by rule — some conditional, some optional.
MAY / OPTIONAL-OSkipped entirely (not a requirement).

Validation modes

The engine supports two validation modes via the mode query parameter:

ModeRules includedData loaded?Use case
fullAll rules under the selected dataset's root compositeYes (DuckDB)Complete validation of structure and data values
schemaPresence rules onlyNoNear-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:

VersionDatasetApprox. total rulesApprox. presence rules
1.2CostAndUsage62163
1.3CostAndUsage~87071
1.3ContractCommitment~6013

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)

ColumnData TypeRules
BilledCostDecimalType, NumericFormat, not null, valid decimal, conditional (=0 for third-party charges)
BillingAccountIdStringType, StringFormat, not null
BillingAccountNameStringType, StringFormat, not null
BillingCurrencyStringType, CurrencyFormat (ISO 4217), not null
BillingPeriodEndDateTimeType, DateTimeFormat, not null
BillingPeriodStartDateTimeType, DateTimeFormat, not null, must be < BillingPeriodEnd
ChargeCategoryStringType, StringFormat, not null, allowed values check
ChargeClassStringType, StringFormat, conditional nullability
ChargeDescriptionStringType, StringFormat, not null
ChargePeriodEndDateTimeType, DateTimeFormat, not null
ChargePeriodStartDateTimeType, DateTimeFormat, not null, must be < ChargePeriodEnd
ContractedCostDecimalType, NumericFormat, not null, valid decimal
EffectiveCostDecimalType, NumericFormat, not null, valid decimal, commitment discount rules
InvoiceIssuerNameStringType, StringFormat, not null
ListCostDecimalType, NumericFormat, not null, valid decimal
PricingQuantityDecimalType, NumericFormat, conditional nullability
PricingUnitStringType, UnitFormat, conditional nullability
ProviderNameStringType, StringFormat, not null
PublisherNameStringType, StringFormat, not null
ServiceCategoryStringType, StringFormat, not null, allowed values check
ServiceNameStringType, StringFormat, not null

Conditionally required columns (based on provider capabilities)

ColumnData TypeRules
AvailabilityZoneStringType, StringFormat, conditional nullability
BillingAccountTypeStringType, StringFormat, not null
CapacityReservationIdStringType, StringFormat, conditional nullability
CapacityReservationStatusStringType, StringFormat, conditional nullability, allowed values
CommitmentDiscountCategoryStringType, StringFormat, conditional nullability, allowed values
CommitmentDiscountIdStringType, StringFormat, conditional nullability
CommitmentDiscountNameStringType, StringFormat, conditional nullability
CommitmentDiscountQuantityDecimalType, NumericFormat, conditional nullability
CommitmentDiscountStatusStringType, StringFormat, conditional nullability, allowed values
CommitmentDiscountTypeStringType, StringFormat, conditional nullability
CommitmentDiscountUnitStringType, UnitFormat, conditional nullability
ConsumedQuantityDecimalType, NumericFormat, conditional nullability
ConsumedUnitStringType, UnitFormat, conditional nullability
ContractedUnitPriceDecimalType, NumericFormat, conditional nullability
ListUnitPriceDecimalType, NumericFormat, conditional nullability
PricingCategoryStringType, StringFormat, conditional nullability, allowed values
PricingCurrencyStringType, CurrencyFormat, conditional nullability
PricingCurrencyContractedUnitPriceDecimalType, NumericFormat, conditional nullability
PricingCurrencyEffectiveCostDecimalType, NumericFormat, conditional nullability
PricingCurrencyListUnitPriceDecimalType, NumericFormat, conditional nullability
RegionIdStringType, StringFormat, conditional nullability
RegionNameStringType, StringFormat, conditional nullability
ResourceIdStringType, StringFormat, conditional nullability
ResourceNameStringType, StringFormat, conditional nullability
ResourceTypeStringType, StringFormat, conditional nullability
SkuIdStringType, StringFormat, conditional nullability
SkuMeterStringType, StringFormat, conditional nullability
SkuPriceDetailsKeyValueKeyValueFormat, conditional nullability
SkuPriceIdStringType, StringFormat, conditional nullability
SubAccountIdStringType, StringFormat, conditional nullability
SubAccountNameStringType, StringFormat, conditional nullability
SubAccountTypeStringType, StringFormat, conditional nullability
TagsKeyValueKeyValueFormat, conditional nullability

Optional columns

ColumnData TypeRules
ChargeFrequencyStringType, StringFormat, allowed values (rules skipped as MAY/OPTIONAL)
InvoiceIdStringType, StringFormat (rules skipped as RECOMMENDED)
ServiceSubcategoryStringType, 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)

ColumnData TypeRules
BilledCostDecimalType, NumericFormat, not null, valid decimal, conditional (=0 for third-party charges)
BillingAccountIdStringType, StringFormat, not null
BillingAccountNameStringType, StringFormat, not null
BillingCurrencyStringType, CurrencyFormat (ISO 4217), not null
BillingPeriodEndDateTimeType, DateTimeFormat, not null
BillingPeriodStartDateTimeType, DateTimeFormat, not null, must be < BillingPeriodEnd
ChargeCategoryStringType, StringFormat, not null, allowed values check
ChargeClassStringType, StringFormat, conditional nullability
ChargeDescriptionStringType, StringFormat, not null
ChargePeriodEndDateTimeType, DateTimeFormat, not null
ChargePeriodStartDateTimeType, DateTimeFormat, not null, must be < ChargePeriodEnd
ContractedCostDecimalType, NumericFormat, not null, valid decimal
EffectiveCostDecimalType, NumericFormat, not null, valid decimal, commitment discount rules
HostProviderNameStringType, StringFormat, not null
InvoiceIssuerNameStringType, StringFormat, not null
ListCostDecimalType, NumericFormat, not null, valid decimal
PricingQuantityDecimalType, NumericFormat, conditional nullability
PricingUnitStringType, UnitFormat, conditional nullability
ProviderNameStringType, StringFormat, not null
PublisherNameStringType, StringFormat, not null
ServiceCategoryStringType, StringFormat, not null, allowed values check
ServiceNameStringType, StringFormat, not null
ServiceProviderNameStringType, StringFormat, not null

Conditionally required columns (based on provider capabilities)

ColumnData TypeRules
AllocatedMethodDetailsObject (JSON)Object schema (AllocatedMethodDetailsObject), conditional nullability (SHOULD)
AllocatedMethodIdStringType, StringFormat, conditional nullability
AllocatedResourceIdStringType, StringFormat, conditional nullability
AllocatedResourceNameStringType, StringFormat, conditional nullability
AllocatedTagsKeyValueKeyValueFormat, conditional nullability
AvailabilityZoneStringType, StringFormat, conditional nullability
BillingAccountTypeStringType, StringFormat, not null
CapacityReservationIdStringType, StringFormat, conditional nullability
CapacityReservationStatusStringType, StringFormat, conditional nullability, allowed values
CommitmentDiscountCategoryStringType, StringFormat, conditional nullability, allowed values
CommitmentDiscountIdStringType, StringFormat, conditional nullability
CommitmentDiscountNameStringType, StringFormat, conditional nullability
CommitmentDiscountQuantityDecimalType, NumericFormat, conditional nullability
CommitmentDiscountStatusStringType, StringFormat, conditional nullability, allowed values
CommitmentDiscountTypeStringType, StringFormat, conditional nullability
CommitmentDiscountUnitStringType, UnitFormat, conditional nullability
ConsumedQuantityDecimalType, NumericFormat, conditional nullability
ConsumedUnitStringType, UnitFormat, conditional nullability
ContractAppliedObject (JSON)Object schema (ContractAppliedObject), conditional nullability
ContractedUnitPriceDecimalType, NumericFormat, conditional nullability
ListUnitPriceDecimalType, NumericFormat, conditional nullability
PricingCategoryStringType, StringFormat, conditional nullability, allowed values
PricingCurrencyStringType, CurrencyFormat, conditional nullability
PricingCurrencyContractedUnitPriceDecimalType, NumericFormat, conditional nullability
PricingCurrencyEffectiveCostDecimalType, NumericFormat, conditional nullability
PricingCurrencyListUnitPriceDecimalType, NumericFormat, conditional nullability
RegionIdStringType, StringFormat, conditional nullability
RegionNameStringType, StringFormat, conditional nullability
ResourceIdStringType, StringFormat, conditional nullability
ResourceNameStringType, StringFormat, conditional nullability
ResourceTypeStringType, StringFormat, conditional nullability
SkuIdStringType, StringFormat, conditional nullability
SkuMeterStringType, StringFormat, conditional nullability
SkuPriceDetailsKeyValueKeyValueFormat, conditional nullability
SkuPriceIdStringType, StringFormat, conditional nullability
SubAccountIdStringType, StringFormat, conditional nullability
SubAccountNameStringType, StringFormat, conditional nullability
SubAccountTypeStringType, StringFormat, conditional nullability
TagsKeyValueKeyValueFormat, conditional nullability

Optional columns

ColumnData TypeRules
ChargeFrequencyStringType, StringFormat, allowed values (rules skipped as MAY/OPTIONAL)
InvoiceIdStringType, StringFormat (rules skipped as RECOMMENDED)
ServiceSubcategoryStringType, 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)

ColumnData TypeRules
BillingCurrencyStringType, CurrencyFormat (ISO 4217), not null. Shared with CostAndUsage
ContractCommitmentCategoryStringType, StringFormat, not null, allowed values check
ContractCommitmentCostDecimalType, NumericFormat, not null, valid decimal
ContractCommitmentDescriptionStringType, StringFormat, not null
ContractCommitmentIdStringType, StringFormat, not null
ContractCommitmentPeriodEndDateTimeType, DateTimeFormat, not null
ContractCommitmentPeriodStartDateTimeType, DateTimeFormat, not null, must be < ContractCommitmentPeriodEnd
ContractCommitmentQuantityDecimalType, NumericFormat, not null, valid decimal
ContractCommitmentTypeStringType, StringFormat, not null, allowed values check
ContractCommitmentUnitStringType, UnitFormat, not null
ContractIdStringType, StringFormat, not null
ContractPeriodEndDateTimeType, DateTimeFormat, not null
ContractPeriodStartDateTimeType, DateTimeFormat, not null, must be < ContractPeriodEnd