# 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" } ```