Skip to content

Harmonization levels

Sentinel-2 and Landsat measure slightly different wavelengths, and Sentinel-2’s stored integers changed meaning at processing baseline 04.00. The harmonize option says how much of that the API corrects. Schema v1 defines four ordered levels; each includes the ones before it.

Level Status What it does
none Available now No adjustment. DN output returns stored integers unchanged, including the +1,000 Sentinel-2 offset from baseline 04.00 on. Reflectance output applies each product’s published conversion.
offset_removed Available now Sentinel-2 DN from baseline 04.00 on are shifted so every baseline shares DN = 10,000 × reflectance. DN output becomes int16 so negative values survive. Reflectance output equals none. Landsat is unchanged.
bandpass_adjusted Coming later offset_removed plus the HLS v2.0 linear coefficients, adjusted = a × MSI + b per platform, which map Sentinel-2 onto Landsat 8 OLI.
nbar Coming later Bandpass-adjusted and normalized to a nadir view. Only HLS supplies it in v1.

offset_removed is the default in POST /v1/process and the only level map tiles accept (?harmonize=offset_removed; others answer 422 harmonize-unavailable). Use it with units: "DN" when you want Sentinel-2 integers that mean the same thing on every baseline. Add clipNegative: true (process) or clamp: true (download API) to set below-zero values to zero, which matches Sentinel Hub’s harmonizeValues. See Values, scale and offset for the full set of options and the output types.

Without bandpass_adjusted, Sentinel-2 and Landsat reflectance are each correct for their own sensor but not adjusted to each other. For indices such as NDVI the difference is small; for band-by-band comparisons it can matter.

The HLS v2.0 coefficients cover Sentinel-2 coastal, blue, green, red, nir08, swir16 and swir22, per platform. Landsat OLI is the reference and is unchanged. For Sentinel-2C, for example, red uses a = 0.9718 and b = 0.0011, and nir08 uses a = 0.9995 and b = −0.0003.

The coefficients do not cover everything, and the API will say so instead of guessing: Sentinel-2D has no published coefficients, red-edge and broad NIR have none, and Landsat TM and ETM+ have no HLS transform. Those scenes and bands are returned at offset_removed and flagged per scene. Responses that combine scenes report the level each one received (scenes[].harmonization in process JSON, sdn:harmonization on items).

bandpass_adjusted will be the default on the cross-sensor optical-sr collection; offset_removed stays the default on native collections.

On optical-sr, nbar restricts the members to HLS. On any collection that has no NBAR source it fails with harmonize-unavailable.

Schema v1 lists the HLS coefficient column alignment as an open check to close before the schema is frozen. Until then, bandpass_adjusted values may change once, and the changelog will record it.