A Practical Guide to Tracking Lake San Antonio Water Level History
If you've ever needed to pull historical water level data for Lake San Antonio, you've probably already hit the wall of clunky government websites, missing data points, and formats that require actual work to parse. I spent too many afternoons wrestling with this stuff, so here's what actually works. The primary source is the USGS National Water Information System (NWIS). Lake San Antonio has multiple gauge stations around it, with the main one being USGS station 08170500 on the North Fork San Antonio River near San Antonio. This station has been recording water levels since at least the late 1960s, which gives you roughly fifty-plus years of continuous data. The USGS also tracks outflow from the lake through the dam, so you'll find both pool elevation and discharge data. The pool elevation readings are what most people mean when they ask about water level history. These are measured in feet relative to the NAVD 88 datum, which is the standard vertical reference used across the country.
Beyond USGS, the City of San Antonio's Public Works department and the Edwards Aquifer Authority maintain their own records, sometimes with slightly different timestamps or measurement intervals. I've found that cross-referencing all three sources catches gaps that show up when you only check one.
How to Actually Download and Use the Data
The USGS website will let you pull data through a web form, but the interface is sluggish and exports as a CSV that's barely readable without cleanup. Here's the faster way: use the USGS NWIS web service directly. The endpoint is straightforward. You request a time series for station 08170500, parameter code 00065 (which is gage height in feet), and a date range. The response comes back as JSON or CSV depending on your format parameter. A typical query for ten years of daily data returns about 3,650 rows. Processing that raw dump takes about 15 to 20 minutes if you're doing it manually, but if you script it, the whole pipeline from query to clean spreadsheet runs in under five minutes. I wrote a small Python script using the requests library and pandas. It pulls the data, flags any days marked as estimated rather than measured, removes the flagged rows unless you specifically need them, and outputs a clean CSV. Estimated values are marked with a qualifier code in the USGS data, and they're scattered throughout the record in ways that aren't obvious at first glance. About 4 to 6 percent of the daily records carry an estimated flag, usually during periods of ice, debris blockage, or gauge maintenance. Ignoring that qualifier will bite you if you're doing any kind of engineering or hydrological analysis.
Get the Full Details

The script itself isn't anything fancy. It's roughly eighty lines. I keep it on GitHub under a generic name so I don't have to reconstruct it every time I need fresh data. You can grab it and adapt it to your own date ranges and output format.
Pitfalls Nobody Talks About
One thing that trips people up is the difference between instantaneous readings and daily statistics. The USGS reports both. Instantaneous values are recorded every fifteen or thirty minutes and fluctuate with wind, barometric pressure, and downstream flow conditions. Daily values are the mean of those readings, but they can mask significant short-term swings. If you're trying to reconstruct what the lake actually looked like on a specific day, the daily mean might show 1,452 feet while the actual readings that day ranged from 1,448 to 1,456 feet. That four-foot swing matters if you're assessing flood risk or recreational access. Another issue is the datum shift. Older records before the 1990s were sometimes referenced to NGVD 29 instead of NAVD 88. The difference is roughly 0.5 to 1.0 feet depending on the location. The USGS metadata usually notes this, but it's easy to miss if you're just scanning the raw numbers. I ran into this when a client asked me to compare current lake levels against a report from 1987. The numbers looked almost two feet higher than expected until I caught the datum difference. Applying the correct offset brought everything into alignment. The dam operations at Lake San Antonio also create artificial jumps in the data. The lake is managed for flood control, municipal water supply, and recreation, which means operators intentionally raise and lower the pool level. There are periods where the water drops more than three feet in a single week during dry seasons. That's not a measurement error, but it looks like one if you're not aware of the operational context. The Texas Commission on Environmental Quality publishes annual operation summaries that explain the major drawdowns and refills. Reading those alongside the raw data prevents a lot of false conclusions.
What the Long-Term Trends Actually Show
Looking at the full record, the lake has experienced some severe low-water periods. The early 1950s drought dropped the pool significantly, and the more recent droughts in 2011 and 2022 produced some of the lowest readings on record. In 2022, the lake fell below 1,430 feet at its lowest point, which triggered mandatory conservation measures in surrounding communities. The 2011 drought was worse in terms of duration but the 2022 event was sharper and caught more people off guard because it followed several above-average precipitation years. On the high side, the lake has exceeded 1,470 feet during major flood events, most notably in 1977 and again in 1998 and 2004. Those high-water periods are well documented in USGS reports and local news archives, but the raw gauge data tells you exactly how long each event lasted and how quickly the water receded. The recession rate is usually faster than the rise rate, which is typical for reservoirs in this region with limited natural inflow and heavy reliance on storm runoff from the watershed.

Where Else to Look If the Main Source Doesn't Have What You Need
If the USGS record has gaps for the period you're interested in, the next stop is the San Antonio Metropolitan Hydologic District. They maintain stream gauge data for the entire basin and sometimes fill in missing intervals with modeled estimates. Those estimates aren't as reliable as direct measurements, but they're the best option when the gauge went offline for repairs or was destroyed during a flood event. The University of Texas at Austin's Center for Research in Water Resources also has archived data from older monitoring stations that predate the current USGS network. Some of those records go back to the 1940s and include measurements from gauges that no longer exist. The data quality varies, and the instrumentation was much cruder, but for historical context they're useful. Local historical societies and newspaper archives like the San Antonio Express-News digital collection can supplement the technical data with context about how low or high the water got during notable events. A gauge reading alone doesn't tell you that a particular drawdown led to school closures or boating bans, but the news coverage does.
The whole process from finding the right station number to cleaning the data and cross-checking it against operational reports takes anywhere from thirty minutes to a couple of hours depending on how far back you're going and how much manual verification you need. If you automate the pull and just focus on the validation step, you can get a reliable dataset in under an hour.