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 |
No field matches that filter.