USGS API: Get river level
Gets the latest water height, flow, 24-hour trend and flood-stage status at the active USGS river gauge best matching a river or town and state. Flood stage is null when not published; gauges without recent stage, flow or 24-hour history are not returned.
Unofficial. Not affiliated with or endorsed by USGS.
Inputs
Values from the run on Oct 31, 2026, shown under Output.
- Location, required
location River and/or town with state, for example Mississippi River at St. Louis, MO.
Mississippi River at St. Louis, MO
Input as JSON
{ "location": "Mississippi River at St. Louis, MO"}Output
{ "town": "St. Louis", "state": "Missouri", "latitude": 38.629, "longitude": -90.1797777777778, "gauge_name": "Mississippi River at St. Louis, MO", "observed_at": "2026-09-29T00:00:00-05:00", "trend_24_hours": "falling", "gauge_page_link": "https://waterdata.usgs.gov/monitoring-location/07010000/" , "flood_stage_feet": 30, "usgs_site_number": "07010000", "above_flood_stage": false, "water_height_feet": 15.24, "flow_cubic_feet_per_second": 262000}Code
curl https://api.fous.com/v1/runs \ -H "Authorization: Bearer $FOUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"method":"waterdata.usgs.gov/get_river_level","input":{"location":"Mississippi River at St. Louis, MO"}}' # Save as fous.py, then run: python3 fous.pyimport json, os, timefrom urllib.error import HTTPErrorfrom urllib.request import Request, urlopenAPI = "https://api.fous.com/v1/runs" KEY = os.environ["FOUS_API_KEY"]HEADERS = { "Authorization": f"Bearer {KEY}", "Content-Type": "application/json" ,}def call(url, body=None): data = json.dumps(body).encode() if body else None request = Request(url, data, HEADERS) try: with urlopen(request, timeout=120) as r: return r.status, json.load(r) except HTTPError as error: message = json.load(error)["error"]["message"] raise RuntimeError(message) from errorstatus, run = call(API, { "method": "waterdata.usgs.gov/get_river_level" , "input": { "location": "Mississippi River at St. Louis, MO" }})# 202: still going after 30 s. Ask again until it ends.while status == 202: time.sleep(2) status, run = call(f"{API}/{run['id']}")print(json.dumps(run["data"], indent=2))// Save as fous.mjs, then run: node fous.mjsconst api = "https://api.fous.com/v1/runs" ;const headers = { Authorization: `Bearer ${process.env.FOUS_API_KEY}`, "Content-Type": "application/json" ,};let response = await fetch(api, { method: "POST", headers, body: JSON.stringify({ "method": "waterdata.usgs.gov/get_river_level" , "input": { "location": "Mississippi River at St. Louis, MO" } }), signal: AbortSignal.timeout(120_000),});let run = await response.json();// 202: still going after 30 s. Ask again until it ends.while (response.status === 202) { await new Promise((done) => setTimeout(done, 2_000)); response = await fetch(`${api}/${run.id}`, { headers }); run = await response.json();}if (!response.ok) throw new Error(run.error.message);console.log(run.data);# Connect your agent to Fous once, over MCP (Streamable HTTP):# https://api.fous.com/mcp# Set FOUS_API_KEY first: create a key at https://app.fous.com/keys.# Claude Codeclaude mcp add \ --scope user \ --transport http fous https://api.fous.com/mcp \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Codexcodex mcp add fous \ --url https://api.fous.com/mcp \ --bearer-token-env-var FOUS_API_KEY# Cursor, VS Code, Windsurf, Cline and morenpx -y add-mcp https://api.fous.com/mcp -g -n fous \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Then ask your agent:# "Use Fous to run waterdata.usgs.gov/get_river_level# with {"location":"Mississippi River at St. Louis, MO"}"Over HTTP, the answer’s data holds the output. A run still going after 30 seconds answers 202 with its id: ask GET /v1/runs/{id} until it ends.
Schema
Input schema
{ "type": "object", "required": [ "location" ], "properties": { "location": { "type": "string", "description": "River and/or town with state, for example Mississippi River at St. Louis, MO." } }}Output schema
{ "type": "object", "required": [ "gauge_name", "town", "state", "water_height_feet", "flow_cubic_feet_per_second", "observed_at", "trend_24_hours", "flood_stage_feet", "above_flood_stage", "gauge_page_link", "usgs_site_number", "latitude", "longitude" ], "properties": { "town": { "type": "string", "description": "Town near the gauge." }, "state": { "type": "string", "description": "State name." }, "latitude": { "type": [ "number", "null" ], "description": "Gauge latitude." }, "longitude": { "type": [ "number", "null" ], "description": "Gauge longitude." }, "gauge_name": { "type": "string", "description": "Official gauge name." }, "observed_at": { "type": "string", "description": "Gauge-height observation time in the local time zone, with offset." }, "trend_24_hours": { "type": "string", "description": "Water-height trend over the past 24 hours." }, "gauge_page_link": { "type": "string", "description": "Page showing the gauge." }, "flood_stage_feet": { "type": [ "number", "null" ], "description": "Flood stage in feet, when published." }, "usgs_site_number": { "type": "string", "description": "USGS monitoring site number." }, "above_flood_stage": { "type": [ "boolean", "null" ], "description": "Whether the water height reaches or exceeds flood stage, when known." }, "water_height_feet": { "type": "number", "description": "Most recent gauge height in feet." }, "flow_cubic_feet_per_second": { "type": "number", "description": "Most recent discharge in cubic feet per second." } }}- Price
- 1 credit per completed run (1¢ with pay as you go); failed runs are free.
- Method
waterdata.usgs.gov/get_river_level- Returns
- gauge name, town, state, water height, flow, observation time, 24-hour trend, flood stage, gauge link, site number, coordinates
Use it from your agent
Give your agent this line. It reads SKILL.md, gets a Fous API key and connects the Fous MCP server. Its run then takes the method waterdata.usgs.gov/get_river_level with the inputs above.
Ask your agent
- How high is the Potomac River at Point of Rocks, MD right now, and is it rising or falling?
- Check the USGS gauge on the Cumberland River at Nashville, TN — current stage, flow in cfs, and whether it's near flood stage.
- Is the Red River at Fargo, ND above flood stage today?
- Pull the latest USGS reading for the Sacramento River near Red Bluff, CA: water height, discharge, and 24-hour trend.
- Planning to kayak the James River in Richmond, VA this weekend. What's the current water level and flow there?
See more
All USGS methodsFinds recent USGS earthquakes near a city, address, or region, with distances and times in the searched place's time zone.
earthquake.usgs.gov/search_earthquakesLists significant worldwide earthquakes for the past day, week, or month, newest first, with USGS PAGER alert levels and impact summaries when USGS provides them.
earthquake.usgs.gov/list_significant_earthquakesGets the latest NOAA coastal water level, the matching tide prediction, the direction of change, and water temperature for the station nearest a US coastal place (within 50 miles).
tidesandcurrents.noaa.gov/get_water_levelGets the latest observed weather from a nearby National Weather Service station for a US city, address, or ZIP code. Measurements the station does not report are null.
weather.gov/get_current_conditionsGets AirNow current air quality, pollutant readings and today's and tomorrow's forecasts for a US city or ZIP code, or a covered Canadian or Mexican city.
airnow.gov/get_air_qualityGets current conditions and RealFeel for a city or postal code on AccuWeather. The UV level follows standard UV-index ranges. Air quality is null unless it is shown with the current conditions.
accuweather.com/get_current_weatherFinds the nearest NOAA tide prediction station to a US coastal place (within 30 miles) and returns its high and low tide times in local time with predicted heights above MLLW.
tidesandcurrents.noaa.gov/get_tide_timesGets current conditions and today's high and low from The Weather Channel for a city, postcode, ZIP code or street address worldwide. Street addresses are geocoded exactly first; some observations omit gusts or other measurements.
weather.com/get_current_weather