Bulk data for modelers

A water division's record as files: daily streamflow, diversion and release totals, reservoir measurements, decreed rights, the call record and monitoring wells. Every table ships as Parquet. The smaller tables also ship as a single CSV, and the two daily tables as one gzipped CSV per water district. RiverWare users get a ready-made control-file DMI. manifest.json lists every file with its row count and SHA-256 checksum. README.md is the data dictionary.

These are public DWR and USGS records. The notes under each release list every change made to them. Nothing is gap-filled, interpolated or converted.

Water Division 1

Built 2026-10-27 16:07 (Mountain) · water districts 1, 2, 3, 4, 5, 6, 7, 8, 9, 23, 48, 49, 64, 65, 76, 80 · HydroBase snapshot HydroBase_CO_20260707 · 323.8 MB in 62 files

manifest.json · README.md (data dictionary)

Tables in the Division 1 release
TableWhat it holdsRowsSpanDownload
gages Every stream gage with a daily record in the division, both sources. 1,100 — parquet (67.3 kB) · csv (123.8 kB)
streamflow_daily Daily mean flow, one row per gage per day. 7,736,540 1881–2026 parquet (28.8 MB)
structures Every structure DWR lists in the division. 59,685 — parquet (2.1 MB) · csv (5.5 MB)
diversions_daily Daily diversion and release totals per structure. 9,591,216 1908–2026 parquet (34.2 MB)
reservoir_storage Reservoir measurements DWR holds (storage, fill, release, evaporation). 554,787 1919–2025 parquet (3.5 MB) · csv (25.9 MB)
reservoirs Reclamation reservoirs in the basin and the daily series each publishes. 0 — parquet (4.2 kB) · csv (101 Bytes)
reservoir_daily Reclamation's daily reservoir record: storage, elevation, release, inflow, evaporation. 0 — parquet (3.0 kB) · csv (39 Bytes)
area_capacity Published elevation-area-capacity tables (sedimentation surveys). 0 — parquet (3.9 kB) · csv (72 Bytes)
water_rights Every decreed right, net amounts and priority. 57,024 — parquet (1.4 MB) · csv (6.9 MB)
calls The division's administrative call record. 11,892 — parquet (348.7 kB) · csv (2.2 MB)
streams DWR's stream network: each stream, the stream it joins and the mile where it joins. 1,151 — parquet (61.0 kB) · csv (150.5 kB)
network Every structure and gage placed on that network, linked to the next node downstream. 9,298 — parquet (452.2 kB) · csv (1.8 MB)
wells DWR monitoring wells. 23,278 — parquet (976.0 kB) · csv (1.6 MB)
well_levels Water-level measurements for those wells. 693,332 1882–2026 parquet (5.7 MB) · csv (25.0 MB)
documents The documents and datasets a RiverWare build of this basin rests on, with link status. 0 — parquet (4.7 kB) · csv (82 Bytes)

RiverWare

riverware.zip (19.8 MB, 5,237 series): a control-file DMI with README.txt. There is one data file per gage, one per structure's daily diversion (DWR's Total Diversion; release records are in the tables, not the zip), and one per Reclamation reservoir series, plus two-column elevation-volume and elevation-area tables where a survey is published. Each value is stamped 24:00 at the end of its day, with NaN for days the source did not record. The object and slot names in control.ctl are placeholders for you to rename to your model's. network.csv is in the zip too. It lists every structure, gage and confluence on DWR's stream network, each linked to the next node downstream.

streamflow_daily_wide.csv (91.3 MB): one row per day and one column per gage, sized for a spreadsheet or TSTool.

Daily tables as gzipped CSV, one file per water district
What was changed from the published record
  • DWR publishes -999 as 'no data' with no flag. This release drops those days; gages.sentinel_days_dropped counts them. A missing day is missing, never zero.
  • DWR pre-stamps the rest of the water year with 0.0 diversion rows. Rows dated after the build are dropped.
  • diversions_daily holds DWR's 'Total (Diversion)' and 'Total (Release)' rollups only. The per-water-class rows decompose those totals and are not included.
  • Diversion records publish roughly a year in arrears. A recent gap is usually DWR's schedule, not a structure that stopped.
  • net_apex_* amounts are alternate points of diversion or exchanges of the same water. Adding them to net_absolute double-counts.
  • A DWR gage and the USGS gage it mirrors are both shipped under their own ids; gages.same_site_as pairs them. Do not add them together.
  • Identifiers are text. Read site_id, usgs_site_id and wdid as strings: a CSV reader that guesses numbers turns USGS 09361500 into 9361500 and WDID 0700553 into 700553. The Parquet files already carry them as text.
  • USGS's own estimated values are kept as USGS publishes them and flagged in qualifier (e = estimated; also ice, dry, lessthan and others).
  • Not in this release, and not found in a public machine-readable form: NIIP and San Juan-Chama Project diversion records, CRMMS/24-Month Study model inputs, and published area-capacity tables for reservoirs other than those in area_capacity.
  • Nothing is gap-filled, interpolated or unit-converted. Values are as the source published them, minus the removals above.
  • network.stream_mile is DWR's stream mile, counted UPSTREAM from the mouth (or from the state line). A gage whose mile is 'estimated' borrowed it from the nearest structure on the stream its name names, placement_km away; gages further than 3 km from any such structure are left unplaced rather than guessed.
  • Diversions, rights, calls, structures and the stream network are Colorado's (DWR). Streamflow also carries the USGS gages of the San Juan basin in New Mexico, Utah and Arizona (Archuleta, Farmington, Shiprock, Four Corners, Bluff and others). Those are on DWR's network only where DWR's own stream miles reach them: the San Juan's miles run through New Mexico, so Archuleta and Farmington are placed; every other river's network stops at the state line, where DWR counts everything below it as mile 0 (network.tie_order marks those).
  • These are public DWR and USGS records assembled by Hydrohistorian. DWR's HydroBase and USGS NWIS remain the authority.
  • 629,227 timestamp(s) in 215 source file(s) were within an hour of midnight rather than on it (a daylight-time midnight stored in standard time) and were taken as the day of the nearest midnight.

Water Division 7

Built 2026-10-25 21:53 (Mountain) · water districts 29, 30, 31, 32, 33, 34, 69, 71, 77, 78 · HydroBase snapshot HydroBase_CO_20260928 · 154.5 MB in 52 files

manifest.json · README.md (data dictionary)

Tables in the Division 7 release
TableWhat it holdsRowsSpanDownload
gages Every stream gage with a daily record in the division, both sources. 305 — parquet (25.3 kB) · csv (38.2 kB)
streamflow_daily Daily mean flow, one row per gage per day. 3,081,828 1895–2026 parquet (11.4 MB)
structures Every structure DWR lists in the division. 8,294 — parquet (364.3 kB) · csv (830.9 kB)
diversions_daily Daily diversion and release totals per structure. 7,608,262 1925–2025 parquet (19.6 MB)
reservoir_storage Reservoir measurements DWR holds (storage, fill, release, evaporation). 58,301 1928–2025 parquet (442.2 kB) · csv (2.5 MB)
reservoirs Reclamation reservoirs in the basin and the daily series each publishes. 6 — parquet (6.0 kB) · csv (1.0 kB)
reservoir_daily Reclamation's daily reservoir record: storage, elevation, release, inflow, evaporation. 697,254 1941–2026 parquet (4.5 MB) · csv (39.6 MB)
area_capacity Published elevation-area-capacity tables. This release: Navajo Reservoir (2019 survey); none is published machine-readably for the others. 385 — parquet (20.6 kB) · csv (49.4 kB)
water_rights Every decreed right, net amounts and priority. 7,972 — parquet (231.5 kB) · csv (856.5 kB)
calls The division's administrative call record. 2,054 — parquet (66.9 kB) · csv (283.5 kB)
streams DWR's stream network: each stream, the stream it joins and the mile where it joins. 629 — parquet (34.2 kB) · csv (67.4 kB)
network Every structure and gage placed on that network, linked to the next node downstream. 5,619 — parquet (256.3 kB) · csv (880.4 kB)
wells DWR monitoring wells. 444 — parquet (24.8 kB) · csv (30.5 kB)
well_levels Water-level measurements for those wells. 1,018 1944–2026 parquet (19.8 kB) · csv (30.4 kB)
documents The documents and datasets a RiverWare build of this basin rests on, with link status. 83 — parquet (16.8 kB) · csv (22.3 kB)

RiverWare

riverware.zip (9.2 MB, 2,547 series): a control-file DMI with README.txt. There is one data file per gage, one per structure's daily diversion (DWR's Total Diversion; release records are in the tables, not the zip), and one per Reclamation reservoir series, plus two-column elevation-volume and elevation-area tables where a survey is published. Each value is stamped 24:00 at the end of its day, with NaN for days the source did not record. The object and slot names in control.ctl are placeholders for you to rename to your model's. network.csv is in the zip too. It lists every structure, gage and confluence on DWR's stream network, each linked to the next node downstream.

streamflow_daily_wide.csv (28.3 MB): one row per day and one column per gage, sized for a spreadsheet or TSTool.

area_capacity_agreement.csv: how far Reclamation's daily storage sits from the published area-capacity table at the same daily elevation, water year by water year. Check it before building a reservoir on the table and calibrating it to the daily record.

Daily tables as gzipped CSV, one file per water district

Documents for a model build

The 83 documents and datasets a RiverWare build of this basin rests on, each served by its publisher. Each was opened and checked against its title when it was added; a weekly check re-tests the links, and anything not answering normally is marked with the date of that check. documents.csv has them all.

CDSS/StateMod (12)
CO DWR Division 7 (4)
Compacts & law (11)
Forecasts & climate (6)
Reclamation (20)
RiverWare (6)
  • RiverWare Technical Documentation v8.0 - Data Management Interface (DMI) — CADSWES / Univ. of Colorado, v8.0, PDF (128 pp). control-file and database (Excel) DMI setup (v8.0 documentation; current RiverWare is 9.x, whose help is at riverware.org/HelpSystem)
  • Control File-executable DMI (HTML) — CADSWES, v8.0, HTML. control-file syntax mapping object.slots to files (v8.0 documentation; current RiverWare is 9.x, whose help is at riverware.org/HelpSystem)
  • Database DMI incl. Excel datasets (HTML) — CADSWES, v8.0, HTML. Excel DMI configuration for workbook-driven inputs (v8.0 documentation; current RiverWare is 9.x, whose help is at riverware.org/HelpSystem)
  • RiverWare Policy Language (RPL) — CADSWES, v8.0, PDF (320 pp). ruleset language for Navajo operating/shortage-sharing rules; RPL units (v8.0 documentation; current RiverWare is 9.x, whose help is at riverware.org/HelpSystem)
  • Objects and Methods — CADSWES, v8.0, PDF (1,084 pp). reservoir/reach/water-user object and method reference (v8.0 documentation; current RiverWare is 9.x, whose help is at riverware.org/HelpSystem)
  • User Interface - Units (unit schemes, units list) — CADSWES, v8.0, HTML. units list/conversion factors and display unit schemes (v8.0 documentation; current RiverWare is 9.x, whose help is at riverware.org/HelpSystem)
SJRIP (24)
What was changed from the published record
  • DWR publishes -999 as 'no data' with no flag. This release drops those days; gages.sentinel_days_dropped counts them. A missing day is missing, never zero.
  • DWR pre-stamps the rest of the water year with 0.0 diversion rows. Rows dated after the build are dropped.
  • diversions_daily holds DWR's 'Total (Diversion)' and 'Total (Release)' rollups only. The per-water-class rows decompose those totals and are not included.
  • Diversion records publish roughly a year in arrears. A recent gap is usually DWR's schedule, not a structure that stopped.
  • net_apex_* amounts are alternate points of diversion or exchanges of the same water. Adding them to net_absolute double-counts.
  • A DWR gage and the USGS gage it mirrors are both shipped under their own ids; gages.same_site_as pairs them. Do not add them together.
  • Identifiers are text. Read site_id, usgs_site_id and wdid as strings: a CSV reader that guesses numbers turns USGS 09361500 into 9361500 and WDID 0700553 into 700553. The Parquet files already carry them as text.
  • USGS's own estimated values are kept as USGS publishes them and flagged in qualifier (e = estimated; also ice, dry, lessthan and others).
  • Not in this release, and not found in a public machine-readable form: NIIP and San Juan-Chama Project diversion records, CRMMS/24-Month Study model inputs, and published area-capacity tables for reservoirs other than those in area_capacity.
  • Nothing is gap-filled, interpolated or unit-converted. Values are as the source published them, minus the removals above.
  • network.stream_mile is DWR's stream mile, counted UPSTREAM from the mouth (or from the state line). A gage whose mile is 'estimated' borrowed it from the nearest structure on the stream its name names, placement_km away; gages further than 3 km from any such structure are left unplaced rather than guessed.
  • Diversions, rights, calls, structures and the stream network are Colorado's (DWR). Streamflow also carries the USGS gages of the San Juan basin in New Mexico, Utah and Arizona (Archuleta, Farmington, Shiprock, Four Corners, Bluff and others). Those are on DWR's network only where DWR's own stream miles reach them: the San Juan's miles run through New Mexico, so Archuleta and Farmington are placed; every other river's network stops at the state line, where DWR counts everything below it as mile 0 (network.tie_order marks those).
  • These are public DWR and USGS records assembled by Hydrohistorian. DWR's HydroBase and USGS NWIS remain the authority.
  • Navajo Reservoir: the 2019 area-capacity table is on Reclamation Project Vertical Datum (RPVD), 2.97 ft below NAVD88. Reclamation's daily storage changes tables at the start of WY2022. From then on it equals this table minus the table's own capacity at 5,775 ft (9,493 af) on every day: storage is counted above 5,775 ft. Before it, each water year's median difference from this table at the same elevation runs from +7,540 to +45,818 af (median +41,071), varying with pool level: storage was computed from earlier tables. A model built on this table and calibrated to storage from before WY2022 mixes tables. area_capacity_agreement.csv has every water year.

Groundwater, statewide

Every DWR monitoring well and its water levels, the site's own water-table trends, the well-permit file (no owner details), DWR's geophysical-log well index with its formation picks, and the logs and well papers DWR holds for those wells (including digital LAS where DWR has it).

Built 2026-10-26 08:14 (Mountain) · 93.5 MB in 16 files · manifest.json · README.md (data dictionary)

Tables in the statewide groundwater release
TableWhat it holdsRowsSpanDownload
gw_wells DWR monitoring wells statewide. 34,337 — parquet (1.5 MB) · csv (3.4 MB)
gw_levels Water-level measurements for those wells. 1,015,652 1882–2026 parquet (8.4 MB) · csv.gz (6.9 MB)
gw_trends Per-well water-table trends (Mann-Kendall on annual means; >=20 readings over >=10 years). 3,467 — parquet (58.2 kB) · csv (145.7 kB)
gw_permits Colorado well permits (owner and contact fields are never fetched). 599,044 — parquet (30.5 MB) · csv.gz (27.4 MB)
gw_log_wells DWR's geophysical-log well index. 6,106 — parquet (455.9 kB) · csv (1.7 MB)
gw_picks Formation tops and bases picked from those logs. 12,716 — parquet (202.0 kB) · csv (655.8 kB)
gw_documents DWR documents for log wells and monitored wells: logs, LAS files and key permit papers. 241,806 — parquet (5.6 MB) · csv.gz (3.1 MB)
gw_digitized Curves digitized automatically from the mirrored log scans, one row per curve with its confidence gate; the LAS files are in the document store. Screening data: keep the scan. 10,121 — parquet (326.5 kB) · csv (3.1 MB)
What to know before using it
  • DWR publishes -999 for 'no measurement'. gw_levels drops those values; a missing reading is missing, never zero.
  • A permit receipt is an application, not a physical well: group by permit, and expect several receipts for one hole (replacements, changes) and receipts for wells never drilled.
  • Permit yields and static levels are what the driller reported at completion. Pump-test yield is capped near the permitted rate and is not an aquifer test or a transmissivity.
  • Aquifer names on permits and monitoring wells are labels as filed (about 82% of monitoring wells carry none; regime then falls back to the designated basin). Formation depths come from gw_picks (geophysical picks) -- cite which one you used.
  • logType is free text with no published legend (about 70 spellings). curve_families decodes only spelled-out tokens; R, C, G, D, N and other single letters are left as filed.
  • The geophysical-log network is a Denver Basin instrument: about 85% of log wells are in Division 1 and 15% in Division 2; elsewhere their absence is the fact.
  • Water-table trends are computed on one datum per well (elevation or depth, whichever the well reports more); denver_basin, high_plains and other bedrock declines are storage loss, not a recharge signal.
  • These are public DWR records assembled by Hydrohistorian. HydroBase and DWR's Laserfiche remain the authority; every document row carries DWR's own link.
  • gw_digitized: 5,514 scan pages could not be digitized automatically (older hand-filled logs, rotated or unsupported layouts); the scans themselves are in gw_documents.
  • The document mirror is still filling: 8,538 of 241,806 listed documents are held so far. Every row carries DWR's own link either way.

The well documents come from DWR's public archive and many carry owners' names. What we copy, and how to have a document removed.

Call truth table: Clear Creek (Division 1, District 7)

Built 2026-10-27 22:14 (Mountain) · data through 2026-10-17 · first recorded call on the stream 2004 · 22 usable seasons

The week-by-week controlling admin number on Clear Creek, the label the call-forecast pilot is trained on and scored against. Derived from the same call record as the Division 1 release, by the same rules the dossiers use (curtailment.call_applies). Week 0 begins 04-01; 31 weeks a season. Paper water: a cutline of entitlements, not deliveries.

manifest.json · README.md (data dictionary) · call_truth_weekly.parquet · call_truth_weekly.csv · call_truth_daily.parquet · call_truth_daily.csv · bands.json

From an AI assistant (MCP)

This single file is an MCP server: hydrohistorian_mcp.py. It lets Claude or any other MCP client search these records, query them in SQL, walk DWR's stream network downstream, list the documents, and export any result to CSV, Parquet or a RiverWare series file. It runs on your own machine. The first time it uses a division, it downloads that division's Parquet files and checks each one's checksum, then answers locally. Queries can read the release and nothing else on your disk. Exports never overwrite a file unless asked, and never write hidden files. With no network, the last download keeps working. It needs uv.

For groundwater it does the routine work of a site assessment: an inventory of every permit, monitoring well and log well around a point, written to a spreadsheet with a provenance sheet; hydrographs with the site's trends; nearby geophysical logs with DWR's formation picks set beside DWR's Denver Basin tool; cross-sections; and the logs themselves, as LAS where DWR has the digital file. Scanned logs can be traced into LAS, by hand on one page or automatically across the library (the gw_digitized table lists every traced curve with its confidence verdict). The tracer's accuracy was measured against DWR's own digital logs (per curve class as a file: digitizer-quality.json; summarized at /digitized), and every traced file says it was digitized. From a gamma curve it computes net sand per aquifer, with DWR's own pick beside it; that convention was scored against DWR's picks too.

Download it, check it against the checksum below, and run your own copy:

curl -O https://hydrohistorian.com/static/data/mcp/hydrohistorian_mcp.py
shasum -a 256 hydrohistorian_mcp.py
claude mcp add hydrohistorian -- uv run "$PWD/hydrohistorian_mcp.py"

SHA-256 of the current file: 4bb295ea822806c184d2b542afa812674752452613f2236f4676c6195732a64e

Then ask, for example: "export the Animas at Durango daily flow since 1990 as a RiverWare file", or "which structures are between Vallecito and the state line, and what did they divert in 2002?" For groundwater: "inventory the wells within a mile of 39.509, -104.921 into a spreadsheet", or "what are the Denver Basin aquifer tops there, and do the nearby logs agree?"

Reading it

Parquet reads straight from its URL. Python (pandas or DuckDB):

import pandas as pd
base = "https://hydrohistorian.com/static/data/releases/div7/"
gages = pd.read_csv(base + "gages.csv", dtype={"site_id": str, "usgs_site_id": str})
flow = pd.read_parquet(base + "streamflow_daily.parquet")
animas = flow[(flow.source == "USGS") & (flow.site_id == "09361500")]
import duckdb
# Calendar-year acre-feet per structure (1 cfs-day = 1.9835 af). year() is the
# calendar year, not DWR's Nov-Oct irrigation year; unrecorded days add nothing;
# reservoir structures' storage diversions are included.
duckdb.sql("""
  SELECT wdid, year(date) AS yr, sum(value) * 1.9835 AS af
  FROM 'https://hydrohistorian.com/static/data/releases/div7/diversions_daily.parquet'
  WHERE units = 'CFS' AND record = 'Diversion'
  GROUP BY ALL ORDER BY wdid, yr""")

R:

library(arrow)
download.file("https://hydrohistorian.com/static/data/releases/div7/streamflow_daily.parquet",
              "streamflow_daily.parquet", mode = "wb")
flow <- read_parquet("streamflow_daily.parquet")

A machine-readable list of every release is at /static/data/releases/index.json.

Something wrong or missing for your model? Tell us. Per-structure and per-gage downloads remain on each dossier and gage page. How this is built.