Files

213 lines
6.7 KiB
Markdown

---
title: "NOAA Climate Data Online (CDO) API Reference"
task: ""
lineage_type: import
upstream_source: https://github.com/K-Dense-AI/scientific-agent-skills/blob/9c9bd2e9/skills/database-lookup/references/noaa.md
upstream_sha: 9c9bd2e9
imported_at: 2026-06-26
prompt_class: prompt
upstream_changes: accepted
author: upstream
validated: false
---
# NOAA Climate Data Online (CDO) API Reference
## Base URL
```
https://www.ncdc.noaa.gov/cdo-web/api/v2
```
## Authentication
- **API Token: REQUIRED.** Request a free token at https://www.ncdc.noaa.gov/cdo-web/token
- Pass as HTTP header: `Token: YOUR_TOKEN`
## Rate Limits
- **5 requests per second** per token.
- **10,000 requests per day** per token.
- Queries are limited to **1,000 results per request** (use `offset` for pagination).
- Date ranges limited to **1 year per request** for the `/data` endpoint.
## Common Parameters (apply to most endpoints)
| Parameter | Type | Required | Default | Description |
|---------------|--------|----------|---------|-------------|
| `datasetid` | string | Varies | - | Dataset ID (e.g. `GHCND`, `GSOM`). |
| `datatypeid` | string | No | - | Data type filter (e.g. `TMAX`, `PRCP`). |
| `locationid` | string | No | - | Location ID (e.g. `FIPS:37`, `ZIP:28801`, `CITY:US390029`). |
| `stationid` | string | No | - | Station ID (e.g. `GHCND:USW00013874`). |
| `startdate` | string | Varies | - | ISO date `YYYY-MM-DD`. |
| `enddate` | string | Varies | - | ISO date `YYYY-MM-DD`. |
| `units` | string | No | `standard` | `standard` or `metric`. |
| `limit` | int | No | 25 | Results per page (max 1000). |
| `offset` | int | No | 1 | Pagination offset (1-based). |
| `sortfield` | string | No | - | Field to sort by (e.g. `date`, `name`). |
| `sortorder` | string | No | `asc` | `asc` or `desc`. |
---
## Key Endpoints
### 1. Data (Observations)
```
GET /data
```
Returns actual observation data. This is the primary data retrieval endpoint.
**Required parameters:** `datasetid`, `startdate`, `enddate`.
**Example -- daily max temperature for a station:**
```bash
curl -H "Token: YOUR_TOKEN" \
"https://www.ncdc.noaa.gov/cdo-web/api/v2/data?datasetid=GHCND&datatypeid=TMAX&stationid=GHCND:USW00013874&startdate=2024-01-01&enddate=2024-01-31&units=metric&limit=31"
```
**Response:**
```json
{
"metadata": {
"resultset": {
"offset": 1,
"count": 31,
"limit": 31
}
},
"results": [
{
"date": "2024-01-01T00:00:00",
"datatype": "TMAX",
"station": "GHCND:USW00013874",
"attributes": ",,W,2400",
"value": 12.2
},
{
"date": "2024-01-02T00:00:00",
"datatype": "TMAX",
"station": "GHCND:USW00013874",
"attributes": ",,W,2400",
"value": 8.9
}
]
}
```
Note: When `units=standard`, GHCND temperature values are in tenths of degrees C. With `units=metric`, they are converted to degrees C.
### 2. Datasets
```
GET /datasets
GET /datasets/{id}
```
Lists available datasets or gets details for one.
**Example:**
```bash
curl -H "Token: YOUR_TOKEN" \
"https://www.ncdc.noaa.gov/cdo-web/api/v2/datasets?limit=10"
```
**Key Dataset IDs:**
| ID | Name | Description |
|----------|------|-------------|
| `GHCND` | Daily Summaries | Global daily station observations (TMAX, TMIN, PRCP, SNOW, etc.) |
| `GSOM` | Global Summary of the Month | Monthly aggregates |
| `GSOY` | Global Summary of the Year | Annual aggregates |
| `NORMAL_DLY` | Climate Normals Daily | 30-year daily normals |
| `NORMAL_MLY` | Climate Normals Monthly | 30-year monthly normals |
| `PRECIP_15` | Precipitation 15-Minute | Sub-hourly precipitation |
| `PRECIP_HLY` | Precipitation Hourly | Hourly precipitation |
### 3. Data Types
```
GET /datatypes
GET /datatypes/{id}
```
Lists available data types, optionally filtered by dataset.
**Example:**
```bash
curl -H "Token: YOUR_TOKEN" \
"https://www.ncdc.noaa.gov/cdo-web/api/v2/datatypes?datasetid=GHCND&limit=50"
```
**Common GHCND Data Types:**
| ID | Description |
|--------|-------------|
| `TMAX` | Maximum temperature |
| `TMIN` | Minimum temperature |
| `TAVG` | Average temperature |
| `PRCP` | Precipitation |
| `SNOW` | Snowfall |
| `SNWD` | Snow depth |
| `AWND` | Average wind speed |
| `WSF2` | Fastest 2-minute wind speed |
### 4. Stations
```
GET /stations
GET /stations/{id}
```
Find weather stations, optionally filtered by location, dataset, or extent.
**Additional Parameters:**
| Parameter | Type | Description |
|-----------|--------|-------------|
| `extent` | string | Bounding box: `south_lat,west_lon,north_lat,east_lon`. |
**Example -- stations near Asheville, NC with daily data:**
```bash
curl -H "Token: YOUR_TOKEN" \
"https://www.ncdc.noaa.gov/cdo-web/api/v2/stations?datasetid=GHCND&locationid=ZIP:28801&limit=10"
```
**Response:**
```json
{
"metadata": {"resultset": {"offset": 1, "count": 5, "limit": 10}},
"results": [
{
"elevation": 661.1,
"mindate": "1893-01-01",
"maxdate": "2024-11-15",
"latitude": 35.5951,
"name": "ASHEVILLE REGIONAL AIRPORT, NC US",
"datacoverage": 1,
"id": "GHCND:USW00013874",
"elevationUnit": "METERS",
"longitude": -82.5572
}
]
}
```
### 5. Locations & Location Categories
```
GET /locations
GET /locations/{id}
GET /locationcategories
GET /locationcategories/{id}
```
Browse location hierarchies (countries, states, cities, zip codes, climate regions).
**Example:**
```bash
curl -H "Token: YOUR_TOKEN" \
"https://www.ncdc.noaa.gov/cdo-web/api/v2/locations?locationcategoryid=ST&limit=52"
```
Location category IDs: `CITY`, `CLIM_DIV`, `CLIM_REG`, `CNTRY`, `CNTY`, `HYD_ACC`, `HYD_CAT`, `HYD_REG`, `HYD_SUB`, `ST`, `ZIP`.
---
## Workflow: Finding and Querying Data
1. **Find a dataset:** `GET /datasets` to list available datasets.
2. **Find a station:** `GET /stations?datasetid=GHCND&locationid=ZIP:28801` to find nearby stations.
3. **Check available data types:** `GET /datatypes?datasetid=GHCND&stationid=GHCND:USW00013874`.
4. **Query data:** `GET /data?datasetid=GHCND&stationid=GHCND:USW00013874&datatypeid=TMAX,TMIN&startdate=2024-01-01&enddate=2024-12-31&units=metric&limit=1000`.
## Notes
- The `/data` endpoint enforces a **1-year max date range** per request. For multi-year queries, make sequential requests.
- Pagination: `offset` is 1-based. Loop until `offset + limit > count` from the metadata.
- Station IDs include a dataset prefix (e.g. `GHCND:USW00013874`).
- The `attributes` field in data results contains quality flags (comma-separated). Consult dataset documentation for flag meanings.
- Token goes in the header, not as a query parameter.