How it will work: 3 steps
- Follow us on ApifyThe tool is built and waits in the queue for the Apify Store. Apify is the cloud platform where our tools run.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
01646500in USGS station numbers. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
Export USGS river discharge and gage height into clean JSON or CSV files. Choose station numbers, a US state or a map area, and get recent history or the latest readings with units and approval status. No USGS account or API key is needed.
Who uses it
Hydrologists and engineers
Get recent flow data for a few stations.
Anglers and paddlers
Check the latest river flow at your spots.
Data teams
Feed water readings into a dashboard on a schedule.
Price
Prices will be shown after release.
Questions
How far back can I go?
One run covers up to 31 days. Use several runs for a longer time.
What does Provisional mean?
USGS has not approved the reading yet. It can still change.
Do I need a USGS account?
No. You do not need an account or API key.
How many stations can I add?
Up to 20 station numbers per run, or one state, or one map box.
Is a USGS key needed?
No. The tested route works without one. USGS rate limits still apply, including on shared cloud IPs.
Does zero mean a missing value?
No. Numeric zero stays zero. Missing and non-numeric source values have value: null; rawValue keeps the source text when present.
Are timestamps local?
dateTime is UTC. sourceDateTime keeps the source offset. timeZone is the station's USGS abbreviation; it is not an IANA time-zone identifier. usesDaylightSavings keeps the source flag.
Can I fetch all historical data in one run?
No. Each export is limited to 31 days and 1000 observations. Use smaller windows and inspect completeness.
Can I replace an older WaterServices tool without changes?
The core station and measurement fields are similar, but UTC dates, qualifier arrays, unit text and parameter names may differ. Approval status is a separate field. Older input fields and daily-value mode are not supported.
Details
Step by step on Apify
- Open Input. The example has three stations, discharge and the last seven days.
- Keep
maxResultsat 200 for a small first export. - Click Start.
- Open Water observations to see station, value, units, time and approval status.
- Open Run summary to check the status and any limit reason.
Use cases
| Need | Input | Key fields |
|---|---|---|
| Research a recent river period | sites + date range | rawValue, dateTime, unit, approvalStatus |
| Compare current stations | sites + latestOnly | site, value, unit, sourceUpdatedAt |
| Explore a small region | state or bbox | siteName, latitude, longitude, parameterCode |
Tips for better results
- Keep the leading zeros in station numbers, like 01646500.
- Use code 00060 for discharge and 00065 for gage height.
- Read the run summary. A small row limit can fill with the first station.
Limits and good to know
This is a continuous-data export, not a flood warning service. It does not fetch daily aggregates, field measurements or water-quality samples. It does not convert units or infer missing readings. Metadata may be null if the source has no station details.
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"observationId": "66a4e3fb8abe42fcb0942b5c0fe98f68:2026-10-13T13:50:00.000Z",
"site": "01646500",
"siteName": "POTOMAC RIVER NEAR WASH, DC LITTLE FALLS PUMP STA",
"latitude": 38.949777777777776,
"longitude": -77.12763888888888,
"parameterCode": "00060",
"parameterName": "Discharge",
"unit": "ft^3/s",
"value": 11300,
"rawValue": "11300",
"dateTime": "2026-10-13T13:50:00.000Z",
"sourceDateTime": "2026-10-13T13:50:00+00:00",
"timeZone": "EST",
"usesDaylightSavings": true,
"qualifiers": null,
"approvalStatus": "Provisional",
"statistic": "00011",
"timeSeriesId": "66a4e3fb8abe42fcb0942b5c0fe98f68",
"provider": "USGS",
"sourceUrl": "https://api.waterdata.usgs.gov/ogcapi/v1/collections/latest-continuous/items?f=json&limit=20¶meter_code=00060&time=2026-10-06T14%3A22%3A05.011Z%2F2026-10-13T14%3A22%3A05.011Z&monitoring_location_id=USGS-01646500%2CUSGS-09380000%2CUSGS-03339000",
"fetchedAt": "2026-10-13T14:22:05.607Z",
"sourceUpdatedAt": "2026-10-13T13:58:17.797147+00:00",
"licence": "USGS public domain"
}Data fields (23)
| Field | Type | Meaning |
|---|---|---|
observationId | string | Stable time-series ID plus UTC timestamp; safe for joining repeat exports. |
site | string | USGS station number, preserving leading zeros. |
siteName | string | Name from the monitoring-locations endpoint. |
latitude | number | Station latitude in WGS84 degrees. |
longitude | number | Station longitude in WGS84 degrees. |
parameterCode | string | Five-digit USGS measurement parameter code. |
parameterName | string | Name from the USGS parameter-codes endpoint. |
unit | string | Units exactly as reported with the observation. |
value | number | Numeric value when parseable; null for missing or non-numeric values. Use rawValue for full precision. |
rawValue | string | Exact source value string; no rounding. |
dateTime | string | Observation timestamp normalized to UTC ISO 8601. |
sourceDateTime | string | Original timestamp with source offset. |
timeZone | string | Station time zone abbreviation; not an IANA time zone. |
usesDaylightSavings | boolean | Whether USGS marks the station as using daylight savings. |
qualifiers | array | USGS observation qualifier codes as an array; scalar source codes are wrapped. Null means none supplied. See approvalStatus separately. |
approvalStatus | string | USGS Approved or Provisional; provisional values may be revised. |
statistic | string | USGS statistic code, for example 00011 for instantaneous data. |
timeSeriesId | string | USGS time-series identifier. |
provider | string | USGS data source. |
sourceUrl | string | API page from which this observation was fetched. |
fetchedAt | string | Fetch time in UTC. |
sourceUpdatedAt | string | Source last_modified timestamp; a refresh does not always mean the measurement changed. |
licence | string | USGS public domain attribution. |
Input settings (9)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| USGS station numbers | sites | array | ["01646500", "09380000", "03339000"] |
| State FIPS code | state | string | |
| Map bounding box | bbox | array | |
| Parameter codes | parameters | array | ["00060"] |
| Latest reading only | latestOnly | boolean | false |
| Recent days | lastDays | integer | 7 |
| Start date (UTC) | startDate | string | |
| End date (UTC) | endDate | string | |
| Maximum observations | maxResults | integer | 200 |
