Schema reference.

The ULC record schema, written to JSON Schema Draft 2020-12, field by field. Each block below is a table of its fields with type, required status, constraints, and description; categorical fields link to the taxonomy enum they draw from, and value composites (provenanced numbers, dual-unit measurements, file references) are documented once under Common types. The machine file is served at /schema/ulc.json. This page documents 398 fields.

Record root

The top-level shape of a ULC record. Most fields are structural blocks documented in their own sections below; the index block is computed by the builder, never authored.

Field Type and description
ulc_version required string pattern The ULC specification version this record conforms to. Required on every record.
record_id required string min length 3; pattern Stable identifier for this record. Convention: `<manufacturer-slug>-<catalog-slug>-<scenario-slug>` with lowercase ASCII and hyphens. By repository convention matches the filename stem, regardless of whether the file is `.ulc` (canonical records) or `.ulc.json` (authoring templates). Must be unique within a manufacturer's namespace.
record_status required RecordStatus (enum) Commercial lifecycle status of the product this record describes.
record_status_as_of string format date Calendar date on which the record_status was last verified. ISO 8601 date (YYYY-MM-DD).
index required Index Denormalized scan surface for AI agents, search indexers, and filter UIs. Every field is a projection of authoritative values from the deeper blocks below. GENERATED, NOT HAND-AUTHORED: produced deterministically by the `ulc build-index` reference CLI (see `tools/validator/`) from the deep blocks and stamped with `x-ulc-generated: true` plus a `builder_version` so consumers can detect stale indices. Manufacturers never type these values; their PIM export or ULC CLI writes them. Drift is prevented by construction, because the builder is a pure function of the deep blocks.
product_family required ProductFamily Family-level identity and metadata shared by every ULC record derived from the same cutsheet. Populated once by the manufacturer's PIM and replicated into each record in the family.
configuration required Configuration The specific photometric scenario this record represents. Identifies the tested axes and tested conditions that anchor the record's measurements.
applicability Applicability Declares the range of orderable SKU configurations this record's measurements apply to. Covers axes where multiple order-code values share the same photometric record, with derivation rules for scaled values (CCT multipliers, per-foot scaling, voltage-independence rationale).
electrical Electrical Electrical measurements and nominal values at the luminaire input.
photometry Photometry Photometric measurements including total luminous flux, intensity distribution summary, zonal lumens, beam and field angles, UGR, and BUG classification when applicable.
colorimetry Colorimetry Color measurements including nominal and measured CCT, Duv, CRI, and TM-30 color-rendition metrics.
alpha_opic_metrics AlphaOpicMetrics Alpha-opic and melanopic metrics per CIE S 026 and IES RP-46-23. Includes per-channel alpha-opic efficacies and the melanopic daylight efficacy ratio used for circadian metric calculation.
flicker_measurements FlickerMeasurements Temporal light artefact (TLA) measurements per LM-90-20 and metric values per CIE TN 006 and IEEE 1789.
outdoor_classification OutdoorClassification Outdoor luminaire classification per TM-15 (LCS and BUG), applicable only to outdoor fixtures.
operating_point OperatingPoint Declared operating conditions at which measured values were taken (input voltage, ambient temperature, drive current).
test_conditions TestConditions Additional measurement-context metadata that qualifies attested values (stabilization method, nonstandard-condition flags, temperature monitoring point).
instrumentation Instrumentation Equipment and facility metadata for the laboratory that produced the measurements (goniometer type, photometric coordinate system, spectroradiometer).
corrections_applied CorrectionsApplied Corrections applied during measurement or data reduction (self-absorption, stray light, spectral mismatch, f1' correction).
uncertainty Uncertainty Reported measurement uncertainty values with coverage factor.
thermal_derating ThermalDerating Thermal performance curves relating case or ambient temperature to flux, efficacy, or color per LM-82-20.
lumen_maintenance_package array of LumenMaintenancePackageEntry Package-level lumen maintenance per LM-80 and TM-21 for each LED package used in the luminaire. One luminaire may reference multiple packages.
lumen_maintenance_luminaire LumenMaintenanceLuminaire Luminaire-level lumen maintenance. Supports three frameworks: TM-28 projection (direct or combined extrapolation), CIE 97 Luminaire Maintenance Factor tables, or a bare manufacturer-rated claim with no cited method.
chromaticity_shift_projection ChromaticityShiftProjection Projected chromaticity shift over luminaire life per TM-35.
sustainability_declaration SustainabilityDeclaration Structured sustainability attestation (Declare label and similar). Preserves the ingredient list, LBC Red List tier, expiration date, and document identifier.
compatible_accessories array of CompatibleAccessory Mechanical accessories (junction boxes, plaster frames, mounting rings, canopies, conduits) that are compatible with this luminaire SKU but are ordered separately under their own catalog numbers. Accessories that do not change photometry are listed here rather than getting their own ULC records.
source_files required array of SourceFile min 1 item Source files from which this record derives its data. Each file is referenced by filename, optional URL, and SHA-256 content hash. Files are not embedded. At least one source file is required at core level.
attestations array of Attestation External program attestations (listings, certifications, test-method conformance). Each attestation carries a program identifier, value type, and optional measured_quantities array listing the ULC field paths it covers. Attestations may be absolute, option-conditional, or case-by-case verification-required.
extensions Extensions Top-level escape hatch for values that do not fit the core schema. `manufacturer_specific` holds vendor-specific fields; `experimental` holds values under active review for future promotion into the main schema. Consumers should treat extensions as informational only.

ProductFamily

Cutsheet-level identity and metadata shared by every ULC record in the family.

Field Type and description
family_id required string pattern Stable slug grouping all records from the same cutsheet.
family_display_name string
family_description string
manufacturer required object
manufacturer.slug required string
manufacturer.display_name required string
manufacturer.parent_manufacturer_slug string Optional parent company slug when the manufacturer is a subsidiary (for example Vode is a subsidiary of Lumenpulse).
catalog_line string
catalog_model required string
cutsheet required FileReference
primary_category PrimaryCategory (enum)
secondary_function array of SecondaryFunction (enum)
indoor_outdoor IndoorOutdoor (enum)
technical_region TechnicalRegion (enum) Market-region configuration of the fixture. Captures the voltage and frequency variant of the SKU family. Many product families ship parallel North American, European, and Japanese variants sharing optics and light engines but with different drivers and certifications; this field makes the market variant explicit for consumer filter UIs.
mounting_types array of MountingType (enum)
environment_rating EnvironmentRating (enum)
shape Shape (enum)
shared_mechanical object
shared_mechanical.housing_material HousingMaterial (enum)
shared_mechanical.lens_material LensMaterial (enum)
shared_mechanical.reflector_material string Material of the internal reflector or darklight cone, when the optic uses one. Free-string to accommodate manufacturer-specific descriptions such as 'polymer, aluminum vaporized, silver, specular' (a typical architectural darklight reflector). A future revision may promote this to a closed enum.
shared_mechanical.finish_color_options array of string
shared_mechanical.ip_rating string pattern
shared_mechanical.ik_rating string pattern
shared_mechanical.ambient_operating_range object Declared ambient operating temperature range for the fixture. Dual-unit per spec: Celsius authoritative, Fahrenheit is the required derived companion.
shared_mechanical.ambient_operating_range.min DualUnitTemperature
shared_mechanical.ambient_operating_range.max DualUnitTemperature
physical_dimensions object Luminaire geometric and mass characteristics. All dimensional fields use the dual-unit SI-authoritative pattern via DualUnitLength and DualUnitMass. Not every field applies to every product category; authors populate only what the cutsheet publishes. The block is flexible by design so indoor recessed, pendant, pole-top outdoor, and linear products can each use the appropriate subset of slots.
physical_dimensions.overall_diameter DualUnitLength Outside diameter of the luminaire for round fixtures.
physical_dimensions.overall_length DualUnitLength Overall length for linear or rectangular fixtures.
physical_dimensions.overall_width DualUnitLength Overall width for rectangular or non-round fixtures.
physical_dimensions.overall_height DualUnitLength Overall height for pole-top, bollard, pendant, or wall-mount fixtures. For recessed fixtures, use recess_depth instead.
physical_dimensions.luminaire_mass DualUnitMass Mass of the luminaire as published on the cutsheet. For Pattern D linear fixtures where mass scales with length, populate linear_mass_per_foot instead or in addition.
physical_dimensions.linear_mass_per_foot DualUnitMassPerLength Per-length mass rate for linear fixtures where total mass scales with fixture length (typical of Pattern D products). Pairs with photometry.per_length_normalized.lumens_per_foot. Uses DualUnitMassPerLength, not DualUnitMass, because the quantity is a mass rate (kg per meter, lb per foot), not an absolute mass.
physical_dimensions.lens_width DualUnitLength Width of the light-emitting lens or optical opening, when distinct from the overall luminaire width.
physical_dimensions.ceiling_aperture DualUnitLength For recessed fixtures, the diameter (or effective diameter) of the ceiling cut-out the fixture requires.
physical_dimensions.recess_depth DualUnitLength For recessed fixtures, the depth above the ceiling plane that the fixture housing occupies.
physical_dimensions.accommodated_ceiling_thickness_range object For recessed fixtures, the minimum and maximum ceiling thickness the standard mounting hardware accommodates.
physical_dimensions.accommodated_ceiling_thickness_range.min DualUnitLength
physical_dimensions.accommodated_ceiling_thickness_range.max DualUnitLength
physical_dimensions.connection_cable_length DualUnitLength Length of an attached connection cable (pre-installed pigtail or tether) if the cutsheet publishes it.
physical_dimensions.driver_dimensions object Overall dimensions of a remote or integral driver housing when the cutsheet publishes them.
physical_dimensions.driver_dimensions.length DualUnitLength
physical_dimensions.driver_dimensions.width DualUnitLength
physical_dimensions.driver_dimensions.height DualUnitLength
physical_dimensions.epa DualUnitArea Effective Projected Area for pole-mounted outdoor fixtures under AASHTO 2013 wind-loading analysis. Uses DualUnitArea so SI (m2) and Imperial (ft2) are both required, matching the ULC dual-unit policy.
shared_warranty object
shared_warranty.term_years integer min 0
shared_warranty.scope string
shared_warranty.conditions_reference string
shared_attestations array of Attestation Attestations that apply to every SKU in the family without qualification. SKU-specific or option-conditional attestations live in the top-level `attestations[]` array instead.
introduced_at string format date
end_of_life_program_url string format uri

Configuration

The specific photometric scenario this record represents. Fields describe what was tested, not what the record's measurements apply to (that is the applicability block's job).

Field Type and description
photometric_scenario_id required string Identifier for the photometric scenario within the family. Typically a slug summarizing the tested axes.
catalog_number string The specific manufacturer-assigned catalog number or order code this record represents. Populated by Pattern A manufacturers who publish one cutsheet per SKU. Pattern B manufacturers whose scenario covers a catalog pattern typically omit this field and rely on `applicability.applicable_catalog_pattern` plus `record_id` for identification.
scenario_label string Human-readable description of the tested scenario.
tested_axes object Axes of the configurator that this scenario's measurement varies. Each axis names its manufacturer-label, optional ULC category mapping, and tested value.
tested_axes.distribution_code object
tested_axes.distribution_code.manufacturer_label string
tested_axes.distribution_code.distribution_type DistributionType (enum)
tested_axes.distribution_code.outdoor_distribution_type OutdoorDistributionType (enum)
tested_axes.light_engine_variant string
tested_axes.output_tier object
tested_axes.output_tier.manufacturer_label string
tested_axes.output_tier.tier_meaning string
tested_axes.cri_tier CriTier (enum)
tested_axes.color_tunability ColorTunabilityCapability (enum)
tested_conditions object Conditions fixed during the test that anchor this record's measurements.
tested_conditions.nominal_cct_at_test NominalCCT (enum)
tested_conditions.input_voltage_at_test string
tested_conditions.mounting_at_test MountingType (enum)
tested_conditions.ambient_temperature DualUnitTemperature
tested_conditions.case_temperature DualUnitTemperature
source_ies_ref string Reference to the IES file this scenario's photometry anchors to, if applicable. Matches a source_files entry.

Applicability

Declares the range of orderable SKU configurations this record's measurements apply to. This is the mechanism that lets one ULC record cover many orderable SKUs without duplication.

Field Type and description
applicable_catalog_pattern string Order-code skeleton where `{AXIS}` placeholders mark axes covered by this record. Example: `AYAP-SR-{MOUNT}-HO-{CCT}-{CORD}-{FINISH}-{VOLT}-{OPTIONS}`.
fixed_axes object Order-code axes that must match a fixed value for this record to apply.
covered_axes object Order-code axes where multiple values share this record's photometry. Each entry lists the covered values and optionally a derivation rule (multiplier table, linear scaling, voltage-independence rationale).
excluded_combinations array of object Combinations that are orderable elsewhere in the family but not covered by this record.
excluded_combinations[].axes required object
excluded_combinations[].reason required string
applicable_sku_count_estimate integer min 0 Informational count of orderable SKUs this record covers. Not used for validation.

CoveredAxis

One order-code axis covered by a record's applicability block.

Field Type and description
values required array of string Order-code values for this axis that share the record's photometry.
rationale required string Why these values share one record (for example `regulated driver renders voltage variance photometrically immaterial` or `finish is cosmetic`).
derivation DerivationRule Optional derivation rule for values that are not photometrically identical to the baseline but derive from it by a disclosed method.
excludes array of string Values that are part of this axis's order-code menu but are NOT covered by this record.

DerivationRule

Manufacturer-declared rule for deriving per-axis values from a baseline measurement. Examples: CCT multiplier table (Selux), per-foot linear scaling (Vode), wattage-tier scaling, voltage step-down delta.

Field Type and description
method required string Named derivation method.
baseline_axis_value string
multiplier_table object Keyed multiplier table when the method produces values by multiplying a baseline. Keys are axis values, values are multipliers relative to the baseline.
linear_rate object Per-unit rate for linear scaling (for example lumens per foot).
linear_rate.value number
linear_rate.unit string
reference string Citation for where on the cutsheet the rule is published (for example `cutsheet_page_10_table`).
note string

Electrical

Electrical quantities measured at the luminaire input.

Field Type and description
input_power_w ProvenancedNumber
input_current_a ProvenancedNumber
input_voltage_v ProvenancedNumber
input_voltage_class string
power_factor ProvenancedNumber
thd_percent ProvenancedNumber
driver_protocol DimmingProtocol (enum)
dimming_method DimmingMethod (enum) Underlying electrical dimming method (CCR, PWM, or hybrid). Independent of `driver_protocol`, which is the signaling layer. Authors populate this when the cutsheet publishes the method; absent if the method is not declared.
dimming_range_percent object Minimum and maximum dim levels as percentages of full output. For example a 3%-100% dim range captures the common architectural driver range. `min` is the lowest stable output the fixture can sustain before turning off; `max` is full output. Both values are manufacturer-declared at this level; actual on-site dim behavior also depends on the dimmer or controller. Both `min` and `max` are required when this block is present so that partial ranges do not silently validate.
dimming_range_percent.min required number 0 to 100
dimming_range_percent.max required number 0 to 100
control_gear_type ControlGearType (enum)
led_module_power_w ProvenancedNumber Optional LED-module-only input power (typically smaller than luminaire input due to driver losses). Useful when the cutsheet distinguishes module from luminaire.

Photometry

Luminous flux, intensity, beam geometry, efficacy, UGR, and BUG summary.

Field Type and description
total_luminous_flux_lm ProvenancedNumber
led_module_luminous_flux_lm ProvenancedNumber Optional LED-module-only flux (upstream of luminaire optics). Paired with led_module_power_w when the cutsheet distinguishes module from luminaire.
luminaire_efficacy_lm_per_w ProvenancedNumber
maximum_intensity_cd ProvenancedNumber
center_beam_intensity_cd ProvenancedNumber
beam_angle_deg ProvenancedNumber
field_angle_deg ProvenancedNumber
cutoff_angle_from_horizontal_deg ProvenancedNumber The angle above horizontal beyond which no direct light escapes the fixture. An architectural glare-control specification typical of downlights and indirect architectural fixtures. Distinct from the deprecated IES cutoff classification (which is an outdoor four-class scheme). A value of 40 means no direct light is emitted above 40 degrees from horizontal.
beam_family BeamFamily (enum)
distribution_type DistributionType (enum)
symmetry_type SymmetryType (enum)
photometric_coordinate_system PhotometricCoordinateSystem (enum)
luminous_opening_shape LuminousOpeningShape (enum)
emission_face EmissionFace (enum)
spacing_criterion ProvenancedNumber
ugr_4h_8h ProvenancedNumber Unified Glare Rating for the CIE 4H/8H reference room geometry. Published by manufacturers of interior architectural fixtures for European glare assessments.
ugr_4h_8h_bound_operator ComparisonOperator (enum) When present, indicates the UGR value is a declared bound rather than a specific measured value. Pairs with `ugr_4h_8h`. Use `lte` for manufacturer claims of the form 'UGR as low as X' where X is the best achievable value across the fixture's supported optics or dimming configurations. Absence means the UGR value is a specific point estimate at the tested scenario.
zonal_lumens array of object Luminous flux summed over zonal angle bands (for example 0-30, 0-40, 0-60, 0-90, 90-180 degrees).
zonal_lumens[].zone_label required string
zonal_lumens[].lumens required ProvenancedNumber
per_length_normalized object For linear products, per-unit-length photometric values that scale with fixture length.
per_length_normalized.lumens_per_foot ProvenancedNumber
per_length_normalized.lumens_per_meter ProvenancedNumber
per_length_normalized.watts_per_foot ProvenancedNumber
per_length_normalized.watts_per_meter ProvenancedNumber
per_length_normalized.reference_length DualUnitLength
declared_by_cct array of object Manufacturer-declared photometric values at CCTs other than the tested baseline, derived via a CCT multiplier table or similar rule. See applicability.covered_axes.CCT for the derivation context.
declared_by_cct[].cct required NominalCCT (enum)
declared_by_cct[].lumens ProvenancedNumber
declared_by_cct[].efficacy_lm_per_w ProvenancedNumber
declared_by_length array of object Manufacturer-declared photometric values at fixture lengths other than the tested baseline, derived via linear per-foot (or per-meter) scaling. See applicability.covered_axes.length for the derivation context. Used by Pattern D linear products (for example Vode Nexa linear pendants with published lm/ft and W/ft rates). Each entry declares a specific length via DualUnitLength and the length-scaled quantities at that length. Pairs with per_length_normalized, which carries the per-unit-length rates themselves.
declared_by_length[].length required DualUnitLength
declared_by_length[].lumens ProvenancedNumber
declared_by_length[].input_power_w ProvenancedNumber
declared_by_length[].efficacy_lm_per_w ProvenancedNumber

Colorimetry

Color metrics including CCT, Duv, CRI, and TM-30 color rendition.

Field Type and description
nominal_cct_k NominalCCT (enum)
measured_cct_k ProvenancedNumber
duv ProvenancedNumber
chromaticity_x ProvenancedNumber
chromaticity_y ProvenancedNumber
sdcm_step ProvenancedNumber
cri_ra ProvenancedNumber
cri_r9 ProvenancedNumber
cri_per_sample array of object Optional per-sample CIE 13 CRI values (R1 through R15).
cri_per_sample[].sample_index required integer 1 to 15
cri_per_sample[].value required ProvenancedNumber
tm_30 object
tm_30.rf ProvenancedNumber
tm_30.rg ProvenancedNumber
tm_30.pvf_code string pattern Preference/Vividness/Fidelity two-character code per TM-30-24: a letter (P / V / F) identifying the design-intent axis, followed by a level digit (1-3). Example values: `P2`, `V1`, `F3`. A single PVF code expresses the highest-priority design intent level achieved.
tm_30.rf_h_per_bin array of object Local chroma shift / hue shift / local fidelity per hue bin (16 bins).
tm_30.rf_h_per_bin[].bin integer 1 to 16
tm_30.rf_h_per_bin[].rf_h ProvenancedNumber

AlphaOpicMetrics

Per CIE S 026 and IES RP-46-23. Melanopic DER (MDER) is the most commonly published value on cutsheets.

Field Type and description
reference_illuminant object const "d65" Reference illuminant for alpha-opic DER calculations. Per CIE S 026, always D65.
standard_observer object const "cie_1931_2_degree" Colorimetric observer used. Per CIE S 026, always the CIE 1931 2-degree standard observer.
melanopic_der ProvenancedNumber Melanopic Daylight Efficacy Ratio (MDER / gamma_mel,v,D65). Multiplied by photopic illuminance to compute MEDI (Melanopic Equivalent Daylight Illuminance).
per_channel array of object Alpha-opic efficacy of luminous radiation per photoreceptor channel.
per_channel[].channel required AlphaOpicChannel (enum)
per_channel[].efficacy required ProvenancedNumber

FlickerMeasurements

TLA metrics per LM-90-20, CIE TN 006, and IEEE 1789. Values may be measured scalars or manufacturer-rated upper bounds.

Field Type and description
metrics array of object
metrics[].metric required FlickerMetric (enum)
metrics[].value ProvenancedNumber
metrics[].bound_operator ComparisonOperator (enum) Used when the manufacturer declares an upper bound (`<=`) rather than a specific measured value.
risk_level FlickerRiskLevel (enum)
test_chamber_type FlickerTestChamberType (enum)
dimming_type_at_test FlickerDimmingType (enum)
photodetector_correction FlickerPhotodetectorSpectralCorrection (enum)
sampling_class FlickerSamplingClass (enum)
waveform_file_format FlickerWaveformFileFormat (enum)

OutdoorClassification

TM-15 LCS and BUG classification for outdoor luminaires.

Field Type and description
bug_rating object
bug_rating.b required integer 0 to 5
bug_rating.u required integer 0 to 5
bug_rating.g required integer 0 to 5
outdoor_distribution_type OutdoorDistributionType (enum)
longitudinal_distribution_range LongitudinalDistributionRange (enum)
legacy_cutoff LegacyCutoffClassification (enum)
lcs_zonal_lumens array of object Luminous flux per LCS zone per TM-15.
lcs_zonal_lumens[].zone required string
lcs_zonal_lumens[].lumens required ProvenancedNumber

OperatingPoint

Declared operating conditions at which measured values were taken.

Field Type and description
input_voltage_v ProvenancedNumber
input_frequency_hz ProvenancedNumber
drive_current_ma ProvenancedNumber
ambient_temperature DualUnitTemperature
case_temperature_monitoring_point TemperatureMonitoringPoint (enum)
case_temperature DualUnitTemperature
dut_operating_mode DutOperatingMode (enum)

TestConditions

Context qualifying attested values.

Field Type and description
stabilization_method StabilizationMethod (enum)
nonstandard_condition_flags array of NonstandardConditionFlag (enum)
photometry_method PhotometryMethod (enum)
photometry_basis PhotometryBasis (enum)
negative_intensity_handling NegativeIntensityHandling (enum)
file_generation_type FileGenerationType (enum)

Instrumentation

Laboratory equipment and accreditation.

Field Type and description
goniometer_type GoniometerType (enum)
measurement_regime MeasurementRegime (enum)
laboratory_certification LaboratoryCertification (enum)
laboratory_accreditation_scheme LaboratoryAccreditationScheme (enum)
laboratory_name string
laboratory_report_id string

CorrectionsApplied

Corrections performed during measurement or data reduction.

Field Type and description
self_absorption_corrected boolean
stray_light_corrected boolean
spectral_mismatch_corrected boolean
f1_prime_value ProvenancedNumber
notes string

Uncertainty

Reported expanded uncertainty values with coverage factor per GUM conventions.

Field Type and description
coverage_factor_k number
expanded_uncertainty_total_flux_percent ProvenancedNumber
expanded_uncertainty_input_power_percent ProvenancedNumber
expanded_uncertainty_cct_k ProvenancedNumber
expanded_uncertainty_efficacy_percent ProvenancedNumber

ThermalDerating

Flux, efficacy, and color shift vs. case or ambient temperature per LM-82-20.

Field Type and description
thermal_control_method ThermalControlMethod (enum)
curves array of object
curves[].temperature_axis TemperatureAxis (enum)
curves[].temperature_points_c array of number Temperature sample points in degrees Celsius. Standards-native Celsius exception to the dual-unit rule: LM-82-20 and equivalent standards publish these arrays in Celsius only, and this field mirrors the source data verbatim. Consumers needing Fahrenheit convert at read time.
curves[].flux_values_normalized array of number
curves[].efficacy_values_lm_per_w array of number
curves[].cct_shift_points_k array of number

LumenMaintenancePackageEntry

Per-package LM-80 data and TM-21 projection. A luminaire using multiple LED packages has one entry per distinct package.

Field Type and description
package_identifier string
tested_product_type TestedProductType (enum)
flux_maintenance_quantity FluxMaintenanceQuantity (enum)
flux_maintenance_threshold FluxMaintenanceThreshold (enum)
tm_21_projection_hours ProvenancedNumber
projection_reliability ProjectionReliability (enum)
tm_21_interpolation_type TM21InterpolationType (enum)
test_hours ProvenancedNumber
test_temperature_c ProvenancedNumber
drive_current_ma ProvenancedNumber

LumenMaintenanceLuminaire

Framework-aware block. The framework field selects which sub-block applies. Multiple frameworks may coexist if the cutsheet publishes more than one.

Field Type and description
declaration_framework LumenMaintenanceDeclarationFramework (enum)
tm_28 object
tm_28.projection_method LumenMaintenanceProjectionMethod (enum)
tm_28.projection_basis ProjectionBasis (enum)
tm_28.tm_28_projection_hours ProvenancedNumber
tm_28.projection_reliability ProjectionReliability (enum)
tm_28.test_hours ProvenancedNumber
cie_97_lmf_table object Luminaire Maintenance Factor values the manufacturer declares for their fixture across the four standardized CIE 97 ambient cleanliness categories (pure / clean / normal / dirty) at the three standardized cleaning intervals (1 / 2 / 3 years). These are NOT site-specific installation inputs: they are reference categories defined by CIE 97 so manufacturers can publish comparable LMF data. This field therefore describes a declared capability of the fixture (rubric filter 2), not project or installation context. Specifiers pick the row that matches their installation conditions when computing project-specific maintenance factors downstream.
cie_97_lmf_table.lmf_by_cleanliness_and_interval array of object Array of LMF values keyed by the CIE 97 reference conditions. The manufacturer supplies one entry per (interval, cleanliness) combination they publish; typical cutsheets publish all 12.
cie_97_lmf_table.lmf_by_cleanliness_and_interval[].cleaning_interval_years required integer 1 to 3
cie_97_lmf_table.lmf_by_cleanliness_and_interval[].ambient_cleanliness required AmbientCleanliness (enum)
cie_97_lmf_table.lmf_by_cleanliness_and_interval[].lmf required number 0 to 1
cie_97_lmf_table.llmf_by_hours array of object Lamp Lumen Maintenance Factor by operating hours.
cie_97_lmf_table.llmf_by_hours[].hours required integer
cie_97_lmf_table.llmf_by_hours[].llmf number 0 to 1
cie_97_lmf_table.llmf_by_hours[].lsf number 0 to 1
manufacturer_rated_claim object Bare manufacturer claim like `L70 > 50,000h` or `L80 > 60,000h` with no cited method. Present when declaration_framework is `manufacturer_rated_claim`.
manufacturer_rated_claim.claim_type FluxMaintenanceThreshold (enum) Maintenance threshold being claimed (L70, L80, L90, L95).
manufacturer_rated_claim.claimed_hours ProvenancedNumber
manufacturer_rated_claim.failure_percent ProvenancedNumber Claimed cumulative failure rate at the claimed hours (for example `0.1%` failure at 50,000 hours).

ChromaticityShiftProjection

Per TM-35.

Field Type and description
shift_metric ChromaticityShiftMetric (enum)
shift_threshold ChromaticityShiftThreshold (enum)
shift_mode ChromaticityShiftMode (enum)
projected_hours ProvenancedNumber
tm_35_edition TM35Edition (enum)

SustainabilityDeclaration

Structured representation of a Declare label or similar sustainability attestation.

Field Type and description
declaration_type SustainabilityDeclarationType (enum) Which sustainability program the declaration belongs to.
document_id string
original_issue_date string format date
expiration_date string format date
final_assembly_location string
life_expectancy_years number min 0
end_of_life_options array of string
recyclable_percent number 0 to 100
ingredient_list array of object
ingredient_list[].material_name required string
ingredient_list[].lbc_red_list_status IngredientRedListStatus (enum)
ingredient_list[].notes string
lbc_criteria_compliance boolean
voc_content string
interior_performance string
responsible_sourcing string

CompatibleAccessory

Mechanical accessory (junction box, plaster frame, mounting ring, canopy, conduit) compatible with this luminaire but ordered separately. Accessories that alter fixture photometry are modeled as separate ULC records and referenced via their own record_id instead of this block.

Field Type and description
accessory_catalog_number required string
display_name string
description string
accessory_type AccessoryType (enum)
mass DualUnitMass
changes_photometry boolean default false True when the accessory changes fixture photometry. Accessories with changes_photometry=true should also have their own ULC record linked via `accessorized_record_ref`.
accessorized_record_ref string
is_compatible_with_this_sku boolean default true Whether the accessory is compatible with the specific SKU configuration this record represents. Default true. Set to false when the cutsheet explicitly excludes the accessory from the record's SKU (for example when a junction box does not fit the shortest length variant of a linear fixture). Consumers filtering accessory compatibility should respect this flag before presenting the accessory as orderable alongside this SKU.
incompatibility_reason string Free-text explanation of why is_compatible_with_this_sku is false. Required when is_compatible_with_this_sku is false; should be omitted otherwise.

SourceFile

One source file that contributes data to this ULC record.

Field Type and description
file_type required SourceFileType (enum)
reference required FileReference

Attestation

An attestation claim against this ULC record. An attestation may be absolute (applies always), option-conditional (applies when specific order-code options are selected), or case-by-case (requires per-project manufacturer verification). The measured_quantities array lists ULC field paths the attestation covers so consumers can verify coverage.

Field Type and description
attestation_id string Stable identifier for this attestation within the record (for example `lm79_selux_aya_sr_ho`). Used as the target of `provenance.attestation_ref` from individual values.
program required AttestationProgram (enum)
status AttestationStatus (enum)
value_type required RegulatoryValueType (enum)
issued_date string format date
valid_until string format date
listing_number string
test_laboratory string
test_report_id string
standard_revision string
measured_quantities array of string JSON paths of ULC fields this attestation covers. Each covered field's `provenance.attestation_ref` is expected to reference this attestation's `attestation_id`.
applicability object Order-code conditions under which this attestation applies (for option-conditional attestations like Chicago Plenum requiring the CPP option).
applicability.required_order_code_options array of string
applicability.required_constraints object
verification object For case-by-case attestations (BAA, BABA, and similar), declares that manufacturer confirmation is required before a consumer can propagate the claim downstream.
verification.type required AttestationVerificationType (enum)
verification.contact_reference string
verification.notes string
source_document_ref FileReference

Extensions

Escape hatch for values outside the core schema. Treated as informational by validators.

Field Type and description
manufacturer_specific object Vendor-specific fields keyed by manufacturer slug.
experimental object Fields under active review for promotion into the main schema.

Index

Generated summary view. Every field projects from an authoritative deep-block value. The builder (`ulc build-index`, under `tools/validator/`) is the single source of these projections; manufacturers never hand-author them. Selection policies the builder applies: (1) `nominal_cct_k` = `configuration.tested_conditions.nominal_cct_at_test`; (2) `nominal_total_lumens` = `photometry.total_luminous_flux_lm.value` at the tested baseline, not `declared_by_cct` derivatives; (3) `nominal_input_power_w` = `electrical.input_power_w.value`; (4) `primary_category` = `product_family.primary_category`; (5) `source_file_types_present` = deduplicated sorted list of `source_files[].file_type` values; (6) other fields follow analogous rules documented in the builder's source. Consumers reading `x-ulc-generated: true` can treat the index as trustworthy; absence or a stale `builder_version` is the signal to re-run the builder.

Field Type and description
x-ulc-generated required object const true Marker asserting this index was produced by the canonical builder. Always true in valid records; absence is the signal that the index was hand-edited or predates a builder revision.
builder_version required string pattern Semver of the builder that produced this index. Consumers compare against the current builder version to detect stale indices.
conformance_level required ConformanceLevel (enum) The completeness level this record achieves. GENERATED, NOT HAND-AUTHORED: the reference builder computes it from the record's populated fields (applying the conditional rubric: directional categories require a beam angle, pure RGB/RGBA fixtures with no white channel skip CRI, outdoor products require BUG at full, and so on) and stamps it here like every other index value. Because it is a builder projection, a hand-tampered value fails the build-parity check just like any other index field, so the level a record claims is the level its data actually achieves.
manufacturer_slug required string
catalog_model required string
catalog_number string
display_name string
primary_category required PrimaryCategory (enum)
secondary_function array of SecondaryFunction (enum)
indoor_outdoor IndoorOutdoor (enum)
mounting_types array of MountingType (enum)
environment_rating EnvironmentRating (enum)
nominal_cct_k NominalCCT (enum)
nominal_total_lumens required number min 0
nominal_input_power_w required number min 0
nominal_cri_ra number 0 to 100
nominal_efficacy_lm_per_w number min 0
primary_distribution DistributionType (enum)
outdoor_distribution OutdoorDistributionType (enum)
beam_family BeamFamily (enum)
color_tunability ColorTunabilityCapability (enum)
dimming_protocols array of DimmingProtocol (enum)
ip_rating string pattern
ik_rating string pattern
bug_rating string pattern Short string form of BUG (for example `B1-U0-G1`). Computed from `outdoor_classification.bug_rating` when present.
ugr_4h_8h number
attestation_programs array of AttestationProgram (enum) Flat array of every AttestationProgram value claimed anywhere in the record (shared_attestations, attestations[], and sustainability_declaration declaration types that correspond to an external certified program). Deduplicated. Lets consumers filter by certification without walking all attestation records. Manufacturer-self-operated sustainability declaration types that are not certified external programs (for example `manufacturer_recycle_program`) intentionally do not contribute an entry here; they appear only in the `sustainability_declaration.declaration_type` field and are filterable from there when needed.
search_keywords array of string Optional free-text tokens the manufacturer wants indexed. Populated by the builder from `product_family.family_display_name`, `product_family.catalog_line`, and `configuration.scenario_label`, then deduplicated and sorted for deterministic output. Future builder versions may ingest additional manufacturer-tagged fields; the exact set is a builder-version policy, not a schema-level contract.
source_file_types_present array of SourceFileType (enum) Deduplicated sorted list of `source_files[].file_type` values. Lets AI agents and retrieval systems quickly determine which source formats (PDF, IES, LDT, TM-33, ULD, GLDF) exist for this record without walking the full `source_files` array.

Common types

ProvenancedNumber

A single numeric value with its unit, regulatory value type, and provenance. Used for single-unit quantities (lumens, watts, CRI, Duv, candela, efficacy).

Field Type and description
value required number
unit string
value_type required RegulatoryValueType (enum)
provenance Provenance

DualUnitLength

Length value with mandatory SI (mm) and Imperial (in) representations. SI is authoritative per the ULC spec; the Imperial representation is the required derived companion.

Field Type and description
mm required number min 0
in required number min 0
value_type RegulatoryValueType (enum)
provenance Provenance

DualUnitMass

Mass value with mandatory SI (kg) and Imperial (lb) representations.

Field Type and description
kg required number min 0
lb required number min 0
value_type RegulatoryValueType (enum)
provenance Provenance

DualUnitTemperature

Temperature value with mandatory Celsius and Fahrenheit representations.

Field Type and description
c required number
f required number
value_type RegulatoryValueType (enum)
provenance Provenance

DualUnitArea

Area value with mandatory SI (square meters) and Imperial (square feet) representations. Used for Effective Projected Area (EPA) on pole-mounted outdoor fixtures. SI is authoritative; Imperial is the required derived companion.

Field Type and description
m2 required number min 0
ft2 required number min 0
value_type RegulatoryValueType (enum)
provenance Provenance

DualUnitMassPerLength

Linear mass rate (mass per unit length) with mandatory SI (kg per meter) and Imperial (lb per foot) representations. Used for linear fixtures where total mass scales with fixture length. Distinct from DualUnitMass, which represents an absolute mass. SI is authoritative; Imperial is the required derived companion.

Field Type and description
kg_per_m required number min 0
lb_per_ft required number min 0
value_type RegulatoryValueType (enum)
provenance Provenance

Provenance

Traceability metadata attached to an individual field value. Every extracted, derived, or computed value should carry provenance so consumers can verify how each number was produced.

Field Type and description
source required ProvenanceSource (enum) Origin of the value.
method required ProvenanceMethod (enum) How the value was produced from its source.
confidence number 0 to 1 Optional confidence score in the range [0, 1] when the value was inferred or extracted with uncertainty.
conflict_notes string Optional note recording a disagreement between two sources for the same value.
attestation_ref string Reference to an attestation record's test ID when the value is anchored to a specific lab attestation. Expected on fields with value_type `measured`, so a measured quantity can be traced to its lab attestation.
base_attestation_ref string Reference to the base measured attestation from which this value was derived by simulation, extended photometry, or scaling.
simulation_tool string Name and version of the optical simulation tool, when method is `optical_simulation`.
extension_method string The specific extension rule applied, when method is `extended_photometry` or `scaled`.

FileReference

Reference to a source file by filename, optional URL, and mandatory SHA-256 content hash. The hash is the integrity anchor; URLs may rot.

Field Type and description
filename required string
url string format uri
sha256 required string pattern
revision_label string
revision_date string format date