# Climate Sight API
- **OpenAPI Version:** `3.1.1`
- **API Version:** `2026-01-01`
Climate Sight provides real-time weather data from 15+ diverse sources including government agencies (NOAA, NWS), community networks, and commercial APIs. Access unified weather observations through REST endpoints or subscribe to real-time updates via [SSE](/openapi/tag/real-time-data/GET/api/stream/sse) or [WebSocket](/openapi/tag/real-time-data/GET/api/stream/ws) connections.
## Authentication
All API requests require an API key passed as a Bearer token:
```properties
Authorization: Bearer your_api_key_here
```
**Generate API keys** from your [developer settings](/settings/developer/).
### Rate Limits
| Limit | Value |
| --------------------- | ------------------------- |
| Requests per minute | 120 |
| SSE connections | Unlimited |
| WebSocket connections | Limited (contact support) |
### API Version
**Current Version:** `2026-01-01`
By default, all requests use the latest API version. You do not need to include a version header for current endpoints.
```properties
X-API-Version: 2026-01-01
```
## Data Overview
The Climate Sight API aggregates weather data from multiple authoritative sources into a unified schema. All data points include:
- **Observation timestamps** in UTC with station-local date context
- **Geographic coordinates** with timezone information
- **Meteorological variables** including temperature, humidity, pressure, wind, and visibility (all temperatures in Celsius)
- **Source metadata** for data provenance and quality assessment
## Real-Time Data Streaming
Subscribe to real-time weather observations as they arrive from our ingestion pipeline:
| Protocol | Endpoint | Recommended Use |
| --------- | ----------------- | ----------------------------------------------- |
| SSE | `/api/stream/sse` | **Client applications** (browsers, mobile apps) |
| WebSocket | `/api/stream/ws` | **Server-to-server** integrations only |
Both streams deliver `WeatherPoint` objects as they are processed from source providers.
### Why SSE is Recommended
**Server-Sent Events (SSE)** delivers the best experience for real-time weather data:
| Feature | SSE | WebSocket |
| -------------------- | --------------- | --------------------- |
| Connection overhead | **Lightweight** | Heavy |
| Connection limits | **Unlimited** | Limited per account |
| Browser support | **Native** | Requires library |
| Proxy/CDN compatible | **Yes** | Often blocked |
| Reconnection | **Automatic** | Manual implementation |
SSE connections are **significantly lighter weight** than WebSocket, allowing us to serve more clients with better performance. This is why we encourage SSE for all client applications.
**WebSocket** is reserved for server-to-server integrations where bidirectional communication is essential. Connection slots are limited-contact support for your account's quota.
### How SSE Connections Work
To maintain optimal performance and prevent stale connections, SSE streams are **automatically refreshed approximately every 400 seconds** (\~6-7 minutes). This keeps the infrastructure healthy and ensures you always have a fresh, responsive connection.
**Reconnecting is instant and lightweight.** Simply pass your last event ID to resume exactly where you left off—no data is lost.
```javascript
const eventSource = new EventSource('/api/stream/sse?market=miami')
let lastEventId = null
eventSource.onmessage = (event) => {
lastEventId = event.lastEventId
// Process the weather point...
}
eventSource.onerror = () => {
// Connection closed - reconnect with last ID
// Browser handles this automatically, or manually:
// new EventSource(`/api/stream/sse?lastEventId=${lastEventId}`)
}
```
The `Last-Event-ID` mechanism ensures seamless continuity, any events that occurred during reconnection are automatically replayed before live streaming resumes.
### WebSocket (Server-to-Server Only)
If your backend service requires WebSocket:
1. **Keepalive required**: Send `{"type":"ping"}` every 25-30 seconds
2. **Connection limits apply**: Contact support for your quota
3. **Reconnection**: Store `lastEventId` and include it in your subscribe message
### Event Format
Both SSE and WebSocket deliver the same event types:
**Heartbeat** (every 25 seconds):
```json
{ "type": "hb", "ts": 1705329600000 }
```
**Weather Point**:
```json
{
"type": "pt",
"event": {
"id": 12345,
"validAt": "2024-01-15T12:00:00Z",
"station": { "id": 100, "icao": "KMIA", ... },
"t": 25.5,
"rh": 65,
...
}
}
```
## LLMs.txt
For AI code assistants, a markdown API reference is available that should be able to get you setup with the api in minutes:
[`https://www.climatesight.app/openapi/llms.txt`](/openapi/llms.txt)
## Resources
- [Climate Sight Website](https://www.climatesight.app)
- [API Terms of Service](https://www.climatesight.app/terms)
- [Support](https://www.climatesight.app/support)
## Servers
- **URL:** `https://www.climatesight.app`
- **Description:** Climate Sight API
- **URL:** `wss://www.climatesight.app`
- **Description:** Climate Sight WebSocket API
## Operations
### Verify API key and get identity
- **Method:** `GET`
- **Path:** `/api/whoami`
- **Tags:** System
Validates the provided API key and returns the associated user identity.
Use this endpoint to:
- Verify your API key is valid
- Check rate limit status (see response headers)
- Retrieve account information
**Rate Limits:** 120 requests per minute per API key.
#### Responses
##### Status: 200 Authenticated user or API key identity information. \See \[UserIdentity]\(/openapi/model/useridentity) for schema details.\
###### Content-Type: application/json
- **`email` (required)**
`object`
- **`id` (required)**
`string` — Unique user or API key identifier
- **`name` (required)**
`object`
- **`createdAt`**
`string`, format: `date-time` — ISO 8601 UTC timestamp of account creation
**Example:**
```json
{
"id": "",
"email": "",
"name": "",
"createdAt": "2026-01-15 10:30:00+00:00"
}
```
##### Status: 401 Authentication failed - missing or invalid credentials. \See \[UnauthorizedError]\(/openapi/model/unauthorizederror) for schema details.\
###### Content-Type: application/json
- **`error` (required)**
`string` — Authentication error message
**Example:**
```json
{
"error": "Unauthorized - missing or invalid bearer token"
}
```
##### Status: 403 Access denied - valid credentials but insufficient permissions. \See \[ForbiddenError]\(/openapi/model/forbiddenerror) for schema details.\
###### Content-Type: application/json
- **`error` (required)**
`string` — Access denied error message
**Example:**
```json
{
"error": "Forbidden - insufficient permissions"
}
```
### API health check
- **Method:** `GET`
- **Path:** `/api/health`
- **Tags:** System
Returns the current health status of the API. Use this endpoint to verify the API is running and responsive.
#### Responses
##### Status: 200 API health status response. \See \[HealthResponse]\(/openapi/model/healthresponse) for schema details.\
###### Content-Type: application/json
- **`message` (required)**
`string` — Health status message
**Example:**
```json
{
"message": "API is healthy"
}
```
### List prediction market stations
- **Method:** `GET`
- **Path:** `/api/markets`
- **Tags:** Stations
Returns all weather observation stations used for prediction market settlement. These are ASOS stations at major airports where temperature contracts are traded.
#### Responses
##### Status: 200 Response for status 200
###### Content-Type: application/json
**Array of:**
- **`cityName` (required)**
`string` — City name for display (e.g., "Los Angeles")
- **`countryCode` (required)**
`string` — ISO 3166-1 alpha-2 country code (e.g., "US", "CA", "UK")
- **`elevM` (required)**
`number` — Station elevation in meters above sea level
- **`icao` (required)**
`string` — ICAO airport code (4 characters, e.g., "KLAX")
- **`id` (required)**
`string` — URL-friendly station identifier used in API paths and prediction market references
- **`lat` (required)**
`number` — Latitude in decimal degrees
- **`lon` (required)**
`number` — Longitude in decimal degrees
- **`name` (required)**
`string` — Full station name (e.g., "Los Angeles International Airport")
- **`network` (required)**
`string` — Observation network type (e.g., "ASOS")
- **`nwsIssuingOfficeId` (required)**
`object`
- **`nwsLocationCode` (required)**
`object`
- **`stateCode` (required)**
`string` — State/province code (e.g., "CA", "NY", "TX")
- **`tz` (required)**
`string` — IANA timezone identifier (e.g., America/Los\_Angeles)
- **`wmoIssuingCenterCccc` (required)**
`string` — WMO issuing center code (4 characters, e.g., "KLOX")
**Example:**
```json
[
{
"lat": 33.93816,
"lon": -118.38653,
"elevM": 32,
"tz": "America/Los_Angeles",
"name": "Los Angeles International Airport",
"cityName": "Los Angeles",
"id": "los-angeles",
"stateCode": "CA",
"countryCode": "US",
"network": "ASOS",
"icao": "KLAX",
"wmoIssuingCenterCccc": "KLOX",
"nwsLocationCode": "LAX",
"nwsIssuingOfficeId": "LOX"
}
]
```
##### Status: 401 Authentication failed - missing or invalid credentials. \See \[UnauthorizedError]\(/openapi/model/unauthorizederror) for schema details.\
###### Content-Type: application/json
- **`error` (required)**
`string` — Authentication error message
**Example:**
```json
{
"error": "Unauthorized - missing or invalid bearer token"
}
```
### Get station by ID
- **Method:** `GET`
- **Path:** `/api/stations/{id}`
- **Tags:** Stations
Returns a single weather observation station by its unique identifier.
#### Responses
##### Status: 200 Weather station metadata. \See \[PointStation]\(/openapi/model/pointstation) for schema details.\
###### Content-Type: application/json
- **`elevM` (required)**
`object`
- **`icao` (required)**
`object`
- **`id` (required)**
`number` — Unique station identifier
- **`lat` (required)**
`number` — Latitude in decimal degrees
- **`lon` (required)**
`number` — Longitude in decimal degrees
- **`name` (required)**
`object`
- **`product` (required)**
`string` — Weather data product type indicating the source format and frequency. \*\*Valid values:\*\* \`ASOS\`, \`ASOS-HFM\`, \`ASOS-SPECI\`, \`ASOS-HR\`, \`SPECI-HFM\`, \`OBS\` - \`ASOS\` - Automated Surface Observing System (standard hourly observations) - \`ASOS-HFM\` - ASOS High-Frequency METAR (1-minute observations) - \`ASOS-SPECI\` - ASOS Special Weather Report (triggered by significant weather changes) - \`ASOS-HR\` - ASOS Hourly Report - \`SPECI-HFM\` - High-Frequency Special Weather Report - \`OBS\` - General Observation
- **`source` (required)**
`string` — Data source provider. \*\*Valid values:\*\* \`NOAA\`, \`NWS\`, \`FAA\`, \`COM\` - \`NOAA\` - National Oceanic and Atmospheric Administration - \`NWS\` - National Weather Service - \`FAA\` - Federal Aviation Administration - \`COM\` - Commercial weather networks
- **`tz` (required)**
`string` — IANA timezone identifier
**Example:**
```json
{
"id": 1,
"lat": 33.93816,
"lon": -118.38653,
"tz": "America/Los_Angeles",
"source": "",
"product": "",
"icao": "KLAX",
"name": "Los Angeles International Airport",
"elevM": 32
}
```
##### Status: 400 Standard error response. \See \[ErrorResponse]\(/openapi/model/errorresponse) for schema details.\
###### Content-Type: application/json
- **`error` (required)**
`string` — Error message
**Example:**
```json
{
"error": ""
}
```
##### Status: 401 Authentication failed - missing or invalid credentials. \See \[UnauthorizedError]\(/openapi/model/unauthorizederror) for schema details.\
###### Content-Type: application/json
- **`error` (required)**
`string` — Authentication error message
**Example:**
```json
{
"error": "Unauthorized - missing or invalid bearer token"
}
```
##### Status: 404 Standard error response. \See \[ErrorResponse]\(/openapi/model/errorresponse) for schema details.\
###### Content-Type: application/json
- **`error` (required)**
`string` — Error message
**Example:**
```json
{
"error": ""
}
```
### List weather stations
- **Method:** `GET`
- **Path:** `/api/stations`
- **Tags:** Stations
Returns a paginated list of weather observation stations.
#### Responses
##### Status: 200 Response for status 200
###### Content-Type: application/json
- **`data` (required)**
`array`
**Items:**
- **`elevM` (required)**
`object`
- **`icao` (required)**
`object`
- **`id` (required)**
`number` — Unique station identifier
- **`lat` (required)**
`number` — Latitude in decimal degrees
- **`lon` (required)**
`number` — Longitude in decimal degrees
- **`name` (required)**
`object`
- **`product` (required)**
`string` — Weather data product type indicating the source format and frequency. \*\*Valid values:\*\* \`ASOS\`, \`ASOS-HFM\`, \`ASOS-SPECI\`, \`ASOS-HR\`, \`SPECI-HFM\`, \`OBS\` - \`ASOS\` - Automated Surface Observing System (standard hourly observations) - \`ASOS-HFM\` - ASOS High-Frequency METAR (1-minute observations) - \`ASOS-SPECI\` - ASOS Special Weather Report (triggered by significant weather changes) - \`ASOS-HR\` - ASOS Hourly Report - \`SPECI-HFM\` - High-Frequency Special Weather Report - \`OBS\` - General Observation
- **`source` (required)**
`string` — Data source provider. \*\*Valid values:\*\* \`NOAA\`, \`NWS\`, \`FAA\`, \`COM\` - \`NOAA\` - National Oceanic and Atmospheric Administration - \`NWS\` - National Weather Service - \`FAA\` - Federal Aviation Administration - \`COM\` - Commercial weather networks
- **`tz` (required)**
`string` — IANA timezone identifier
- **`nextCursor` (required)**
`object`
**Example:**
```json
{
"data": [
{
"id": 1,
"lat": 33.93816,
"lon": -118.38653,
"tz": "America/Los_Angeles",
"source": "",
"product": "",
"icao": "KLAX",
"name": "Los Angeles International Airport",
"elevM": 32
}
],
"nextCursor": ""
}
```
##### Status: 401 Authentication failed - missing or invalid credentials. \See \[UnauthorizedError]\(/openapi/model/unauthorizederror) for schema details.\
###### Content-Type: application/json
- **`error` (required)**
`string` — Authentication error message
**Example:**
```json
{
"error": "Unauthorized - missing or invalid bearer token"
}
```
### Subscribe to real-time weather data (SSE)
- **Method:** `GET`
- **Path:** `/api/stream/sse`
- **Tags:** Real-Time Data
The recommended way to receive real-time weather observations. SSE is lightweight, has no connection limits, and works seamlessly with browsers, mobile apps, and CDNs.
## Connection Lifecycle
Connections are **automatically refreshed every \~400 seconds** to maintain optimal performance and prevent stale connections. This is by design—reconnecting is instant and lightweight.
Simply track the last event `id` you received. When the connection closes, reconnect with `?lastEventId={id}` to resume exactly where you left off. Any events during reconnection are automatically replayed.
## Event Format
**Heartbeat** (every 25 seconds):
```json
{ "type": "hb", "ts": 1234567890 }
```
**Weather Point:**
```json
{"type":"pt","event":{"id":12345,"validAt":"2024-01-15T12:00:00Z","t":25.5,...}}
```
## Seamless Reconnection
Pass `lastEventId` as a query parameter or use the standard `Last-Event-ID` header. The server replays missed events before resuming live streaming—zero data loss.
## Markets
`all` (default), `buenos-aires`, `seoul-incheon`, `toronto-pearson`, `dubai`, `london-city`, `miami`
#### Responses
##### Status: 0 A standardized weather observation data point. \See \[WeatherPoint]\(/openapi/model/weatherpoint) for schema details.\
###### Content-Type: application/json
- **`dewPointC` (required)**
`object`
- **`dewPointF` (required)**
`object`
- **`feelsLikeC` (required)**
`object`
- **`feelsLikeF` (required)**
`object`
- **`humidity` (required)**
`object`
- **`id` (required)**
`string` — Unique point identifier (for Last-Event-ID tracking)
- **`kind` (required)**
`string` — Weather data classification type. \*\*Valid values:\*\* \`o\`, \`f\` - \`o\` - \*\*Observation\*\* - Actual measured weather data from a station at a specific time - \`f\` - \*\*Forecast\*\* - Predicted weather data for a future time
- **`observedAt` (required)**
`object`
- **`precipRateMmHr` (required)**
`object`
- **`pressureHpa` (required)**
`object`
- **`product` (required)**
`string` — Weather data product type indicating the source format and frequency. \*\*Valid values:\*\* \`ASOS\`, \`ASOS-HFM\`, \`ASOS-SPECI\`, \`ASOS-HR\`, \`SPECI-HFM\`, \`OBS\` - \`ASOS\` - Automated Surface Observing System (standard hourly observations) - \`ASOS-HFM\` - ASOS High-Frequency METAR (1-minute observations) - \`ASOS-SPECI\` - ASOS Special Weather Report (triggered by significant weather changes) - \`ASOS-HR\` - ASOS Hourly Report - \`SPECI-HFM\` - High-Frequency Special Weather Report - \`OBS\` - General Observation
- **`seaLevelPressureHpa` (required)**
`object`
- **`solarRadiationWm2` (required)**
`object`
- **`source` (required)**
`string` — Data source provider. \*\*Valid values:\*\* \`NOAA\`, \`NWS\`, \`FAA\`, \`COM\` - \`NOAA\` - National Oceanic and Atmospheric Administration - \`NWS\` - National Weather Service - \`FAA\` - Federal Aviation Administration - \`COM\` - Commercial weather networks
- **`station` (required)**
`number` — Station identifier (integer). References \`#/components/schemas/PointStation/id\` — see \[PointStation]\(/openapi/model/pointstation) for full station metadata
- **`tempC` (required)**
`object`
- **`tempF` (required)**
`object`
- **`tempPrecision` (required)**
`object`
- **`uvIndex` (required)**
`object`
- **`validAt` (required)**
`string`, format: `date-time` — ISO 8601 UTC timestamp when the observation is valid
- **`validAtLocalDate` (required)**
`string`, format: `date` — ISO 8601 local calendar date at the station timezone (YYYY-MM-DD)
- **`visibilityM` (required)**
`object`
- **`windDirDeg` (required)**
`object`
- **`windGustMs` (required)**
`object`
- **`windSpeedMs` (required)**
`object`
**Example:**
```json
{
"id": "12345678",
"station": 1,
"kind": "",
"product": "",
"source": "",
"validAt": "2026-02-02 15:30:00+00:00",
"observedAt": "2026-02-02 15:28:00+00:00",
"validAtLocalDate": "2026-02-02",
"tempC": 22.5,
"tempF": 72.5,
"tempPrecision": "",
"dewPointC": 15,
"dewPointF": 59,
"humidity": 65,
"feelsLikeC": 24,
"feelsLikeF": 75.2,
"pressureHpa": 1013.25,
"seaLevelPressureHpa": 1015,
"windDirDeg": 180,
"windSpeedMs": 5.2,
"windGustMs": 8.5,
"visibilityM": 16093,
"precipRateMmHr": 0,
"solarRadiationWm2": 850,
"uvIndex": 6
}
```
##### Status: 401 Authentication failed - missing or invalid credentials. \See \[UnauthorizedError]\(/openapi/model/unauthorizederror) for schema details.\
###### Content-Type: application/json
- **`error` (required)**
`string` — Authentication error message
**Example:**
```json
{
"error": "Unauthorized - missing or invalid bearer token"
}
```
##### Status: 404 Standard error response. \See \[ErrorResponse]\(/openapi/model/errorresponse) for schema details.\
###### Content-Type: application/json
- **`error` (required)**
`string` — Error message
**Example:**
```json
{
"error": ""
}
```
##### Status: 502 Standard error response. \See \[ErrorResponse]\(/openapi/model/errorresponse) for schema details.\
###### Content-Type: application/json
- **`error` (required)**
`string` — Error message
**Example:**
```json
{
"error": ""
}
```
### Subscribe to real-time weather data (WebSocket)
- **Method:** `GET`
- **Path:** `/api/stream/ws`
- **Tags:** Real-Time Data
WebSocket streaming for server-to-server integrations requiring bidirectional communication.
> **Consider SSE instead.** WebSocket connections consume significantly more server resources than SSE. For browser apps, mobile apps, or dashboards, the [SSE endpoint](/api/v1/stream/sse) offers unlimited connections and automatic reconnection with no keepalive management.
## Why Connections Are Limited
WebSocket connections are heavier than SSE—they require persistent state, bidirectional buffers, and active keepalive management. To maintain service quality, WebSocket slots are **limited per account**. Contact support for your quota.
## Requirements
**Keepalive mandatory:** Send `{"type":"ping"}` every 25-30 seconds or your connection may be terminated.
**Connection URL:** `wss://api.climatesight.app/api/stream/ws`
## Client Messages
- `{"type":"subscribe","market":"miami","lastEventId":12345}` — Subscribe
- `{"type":"unsubscribe"}` — Unsubscribe
- `{"type":"ping"}` — Keepalive (required)
## Server Messages
- `{"type":"hb","ts":...}` — Heartbeat (25s)
- `{"type":"pt","event":{...}}` — Weather point
- `{"type":"pong"}` — Ping response
- `{"type":"subscribed","market":"..."}` — Confirmed
- `{"type":"error","message":"..."}` — Error
## Reconnection
Track the `id` from the last point and include it when reconnecting to resume without data loss.
## Markets
`all`, `buenos-aires`, `seoul-incheon`, `toronto-pearson`, `dubai`, `london-city`, `miami`
#### Responses
##### Status: 200 Standard error response. \See \[ErrorResponse]\(/openapi/model/errorresponse) for schema details.\
###### Content-Type: application/json
- **`error` (required)**
`string` — Error message
**Example:**
```json
{
"error": ""
}
```
## Schemas
### WeatherPoint
- **Type:**`object`
A standardized weather observation data point. *See [WeatherPoint](/openapi/model/weatherpoint) for schema details.*
- **`dewPointC` (required)**
`object`
- **`dewPointF` (required)**
`object`
- **`feelsLikeC` (required)**
`object`
- **`feelsLikeF` (required)**
`object`
- **`humidity` (required)**
`object`
- **`id` (required)**
`string` — Unique point identifier (for Last-Event-ID tracking)
- **`kind` (required)**
`string` — Weather data classification type. \*\*Valid values:\*\* \`o\`, \`f\` - \`o\` - \*\*Observation\*\* - Actual measured weather data from a station at a specific time - \`f\` - \*\*Forecast\*\* - Predicted weather data for a future time
- **`observedAt` (required)**
`object`
- **`precipRateMmHr` (required)**
`object`
- **`pressureHpa` (required)**
`object`
- **`product` (required)**
`string` — Weather data product type indicating the source format and frequency. \*\*Valid values:\*\* \`ASOS\`, \`ASOS-HFM\`, \`ASOS-SPECI\`, \`ASOS-HR\`, \`SPECI-HFM\`, \`OBS\` - \`ASOS\` - Automated Surface Observing System (standard hourly observations) - \`ASOS-HFM\` - ASOS High-Frequency METAR (1-minute observations) - \`ASOS-SPECI\` - ASOS Special Weather Report (triggered by significant weather changes) - \`ASOS-HR\` - ASOS Hourly Report - \`SPECI-HFM\` - High-Frequency Special Weather Report - \`OBS\` - General Observation
- **`seaLevelPressureHpa` (required)**
`object`
- **`solarRadiationWm2` (required)**
`object`
- **`source` (required)**
`string` — Data source provider. \*\*Valid values:\*\* \`NOAA\`, \`NWS\`, \`FAA\`, \`COM\` - \`NOAA\` - National Oceanic and Atmospheric Administration - \`NWS\` - National Weather Service - \`FAA\` - Federal Aviation Administration - \`COM\` - Commercial weather networks
- **`station` (required)**
`number` — Station identifier (integer). References \`#/components/schemas/PointStation/id\` — see \[PointStation]\(/openapi/model/pointstation) for full station metadata
- **`tempC` (required)**
`object`
- **`tempF` (required)**
`object`
- **`tempPrecision` (required)**
`object`
- **`uvIndex` (required)**
`object`
- **`validAt` (required)**
`string`, format: `date-time` — ISO 8601 UTC timestamp when the observation is valid
- **`validAtLocalDate` (required)**
`string`, format: `date` — ISO 8601 local calendar date at the station timezone (YYYY-MM-DD)
- **`visibilityM` (required)**
`object`
- **`windDirDeg` (required)**
`object`
- **`windGustMs` (required)**
`object`
- **`windSpeedMs` (required)**
`object`
**Example:**
```json
{
"id": "12345678",
"station": 1,
"kind": "",
"product": "",
"source": "",
"validAt": "2026-02-02 15:30:00+00:00",
"observedAt": "2026-02-02 15:28:00+00:00",
"validAtLocalDate": "2026-02-02",
"tempC": 22.5,
"tempF": 72.5,
"tempPrecision": "",
"dewPointC": 15,
"dewPointF": 59,
"humidity": 65,
"feelsLikeC": 24,
"feelsLikeF": 75.2,
"pressureHpa": 1013.25,
"seaLevelPressureHpa": 1015,
"windDirDeg": 180,
"windSpeedMs": 5.2,
"windGustMs": 8.5,
"visibilityM": 16093,
"precipRateMmHr": 0,
"solarRadiationWm2": 850,
"uvIndex": 6
}
```
### PointStation
- **Type:**`object`
Weather station metadata. *See [PointStation](/openapi/model/pointstation) for schema details.*
- **`elevM` (required)**
`object`
- **`icao` (required)**
`object`
- **`id` (required)**
`number` — Unique station identifier
- **`lat` (required)**
`number` — Latitude in decimal degrees
- **`lon` (required)**
`number` — Longitude in decimal degrees
- **`name` (required)**
`object`
- **`product` (required)**
`string` — Weather data product type indicating the source format and frequency. \*\*Valid values:\*\* \`ASOS\`, \`ASOS-HFM\`, \`ASOS-SPECI\`, \`ASOS-HR\`, \`SPECI-HFM\`, \`OBS\` - \`ASOS\` - Automated Surface Observing System (standard hourly observations) - \`ASOS-HFM\` - ASOS High-Frequency METAR (1-minute observations) - \`ASOS-SPECI\` - ASOS Special Weather Report (triggered by significant weather changes) - \`ASOS-HR\` - ASOS Hourly Report - \`SPECI-HFM\` - High-Frequency Special Weather Report - \`OBS\` - General Observation
- **`source` (required)**
`string` — Data source provider. \*\*Valid values:\*\* \`NOAA\`, \`NWS\`, \`FAA\`, \`COM\` - \`NOAA\` - National Oceanic and Atmospheric Administration - \`NWS\` - National Weather Service - \`FAA\` - Federal Aviation Administration - \`COM\` - Commercial weather networks
- **`tz` (required)**
`string` — IANA timezone identifier
**Example:**
```json
{
"id": 1,
"lat": 33.93816,
"lon": -118.38653,
"tz": "America/Los_Angeles",
"source": "",
"product": "",
"icao": "KLAX",
"name": "Los Angeles International Airport",
"elevM": 32
}
```
### WeatherPointMessage
- **Type:**`object`
Weather observation data point
- **`event` (required)**
`object` — A standardized weather observation data point. \See \[WeatherPoint]\(/openapi/model/weatherpoint) for schema details.\
- **`dewPointC` (required)**
`object`
- **`dewPointF` (required)**
`object`
- **`feelsLikeC` (required)**
`object`
- **`feelsLikeF` (required)**
`object`
- **`humidity` (required)**
`object`
- **`id` (required)**
`string` — Unique point identifier (for Last-Event-ID tracking)
- **`kind` (required)**
`string` — Weather data classification type. \*\*Valid values:\*\* \`o\`, \`f\` - \`o\` - \*\*Observation\*\* - Actual measured weather data from a station at a specific time - \`f\` - \*\*Forecast\*\* - Predicted weather data for a future time
- **`observedAt` (required)**
`object`
- **`precipRateMmHr` (required)**
`object`
- **`pressureHpa` (required)**
`object`
- **`product` (required)**
`string` — Weather data product type indicating the source format and frequency. \*\*Valid values:\*\* \`ASOS\`, \`ASOS-HFM\`, \`ASOS-SPECI\`, \`ASOS-HR\`, \`SPECI-HFM\`, \`OBS\` - \`ASOS\` - Automated Surface Observing System (standard hourly observations) - \`ASOS-HFM\` - ASOS High-Frequency METAR (1-minute observations) - \`ASOS-SPECI\` - ASOS Special Weather Report (triggered by significant weather changes) - \`ASOS-HR\` - ASOS Hourly Report - \`SPECI-HFM\` - High-Frequency Special Weather Report - \`OBS\` - General Observation
- **`seaLevelPressureHpa` (required)**
`object`
- **`solarRadiationWm2` (required)**
`object`
- **`source` (required)**
`string` — Data source provider. \*\*Valid values:\*\* \`NOAA\`, \`NWS\`, \`FAA\`, \`COM\` - \`NOAA\` - National Oceanic and Atmospheric Administration - \`NWS\` - National Weather Service - \`FAA\` - Federal Aviation Administration - \`COM\` - Commercial weather networks
- **`station` (required)**
`number` — Station identifier (integer). References \`#/components/schemas/PointStation/id\` — see \[PointStation]\(/openapi/model/pointstation) for full station metadata
- **`tempC` (required)**
`object`
- **`tempF` (required)**
`object`
- **`tempPrecision` (required)**
`object`
- **`uvIndex` (required)**
`object`
- **`validAt` (required)**
`string`, format: `date-time` — ISO 8601 UTC timestamp when the observation is valid
- **`validAtLocalDate` (required)**
`string`, format: `date` — ISO 8601 local calendar date at the station timezone (YYYY-MM-DD)
- **`visibilityM` (required)**
`object`
- **`windDirDeg` (required)**
`object`
- **`windGustMs` (required)**
`object`
- **`windSpeedMs` (required)**
`object`
- **`type` (required)**
`string` — Message type: weather point
**Example:**
```json
{
"type": "pt",
"event": {
"id": "12345678",
"station": 1,
"kind": "",
"product": "",
"source": "",
"validAt": "2026-02-02 15:30:00+00:00",
"observedAt": "2026-02-02 15:28:00+00:00",
"validAtLocalDate": "2026-02-02",
"tempC": 22.5,
"tempF": 72.5,
"tempPrecision": "",
"dewPointC": 15,
"dewPointF": 59,
"humidity": 65,
"feelsLikeC": 24,
"feelsLikeF": 75.2,
"pressureHpa": 1013.25,
"seaLevelPressureHpa": 1015,
"windDirDeg": 180,
"windSpeedMs": 5.2,
"windGustMs": 8.5,
"visibilityM": 16093,
"precipRateMmHr": 0,
"solarRadiationWm2": 850,
"uvIndex": 6
}
}
```
### HeartbeatMessage
- **Type:**`object`
Heartbeat message for connection keep-alive
- **`ts` (required)**
`number` — Unix timestamp in milliseconds
- **`type` (required)**
`string` — Message type: heartbeat
**Example:**
```json
{
"type": "hb",
"ts": 1
}
```
### StreamErrorMessage
- **Type:**`object`
Stream error notification
- **`message` (required)**
`string` — Human-readable error description
- **`type` (required)**
`string` — Message type: error
**Example:**
```json
{
"type": "error",
"message": ""
}
```
### StreamMessage
- **Type:**
SSE stream message (discriminated by type field)
**Example:**
### MarketStation
- **Type:**`object`
Weather observation stations used for prediction market settlement. These are ASOS stations at major airports where temperature contracts are traded on exchanges like Kalshi, Polymarket, and ForecastEx. *See [MarketStation](/openapi/model/marketstation) for schema details.*
- **`cityName` (required)**
`string` — City name for display (e.g., "Los Angeles")
- **`countryCode` (required)**
`string` — ISO 3166-1 alpha-2 country code (e.g., "US", "CA", "UK")
- **`elevM` (required)**
`number` — Station elevation in meters above sea level
- **`icao` (required)**
`string` — ICAO airport code (4 characters, e.g., "KLAX")
- **`id` (required)**
`string` — URL-friendly station identifier used in API paths and prediction market references
- **`lat` (required)**
`number` — Latitude in decimal degrees
- **`lon` (required)**
`number` — Longitude in decimal degrees
- **`name` (required)**
`string` — Full station name (e.g., "Los Angeles International Airport")
- **`network` (required)**
`string` — Observation network type (e.g., "ASOS")
- **`nwsIssuingOfficeId` (required)**
`object`
- **`nwsLocationCode` (required)**
`object`
- **`stateCode` (required)**
`string` — State/province code (e.g., "CA", "NY", "TX")
- **`tz` (required)**
`string` — IANA timezone identifier (e.g., America/Los\_Angeles)
- **`wmoIssuingCenterCccc` (required)**
`string` — WMO issuing center code (4 characters, e.g., "KLOX")
**Example:**
```json
{
"lat": 33.93816,
"lon": -118.38653,
"elevM": 32,
"tz": "America/Los_Angeles",
"name": "Los Angeles International Airport",
"cityName": "Los Angeles",
"id": "los-angeles",
"stateCode": "CA",
"countryCode": "US",
"network": "ASOS",
"icao": "KLAX",
"wmoIssuingCenterCccc": "KLOX",
"nwsLocationCode": "LAX",
"nwsIssuingOfficeId": "LOX"
}
```
### HealthResponse
- **Type:**`object`
API health status response. *See [HealthResponse](/openapi/model/healthresponse) for schema details.*
- **`message` (required)**
`string` — Health status message
**Example:**
```json
{
"message": "API is healthy"
}
```
### ErrorResponse
- **Type:**`object`
Standard error response. *See [ErrorResponse](/openapi/model/errorresponse) for schema details.*
- **`error` (required)**
`string` — Error message
**Example:**
```json
{
"error": ""
}
```
### UnauthorizedError
- **Type:**`object`
Authentication failed - missing or invalid credentials. *See [UnauthorizedError](/openapi/model/unauthorizederror) for schema details.*
- **`error` (required)**
`string` — Authentication error message
**Example:**
```json
{
"error": "Unauthorized - missing or invalid bearer token"
}
```
### ForbiddenError
- **Type:**`object`
Access denied - valid credentials but insufficient permissions. *See [ForbiddenError](/openapi/model/forbiddenerror) for schema details.*
- **`error` (required)**
`string` — Access denied error message
**Example:**
```json
{
"error": "Forbidden - insufficient permissions"
}
```
### RateLimitError
- **Type:**`object`
Rate limit exceeded - too many requests in the current time window. *See [RateLimitError](/openapi/model/ratelimiterror) for schema details.*
- **`error` (required)**
`string` — Rate limit exceeded message
- **`retryAfter`**
`number` — Seconds until rate limit resets
**Example:**
```json
{
"error": "Rate limit exceeded - try again in 60 seconds",
"retryAfter": 1
}
```
### UserIdentity
- **Type:**`object`
Authenticated user or API key identity information. *See [UserIdentity](/openapi/model/useridentity) for schema details.*
- **`email` (required)**
`object`
- **`id` (required)**
`string` — Unique user or API key identifier
- **`name` (required)**
`object`
- **`createdAt`**
`string`, format: `date-time` — ISO 8601 UTC timestamp of account creation
**Example:**
```json
{
"id": "",
"email": "",
"name": "",
"createdAt": "2026-01-15 10:30:00+00:00"
}
```