API Access
Access dataset files directly from scripts, code, or AI agents.
Browse dataset files
API Access
Access dataset files directly from scripts, code, or AI agents.
Each file has a stable URL (r-link) that you can use directly in scripts, apps, or AI agents. These URLs are permanent and safe to hardcode.
Start with these files — they give you everything you need to understand and access the dataset.
- 1. Fetch datapackage.json to inspect schema and resources
- 2. Download data resources listed in datapackage.json
- 3. Read README.md for full context
Data Views
The Keeling Curve — annual mean CO₂ at Mauna Loa
Monthly CO₂ and its deseasonalized trend
CO₂ is rising faster each decade (mean growth rate, ppm/yr)
Mean of NOAA annual growth rates per decade, Mauna Loa and global. The 1950s is a single year (1959) and the 2020s is partial; n_years in the resource gives the count.
Data Files
Explore with AIMonthly mean CO₂ at Mauna Loa
| Field | Type | Description |
|---|---|---|
| date | date | First day of the month the mean refers to (YYYY-MM-01). NOAA reports monthly values corrected to the centre of the month using the average seasonal cycle. |
| decimal_date | number | Mid-month date as a decimal year, as supplied by NOAA. |
| co2_ppm | number | Monthly mean CO₂ mole fraction in parts per million (ppm) of dry air. Missing months are filled by NOAA with an interpolated value (flagged by an empty std_dev / uncertainty). |
| co2_ppm_deseasonalized | number | The monthly mean with the average seasonal cycle removed (NOAA's 'deseasonalized' column; previously labelled 'trend'). |
| num_days | integer | Number of daily means used to compute the monthly mean. Empty where NOAA has no information (all data before May 1974, sourced from Scripps, and interpolated months). NOAA's -1 sentinel is normalised to an empty cell. |
| std_dev | number | Standard deviation of the daily means within the month (ppm). Empty where unknown; NOAA's -9.99 sentinel is normalised to an empty cell. |
| uncertainty | number | Estimated uncertainty of the monthly mean (ppm). Empty where unknown; NOAA's -0.99 sentinel is normalised to an empty cell. |
Download
Download CSVAbout
- Last updated
- 10 October 2026
- Total rows
- ...
- Format
- CSV
- File size
- 37 kB
- Sources
- NOAA GML — Trends in Atmospheric Carbon Dioxide, Mauna Loa monthly mean
- NOAA GML — Trends in Atmospheric Carbon Dioxide, Mauna Loa annual mean
- NOAA GML — Mauna Loa annual mean growth rate
- NOAA GML — global annual mean
- NOAA GML — global annual mean growth rate
- Data landing page and full documentation
Annual mean CO₂ at Mauna Loa
| Field | Type | Description |
|---|---|---|
| year | year | Calendar year. |
| co2_ppm_mean | number | Annual mean CO₂ mole fraction in parts per million (ppm) of dry air, from the Mauna Loa record. |
| uncertainty | number | Estimated uncertainty in the annual mean (ppm), taken as the standard deviation of annual means determined independently by NOAA/ESRL and Scripps. |
Download
Download CSVAbout
- Last updated
- 10 October 2026
- Total rows
- ...
- Format
- CSV
- File size
- 1.17 kB
- Sources
- NOAA GML — Trends in Atmospheric Carbon Dioxide, Mauna Loa monthly mean
- NOAA GML — Trends in Atmospheric Carbon Dioxide, Mauna Loa annual mean
- NOAA GML — Mauna Loa annual mean growth rate
- NOAA GML — global annual mean
- NOAA GML — global annual mean growth rate
- Data landing page and full documentation
Global annual mean CO₂
| Field | Type | Description |
|---|---|---|
| year | year | Calendar year. |
| co2_ppm_mean | number | Globally averaged marine-boundary-layer annual mean CO₂ mole fraction (ppm of dry air), from the NOAA GML cooperative air sampling network. Available from 1979. |
| uncertainty | number | Estimated uncertainty in the global annual mean (ppm), from a Monte Carlo resampling of the network (see NOAA documentation). |
Download
Download CSVAbout
- Last updated
- 10 October 2026
- Total rows
- ...
- Format
- CSV
- File size
- 820 B
- Sources
- NOAA GML — Trends in Atmospheric Carbon Dioxide, Mauna Loa monthly mean
- NOAA GML — Trends in Atmospheric Carbon Dioxide, Mauna Loa annual mean
- NOAA GML — Mauna Loa annual mean growth rate
- NOAA GML — global annual mean
- NOAA GML — global annual mean growth rate
- Data landing page and full documentation
Annual CO₂ growth rate (Mauna Loa and global)
| Field | Type | Description |
|---|---|---|
| year | year | Calendar year. |
| mlo_ppm_per_year | number | CO₂ mole-fraction increase over the year (1 Jan to 31 Dec), ppm, from the Mauna Loa record. NOAA's published value, computed from monthly data — not a difference of annual means. Available from 1959. |
| mlo_uncertainty | number | Estimated uncertainty in the Mauna Loa growth rate (ppm/yr). |
| global_ppm_per_year | number | CO₂ mole-fraction increase over the year (1 Jan to 31 Dec), ppm, from the global network. NOAA's published value. Pre-1980 values are approximated from Mauna Loa and the South Pole (see NOAA documentation). |
| global_uncertainty | number | Estimated uncertainty in the global growth rate (ppm/yr). |
Download
Download CSVAbout
- Last updated
- 10 October 2026
- Total rows
- ...
- Format
- CSV
- File size
- 1.72 kB
- Sources
- NOAA GML — Trends in Atmospheric Carbon Dioxide, Mauna Loa monthly mean
- NOAA GML — Trends in Atmospheric Carbon Dioxide, Mauna Loa annual mean
- NOAA GML — Mauna Loa annual mean growth rate
- NOAA GML — global annual mean
- NOAA GML — global annual mean growth rate
- Data landing page and full documentation
Mean annual CO₂ growth rate by decade (derived)
| Field | Type | Description |
|---|---|---|
| decade | string | Decade label, e.g. '1960s' (years 1960–1969). |
| mlo_mean_ppm_per_year | number | Mean of the Mauna Loa annual growth rates in the decade (ppm/yr), derived from co2-growth-annual. |
| global_mean_ppm_per_year | number | Mean of the global annual growth rates in the decade (ppm/yr), derived from co2-growth-annual. |
| n_years | integer | Number of years averaged. Less than 10 for the first and current (partial) decades. |
Download
Download CSVAbout
- Last updated
- 10 October 2026
- Total rows
- ...
- Format
- CSV
- File size
- 210 B
- Sources
- NOAA GML — Trends in Atmospheric Carbon Dioxide, Mauna Loa monthly mean
- NOAA GML — Trends in Atmospheric Carbon Dioxide, Mauna Loa annual mean
- NOAA GML — Mauna Loa annual mean growth rate
- NOAA GML — global annual mean
- NOAA GML — global annual mean growth rate
- Data landing page and full documentation
About this dataset
The longest continuous record of atmospheric carbon dioxide — the Mauna Loa series begun by C. David Keeling in March 1958 — plus the NOAA global mean and NOAA's published growth rates, in parts per million (ppm) of dry air.
data/co2-monthly-mlo.csv— Mauna Loa monthly mean (821 rows, 1958-03 → 2026-07)data/co2-annual-mlo.csv— Mauna Loa annual mean (67 rows, 1959 → 2025)data/co2-annual-global.csv— global marine-boundary-layer annual mean (47 rows, 1979 → 2025)data/co2-growth-annual.csv— annual growth rate (ppm/yr, 1 Jan → 31 Dec), Mauna Loa and global, as published by NOAA (67 rows, 1959 → 2025)data/co2-growth-decadal.csv— mean annual growth per decade, derived from the annual growth series (8 rows)build.ts— reproduces all five from the archived NOAA source. Run:node build.ts. The build script and raw snapshot live in the DataPressr repository, not on DataHub.SUMMARY.md— descriptive statistics per resource + what stands out. Stats block regenerated bynode enrich.ts.
Stories using this data
- The Keeling Curve: carbon dioxide at Mauna Loa went from 316 ppm in 1959 to 427 ppm in 2025, the longest continuous direct record of atmospheric CO₂ there is.
Source & licence
NOAA Global Monitoring Laboratory, Trends in Atmospheric Carbon Dioxide
(gml.noaa.gov/ccgg/trends/data.html). Files co2_mm_mlo.csv and
co2_annmean_mlo.csv retrieved 2026-08-30; co2_gr_mlo.csv, co2_annmean_gl.csv
and co2_gr_gl.csv retrieved 2026-09-05 (snapshots in archive/).
NOAA GML data are a US Government work, made freely available to the public. The Mauna Loa record is a joint NOAA / Scripps effort begun by C. David Keeling. Released here as PDDL-1.0 with citation requested:
Xin Lan, Pieter Tans and Kirk W. Thoning, Trends in globally-averaged CO₂,
NOAA GML. And: C. D. Keeling et al., Scripps Institution of Oceanography.
Missing values
NOAA uses negative sentinels for "no information": -1 (num_days), -9.99
(std_dev), -0.99 (monthly uncertainty). These are all normalised to empty
cells. They occur for every month before May 1974 (that stretch comes from Scripps,
which didn't record daily-count statistics) and for interpolated missing months.
The co2_ppm value itself is never missing — NOAA interpolates gaps.
Relation to core/co2-ppm
DataHub also has core/co2-ppm, git-synced from datasets/co2-ppm and auto-updated from the same NOAA files. In short, what differs:
- Resource layout and names. Core has
co2-mm-mlo,co2-annmean-mlo,co2-gr-mlo,co2-mm-gl,co2-annmean-glandco2-gr-glwith Title Case column names (Decimal Date,Average); this dataset hasco2-monthly-mlo,co2-annual-mlo,co2-annual-global,co2-growth-annual(Mauna Loa and global side by side) and a derivedco2-growth-decadal, withsnake_casecolumns named for NOAA's current meanings. It does not carry the global monthly series. - Core's monthly columns are mislabelled. As of 2026-10-09 core's
co2-mm-mlo.csvstill has a 6-name header over 7-value rows, so itsTrendcolumn holds the day count andNumber of Daysholds the standard deviation (details below). This dataset's build asserts the NOAA header and fails on a change instead. - Missing values. NOAA's negative sentinels (
-1,-9.99,-0.99) are empty cells here; core keeps them. - Snapshot vs living. This is a dated snapshot (NOAA files retrieved 2026-08-30 and 2026-09-05); core updates automatically.
Both use LF line endings.
Comparison detail
Issue #8 called for diffing this against the existing human-made version. What that turned up:
- The community dataset's monthly file is currently mis-labelled. It is kept
up to date by
scripts/process.sh+ a GitHub Action, but NOAA restructuredco2_mm_mlo.csv— it addedsdevandunccolumns and renamedinterpolatedtodeseasonalized. The shell script wasn't updated, so the published header still readsDate,Decimal Date,Average,Interpolated,Trend,Number of Days(6 names) while every data row now has 7 values. The upshot: theirTrendcolumn actually containsndays, and theirNumber of Dayscolumn actually containssdev. The declared schema no longer matches the data, and nothing flagged it because there's no check of the data against the schema. - This build guards against exactly that.
build.tsasserts the NOAA header it expects and throws a clear error if the shape changes, rather than silently emitting shifted columns. The column names here (co2_ppm,co2_ppm_deseasonalized,num_days,std_dev,uncertainty) track NOAA's current meanings, not a 2015-era layout. - Scope now overlaps closely. As of 2026-09-05 this dataset also carries the
global annual mean and NOAA's annual growth rates (Mauna Loa and global), plus
a derived decadal-mean-growth table. It still omits the global monthly series
(
co2_mm_gl.csv), which is an easy further follow-up. Where the community dataset differences annual means to get a growth rate, this one carries NOAA's own published growth figures (computed from monthly data, Jan 1 → Dec 31). - Where they're better: it's genuinely monitored (auto-updating) and has
polished
views. This one is a point-in-time snapshot with a reproducible build; wiring it to a schedule is themonitorskill's job (#6), not done here.
What the structure skill made easy vs awkward
- Easy: the missing-value normalisation idiom (one
num(raw, sentinels)helper applied per column), the deterministic re-run check, the typed-schema discipline that made the upstream drift obvious the moment the columns were named. - Awkward: nothing in the skill covers comment/preamble lines (40 of them
here,
#-prefixed) — obvious to handle, but it's a near-universal shape for government text data and deserves a line in the playbook. Same for "source ships negative sentinels rather than blanks", which is common enough to name explicitly.