REST Web Services
You can use this service to retrieve historical manually-recorded groundwater levels from hydrologic sites served by the USGS. If you are looking to retrieve data for real-time or recent groundwater levels recorded with automated equipment on a regular basis, please use the instantaneous values web service.
This service provides USGS groundwater data in WaterML, the legacy RDB (tab-delimited) format, and in a Web 2.0 friendly JSON format (which renders WaterML as JSON). The data in the service is identical to data available from the USGS Water Data for the Nation site .
Please join the USGS Water Data for the Nation Notification List . This way you will receive an announcement when changes are made to this web service, or if it there are significant problems with the service.
With millions of groundwater levels collected at sites across the nation, the amount of data available is very large. No one user is allowed to download all of the data with a single call. The service has consequently been designed and engineered to facilitate common mass queries, defaulting to returning a narrower set of data. You are encouraged to make your queries efficient too, mindful that many others need access to the data at the same time. Always specify the minimum amount of data you need in your request, using built in filters and date ranges to the maximum extent possible.
Probably the best way to learn how to use the service is to try it out!
The USGS provides this tool that allows you to generate syntactically correct calls to the service. You can even run the query live in your browser. When you have perfected your query you can copy and paste the URL into your application to get the precise data you need.
Typically data is downloaded as plain text via Hypertext Transfer Protocol (HTTP). However, gzip compression is supported by this service. Use of gzip compression may markedly speed up acquisition of data, particularly on large queries. It also is a more efficient use of USGS servers, so we appreciate when you are thoughtful enough to use it. Whether you can receive the data in gzip compressed formats depends on the capabilities of your client. Web browsers support gzip compression natively, but most regular users will use specialized utility programs like wget
and curl
to acquire data. If you can handle gzip compression, please place the following string into your HTTP request headers: Accept-Encoding: gzip, compress
curl and wget are typically used to download data. They may be configured to use gzip compression if the server will accept it. You may also explicitly have to tell it to use gzip compression. If so these tips should work:
gzip files are typically returned as a file with a .gz file suffix unless you instruct your program to uncompress it. See the gzip man page for instructions on uncompressing .gz files.
When using format=waterml (the default format), data are returned in XML using the WaterML 1.1 schema
. WaterML
is a schema that has recently been adopted by the Open Geospatial Consortium
. The crucial data are the groundwater level values, which can be found inside the <value> tag. Example:
Please also note that the values found for this site are associated with the variable node that precedes it. The variable node indicates the parameter that is being measured or calculated. In this case, both the <ns1:values> and <ns1:variable> nodes are nested within the <ns1:timeSeries> node.
Putting it altogether, this means that for this site, two manual groundwater level measurements were recorded: 145 feet below the surface of the land on August 28, 1968 and 311.5 feet below the surface of the land on September 16, 1980.
The option code of 00011 indicates the type of statistics code that was measured. For groundwater levels, the statistics code of 00011 will typically be used, as it represents discrete manual measurements. A list of statistics codes can be found here .
With other output formats, the location of the data will depend on the syntax of the format. You will need to inspect the format to locate the relevant data.
Note: the current version of WaterML is 1.1. WaterML 1.2 is an unofficial variant created by the USGS needed to accommodate the discrete data provided by this service, and is referenced in a USGS name space.
Returning tab delimited data provides the same data is a more succinct format. A partial excerpt is shown:
Tab-delimited output does not indicate which USGS parameter code is associated with the measurements. This is true on the USGS Water Data for the Nation site as well. WaterML requires an associated <variable> tag with a measurement. To accommodate this request, the USGS assigns these data an appropriate USGS parameter code to the output, which is typically 72019.
Since this system uses Hypertext Transfer Protocol (HTTP), any application errors are reported in the HTTP headers, which are normally not seen. This means that when writing applications, when you get a response it is important to first examine the HTTP status code that is returned in the HTTP response. The application server will return the error code along with a message describing the error in the event there is a problem. Programmers should always check the HTTP response code and if not a 200 handle the response as an exception. Among the status codes you may see:
HTTP Error Code | HTTP Error Code Description | Explanation |
---|---|---|
200 | OK | The request was successfully executed and some data should have been returned. |
304 | Not_Modified | This indicates your request was redirected using the proper URL. This may occur if the "path" of your URL is not fully qualified. Ideally a / is placed before the ? in the URL. Adding in this slash may make this go away. However, the request should still be processed. If this becomes annoying, you may also be able to tell your client program to automatically follow redirects. |
400 | Bad_Request | This often occurs if the URL arguments are inconsistent. An accompanying error should describe why the request was bad. Reasons include:
|
403 | Access_Forbidden | This should only occur if for some reason the USGS has blocked your Internet Protocol (IP) address from using the service. This can happen if we believe that your use of the service is so excessive that it is seriously impacting others using the service. To get unblocked, send us the URL you are using along with your client's IP using this form. We may require changes to your query and frequency of use in order to give you access to the service again. |
404 | Not_Found | Returned if and only if the query expresses a combination of elements where data do not exist. For multi-site queries, if any data are found, it is returned for those site/parameters/date ranges where there are data. Conditions that would return a 404 Not Found include:
|
500 | Internal_Server_Error | If you see this, it means there is a problem with the web service itself. It usually means the application server is down unexpectedly. This could be caused by a host of conditions but changing your query will not solve this problem. The application support team has to fix it. Most of these errors are quickly detected and the support team is notified if they occur. |
503 | Service_Unavailable | The server is currently unable to handle the request due to a temporary overloading or maintenance of the server. The implication is that this is a temporary condition which will be alleviated after some delay. |
Adobe Flex requires our server have a crossdomain.xml file
indicating those domains that can access our web service using Adobe Flex. We are adding these on a case by case basis. If you need to access the service using Adobe Flex or the Flex API, please contact us using this form and indicate the domain of the server that will access the service.
This service supports the Cross-Origin Resource Sharing (CORS) specification. CORS permits browser-based asynchronous access to the service even though content originates from a server different than the one serving the web page. Otherwise the browser's security controls would not allow content to come from USGS servers. Most, but not all browsers, support CORS. Some frameworks, like jQuery through the Ajax
crossDomain setting, support CORS automatically.
The URL must always be in this format:
http://waterservices.usgs.gov/nwis/gwlevels?<arguments>
where <arguments> are one or more HTTP GET parameter names and values based on the information below.
You specify the arguments that go in <arguments>.
Here is an example of a valid URL that should return data:
URL argument names and URL argument values can be in upper, lower or mixed case. They will all be handled correctly. All of the following will yield the same result:
http://waterservices.usgs.gov/nwis/gwlevels?stateCd=ny
http://waterservices.usgs.gov/nwis/gwlevels?statecd=ny
http://waterservices.usgs.gov/nwis/gwlevels?STATECD=ny
http://waterservices.usgs.gov/nwis/gwlevels?stateCd=NY
http://waterservices.usgs.gov/nwis/gwlevels?STATECD=NY
http://waterservices.usgs.gov/nwis/gwlevels?stateCd=Ny
The following conventions are used below to document URL argument values:
arg1=[ a {,x | ,y} | b | c,d,...]
In the above example, these would be the allowed legal values:
A major filter is required to ensure fair access to the service. It prevents any one user from downloading all data in a single call, thus allowing others to share the service at the same time with minimal processing delays.
Want to only query one site? Use site (or sites) as your major filter, and put only one site number in the list! Example:
http://waterservices.usgs.gov/nwis/gwlevels?site=375907091432201
Major Filter (select one of the following) |
Meaning | Minimum Number of Argument Values | Maximum Number of Argument Values | Examples |
---|---|---|---|---|
sites (aliases: site, location) | A list of site numbers. For this service, the site number needs to be a groundwater site number, which is typically 15 characters. You can specify unlimited number of sites, up to the limit supported by the client, the application server and the HTTP GET protocol. Site numbers are comma separated. Sites may be prefixed with an optional agency code followed by a colon. If you don't know the site numbers you need, you can find relevant sites with the NWIS Mapper ![]() ![]() |
1 | Unlimited (see caveats) | &site=375907091432201 &sites=USGS:375907091432201 &sites=375907091432201,360425089485001 |
stateCd (alias: stateCds) |
U.S. postal service (2-digit) state code. USPS List of State Codes. ![]() |
1 | 1 | &stateCd=NY |
huc (alias: hucs) |
A list of hydrologic unit codes (HUC) or aggregated watersheds. Only 1 major HUC (2-digits) can be specified per request. Up to 10 minor HUCs may be specified. A major HUC has two digits. Minor HUCs must be eight digits in length. Caution: not all sites have been associated with a HUC. List of HUCs. ![]() |
1 | 1 Major, 10 Minor | &huc=01,02070010 |
bBox | A contiguous range of decimal latitude and longitude, starting with the west longitude, then the south latitude, then the east longitude, and then the north latitude with each value separated by a comma. The product of the range of latitude and longitude cannot exceed 25 degrees. Whole or decimal degrees must be specified, up to six digits of precision. Minutes and seconds are not allowed. Remember: western longitude (which includes almost all of the United States) is specified in negative degrees. Caution: many sites outside the continental US do not have latitude and longitude referenced to NAD83 and therefore can not be found using these arguments. Certain sites are not associated with latitude and longitude due to homeland security concerns and cannot be found using this filter. | 1 | 1 | &bBox=-83,36.5,-81,38.5 |
countyCd (alias: countyCds) |
A list of county numbers, in a 5 digit numeric format. The first two digits of a county's code are the FIPS State Code. ![]() ![]() |
1 | 20 | &countyCd=51059,51061 |
URL Argument Name | format |
---|---|
Description | Used to specify the output format of the data returned.
|
Syntax | format=[waterml{,1.2} | waterml,2.0 | rdb{,1.0} | json{,1.2}] |
Default | waterml |
Minimum argument values required | 1 |
Maximum argument values allowed | 1 |
Examples |
|
Minor filters further reduce the set of expected results and are applied after data is first filtered by the major filter you specified. You are encouraged to use minor filters to minimize the amount of data sent.
I want to... | Do this... | Syntax Rules | Examples |
---|---|---|---|
Get the latest manually recorded groundwater level only for a site | Nothing. Only the latest manually recorded groundwater level is returned by default for each requested site and parameter. |
|
&stateCd=ny // Get the latest groundwater levels (excluding those recorded by automated means) for all sites in New York state |
Get a range of groundwater levels from now | Specify the period argument |
|
&period=P7D (Retrieve groundwater levels that occurred in the last seven days) |
Get a range of groundwater levels from an explicit begin or end date/time | Use the startDT and endDT arguments |
|
&startDT=2000-01-01&endDT=2009-12-31 // All groundwater levels for a decade &startDt=2010-11-22&endDT=2010-11-22 // Full day, from 00:00 to 23:59 site local time |
Get groundwater levels for all applicable sites where any groundwater levels were changed or added during a given period from now | Use the modifiedSince argument |
|
&stateCd=NY&modifiedSince=P1W - All NY sites with groundwater levels are retrieved only if some groundwater levels were changed in the last week.
|
URL Argument Name | siteStatus |
---|---|
Description | Selects sites based on whether or not they are active. If a site is active, it implies that it is being actively maintained. A site is considered active if:
If it does not meet these criteria, it is considered inactive. Some exceptions apply. If a site is flagged by a USGS water science center as discontinued, it will show as inactive. A USGS science center can also flag a new site as active even if it has not collected any data. The default is all (show both active and inactive sites). |
Syntax | siteStatus=[ all | active | inactive ] |
Default | all - sites of any activity status are returned |
Minimum argument values required | 1 |
Maximum argument values allowed | 1 |
Examples |
|
URL Argument Name | parameterCd (aliases: variable, parameterCds, variables, var, vars, parmCd) |
---|---|
Description |
|
Syntax | parameterCd|variable={parameterCd1,parameterCd2,...} |
Default | returns all groundwater parameters for the requested sites |
Minimum argument values required | 1 |
Maximum argument values allowed | 100 |
Examples |
|
URL Argument Name | siteType (aliases: siteTypes, siteTypeCd, siteTypeCds) |
---|---|
Description |
|
Syntax | siteType={siteType1,siteType2,...} |
Default | All site types are returned |
Minimum argument values required | 1 |
Maximum argument values allowed | No limit |
Examples |
|
URL Argument Name | agencyCd (alias:agencyCds) |
---|---|
Description |
|
Syntax | agencyCd=agencyCd1 |
Default | All sites regardless of agency code are retrieved |
Minimum argument values required | 1 |
Maximum argument values allowed | 1 |
Examples |
|
URL Argument Name |
|
---|---|
Description |
|
Syntax |
|
Default | All sites are retrieved, regardless of their altitude |
Minimum argument values required | 1 |
Maximum argument values allowed | 1 |
Examples |
|
URL Argument Names |
|
---|---|
Description |
|
Syntax |
|
Default | All sites are retrieved, regardless of their well depth |
Minimum argument values required | 1 |
Maximum argument values allowed | 1 |
Examples |
|
URL Argument Names |
|
---|---|
Description |
|
Syntax |
|
Default | All sites are retrieved, regardless of their hole depth |
Minimum argument values required | 1 |
Maximum argument values allowed | 1 |
Examples |
|
URL Argument Names |
|
---|---|
Description |
|
Syntax |
|
Default | all |
Minimum argument values required | 0 |
Maximum argument values allowed | 1000 |
Examples |
|
URL Argument Names |
|
---|---|
Description |
|
Syntax |
|
Default | all |
Minimum argument values required | 0 |
Maximum argument values allowed | 1000 |
Examples |
|
Here is a simple example using the popular PHP scripting language that retrieves all manually recorded groundwater levels recorded in Broome County, New York during 2011. PHP is popular on web servers for serving dynamic content. It may be useful in understanding how to access the service and traverse XML trees but should not be used as a "best practice" way of retrieving data.
Please provide any feedback you have on this service using this form.