# Lake and Reservoir Levels Nationwide (800+ US Lakes) (`standardwork/lake-reservoir-levels-nationwide`) Actor

Current lake and reservoir levels for about 800 US reservoirs plus river gauges. Search by lake name or state. Pool elevation, 24-hour change, dam release. Self-checked JSON or CSV.

- **URL**: https://apify.com/standardwork/lake-reservoir-levels-nationwide.md
- **Developed by:** [Standard Work Co.](https://apify.com/standardwork) (community)
- **Categories:** Travel, Integrations, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$20.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Lake and Reservoir Levels Nationwide

Informational only. Not for navigation, safety, emergency, financial, medical, or legal decisions. Check the official source before you rely on it.

Current pool elevation, 24-hour change and hourly history for about 800 Army Corps and TVA reservoirs, plus NOAA lake, pool and river gauges, in one clean JSON or CSV. Search by lake name or state, or list the lakes first. Data comes from official public government feeds.

**Who it's for:** marinas, fishing guides, lake rental hosts, boating apps, newsletters, and anyone tracking lake levels on a schedule.

### Input

- **Default run (no search):** Kentucky Lake and Lake Barkley, the same as before. The two checkboxes turn each one off.
- **Lake name:** part of a name, for example `Table Rock` or `Lake Cumberland`.
- **State:** 2-letter code, for example `MO`. Combine with a name to narrow it.
- **Mode:** `readings` (default) fetches current levels. `list` returns matching lakes from the built-in index with no readings, so you can browse first.
- **Sources:** `corps`, `tva`, `noaa` (all by default). NOAA river gauges are left out of searches unless you turn on Include NOAA river gauges.
- **Max lakes:** default 25 (readings up to 200, list up to 2,000). This keeps each run's cost predictable.
- **Live cross-check against NOAA:** on by default. See Self-check.
- **Advanced:** TVA site codes (for example `KYDK2`), Army Corps CWMS series objects, NOAA gauge IDs (for example `SMLI2`), Hours of history (1 to 168).
  When a name or state search is set, the two default lakes are only included if they match the search.

### Output

The first 17 fields are unchanged from the earlier version: source, site, series, observedAt, observedAtLocal, poolElevationFt, change24hFt, tailwaterFt, dischargeCfs, historyCount, history, note, error, qcStatus, qcNotes, sourceUrl, retrievedAt.
New fields are added at the end: lakeName, state, latitude, longitude, siteId, office, stageFt, flowCfs, crossCheck, crossCheckNote, noaaCheckLid, noaaCheckFt, noaaCheckDeltaFt.

- Army Corps rows report pool elevation only, so tailwater and discharge are null.
- TVA publishes only the last 48 hours.
- NOAA rows put the reading in stageFt as NOAA publishes it. NOAA does not state the datum, so for some lake gauges it is the lake elevation and for others it is height above the gauge's own zero. poolElevationFt is null on NOAA rows.

### Self-check

Every row gets qcStatus (ok or flagged) and qcNotes. Rows are flagged, not dropped.

- **Cross-checked lakes:** the lake index was matched against a second public source on Oct 17, 2026. crossCheck is `ok` only where the two sources agreed within 0.30 ft. Every other Corps or TVA lake has crossCheck `flagged` and its rows are always qcStatus flagged, with the reason in crossCheckNote.
- **Not every lake has a second source.** About 44% of the Army Corps lakes (338 of 769) and 27 of 43 TVA codes have a matching NOAA gauge. The rest cannot be cross-checked automatically.
- **Live NOAA check:** for cross-checked lakes, each run compares the reading with NOAA at the closest time (within 20 minutes) and flags gaps over 0.5 ft.
- Also flagged: a level outside a plausible range, a newest reading more than 6 hours old or in the future, an hour-to-hour change over 1 ft on a lake, and source errors.
- A bad lake name, state or code returns a row with the error field filled instead of failing the run.

### No-code setup

1. **Run it on a schedule.** In Apify Console, create a schedule (for example every morning at 6 AM) and pick this Actor. Guide: https://docs.apify.com/platform/schedules
2. **Send results to Google Sheets.** Add the Google Sheets Import & Export Actor as an integration: https://apify.com/lukaskrivka/google-sheets
3. **Zapier or Make.** Zapier: https://docs.apify.com/platform/integrations/zapier . Make: https://docs.apify.com/platform/integrations/make

### Disclaimer

Informational only. Not for navigation, safety, emergency, financial, medical, or legal decisions. Check the official source before you rely on it.

This is an independent tool by Standard Work Co. It is not affiliated with, endorsed by, or sponsored by any government agency named here. Agency names are used only to say where the data comes from.

The data comes from public government sources and is passed through as published, only reformatted. Government data can be preliminary, late, missing, revised, or wrong, and this tool can fail too. This output is not an official government record.

Provided "as is" with no warranty of any kind, including accuracy, completeness, or timeliness. You are responsible for checking the official source before acting on anything here.

Not for boating, swimming, fishing safety, navigation, flood, or emergency decisions. For current official conditions, check the agency's own site and follow posted warnings.

### Data sources and credits

- Tennessee Valley Authority (TVA) lake and dam observed data: tva.com.
- U.S. Army Corps of Engineers, Corps Water Management System (CWMS) Data API, cwms-data.usace.army.mil. USACE does not endorse this tool.
- NOAA National Weather Service, National Water Prediction Service (api.water.noaa.gov). NOAA and NWS do not endorse this tool.

U.S. government works are not subject to U.S. copyright protection (17 U.S.C. 105). Any copyright in this Actor covers only its code and documentation, not the underlying government data.

# Actor input Schema

## `includeKentuckyLake` (type: `boolean`):

Include Kentucky Lake (TVA site KYDK2). Turn off to skip it even if KYDK2 is in the TVA list.

## `includeLakeBarkley` (type: `boolean`):

Include Lake Barkley (Army Corps CWMS series). Turn off to skip it even if it is in the CWMS list.

## `mode` (type: `string`):

Readings fetches current levels. List returns matching lakes from the built-in index without readings, so you can browse.

## `lakeName` (type: `string`):

Part of a lake or dam name, e.g. Table Rock or Lake Cumberland. When set, the two default lakes are skipped unless they match.

## `state` (type: `string`):

2-letter state code, e.g. MO. Can be combined with Lake name.

## `sources` (type: `array`):

Which feeds to search: corps (Army Corps reservoirs), tva, noaa (NOAA gauges). Default all three.

## `includeRiverGauges` (type: `boolean`):

Off by default: searches return lake and pool gauges only. Turn on to include river stage gauges.

## `maxLakes` (type: `integer`):

Cap on lakes returned from a search (readings mode max 200, list mode max 2000). Keeps cost predictable.

## `noaaCrossCheck` (type: `boolean`):

For lakes with a checked NOAA link, compare the reading with NOAA and flag gaps over 0.5 ft.

## `tvaSites` (type: `array`):

TVA site codes, e.g. KYDK2 (Kentucky Dam).

## `cwmsSeries` (type: `array`):

Objects with office and name, e.g. {"office":"LRN","name":"BAHK2-BARKLEY.Elev-Pool.Inst.1Hour.0.dcp-rev","label":"Lake Barkley"}

## `nwpsGauges` (type: `array`):

NOAA NWPS gauge IDs (5 characters), e.g. SMLI2. Added to the results.

## `hours` (type: `integer`):

Hours of history to return per lake (1-168). TVA publishes only the last 48 hours, so TVA history is capped at 48. The 24-hour change is always computed.

## Actor input object example

```json
{
  "includeKentuckyLake": true,
  "includeLakeBarkley": true,
  "mode": "readings",
  "sources": [
    "corps",
    "tva",
    "noaa"
  ],
  "includeRiverGauges": false,
  "maxLakes": 25,
  "noaaCrossCheck": true,
  "tvaSites": [
    "KYDK2"
  ],
  "cwmsSeries": [
    {
      "office": "LRN",
      "name": "BAHK2-BARKLEY.Elev-Pool.Inst.1Hour.0.dcp-rev",
      "label": "Lake Barkley"
    }
  ],
  "hours": 24
}
```

# Actor output Schema

## `results` (type: `string`):

All rows in the default dataset.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "sources": [
        "corps",
        "tva",
        "noaa"
    ],
    "tvaSites": [
        "KYDK2"
    ],
    "cwmsSeries": [
        {
            "office": "LRN",
            "name": "BAHK2-BARKLEY.Elev-Pool.Inst.1Hour.0.dcp-rev",
            "label": "Lake Barkley"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("standardwork/lake-reservoir-levels-nationwide").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "sources": [
        "corps",
        "tva",
        "noaa",
    ],
    "tvaSites": ["KYDK2"],
    "cwmsSeries": [{
            "office": "LRN",
            "name": "BAHK2-BARKLEY.Elev-Pool.Inst.1Hour.0.dcp-rev",
            "label": "Lake Barkley",
        }],
}

# Run the Actor and wait for it to finish
run = client.actor("standardwork/lake-reservoir-levels-nationwide").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "sources": [
    "corps",
    "tva",
    "noaa"
  ],
  "tvaSites": [
    "KYDK2"
  ],
  "cwmsSeries": [
    {
      "office": "LRN",
      "name": "BAHK2-BARKLEY.Elev-Pool.Inst.1Hour.0.dcp-rev",
      "label": "Lake Barkley"
    }
  ]
}' |
apify call standardwork/lake-reservoir-levels-nationwide --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,standardwork/lake-reservoir-levels-nationwide"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/2V3VyDhbR6aQFzXnS/builds/M4jOrEIqxrjXDLwl0/openapi.json
