Product overview¶
D-MSSM is the Daily Medium-resolution Gap-filled Surface Soil Moisture product. It fuses data from SMAP, CYGNSS, Spire GNSS-R, and SMOS, then applies a machine-learning gap-filling algorithm to produce seamless daily global coverage.

Figure 1:D-MSSM surface soil moisture over Mexico, 30 August 2025. Values in m³/m³.
| Property | Value |
|---|---|
| Spatial resolution | 6 km (0.054° grid spacing) |
| Data level | L4 |
| Temporal coverage | May 2015–present (CCI-calibrated historical data back to 1978) |
| Coverage | Global |
| Unit | m³/m³ |
Variants:
d-mssm— Standard product with ~4-day latencyd-mssm-nrt— Near-real-time product with ~1-day latency
Both variants share the same file structure and variable definitions. The feed field in API responses indicates the source tier ("standard" or "nrt").
NetCDF4 format¶
Global attributes¶
| Attribute | Description |
|---|---|
description | “Daily Medium-Resolution Gap-Filled Surface Soil Moisture” (May 2015–present) or “ESACCI-Combined Calibrated Historical Surface Soil Moisture” (1978–April 2015) |
creator | SPIRE GLOBAL |
processing_center | Spire EILAND |
file_created_time_utc | UTC time when the file was created (may not be present in all files) |
data_level | L4 |
source | MSSM vMA.mi (May 2015–present) or ESACCI-COMBINED resampled datacube version vMA.mi (1978–April 2015) |
input_data_version | Data release version of the input data (e.g. v04.01.98) |
release_tag | Data release version (e.g. v02.01.98) |
code_version | Code version (e.g. 0.0.1.dev1+gitd22744) (may not be present in all files) |
git_hash | Commit hash of the production code (may not be present in all files) |
grid_mapping | spatial_ref |
feed | Data tier: "standard" or "nrt" |
Variables¶
| Variable | Description | Dims | Type | Fill value | Scale factor | Unit |
|---|---|---|---|---|---|---|
d_mssm | Daily Medium-Resolution Gap-filled Surface Soil Moisture | (y, x) | uint8 | 255 | 0.005 | m³/m³ |
pflag | Processing flag — bit flags recording quality and retrieval status | (y, x) | uint8 | 255 | — | — |
qflag | Quality flag — bit flags recording surface conditions | (y, x) | uint8 | 255 | — | — |
aflag | Advisory flag — 0 = recommended, 1 = not recommended | (y, x) | uint8 | 255 | — | — |
data_source_am | Data source for MSSM morning product | (y, x) | uint8 | 255 | — | — |
data_source_pm | Data source for MSSM afternoon product | (y, x) | uint8 | 255 | — | — |
dai | Data Availability Index | (y, x) | uint8 | 255 | 0.01 | — |
y | Latitude coordinate | (y) | float64 | NaN | — | degrees_north |
x | Longitude coordinate | (x) | float64 | NaN | — | degrees_east |
spatial_ref | Coordinate reference system (WGS 84, EPSG:4326) | () | int64 | — | — | — |
Processing flag (pflag)¶
The pflag is stored as a uint8 with a fill value of 255. It encodes quality and retrieval status per grid point.
| Bit | Condition | Interpretation |
|---|---|---|
| 0 | Recommended quality | 0: retrieval has recommended quality; 1: not recommended quality |
| 1 | Retrieval successful | 0: retrieval was successful; 1: retrieval was not successful |
Recommended quality is determined from the qflag. If static and/or dynamic conditions are present, the retrieval is flagged as not recommended. The retrieval-successful state is determined from the dai; when dai = 0 (no input data available), no soil moisture is retrieved and pflag is set to 3 (not recommended + not successful).
Quality flag (qflag)¶
The qflag is stored as a uint8 with a fill value of 255. It encodes static and dynamic surface conditions that may affect data quality.
| Bit | Condition | Interpretation |
|---|---|---|
| 0 | Complex topography | 0: not present; 1: complex topography present |
| 1 | Urban area | 0: no urban area; 1: urban area detected |
| 2 | Water body | 0: no water body; 1: water body detected |
| 3 | Precipitation | 0: no/insignificant precipitation; 1: heavy precipitation detected |
| 4 | Snow and ice | 0: no/insignificant snow and ice; 1: high snow/ice amounts detected |
| 5 | Freeze/thaw | 0: no frozen ground; 1: frozen ground detected |
| 6 | Dense vegetation | 0: no dense vegetation; 1: dense vegetation detected (file attribute abbreviates this as “Vegetation”) |
Static conditions (complex topography, urban area, water bodies) do not change over time. Dynamic conditions (precipitation, snow/ice, freeze/thaw, dense vegetation) vary with each observation.
Sources of the static/dynamic conditions:
Complex topography: Derived from the SMAP ancillary surface flag, based on slope variability from a DEM within each 36 km grid cell. Slope standard deviation > 6.0° is flagged.
Urban areas: Derived from ESA CCI Land Cover data (300 m), downsampled to 6 km.
Water bodies: Derived from ESA CCI WaterBodies data (300 m), downsampled to 6 km.
Precipitation / Snow and ice: Propagated from the SMAP surface flag.
Freeze/thaw: Transmitted from the SMAP surface flag when SMAP data is available. When SMAP data is absent, a periodic climatological layer (one value per day of year per pixel) derived from the complete SMAP historical record (2015–2022) is used.
Dense vegetation: Derived as a periodic layer from the SMAP vegetation water content layer. Pixels are flagged when the average value exceeds 5 kg/m².
Aggregation rule: pflag for D-MSSM is the bitwise AND of the twice-daily pflag values; qflag is the bitwise OR.
Data source values¶
The data_source_am and data_source_pm variables identify the input data source for each pixel:
| Value | Meaning |
|---|---|
| 0 | Unmodified SMAP |
| 1 | Modified SMAP (smoothed at boundaries with GNSS-R data) |
| 2 | Single pixel tracks CYGNSS |
| 3 | Single pixel tracks Spire GNSS-R |
| 4 | Fused (GNSS-R tracks extended using a 3×3 window) |
| 5 | Gap-filled |
| 6 | Unmodified SMOS |
| 7 | Modified SMOS (smoothed at boundaries) |
| 255 | No data (fill value) |
Data Availability Index (dai)¶
The dai indicates how recently observed input data contributed to the gap-filled product. It is the daily average of twice-daily dai values. Higher values indicate more recent observations; dai = 0 means no input data was available, resulting in no retrieval (pflag = 3).
To convert: dai_physical = raw_value × 0.01.
Advisory flag (aflag)¶
The aflag simplifies masking:
0 — recommended quality (use the data)
1 — quality not recommended (mask this pixel)
GeoTIFF format¶
D-MSSM GeoTIFF files contain color-coded soil moisture values with no-data set to 255. Conditions that prevent soil moisture retrieval (urban areas, water bodies, freeze/thaw, snow/ice) are pre-masked. Each delivery includes a corresponding advisory flag GeoTIFF layer.
| Tag | Description |
|---|---|
creator | SPIRE GLOBAL |
code_version | Production code version |
data_level | L4 |
description | Product description |
file_created_time_utc | UTC creation timestamp |
git_hash | Production code commit hash |
input_data_version | Input data release version |
processing_center | Spire EILAND |
release_tag | Data release version |
short_name | D-MSSM (data layer) or AFLAG (advisory flag layer) |
source | Data source identifier |
units | m³/m³ (data layer) or — (flag layer) |
CRS | Coordinate Reference System |
CSV and GeoJSON format¶
CSV and GeoJSON files contain point time series at specific locations. The following variables are included:
| Variable | Description | Type | Fill value | Unit |
|---|---|---|---|---|
ref_local_time | Reference local time for each observation | datetime64[ns] | — | — |
d_mssm | Daily Medium-Resolution Gap-filled Surface Soil Moisture | float32 | NaN | m³/m³ |
dai | Data Availability Index | float32 | NaN | — |
pflag | Processing flag | float32 | NaN | — |
qflag | Quality flag | float32 | NaN | — |
aflag | Advisory flag | float32 | NaN | — |
data_source_am | Data source (morning) | float32 | NaN | — |
data_source_pm | Data source (afternoon) | float32 | NaN | — |
lat | Latitude | float64 | NaN | degrees |
lon | Longitude | float64 | NaN | degrees |
geometry | Point geometry (WKT format) | string | — | — |
JSON (point API) response¶
When queried via the /soil-moisture/point endpoint with format=JSON, the response has this structure. Note that the time field is returned as valid_time (not local_time as some older documentation may indicate):
{
"data": [
{
"location": {
"coordinates": {
"lat": 14.0,
"lon": 100.5
}
},
"times": {
"valid_time": "2026-02-10 12:00:00"
},
"values": {
"d_mssm": 0.325,
"pflag": 0.0,
"qflag": 0.0,
"data_source_am": 5.0,
"data_source_pm": 5.0,
"dai": 0.17,
"lat": 14.0,
"lon": 100.5,
"aflag": 0,
"feed": "standard"
}
}
],
"meta": {
"message": null
}
}