---
name: nws-api-ingestion
description: "How to get National Weather Service API (api.weather.gov) data into a pandas DataFrame and Parquet: access, the request, the format, limits, quirks and terms."
---

# Load an NWS hourly point forecast into pandas and Parquet

Source entry: https://signal-lab-jet.vercel.app/datasets/nws-api
Provider: https://www.weather.gov/documentation/services-web-api
Checked against the provider's documentation: 2026-10-30

## Access
- No account or API key.
- A User-Agent header is required. Observed 2026-10-30: omitting the header returned HTTP 403.

## Request
```bash
curl -H 'User-Agent: SignalLabCatalog/1.0 (catalog@signal-lab.example)' 'https://api.weather.gov/points/41.88,-87.63'
```

## Format
GeoJSON/JSON-LD. The /points response links to forecastHourly; that response contains a properties.periods array with ISO 8601 times and forecast fields.

## Load into pandas and Parquet
Needs Python 3 with requests, pandas and pyarrow.
```python
"""NWS hourly point forecast for Chicago -> pandas -> Parquet. No key."""
import requests
import pandas as pd

HEADERS = {"User-Agent": "SignalLabCatalog/1.0 (catalog@signal-lab.example)"}
point = requests.get("https://api.weather.gov/points/41.88,-87.63", headers=HEADERS, timeout=30)
point.raise_for_status()
forecast_url = point.json()["properties"]["forecastHourly"]
forecast = requests.get(forecast_url, headers=HEADERS, timeout=30)
forecast.raise_for_status()
df = pd.DataFrame(forecast.json()["properties"]["periods"])
df["startTime"] = pd.to_datetime(df["startTime"], utc=True)
df["endTime"] = pd.to_datetime(df["endTime"], utc=True)
df.to_parquet("nws_chicago_hourly.parquet", index=False)
print(len(df), "hourly periods", df["startTime"].min().isoformat(), "to", df["startTime"].max().isoformat())
```
Run by us on 2026-10-30 (python 3.13.5 | pandas 3.1.0 | pyarrow 26.0.0 | requests 2.34.2). Result: 156 hourly periods 2026-10-30T14:00:00+00:00 to 2026-11-06T01:00:00+00:00

## Limits
- Rate limit: Not stated. NWS says the numeric limit is not public.
- The hourly point forecast covers the next seven days.

## Quirks
- Resolve coordinates through /points, then follow properties.forecastHourly; office and grid coordinates can change.
- Forecast timestamps carry offsets. Convert with utc=True before combining locations.
- This endpoint gives the current forecast, not a historical forecast archive.

## Terms and attribution
- NWS information is generally public-domain material unless marked otherwise. Do not claim it as your own, imply endorsement, or present modified content as official material.
- Check product timestamps and third-party markings.
- Terms page: https://www.weather.gov/disclaimer

## Sources
- https://www.weather.gov/documentation/services-web-api: "All of the information presented via the API is intended to be open data, free to use for any purpose."
- https://www.weather.gov/documentation/services-web-api: "A User Agent is required to identify your application."
- https://www.weather.gov/documentation/services-web-api: "The rate limit is not public information, but allows a generous amount for typical use."
- https://www.weather.gov/disclaimer: "The information on National Weather Service (NWS) Web pages are in the public domain, unless specifically noted otherwise, and may be used without charge for any lawful purpose"

## Help improve this skill
Missing a source, or see something to improve? Call the MCP tool suggest_source or feedback (or POST /api/suggest or /api/feedback). Reviewed ideas: https://signal-lab-jet.vercel.app/agent-suggestions

Information for educational purposes only. Free tiers, limits and licenses belong to the providers and may change; check the provider's own terms before using the data.
