Synoptic Data APIviewer.synopticdata.com ↗
Retrieve the latest air temperature and observation time for up to 50 weather stations at once from the Synoptic Data public viewer via a single API endpoint.
What is the Synoptic Data API?
The Synoptic Data Viewer API gives developers access to real-time weather station observations through 1 endpoint, get_latest_observations, returning 8 fields per station including air temperature, coordinates, elevation, and UTC observation time. Submit up to 50 comma-separated station IDs in a single request and get back the most recent reading — within the last 24 hours — for each station the public viewer exposes.
curl -X GET 'https://api.parse.bot/scraper/55ee0dfb-c998-42ad-810f-0c23ab1022a2/get_latest_observations?station_ids=KMIA%2CKOPF%2CKFLL%2CKFXE%2CKPMP' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace viewer-synopticdata-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Synoptic Data Viewer — fetch latest weather observations."""
from parse_apis.viewer_synopticdata_com_api import Synoptic, TempUnit, InputFormatInvalid
client = Synoptic()
# Fetch the full observation report for several South Florida airports.
report = client.observation_reports.fetch(
station_ids="KMIA,KOPF,KFLL,KFXE,KPMP",
temp_unit=TempUnit.F,
)
print(f"Requested: {report.requested_count}, Found: {report.found_count}")
if report.missing_station_ids:
print("Missing:", report.missing_station_ids)
# Iterate individual station rows via the paginated list accessor.
for station in client.stations.list(station_ids="KMIA,KFLL", limit=5):
print(
station.station_id,
station.name,
f"{station.air_temp} {station.temp_unit}",
station.observation_time,
)
# Demonstrate typed error handling for malformed input.
try:
client.observation_reports.fetch(station_ids="K MIA;x")
except InputFormatInvalid as exc:
print(f"Bad input: {exc.message}")
print("exercised: observation_reports.fetch / stations.list / InputFormatInvalid")
Returns the most recent air-temperature observation (within the last 24 hours) and its UTC observation time for each requested station, one row per station that the public viewer can see, in a single round trip. Stations that the viewer does not expose (unknown IDs, or restricted networks such as the 1-minute 'High Frequency ASOS' stations whose IDs end in 1M) are omitted from `stations` and listed in `missing_station_ids`; a request where every station is missing is a successful response with an empty `stations` array. `air_temp` is expressed in the unit named by `temp_unit` on each row, which follows the optional temperature-unit selector (Celsius when omitted). `observation_time` is an ISO-8601 UTC timestamp.
| Param | Type | Description |
|---|---|---|
| temp_unit | string | Temperature unit for air_temp. |
| station_idsrequired | string | Comma-separated station identifiers as shown in the viewer, e.g. KMIA,KOPF (1-50 IDs; letters, digits, _ or -). Case-insensitive; the scraper upper-cases them. |
{
"type": "object",
"fields": {
"stations": "array of per-station rows: station_id, name, network_id, latitude, longitude, elevation_ft, status, air_temp (number in temp_unit), temp_unit, observation_time (ISO-8601 UTC)",
"found_count": "integer, number of stations returned",
"requested_count": "integer, number of station IDs requested",
"missing_station_ids": "array of requested IDs the viewer did not return (unknown or restricted)"
},
"sample": {
"data": {
"stations": [
{
"name": "Miami, Miami International Airport",
"status": "ACTIVE",
"air_temp": 29,
"latitude": 25.79056,
"longitude": -80.31639,
"temp_unit": "Celsius",
"network_id": "1",
"station_id": "KMIA",
"elevation_ft": 10,
"observation_time": "2026-10-03T05:15:00Z"
}
],
"found_count": 1,
"requested_count": 1,
"missing_station_ids": []
},
"status": "success"
}
}About the Synoptic Data API
What the API Returns
The get_latest_observations endpoint accepts a required station_ids parameter — a comma-separated list of 1 to 50 station identifiers using letters, digits, underscores, or hyphens (e.g. KMIA,KOPF). For each recognized station, the response includes station_id, name, network_id, latitude, longitude, elevation_ft, status, and air_temp. The air_temp value is returned in the unit specified by the optional temp_unit parameter, defaulting to the viewer's standard unit when omitted.
Response Shape and Coverage Signals
Every response includes three top-level fields that help you audit coverage: found_count (how many stations were matched), requested_count (how many IDs you submitted), and missing_station_ids (an array of IDs the viewer did not return). A station appears in missing_station_ids when its ID is unknown to the public viewer or when the viewer restricts its data — this lets you detect gaps without parsing error messages.
Freshness and Scope
Observations are scoped to the last 24 hours. Stations outside that window or restricted from the public viewer are excluded from the stations array and listed in missing_station_ids instead. Station coverage reflects what the Synoptic Data public viewer at viewer.synopticdata.com exposes, which spans a broad network of surface weather stations primarily across the United States.
The Synoptic Data API is a managed, monitored endpoint for viewer.synopticdata.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when viewer.synopticdata.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official viewer.synopticdata.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Display current air temperature on a map by pulling
latitude,longitude, andair_tempfor a set of nearby stations. - Monitor airport weather conditions by querying ICAO-style station IDs (e.g. KMIA) and tracking observation timestamps.
- Validate data pipelines by comparing
found_counttorequested_countand alerting whenmissing_station_idsis non-empty. - Build elevation-aware weather dashboards using the
elevation_ftfield alongside temperature readings. - Archive hourly snapshots of station readings for trend analysis using the UTC observation time returned per station.
- Cross-reference
network_idvalues to segment observations by monitoring network for research or operational workflows.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Synoptic Data have an official developer API?+
What does the `missing_station_ids` field tell me?+
found_count and requested_count together to quickly detect partial responses.Is historical weather data or multi-day observations covered?+
Can I retrieve additional weather variables like wind speed, humidity, or precipitation?+
air_temp as the only meteorological measurement alongside station metadata. You can fork this API on Parse and revise it to surface additional variables from the viewer if they are available for the stations you need.How many stations can I request in a single call, and what ID format is expected?+
station_ids parameter, which accepts a comma-separated string of identifiers composed of letters, digits, underscores, or hyphens. IDs follow the conventions used in the Synoptic Data public viewer, such as KMIA or KOPF.