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 thetaxonomy enum they draw from, and value composites (provenanced numbers, dual-unit measurements, file references) are documented once underCommon types. The machine file is served at /schema/ulc.json. This page documents 547 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, including the two computed views (the conformance level and the Product Achievements themes) and the restricted-substances flag, is computed by the builder, never authored.
| Field | Type and description |
|---|---|
ulc_versionrequired | stringpatternThe ULC specification version this record conforms to. Required on every record. |
record_idrequired | stringmin length 3; patternStable identifier for this record. Convention: `<manufacturer-slug>-<catalog-slug>-<scenario-slug>` with lowercase ASCII and hyphens. By repository convention it matches the filename stem of the finished `.ulc` record. Must be unique within a manufacturer's namespace. |
record_statusrequired | RecordStatus (enum)Commercial lifecycle status of the product this record describes. |
record_status_as_of | stringformat dateCalendar date on which the record_status was last verified. ISO 8601 date (YYYY-MM-DD). |
superseded_by | SupersessionReferencePointer to the successor product for a record whose product has been replaced by a newer SKU. Complements record_status: the `superseded` status token says the product was replaced, and this field names its replacement. The supersession fact is monotonic: set once when the supersession occurs and never retargeted, so it can appear but cannot go stale. A later record revision may add identifiers for the same successor (for example a record_id once the successor record is published). The pointer speaks for every configuration the record covers: the record, which can be narrower than the family, is its scope. |
discontinued_at | stringformat dateEffective calendar date on which the product's commercial availability ends or ended. ISO 8601 date (YYYY-MM-DD). Distinct from record_status_as_of, which records when the status was last verified, not when it took effect; the family-level counterpart introduced_at lives in product_family, while this date sits at the record envelope beside the record_status token it qualifies, because availability can end per configuration, not only per family. Recorded once, when the end of availability is fixed; unlike a lead time or a price, it does not drift with the market. Precedent: GDSN carries a discontinuation date inside the master trade-item record. When present, the date speaks for every configuration the record covers: the record, which can be narrower than the family, is its scope. |
indexrequired | IndexDenormalized 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_familyrequired | ProductFamilyFamily-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. |
configurationrequired | ConfigurationThe specific photometric scenario this record represents. Identifies the tested axes and tested conditions that anchor the record's measurements. |
applicability | ApplicabilityDeclares 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 | ElectricalElectrical measurements and nominal values at the luminaire input. |
photometry | PhotometryPhotometric measurements including total luminous flux, intensity distribution summary, zonal lumens, beam and field angles, UGR, and BUG classification when applicable. |
colorimetry | ColorimetryColor measurements including nominal and measured CCT, Duv, CRI, and TM-30 color-rendition metrics. |
alpha_opic_metrics | AlphaOpicMetricsAlpha-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. |
color_tuning | ColorTuningPublished states and emitter channels beside the tested baseline. States reference the baseline by role and never repeat it. |
flicker_measurements | FlickerMeasurementsTemporal light artefact (TLA) measurements per LM-90-20 and metric values per CIE TN 006 and IEEE 1789. |
outdoor_classification | OutdoorClassificationOutdoor luminaire classification per TM-15 (LCS and BUG), applicable only to outdoor fixtures. |
exit_sign | ExitSignExit-sign dataset, present on records whose `product_family.primary_category` is `exit_sign` (categories a and c). Carries the legend, illumination mode and technology, geometry, directional indicators, and the mode-specific photometrics (face luminance, face illuminance, contrast ratio, tritium rated life, photoluminescent charging illuminance). Optional and additive: an identity-only sign record with an empty `exit_sign` block is schema-valid and grades incomplete. Internally illuminated signs are powered products that also author the `emergency` block; unpowered modes (externally illuminated, self-luminous, photoluminescent) carry their power story in `illumination_mode` alone. |
emergency | EmergencyEmergency-power dataset, authored by every product with an electrical emergency-power story: dedicated emergency luminaires (`primary_category: emergency_luminaire`), internally illuminated exit signs, combo exit/emergency units, and normal fixtures carrying a factory emergency-power option. `emergency_role` and `power_source` are required members. Not for UL 1994 photoluminescent egress-path-marking products, which are a different product class. See `exit_sign` for the sign half of a combo unit. |
operating_point | OperatingPointDeclared operating conditions at which measured values were taken (input voltage, ambient temperature, drive current). |
test_conditions | TestConditionsAdditional measurement-context metadata that qualifies attested values (stabilization method, nonstandard-condition flags, temperature monitoring point). |
instrumentation | InstrumentationEquipment and facility metadata for the laboratory that produced the measurements (goniometer type, photometric coordinate system, spectroradiometer). |
corrections_applied | CorrectionsAppliedCorrections applied during measurement or data reduction (self-absorption, stray light, spectral mismatch, f1' correction). |
uncertainty | UncertaintyReported measurement uncertainty values with coverage factor. |
thermal_derating | ThermalDeratingThermal performance curves relating case or ambient temperature to flux, efficacy, or color per LM-82-20. |
lumen_maintenance_package | array of LumenMaintenancePackageEntryPackage-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 | LumenMaintenanceLuminaireLuminaire-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 | ChromaticityShiftProjectionProjected chromaticity shift over luminaire life per TM-35. |
sustainability_declaration | SustainabilityDeclarationStructured sustainability attestation (Declare label and similar). Preserves the ingredient list, LBC Red List tier, expiration date, and document identifier. |
compatible_accessories | array of CompatibleAccessoryMechanical 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_filesrequired | array of SourceFilemin 0 itemsSource 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. The `source_files` key is part of the record envelope, so it is present on every record, but the array may be empty (`minItems` 0) for an incomplete record still being authored, and its entries are neither required nor graded. The graded core cutsheet item is the family-level pointer `product_family.cutsheet`; `source_files[]` is the integrity-tracked provenance manifest for whatever documents a record cites. |
attestations | array of AttestationExternal 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. |
media | array of MediaAssetPointer-only manifest of the visual assets that document this product: product photographs, application photographs, and dimensional drawings. Entries reference each asset by filename, IANA media type, and SHA-256 content hash; no image data is ever embedded. Deliberately separate from source_files: a media asset documents the product's appearance and geometry for presentation, while source_files names the documents a record derives data from, so a media entry can never become a provenance source for a measured value. |
ordering | OrderingHow the product is ordered, for products sold by length or assembled from sections: the grammar of ordering, never the numbers of a transaction. Carries the unit the product is sold as, the increments orders and field cuts obey, and the maximum continuous run, as the manufacturer's own ordering documentation publishes them. Lead times, stock levels, and prices are deliberately out of scope: those are transactional facts that belong to the sales channel, and a hash-anchored record would only ever preserve them stale. Values that hold across everything the record covers sit directly on the block; values that vary by configuration sit in declared_by_configuration rows scoped by order codes. |
extensions | ExtensionsTop-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_idrequired | stringpatternStable slug grouping all records from the same cutsheet. |
family_display_name | string |
family_description | string |
manufacturerrequired | object |
manufacturer.slugrequired | string |
manufacturer.display_namerequired | string |
manufacturer.parent_manufacturer_slug | stringOptional parent company slug when the manufacturer is a subsidiary (for example Vode is a subsidiary of Lumenpulse). |
catalog_line | string |
catalog_modelrequired | string |
cutsheet | 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. Sales markets are declared separately in `markets`. |
markets | array of Market (enum)Markets into which the product family is sold for evidence applicability. This authored sales-market declaration is distinct from `technical_region`, which describes an electrical configuration. |
mounting_types | array of MountingType (enum) |
environment_rating | EnvironmentRating (enum) |
shape | Shape (enum) |
orientation | Orientation (enum) |
shared_mechanical | object |
shared_mechanical.housing_material | HousingMaterial (enum) |
shared_mechanical.lens_material | LensMaterial (enum) |
shared_mechanical.reflector_material | stringMaterial 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 | stringpattern |
shared_mechanical.ik_rating | stringpattern |
shared_mechanical.ambient_operating_range | objectDeclared 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 | objectLuminaire 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 | DualUnitLengthOutside diameter of the luminaire for round fixtures. |
physical_dimensions.overall_length | DualUnitLengthOverall length for linear or rectangular fixtures. |
physical_dimensions.overall_width | DualUnitLengthOverall width for rectangular or non-round fixtures. |
physical_dimensions.overall_height | DualUnitLengthOverall height for pole-top, bollard, pendant, or wall-mount fixtures. For recessed fixtures, use recess_depth instead. For a pendant this is the luminaire body; suspension length is an order-code axis and belongs in `applicability`, not here. |
physical_dimensions.luminaire_mass | DualUnitMassMass 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 | DualUnitMassPerLengthPer-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 | DualUnitLengthWidth of the light-emitting lens or optical opening, when distinct from the overall luminaire width. |
physical_dimensions.ceiling_aperture | DualUnitLengthFor recessed fixtures, the diameter (or effective diameter) of the ceiling cut-out the fixture requires. |
physical_dimensions.recess_depth | DualUnitLengthFor recessed fixtures, the depth above the ceiling plane that the fixture housing occupies. |
physical_dimensions.accommodated_ceiling_thickness_range | objectFor 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 | DualUnitLengthLength of an attached connection cable (pre-installed pigtail or tether) if the cutsheet publishes it. |
physical_dimensions.driver_dimensions | objectOverall 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 | DualUnitAreaEffective 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 | objectFamily-level warranty summary as published on the cutsheet. |
shared_warranty.term_years | integermin 0 |
shared_warranty.term_basis | WarrantyTermBasis (enum)The commencement event the warranty term (term_years) runs from. Published terms of identical length differ materially in coverage depending on the basis, so it is carried explicitly rather than inferred. It qualifies term_years, the family's headline term; warranties with additional legs (for example a separate battery or finish term) describe those legs in scope. Absent when the cutsheet does not state a basis. |
shared_warranty.scope | string |
shared_warranty.conditions_reference | stringFree-text pointer to the warranty conditions (a document title, code, or URL as printed on the cutsheet). DEPRECATED: prefer conditions_document, which carries a filename and content hash, plus the revision date when the document states one, so the conditions travel with the term verifiably. Retained through the 1.x line under the additive-only compatibility commitment; removal is scheduled for v2.0.0. |
shared_warranty.conditions_document | FileReferenceReference to the manufacturer's published warranty-conditions document, by filename and content hash, carrying the revision label and date when the document states them. The document holds the exclusions, conditional extensions, and per-accessory variations that qualify term_years, so the conditions travel with the headline number instead of being lost. Preferred over the deprecated free-text conditions_reference. The same document may also appear in source_files; the two references are authored independently. |
customization_openness | array of CustomizationOpeningmin 1 itemAxes of this family the manufacturer states are open to requests beyond the published order-code menu, as printed on the cutsheet ('other color temperatures on request', a published modifications list) or as the manufacturer states directly. Declares OPENNESS ONLY: it never enumerates what the custom choices are, never implies price, lead time, minimum quantity, or that any specific request will be accepted, and never widens any record's applicability. A configuration obtained through such a request is outside the record's covered configuration range and inherits none of the record's measured values, derivations, or attestations, and consumers must never compose or extend an order code for one. An axis absent from this list is UNSTATED: never a stated refusal, and never an implied openness; only axes listed here may be presented as open. Family-scoped: authored identically in every record of the family. Tracked, not graded. |
shared_attestations | array of AttestationAttestations 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 | stringformat date |
end_of_life_program_url | stringformat 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_idrequired | stringIdentifier for the photometric scenario within the family. Typically a slug summarizing the tested axes. |
catalog_number | stringThe 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 | stringHuman-readable description of the tested scenario. |
tested_axes | objectAxes 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 | objectConditions 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 | stringReference 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 | stringOrder-code skeleton where `{AXIS}` placeholders mark axes covered by this record. Example: `AYAP-SR-{MOUNT}-HO-{CCT}-{CORD}-{FINISH}-{VOLT}-{OPTIONS}`. |
fixed_axes | objectOrder-code axes that must match a fixed value for this record to apply. |
covered_axes | objectOrder-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 objectCombinations that are orderable elsewhere in the family but not covered by this record. |
excluded_combinations[].axesrequired | object |
excluded_combinations[].reasonrequired | string |
applicable_sku_count_estimate | integermin 0Informational 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 |
|---|---|
valuesrequired | array of stringOrder-code values for this axis that share the record's photometry. |
rationalerequired | stringWhy these values share one record (for example `regulated driver renders voltage variance photometrically immaterial` or `finish is cosmetic`). |
derivation | DerivationRuleOptional derivation rule for values that are not photometrically identical to the baseline but derive from it by a disclosed method. |
excludes | array of stringValues 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 |
|---|---|
methodrequired | stringNamed derivation method. |
baseline_axis_value | string |
multiplier_table | objectKeyed multiplier table when the method produces values by multiplying a baseline. Keys are axis values, values are multipliers relative to the baseline. |
linear_rate | objectPer-unit rate for linear scaling (for example lumens per foot). |
linear_rate.value | number |
linear_rate.unit | string |
reference | stringCitation 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 |
power_factor_bound_operator | ComparisonOperator (enum)When present, states that power_factor is a declared bound rather than a specific measured value. Pairs with power_factor; for example gt with 0.9 records a published power factor above 0.9. Absence means the number is a point estimate. |
thd_percent | ProvenancedNumber |
thd_percent_bound_operator | ComparisonOperator (enum)When present, states that thd_percent is a declared bound rather than a specific measured value. Pairs with thd_percent; for example lt with 20 records a published THD below 20 percent. Absence means the number is a point estimate. |
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 | objectMinimum 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.minrequired | number0 to 100 |
dimming_range_percent.maxrequired | number0 to 100 |
dimming_curve | DimmingCurve (enum)Optional dim-command-to-output mapping (logarithmic or linear). Independent of `dimming_method`; populate when the cutsheet or driver datasheet publishes it. |
adaptive_lighting_modes | array of AdaptiveLightingMode (enum)Built-in adaptive control capabilities the luminaire provides (integrated photocell, motion sensing, scheduled dimming, networked control). Multiple values may apply. Populate when the driver protocol is controllable and the cutsheet declares these behaviors. |
control_gear_type | ControlGearType (enum) |
led_module_power_w | ProvenancedNumberOptional 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 | ProvenancedNumberOptional 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 | ProvenancedNumberThe 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) |
optical_radiation_band | OpticalRadiationBand (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 | ProvenancedNumberUnified 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)eq, lte, ltWhen 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. Only the upper-bound tokens `lte` and `lt` are meaningful for glare; the lower-bound tokens are not. Absence means the UGR value is a specific point estimate at the tested scenario. |
max_surface_luminance_cd_per_m2 | ProvenancedNumberMaximum luminance of a luminous surface, in cd/m2. A standards-native SI single-unit quantity with no Imperial companion, as for exit-sign face luminance. Used when the manufacturer declares a surface-luminance limit rather than a point measurement. |
max_surface_luminance_bound_operator | ComparisonOperator (enum)When present, pairs with max_surface_luminance_cd_per_m2 to express a declared bound, such as lt with 1600 for a surface luminance below 1600 cd/m2. Absence means the number is a point estimate. |
zonal_lumens | array of objectLuminous flux summed over zonal angle bands (for example 0-30, 0-40, 0-60, 0-90, 90-180 degrees). |
zonal_lumens[].zone_labelrequired | string |
zonal_lumens[].lumensrequired | ProvenancedNumber |
per_length_normalized | objectFor 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 objectManufacturer-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[].cctrequired | NominalCCT (enum) |
declared_by_cct[].lumens | ProvenancedNumber |
declared_by_cct[].efficacy_lm_per_w | ProvenancedNumber |
declared_by_length | array of objectManufacturer-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[].lengthrequired | 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 |
spectral_power_distribution | SpectralPowerDistributionUniformly sampled spectral power distribution behind the stated color values. Stated color values remain authoritative for this record; the spectrum carries the measurement from which they derive. |
cri_per_sample | array of objectOptional per-sample CIE 13 CRI values (R1 through R15). |
cri_per_sample[].sample_indexrequired | integer1 to 15 |
cri_per_sample[].valuerequired | ProvenancedNumber |
tm_30 | object |
tm_30.rf | ProvenancedNumber |
tm_30.rg | ProvenancedNumber |
tm_30.reference_illuminant_type | ReferenceIlluminantType (enum)TM-30 reference illuminant regime. Derivable by definition from the test-source CCT (the reference illuminant CCT equals the test-source CCT), so it is an explicitness/interop convenience rather than an independently authored value. |
tm_30.pvf_code | stringpatternPreference/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 objectTM-30 local color fidelity Rf,h per hue bin: one entry per bin, numbered 1 to 16. |
tm_30.rf_h_per_bin[].bin | integer1 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 | objectconst "d65"Reference illuminant for alpha-opic DER calculations. Per CIE S 026, always D65. |
standard_observer | objectconst "cie_1931_2_degree"Colorimetric observer used. Per CIE S 026, always the CIE 1931 2-degree standard observer. |
melanopic_der | ProvenancedNumberMelanopic Daylight Efficacy Ratio (MDER / gamma_mel,v,D65). Multiplied by photopic illuminance to compute MEDI (Melanopic Equivalent Daylight Illuminance). |
per_channel | array of objectAlpha-opic efficacy of luminous radiation per photoreceptor channel. |
per_channel[].channelrequired | AlphaOpicChannel (enum) |
per_channel[].efficacyrequired | 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[].metricrequired | FlickerMetric (enum) |
metrics[].value | ProvenancedNumber |
metrics[].bound_operator | ComparisonOperator (enum)eq, lte, ltUsed 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.brequired | integer0 to 5 |
bug_rating.urequired | integer0 to 5 |
bug_rating.grequired | integer0 to 5 |
outdoor_distribution_type | OutdoorDistributionType (enum) |
longitudinal_distribution_range | LongitudinalDistributionRange (enum) |
legacy_cutoff | LegacyCutoffClassification (enum) |
lcs_zonal_lumens | array of objectLuminous flux per LCS zone per TM-15. |
lcs_zonal_lumens[].zonerequired | string |
lcs_zonal_lumens[].lumensrequired | ProvenancedNumber |
ExitSign
The exit-sign product data for records whose primary_category is exit_sign (categories a and c). Every field is optional; grading, not schema, drives completeness, so an identity-only sign record with an empty exit_sign block is schema-valid. illumination_mode is the conditional driver for the sign profile (see ExitSignIlluminationMode). Legend geometry uses DualUnitLength (SI authoritative); code minimums such as the NFPA 101 / IBC 6-inch letter height live in field descriptions, not schema constraints, because ULC records what a product is and leaves conformance to the authority having jurisdiction.
| Field | Type and description |
|---|---|
illumination_mode | ExitSignIlluminationMode (enum)How the legend is illuminated; the sign profile's conditional driver. |
illumination_technology | ExitSignIlluminationTechnology (enum)The self-emitting technology within the illumination mode (descriptive granularity, not gated). |
legend_text | stringThe legend text, for example "EXIT". Free text so non-English legends are representable. |
legend_color | LegendColor (enum)Legend color; NFPA 101 and local codes govern the required color. |
legend_height | DualUnitLengthLetter height. Code context: NFPA 101 / IBC set a 6-inch (about 152 mm) minimum for illuminated signs; recorded here as product data, not as a conformance assertion. |
stroke_width | DualUnitLengthLegend stroke width. Code context: NFPA 101 / IBC set a minimum stroke (for example 3/4 inch, about 19 mm) for externally illuminated signs. |
letter_width | DualUnitLengthLegend letter width, an externally-illuminated-sign geometry detail (IBC 1013.6.1 context). |
letter_spacing | DualUnitLengthSpacing between legend letters, an externally-illuminated-sign geometry detail (IBC 1013.6.1 context). |
face_count | ExitSignFaceCount (enum)How many faces carry a legend. |
directional_indicator | array of ExitSignDirectionalIndicator (enum)Directional chevrons on the sign face (NFPA 101). Declare ["none"] explicitly when the sign carries no chevron; "none" is mutually exclusive with any real direction. |
rated_viewing_distance_ft | RatedViewingDistance (enum)The UL 924-marked rated viewing distance in feet (string bin, NominalCCT convention). Independent of letter height, never derived from it. |
sign_face_luminance_cd_per_m2 | ProvenancedNumberMeasured luminance of the illuminated legend face, in cd/m2. Primary photometric datum for photoluminescent and self-luminous signs (the study's roughly 0.06 fL floor); fL is not stored (SI authoritative). |
face_illuminance_lx | ProvenancedNumberIlluminance on the legend face for externally illuminated signs, in lux. Code context: the 5 fc figure is about 54 lx (IBC 1013.6.1 / NFPA 101). |
contrast_ratio | ProvenancedNumberLegend-to-background contrast ratio for externally illuminated signs (NFPA 101 context: at least 0.5). Unit "ratio". |
tritium_rated_life_years | numbermin 0Rated life of a self-luminous tritium sign, in years (catalog tier such as 10, 15, or 20; NRC 10 CFR 31.5 governs the sealed source and its disposal path). A bare number. |
min_charging_illuminance_lx | ProvenancedNumberMinimum ambient illuminance required to charge a photoluminescent sign, in lux (UL 924 context). |
Emergency
The emergency-power data for products with an electrical emergency-power story (UL 924 context). emergency_role and power_source are required members: the block is meaningless without them. Authored by dedicated emergency luminaires, internally illuminated exit signs, combo exit/emergency units, and normal fixtures with a factory emergency-power option. An externally-illuminated combo sign authors the block (its heads are battery-powered) but its face has no powered-face story, so power_source is not a core field for it and its battery depth surfaces as optional enrichment rather than a standard gate. Not for UL 1994 photoluminescent egress-path-marking products, which are a different product class.
| Field | Type and description |
|---|---|
emergency_rolerequired | EmergencyRole (enum)What emergency function this block describes (required). |
power_sourcerequired | EmergencyPowerSource (enum)How the product is energized during a utility power loss (required). |
battery_duration_min | ProvenancedNumberRated emergency run time on integral battery, in minutes (the code-anchored figure is 90 minutes, a rated value). |
battery_chemistry | BatteryChemistry (enum)Integral battery chemistry. |
self_test | EmergencySelfTestCapability (enum)Self-test capability class (UL 924 defines the required test cadence). |
emergency_lumen_output_lm | ProvenancedNumberDistinct emergency-mode luminous output, in lumens, for products whose emergency mode differs from their normal mode (combo and emergency-power-option units). |
emergency_input_power_w | ProvenancedNumberDistinct emergency-mode input power draw, in watts. |
remote_head_capacity | objectCapacity to drive remote emergency heads: how many heads and the total connected load. Optional and ungated (whether a unit supports remote heads is not derivable from other fields). |
remote_head_capacity.heads | integermin 0Number of remote heads supported. |
remote_head_capacity.total_load_w | numbermin 0Total connected remote-head load, in watts. |
photometry_reference | FileReferenceThe emergency-mode photometric file (IES), referenced by hash. May also appear in source_files[]. |
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 numberTemperature 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 | objectLuminaire 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 objectArray 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_yearsrequired | integer1 to 3 |
cie_97_lmf_table.lmf_by_cleanliness_and_interval[].ambient_cleanlinessrequired | AmbientCleanliness (enum) |
cie_97_lmf_table.lmf_by_cleanliness_and_interval[].lmfrequired | number0 to 1 |
cie_97_lmf_table.llmf_by_hours | array of objectLamp Lumen Maintenance Factor by operating hours. |
cie_97_lmf_table.llmf_by_hours[].hoursrequired | integer |
cie_97_lmf_table.llmf_by_hours[].llmf | number0 to 1 |
cie_97_lmf_table.llmf_by_hours[].lsf | number0 to 1 |
manufacturer_rated_claim | objectA manufacturer claim like `L70 > 50,000h` or `L80 > 60,000h`, with or without a cited method. The optional basis records whether the cutsheet calls the figure TM-21 reported (`tm_21_reported`), TM-21 calculated (`tm_21_calculated`), or states it with no method (`manufacturer_stated`). 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.basis | LumenMaintenanceClaimBasis (enum) |
manufacturer_rated_claim.failure_percent | ProvenancedNumberClaimed cumulative failure rate at the claimed hours (for example `0.1%` failure at 50,000 hours). |
additional_rated_claims | array of LumenMaintenanceClaimAdditional lumen-maintenance thresholds published beside the headline manufacturer_rated_claim. Each added claim carries its reported, calculated, or manufacturer-stated basis; the headline object retains its existing shape for readers that use it. |
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 | stringformat date |
expiration_date | stringformat date |
final_assembly_location | string |
life_expectancy_years | numbermin 0 |
end_of_life_options | array of string |
recyclable_percent | number0 to 100 |
ingredient_list | array of object |
ingredient_list[].material_namerequired | 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_numberrequired | string |
display_name | string |
description | string |
accessory_type | AccessoryType (enum) |
mass | DualUnitMass |
changes_photometry | booleandefault falseTrue 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 | booleandefault trueWhether 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 | stringFree-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_typerequired | SourceFileType (enum) |
referencerequired | FileReference |
photometry_format | PhotometryFormat (enum) |
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 | stringStable 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. |
programrequired | AttestationProgram (enum) |
status | AttestationStatus (enum) |
value_typerequired | RegulatoryValueType (enum) |
issued_date | stringformat date |
valid_until | stringformat date |
listing_number | string |
test_laboratory | string |
test_report_id | string |
standard_revision | string |
list_date | stringformat datePublication date of the substance/candidate list revision a list-versioned badge was assessed against (for example a REACH SVHC candidate list update, a California Prop 65 list revision, or a conflict-minerals 3TG reporting period). Optional; pairs with `list_version` to make a list claim precise without exposing the list text. |
list_version | stringVersion or revision label of the substance/candidate list a list-versioned badge was assessed against (for example the REACH SVHC candidate list revision identifier). Optional. |
measured_quantities | array of stringJSON paths of ULC fields this attestation covers. Each covered field's `provenance.attestation_ref` is expected to reference this attestation's `attestation_id`. |
applicability | objectOrder-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 | objectFor case-by-case attestations (BAA, BABA, and similar), declares that manufacturer confirmation is required before a consumer can propagate the claim downstream. |
verification.typerequired | AttestationVerificationType (enum) |
verification.contact_reference | string |
verification.notes | string |
source_document_ref | FileReference |
issuing_authority | stringNamed operator of the program, for programs run by more than one operator (for example the several EPD program operators). Optional descriptive data; it never affects the computed achievement state. |
domestic_content | DomesticContentPayloadOptional cost-share evidence behind a domestic-content attestation, such as baa, baba, or american_iron_and_steel. The payload inherits the attestation's status, evidence, applicability, and expiry. It does not itself determine whether the program's threshold is met. |
sustainability_metric | objectOptional quantitative payload for a sustainability attestation, hanging off the attestation so the numbers inherit its status, evidence, and expiry. `ceam_score` is the TM66 CEAM design score (0 to 4). `embodied_carbon_kgco2e` is a declared embodied-carbon figure; when it is present, `embodied_carbon_scope` and `embodied_carbon_functional_unit` are required so the number is never ambiguous about its life-cycle boundary or its declared unit. `c2c_overall_level` carries a Cradle to Cradle overall rating. `method_variant` records a regional or method sub-variant (for example a TM65 national annex such as TM65NA). |
sustainability_metric.ceam_score | number0 to 4 |
sustainability_metric.embodied_carbon_kgco2e | numberDeclared embodied-carbon figure in kilograms of CO2 equivalent (kg CO2e). Standards-native single-unit exception to the dual-unit rule: EPD / ISO 14025, TM65, and TM66 publish embodied carbon in kg CO2e only, with no Imperial companion used in life-cycle-assessment practice, so ULC records it SI-native (the same treatment as the cd/m2 luminance and LM-82 Celsius exceptions). The required embodied_carbon_scope and embodied_carbon_functional_unit fix the life-cycle boundary and the declared unit basis, so the single number is unambiguous. |
sustainability_metric.embodied_carbon_scope | EmbodiedCarbonScope (enum) |
sustainability_metric.embodied_carbon_functional_unit | string |
sustainability_metric.c2c_overall_level | CircularityTier (enum) |
sustainability_metric.method_variant | string |
Extensions
Escape hatch for values outside the core schema. Treated as informational by validators.
| Field | Type and description |
|---|---|
manufacturer_specific | objectVendor-specific fields keyed by manufacturer slug. |
experimental | objectFields under active review for promotion into the main schema. |
AchievementTheme
One theme's computed state inside `index.achievements.themes`. GENERATED, NOT HAND-AUTHORED. `state` is the theme's achievement state. `programs` lists the qualifying AttestationProgram tokens found in the ledger for this theme, deduplicated and sorted. `source_attestation_ids` lists the `attestation_id` values of contributing attestations (best-effort, since `attestation_id` is optional on an attestation). `evidence_present` is true when at least one contributing attestation carries an attached, non-disqualified evidence document. `best_metric_ref` names the `attestation_id` whose `sustainability_metric` best represents the theme; it is omitted when no qualifying metric exists.
| Field | Type and description |
|---|---|
staterequired | AchievementState (enum) |
programsrequired | array of AttestationProgram (enum) |
source_attestation_idsrequired | array of string |
evidence_presentrequired | boolean |
best_metric_ref | string |
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-generatedrequired | objectconst trueMarker 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_versionrequired | stringpatternSemver of the builder that produced this index. Consumers compare against the current builder version to detect stale indices. |
conformance_levelrequired | ConformanceLevel (enum)The conformance grade this record achieves: one of the three grades (core, standard, full) or the incomplete floor. 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-site products require BUG at standard, and so on) and stamps it here like every other index value. `incomplete` is the floor, below core: a record that has not yet met a core requirement. Because it is a builder projection, a hand-tampered value fails the build-parity check just like any other index field, so the grade a record claims is the grade its data actually achieves. |
manufacturer_slugrequired | string |
catalog_modelrequired | string |
catalog_number | string |
display_name | string |
primary_category | 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) |
cct_range_low_k | numberGenerated low-end CCT of the published white range. Present with cct_range_high_k only when both ends resolve, including the referenced baseline. |
cct_range_high_k | numberGenerated high-end CCT of the published white range. Resolve each state from its nominal bin first, otherwise its measured_cct_k value. |
nominal_total_lumens | numbermin 0 |
nominal_input_power_w | numbermin 0 |
nominal_cri_ra | number0 to 100 |
nominal_efficacy_lm_per_w | numbermin 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 | stringpattern |
ik_rating | stringpattern |
bug_rating | stringpatternShort 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 stringOptional 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, TM-27 spectral files, ULD, GLDF, and manufacturer data exports) exist for this record without walking the full `source_files` array. |
achievementsrequired | objectProduct Achievements view: per-theme third-party program qualifications computed from the record's Master Ledger, orthogonal to `conformance_level`. GENERATED, NOT HAND-AUTHORED. `themes` carries seven fixed theme keys, of which six are `required`, each an AchievementTheme; the container is open (no `additionalProperties` bar) so future themes add without breaking consumers. `documented_count` is the factual count of themes at the `documented` state; it is the only sanctioned rollup, and there is deliberately no weighted or overall achievement grade. |
achievements.themesrequired | objectThe seven fixed achievement themes, all emitted by the reference builder. |
achievements.themes.embodied_carbonrequired | AchievementTheme |
achievements.themes.circularityrequired | AchievementTheme |
achievements.themes.material_healthrequired | AchievementTheme |
achievements.themes.energyrequired | AchievementTheme |
achievements.themes.dark_skyrequired | AchievementTheme |
achievements.themes.emergencyrequired | AchievementTheme |
achievements.themes.domestic_content | AchievementTheme |
achievements.documented_countrequired | integermin 0 |
restricted_substances_declaredrequired | array of AttestationProgram (enum)Restricted-substances programs declared anywhere in the record's Master Ledger (RoHS, REACH, Prop 65, and similar). GENERATED, NOT HAND-AUTHORED. Deduplicated and sorted. Surfaced as a compliance flag beside achievements, never inside them: restricted-substances compliance is a legal floor, not a prestige achievement. An empty array means nothing was declared. |
ColorState
Published luminaire color state
| Field | Type and description |
|---|---|
state_idrequired | stringpattern |
rolerequired | ColorStateRole (enum) |
label | stringmin length 1 |
dim_level_percent | numbermax 100 |
colorimetryrequired | object |
alpha_opic_metrics | AlphaOpicMetrics |
lumens | ProvenancedNumber |
efficacy_lm_per_w | ProvenancedNumber |
ColorTuning
The top-level measurement blocks remain the tested baseline. Only other luminaire states appear in states. End roles occur at most once, counting the referenced baseline.
| Field | Type and description |
|---|---|
baseline_rolerequired | ColorStateRole (enum) |
baseline_label | stringmin length 1 |
baseline_dim_level_percent | numbermax 100 |
states | array of ColorStatemin 1 item |
channels | array of EmissionChannelmin 1 item |
CustomizationOpening
One axis the manufacturer states it will entertain requests on, beyond the published order-code menu. At most one entry per axis token, except `other`, which may repeat when each entry carries a distinct axis_label.
| Field | Type and description |
|---|---|
axisrequired | CustomizationAxis (enum)The axis stated open, from the CustomizationAxis vocabulary. The token names the axis, never any value on it. |
axis_label | stringmin length 1The manufacturer's own name for this axis. Required when axis is `other`; optional detail elsewhere, where it may carry the manufacturer's narrower name for the opening without changing which token facets. A name only: never a value list, and never a relabeling of a listed axis to evade its token. |
statement | stringmin length 1The manufacturer's own on-request wording (for example 'other color temperatures on request'). An attribution snippet, never a value list: authors MUST NOT enumerate available custom values, prices, lead times, or minimum quantities here. When the printed line itself enumerates values, the no-enumeration rule wins: cite the document via published_in_ref and omit or elide the enumerating clause. |
published_in_ref | stringmin length 1Filename of the document where this openness is published, with or without a transcribed statement, in the vocabulary of the record's source_files entries and product_family.cutsheet (the typical carrier). Present for openness printed on the sheet. A filename only; the validator does not resolve it, resolution against any one record's file manifest is a courtesy rather than a contract, and nothing checks that the named document carries the statement. Name only documents the manufacturer publishes or has cleared for reference: a non-public document's name can disclose more than the manufacturer intends. |
contact_reference | stringmin length 1Where a request on this axis is directed, as the manufacturer publishes or states it: a role or department routing the manufacturer already makes public, never a named individual's personal contact details. Carries the same meaning as attestation verification type requires_manufacturer_confirmation: the manufacturer confirms each request per project, and consumers must not propagate openness as an accepted request. A routing string, never a value list. |
DomesticContentPayload
Cost shares and the threshold used for a domestic-content claim. US and foreign cost shares should sum to 100 percent within the source's rounding precision; the schema constrains each share individually but does not check their sum. The threshold is the bar against which the attestation was judged, and threshold_effective_date names when that bar took effect. Meaningful for baa, baba, and american_iron_and_steel attestations; program applicability is not restricted by this schema.
| Field | Type and description |
|---|---|
us_cost_share_percentrequired | number0 to 100US share of the declared cost basis, from 0 to 100 percent. |
foreign_cost_share_percent | number0 to 100Foreign share of the declared cost basis, from 0 to 100 percent. With the US share, should sum to 100 percent within source rounding. |
threshold_percentrequired | number0 to 100Domestic-content percentage threshold used to judge the attestation. |
threshold_effective_date | stringformat dateDate on which the stated threshold took effect, when known. ISO 8601 date (YYYY-MM-DD). |
basisrequired | DomesticContentBasis (enum)Cost basis used to calculate the shares. |
provenance | Provenance |
EmissionChannel
Emission channel
| Field | Type and description |
|---|---|
channel_idrequired | stringpattern |
label | stringmin length 1 |
kindrequired | EmissionChannelKind (enum) |
peak_wavelength_nm | ProvenancedNumber |
lumens | ProvenancedNumber |
colorimetry | Colorimetry |
LumenMaintenanceClaim
One additional manufacturer-rated lumen-maintenance threshold with the basis of its hours figure.
| Field | Type and description |
|---|---|
claim_typerequired | FluxMaintenanceThreshold (enum) |
claimed_hoursrequired | ProvenancedNumber |
basisrequired | LumenMaintenanceClaimBasis (enum) |
failure_percent | ProvenancedNumber |
MediaAsset
One visual asset in the record's media manifest, referenced by content hash and never embedded. `role` states what the picture is for; `media_type` states what the bytes are; the two vocabularies are deliberately orthogonal. The role vocabulary maps one-to-one to GLDF's image types, so a crosswalk between the two formats is mechanical.
| Field | Type and description |
|---|---|
rolerequired | MediaRole (enum)What the asset is for: the product itself, the product in an installed context, a dimensioned technical drawing, or another visual described by the caption. |
referencerequired | FileReferenceThe asset file, by filename, optional URL, and mandatory SHA-256 content hash, like every other file reference in the record. |
media_typerequired | MediaType (enum)IANA media type of the referenced bytes. |
primary | booleanMarks the preferred asset for its role when a record carries several. At most one entry per role should set it true; consumers encountering more than one fall back to document order. |
alt_text | stringmin length 1Alternative text describing the asset for accessibility and non-visual consumers. |
caption | stringmin length 1Human-readable caption. For an asset with role `other`, the caption is what tells a consumer what the asset is. |
language | stringmin length 1BCP 47 language tag for a language-specific asset, such as a localized dimensional drawing. Two language versions of one drawing are two entries. |
width_px | integermin 1Pixel width of a raster asset. |
height_px | integermin 1Pixel height of a raster asset. |
size_bytes | integermin 1Size of the referenced file in bytes. |
rights | stringmin length 1Free-text usage-rights statement for the asset, as the manufacturer publishes it. |
credit | stringmin length 1Free-text attribution or credit line to display with the asset. |
extracted_from_ref | stringmin length 1Filename of the source_files entry this asset was extracted from, for an asset that originated inside a listed source document rather than as a standalone file. |
configuration_refs | array of stringOrder codes, in the vocabulary of configuration.catalog_number, of the specific covered configurations this asset depicts. Absent when the asset applies to everything the record's applicability block covers. |
Ordering
The grammar of how a linear or continuous-run product is ordered. These are invariant product facts printed on the family's ordering documentation: they change only when the product changes, so they belong in the durable record. Transactional facts never appear here. Each of the three length members lives in exactly one place: directly on this block when one value holds for everything the record covers, or in declared_by_configuration rows when the manufacturer publishes it per configuration (a maximum run that varies by output tier, a cut module that varies by color class). Carrying the same member in both places is an authoring error.
| Field | Type and description |
|---|---|
order_unit | OrderUnit (enum)The unit in which the product is sold, from the OrderUnit vocabulary. `cut_to_length_run` covers products ordered at a specified length; `fixed_length_section` covers discrete sections joined into runs on site. |
order_increment | DualUnitLengthThe granularity at which lengths may be ordered, when the manufacturer publishes one. Distinct from cut_increment: a product may be orderable to the inch while field cuts obey a coarser electrical module. Invariant across everything this record covers; per-configuration values live in declared_by_configuration rows instead. |
cut_increment | DualUnitLengthThe repeating module at which the product may be cut, as published: the spacing of marked cut points on a continuous product. Its presence states the product may be cut at this module; the record does not state who performs the cut, and its absence states nothing about cuttability. Invariant across everything this record covers; per-configuration values live in declared_by_configuration rows instead. |
max_continuous_run | DualUnitLengthThe maximum electrically continuous run the manufacturer publishes for the product. Distinct from any maximum orderable quantity: an order may comprise several runs, each within this limit. The value carries no statement of feed position or feed count, so consumers must not derive feed counts from it. Invariant across everything this record covers; per-configuration values live in declared_by_configuration rows instead. |
declared_by_configuration | array of OrderingRuleOrdering-grammar values the manufacturer publishes per configuration. Each row names the configurations it covers by order codes and carries the values that vary there. Rows carry only the varying members; rows carrying the same member must name disjoint configurations; a configuration matched by no row has no published value for that member, which means not published, never unconstrained. Unlike the photometric declared_by arrays, these rows carry published ordering facts, not values derived from a tested baseline. |
OrderingRule
Ordering-grammar values for the specific configurations the row names. A row must carry at least one value beside the configurations it names.
| Field | Type and description |
|---|---|
configuration_refsrequired | array of stringmin 1 itemOrder codes naming the configurations this row's values apply to: either a full catalog number, in the vocabulary of configuration.catalog_number, or a single option value as the applicability block's fixed_axes and covered_axes publish them, matched against that axis alone. An option value that appears in more than one of the record's published axes is ambiguous; use full catalog numbers there instead. Codes are never matched as substrings of a catalog number or of an option value. |
order_increment | DualUnitLengthOrder granularity for the named configurations. |
cut_increment | DualUnitLengthCut module for the named configurations. |
max_continuous_run | DualUnitLengthMaximum electrically continuous run for the named configurations. |
SpectralPowerDistribution
Uniformly sampled spectrum at the stated wavelength step. The final wavelength is wavelength_start_nm plus wavelength_step_nm times (the number of values minus one). For a digitized chart, the author resamples the curve to this step and uses source_kind digitized_chart, so consumers can distinguish values read from a drawing from a laboratory table. A package-level curve is not luminaire evidence unless measured_through_optics is true. Stated color values remain authoritative for the record; this spectrum is the measurement from which they derive. A measured spectrum carries provenance with attestation_ref, as every measured value in the record does.
| Field | Type and description |
|---|---|
wavelength_start_nmrequired | numberWavelength of the first value in nanometers. |
wavelength_step_nmrequired | numberPositive wavelength interval between consecutive values in nanometers. |
valuesrequired | array of numbermin 2 itemsSpectral values ordered by ascending wavelength, one per stated step. |
unitrequired | SpectralPowerUnit (enum)Spectral power per wavelength interval, or a relative spectrum. |
value_typerequired | RegulatoryValueType (enum) |
provenance | Provenance |
source_kindrequired | SpdSourceKind (enum) |
measured_through_optics | booleanTrue when measured through the luminaire optics, for example in a luminaire-level sphere or goniometer measurement; false for an LED-package curve. |
SupersessionReference
Names the successor product of a superseded record. At least one of record_id (when the successor has a published ULC record), catalog_number (the successor's order code, for SKU-precise supersession), or catalog_model (the successor's family model) is required; carrying several is valid and preferred as the successor's identity firms up. record_sha256 optionally pins the exact successor record revision by content hash and is only meaningful alongside record_id.
| Field | Type and description |
|---|---|
record_id | stringmin length 3; patternThe successor record's record_id, using the same slug convention as the top-level record_id. Typically, though not necessarily, within the same manufacturer's namespace: a successor published under a parent or sibling brand is valid. |
record_sha256 | stringmin length 64; patternSHA-256 content hash of the successor record file bytes as published, pinning the exact successor revision this pointer was authored against. Requires record_id. A republished successor (including an index re-stamp) changes this hash, so a mismatch means the successor moved to a newer revision, not that content was tampered with. This is a record-to-record pin, not a source-file reference: it is not part of the source-file hash verification walk. |
catalog_number | stringmin length 1The successor's specific manufacturer-assigned catalog number or order code, in the same vocabulary as configuration.catalog_number. The slot for SKU-precise supersession, matching the record_status `superseded` token's own definition (replaced by a newer SKU). |
catalog_model | stringmin length 1The successor's catalog model (family-level identity), in the same vocabulary as product_family.catalog_model. The slot for family-level supersession, or for a successor whose exact order code is not yet assigned or published. |
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 |
|---|---|
valuerequired | number |
unit | string |
value_typerequired | 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 |
|---|---|
mmrequired | numbermin 0 |
inrequired | numbermin 0 |
value_type | RegulatoryValueType (enum) |
provenance | Provenance |
DualUnitMass
Mass value with mandatory SI (kg) and Imperial (lb) representations.
| Field | Type and description |
|---|---|
kgrequired | numbermin 0 |
lbrequired | numbermin 0 |
value_type | RegulatoryValueType (enum) |
provenance | Provenance |
DualUnitTemperature
Temperature value with mandatory Celsius and Fahrenheit representations.
| Field | Type and description |
|---|---|
crequired | number |
frequired | 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 |
|---|---|
m2required | numbermin 0 |
ft2required | numbermin 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_mrequired | numbermin 0 |
lb_per_ftrequired | numbermin 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 |
|---|---|
sourcerequired | ProvenanceSource (enum)Origin of the value. |
methodrequired | ProvenanceMethod (enum)How the value was produced from its source. |
confidence | number0 to 1Optional confidence score in the range [0, 1] when the value was inferred or extracted with uncertainty. |
conflict_notes | stringOptional note recording a disagreement between two sources for the same value. |
attestation_ref | stringReference 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 | stringReference to the base measured attestation from which this value was derived by simulation, extended photometry, or scaling. |
simulation_tool | stringName and version of the optical simulation tool, when method is `optical_simulation`. |
extension_method | stringThe 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 |
|---|---|
filenamerequired | string |
url | stringformat uri |
sha256required | stringpattern |
revision_label | string |
revision_date | stringformat date |
No field matches that filter.