# OCO dashboard live data: a guide for people and AI agents

Daily 1° global maps and daily regional means of XCO₂ and solar-induced fluorescence (SIF) from OCO-2, OCO-3, and TROPOMI: the data behind the [OCO dashboard](https://oco-sac.caltech.edu/apps/oco-dashboard/). This guide is written with every build of the data, so its dates, variables, and URLs are the data's own. It describes build `20261112T184545.033401Z-5024`, made 2026-11-12 18:46 UTC.

> **Live data, not a citable release: it is rebuilt as satellite files arrive, so a day's values change when a late or replacement input file arrives, and the layout may change with the software. To cite results, cite the source datasets.** They're listed under [Sources](#sources).

## What's here

| Data | Daily maps | Days with data | First day | Last day |
|---|---|---:|---|---|
| OCO-2 XCO₂ | `oco2_daily.zarr` (101 MB) | 604 | 2025-01-01 | 2026-09-30 |
| OCO-2 SIF | `oco2_daily.zarr` (101 MB) | 598 | 2025-01-01 | 2026-09-30 |
| OCO-3 XCO₂ | `oco3_daily.zarr` (65 MB) | 575 | 2025-01-01 | 2026-09-30 |
| OCO-3 SIF | `oco3_daily.zarr` (65 MB) | 613 | 2025-01-01 | 2026-11-10 |
| TROPOMI SIF | `tropomi_daily.zarr` (259 MB) | 307 | 2026-01-01 | 2026-11-09 |

Each instrument's XCO₂ and SIF share its store. Every instrument also has daily means by region (TransCom-3 regions, all land, all ocean, global, and 10° latitude bands) as small Parquet files. Also NOAA's surface-flask CO₂, monthly by region (release 2026-07-17, 2014-01 to 2025-12), for comparison. And GISS's GISTEMP surface-temperature anomaly, monthly by region (release 2026-10-22, 1880-01 to 2026-09).

## Where the data is

Paths here are relative to the newest build:

    https://oco-sac.caltech.edu/live/oco-dashboard/current/

It moves to each new build as data arrives, possibly while you read. For reads that must agree with each other, use this build's own URL, which never changes and stays for at least a day after a newer build replaces it:

    https://oco-sac.caltech.edu/live/oco-dashboard/generations/20261112T184545.033401Z-5024/

| Path | Contents | Format |
|---|---|---|
| `AGENTS.md` | this guide | Markdown |
| `catalog.json` | a STAC catalog of everything below | STAC 1.1, static, relative links |
| `<instrument>_daily.zarr` | daily 1° maps: `oco2_daily.zarr`, `oco3_daily.zarr`, `tropomi_daily.zarr` | Zarr v2, consolidated metadata |
| `ts/<instrument>/<variable>/<region>.parquet` | daily regional means | Parquet |
| `ts/<instrument>/qa.parquet, fit.parquet` | daily retrieval diagnostics (OCO only) | Parquet |
| `calendar.json` | OCO-2 orbits and good soundings per day | JSON, one array per column |
| `ts/noaa/co2.parquet` | NOAA surface-flask CO₂, monthly by region | Parquet |
| `regional_temp.json` | GISTEMP surface-temperature anomaly, monthly by region | JSON |
| `inputs.csv` | the input file behind each day of each product, and whether it's preliminary | CSV |
| `build.json` | how the build was made, and the input file of every day | JSON |

To browse the catalog: https://oco-sac.caltech.edu/browser/external/https://oco-sac.caltech.edu/live/oco-dashboard/current/catalog.json

The server doesn't list directories: find files through `catalog.json`, a store's `.zmetadata`, or the tables in this guide. Files are served with CORS and HTTP range requests, so browsers and cloud-native readers can read them directly. The other files in a build (`meta.json`, `timeseries_meta.json`, `regional/`, `dashboard-config.js`) are the dashboard app's own and may change without notice.

## Python examples

They run as written, in order (the build's tests run them). Install:

    pip install xarray zarr fsspec aiohttp pandas pyarrow pystac

Open an instrument's daily maps (reads only the metadata):

```python
import pandas as pd
import xarray as xr

BASE = "https://oco-sac.caltech.edu/live/oco-dashboard/current"
maps = xr.open_zarr(f"{BASE}/oco2_daily.zarr", consolidated=True)
print(maps["xco2"])
```

One day's map (one small request):

```python
day = maps["xco2"].sel(time="2026-09-30")
print(int(day.count()), "cells have data; their mean is", float(day.mean()), "ppm")
```

A month's daily means over a box, each cell weighted by its soundings. Latitudes run north to south, so select them as `slice(north, south)`:

```python
box = maps[["xco2", "xco2_n"]].sel(
    time=slice("2026-09-01", "2026-09-30"), lat=slice(50, 25), lon=slice(-125, -65)
)
weights = box["xco2_n"].fillna(0)
daily = box["xco2"].weighted(weights).mean(["lat", "lon"])
print(daily.dropna("time").to_series())
```

A regional time series (days are counted from 2014-01-01):

```python
series = pd.read_parquet(f"{BASE}/ts/oco2/xco2/global.parquet")
series["date"] = pd.Timestamp("2014-01-01") + pd.to_timedelta(series["t"], unit="D")
print(series[series["category"] == "all"].tail())
```

NOAA's surface CO₂ for a region (monthly; a month is dated to its 15th):

```python
surface = pd.read_parquet(f"{BASE}/ts/noaa/co2.parquet")
surface["date"] = pd.Timestamp("2014-01-01") + pd.to_timedelta(surface["t"], unit="D")
print(surface[surface["region"] == "global"].tail())
```

GISTEMP's surface-temperature anomaly for a region (K, monthly):

```python
import json
import urllib.request

with urllib.request.urlopen(f"{BASE}/regional_temp.json") as response:
    temperature = json.load(response)
rows = next(r for r in temperature["regions"] if r["id"] == "global")["rows"]
anomaly = pd.DataFrame(rows, columns=temperature["columns"])
anomaly["date"] = pd.Timestamp("2014-01-01") + pd.to_timedelta(anomaly["t"], unit="D")
print(anomaly.tail())
```

Where each day came from, and which days are still preliminary:

```python
days = pd.read_csv(f"{BASE}/inputs.csv")
print(days.groupby(["product", "dataset", "preliminary"])["day"].agg(["count", "min", "max"]))
```

Everything, through the STAC catalog:

```python
import pystac

catalog = pystac.Catalog.from_file(f"{BASE}/catalog.json")
for collection in catalog.get_collections():
    print(collection.id, "-", collection.title)
```

Which input file made a day:

```python
import json
import urllib.request

with urllib.request.urlopen(f"{BASE}/build.json") as response:
    build = json.load(response)
print(build["inputs"]["oco2-xco2"]["2026-09-30"])
```

Any Zarr v2 and Parquet reader works the same way over HTTP, e.g. Zarr.jl and Parquet2.jl in Julia, or GDAL's Zarr driver.

## Daily maps

- **Grid:** 180 × 360 cells of 1°. `lat` runs from 89.5 to -89.5 (north to south) and `lon` from -179.5 to 179.5: cell centres.
- **Time:** `time` is the UTC day, stored as days since 2014-01-01 (xarray decodes it to dates). The axis is allocated from 2014-01-01 to 2031-01-01, so it never grows; days without data are all NaN. Their chunks don't exist: the server answers 404, which Zarr reads as empty.
- **Chunks:** one per day per variable. Reading one day of one variable is one small request; a long time series at one place reads one chunk per day.
- **Method:** each day is gridded on its own with SatelliteGridding.jl (`grid_l2`). A footprint that crosses cell edges is split into sub-pixels, so a sounding counts in each cell it overlaps, in proportion to the overlap.

For each variable `v`:

- `v`: the mean of the soundings in the cell, each weighted by the share of its footprint that falls in the cell; NaN where there are none.
- `v_n`: how many soundings make the mean, as the sum of those shares, rounded; -1 (NaN in xarray) where there are none.
- `v_sem`: the standard error of the mean.

### OCO-2: `oco2_daily.zarr`

| Variable | Made from (input variable) | Soundings used | Units |
|---|---|---|---|
| `xco2` | `xco2`: Bias-corrected XCO2 on X2007 scale | xco2_quality_flag == 0 | ppm |
| `xco2_unc` | `xco2_uncertainty`: XCO2_Posterior_Error | xco2_quality_flag == 0 | ppm |
| `xco2_nd_land` | `xco2`: Bias-corrected XCO2 on X2007 scale | xco2_quality_flag == 0 and Sounding/operation_mode == 0 and Sounding/land_water_indicator == 0 | ppm |
| `xco2_unc_nd_land` | `xco2_uncertainty`: XCO2_Posterior_Error | xco2_quality_flag == 0 and Sounding/operation_mode == 0 and Sounding/land_water_indicator == 0 | ppm |
| `xco2_gl_land` | `xco2`: Bias-corrected XCO2 on X2007 scale | xco2_quality_flag == 0 and Sounding/operation_mode == 1 and Sounding/land_water_indicator == 0 | ppm |
| `xco2_unc_gl_land` | `xco2_uncertainty`: XCO2_Posterior_Error | xco2_quality_flag == 0 and Sounding/operation_mode == 1 and Sounding/land_water_indicator == 0 | ppm |
| `xco2_gl_ocean` | `xco2`: Bias-corrected XCO2 on X2007 scale | xco2_quality_flag == 0 and Sounding/operation_mode == 1 and Sounding/land_water_indicator == 1 | ppm |
| `xco2_unc_gl_ocean` | `xco2_uncertainty`: XCO2_Posterior_Error | xco2_quality_flag == 0 and Sounding/operation_mode == 1 and Sounding/land_water_indicator == 1 | ppm |
| `sifdaily` | `Daily_SIF_757nm`: Daily Corrected Solar Induced Fluorescence at 757 nm | Quality_Flag == 0 | W m-2 sr-1 um-1 |
| `sif757` | `Science/SIF_757nm`: Solar Induced Fluorescence at 757 nm | Quality_Flag == 0 | W m-2 sr-1 um-1 |
| `sif771` | `Science/SIF_771nm`: Solar Induced Fluorescence at 771 nm | Quality_Flag == 0 | W m-2 sr-1 um-1 |
| `sifdaily_nd_land` | `Daily_SIF_757nm`: Daily Corrected Solar Induced Fluorescence at 757 nm | Quality_Flag == 0 and Metadata/MeasurementMode == 0 and Science/sounding_land_fraction > 50 | W m-2 sr-1 um-1 |
| `sif757_nd_land` | `Science/SIF_757nm`: Solar Induced Fluorescence at 757 nm | Quality_Flag == 0 and Metadata/MeasurementMode == 0 and Science/sounding_land_fraction > 50 | W m-2 sr-1 um-1 |
| `sif771_nd_land` | `Science/SIF_771nm`: Solar Induced Fluorescence at 771 nm | Quality_Flag == 0 and Metadata/MeasurementMode == 0 and Science/sounding_land_fraction > 50 | W m-2 sr-1 um-1 |
| `sifdaily_gl_land` | `Daily_SIF_757nm`: Daily Corrected Solar Induced Fluorescence at 757 nm | Quality_Flag == 0 and Metadata/MeasurementMode == 1 and Science/sounding_land_fraction > 50 | W m-2 sr-1 um-1 |
| `sif757_gl_land` | `Science/SIF_757nm`: Solar Induced Fluorescence at 757 nm | Quality_Flag == 0 and Metadata/MeasurementMode == 1 and Science/sounding_land_fraction > 50 | W m-2 sr-1 um-1 |
| `sif771_gl_land` | `Science/SIF_771nm`: Solar Induced Fluorescence at 771 nm | Quality_Flag == 0 and Metadata/MeasurementMode == 1 and Science/sounding_land_fraction > 50 | W m-2 sr-1 um-1 |

What the input files say about these variables:

- `xco2`: Column-averaged dry-air mole fraction of CO2, including bias correction, on X2007 CO2 scale.XCO2_X2019 (in this file) contains the same information on the X2019 CO2 scale.
- `xco2_uncertainty`: This uncertainty is purely noise-driven and does not include most potential systematic errors
- `Daily_SIF_757nm`: Daily Corrected Solar induced chlorophyll fluorescence at 757 nm: Daily_SIF_757nm = /Science/sif_757nm * /Science/daily_correction_factor
- `Science/SIF_757nm`: Offset-Adjusted Solar Induced Chlorophyll Fluorescence at 757nm
- `Science/SIF_771nm`: Offset-Adjusted Solar Induced Chlorophyll Fluorescence at 771nm
- `xco2_quality_flag`: XCO2_Quality_Flag; 0=Good, 1=Bad
- `Sounding/operation_mode`: OCO-2 Operation Mode: 0=Nadir, 1=Glint, 2=Target, 3=Transition
- `Sounding/land_water_indicator`: Land Water Indicator; 0=Land;1=Ocean;2=Inland Water;3=Mixed
- `Quality_Flag`: Quality Control Flag; SIF Lite Quality Flag: 0 = best (passes quality control + cloud fraction = 0.0); 1 = good (passes quality control); 2 = bad (failed quality control); -1 = not investigated
- `Metadata/MeasurementMode`: Instrument Measurement Mode; Instrument Measurement Mode, 0=Nadir, 1=Glint, 2=Target, 3=AreaMap, 4=Transition; users might consider to separate these for analysis
- `Science/sounding_land_fraction`: Fractional Land Cover in Ground Footprint; Percentage of land surface type within the sounding

### OCO-3: `oco3_daily.zarr`

| Variable | Made from (input variable) | Soundings used | Units |
|---|---|---|---|
| `xco2` | `xco2`: Bias-corrected XCO2 on X2007 scale | xco2_quality_flag == 0 | ppm |
| `xco2_unc` | `xco2_uncertainty`: XCO2_Posterior_Error | xco2_quality_flag == 0 | ppm |
| `xco2_nd_land` | `xco2`: Bias-corrected XCO2 on X2007 scale | xco2_quality_flag == 0 and Sounding/operation_mode == 0 and Sounding/land_water_indicator == 0 | ppm |
| `xco2_unc_nd_land` | `xco2_uncertainty`: XCO2_Posterior_Error | xco2_quality_flag == 0 and Sounding/operation_mode == 0 and Sounding/land_water_indicator == 0 | ppm |
| `xco2_gl_land` | `xco2`: Bias-corrected XCO2 on X2007 scale | xco2_quality_flag == 0 and Sounding/operation_mode == 1 and Sounding/land_water_indicator == 0 | ppm |
| `xco2_unc_gl_land` | `xco2_uncertainty`: XCO2_Posterior_Error | xco2_quality_flag == 0 and Sounding/operation_mode == 1 and Sounding/land_water_indicator == 0 | ppm |
| `xco2_gl_ocean` | `xco2`: Bias-corrected XCO2 on X2007 scale | xco2_quality_flag == 0 and Sounding/operation_mode == 1 and Sounding/land_water_indicator == 1 | ppm |
| `xco2_unc_gl_ocean` | `xco2_uncertainty`: XCO2_Posterior_Error | xco2_quality_flag == 0 and Sounding/operation_mode == 1 and Sounding/land_water_indicator == 1 | ppm |
| `sifdaily` | `Daily_SIF_757nm`: Daily Corrected Solar Induced Fluorescence at 757 nm | Quality_Flag == 0 | W m-2 sr-1 um-1 |
| `sif757` | `Science/SIF_757nm`: Solar Induced Fluorescence at 757 nm | Quality_Flag == 0 | W m-2 sr-1 um-1 |
| `sif771` | `Science/SIF_771nm`: Solar Induced Fluorescence at 771 nm | Quality_Flag == 0 | W m-2 sr-1 um-1 |
| `sifdaily_nd_land` | `Daily_SIF_757nm`: Daily Corrected Solar Induced Fluorescence at 757 nm | Quality_Flag == 0 and Metadata/MeasurementMode == 0 and Science/sounding_land_fraction > 50 | W m-2 sr-1 um-1 |
| `sif757_nd_land` | `Science/SIF_757nm`: Solar Induced Fluorescence at 757 nm | Quality_Flag == 0 and Metadata/MeasurementMode == 0 and Science/sounding_land_fraction > 50 | W m-2 sr-1 um-1 |
| `sif771_nd_land` | `Science/SIF_771nm`: Solar Induced Fluorescence at 771 nm | Quality_Flag == 0 and Metadata/MeasurementMode == 0 and Science/sounding_land_fraction > 50 | W m-2 sr-1 um-1 |
| `sifdaily_gl_land` | `Daily_SIF_757nm`: Daily Corrected Solar Induced Fluorescence at 757 nm | Quality_Flag == 0 and Metadata/MeasurementMode == 1 and Science/sounding_land_fraction > 50 | W m-2 sr-1 um-1 |
| `sif757_gl_land` | `Science/SIF_757nm`: Solar Induced Fluorescence at 757 nm | Quality_Flag == 0 and Metadata/MeasurementMode == 1 and Science/sounding_land_fraction > 50 | W m-2 sr-1 um-1 |
| `sif771_gl_land` | `Science/SIF_771nm`: Solar Induced Fluorescence at 771 nm | Quality_Flag == 0 and Metadata/MeasurementMode == 1 and Science/sounding_land_fraction > 50 | W m-2 sr-1 um-1 |

What the input files say about these variables:

- `xco2`: Column-averaged dry-air mole fraction of CO2, including bias correction, on X2007 CO2 scale.XCO2_X2019 (in this file) contains the same information on the X2019 CO2 scale.
- `xco2_uncertainty`: This uncertainty is purely noise-driven and does not include most potential systematic errors
- `Daily_SIF_757nm`: Daily Corrected Solar induced chlorophyll fluorescence at 757 nm: Daily_SIF_757nm = /Science/sif_757nm * /Science/daily_correction_factor
- `Science/SIF_757nm`: Offset-Adjusted Solar Induced Chlorophyll Fluorescence at 757nm
- `Science/SIF_771nm`: Offset-Adjusted Solar Induced Chlorophyll Fluorescence at 771nm
- `xco2_quality_flag`: XCO2_Quality_Flag; 0=Good, 1=Bad
- `Sounding/operation_mode`: OCO-2 Operation Mode: 0=Nadir, 1=Glint, 2=Target, 3=Transition; OCO-3's files also have 4 = snapshot area map (SAM), as their L1b/operation_mode says
- `Sounding/land_water_indicator`: Land Water Indicator; 0=Land;1=Ocean;2=Inland Water;3=Mixed
- `Quality_Flag`: Quality Control Flag; SIF Lite Quality Flag: 0 = best (passes quality control + cloud fraction = 0.0); 1 = good (passes quality control); 2 = bad (failed quality control); -1 = not investigated
- `Metadata/MeasurementMode`: Instrument Measurement Mode; Instrument Measurement Mode, 0=Nadir, 1=Glint, 2=Target, 3=AreaMap, 4=Transition; users might consider to separate these for analysis
- `Science/sounding_land_fraction`: Fractional Land Cover in Ground Footprint; Percentage of land surface type within the sounding

### TROPOMI: `tropomi_daily.zarr`

| Variable | Made from (input variable) | Soundings used | Units |
|---|---|---|---|
| `sif_743` | `PRODUCT/SIF_743`: retrieved SIF@740 (743-758nm) | PRODUCT/SUPPORT_DATA/GEOLOCATIONS/solar_zenith_angle < 80 and -2 < PRODUCT/SIF_Corr_743 < 5 and PRODUCT/SIF_ERROR_743 < 10 | W m-2 sr-1 um-1 |
| `sif_743_corr` | `PRODUCT/SIF_Corr_743`: daylength-corr SIF@740 (743-758nm) | PRODUCT/SUPPORT_DATA/GEOLOCATIONS/solar_zenith_angle < 80 and -2 < PRODUCT/SIF_Corr_743 < 5 and PRODUCT/SIF_ERROR_743 < 10 | W m-2 sr-1 um-1 |
| `sif_743_err` | `PRODUCT/SIF_ERROR_743`: 1-sigma SIF retrieval error (743-758nm) | PRODUCT/SUPPORT_DATA/GEOLOCATIONS/solar_zenith_angle < 80 and -2 < PRODUCT/SIF_Corr_743 < 5 and PRODUCT/SIF_ERROR_743 < 10 | W m-2 sr-1 um-1 |
| `sif_735` | `PRODUCT/SIF_735`: retrieved SIF@740 (735-758nm) | PRODUCT/SUPPORT_DATA/GEOLOCATIONS/solar_zenith_angle < 80 and -2 < PRODUCT/SIF_Corr_743 < 5 and PRODUCT/SIF_ERROR_743 < 10 | W m-2 sr-1 um-1 |
| `sif_735_corr` | `PRODUCT/SIF_Corr_735`: daylength-corr SIF@740 (735-758nm) | PRODUCT/SUPPORT_DATA/GEOLOCATIONS/solar_zenith_angle < 80 and -2 < PRODUCT/SIF_Corr_743 < 5 and PRODUCT/SIF_ERROR_743 < 10 | W m-2 sr-1 um-1 |
| `cloud_fraction` | `PRODUCT/SUPPORT_DATA/INPUT_DATA/cloud_fraction_L2` | PRODUCT/SUPPORT_DATA/GEOLOCATIONS/solar_zenith_angle < 80 and -2 < PRODUCT/SIF_Corr_743 < 5 and PRODUCT/SIF_ERROR_743 < 10 | — |

What the input files say about these variables:

- `PRODUCT/SIF_Corr_743`: daylength-corr SIF@740 (743-758nm)
- `PRODUCT/SIF_ERROR_743`: 1-sigma SIF retrieval error (743-758nm)

## Regional time series

`ts/<instrument>/<variable>/<region>.parquet` has one row per day and category, sorted by day:

| Column | Type | Meaning |
|---|---|---|
| `t` | int16 | day: days since 2014-01-01 |
| `category` | string | which soundings: see the categories |
| `mean` | float32 | mean of the soundings in the region |
| `std` | float32 | their standard deviation |
| `n` | int32 | how many soundings |

- **OCO-2 and OCO-3:** computed from the input soundings directly: those with quality flag 0, in nadir or glint mode (OCO's target, transition, and OCO-3's snapshot-area modes oversample single sites and are left out). Over land means XCO2's land_water_indicator = 0 or SIF's sounding_land_fraction > 50; over ocean, land_water_indicator = 1.
- **TROPOMI:** computed from the daily maps: each cell's mean counts as many times as it has soundings (<variable>_n), so a region's mean is close to the mean of its soundings. One category, "all".

Categories:

| Category | Soundings |
|---|---|
| `all` | nadir and glint soundings, land and ocean |
| `nd_land` | nadir soundings over land |
| `gl_land` | glint soundings over land |
| `gl_ocean` | glint soundings over ocean (XCO2 only) |

Variables (units as in the maps; regions without data have no file):

| Instrument | Variable | Categories | Regions |
|---|---|---|---:|
| OCO-2 | `xco2` | all, nd_land, gl_land, gl_ocean | 43 |
| OCO-2 | `xco2_unc` | all, nd_land, gl_land, gl_ocean | 43 |
| OCO-2 | `sif757` | all, nd_land, gl_land | 43 |
| OCO-2 | `sif771` | all, nd_land, gl_land | 43 |
| OCO-2 | `sifdaily` | all, nd_land, gl_land | 43 |
| OCO-3 | `xco2` | all, nd_land, gl_land, gl_ocean | 37 |
| OCO-3 | `xco2_unc` | all, nd_land, gl_land, gl_ocean | 37 |
| OCO-3 | `sif757` | all, nd_land, gl_land | 37 |
| OCO-3 | `sif771` | all, nd_land, gl_land | 37 |
| OCO-3 | `sifdaily` | all, nd_land, gl_land | 37 |
| TROPOMI | `sif_743_corr` | all | 43 |
| TROPOMI | `sif_735_corr` | all | 43 |

Regions: TransCom-3 regions (CarbonTracker regions.nc), by each sounding's 1° cell; "land" and "ocean" are the land (1-11) and ocean (12-22) regions together, and "global" is every sounding.

| Region | Name | Kind |
|---|---|---|
| `global` | Global | all |
| `land` | All land | land |
| `ocean` | All ocean | ocean |
| `tc1` | North American Boreal | land |
| `tc2` | North American Temperate | land |
| `tc3` | South American Tropical | land |
| `tc4` | South American Temperate | land |
| `tc5` | Northern Africa | land |
| `tc6` | Southern Africa | land |
| `tc7` | Eurasia Boreal | land |
| `tc8` | Eurasia Temperate | land |
| `tc9` | Tropical Asia | land |
| `tc10` | Australia | land |
| `tc11` | Europe | land |
| `tc12` | North Pacific Temperate | ocean |
| `tc13` | West Pacific Tropical | ocean |
| `tc14` | East Pacific Tropical | ocean |
| `tc15` | South Pacific Temperate | ocean |
| `tc16` | Northern Ocean | ocean |
| `tc17` | North Atlantic Temperate | ocean |
| `tc18` | Atlantic Tropical | ocean |
| `tc19` | South Atlantic Temperate | ocean |
| `tc20` | Southern Ocean | ocean |
| `tc21` | Indian Tropical | ocean |
| `tc22` | South Indian Temperate | ocean |

Latitude bands (10° latitude bands, land and ocean): `lat0` (80–90°N) to `lat17` (80–90°S), north to south.

Also:

- `ts/<instrument>/fit.parquet`: Daily retrieval fit quality, columns t, metric, value, n. <band>_fp<k>_<stat>: the reduced chi-squared of band o2a, wco2, or sco2 for footprint k, as its mean, median (p50), or 90th percentile (p90), over soundings with quality flag 0.
- `ts/<instrument>/qa.parquet`: Daily corrections, columns t, metric, mean, n. xco2_biascorr: the mean bias correction applied to XCO2 (xco2 - Retrieval/xco2_raw, ppm). sif757corr_fp<k>_<lo>_<hi>: the mean SIF zero-level correction (SIF_Unadjusted_Relative_757nm - SIF_Relative_757nm) of footprint k, for continuum radiance between lo and hi.
- `calendar.json`: OCO-2's acquisition calendar, one array per column: t (days since 2014-01-01), orbits, nadir_valid, glint_valid, land_valid, ocean_valid. OCO-2 L2 Lite FP: distinct Sounding/orbit; soundings with xco2_quality_flag = 0 in nadir or glint mode, split by operation_mode (0, 1) and land_water_indicator (0, 1).

## NOAA surface CO₂

`ts/noaa/co2.parquet` has one row per month and region, for the dashboard's overlay:

| Column | Type | Meaning |
|---|---|---|
| `t` | int16 | month: days since 2014-01-01 to its 15th |
| `region` | string | global, land, ocean, or a TransCom region (tc1-tc22) |
| `mean` | float32 | mean of the sites' monthly means (ppm) |
| `std` | float32 | their standard deviation (ppm) |
| `n` | int32 | how many sites |

NOAA GML's monthly means at its fixed surface-flask sites, averaged per month over the sites in each region (a site's region is that of its 1° cell), from 2014. Sites whose event file gives no coordinates (the ship-based latitude bins) are left out. Surface CO2 is not column XCO2: its seasonal cycle is larger and its level offset, so compare seasonal cycles or growth, not levels.

This build uses NOAA's release 2026-07-17 (`noaa/co2_surface-flask/ccgg/2026/co2_surface-flask_ccgg_text.20260717.tar.gz`): 56 sites, 2014-01 to 2025-12, regions global, land, ocean, tc1, tc2, tc4, tc5, tc6, tc7, tc8, tc9, tc10, tc11, tc12, tc13, tc14, tc15, tc16, tc17, tc18, tc19, tc20, tc21, tc22. Left out for lack of coordinates: drp, poc000, pocn05, pocn10, pocn15, pocn20, pocn25, pocn30, pocs05, pocs10, pocs15, pocs20, pocs25, pocs30, pocs35, scsn03, scsn06, scsn09, scsn12, scsn15, scsn18, scsn21. NOAA's license: CC0-1.0. Cite it as: Lan, X., G. Petron, K. Baugh, A.M. Crotwell, M.J. Crotwell, S. DeVogel, M. Madronich, J. Mauss, T. Mefford, E. Moglia, S. Morris, J.W. Mund, A. Searle and J. Miller (2026), Atmospheric Carbon Dioxide Dry Air Mole Fractions from the NOAA GML Global Greenhouse Gas Reference Network, Carbon Cycle Cooperative Global Air Sampling Network: 1967 - Present, Version: 2026-07-17, https://doi.org/10.15138/wkgj-f215

## GISTEMP surface temperature

`regional_temp.json` has, for global, all land, all ocean, and each TransCom region (`regions`: `id`, `name`, `kind`, `rows`), one row per month: `[t, temp]`, `t` in days since 2014-01-01 to the month's 15th (negative before 2014), `temp` the anomaly in K. `metadata` says where it came from. Months with no data in a region are left out.

NASA GISS's GISTEMP v4 surface-temperature anomaly (1200 km-smoothed land and sea surface, 2°, monthly, relative to 1951-1980), averaged per month over each region's cells with data, weighted by cos(latitude). A cell's region is the 1° TransCom-3 mask's at its centre; global, all land, and all ocean too.

This build uses GISS's release of 2026-10-22 (`gistemp/1200km/v4/2026/gistemp1200_GHCNv4_ERSSTv5.20261022.nc`): 1880-01 to 2026-09. Cite it as GISS asks: GISTEMP Team, 2026: GISS Surface Temperature Analysis (GISTEMP), version 4. NASA Goddard Institute for Space Studies. Dataset accessed 2026-11-12 at https://data.giss.nasa.gov/gistemp/. Lenssen, N., G.A. Schmidt, M. Hendrickson, P. Jacobs, M. Menne, and R. Ruedy, 2024: A GISTEMPv4 observational uncertainty ensemble. J. Geophys. Res. Atmos., 129, no. 17, e2023JD040179, doi:10.1029/2023JD040179.

## Caveats

- **Most cells are empty on any one day.** The satellites see narrow swaths along their orbits, and clouds and quality filtering remove more. Average over days, weighting by `<variable>_n`, for fuller maps; the dashboard smooths over a window of days in the browser.
- **Days change.** A day is rebuilt when a late or replacement input file arrives, or when a preferred stream takes over (see [Sources](#sources)). A day without a usable input file has no data; files that couldn't be read are listed under `failed` in `build.json`.
- **One file per day.** A day's data is the soundings of the one input file named for that day.
- **Some recent days are preliminary:** OCO-2 SIF, 5 days (2025-05-16 to 2026-09-30); OCO-3 SIF, 39 days (2026-05-26 to 2026-11-10). They come from forward-processed files, which the final Lite files replace about five to six weeks after measurement, so their values will change. The `preliminary` column of `inputs.csv` lists them.
- **Combined maps and categories select differently.** OCO's combined map variables (`xco2`, `sif757`, ...) use every sounding that passes the quality filter, including target mode and OCO-3's snapshot-area mode, which oversample single sites. The category maps and the regional series use only nadir and glint soundings.
- **Instruments differ.** Their SIF is retrieved at different wavelengths (see the variables' descriptions), and their footprints and sampling differ, so compare them with care.
- **TROPOMI's SIF units.** The maps say W m-2 sr-1 um-1; TROPOMI's files say mW/m2/sr/nm, the same quantity.

## Sources

Cite these datasets; this live data has no DOI. The DOIs are the ones the input files state (forward-processed files state none). Which file made each day of each product, with its SHA-256: `inputs.csv`.

| Instrument | Dataset | Provider | Version (stream) | Status | Days used | First day | Last day | DOI |
|---|---|---|---|---|---:|---|---|---|
| OCO-2 | OCO2_L2_Lite_FP | NASA GES DISC | 11.3r | final | 604 | 2025-01-01 | 2026-09-30 | [10.5067/C4OENLFCYVSA](https://doi.org/10.5067/C4OENLFCYVSA) |
| OCO-2 | OCO2_L2_Lite_SIF | NASA GES DISC | 11.2r | final | 593 | 2025-01-01 | 2026-09-29 | [10.5067/8XXUQU7HBGBL](https://doi.org/10.5067/8XXUQU7HBGBL) |
| OCO-2 | OCO2_L2_Fwd_SIF | NASA GES DISC | 11.2 | **preliminary** | 5 | 2025-05-16 | 2026-09-30 | — |
| OCO-3 | OCO3_L2_Lite_FP | NASA GES DISC | 11r | final | 575 | 2025-01-01 | 2026-09-30 | [10.5067/8U0VGVQC7HZG](https://doi.org/10.5067/8U0VGVQC7HZG) |
| OCO-3 | OCO3_L2_Lite_SIF | NASA GES DISC | 11r | final | 574 | 2025-01-01 | 2026-09-29 | [10.5067/HC776J71KV41](https://doi.org/10.5067/HC776J71KV41) |
| OCO-3 | OCO3_L2_Fwd_SIF | NASA GES DISC | 11 | **preliminary** | 39 | 2026-05-26 | 2026-11-10 | — |
| TROPOMI | L2B_SIF___ | ESA S5P-PAL | pal | final | 307 | 2026-01-01 | 2026-11-09 | [ESA S5P-PAL](https://data-portal.s5p-pal.com) |
| Surface flasks | co2_surface-flask_ccgg | NOAA GML | 2026-07-17 | final | monthly | 2014-01 | 2025-12 | [10.15138/wkgj-f215](https://doi.org/10.15138/wkgj-f215) |
| Surface temperature | gistemp1200_GHCNv4_ERSSTv5 | NASA GISS | 2026-10-22 | final | monthly | 1880-01 | 2026-09 | [10.1029/2023JD040179](https://doi.org/10.1029/2023JD040179) (paper) |

A **preliminary** stream's files are forward-processed a few days after measurement, and replaced by the final Lite file for the day when it arrives, about five to six weeks later.

Where several versions have a day, the first listed wins: OCO-2 XCO₂: 11.3r, then 11.2r; OCO-2 SIF: 11r, then 11.2r, then 11.2; OCO-3 SIF: 11r, then 11.

## How it was made

- **What:** Operational port of OCO-SAC/OCO-dashboard @ dbe862c. OCO-2 and OCO-3 L2 Lite XCO2 and SIF (NASA GES DISC), one file per day by stream priority; for days without a Lite SIF file yet, the forward-processed (preliminary) SIF file, replaced when the Lite file arrives. TROPOMI S5P-PAL L2B SIF (ESA). Each day gridded on its own at 1° with SatelliteGridding.jl footprint oversampling (OCO also per observation mode × surface category); daily TransCom-3 regional and 10° latitude-band means from the soundings (TROPOMI from its grid). Plus NOAA GML surface-flask CO2 and NASA GISS GISTEMP v4 surface-temperature anomaly, monthly by region.
- **Software:** OCO-AppCenter `4469eb4a8d175295660009a25f4b492b1684c109`; SatelliteGridding.jl 0.1.0 (https://github.com/cfranken/SatelliteGridding@fc08897240bb0058dbf4cef7232889f7884f6899); Julia 1.12.7; Python packages oco-sac 0.1.0, numpy 2.5.4, pandas 3.1.0, xarray 2026.9.0, zarr 3.4.2, pyarrow 26.0.0, prefect 3.9.0.
- **Gridding:** the SatelliteGridding configs in OCO-AppCenter's `compute/configs/oco-dashboard/` at that commit, one per pass; their soundings and variables are in the map tables above.
- **Stream priority** (first wins each day): oco2-xco2: 11.3r, 11.2r; oco2-sif: 11r, 11.2r, 11.2; oco3-xco2: 11r; oco3-sif: 11r, 11; tropomi-sif: pal.
- **Made:** 2026-11-12 18:46 UTC, on host `7b8a7c0e3c69`, Prefect flow run `c5fd6a1c-db5c-4cf0-b9ed-6b5db82c0e90`.
- **Per day:** `inputs.csv` (product, day, stream, dataset, provider, preliminary, file, sha256); everything above and more in `build.json`'s `provenance`.

## About this build

- Build `20261112T184545.033401Z-5024`, made 2026-11-12 18:46 UTC by OCO-AppCenter code `4469eb4a8d175295660009a25f4b492b1684c109`. `build.json` records how: software versions, parameters, and the input file of every day (also as a table, `inputs.csv`).
- An operational port of the OCO dashboard prototype (OCO-SAC/OCO-dashboard @ dbe862c), gridded with SatelliteGridding.jl.
- OCO-SAC's published, citable data products are in its STAC API, https://oco-sac.caltech.edu/stac/ (to browse: https://oco-sac.caltech.edu/browser/).
- The dashboard: https://oco-sac.caltech.edu/apps/oco-dashboard/. This guide: https://oco-sac.caltech.edu/live/oco-dashboard/current/AGENTS.md.
