{"openapi":"3.1.0","info":{"title":"FernWX Agent API","version":"0.1.0+84.27e39098","description":"Account-scoped reads of the FernWX Weather Ledger for external agents. Every documented operation and MCP tool is a read. Some reads update last-seen timestamps or stale report state, and saved-insight runs append query activity logs; MCP tools declare these side effects. A key or OAuth token is not read-only. It can also call account routes outside the documented contract that write: generate and save AI explanations of soundings and NWS text products and sounding comparison syntheses (these count against the account’s AI usage limits), generate speech audio, import radiosonde soundings into the account (overwrite mode replaces the account’s own earlier imports), and request or release temporary restores of archived days. Each is limited to the owning account and bounded. It cannot change locations, settings or keys, trigger collectors, create or edit saved reports, Run Books, dashboards or insights, or delete the cold archive. Authenticate keyed routes with a per-account API key (`Authorization: Bearer fwx_<prefix>_<secret>`). Forecast memory is immutable and OpenRouter/Sonar synthesis is never returned as truth. Caller-authored SQL and per-key rate limits are not exposed. Owned saved-insight SQL runs remain guarded and bounded; the keyless /api/public/forecast route is IP rate-limited and documents its 429."},"servers":[{"url":"https://fernwx.com","description":"Production"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"Weather Ledger","description":"Account-scoped ledger reads. Some reads update account activity timestamps."},{"name":"Account Data","description":"Reads of the caller’s saved account information and UI read models. Some reads update account activity timestamps."},{"name":"Saved Agent Work","description":"Reads of account-owned reports, Run Books, dashboards, and insights. Reading reports can update stale report state; saved-insight runs append query activity logs."},{"name":"Public","description":"Keyless, rate-limited public surfaces."}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"fwx_<prefix>_<secret>","description":"Per-account FernWX API key. Mint one in your account settings and send it as `Authorization: Bearer fwx_<prefix>_<secret>`. Cookie sessions are also accepted for browser callers. Keyed routes resolve to the exact same account scope as a signed-in session. New keys expire after 5 minutes to 30 days (default 1 hour); legacy keys with no expiry remain non-expiring. A presented key that has expired, been revoked, or is otherwise invalid returns `401` with a machine-readable `code` (`api_key_expired`, `api_key_revoked`, `api_key_invalid`) — never a synthetic example response. Sign in to FernWX to reactivate an expired key or mint a new one."}},"schemas":{"ErrorEnvelope":{"type":"object","properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string","example":"locationId is required"},"code":{"type":"string","description":"Optional machine-readable failure code. Present on API-key auth failures: `api_key_expired`, `api_key_revoked`, or `api_key_invalid`.","example":"api_key_expired"},"retryable":{"type":"boolean","description":"Whether the caller may safely retry this operation after a short delay."},"requestId":{"type":"string","description":"Bounded correlation identifier to quote when reporting a server-side failure.","example":"4de98f89-df1e-4a51-95ac-eec73c349bb2"}},"required":["ok","error"],"description":"Uniform error envelope returned with a 4xx/5xx status."},"LedgerLocation":{"type":"object","properties":{"id":{"type":"string","example":"example-ledger-coastal-ridge"},"name":{"type":"string","example":"Example Coastal Ridge"},"lat":{"type":"number","example":44.428},"lon":{"type":"number","example":-124.067},"timezone":{"type":["string","null"],"example":"America/Los_Angeles"},"tags":{"type":"array","items":{"type":"string"},"example":["example","signed-out"]},"profile":{"type":["string","null"],"enum":["primary","secondary","archive_watch"],"description":"The collection tier the location currently collects at (Home and Work read as primary). Null or absent when the account has not adopted location profiles or the location is unassigned. Signed-out example locations carry no tier.","example":"primary"}},"required":["id","name","lat","lon"],"description":"A Weather Ledger location the caller is allowed to see."},"StatusResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"example":{"type":"boolean","enum":[true],"description":"Present and true when the body is synthetic signed-out example data."},"memberScoped":{"type":"boolean","enum":[true]},"status":{"type":"object","properties":{},"description":"Ledger health snapshot: db reachability, configured providers (`env`), row `counts`, WeatherKit quota, the latest collection run, and coverage notes."}},"required":["ok","status"],"description":"Weather Ledger status / health summary."},"LocationsResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"example":{"type":"boolean","enum":[true],"description":"Present and true when the body is synthetic signed-out example data."},"locations":{"type":"array","items":{"$ref":"#/components/schemas/LedgerLocation"}}},"required":["ok","locations"],"description":"Locations visible to the caller in their current scope."},"LightningActivityResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"example":{"type":"boolean","enum":[true],"description":"Present and true when the body is synthetic signed-out example data."},"month":{"type":"string","example":"2026-08"},"timeZone":{"type":"string","example":"America/New_York"},"locations":{"type":"array","items":{"$ref":"#/components/schemas/LedgerLocation"}},"days":{"type":"array","items":{"type":"object","properties":{}},"description":"Activity-bearing local days with exact GOES/NLDN counts and collection-receipt coverage."}},"required":["ok","month","timeZone","locations","days"],"description":"Account-wide monthly lightning activity calendar."},"LightningTimelineResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"example":{"type":"boolean","enum":[true],"description":"Present and true when the body is synthetic signed-out example data."},"date":{"type":"string","example":"2026-08-09"},"timeZone":{"type":"string","example":"America/New_York"},"start":{"type":"string","format":"date-time"},"end":{"type":"string","format":"date-time"},"locations":{"type":"array","items":{"$ref":"#/components/schemas/LedgerLocation"}},"bins":{"type":"array","items":{"type":"object","properties":{}},"description":"DST-aware five-minute bins with GOES/NLDN counts and source-specific collection coverage."}},"required":["ok","date","timeZone","start","end","locations","bins"],"description":"One local day of account-wide lightning activity."},"LightningEventsResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"example":{"type":"boolean","enum":[true],"description":"Present and true when the body is synthetic signed-out example data."},"from":{"type":"string","format":"date-time"},"to":{"type":"string","format":"date-time"},"locations":{"type":"array","items":{"$ref":"#/components/schemas/LedgerLocation"}},"glm":{"type":"object","properties":{},"description":"Deduplicated GOES flash-centroid display events plus exact/displayed counts."},"xweather":{"type":"object","properties":{},"description":"Deduplicated NLDN pulse display events plus exact/displayed counts."},"windows":{"type":"array","items":{"type":"object","properties":{}},"description":"Collection receipts overlapping the requested frame."}},"required":["ok","from","to","locations","glm","xweather","windows"],"description":"Bounded account-wide lightning events and collection evidence."},"LocationResolveResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"query":{"type":"string","example":"Micah's Home"},"locations":{"type":"array","items":{"$ref":"#/components/schemas/LedgerLocation"}}},"required":["ok","query","locations"],"description":"Saved FernWX locations matching a human-readable name/tag query, scoped to the authenticated account."},"ForecastLatestResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"example":{"type":"boolean","enum":[true],"description":"Present and true when the body is synthetic signed-out example data."},"location":{"type":"object","properties":{}},"accuracyVariable":{"type":"string","example":"temperature_c"},"accuracyReference":{"type":"object","properties":{}},"sources":{"type":"array","items":{"type":"object","properties":{}},"description":"Per-source forecast series, ranked by recent measured accuracy."},"daily":{"type":"array","items":{"type":"object","properties":{}}},"generatedAt":{"type":"string","format":"date-time"},"timezone":{"type":["string","null"]},"temperatureHistory":{"type":"object","properties":{"status":{"type":"string","enum":["available","unavailable"]},"start":{"type":"string","format":"date-time"},"end":{"type":"string","format":"date-time"},"limitPerSource":{"type":"integer"},"sources":{"type":"array","items":{"type":"object","properties":{"source_id":{"type":"string"},"truncated":{"type":"boolean"},"points":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"source_id":{"type":"string"},"observed_at":{"type":"string","format":"date-time"},"retrieved_at":{"type":["string","null"],"format":"date-time"},"temperature_c":{"type":["number","null"]},"station_id":{"type":["string","null"]}},"required":["id","source_id","observed_at","retrieved_at","temperature_c","station_id"]}}},"required":["source_id","truncated","points"]}}},"required":["status","start","end","limitPerSource","sources"],"description":"Preceding three hours of canonical provider temperature observations at their original observation times. At most 240 captured rows per source; truncated is explicit. Empty sources mean no observations in this window; unavailable means the supplementary read failed. NWS station identity is retained. Never historical forecasts."},"now":{"type":"object","properties":{},"description":"Latest observed conditions per source."}},"required":["ok","accuracyVariable","sources","now"],"description":"Latest multi-source hourly forecast for one location (the multiday `daily` series is served by `forecast/outlook`), with source accuracy ranking and current observations."},"SolarIrradiancePoint":{"type":"object","properties":{"source_id":{"type":"string","description":"Ledger source id that reported the value."},"station_id":{"type":["string","null"],"description":"Provider station id when supplied."},"observed_at":{"type":"string","format":"date-time"},"retrieved_at":{"type":"string","format":"date-time"},"shortwave_radiation_w_m2":{"type":["number","null"],"description":"Global horizontal irradiance (GHI), also called solar or shortwave radiation, in W/m²."},"direct_normal_irradiance_w_m2":{"type":["number","null"],"description":"Direct normal irradiance (DNI) in W/m²."},"diffuse_horizontal_irradiance_w_m2":{"type":["number","null"],"description":"Diffuse horizontal irradiance (DHI) in W/m²."}},"required":["source_id","station_id","observed_at","retrieved_at","shortwave_radiation_w_m2","direct_normal_irradiance_w_m2","diffuse_horizontal_irradiance_w_m2"]},"SolarIrradianceResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"generatedAt":{"type":"string","format":"date-time"},"location":{"type":"object","properties":{"id":{"type":"string"},"timezone":{"type":["string","null"],"description":"Saved IANA timezone, or null when the location has not been assigned one."}},"required":["id","timezone"]},"from":{"type":"string","format":"date-time"},"to":{"type":"string","format":"date-time"},"sourceId":{"type":["string","null"]},"variables":{"type":"object","additionalProperties":{"type":"object","properties":{}},"description":"Canonical irradiance names, common search aliases, and units."},"dataSemantics":{"type":"object","properties":{"kind":{"type":"string"},"caveat":{"type":"string"}},"required":["kind","caveat"]},"series":{"type":"array","items":{"type":"object","properties":{"source_id":{"type":"string"},"points":{"type":"array","items":{"$ref":"#/components/schemas/SolarIrradiancePoint"}}},"required":["source_id","points"]}},"limit":{"type":"integer"},"truncated":{"type":"boolean"}},"required":["ok","generatedAt","location","from","to","sourceId","variables","dataSemantics","series","limit","truncated"],"description":"Bounded source-reported solar irradiance history for one saved location. Use observed_at to compare the same local time across days."},"ForecastHistoryResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"example":{"type":"boolean","enum":[true],"description":"Present and true when the body is synthetic signed-out example data."},"variable":{"type":"string","example":"temperature_c"},"history":{"type":"array","items":{"type":"object","properties":{}},"description":"Every retained forecast for the requested valid time, across sources and issuance times — the forecast-memory audit trail for one point."},"limit":{"type":"number","description":"Row cap applied to this response. Default 1,000; hard maximum 2,000.","example":1000},"truncated":{"type":"boolean","description":"True when more matching rows existed than `limit` allowed; `history` holds exactly `limit` rows."}},"required":["ok","variable","history","limit","truncated"],"description":"Forecast-memory history for a single (location, variable, valid time)."},"NowcastResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"example":{"type":"boolean","enum":[true],"description":"Present and true when the body is synthetic signed-out example data."},"nowcast":{"type":["object","null"],"properties":{},"description":"Latest minute-resolution nowcast run with its points, or null."}},"required":["ok","nowcast"],"description":"Latest next-hour precipitation nowcast for one location."},"ObservedTimesResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"example":{"type":"boolean","enum":[true],"description":"Present and true when the body is synthetic signed-out example data."},"variable":{"type":"string"},"times":{"type":"array","items":{"type":"object","properties":{}},"description":"Past valid times that have a settled observed actual for the variable."}},"required":["ok","times"],"description":"Valid times with observed actuals, usable as Time Machine vantage points."},"TimeMachineSnapshotResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"example":{"type":"boolean","enum":[true],"description":"Present and true when the body is synthetic signed-out example data."},"as_of":{"type":"string","example":"2026-05-29T02:00:00.000Z"},"now":{"type":"string"},"horizonHours":{"type":"number","example":48},"snapshot":{"type":"object","properties":{},"description":"The forecast as it stood at the vantage (`as_of`) time."},"current":{"type":"object","properties":{},"description":"The most-current forecast, for future-hour truth cells."},"observed":{"type":"array","items":{"type":"object","properties":{}},"description":"Observed actuals for the elapsed portion."}},"required":["ok","as_of","horizonHours","snapshot"],"description":"Time Machine: the frozen forecast from a past vantage time alongside what actually happened, for hindcast comparison."},"ForecastMemoryResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"example":{"type":"boolean","enum":[true],"description":"Present and true when the body is synthetic signed-out example data."}},"required":["ok"],"description":"Account-scoped, bounded Forecast Memory read-model response. Canonical forecast and observation rows remain authoritative."},"ForecastMemoryRecordsResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"example":{"type":"boolean","enum":[true],"description":"Present and true when the body is synthetic signed-out example data."},"nextCursor":{"type":["string","null"],"description":"Opaque keyset cursor for the next page — pass it back verbatim as `cursor`. Null on the last page; absent from CSV exports."}},"required":["ok"],"description":"Cursor-paginated Forecast Memory verification records. Canonical forecast and observation rows remain authoritative."},"VantageTimesResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"example":{"type":"boolean","enum":[true],"description":"Present and true when the body is synthetic signed-out example data."},"vantageTimes":{"type":"array","items":{"type":"string"},"description":"Bucketed ISO timestamps usable as Time Machine `asOf` vantage points. With `?date`, these are the requested date's vantage points; without it, a recent flat list across dates. Always present."},"vantageDates":{"type":"array","items":{"type":"string"},"description":"UTC dates (YYYY-MM-DD) that have hourly forecast runs, newest first. Returned only on the unscoped (no `?date`) listing; request `?date=YYYY-MM-DD` to page that date's `vantageTimes`."}},"required":["ok","vantageTimes"],"description":"Available Time Machine vantage dates and/or times for a location."},"PublicForecastResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"rate":{"type":"object","properties":{"remaining":{"type":"number"},"limit":{"type":"number"},"resetAt":{"type":"string"}},"required":["remaining","limit","resetAt"],"description":"Per-IP rate-limit budget remaining for keyless lookups."}},"required":["ok","rate"],"description":"Keyless, rate-limited public forecast for an arbitrary coordinate or place name. Does not read or expose Weather Ledger rows."},"SevereWeatherResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"example":{"type":"boolean","enum":[true],"description":"Present and true when the body is synthetic signed-out example data."}},"required":["ok"],"description":"Account-scoped severe-weather episodes, SPC outlook context, or upper-air sounding data."},"NationalSoundingLevel":{"type":"object","properties":{"level_index":{"type":"integer","example":0},"pressure_hpa":{"type":["number","null"]},"height_m":{"type":["number","null"]},"temperature_c":{"type":["number","null"]},"dewpoint_c":{"type":["number","null"]},"wind_direction_degrees":{"type":["number","null"]},"wind_speed_kph":{"type":["number","null"]}},"required":["level_index","pressure_hpa","height_m","temperature_c","dewpoint_c","wind_direction_degrees","wind_speed_kph"],"description":"One measured vertical reading of a national RAOB ascent, ordered by level_index from the surface upward. Any value the ascent did not sample is null."},"NationalSoundingProfile":{"type":"object","properties":{"id":{"type":"string","example":"01jz4qk9pnraobprofile"},"source_id":{"type":"string","description":"Collector source: iem_raob (low-latency IEM) or noaa_igra_raob (delayed NOAA IGRA completeness fallback).","example":"iem_raob"},"station_id":{"type":"string","example":"KOUN"},"valid_at":{"type":"string","description":"Launch cycle timestamp (ISO).","example":"2026-08-10T12:00:00.000Z"},"retrieved_at":{"type":"string","example":"2026-08-10T13:05:00.000Z"},"level_count":{"type":["number","null"]},"max_height_m":{"type":["number","null"]},"surface_pressure_hpa":{"type":["number","null"]},"station_name":{"type":["string","null"]},"wmo_id":{"type":["number","null"]},"wfo":{"type":["string","null"]},"station_lat":{"type":["number","null"]},"station_lon":{"type":["number","null"]},"elevation_m":{"type":["number","null"]},"derived":{"type":["object","null"],"additionalProperties":{},"description":"Additive computed upper-air telemetry (freezing level, tropopause, inversions, max wind, 0–6 km bulk shear, precipitable water, lapse rates, and SB/ML/MU parcel CAPE/CIN with surface-based LCL/LFC/EL). Null on list rows whose persisted metrics predate the current algorithm version; the detail read computes on the fly instead."}},"required":["id","source_id","station_id","valid_at","retrieved_at","level_count","max_height_m","surface_pressure_hpa","station_name","wmo_id","wfo","station_lat","station_lon","elevation_m","derived"],"description":"Collector-owned provider-global national RAOB profile summary with station identity."},"NationalSoundingDetail":{"type":"object","properties":{"id":{"type":"string","example":"01jz4qk9pnraobprofile"},"source_id":{"type":"string","description":"Collector source: iem_raob (low-latency IEM) or noaa_igra_raob (delayed NOAA IGRA completeness fallback).","example":"iem_raob"},"station_id":{"type":"string","example":"KOUN"},"valid_at":{"type":"string","description":"Launch cycle timestamp (ISO).","example":"2026-08-10T12:00:00.000Z"},"retrieved_at":{"type":"string","example":"2026-08-10T13:05:00.000Z"},"level_count":{"type":["number","null"]},"max_height_m":{"type":["number","null"]},"surface_pressure_hpa":{"type":["number","null"]},"station_name":{"type":["string","null"]},"wmo_id":{"type":["number","null"]},"wfo":{"type":["string","null"]},"station_lat":{"type":["number","null"]},"station_lon":{"type":["number","null"]},"elevation_m":{"type":["number","null"]},"derived":{"type":["object","null"],"additionalProperties":{},"description":"Additive computed upper-air telemetry (freezing level, tropopause, inversions, max wind, 0–6 km bulk shear, precipitable water, lapse rates, and SB/ML/MU parcel CAPE/CIN with surface-based LCL/LFC/EL). Null on list rows whose persisted metrics predate the current algorithm version; the detail read computes on the fly instead."},"levels":{"type":"array","items":{"$ref":"#/components/schemas/NationalSoundingLevel"}}},"required":["id","source_id","station_id","valid_at","retrieved_at","level_count","max_height_m","surface_pressure_hpa","station_name","wmo_id","wfo","station_lat","station_lon","elevation_m","derived","levels"],"description":"One national RAOB profile with its measured vertical levels. `derived` is computed on the fly when the persisted block is stale or absent."},"NationalSoundingListResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"example":{"type":"boolean","enum":[false]},"scope":{"type":"string","enum":["provider_global"]},"importsIncluded":{"type":"boolean","enum":[false]},"soundings":{"type":"array","items":{"$ref":"#/components/schemas/NationalSoundingProfile"}},"nextCursor":{"type":["string","null"],"description":"Opaque cursor for the next older page, or null when this page is the end. Pass back unchanged as ?cursor=."}},"required":["ok","example","scope","importsIncluded","soundings","nextCursor"],"description":"Cursor-paginated collector-owned provider-global national RAOB page. Account imports and location-resolution fan-out are structurally excluded."},"NationalSoundingDetailResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"example":{"type":"boolean","enum":[false]},"scope":{"type":"string","enum":["provider_global"]},"importsIncluded":{"type":"boolean","enum":[false]},"sounding":{"$ref":"#/components/schemas/NationalSoundingDetail"}},"required":["ok","example","scope","importsIncluded","sounding"],"description":"One collector-owned provider-global national RAOB profile. Account imports and location-resolution fan-out are structurally excluded."},"SynopticSelection":{"type":"object","properties":{"id":{"type":"string","example":"01jz123cwopselabc"},"stid":{"type":"string","example":"G6141"},"network":{"type":"string","example":"65"},"distanceMiles":{"type":"number","example":4.2},"active":{"type":"boolean"},"selectedAt":{"type":"string","example":"2026-07-01T11:02:00.000Z"},"updatedAt":{"type":"string","example":"2026-07-01T11:02:00.000Z"},"lastSeenAt":{"type":["string","null"],"example":"2026-07-01T12:15:00.000Z"},"lastObservedAt":{"type":["string","null"],"example":"2026-07-01T12:15:00.000Z"}},"required":["id","stid","network","distanceMiles","active"]},"SynopticObservation":{"type":"object","properties":{"id":{"type":"string","example":"01jz123cwopobsabc"},"stid":{"type":"string","example":"G6141"},"network":{"type":"string","example":"65"},"observed_at":{"type":"string","example":"2026-07-01T12:15:00.000Z"},"retrieved_at":{"type":"string","example":"2026-07-01T12:15:32.000Z"},"temperature_c":{"type":["number","null"],"example":29.4},"dewpoint_c":{"type":["number","null"],"example":20.7},"relative_humidity_pct":{"type":["number","null"],"example":58},"wind_direction_deg":{"type":["number","null"],"example":220},"wind_speed_ms":{"type":["number","null"],"example":3.1},"wind_gust_ms":{"type":["number","null"],"example":5.4},"pressure_pa":{"type":["number","null"],"example":101320},"precipitation_1h_m":{"type":["number","null"],"description":"Provider-reported one-hour precipitation accumulation in metres.","example":0},"soil_temp_c":{"type":["number","null"],"example":null},"soil_moisture_pct":{"type":["number","null"],"example":null}},"required":["id","stid","network","observed_at","retrieved_at","temperature_c","dewpoint_c","relative_humidity_pct","wind_direction_deg","wind_speed_ms","wind_gust_ms","pressure_pa","precipitation_1h_m","soil_temp_c","soil_moisture_pct"],"additionalProperties":false},"SynopticObservationFreshness":{"type":"object","properties":{"newestObservedAt":{"type":["string","null"],"format":"date-time"},"newestRetrievedAt":{"type":["string","null"],"format":"date-time"},"oldestObservedAt":{"type":["string","null"],"format":"date-time"}},"required":["newestObservedAt","newestRetrievedAt","oldestObservedAt"],"additionalProperties":false},"SynopticStationCandidate":{"type":"object","properties":{"stid":{"type":"string","example":"G6141"},"name":{"type":["string","null"],"example":"Micah Ridge PWS"},"network":{"type":"string","example":"65"},"isCwop":{"type":"boolean"},"lat":{"type":"number","example":36.602},"lon":{"type":"number","example":-79.412},"elevationM":{"type":["number","null"],"example":248},"distanceMiles":{"type":"number","example":4.2},"compass":{"type":"string","example":"NW"},"observedAt":{"type":["string","null"],"example":null},"variables":{"type":"array","items":{"type":"string"},"example":[]},"selected":{"type":"boolean"}},"required":["stid","name","network","isCwop","lat","lon","elevationM","distanceMiles","compass","observedAt","variables","selected"]},"SynopticSelectionsResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"selections":{"type":"array","items":{"$ref":"#/components/schemas/SynopticSelection"}},"maxStations":{"type":"number","example":25},"attribution":{"type":"string"}},"required":["ok","selections","maxStations"],"description":"Saved CWOP / mesonet stations for one account-owned location."},"SynopticObservationsResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"observations":{"type":"array","items":{"$ref":"#/components/schemas/SynopticObservation"}},"count":{"type":"integer","description":"Number of observations returned in this page."},"limit":{"type":"integer","description":"Maximum number of observations in a page."},"truncated":{"type":"boolean","description":"True when more observations matched the filters than `limit`."},"freshness":{"$ref":"#/components/schemas/SynopticObservationFreshness"},"hours":{"type":"number","example":6},"attribution":{"type":"string"}},"required":["ok","observations","count","limit","truncated","freshness","hours"],"additionalProperties":false,"description":"Bounded recent CWOP / mesonet observations for one account-owned location. The response is a typed projection: account identifiers, selection internals, and raw provider/QC JSON are excluded."},"SynopticStationsResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"candidates":{"type":"array","items":{"$ref":"#/components/schemas/SynopticStationCandidate"}},"truncated":{"type":"boolean"},"radiusMiles":{"type":"number","example":30},"attribution":{"type":"string"}},"required":["ok","candidates","truncated","radiusMiles"],"description":"Nearby discoverable CWOP / mesonet stations around one saved location."},"MadisSelection":{"type":"object","properties":{"id":{"type":"string","example":"01jz123madisselabc"},"stid":{"type":"string","example":"G6141"},"stationId":{"type":"string","example":"G6141"},"network":{"type":"string","example":"APRSWXNET"},"providerCode":{"type":"string","example":"APRSWXNET"},"distanceMiles":{"type":"number","example":4.2},"active":{"type":"boolean"},"selectedAt":{"type":"string","example":"2026-07-01T11:02:00.000Z"},"updatedAt":{"type":"string","example":"2026-07-01T11:02:00.000Z"},"lastSeenAt":{"type":["string","null"],"example":"2026-07-01T12:15:00.000Z"},"lastObservedAt":{"type":["string","null"],"example":"2026-07-01T12:15:00.000Z"}},"required":["id","stid","stationId","network","providerCode","distanceMiles","active"]},"MadisObservation":{"type":"object","properties":{"id":{"type":"string","example":"01jz123madisobsabc"},"stid":{"type":"string","example":"G6141"},"station_id":{"type":"string","example":"G6141"},"network":{"type":"string","example":"APRSWXNET"},"provider_code":{"type":"string","example":"APRSWXNET"},"observed_at":{"type":"string","example":"2026-07-01T12:15:00.000Z"},"retrieved_at":{"type":"string","example":"2026-07-01T12:15:32.000Z"},"temperature_c":{"type":["number","null"],"example":30},"dewpoint_c":{"type":["number","null"],"example":22.9},"relative_humidity_pct":{"type":["number","null"],"example":67},"wind_direction_deg":{"type":["number","null"],"example":214},"wind_speed_ms":{"type":["number","null"],"example":2.6},"wind_gust_ms":{"type":["number","null"],"example":4.1},"altimeter_pa":{"type":["number","null"],"description":"Altimeter setting reported by MADIS (ALTSE), in pascals; not station pressure.","example":101420},"precipitation_1h_m":{"type":["number","null"],"description":"MADIS PCP1H one-hour accumulation in metres. Each value describes its own observation window; do not sum overlapping rows.","example":0}},"required":["id","stid","station_id","network","provider_code","observed_at","retrieved_at","temperature_c","dewpoint_c","relative_humidity_pct","wind_direction_deg","wind_speed_ms","wind_gust_ms","altimeter_pa","precipitation_1h_m"],"additionalProperties":false},"MadisLiveLocationBinding":{"type":"object","properties":{"location_id":{"type":"string"},"location_name":{"type":"string"},"distance_miles":{"type":"number"}},"required":["location_id","location_name","distance_miles"]},"MadisLiveStation":{"type":"object","properties":{"provider_code":{"type":"string","example":"APRSWXNET"},"station_id":{"type":"string","example":"F5309"},"is_cwop":{"type":"boolean"},"station_lat":{"type":"number"},"station_lon":{"type":"number"},"elevation_m":{"type":["number","null"]},"tracked_location_count":{"type":"integer"},"location_bindings":{"type":"array","items":{"$ref":"#/components/schemas/MadisLiveLocationBinding"}},"nearest_tracked_location":{"$ref":"#/components/schemas/MadisLiveLocationBinding"},"observed_at":{"type":["string","null"]},"retrieved_at":{"type":["string","null"]},"age_minutes":{"type":["number","null"]},"freshness":{"type":"string","enum":["live","delayed","stale","missing"]},"temperature_c":{"type":["number","null"]},"temperature_f":{"type":["number","null"]},"dewpoint_c":{"type":["number","null"]},"dewpoint_f":{"type":["number","null"]},"relative_humidity_pct":{"type":["number","null"]},"wind_direction_deg":{"type":["number","null"]},"wind_speed_ms":{"type":["number","null"]},"wind_speed_mph":{"type":["number","null"]},"wind_gust_ms":{"type":["number","null"]},"wind_gust_mph":{"type":["number","null"]},"altimeter_pa":{"type":["number","null"],"description":"Altimeter setting reported by MADIS (ALTSE), in pascals; not station pressure."},"altimeter_hpa":{"type":["number","null"],"description":"The same MADIS altimeter setting converted to hectopascals."},"precipitation_1h_m":{"type":["number","null"],"description":"MADIS PCP1H one-hour accumulation in metres. Explicit zero is a valid window value and does not erase an earlier nonzero window."},"precipitation_1h_in":{"type":["number","null"]},"variables_selected":{"type":"array","items":{"type":"string"}},"observation_status":{"type":"string","enum":["found_in_window","no_observation_in_window"]},"contributing_receipt_count":{"type":"integer"},"field_conflicts":{"type":"array","items":{"type":"string"}}},"required":["provider_code","station_id","is_cwop","station_lat","station_lon","elevation_m","tracked_location_count","location_bindings","nearest_tracked_location","observed_at","retrieved_at","age_minutes","freshness","temperature_c","temperature_f","dewpoint_c","dewpoint_f","relative_humidity_pct","wind_direction_deg","wind_speed_ms","wind_speed_mph","wind_gust_ms","wind_gust_mph","altimeter_pa","altimeter_hpa","precipitation_1h_m","precipitation_1h_in","variables_selected","observation_status","contributing_receipt_count","field_conflicts"],"description":"One physical MADIS station, de-duplicated by provider and station id, with every active account-location binding and nearest-location attribution."},"MadisLiveResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"stations":{"type":"array","items":{"$ref":"#/components/schemas/MadisLiveStation"}},"total":{"type":"integer"},"limit":{"type":"integer"},"offset":{"type":"integer"},"truncated":{"type":"boolean"},"hours":{"type":"integer"},"generated_at":{"type":"string"},"station_identity":{"type":"string","enum":["(provider_code, station_id)"]},"location_attribution_policy":{"type":"string","enum":["nearest_active_account_location"]},"attribution":{"type":"string"}},"required":["ok","stations","total","limit","offset","truncated","hours","generated_at","station_identity","location_attribution_policy"]},"MadisStationCandidate":{"type":"object","properties":{"stid":{"type":"string","example":"G6141"},"stationId":{"type":"string","example":"G6141"},"name":{"type":["string","null"],"example":null},"network":{"type":"string","example":"APRSWXNET"},"providerCode":{"type":"string","example":"APRSWXNET"},"isCwop":{"type":"boolean"},"lat":{"type":"number","example":37.425},"lon":{"type":"number","example":-79.1788},"elevationM":{"type":["number","null"],"example":202},"distanceMiles":{"type":"number","example":4.2},"compass":{"type":"string","example":"NW"},"observedAt":{"type":["string","null"],"example":"2026-07-01T21:30:00.000Z"},"variables":{"type":"array","items":{"type":"string"},"example":["T","RH","FF"]},"selected":{"type":"boolean"}},"required":["stid","stationId","name","network","providerCode","isCwop","lat","lon","elevationM","distanceMiles","compass","observedAt","variables","selected"]},"MadisSelectionsResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"selections":{"type":"array","items":{"$ref":"#/components/schemas/MadisSelection"}},"maxStations":{"type":"number","example":25},"attribution":{"type":"string"}},"required":["ok","selections","maxStations"],"description":"Saved NOAA MADIS Integrated Mesonet sensors for one account-owned location."},"MadisObservationsResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"observations":{"type":"array","items":{"$ref":"#/components/schemas/MadisObservation"}},"count":{"type":"integer"},"limit":{"type":"integer"},"truncated":{"type":"boolean"},"nextCursor":{"type":["string","null"]},"freshness":{"$ref":"#/components/schemas/SynopticObservationFreshness"},"hours":{"type":"number","example":6},"attribution":{"type":"string"}},"required":["ok","observations","count","limit","truncated","nextCursor","freshness","hours"],"additionalProperties":false,"description":"Cursor-paginated NOAA MADIS Integrated Mesonet observations. Account, selection, raw provider, and QC internals are excluded."},"MadisStationsResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"candidates":{"type":"array","items":{"$ref":"#/components/schemas/MadisStationCandidate"}},"truncated":{"type":"boolean"},"radiusMiles":{"type":"number","example":30},"attribution":{"type":"string"}},"required":["ok","candidates","truncated","radiusMiles"],"description":"Nearby discoverable NOAA MADIS public Integrated Mesonet sensors around one saved location."},"TextProductSummary":{"type":"object","properties":{"id":{"type":"string","example":"nws-text-afd-krnk-20260705"},"product_type":{"type":"string","description":"Product code, e.g. AFD (Area Forecast Discussion).","example":"AFD"},"office":{"type":["string","null"],"description":"Issuing NWS office (WMO/AWIPS form), or null.","example":"KRNK"},"issued_at":{"type":["string","null"],"example":"2026-07-05T10:42:00.000Z"},"retrieved_at":{"type":"string","example":"2026-07-05T10:45:00.000Z"},"title":{"type":["string","null"],"example":"Area Forecast Discussion"}},"required":["id","product_type","office","issued_at","retrieved_at","title"],"description":"One stored NWS text product (AFD or similar office discussion), summary form."},"LocationNwsContext":{"type":"object","properties":{"locationId":{"type":"string","example":"account-home-acct-1"},"cwa":{"type":["string","null"],"description":"County Warning Area / WFO id the location resolves to.","example":"RNK"},"grid_id":{"type":["string","null"],"example":"RNK"},"grid_x":{"type":["number","null"],"example":27},"grid_y":{"type":["number","null"],"example":71},"resolved_at":{"type":["string","null"],"example":"2026-07-01T00:00:00.000Z"},"primaryStation":{"type":["object","null"],"properties":{"station_id":{"type":"string","example":"KROA"},"name":{"type":["string","null"],"example":"Roanoke Regional Airport"},"distance_km":{"type":["number","null"],"example":12.3}},"required":["station_id","name","distance_km"],"description":"Nearest ranked observation station for the location, or null."}},"required":["locationId","cwa","grid_id","grid_x","grid_y","resolved_at","primaryStation"],"description":"The saved location's resolved NWS office/grid context, letting a caller confirm which WFO an AFD belongs to."},"TextProductDetail":{"allOf":[{"$ref":"#/components/schemas/TextProductSummary"},{"type":"object","properties":{"raw_text":{"type":"string","description":"Full raw narrative text of the product."},"sections":{"type":"object","additionalProperties":{"type":"string"},"description":"Parsed named sections, e.g. SYNOPSIS, NEAR TERM, AVIATION."},"wmo_header":{"type":["string","null"],"example":"FXUS61 KRNK 291842"},"awips_id":{"type":["string","null"],"example":"AFDRNK"},"provider_product_id":{"type":["string","null"]},"raw_payload_id":{"type":["string","null"]}},"required":["raw_text","sections","wmo_header","awips_id","provider_product_id","raw_payload_id"]}],"description":"One stored NWS text product with full narrative and parsed sections."},"TextProductsResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"example":{"type":"boolean","description":"True for synthetic signed-out example data; false for live/account-scoped reads."},"products":{"type":"array","items":{"$ref":"#/components/schemas/TextProductSummary"},"description":"Stored office discussions, newest issuance first. When `locationId` is supplied, scoped to that location's resolved NWS office; use `limit=1` to grab the latest."},"nws":{"allOf":[{"$ref":"#/components/schemas/LocationNwsContext"},{"type":["object","null"],"description":"Location NWS context. Present in live responses — null when no `locationId` was supplied, or the location's resolved NWS office when one was. Omitted from signed-out example responses."}]}},"required":["ok","products"],"description":"List of stored NWS text products (AFDs and similar office discussions)."},"TextProductResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"example":{"type":"boolean","description":"True for synthetic signed-out example data; false for live/account-scoped reads."},"product":{"$ref":"#/components/schemas/TextProductDetail"}},"required":["ok","product"],"description":"A single stored NWS text product with full narrative and parsed sections."},"ClimateEnsoResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"example":{"type":"boolean","description":"True for synthetic signed-out example data; false for live/account-scoped reads."},"climate":{"type":"object","properties":{"state":{"type":"string","enum":["not_collected","no_parseable_rows","partial","ok"],"description":"Collection health for the CPC ENSO streams as a whole. `latest` and `series` are empty when nothing parseable has been collected."},"latest":{"type":"array","items":{"type":"object","properties":{}},"description":"Newest published value per dataset × metric (weekly Niño-region SSTs and anomalies, ONI, RONI), with period bounds, units, provisional flag, and revision count."},"series":{"type":"array","items":{"type":"object","properties":{}},"description":"Recent evolution per dataset × metric, bounded to `evolutionPeriods` periods per series. Reflects what CPC currently publishes, not the append-only revision history."},"streams":{"type":"array","items":{"type":"object","properties":{}},"description":"Per-dataset collection stream health, derived from each stream's newest sample."}},"required":["state","latest","series","streams"]}},"required":["ok","climate"],"description":"Provider-global NOAA CPC ENSO climate context. Shared public data — identical payload for every signed-in account."},"TropicsResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"example":{"type":"boolean","description":"True for synthetic signed-out example data; false for live/account-scoped reads."},"tropics":{"type":"object","properties":{"status":{"type":"string","enum":["not_collected","clear","active"],"description":"`not_collected`: no successful NHC storm-list read has been recorded yet. `clear`: the newest read succeeded and listed no active systems. `active`: at least one system is active. Never describe `not_collected` as \"no storms\"."},"confirmedAt":{"type":["string","null"],"description":"Time of the newest successful NHC storm-list read."},"season":{"type":"integer"},"collectedSince":{"type":["string","null"],"description":"Oldest stored NHC storm observation. Season counts cover only what was collected since then; a season that began earlier is incomplete and must not be reported as a season total."},"active":{"type":"array","items":{"type":"object","properties":{}},"description":"Active Atlantic, East Pacific and Central Pacific (CPHC) systems: latest position and intensity (knots, hPa), `basin` of genesis and `currentRegion`, Saffir-Simpson `category`, observed `track` (stored advisory-time positions, oldest first), the newest advisory `forecast` points by `tau` hours, and `forecastHistory` (up to 12 advisories, newest first) showing how the forecast moved. NHC 9999 missing-value sentinels are returned as null."},"seasonStorms":{"type":"array","items":{"type":"object","properties":{}},"description":"One row per storm in `season`: latest name and classification, first/last observation, peak intensity, minimum pressure, peak category, and whether it is active now."},"seasonStormsTruncated":{"type":"boolean"},"basins":{"type":"array","items":{"type":"object","properties":{}},"description":"Per-basin counts from `seasonStorms` by peak intensity: systems, ≥34 kt, ≥64 kt, ≥96 kt, and the peak."},"matches":{"type":"array","items":{"type":"object","properties":{}},"description":"Current threats to the caller’s own saved locations (watch/warning area > forecast cone > track proximity). Strictly current state: an empty list is not a history of past threats."}},"required":["status","confirmedAt","season","collectedSince","active","seasonStorms","seasonStormsTruncated","basins","matches"]}},"required":["ok","tropics"],"description":"NHC tropical cyclone overview. Storm data is provider-global public NOAA data; `matches` is scoped to the caller’s saved locations."},"AccuracyFlagsResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"flags":{"type":"array","items":{"type":"object","properties":{}},"description":"Append-only observed-inaccuracy flags for the location, newest first, up to 100. Each snapshots the contested platform reading (field, source, value, retrieval time) beside the caller's own observation."},"authRequired":{"type":"boolean","enum":[true],"description":"Present and true only for signed-out callers, whose `flags` list is always empty. An auth placeholder, not synthetic example data — this route has no example mode."}},"required":["ok","flags"],"description":"Account-owned observed-inaccuracy flags for one saved location."},"AccountDataEnvelope":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]}},"required":["ok"],"description":"Account-scoped saved information. Stable top-level fields are documented by the route; nested UI read models remain permissive."},"SavedAgentWorkEnvelope":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]}},"required":["ok"],"description":"Account-owned saved report, run-book, dashboard, insight, or related read model. Provider credentials and secrets are never included."},"SavedReportDetailEnvelope":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"report":{"type":"object","properties":{"chartEvidence":{"type":"array","items":{"type":"object","properties":{"sectionIndex":{"type":"integer","minimum":0},"queryId":{"type":["string","null"]},"status":{"type":"string","enum":["renderable","unavailable"]},"warnings":{"type":"array","items":{"type":"string"}}},"required":["sectionIndex","queryId","status","warnings"]},"description":"One entry per composite chart section, computed from its retained query rows using the live/PNG planner. Includes missing/sparse observations, incomplete coverage and unavailable-chart reasons. Renderable is a drawing state, not a verification of weather claims; preserve warnings when interpreting the chart."}},"required":["chartEvidence"]}},"required":["ok","report"]},"SavedInsightRunEnvelope":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"insight":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]},"result":{"type":"object","properties":{"columns":{"type":"array","items":{"type":"string"}},"rows":{"type":"array","items":{"type":"object","additionalProperties":{}}},"rowCount":{"type":"integer","minimum":0},"truncated":{"type":"boolean"},"durationMs":{"type":"number","minimum":0},"plausibilityWarnings":{"type":"array","items":{"type":"string"},"description":"Non-blocking physical-value review prompts from the executor. Preserve these warnings with chartEvidence when interpreting or sharing the result; they do not correct or replace returned values."}},"required":["columns","rows","rowCount","truncated","durationMs"]},"executedSql":{"type":"string"},"chartEvidence":{"type":"object","properties":{"status":{"type":"string","enum":["renderable","unavailable"]},"warnings":{"type":"array","items":{"type":"string"}}},"required":["status","warnings"]},"ranAt":{"type":"string","format":"date-time"},"runScope":{"type":"object","properties":{"mode":{"type":"string","enum":["report","fixed","follow-page"]},"locations":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":["string","null"]}},"required":["id"]}}},"required":["mode","locations"]},"presentation":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":["string","null"]},"chartTitle":{"type":["string","null"]},"chartDescription":{"type":["string","null"]},"headerTitle":{"type":"string"},"headerDescription":{"type":"string"},"fieldSource":{"type":"object","additionalProperties":{"type":"string","enum":["literal","template","invalid-template","unresolvable"]}},"wording":{"type":"string","enum":["adaptive","reviewed","unreviewed"]},"staticPlaceWarning":{"type":"boolean"},"invalidTemplateFields":{"type":"array","items":{"type":"string"}},"scopeChip":{"type":"object","properties":{"recorded":{"type":"boolean"},"label":{"type":"string"},"mode":{"type":["string","null"],"enum":["report","fixed","follow-page"]},"modeLabel":{"type":["string","null"]}},"required":["recorded","label","mode","modeLabel"]}},"required":["name","description","chartTitle","chartDescription","headerTitle","headerDescription","fieldSource","wording","staticPlaceWarning","invalidTemplateFields","scopeChip"],"description":"Display wording resolved against this run’s runScope: location templates (params.cardContextV1.text, tokens {{focus.name}} and {{scope.label}}) are filled in for the locations this result ran under, so these fields — not the raw insight name or viz title — describe this result. headerTitle/headerDescription follow the UI and PNG precedence (chart title, then card name). staticPlaceWarning=true means a follow-page card’s saved wording was never reviewed and may name a different place than runScope; say so rather than repeating that place name. A location focus is not a measurement station."}},"required":["ok","insight","result","executedSql","ranAt","runScope","presentation"]},"SurfaceStation":{"type":"object","properties":{"locationId":{"type":"string"},"canonicalStationId":{"type":"string"},"role":{"type":"string","enum":["primary_verification","ranked_nearby","user_selected","operational"]},"rank":{"type":["number","null"]},"distanceKm":{"type":["number","null"]},"bearingDeg":{"type":["number","null"]},"name":{"type":["string","null"]},"latitude":{"type":["number","null"]},"longitude":{"type":["number","null"]},"elevationM":{"type":["number","null"]},"operatorName":{"type":["string","null"]},"ownerName":{"type":["string","null"]},"networkCode":{"type":["string","null"]},"platformCode":{"type":["string","null"]},"stationClass":{"type":"string","enum":["official_aviation","professional_mesonet","specialized_infrastructure","community_documented_siting","community_unknown_siting","unknown"]},"activeState":{"type":"string","enum":["active","inactive","unknown"]},"metadataObservedAt":{"type":["string","null"]},"metadataRetrievedAt":{"type":"string"}},"required":["locationId","canonicalStationId","role","rank","distanceKm","bearingDeg","name","latitude","longitude","elevationM","operatorName","ownerName","networkCode","platformCode","stationClass","activeState","metadataObservedAt","metadataRetrievedAt"],"description":"Canonical physical station relevant to one account-owned saved location."},"SurfaceReport":{"type":"object","properties":{"id":{"type":"string"},"canonicalStationId":{"type":"string"},"reportType":{"type":"string","enum":["METAR","SPECI","UNKNOWN"]},"reportTime":{"type":"string"},"conflictState":{"type":"string","enum":["none","resolved_correction","conflicted"]},"firstSeenAt":{"type":"string"},"lastSeenAt":{"type":"string"},"preferredVariantId":{"type":["string","null"]},"rawReportText":{"type":["string","null"]},"rawRemarks":{"type":["string","null"]},"revisionKind":{"type":["string","null"],"enum":["original","correction","amendment","unknown"]},"automationState":{"type":["string","null"],"enum":["ao1","ao2","manual","unknown"]},"parseStatus":{"type":["string","null"],"enum":["parsed","partial","failed"]},"windDirectionDeg":{"type":["number","null"]},"windSpeedKt":{"type":["number","null"]},"windGustKt":{"type":["number","null"]},"temperatureC":{"type":["number","null"]},"dewpointC":{"type":["number","null"]},"visibilityM":{"type":["number","null"]},"altimeterHpa":{"type":["number","null"]}},"required":["id","canonicalStationId","reportType","reportTime","conflictState","firstSeenAt","lastSeenAt","preferredVariantId","rawReportText","rawRemarks","revisionKind","automationState","parseStatus","windDirectionDeg","windSpeedKt","windGustKt","temperatureC","dewpointC","visibilityM","altimeterHpa"],"description":"Immutable report family with its deterministic preferred projection; conflicts and revisions remain explicit."},"SurfaceCoverage":{"type":"object","properties":{"canonicalStationId":{"type":"string"},"sourceId":{"type":"string"},"windowStart":{"type":"string"},"windowEnd":{"type":"string"},"retrievedAt":{"type":"string"},"status":{"type":"string","enum":["complete","partial","empty","error","unknown"]},"gapReason":{"type":["string","null"]},"itemCount":{"type":"integer"},"windowCount":{"type":"integer"},"truncated":{"type":"boolean"},"hasGaps":{"type":"boolean"}},"required":["canonicalStationId","sourceId","windowStart","windowEnd","retrievedAt","status","gapReason","itemCount","windowCount","truncated","hasGaps"],"description":"Collection-window receipts aggregated per station and source. `hasGaps` includes leading, trailing, and internal holes in the requested range; `status` is the worst receipt status, so failures are never averaged away."},"SurfaceReportVariant":{"type":"object","properties":{"id":{"type":"string"},"family_id":{"type":"string"},"canonical_content_hash":{"type":"string"},"raw_report_text":{"type":["string","null"]},"raw_availability":{"type":"string","enum":["provided","not_provided_by_transport"]},"raw_remarks":{"type":["string","null"]},"revision_kind":{"type":"string","enum":["original","correction","amendment","unknown"]},"automation_state":{"type":"string","enum":["ao1","ao2","manual","unknown"]},"parse_status":{"type":"string","enum":["parsed","partial","failed"]},"parser_version":{"type":"string"},"wind_direction_deg":{"type":["number","null"]},"wind_speed_kt":{"type":["number","null"]},"wind_gust_kt":{"type":["number","null"]},"temperature_c":{"type":["number","null"]},"dewpoint_c":{"type":["number","null"]},"visibility_m":{"type":["number","null"]},"altimeter_hpa":{"type":["number","null"]},"normalization_hash":{"type":"string"},"first_seen_at":{"type":"string"},"last_seen_at":{"type":"string"},"created_at":{"type":"string"}},"required":["id","family_id","canonical_content_hash","raw_report_text","raw_availability","raw_remarks","revision_kind","automation_state","parse_status","parser_version","wind_direction_deg","wind_speed_kt","wind_gust_kt","temperature_c","dewpoint_c","visibility_m","altimeter_hpa","normalization_hash","first_seen_at","last_seen_at","created_at"]},"SurfaceReportReceipt":{"type":"object","properties":{"id":{"type":"string"},"variant_id":{"type":"string"},"source_id":{"type":"string"},"transport":{"type":"string"},"transport_native_id":{"type":"string"},"exact_body":{"type":["string","null"]},"exact_body_hash":{"type":"string"},"raw_payload_id":{"type":["string","null"]},"collection_sample_id":{"type":["string","null"]},"transport_observed_at":{"type":["string","null"]},"retrieved_at":{"type":"string"},"created_at":{"type":"string"}},"required":["id","variant_id","source_id","transport","transport_native_id","exact_body","exact_body_hash","raw_payload_id","collection_sample_id","transport_observed_at","retrieved_at","created_at"]},"SurfaceReportEvent":{"type":"object","properties":{"id":{"type":"string"},"variant_id":{"type":"string"},"ordinal":{"type":"integer"},"event_kind":{"type":"string","enum":["peak_wind","wind_shift","pressure_rising_rapidly","pressure_falling_rapidly","precipitation","thunderstorm_begin","thunderstorm_end","other"]},"event_at":{"type":["string","null"]},"duration_hours":{"type":["integer","null"]},"direction_deg":{"type":["number","null"]},"speed_kt":{"type":["number","null"]},"amount_mm":{"type":["number","null"]},"value_state":{"type":"string","enum":["known","trace","explicit_zero","missing","unknown"]},"raw_token":{"type":"string"},"created_at":{"type":"string"}},"required":["id","variant_id","ordinal","event_kind","event_at","duration_hours","direction_deg","speed_kt","amount_mm","value_state","raw_token","created_at"]},"SurfaceMeasurement":{"type":"object","properties":{"location_id":{"type":"string"},"canonical_station_id":{"type":"string"},"id":{"type":"string"},"report_variant_id":{"type":["string","null"]},"source_id":{"type":"string"},"variable":{"type":"string"},"observed_at":{"type":"string"},"period_start":{"type":["string","null"]},"period_end":{"type":["string","null"]},"retrieved_at":{"type":"string"},"numeric_value":{"type":["number","null"]},"text_value":{"type":["string","null"]},"unit":{"type":["string","null"]},"value_state":{"type":"string","enum":["known","trace","explicit_zero","missing","unknown"]},"magnitude_provenance":{"type":["string","null"]},"qc_state":{"type":["string","null"]},"created_at":{"type":"string"}},"required":["location_id","canonical_station_id","id","report_variant_id","source_id","variable","observed_at","period_start","period_end","retrieved_at","numeric_value","text_value","unit","value_state","magnitude_provenance","qc_state","created_at"]},"SurfaceEpisodeEvidence":{"type":"object","properties":{"location_id":{"type":"string"},"event_id":{"type":"string"},"evidence_item_id":{"type":"string"},"evidence_role":{"type":"string","enum":["core_measurement","embedded_core_phenomenon","post_event_context","delayed_corroboration","near_event_context"]},"window_relation":{"type":"string","enum":["inside_core","post_close_tail","near_event","delayed","unknown"]},"link_method":{"type":"string","enum":["station_relevance_time","geometry_time","existing_episode_context","operator"]},"distance_km":{"type":["number","null"]},"bearing_deg":{"type":["number","null"]},"linked_at":{"type":"string"},"source_id":{"type":"string"},"evidence_type":{"type":"string"},"source_class":{"type":"string","enum":["official_standardized_station","professional_network","community_network","official_storm_report","spc_context","lightning_context","radar_context","outage_context","unknown"]},"canonical_station_id":{"type":["string","null"]},"event_at":{"type":["string","null"]},"observed_at":{"type":["string","null"]},"reported_at":{"type":["string","null"]},"retrieved_at":{"type":"string"},"latitude":{"type":["number","null"]},"longitude":{"type":["number","null"]},"magnitude_value":{"type":["number","null"]},"magnitude_unit":{"type":["string","null"]},"magnitude_provenance":{"type":["string","null"]},"value_state":{"type":"string","enum":["known","trace","explicit_zero","missing","unknown"]},"summary":{"type":["string","null"]}},"required":["location_id","event_id","evidence_item_id","evidence_role","window_relation","link_method","distance_km","bearing_deg","linked_at","source_id","evidence_type","source_class","canonical_station_id","event_at","observed_at","reported_at","retrieved_at","latitude","longitude","magnitude_value","magnitude_unit","magnitude_provenance","value_state","summary"]},"SurfaceStationsResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"scope":{"type":"string","enum":["account_location"]},"locationId":{"type":"string"},"stations":{"type":"array","items":{"$ref":"#/components/schemas/SurfaceStation"}}},"required":["ok","scope","locationId","stations"]},"SurfaceReportsResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"scope":{"type":"string","enum":["account_location"]},"locationId":{"type":"string"},"from":{"type":"string"},"to":{"type":"string"},"reports":{"type":"array","items":{"$ref":"#/components/schemas/SurfaceReport"}},"nextCursor":{"type":["string","null"]},"truncated":{"type":"boolean"},"coverage":{"type":"array","items":{"$ref":"#/components/schemas/SurfaceCoverage"}}},"required":["ok","scope","locationId","from","to","reports","nextCursor","truncated","coverage"]},"SurfaceReportDetailResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"scope":{"type":"string","enum":["account_location"]},"locationId":{"type":"string"},"report":{"allOf":[{"$ref":"#/components/schemas/SurfaceReport"},{"type":"object","properties":{"variants":{"type":"array","items":{"$ref":"#/components/schemas/SurfaceReportVariant"}},"receipts":{"type":"array","items":{"$ref":"#/components/schemas/SurfaceReportReceipt"}},"events":{"type":"array","items":{"$ref":"#/components/schemas/SurfaceReportEvent"}}},"required":["variants","receipts","events"]}],"description":"Immutable report family with its deterministic preferred projection; conflicts and revisions remain explicit."}},"required":["ok","scope","locationId","report"]},"SurfaceMeasurementsResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"scope":{"type":"string","enum":["account_location"]},"locationId":{"type":"string"},"from":{"type":"string"},"to":{"type":"string"},"measurements":{"type":"array","items":{"$ref":"#/components/schemas/SurfaceMeasurement"}},"nextCursor":{"type":["string","null"]},"truncated":{"type":"boolean"},"coverage":{"type":"array","items":{"$ref":"#/components/schemas/SurfaceCoverage"}}},"required":["ok","scope","locationId","from","to","measurements","nextCursor","truncated","coverage"]},"SurfaceEpisodeEvidenceResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"scope":{"type":"string","enum":["account_location"]},"locationId":{"type":"string"},"episodeId":{"type":"string"},"evidence":{"type":"array","items":{"$ref":"#/components/schemas/SurfaceEpisodeEvidence"}},"truncated":{"type":"boolean","description":"True when the episode has more linked evidence than this bounded response returned. A truncated list is not the episode's full testimony."}},"required":["ok","scope","locationId","episodeId","evidence","truncated"]},"CoverageCalendarEnvelope":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"example":{"type":"boolean"},"coverage":{"type":"object","properties":{"locationId":{"type":"string"},"timeZone":{"type":"string"},"timeZoneFallback":{"type":"boolean"},"year":{"type":"integer"},"month":{"type":"integer","minimum":1,"maximum":12},"days":{"type":"array","items":{"type":"object","properties":{"day":{"type":"string"},"observed":{"type":["object","null"],"properties":{"rowCount":{"type":"number"},"sourceIds":{"type":"array","items":{"type":"string"}}},"required":["rowCount","sourceIds"]},"forecast":{"type":["object","null"],"properties":{"pointCount":{"type":"number"},"sourceIds":{"type":"array","items":{"type":"string"}}},"required":["pointCount","sourceIds"]},"alerts":{"type":["object","null"],"properties":{"count":{"type":"number"},"maxSeverity":{"type":["string","null"]},"events":{"type":"array","items":{"type":"string"}}},"required":["count","maxSeverity","events"]}},"required":["day","observed","forecast","alerts"]}}},"required":["locationId","timeZone","timeZoneFallback","year","month","days"]}},"required":["ok","example","coverage"]},"ForecastMomentEnvelope":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"moment":{"type":"object","properties":{"phase":{"type":"string","enum":["upcoming","in_progress","past"]},"latestCheckpoint":{"type":["string","null"],"format":"date-time"},"version":{"type":"number","enum":[1]},"basis":{"type":"string","enum":["retained_hourly_forecasts"]},"generatedAt":{"type":"string","format":"date-time"},"request":{"type":"object","properties":{"locationId":{"type":"string"},"start":{"type":"string","format":"date-time"},"end":{"type":"string","format":"date-time"},"checkpoints":{"type":"array","items":{"type":"string","format":"date-time"}},"historyHours":{"type":"number"},"history":{"type":"boolean"},"focusHour":{"type":"string","format":"date-time"},"historyCutoff":{"type":"string","format":"date-time"},"historyCursor":{"type":"string"},"latestCheckpoint":{"type":["string","null"],"format":"date-time"}},"required":["locationId","start","end","checkpoints","historyHours","history"]},"location":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"lat":{"type":"number"},"lon":{"type":"number"},"timezone":{"type":"string"},"timezoneAssumed":{"type":"boolean"}},"required":["id","name","lat","lon","timezone","timezoneAssumed"]},"context":{"type":"object","properties":{"from":{"type":"string","format":"date-time"},"to":{"type":"string","format":"date-time"}},"required":["from","to"]},"hours":{"type":"array","items":{"type":"string","format":"date-time"}},"pointsTruncated":{"type":"boolean"},"checkpoints":{"type":"array","items":{"type":"object","properties":{"at":{"type":"string","format":"date-time"},"sources":{"type":"array","items":{"type":"object","properties":{"sourceId":{"type":"string"},"name":{"type":"string"},"run":{"type":["object","null"],"properties":{"id":{"type":"string"},"sourceId":{"type":"string"},"issuedAt":{"type":["string","null"],"format":"date-time"},"capturedAt":{"type":"string","format":"date-time"},"rawPayloadId":{"type":["string","null"]},"sampleId":{"type":["string","null"]},"providerModel":{"type":["string","null"]}},"required":["id","sourceId","issuedAt","capturedAt","rawPayloadId","sampleId","providerModel"]},"points":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"runId":{"type":"string"},"sourceId":{"type":"string"},"validAt":{"type":"string","format":"date-time"},"capturedAt":{"type":["string","null"],"format":"date-time"},"issuedAt":{"type":["string","null"],"format":"date-time"},"conditionCode":{"type":["string","null"]},"conditionText":{"type":["string","null"]},"values":{"type":"object","properties":{"precip_probability_pct":{"type":["number","null"]},"precip_amount_mm":{"type":["number","null"]},"temperature_c":{"type":["number","null"]},"wind_speed_kph":{"type":["number","null"]},"wind_gust_kph":{"type":["number","null"]},"humidity_pct":{"type":["number","null"]},"snowfall_amount_mm":{"type":["number","null"]},"cloud_cover_pct":{"type":["number","null"]},"dewpoint_c":{"type":["number","null"]},"pressure_hpa":{"type":["number","null"]},"visibility_m":{"type":["number","null"]},"uv_index":{"type":["number","null"]}},"required":["precip_probability_pct","precip_amount_mm","temperature_c","wind_speed_kph","wind_gust_kph","humidity_pct","snowfall_amount_mm","cloud_cover_pct","dewpoint_c","pressure_hpa","visibility_m","uv_index"]}},"required":["id","runId","sourceId","validAt","capturedAt","issuedAt","conditionCode","conditionText","values"]}},"summary":{"type":"object","properties":{"hours":{"type":"number"},"missingHours":{"type":"number"},"missingMinutes":{"type":"number"},"precipMin":{"type":["number","null"]},"precipMax":{"type":["number","null"]},"thunderHours":{"type":"array","items":{"type":"string","format":"date-time"}},"unknownConditionHours":{"type":"number"}},"required":["hours","missingHours","missingMinutes","precipMin","precipMax","thunderHours","unknownConditionHours"]},"status":{"type":"string","enum":["no_run","no_hours","partial","available"]},"runHorizonEnd":{"type":["string","null"],"format":"date-time"},"captureAgeMinutes":{"type":["number","null"]},"issueAgeMinutes":{"type":["number","null"]},"otherThunderHours":{"type":"array","items":{"type":"string","format":"date-time"}}},"required":["sourceId","name","run","points","summary","status","captureAgeMinutes","issueAgeMinutes","otherThunderHours"]}},"discussion":{"type":["object","null"],"properties":{"id":{"type":"string"},"office":{"type":"string"},"issuedAt":{"type":"string","format":"date-time"},"capturedAt":{"type":"string","format":"date-time"},"sections":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"text":{"type":"string"}},"required":["title","text"]}}},"required":["id","office","issuedAt","capturedAt","sections"]},"discussionStatus":{"type":"string","enum":["available","none","unavailable"]}},"required":["at","sources","discussion","discussionStatus"]}},"history":{"type":"object","properties":{"receipts":{"type":"array","items":{"type":"object","properties":{"sql":{"type":"string"},"parameters":{"type":"array","items":{}},"rowCount":{"type":"number"},"rowsSha256":{"type":"string"},"purpose":{"type":"string"}},"required":["sql","parameters","rowCount","rowsSha256","purpose"]}},"readAt":{"type":"string","format":"date-time"},"pages":{"type":"number"},"nextCursor":{"type":["string","null"]},"anchor":{"type":"string","enum":["event_start","request_time"]},"scope":{"anyOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["window"]}},"required":["kind"]},{"type":"object","properties":{"kind":{"type":"string","enum":["focus_hour"]},"hour":{"type":"string","format":"date-time"}},"required":["kind","hour"]}]},"record":{"type":"object","properties":{"hour":{"type":"string","format":"date-time"},"paths":{"type":"array","items":{"type":"object","properties":{"sourceId":{"type":"string"},"lens":{"type":"string","enum":["precip_probability_pct","precip_amount_mm","temperature_c","wind_speed_kph","wind_gust_kph","humidity_pct","snowfall_amount_mm","cloud_cover_pct","dewpoint_c","pressure_hpa","visibility_m","uv_index","condition","thunder"]},"first":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"null"}]},"latest":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"null"}]},"changes":{"type":"number"},"missing":{"type":"number"},"captures":{"type":"number"},"low":{"type":["object","null"],"properties":{"value":{"type":"number"},"ref":{"type":"object","properties":{"sourceId":{"type":"string"},"runId":{"type":"string"},"pointId":{"type":["string","null"]},"capturedAt":{"type":"string","format":"date-time"}},"required":["sourceId","runId","pointId","capturedAt"]}},"required":["value","ref"]},"high":{"type":["object","null"],"properties":{"value":{"type":"number"},"ref":{"type":"object","properties":{"sourceId":{"type":"string"},"runId":{"type":"string"},"pointId":{"type":["string","null"]},"capturedAt":{"type":"string","format":"date-time"}},"required":["sourceId","runId","pointId","capturedAt"]}},"required":["value","ref"]},"netChange":{"type":["number","null"]},"firstCapturedAt":{"type":["string","null"],"format":"date-time"},"lastCapturedAt":{"type":["string","null"],"format":"date-time"}},"required":["sourceId","lens","first","latest","changes","missing","captures","firstCapturedAt","lastCapturedAt"]}},"findings":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["first_retained","change","reversal","largest_jump","unchanged"]},"sourceId":{"type":"string"},"lens":{"type":"string","enum":["precip_probability_pct","precip_amount_mm","temperature_c","wind_speed_kph","wind_gust_kph","humidity_pct","snowfall_amount_mm","cloud_cover_pct","dewpoint_c","pressure_hpa","visibility_m","uv_index","condition","thunder"]},"from":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"null"}]},"to":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"null"}]},"refs":{"type":"array","items":{"type":"object","properties":{"sourceId":{"type":"string"},"runId":{"type":"string"},"pointId":{"type":["string","null"]},"capturedAt":{"type":"string","format":"date-time"}},"required":["sourceId","runId","pointId","capturedAt"]}}},"required":["id","kind","sourceId","lens","from","to","refs"]}},"findingsTruncated":{"type":"boolean"}},"required":["hour","paths","findings","findingsTruncated"]},"from":{"type":"string","format":"date-time"},"to":{"type":"string","format":"date-time"},"runLimitPerProvider":{"type":"number"},"pointsTruncated":{"type":"boolean"},"providers":{"type":"array","items":{"type":"object","properties":{"sourceId":{"type":"string"},"name":{"type":"string"},"truncated":{"type":"boolean"},"loadedFrom":{"type":["string","null"],"format":"date-time"},"captures":{"type":"array","items":{"type":"object","properties":{"run":{"type":"object","properties":{"id":{"type":"string"},"sourceId":{"type":"string"},"issuedAt":{"type":["string","null"],"format":"date-time"},"capturedAt":{"type":"string","format":"date-time"},"rawPayloadId":{"type":["string","null"]},"sampleId":{"type":["string","null"]},"providerModel":{"type":["string","null"]}},"required":["id","sourceId","issuedAt","capturedAt","rawPayloadId","sampleId","providerModel"]},"points":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"runId":{"type":"string"},"sourceId":{"type":"string"},"validAt":{"type":"string","format":"date-time"},"capturedAt":{"type":["string","null"],"format":"date-time"},"issuedAt":{"type":["string","null"],"format":"date-time"},"conditionCode":{"type":["string","null"]},"conditionText":{"type":["string","null"]},"values":{"type":"object","properties":{"precip_probability_pct":{"type":["number","null"]},"precip_amount_mm":{"type":["number","null"]},"temperature_c":{"type":["number","null"]},"wind_speed_kph":{"type":["number","null"]},"wind_gust_kph":{"type":["number","null"]},"humidity_pct":{"type":["number","null"]},"snowfall_amount_mm":{"type":["number","null"]},"cloud_cover_pct":{"type":["number","null"]},"dewpoint_c":{"type":["number","null"]},"pressure_hpa":{"type":["number","null"]},"visibility_m":{"type":["number","null"]},"uv_index":{"type":["number","null"]}},"required":["precip_probability_pct","precip_amount_mm","temperature_c","wind_speed_kph","wind_gust_kph","humidity_pct","snowfall_amount_mm","cloud_cover_pct","dewpoint_c","pressure_hpa","visibility_m","uv_index"]}},"required":["id","runId","sourceId","validAt","capturedAt","issuedAt","conditionCode","conditionText","values"]}}},"required":["run","points"]}},"revisions":{"type":"array","items":{"type":"object","properties":{"firstCapturedAt":{"type":"string","format":"date-time"},"lastCapturedAt":{"type":"string","format":"date-time"},"captures":{"type":"number"},"run":{"type":"object","properties":{"id":{"type":"string"},"sourceId":{"type":"string"},"issuedAt":{"type":["string","null"],"format":"date-time"},"capturedAt":{"type":"string","format":"date-time"},"rawPayloadId":{"type":["string","null"]},"sampleId":{"type":["string","null"]},"providerModel":{"type":["string","null"]}},"required":["id","sourceId","issuedAt","capturedAt","rawPayloadId","sampleId","providerModel"]},"points":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"runId":{"type":"string"},"sourceId":{"type":"string"},"validAt":{"type":"string","format":"date-time"},"capturedAt":{"type":["string","null"],"format":"date-time"},"issuedAt":{"type":["string","null"],"format":"date-time"},"conditionCode":{"type":["string","null"]},"conditionText":{"type":["string","null"]},"values":{"type":"object","properties":{"precip_probability_pct":{"type":["number","null"]},"precip_amount_mm":{"type":["number","null"]},"temperature_c":{"type":["number","null"]},"wind_speed_kph":{"type":["number","null"]},"wind_gust_kph":{"type":["number","null"]},"humidity_pct":{"type":["number","null"]},"snowfall_amount_mm":{"type":["number","null"]},"cloud_cover_pct":{"type":["number","null"]},"dewpoint_c":{"type":["number","null"]},"pressure_hpa":{"type":["number","null"]},"visibility_m":{"type":["number","null"]},"uv_index":{"type":["number","null"]}},"required":["precip_probability_pct","precip_amount_mm","temperature_c","wind_speed_kph","wind_gust_kph","humidity_pct","snowfall_amount_mm","cloud_cover_pct","dewpoint_c","pressure_hpa","visibility_m","uv_index"]}},"required":["id","runId","sourceId","validAt","capturedAt","issuedAt","conditionCode","conditionText","values"]}},"summary":{"type":"object","properties":{"hours":{"type":"number"},"missingHours":{"type":"number"},"missingMinutes":{"type":"number"},"precipMin":{"type":["number","null"]},"precipMax":{"type":["number","null"]},"thunderHours":{"type":"array","items":{"type":"string","format":"date-time"}},"unknownConditionHours":{"type":"number"}},"required":["hours","missingHours","missingMinutes","precipMin","precipMax","thunderHours","unknownConditionHours"]}},"required":["firstCapturedAt","lastCapturedAt","captures","run","points","summary"]}}},"required":["sourceId","name","truncated","revisions"]}}},"required":["from","to","runLimitPerProvider","pointsTruncated","providers"]},"archive":{"type":"object","properties":{"status":{"type":"string","enum":["checked","unavailable","not_applicable"]},"captureMonths":{"type":"array","items":{"type":"string"}}},"required":["status","captureMonths"]}},"required":["version","basis","generatedAt","request","location","context","hours","pointsTruncated","checkpoints"]}},"required":["ok","moment"]},"GoesAbiSamplesResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"example":{"type":"boolean","enum":[true],"description":"Present only on the signed-out example payload, which carries no locations."},"cached":{"type":"boolean","description":"True when an on-demand read was served from the in-process cache. False for a stored scan."},"ledgerStored":{"type":"boolean","description":"True when the payload is the newest scan already stored in the ledger; false when it came from the bounded on-demand read, which is never persisted."},"satellite":{"type":"string","example":"GOES-19 (GOES-East)"},"product":{"type":"string","example":"ABI-L2-CMIPC"},"bands":{"type":"array","items":{"type":"integer"},"example":[8,13,15]},"fetchedAt":{"type":"string"},"scanStartedAt":{"type":["string","null"]},"granuleKeys":{"type":"array","items":{"type":"string"}},"parallaxCorrectionApplied":{"type":"boolean","enum":[false]},"cloudFeatureTrackingApplied":{"type":"boolean","enum":[false]},"interpretationCaveats":{"type":"array","items":{"type":"string"},"description":"Limits that must accompany any interpretation of these samples."},"availability":{"type":"string","enum":["ok","partial"]},"missingBands":{"type":"array","items":{"type":"integer"}},"locations":{"type":"array","items":{"type":"object","properties":{"locationId":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"samples":{"type":["array","null"],"items":{"type":"object","properties":{"channel":{"type":"integer","example":13},"observedAt":{"type":"string","example":"2026-09-23T18:31:17.000Z"},"value":{"type":"number","description":"Brightness temperature.","example":231.4},"units":{"type":"string","example":"K"}},"required":["channel","observedAt","value","units"],"description":"One ABI band sample at a saved coordinate."},"description":"Null when the coordinate is off the CONUS sector or lands on fill pixels."},"previousCleanIr":{"type":["object","null"],"properties":{"channel":{"type":"integer","example":13},"observedAt":{"type":"string","example":"2026-09-23T18:31:17.000Z"},"value":{"type":"number","description":"Brightness temperature.","example":231.4},"units":{"type":"string","example":"K"}},"required":["channel","observedAt","value","units"],"description":"One ABI band sample at a saved coordinate."},"derived":{"type":["object","null"],"properties":{"cleanIrTemperatureK":{"type":["number","null"]},"splitWindowDifferenceK":{"type":["number","null"]},"upperWaterVaporMinusCleanIrK":{"type":["number","null"]},"fixedLocationCleanIrBrightnessTemperatureDropKPer10Min":{"type":["number","null"]},"fixedLocationCleanIrElapsedMinutes":{"type":["number","null"]}},"required":["cleanIrTemperatureK","splitWindowDifferenceK","upperWaterVaporMinusCleanIrK","fixedLocationCleanIrBrightnessTemperatureDropKPer10Min","fixedLocationCleanIrElapsedMinutes"]},"unavailableReason":{"type":["string","null"]},"unavailableReasons":{"type":"array","items":{"type":"string"}}},"required":["locationId","name","latitude","longitude","samples","previousCleanIr","derived","unavailableReason"]}}},"required":["ok","locations"],"description":"GOES-19 ABI brightness-temperature samples at the account’s saved locations. Scan fields are absent when the account has no saved locations or the caller is signed out."},"RefsInventoryResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"inventory":{"type":"object","properties":{"sourceUrl":{"type":"string","example":"https://nomads.ncep.noaa.gov/pub/data/nccf/com/para/noaaport/refs/"},"retrievedAt":{"type":"string"},"entries":{"type":"array","items":{"type":"object","properties":{"filename":{"type":"string","example":"grib2.refs.t12z.mean.f006.conus"},"url":{"type":"string"},"cycle":{"type":"string","example":"12Z"},"product":{"type":"string","enum":["mean","sprd","pmmn","lpmm","avrg","prob","eas","ffri"]},"forecastHour":{"type":"integer","example":6},"domain":{"type":"string","enum":["conus","ak","hi","pr"]},"modifiedAt":{"type":"string"},"sizeBytes":{"type":"integer"},"sizeLabel":{"type":"string"}},"required":["filename","url","cycle","product","forecastHour","domain","modifiedAt","sizeBytes","sizeLabel"]}},"summary":{"type":"object","properties":{"entryCount":{"type":"integer"},"cycles":{"type":"array","items":{"type":"string"}},"products":{"type":"array","items":{"type":"string","enum":["mean","sprd","pmmn","lpmm","avrg","prob","eas","ffri"]}},"domains":{"type":"array","items":{"type":"string","enum":["conus","ak","hi","pr"]}},"maxForecastHour":{"type":["integer","null"]},"latestModifiedAt":{"type":["string","null"]}},"required":["entryCount","cycles","products","domains","maxForecastHour","latestModifiedAt"]}},"required":["sourceUrl","retrievedAt","entries","summary"]}},"required":["ok","inventory"],"description":"Inventory of NOAA’s fixed public REFS parallel-distribution directory."},"TropicsHistoryResponse":{"type":"object","properties":{"ok":{"type":"boolean"},"example":{"type":"boolean"},"history":{"type":"object","properties":{"kind":{"type":"string","enum":["forecasts","advisories","geometries","observations","activity"]},"table":{"type":"string"},"status":{"type":"string","enum":["available","no_rows_in_window","not_collected","example"]},"stormId":{"type":["string","null"]},"season":{"type":["integer","null"]},"rows":{"type":"array","items":{"type":"object","additionalProperties":{}}},"limit":{"type":"integer"},"offset":{"type":"integer"},"nextOffset":{"type":["integer","null"]},"truncated":{"type":"boolean"},"window":{"type":"object","properties":{"from":{"type":["string","null"]},"to":{"type":"string"},"clock":{"type":"string"}},"required":["from","to","clock"]},"evidenceLimits":{"type":"array","items":{"type":"string"}}},"required":["kind","table","status","stormId","season","rows","limit","offset","nextOffset","truncated","window","evidenceLimits"]}},"required":["ok","history"]}},"parameters":{}},"paths":{"/api/weather-ledger/surface/stations":{"get":{"summary":"Relevant canonical surface stations","description":"Canonical physical stations relevant to one account-owned location, with role, rank, distance, bearing, class, operator, and metadata clocks.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_surface_stations","parameters":[{"schema":{"type":"string","description":"Required account-owned saved location id."},"required":true,"name":"locationId","in":"query"}],"responses":{"200":{"description":"Relevant canonical stations.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SurfaceStationsResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/surface/reports":{"get":{"summary":"Immutable METAR and SPECI history","description":"Bounded snapshot/keyset page of official surface report families. Duplicate transports remain one physical report and coverage receipts expose gaps.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_surface_reports","parameters":[{"schema":{"type":"string","description":"Required account-owned saved location id."},"required":true,"name":"locationId","in":"query"},{"schema":{"type":"string","format":"date-time","description":"Inclusive UTC lower bound."},"required":true,"name":"from","in":"query"},{"schema":{"type":"string","format":"date-time","description":"Exclusive UTC upper bound; range is limited to 366 days."},"required":true,"name":"to","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":200,"description":"Page size, default 50 and maximum 200."},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","description":"Opaque snapshot/keyset cursor returned by the preceding page."},"required":false,"name":"cursor","in":"query"}],"responses":{"200":{"description":"Surface report history.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SurfaceReportsResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/surface/reports/{id}":{"get":{"summary":"Surface report provenance detail","description":"One location-authorized report with all retained variants, exact transport receipts, parsed remark events, and clocks.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_surface_reports_id","parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","description":"Required account-owned saved location id."},"required":true,"name":"locationId","in":"query"}],"responses":{"200":{"description":"Surface report provenance.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SurfaceReportDetailResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Report absent from the caller location scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/surface/measurements":{"get":{"summary":"Normalized surface measurements","description":"Bounded snapshot/keyset page preserving each variable’s own observation time and trace/zero/missing state.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_surface_measurements","parameters":[{"schema":{"type":"string","description":"Required account-owned saved location id."},"required":true,"name":"locationId","in":"query"},{"schema":{"type":"string","format":"date-time","description":"Inclusive UTC lower bound."},"required":true,"name":"from","in":"query"},{"schema":{"type":"string","format":"date-time","description":"Exclusive UTC upper bound; range is limited to 366 days."},"required":true,"name":"to","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":200,"description":"Page size, default 50 and maximum 200."},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","description":"Opaque snapshot/keyset cursor returned by the preceding page."},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"string"},"required":false,"name":"variable","in":"query"}],"responses":{"200":{"description":"Surface measurements.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SurfaceMeasurementsResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/surface/episodes/{id}/evidence":{"get":{"summary":"Storm episode evidence","description":"Account/location-scoped evidence linked to a warning-controlled episode, preserving event, observation, report, retrieval, and link clocks and evidence roles.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_surface_episodes_id_evidence","parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","description":"Required account-owned saved location id."},"required":true,"name":"locationId","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":200,"description":"Maximum evidence items returned. Defaults to 200."},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Episode evidence.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SurfaceEpisodeEvidenceResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Episode absent from the caller location scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/status":{"get":{"summary":"Ledger status & health","description":"Health snapshot of the Weather Ledger: storage reachability, configured providers, row counts, WeatherKit quota, latest collection run, and coverage notes. Signed-out callers receive a synthetic example snapshot.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_status","parameters":[{"schema":{"type":"string","enum":["member"],"description":"Pass `member` to force the member-scoped status view an admin caller would otherwise bypass. Any other value is ignored."},"required":false,"name":"scope","in":"query"}],"responses":{"200":{"description":"Ledger status summary.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/locations":{"get":{"summary":"List locations","description":"Locations the caller is allowed to see. Signed-in callers get their account-scoped locations; signed-out callers get one synthetic example location.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_locations","responses":{"200":{"description":"Visible locations.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationsResponse"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/locations/resolve":{"get":{"summary":"Resolve a saved location by name","description":"Resolve a human-readable saved location label (for example \"Micah's Home\") to the opaque Weather Ledger location id required by keyed routes.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_locations_resolve","parameters":[{"schema":{"type":"string","description":"Saved-location name or tag fragment. Minimum 2 characters.","example":"Micah's Home"},"required":true,"name":"q","in":"query"}],"responses":{"200":{"description":"Matching saved locations.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationResolveResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/hydrology":{"get":{"summary":"River gauge history","description":"Authenticated saved-location gauge or public USGS site number; choose exactly one target. Optional asOf fixes the window end at a non-future timestamp; 1m is 30 days. Temporary USGS reads preserve retained fallback, source, provider clocks and provisional qualifiers. Missing values are not zero or complete coverage. Gauge height uses a local datum. No ledger writes.","tags":["Weather Ledger"],"security":[{"bearerAuth":[]}],"operationId":"get_api_weather_ledger_hydrology","parameters":[{"schema":{"type":"string"},"required":false,"name":"locationId","in":"query"},{"schema":{"type":"string","pattern":"^\\d{8,15}$"},"required":false,"name":"siteCode","in":"query"},{"schema":{"type":"string","enum":["24h","48h","72h","1w","2w","1m"]},"required":false,"name":"horizon","in":"query"},{"schema":{"type":"string"},"required":false,"name":"asOf","in":"query"}],"responses":{"200":{"description":"Gauge readings and provenance.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"site":{"type":["object","null"],"properties":{}},"from":{"type":"string"},"to":{"type":"string"},"readings":{"type":"array","items":{"type":"object","properties":{"observedAt":{"type":"string"},"parameter":{"type":"string","enum":["00060","00065"]},"unit":{"type":"string"},"value":{"type":["number","null"]},"qualifiers":{"type":"array","items":{"type":"string"}}},"required":["observedAt","parameter","unit","value","qualifiers"]}},"source":{"type":"string","enum":["ledger","usgs","ledger-fallback"]},"note":{"type":"string"},"distanceMiles":{"type":"number"}},"required":["ok","site","from","to","readings","source","note"]}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Saved location not found."},"503":{"description":"Hydrology temporarily unavailable."}}}},"/api/weather-ledger/hydrology/same-stream":{"get":{"summary":"Discover network-connected river gauges","description":"Account-authorized reference gauge discovery using USGS NLDI UT (upstream tributaries) and DD (downstream diversions). Default distanceKm 500 each direction. Network-index placement can be uncertain; never infer direction from proximity or names. Qualification requires active stream/height-or-discharge IV metadata. proximityKm ranks by straight-line distance, not river-network distance. Follow nextOffset; complete and issues describe partial discovery. Results may reuse the latest public topology snapshot for the existing 24-hour catalog refresh period; discoveredAt is its original read time. No ledger or location writes.","tags":["Weather Ledger"],"security":[{"bearerAuth":[]}],"operationId":"get_api_weather_ledger_hydrology_same_stream","parameters":[{"schema":{"type":"string"},"required":false,"name":"locationId","in":"query"},{"schema":{"type":"string","pattern":"^\\d{8,15}$"},"required":false,"name":"siteCode","in":"query"},{"schema":{"type":"integer","exclusiveMinimum":0},"required":false,"name":"distanceKm","in":"query"},{"schema":{"type":["integer","null"],"minimum":0},"required":false,"name":"offset","in":"query"}],"responses":{"200":{"description":"Network-index candidates and qualification evidence.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"reference":{"type":["object","null"],"properties":{"siteCode":{"type":"string"},"name":{"type":"string"},"lat":{"type":["number","null"]},"lon":{"type":["number","null"]},"placement":{"type":"string","enum":["reference","upstream","downstream","uncertain"]},"placementConfidence":{"type":"string","enum":["reference","network-index","uncertain"]},"branch":{"type":"string","enum":["reference-mainstem","connected-branch","unknown"]},"qualification":{"type":"string","enum":["eligible","ineligible","unknown"]},"metadataSource":{"type":"string","enum":["catalog","usgs","unavailable"]},"proximityKm":{"type":["number","null"]},"networkComid":{"type":["string","null"]},"mainstem":{"type":["string","null"]}},"required":["siteCode","name","lat","lon","placement","placementConfidence","branch","qualification","metadataSource","proximityKm","networkComid","mainstem"]},"gauges":{"type":"array","items":{"type":"object","properties":{"siteCode":{"type":"string"},"name":{"type":"string"},"lat":{"type":["number","null"]},"lon":{"type":["number","null"]},"placement":{"type":"string","enum":["reference","upstream","downstream","uncertain"]},"placementConfidence":{"type":"string","enum":["reference","network-index","uncertain"]},"branch":{"type":"string","enum":["reference-mainstem","connected-branch","unknown"]},"qualification":{"type":"string","enum":["eligible","ineligible","unknown"]},"metadataSource":{"type":"string","enum":["catalog","usgs","unavailable"]},"proximityKm":{"type":["number","null"]},"networkComid":{"type":["string","null"]},"mainstem":{"type":["string","null"]}},"required":["siteCode","name","lat","lon","placement","placementConfidence","branch","qualification","metadataSource","proximityKm","networkComid","mainstem"]}},"distanceKm":{"type":"number"},"nextOffset":{"type":["number","null"]},"pageSize":{"type":"number"},"returnedGaugeCount":{"type":"number"},"complete":{"type":"boolean"},"issues":{"type":"array","items":{"type":"string"}},"discoveredAt":{"type":"string"},"provenance":{"type":"string"}},"required":["ok","reference","gauges","distanceKm","nextOffset","pageSize","returnedGaugeCount","complete","issues","discoveredAt","provenance"]}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Saved location not found."},"503":{"description":"Network discovery unavailable."}}}},"/api/weather-ledger/hydrology/batch":{"get":{"summary":"Read aligned histories for public gauges","description":"Comma-separated siteCodes within the configured Hydrology page size. One upstream history request per batch, metered by actual HTTP requests. Supply the same asOf to align with the single-body window. Per-gauge errors and retained fallback preserve partial success; a successful envelope does not certify continuous coverage. Provisional values may change. No account-location or ledger writes.","tags":["Weather Ledger"],"security":[{"bearerAuth":[]}],"operationId":"get_api_weather_ledger_hydrology_batch","parameters":[{"schema":{"type":"string"},"required":true,"name":"siteCodes","in":"query"},{"schema":{"type":"string","enum":["24h","48h","72h","1w","2w","1m"]},"required":false,"name":"horizon","in":"query"},{"schema":{"type":"string"},"required":false,"name":"asOf","in":"query"}],"responses":{"200":{"description":"Individual gauge histories and outcomes.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"gauges":{"type":"array","items":{"type":"object","properties":{"siteCode":{"type":"string"},"history":{"type":["object","null"],"properties":{"site":{"type":["object","null"],"properties":{}},"from":{"type":"string"},"to":{"type":"string"},"readings":{"type":"array","items":{"type":"object","properties":{"observedAt":{"type":"string"},"parameter":{"type":"string","enum":["00060","00065"]},"unit":{"type":"string"},"value":{"type":["number","null"]},"qualifiers":{"type":"array","items":{"type":"string"}}},"required":["observedAt","parameter","unit","value","qualifiers"]}},"source":{"type":"string","enum":["ledger","usgs","ledger-fallback"]},"note":{"type":"string"},"distanceMiles":{"type":"number"}},"required":["site","from","to","readings","source","note"]},"error":{"type":["string","null"]}},"required":["siteCode","history","error"]}}},"required":["ok","gauges"]}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Gauge histories unavailable."}}}},"/api/weather-ledger/hydrology/sites":{"get":{"summary":"Search river and stream gauges","description":"Authenticated literal substring search of FernWX’s retained public USGS stream-site catalog. No upstream call. q is a river name or site number; use nextOffset for the next page. An empty catalog is not proof that a river has no gauges; exact site numbers can be read through the hydrology route.","tags":["Weather Ledger"],"security":[{"bearerAuth":[]}],"operationId":"get_api_weather_ledger_hydrology_sites","parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"q","in":"query"},{"schema":{"type":["integer","null"],"minimum":0},"required":false,"name":"offset","in":"query"}],"responses":{"200":{"description":"Public gauge matches.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"sites":{"type":"array","items":{"type":"object","properties":{"siteCode":{"type":"string"},"name":{"type":"string"},"lat":{"type":"number"},"lon":{"type":"number"}},"required":["siteCode","name","lat","lon"]}},"nextOffset":{"type":["number","null"]}},"required":["ok","sites","nextOffset"]}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/lightning/activity":{"get":{"summary":"Monthly lightning activity","description":"Account-wide local-day activity calendar for collected GOES flash centroids and Xweather/NLDN pulses. Location scope is derived from the authenticated account; callers cannot widen it.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_lightning_activity","parameters":[{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}$","example":"2026-08"},"required":true,"name":"month","in":"query"},{"schema":{"type":"string","description":"Validated IANA timezone used for calendar-day bucketing.","example":"America/New_York"},"required":true,"name":"timeZone","in":"query"}],"responses":{"200":{"description":"Monthly lightning activity.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LightningActivityResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/lightning/timeline":{"get":{"summary":"Daily lightning timeline","description":"DST-aware five-minute episode trace for every saved location, including collection coverage and honest error/limit states.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_lightning_timeline","parameters":[{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","example":"2026-08-09"},"required":true,"name":"date","in":"query"},{"schema":{"type":"string","example":"America/New_York"},"required":true,"name":"timeZone","in":"query"}],"responses":{"200":{"description":"Daily lightning timeline.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LightningTimelineResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/lightning/events":{"get":{"summary":"Lightning events in a bounded window","description":"Deduplicated GOES flash centroids, NLDN pulses, and collection receipts for a maximum 60-minute window across the authenticated account’s saved locations.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_lightning_events","parameters":[{"schema":{"type":"string","format":"date-time","example":"2026-08-09T01:00:00Z"},"required":true,"name":"from","in":"query"},{"schema":{"type":"string","format":"date-time","example":"2026-08-09T01:30:00Z"},"required":true,"name":"to","in":"query"}],"responses":{"200":{"description":"Lightning events and receipts.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LightningEventsResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/solar/irradiance":{"get":{"summary":"Solar irradiance history for a location","description":"Find bounded source-reported solar radiation history for a saved location. This discoverability route names the common GHI/shortwave, DNI, and DHI aliases and preserves observed/retrieved timestamps for same-time day-over-day comparisons. Rows are provider current-condition products and are not implicitly calibrated SURFRAD measurements.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_solar_irradiance","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"},{"schema":{"type":"string","format":"date-time","description":"Inclusive UTC start. Required; the total range may not exceed 7 days.","example":"2026-08-11T16:00:00Z"},"required":true,"name":"from","in":"query"},{"schema":{"type":"string","format":"date-time","description":"Inclusive UTC end. Required; the total range may not exceed 7 days.","example":"2026-08-14T16:00:00Z"},"required":true,"name":"to","in":"query"},{"schema":{"type":"string","description":"Optional ledger source id. Omit to return every source that reported irradiance."},"required":false,"name":"sourceId","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":2000,"description":"Total point cap across all returned source series. Default 1,000; hard maximum 2,000."},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Solar irradiance series and field aliases.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SolarIrradianceResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/coverage-calendar":{"get":{"summary":"Monthly coverage for a saved location","description":"One requested calendar month of retained observation, forecast and alert coverage, with independent per-day layers and source attribution. Day keys use the returned location timeZone; timeZoneFallback explicitly identifies UTC fallback. Empty days do not establish absence outside the retained data. Uses the same account/location authorization as the Coverage Calendar UI.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_coverage_calendar","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"},{"schema":{"type":"integer","minimum":1900,"maximum":2400,"example":2026},"required":true,"name":"year","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":12,"description":"Calendar month, 1–12.","example":10},"required":true,"name":"month","in":"query"}],"responses":{"200":{"description":"Monthly coverage and location timezone.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CoverageCalendarEnvelope"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/forecast/latest":{"get":{"summary":"Bounded Now & Next forecast","description":"Latest 1–48 hour forecast for one location across the Forecast providers, ranked from the newest published accuracy snapshot and accompanied by current observations. Includes bounded three-hour provider temperatureHistory with observation/capture clocks, station identity and truncation/read-failure status. The multiday outlook is intentionally loaded separately.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_forecast_latest","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"},{"schema":{"type":"string","enum":["temperature_c","precip_amount_mm","wind_speed_kph","wind_gust_kph","humidity_pct"],"description":"Variable used to rank source accuracy. Defaults to temperature_c."},"required":false,"name":"accuracyVariable","in":"query"},{"schema":{"type":["number","null"],"description":"1–48; default 24."},"required":false,"name":"hoursAhead","in":"query"},{"schema":{"type":"string","enum":["nws_station","self","combined"],"description":"Truth source for the accuracy ranking. Defaults to `nws_station`."},"required":false,"name":"referenceMode","in":"query"},{"schema":{"type":"string","enum":["weatherkit","open_meteo","tomorrow_io","visual_crossing","nws_api"],"description":"Provider used when `referenceMode` is `self` or `combined`. Defaults to `nws_api`; unrecognized values fall back to the default rather than erroring."},"required":false,"name":"referenceSourceId","in":"query"},{"schema":{"type":"string","enum":["false"],"description":"Pass `false` to allow accuracy ranking without a station match. Any other value — including `true` — leaves the server default in place."},"required":false,"name":"stationRequired","in":"query"}],"responses":{"200":{"description":"Latest forecast bundle.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForecastLatestResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/forecast/outlook":{"get":{"summary":"Multiday daily forecast outlook","description":"Latest multiday (up to ten days) daily forecast for one location, one series per source. Native provider daily runs are used where published; otherwise the series is derived from the provider’s own hourly forecast and marked `derived: true`. This is the `daily` data that `forecast/latest` omits. `locationId` is required for signed-in callers.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_forecast_outlook","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"}],"responses":{"200":{"description":"Per-source daily forecast series (`daily`) with `generatedAt`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountDataEnvelope"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/synoptic/selections":{"get":{"summary":"Saved CWOP stations for a location","description":"List the account-owned CWOP / Integrated Mesonet station selections for one saved location.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_synoptic_selections","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"}],"responses":{"200":{"description":"Saved CWOP station selections.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SynopticSelectionsResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/synoptic/stations":{"get":{"summary":"Nearby CWOP station discovery","description":"Discover reporting CWOP / Integrated Mesonet stations within 30 miles of a saved location, including whether each one is already selected.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_synoptic_stations","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"}],"responses":{"200":{"description":"Nearby discoverable CWOP stations.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SynopticStationsResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/synoptic/observations":{"get":{"summary":"Recent CWOP observations","description":"Read recent CWOP / Integrated Mesonet observations for the account-owned stations saved to one location.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_synoptic_observations","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"},{"schema":{"type":["number","null"],"description":"Lookback window in hours. Clamped to 1–168; default 24.","example":6},"required":false,"name":"hours","in":"query"},{"schema":{"type":"string","description":"Optional single-station filter.","example":"G6141"},"required":false,"name":"stid","in":"query"},{"schema":{"type":"string","description":"Optional network filter. A Synoptic station id is only unique within its network, so pair it with `stid` to keep two same-id stations from different networks apart.","example":"APRSWXNET"},"required":false,"name":"network","in":"query"}],"responses":{"200":{"description":"Recent CWOP observations.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SynopticObservationsResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/madis/selections":{"get":{"summary":"Saved MADIS sensors for a location","description":"List the account-owned NOAA MADIS public Integrated Mesonet sensor selections for one saved location.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_madis_selections","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"}],"responses":{"200":{"description":"Saved MADIS sensor selections.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MadisSelectionsResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/madis/stations":{"get":{"summary":"Nearby MADIS sensor discovery","description":"Discover reporting NOAA MADIS public Integrated Mesonet sensors within 30 miles of a saved location, including whether each one is already selected.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_madis_stations","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"}],"responses":{"200":{"description":"Nearby discoverable MADIS sensors.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MadisStationsResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/madis/observations":{"get":{"summary":"Recent MADIS observations","description":"Read recent NOAA MADIS public Integrated Mesonet observations for the account-owned sensors saved to one location.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_madis_observations","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"},{"schema":{"type":["number","null"],"description":"Lookback window in hours. Clamped to 1–168; default 24.","example":6},"required":false,"name":"hours","in":"query"},{"schema":{"type":"string","description":"Optional single-station filter.","example":"G6141"},"required":false,"name":"stid","in":"query"},{"schema":{"type":"string","description":"Compatibility alias for stid.","example":"G6141"},"required":false,"name":"stationId","in":"query"},{"schema":{"type":"string","description":"Optional MADIS provider-code filter.","example":"APRSWXNET"},"required":false,"name":"providerCode","in":"query"},{"schema":{"type":"string","description":"Optional provider-code alias kept for Synoptic/Around Me UI compatibility.","example":"APRSWXNET"},"required":false,"name":"network","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":500,"description":"Maximum observations per page. Defaults to 500.","example":500},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","description":"Opaque next-page cursor. Pass back unchanged with identical filters."},"required":false,"name":"cursor","in":"query"}],"responses":{"200":{"description":"Recent MADIS observations.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MadisObservationsResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/madis/live":{"get":{"summary":"Account-wide live MADIS station conditions","description":"Return one latest-condition row per physical MADIS station selected anywhere in the authenticated account. Stations are de-duplicated by (provider_code, station_id); every active saved-location binding is retained, and nearest_tracked_location applies the explicit nearest-active-account-location attribution policy. Use format=csv for a spreadsheet-safe export equivalent to the JSON station rows.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_madis_live","parameters":[{"schema":{"type":["number","null"],"description":"Observation lookback window, clamped to 1–168 hours. Defaults to 6.","example":6},"required":false,"name":"hours","in":"query"},{"schema":{"type":["number","null"],"description":"Physical stations returned, clamped to 1–2,000. Defaults to 1,000.","example":1000},"required":false,"name":"limit","in":"query"},{"schema":{"type":["number","null"],"description":"Physical stations skipped after deterministic provider/station sorting. Defaults to 0.","example":0},"required":false,"name":"offset","in":"query"},{"schema":{"type":"string","enum":["json","csv"],"description":"Response representation. Defaults to json."},"required":false,"name":"format","in":"query"}],"responses":{"200":{"description":"Account-wide de-duplicated MADIS station conditions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MadisLiveResponse"}},"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/forecast/history":{"get":{"deprecated":true,"summary":"Forecast-memory history","description":"Every retained forecast for one valid time — the immutable forecast-memory audit trail that lets you see how the forecast for a moment evolved across sources and issuance times. Responses are hard-capped at 2,000 rows and report `limit` plus `truncated`, mirroring the legacy Time Machine bound (same underlying read).","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_forecast_history","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"},{"schema":{"type":"string","description":"Target valid time (ISO 8601). Supply this or the legacy `validTime` alias.","example":"2026-05-29T14:00:00Z"},"required":false,"name":"validAt","in":"query"},{"schema":{"type":"string","description":"Legacy alias for `validAt`, read only when `validAt` is absent. Prefer `validAt`."},"required":false,"name":"validTime","in":"query"},{"schema":{"type":"string","enum":["temperature_c","precip_amount_mm","wind_speed_kph","wind_gust_kph","humidity_pct"]},"required":true,"name":"variable","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":2000,"description":"Maximum history rows to return. Default 1,000; hard maximum 2,000.","example":1000},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Forecast history for the point.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForecastHistoryResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/nowcast/latest":{"get":{"summary":"Latest nowcast","description":"Latest minute-resolution next-hour precipitation nowcast for one location.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_nowcast_latest","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"}],"responses":{"200":{"description":"Latest nowcast run.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NowcastResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/forecast/observed-times":{"get":{"deprecated":true,"summary":"Observed valid times","description":"Past valid times that already have a settled observed actual for a variable — useful as Time Machine vantage points or for verification queries.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_forecast_observed_times","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"},{"schema":{"type":"string","enum":["temperature_c","precip_amount_mm","wind_speed_kph","wind_gust_kph","humidity_pct"]},"required":false,"name":"variable","in":"query"},{"schema":{"type":["number","null"],"description":"Trailing window in hours searched for settled observations, clamped to 6–168. Defaults to 48."},"required":false,"name":"lookbackHours","in":"query"},{"schema":{"type":"string","enum":["nws_station","self","combined"],"description":"Truth source used to settle observed actuals. Defaults to `nws_station`."},"required":false,"name":"referenceMode","in":"query"},{"schema":{"type":"string","enum":["weatherkit","open_meteo","tomorrow_io","visual_crossing","nws_api"],"description":"Provider used when `referenceMode` is `self` or `combined`. Defaults to `nws_api`."},"required":false,"name":"referenceSourceId","in":"query"},{"schema":{"type":"string","enum":["false"],"description":"Pass `false` to allow settling without a station match. Any other value — including `true` — leaves the server default in place."},"required":false,"name":"stationRequired","in":"query"}],"responses":{"200":{"description":"Observed valid times.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObservedTimesResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/time-machine/snapshot":{"get":{"deprecated":true,"summary":"Time Machine snapshot","description":"The forecast as it stood at a past vantage time alongside what actually happened, for hindcast comparison.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_time_machine_snapshot","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"},{"schema":{"type":"string","description":"Vantage time (ISO). Defaults to ~12h ago in example mode."},"required":false,"name":"asOf","in":"query"},{"schema":{"type":["number","null"],"description":"1–72; default 48."},"required":false,"name":"horizonHours","in":"query"}],"responses":{"200":{"description":"Vantage snapshot + observed actuals.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeMachineSnapshotResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/time-machine/vantage-times":{"get":{"deprecated":true,"summary":"Time Machine vantage times","description":"Available vantage times that can be replayed via the snapshot endpoint.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_time_machine_vantage_times","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"},{"schema":{"type":"string","description":"Date (YYYY-MM-DD) whose 15-minute-bucketed vantage times to return. Omit for the unscoped listing: `vantageDates` plus a recent flat `vantageTimes` list.","example":"2026-05-29"},"required":false,"name":"date","in":"query"},{"schema":{"type":"string","enum":["location","utc"],"description":"Clock used to bucket dates and times. Anything other than `location` falls back to the default `utc`."},"required":false,"name":"timeBasis","in":"query"}],"responses":{"200":{"description":"Replayable vantage times.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VantageTimesResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/memory/overview":{"get":{"summary":"Forecast Memory overview","description":"Memory depth, latest retrieval, provider coverage, and canonical row counts for one account-scoped location.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_memory_overview","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"}],"responses":{"200":{"description":"Forecast Memory read-model response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForecastMemoryResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/memory/providers":{"get":{"summary":"Forecast Memory providers","description":"Persisted provider capabilities, availability/freshness, rankings, attribution, and caveats.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_memory_providers","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"}],"responses":{"200":{"description":"Forecast Memory read-model response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForecastMemoryResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/memory/moment":{"get":{"summary":"Reconstruct retained forecasts for a past, current, or upcoming weather moment","description":"Fixed event interval with one to four independent earlier capture cutoffs. Returns coherent retained provider runs, original hourly measurements and clocks, coverage gaps, outside-window thunder wording and location-relevant NWS discussions. Optional bounded revision history collapses unchanged states. Later captures never become earlier knowledge; missing values are not zero and precipitation chance is not lightning probability. Requires an account session or API key; signed-out callers receive 401, never example weather. Read-only: does not restore cold archives or call providers.","tags":["Weather Ledger"],"security":[{"bearerAuth":[]}],"operationId":"get_api_weather_ledger_memory_moment","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":256,"description":"Exact saved location accessible to the authenticated account."},"required":true,"name":"locationId","in":"query"},{"schema":{"type":"string","format":"date-time","description":"Inclusive event start, ISO 8601 with explicit offset; past, current or future."},"required":true,"name":"start","in":"query"},{"schema":{"type":"string","format":"date-time","description":"Exclusive event end; interval is a whole number of hours from 1 to 24."},"required":true,"name":"end","in":"query"},{"schema":{"type":"array","items":{"anyOf":[{"type":"string","format":"date-time"},{"type":"string","enum":["latest"]}]},"minItems":1,"maxItems":4,"description":"Repeat asOf for each capture cutoff, at or before min(start, request time). Optional; defaults to latest, resolved on the server. Deduplicated in request order."},"required":false,"name":"asOf","in":"query","style":"form","explode":true},{"schema":{"type":"string","enum":["0","1"],"description":"Set 1 to include earlier revision history. Default 0."},"required":false,"name":"history","in":"query"},{"schema":{"type":"string","enum":["24","72","168","336"],"description":"History lookback before min(event start, request time), in hours. Default 72."},"required":false,"name":"historyHours","in":"query"},{"schema":{"type":"string","format":"date-time","description":"An exact weather hour from the event; narrows history and Record to that hour."},"required":false,"name":"focusHour","in":"query"},{"schema":{"type":"string","format":"date-time","description":"Freeze history at this earlier cutoff for reproducible reads."},"required":false,"name":"historyCutoff","in":"query"},{"schema":{"type":"string","maxLength":32000,"description":"Opaque nextCursor from history. Bound to account, event, hour and lookback. Merge captures before collapsing revisions."},"required":false,"name":"historyCursor","in":"query"}],"responses":{"200":{"description":"Versioned evidence shared by consumer Memory and Forecast Moment Lab. All clocks canonical UTC, values in the units named by their keys.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"moment":{"type":"object","properties":{"phase":{"type":"string","enum":["upcoming","in_progress","past"]},"latestCheckpoint":{"type":["string","null"],"format":"date-time"},"version":{"type":"number","enum":[1]},"basis":{"type":"string","enum":["retained_hourly_forecasts"]},"generatedAt":{"type":"string","format":"date-time"},"request":{"type":"object","properties":{"locationId":{"type":"string"},"start":{"type":"string","format":"date-time"},"end":{"type":"string","format":"date-time"},"checkpoints":{"type":"array","items":{"type":"string","format":"date-time"}},"historyHours":{"type":"number"},"history":{"type":"boolean"},"focusHour":{"type":"string","format":"date-time"},"historyCutoff":{"type":"string","format":"date-time"},"historyCursor":{"type":"string"},"latestCheckpoint":{"type":["string","null"],"format":"date-time"}},"required":["locationId","start","end","checkpoints","historyHours","history"]},"location":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"lat":{"type":"number"},"lon":{"type":"number"},"timezone":{"type":"string"},"timezoneAssumed":{"type":"boolean"}},"required":["id","name","lat","lon","timezone","timezoneAssumed"]},"context":{"type":"object","properties":{"from":{"type":"string","format":"date-time"},"to":{"type":"string","format":"date-time"}},"required":["from","to"]},"hours":{"type":"array","items":{"type":"string","format":"date-time"}},"pointsTruncated":{"type":"boolean"},"checkpoints":{"type":"array","items":{"type":"object","properties":{"at":{"type":"string","format":"date-time"},"sources":{"type":"array","items":{"type":"object","properties":{"sourceId":{"type":"string"},"name":{"type":"string"},"run":{"type":["object","null"],"properties":{"id":{"type":"string"},"sourceId":{"type":"string"},"issuedAt":{"type":["string","null"],"format":"date-time"},"capturedAt":{"type":"string","format":"date-time"},"rawPayloadId":{"type":["string","null"]},"sampleId":{"type":["string","null"]},"providerModel":{"type":["string","null"]}},"required":["id","sourceId","issuedAt","capturedAt","rawPayloadId","sampleId","providerModel"]},"points":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"runId":{"type":"string"},"sourceId":{"type":"string"},"validAt":{"type":"string","format":"date-time"},"capturedAt":{"type":["string","null"],"format":"date-time"},"issuedAt":{"type":["string","null"],"format":"date-time"},"conditionCode":{"type":["string","null"]},"conditionText":{"type":["string","null"]},"values":{"type":"object","properties":{"precip_probability_pct":{"type":["number","null"]},"precip_amount_mm":{"type":["number","null"]},"temperature_c":{"type":["number","null"]},"wind_speed_kph":{"type":["number","null"]},"wind_gust_kph":{"type":["number","null"]},"humidity_pct":{"type":["number","null"]},"snowfall_amount_mm":{"type":["number","null"]},"cloud_cover_pct":{"type":["number","null"]},"dewpoint_c":{"type":["number","null"]},"pressure_hpa":{"type":["number","null"]},"visibility_m":{"type":["number","null"]},"uv_index":{"type":["number","null"]}},"required":["precip_probability_pct","precip_amount_mm","temperature_c","wind_speed_kph","wind_gust_kph","humidity_pct","snowfall_amount_mm","cloud_cover_pct","dewpoint_c","pressure_hpa","visibility_m","uv_index"]}},"required":["id","runId","sourceId","validAt","capturedAt","issuedAt","conditionCode","conditionText","values"]}},"summary":{"type":"object","properties":{"hours":{"type":"number"},"missingHours":{"type":"number"},"missingMinutes":{"type":"number"},"precipMin":{"type":["number","null"]},"precipMax":{"type":["number","null"]},"thunderHours":{"type":"array","items":{"type":"string","format":"date-time"}},"unknownConditionHours":{"type":"number"}},"required":["hours","missingHours","missingMinutes","precipMin","precipMax","thunderHours","unknownConditionHours"]},"status":{"type":"string","enum":["no_run","no_hours","partial","available"]},"runHorizonEnd":{"type":["string","null"],"format":"date-time"},"captureAgeMinutes":{"type":["number","null"]},"issueAgeMinutes":{"type":["number","null"]},"otherThunderHours":{"type":"array","items":{"type":"string","format":"date-time"}}},"required":["sourceId","name","run","points","summary","status","captureAgeMinutes","issueAgeMinutes","otherThunderHours"]}},"discussion":{"type":["object","null"],"properties":{"id":{"type":"string"},"office":{"type":"string"},"issuedAt":{"type":"string","format":"date-time"},"capturedAt":{"type":"string","format":"date-time"},"sections":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"text":{"type":"string"}},"required":["title","text"]}}},"required":["id","office","issuedAt","capturedAt","sections"]},"discussionStatus":{"type":"string","enum":["available","none","unavailable"]}},"required":["at","sources","discussion","discussionStatus"]}},"history":{"type":"object","properties":{"receipts":{"type":"array","items":{"type":"object","properties":{"sql":{"type":"string"},"parameters":{"type":"array","items":{}},"rowCount":{"type":"number"},"rowsSha256":{"type":"string"},"purpose":{"type":"string"}},"required":["sql","parameters","rowCount","rowsSha256","purpose"]}},"readAt":{"type":"string","format":"date-time"},"pages":{"type":"number"},"nextCursor":{"type":["string","null"]},"anchor":{"type":"string","enum":["event_start","request_time"]},"scope":{"anyOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["window"]}},"required":["kind"]},{"type":"object","properties":{"kind":{"type":"string","enum":["focus_hour"]},"hour":{"type":"string","format":"date-time"}},"required":["kind","hour"]}]},"record":{"type":"object","properties":{"hour":{"type":"string","format":"date-time"},"paths":{"type":"array","items":{"type":"object","properties":{"sourceId":{"type":"string"},"lens":{"type":"string","enum":["precip_probability_pct","precip_amount_mm","temperature_c","wind_speed_kph","wind_gust_kph","humidity_pct","snowfall_amount_mm","cloud_cover_pct","dewpoint_c","pressure_hpa","visibility_m","uv_index","condition","thunder"]},"first":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"null"}]},"latest":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"null"}]},"changes":{"type":"number"},"missing":{"type":"number"},"captures":{"type":"number"},"low":{"type":["object","null"],"properties":{"value":{"type":"number"},"ref":{"type":"object","properties":{"sourceId":{"type":"string"},"runId":{"type":"string"},"pointId":{"type":["string","null"]},"capturedAt":{"type":"string","format":"date-time"}},"required":["sourceId","runId","pointId","capturedAt"]}},"required":["value","ref"]},"high":{"type":["object","null"],"properties":{"value":{"type":"number"},"ref":{"type":"object","properties":{"sourceId":{"type":"string"},"runId":{"type":"string"},"pointId":{"type":["string","null"]},"capturedAt":{"type":"string","format":"date-time"}},"required":["sourceId","runId","pointId","capturedAt"]}},"required":["value","ref"]},"netChange":{"type":["number","null"]},"firstCapturedAt":{"type":["string","null"],"format":"date-time"},"lastCapturedAt":{"type":["string","null"],"format":"date-time"}},"required":["sourceId","lens","first","latest","changes","missing","captures","firstCapturedAt","lastCapturedAt"]}},"findings":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["first_retained","change","reversal","largest_jump","unchanged"]},"sourceId":{"type":"string"},"lens":{"type":"string","enum":["precip_probability_pct","precip_amount_mm","temperature_c","wind_speed_kph","wind_gust_kph","humidity_pct","snowfall_amount_mm","cloud_cover_pct","dewpoint_c","pressure_hpa","visibility_m","uv_index","condition","thunder"]},"from":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"null"}]},"to":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"null"}]},"refs":{"type":"array","items":{"type":"object","properties":{"sourceId":{"type":"string"},"runId":{"type":"string"},"pointId":{"type":["string","null"]},"capturedAt":{"type":"string","format":"date-time"}},"required":["sourceId","runId","pointId","capturedAt"]}}},"required":["id","kind","sourceId","lens","from","to","refs"]}},"findingsTruncated":{"type":"boolean"}},"required":["hour","paths","findings","findingsTruncated"]},"from":{"type":"string","format":"date-time"},"to":{"type":"string","format":"date-time"},"runLimitPerProvider":{"type":"number"},"pointsTruncated":{"type":"boolean"},"providers":{"type":"array","items":{"type":"object","properties":{"sourceId":{"type":"string"},"name":{"type":"string"},"truncated":{"type":"boolean"},"loadedFrom":{"type":["string","null"],"format":"date-time"},"captures":{"type":"array","items":{"type":"object","properties":{"run":{"type":"object","properties":{"id":{"type":"string"},"sourceId":{"type":"string"},"issuedAt":{"type":["string","null"],"format":"date-time"},"capturedAt":{"type":"string","format":"date-time"},"rawPayloadId":{"type":["string","null"]},"sampleId":{"type":["string","null"]},"providerModel":{"type":["string","null"]}},"required":["id","sourceId","issuedAt","capturedAt","rawPayloadId","sampleId","providerModel"]},"points":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"runId":{"type":"string"},"sourceId":{"type":"string"},"validAt":{"type":"string","format":"date-time"},"capturedAt":{"type":["string","null"],"format":"date-time"},"issuedAt":{"type":["string","null"],"format":"date-time"},"conditionCode":{"type":["string","null"]},"conditionText":{"type":["string","null"]},"values":{"type":"object","properties":{"precip_probability_pct":{"type":["number","null"]},"precip_amount_mm":{"type":["number","null"]},"temperature_c":{"type":["number","null"]},"wind_speed_kph":{"type":["number","null"]},"wind_gust_kph":{"type":["number","null"]},"humidity_pct":{"type":["number","null"]},"snowfall_amount_mm":{"type":["number","null"]},"cloud_cover_pct":{"type":["number","null"]},"dewpoint_c":{"type":["number","null"]},"pressure_hpa":{"type":["number","null"]},"visibility_m":{"type":["number","null"]},"uv_index":{"type":["number","null"]}},"required":["precip_probability_pct","precip_amount_mm","temperature_c","wind_speed_kph","wind_gust_kph","humidity_pct","snowfall_amount_mm","cloud_cover_pct","dewpoint_c","pressure_hpa","visibility_m","uv_index"]}},"required":["id","runId","sourceId","validAt","capturedAt","issuedAt","conditionCode","conditionText","values"]}}},"required":["run","points"]}},"revisions":{"type":"array","items":{"type":"object","properties":{"firstCapturedAt":{"type":"string","format":"date-time"},"lastCapturedAt":{"type":"string","format":"date-time"},"captures":{"type":"number"},"run":{"type":"object","properties":{"id":{"type":"string"},"sourceId":{"type":"string"},"issuedAt":{"type":["string","null"],"format":"date-time"},"capturedAt":{"type":"string","format":"date-time"},"rawPayloadId":{"type":["string","null"]},"sampleId":{"type":["string","null"]},"providerModel":{"type":["string","null"]}},"required":["id","sourceId","issuedAt","capturedAt","rawPayloadId","sampleId","providerModel"]},"points":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"runId":{"type":"string"},"sourceId":{"type":"string"},"validAt":{"type":"string","format":"date-time"},"capturedAt":{"type":["string","null"],"format":"date-time"},"issuedAt":{"type":["string","null"],"format":"date-time"},"conditionCode":{"type":["string","null"]},"conditionText":{"type":["string","null"]},"values":{"type":"object","properties":{"precip_probability_pct":{"type":["number","null"]},"precip_amount_mm":{"type":["number","null"]},"temperature_c":{"type":["number","null"]},"wind_speed_kph":{"type":["number","null"]},"wind_gust_kph":{"type":["number","null"]},"humidity_pct":{"type":["number","null"]},"snowfall_amount_mm":{"type":["number","null"]},"cloud_cover_pct":{"type":["number","null"]},"dewpoint_c":{"type":["number","null"]},"pressure_hpa":{"type":["number","null"]},"visibility_m":{"type":["number","null"]},"uv_index":{"type":["number","null"]}},"required":["precip_probability_pct","precip_amount_mm","temperature_c","wind_speed_kph","wind_gust_kph","humidity_pct","snowfall_amount_mm","cloud_cover_pct","dewpoint_c","pressure_hpa","visibility_m","uv_index"]}},"required":["id","runId","sourceId","validAt","capturedAt","issuedAt","conditionCode","conditionText","values"]}},"summary":{"type":"object","properties":{"hours":{"type":"number"},"missingHours":{"type":"number"},"missingMinutes":{"type":"number"},"precipMin":{"type":["number","null"]},"precipMax":{"type":["number","null"]},"thunderHours":{"type":"array","items":{"type":"string","format":"date-time"}},"unknownConditionHours":{"type":"number"}},"required":["hours","missingHours","missingMinutes","precipMin","precipMax","thunderHours","unknownConditionHours"]}},"required":["firstCapturedAt","lastCapturedAt","captures","run","points","summary"]}}},"required":["sourceId","name","truncated","revisions"]}}},"required":["from","to","runLimitPerProvider","pointsTruncated","providers"]},"archive":{"type":"object","properties":{"status":{"type":"string","enum":["checked","unavailable","not_applicable"]},"captureMonths":{"type":"array","items":{"type":"string"}}},"required":["status","captureMonths"]}},"required":["version","basis","generatedAt","request","location","context","hours","pointsTruncated","checkpoints"]}},"required":["ok","moment"]}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Saved location not available to this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Saved location no longer available.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Archive read failed; no provider fallback.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/memory/moment/takes":{"get":{"summary":"Read saved Moment takes and frozen evidence","description":"Account-owned saved AI interpretations, never ledger truth. Requires a session or API key. With id, returns the saved opening, original packet, fingerprint, citations and provenance; conversation detail also returns saved messages. Takes accepts event parameters to return a current packet before any model generation. GET never calls a model. Generation and deletion currently require the signed-in app under the owner-approved temporary write-parity exception. Lists are paginated in twenty-entry pages; use nextCursor as before. Conversation messages are paginated in fifty-message pages using conversation.nextCursor.","tags":["Weather Ledger"],"security":[{"bearerAuth":[]}],"operationId":"get_api_weather_ledger_memory_moment_takes","parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"locationId","in":"query"},{"schema":{"type":"string"},"required":false,"name":"id","in":"query"},{"schema":{"type":"string"},"required":false,"name":"before","in":"query"},{"schema":{"type":"string","format":"date-time"},"required":false,"name":"start","in":"query"},{"schema":{"type":"string","format":"date-time"},"required":false,"name":"end","in":"query"},{"schema":{"type":"string","format":"date-time"},"required":false,"name":"focusHour","in":"query"},{"schema":{"type":"string","format":"date-time"},"required":false,"name":"historyCutoff","in":"query"},{"schema":{"type":"string","enum":["24","72","168","336"]},"required":false,"name":"historyHours","in":"query"},{"schema":{"type":"string","enum":["us","metric"]},"required":false,"name":"units","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":16},"required":false,"name":"pages","in":"query"}],"responses":{"200":{"description":"Saved evidence and AI interpretations, with original verification metadata.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"current":{"type":["object","null"],"properties":{"packet":{"type":"object","properties":{"schema":{"type":"string","enum":["moment-evidence-v1"]},"location":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"lat":{"type":"number"},"lon":{"type":"number"},"timezone":{"type":"string"},"timezoneAssumed":{"type":"boolean"}},"required":["id","name","lat","lon","timezone","timezoneAssumed"]},"start":{"type":"string","format":"date-time"},"end":{"type":"string","format":"date-time"},"hour":{"type":"string","format":"date-time"},"units":{"type":"string","enum":["us","metric"]},"from":{"type":"string","format":"date-time"},"to":{"type":"string","format":"date-time"},"receipts":{"type":"array","items":{"type":"object","properties":{"sql":{"type":"string"},"parameters":{"type":"array","items":{}},"rowCount":{"type":"number"},"rowsSha256":{"type":"string"},"purpose":{"type":"string"}},"required":["sql","parameters","rowCount","rowsSha256","purpose"]}},"record":{"type":"object","properties":{"hour":{"type":"string","format":"date-time"},"paths":{"type":"array","items":{"type":"object","properties":{"sourceId":{"type":"string"},"lens":{"type":"string","enum":["precip_probability_pct","precip_amount_mm","temperature_c","wind_speed_kph","wind_gust_kph","humidity_pct","snowfall_amount_mm","cloud_cover_pct","dewpoint_c","pressure_hpa","visibility_m","uv_index","condition","thunder"]},"first":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"null"}]},"latest":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"null"}]},"changes":{"type":"number"},"missing":{"type":"number"},"captures":{"type":"number"},"low":{"type":["object","null"],"properties":{"value":{"type":"number"},"ref":{"type":"object","properties":{"sourceId":{"type":"string"},"runId":{"type":"string"},"pointId":{"type":["string","null"]},"capturedAt":{"type":"string","format":"date-time"}},"required":["sourceId","runId","pointId","capturedAt"]}},"required":["value","ref"]},"high":{"type":["object","null"],"properties":{"value":{"type":"number"},"ref":{"type":"object","properties":{"sourceId":{"type":"string"},"runId":{"type":"string"},"pointId":{"type":["string","null"]},"capturedAt":{"type":"string","format":"date-time"}},"required":["sourceId","runId","pointId","capturedAt"]}},"required":["value","ref"]},"netChange":{"type":["number","null"]},"firstCapturedAt":{"type":["string","null"],"format":"date-time"},"lastCapturedAt":{"type":["string","null"],"format":"date-time"}},"required":["sourceId","lens","first","latest","changes","missing","captures","firstCapturedAt","lastCapturedAt"]}},"findings":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["first_retained","change","reversal","largest_jump","unchanged"]},"sourceId":{"type":"string"},"lens":{"type":"string","enum":["precip_probability_pct","precip_amount_mm","temperature_c","wind_speed_kph","wind_gust_kph","humidity_pct","snowfall_amount_mm","cloud_cover_pct","dewpoint_c","pressure_hpa","visibility_m","uv_index","condition","thunder"]},"from":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"null"}]},"to":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"null"}]},"refs":{"type":"array","items":{"type":"object","properties":{"sourceId":{"type":"string"},"runId":{"type":"string"},"pointId":{"type":["string","null"]},"capturedAt":{"type":"string","format":"date-time"}},"required":["sourceId","runId","pointId","capturedAt"]}}},"required":["id","kind","sourceId","lens","from","to","refs"]}},"findingsTruncated":{"type":"boolean"}},"required":["hour","paths","findings","findingsTruncated"]},"providers":{"type":"array","items":{"type":"object","properties":{"sourceId":{"type":"string"},"name":{"type":"string"},"limited":{"type":"boolean"},"captures":{"type":"array","items":{"type":"object","properties":{"run":{"type":"object","properties":{"id":{"type":"string"},"sourceId":{"type":"string"},"issuedAt":{"type":["string","null"],"format":"date-time"},"capturedAt":{"type":"string","format":"date-time"},"rawPayloadId":{"type":["string","null"]},"sampleId":{"type":["string","null"]},"providerModel":{"type":["string","null"]}},"required":["id","sourceId","issuedAt","capturedAt","rawPayloadId","sampleId","providerModel"]},"point":{"type":["object","null"],"properties":{"id":{"type":"string"},"runId":{"type":"string"},"sourceId":{"type":"string"},"validAt":{"type":"string","format":"date-time"},"capturedAt":{"type":["string","null"],"format":"date-time"},"issuedAt":{"type":["string","null"],"format":"date-time"},"conditionCode":{"type":["string","null"]},"conditionText":{"type":["string","null"]},"values":{"type":"object","properties":{"precip_probability_pct":{"type":["number","null"]},"precip_amount_mm":{"type":["number","null"]},"temperature_c":{"type":["number","null"]},"wind_speed_kph":{"type":["number","null"]},"wind_gust_kph":{"type":["number","null"]},"humidity_pct":{"type":["number","null"]},"snowfall_amount_mm":{"type":["number","null"]},"cloud_cover_pct":{"type":["number","null"]},"dewpoint_c":{"type":["number","null"]},"pressure_hpa":{"type":["number","null"]},"visibility_m":{"type":["number","null"]},"uv_index":{"type":["number","null"]}},"required":["precip_probability_pct","precip_amount_mm","temperature_c","wind_speed_kph","wind_gust_kph","humidity_pct","snowfall_amount_mm","cloud_cover_pct","dewpoint_c","pressure_hpa","visibility_m","uv_index"]}},"required":["id","runId","sourceId","validAt","capturedAt","issuedAt","conditionCode","conditionText","values"]}},"required":["run","point"]}}},"required":["sourceId","name","limited","captures"]}},"facts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["value","change"]},"sourceId":{"type":"string"},"metric":{"type":"string"},"text":{"type":"string"},"refs":{"type":"array","items":{"type":"object","properties":{"runId":{"type":"string"},"pointId":{"type":["string","null"]},"capturedAt":{"type":"string","format":"date-time"}},"required":["runId","pointId","capturedAt"]}},"values":{"type":"array","items":{"anyOf":[{"type":"number"},{"type":"string"},{"type":"boolean"},{"type":"null"},{"type":"null"}]}}},"required":["id","kind","sourceId","metric","text","refs","values"]}}},"required":["schema","location","start","end","hour","units","from","to","receipts","record","providers","facts"]},"packetSha256":{"type":"string"}},"required":["packet","packetSha256"]},"takes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"ledger_artifact_id":{"type":"string"},"iso_artifact_id":{"type":["string","null"]},"packet_sha256":{"type":"string"},"freshness":{"type":"string","enum":["same_evidence","different_evidence","not_compared"]}},"required":["id","created_at","ledger_artifact_id","iso_artifact_id","packet_sha256","freshness"]}},"take":{"type":["object","null"],"properties":{"id":{"type":"string"},"locationId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"packetId":{"type":"string"},"configKey":{"type":"string"},"packetSha256":{"type":"string"},"packet":{"type":"object","properties":{"schema":{"type":"string","enum":["moment-evidence-v1"]},"location":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"lat":{"type":"number"},"lon":{"type":"number"},"timezone":{"type":"string"},"timezoneAssumed":{"type":"boolean"}},"required":["id","name","lat","lon","timezone","timezoneAssumed"]},"start":{"type":"string","format":"date-time"},"end":{"type":"string","format":"date-time"},"hour":{"type":"string","format":"date-time"},"units":{"type":"string","enum":["us","metric"]},"from":{"type":"string","format":"date-time"},"to":{"type":"string","format":"date-time"},"receipts":{"type":"array","items":{"type":"object","properties":{"sql":{"type":"string"},"parameters":{"type":"array","items":{}},"rowCount":{"type":"number"},"rowsSha256":{"type":"string"},"purpose":{"type":"string"}},"required":["sql","parameters","rowCount","rowsSha256","purpose"]}},"record":{"type":"object","properties":{"hour":{"type":"string","format":"date-time"},"paths":{"type":"array","items":{"type":"object","properties":{"sourceId":{"type":"string"},"lens":{"type":"string","enum":["precip_probability_pct","precip_amount_mm","temperature_c","wind_speed_kph","wind_gust_kph","humidity_pct","snowfall_amount_mm","cloud_cover_pct","dewpoint_c","pressure_hpa","visibility_m","uv_index","condition","thunder"]},"first":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"null"}]},"latest":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"null"}]},"changes":{"type":"number"},"missing":{"type":"number"},"captures":{"type":"number"},"low":{"type":["object","null"],"properties":{"value":{"type":"number"},"ref":{"type":"object","properties":{"sourceId":{"type":"string"},"runId":{"type":"string"},"pointId":{"type":["string","null"]},"capturedAt":{"type":"string","format":"date-time"}},"required":["sourceId","runId","pointId","capturedAt"]}},"required":["value","ref"]},"high":{"type":["object","null"],"properties":{"value":{"type":"number"},"ref":{"type":"object","properties":{"sourceId":{"type":"string"},"runId":{"type":"string"},"pointId":{"type":["string","null"]},"capturedAt":{"type":"string","format":"date-time"}},"required":["sourceId","runId","pointId","capturedAt"]}},"required":["value","ref"]},"netChange":{"type":["number","null"]},"firstCapturedAt":{"type":["string","null"],"format":"date-time"},"lastCapturedAt":{"type":["string","null"],"format":"date-time"}},"required":["sourceId","lens","first","latest","changes","missing","captures","firstCapturedAt","lastCapturedAt"]}},"findings":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["first_retained","change","reversal","largest_jump","unchanged"]},"sourceId":{"type":"string"},"lens":{"type":"string","enum":["precip_probability_pct","precip_amount_mm","temperature_c","wind_speed_kph","wind_gust_kph","humidity_pct","snowfall_amount_mm","cloud_cover_pct","dewpoint_c","pressure_hpa","visibility_m","uv_index","condition","thunder"]},"from":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"null"}]},"to":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"null"}]},"refs":{"type":"array","items":{"type":"object","properties":{"sourceId":{"type":"string"},"runId":{"type":"string"},"pointId":{"type":["string","null"]},"capturedAt":{"type":"string","format":"date-time"}},"required":["sourceId","runId","pointId","capturedAt"]}}},"required":["id","kind","sourceId","lens","from","to","refs"]}},"findingsTruncated":{"type":"boolean"}},"required":["hour","paths","findings","findingsTruncated"]},"providers":{"type":"array","items":{"type":"object","properties":{"sourceId":{"type":"string"},"name":{"type":"string"},"limited":{"type":"boolean"},"captures":{"type":"array","items":{"type":"object","properties":{"run":{"type":"object","properties":{"id":{"type":"string"},"sourceId":{"type":"string"},"issuedAt":{"type":["string","null"],"format":"date-time"},"capturedAt":{"type":"string","format":"date-time"},"rawPayloadId":{"type":["string","null"]},"sampleId":{"type":["string","null"]},"providerModel":{"type":["string","null"]}},"required":["id","sourceId","issuedAt","capturedAt","rawPayloadId","sampleId","providerModel"]},"point":{"type":["object","null"],"properties":{"id":{"type":"string"},"runId":{"type":"string"},"sourceId":{"type":"string"},"validAt":{"type":"string","format":"date-time"},"capturedAt":{"type":["string","null"],"format":"date-time"},"issuedAt":{"type":["string","null"],"format":"date-time"},"conditionCode":{"type":["string","null"]},"conditionText":{"type":["string","null"]},"values":{"type":"object","properties":{"precip_probability_pct":{"type":["number","null"]},"precip_amount_mm":{"type":["number","null"]},"temperature_c":{"type":["number","null"]},"wind_speed_kph":{"type":["number","null"]},"wind_gust_kph":{"type":["number","null"]},"humidity_pct":{"type":["number","null"]},"snowfall_amount_mm":{"type":["number","null"]},"cloud_cover_pct":{"type":["number","null"]},"dewpoint_c":{"type":["number","null"]},"pressure_hpa":{"type":["number","null"]},"visibility_m":{"type":["number","null"]},"uv_index":{"type":["number","null"]}},"required":["precip_probability_pct","precip_amount_mm","temperature_c","wind_speed_kph","wind_gust_kph","humidity_pct","snowfall_amount_mm","cloud_cover_pct","dewpoint_c","pressure_hpa","visibility_m","uv_index"]}},"required":["id","runId","sourceId","validAt","capturedAt","issuedAt","conditionCode","conditionText","values"]}},"required":["run","point"]}}},"required":["sourceId","name","limited","captures"]}},"facts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["value","change"]},"sourceId":{"type":"string"},"metric":{"type":"string"},"text":{"type":"string"},"refs":{"type":"array","items":{"type":"object","properties":{"runId":{"type":"string"},"pointId":{"type":["string","null"]},"capturedAt":{"type":"string","format":"date-time"}},"required":["runId","pointId","capturedAt"]}},"values":{"type":"array","items":{"anyOf":[{"type":"number"},{"type":"string"},{"type":"boolean"},{"type":"null"},{"type":"null"}]}}},"required":["id","kind","sourceId","metric","text","refs","values"]}}},"required":["schema","location","start","end","hour","units","from","to","receipts","record","providers","facts"]},"ledger":{"type":["object","null"],"properties":{"schemaVersion":{"type":"number","enum":[1]},"artifact":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["moment_ledger_take","moment_iso_take"]},"content":{"type":"object","properties":{"stage":{"type":"string","enum":["ledger","iso"]},"packetId":{"type":"string"},"packetSha256":{"type":"string"},"passage":{"type":"object","properties":{"sentences":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string"},"citations":{"type":"array","items":{"type":"string"}}},"required":["text","citations"]}}},"required":["sentences"]},"generation":{"type":"object","properties":{"requestedModel":{"type":"string"},"returnedModel":{"type":"string"},"promptVersion":{"type":"string"},"usage":{}},"required":["requestedModel","returnedModel","promptVersion"]}},"required":["stage","packetId","packetSha256","passage","generation"]},"contentSha256":{"type":"string"},"authoredAt":{"type":"string","format":"date-time"},"fidelity":{"type":"string"},"provenance":{"type":"object","additionalProperties":{}}},"required":["kind","content","contentSha256","authoredAt","fidelity","provenance"]},"integrity":{"type":"object","additionalProperties":{}},"execution":{"type":["object","null"],"additionalProperties":{}}},"required":["schemaVersion","artifact","integrity","execution"]},"iso":{"type":["object","null"],"properties":{"schemaVersion":{"type":"number","enum":[1]},"artifact":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["moment_ledger_take","moment_iso_take"]},"content":{"type":"object","properties":{"stage":{"type":"string","enum":["ledger","iso"]},"packetId":{"type":"string"},"packetSha256":{"type":"string"},"passage":{"type":"object","properties":{"sentences":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string"},"citations":{"type":"array","items":{"type":"string"}}},"required":["text","citations"]}}},"required":["sentences"]},"generation":{"type":"object","properties":{"requestedModel":{"type":"string"},"returnedModel":{"type":"string"},"promptVersion":{"type":"string"},"usage":{}},"required":["requestedModel","returnedModel","promptVersion"]}},"required":["stage","packetId","packetSha256","passage","generation"]},"contentSha256":{"type":"string"},"authoredAt":{"type":"string","format":"date-time"},"fidelity":{"type":"string"},"provenance":{"type":"object","additionalProperties":{}}},"required":["kind","content","contentSha256","authoredAt","fidelity","provenance"]},"integrity":{"type":"object","additionalProperties":{}},"execution":{"type":["object","null"],"additionalProperties":{}}},"required":["schemaVersion","artifact","integrity","execution"]}},"required":["id","locationId","createdAt","packetId","configKey","packetSha256","packet","ledger","iso"]},"conversation":{"type":"object","properties":{"id":{"type":"string"},"locationId":{"type":"string"},"takeId":{"type":"string"},"messagesLimited":{"type":"boolean"},"nextCursor":{"type":["string","null"]},"messages":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"role":{"type":"string","enum":["user","assistant"]},"content":{"type":"object","properties":{"text":{"type":"string"},"passage":{"type":"object","properties":{"sentences":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string"},"citations":{"type":"array","items":{"type":"string"}}},"required":["text","citations"]}}},"required":["sentences"]},"generation":{"type":"object","additionalProperties":{}},"packetSha256":{"type":"string"}}},"createdAt":{"type":"string","format":"date-time"}},"required":["id","role","content","createdAt"]}}},"required":["id","locationId","takeId","messagesLimited","nextCursor","messages"]},"conversations":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"take_id":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","take_id","created_at","updated_at"]}},"nextCursor":{"type":["string","null"]},"limit":{"type":"number"}},"required":["ok"]}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/memory/moment/conversations":{"get":{"summary":"Read saved Moment conversations and their evidence","description":"Account-owned saved AI interpretations, never ledger truth. Requires a session or API key. With id, returns the saved opening, original packet, fingerprint, citations and provenance; conversation detail also returns saved messages. Takes accepts event parameters to return a current packet before any model generation. GET never calls a model. Generation and deletion currently require the signed-in app under the owner-approved temporary write-parity exception. Lists are paginated in twenty-entry pages; use nextCursor as before. Conversation messages are paginated in fifty-message pages using conversation.nextCursor.","tags":["Weather Ledger"],"security":[{"bearerAuth":[]}],"operationId":"get_api_weather_ledger_memory_moment_conversations","parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"locationId","in":"query"},{"schema":{"type":"string"},"required":false,"name":"id","in":"query"},{"schema":{"type":"string"},"required":false,"name":"before","in":"query"},{"schema":{"type":"string","format":"date-time"},"required":false,"name":"start","in":"query"},{"schema":{"type":"string","format":"date-time"},"required":false,"name":"end","in":"query"},{"schema":{"type":"string","format":"date-time"},"required":false,"name":"focusHour","in":"query"},{"schema":{"type":"string","format":"date-time"},"required":false,"name":"historyCutoff","in":"query"},{"schema":{"type":"string","enum":["24","72","168","336"]},"required":false,"name":"historyHours","in":"query"},{"schema":{"type":"string","enum":["us","metric"]},"required":false,"name":"units","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":16},"required":false,"name":"pages","in":"query"}],"responses":{"200":{"description":"Saved evidence and AI interpretations, with original verification metadata.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"current":{"type":["object","null"],"properties":{"packet":{"type":"object","properties":{"schema":{"type":"string","enum":["moment-evidence-v1"]},"location":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"lat":{"type":"number"},"lon":{"type":"number"},"timezone":{"type":"string"},"timezoneAssumed":{"type":"boolean"}},"required":["id","name","lat","lon","timezone","timezoneAssumed"]},"start":{"type":"string","format":"date-time"},"end":{"type":"string","format":"date-time"},"hour":{"type":"string","format":"date-time"},"units":{"type":"string","enum":["us","metric"]},"from":{"type":"string","format":"date-time"},"to":{"type":"string","format":"date-time"},"receipts":{"type":"array","items":{"type":"object","properties":{"sql":{"type":"string"},"parameters":{"type":"array","items":{}},"rowCount":{"type":"number"},"rowsSha256":{"type":"string"},"purpose":{"type":"string"}},"required":["sql","parameters","rowCount","rowsSha256","purpose"]}},"record":{"type":"object","properties":{"hour":{"type":"string","format":"date-time"},"paths":{"type":"array","items":{"type":"object","properties":{"sourceId":{"type":"string"},"lens":{"type":"string","enum":["precip_probability_pct","precip_amount_mm","temperature_c","wind_speed_kph","wind_gust_kph","humidity_pct","snowfall_amount_mm","cloud_cover_pct","dewpoint_c","pressure_hpa","visibility_m","uv_index","condition","thunder"]},"first":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"null"}]},"latest":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"null"}]},"changes":{"type":"number"},"missing":{"type":"number"},"captures":{"type":"number"},"low":{"type":["object","null"],"properties":{"value":{"type":"number"},"ref":{"type":"object","properties":{"sourceId":{"type":"string"},"runId":{"type":"string"},"pointId":{"type":["string","null"]},"capturedAt":{"type":"string","format":"date-time"}},"required":["sourceId","runId","pointId","capturedAt"]}},"required":["value","ref"]},"high":{"type":["object","null"],"properties":{"value":{"type":"number"},"ref":{"type":"object","properties":{"sourceId":{"type":"string"},"runId":{"type":"string"},"pointId":{"type":["string","null"]},"capturedAt":{"type":"string","format":"date-time"}},"required":["sourceId","runId","pointId","capturedAt"]}},"required":["value","ref"]},"netChange":{"type":["number","null"]},"firstCapturedAt":{"type":["string","null"],"format":"date-time"},"lastCapturedAt":{"type":["string","null"],"format":"date-time"}},"required":["sourceId","lens","first","latest","changes","missing","captures","firstCapturedAt","lastCapturedAt"]}},"findings":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["first_retained","change","reversal","largest_jump","unchanged"]},"sourceId":{"type":"string"},"lens":{"type":"string","enum":["precip_probability_pct","precip_amount_mm","temperature_c","wind_speed_kph","wind_gust_kph","humidity_pct","snowfall_amount_mm","cloud_cover_pct","dewpoint_c","pressure_hpa","visibility_m","uv_index","condition","thunder"]},"from":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"null"}]},"to":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"null"}]},"refs":{"type":"array","items":{"type":"object","properties":{"sourceId":{"type":"string"},"runId":{"type":"string"},"pointId":{"type":["string","null"]},"capturedAt":{"type":"string","format":"date-time"}},"required":["sourceId","runId","pointId","capturedAt"]}}},"required":["id","kind","sourceId","lens","from","to","refs"]}},"findingsTruncated":{"type":"boolean"}},"required":["hour","paths","findings","findingsTruncated"]},"providers":{"type":"array","items":{"type":"object","properties":{"sourceId":{"type":"string"},"name":{"type":"string"},"limited":{"type":"boolean"},"captures":{"type":"array","items":{"type":"object","properties":{"run":{"type":"object","properties":{"id":{"type":"string"},"sourceId":{"type":"string"},"issuedAt":{"type":["string","null"],"format":"date-time"},"capturedAt":{"type":"string","format":"date-time"},"rawPayloadId":{"type":["string","null"]},"sampleId":{"type":["string","null"]},"providerModel":{"type":["string","null"]}},"required":["id","sourceId","issuedAt","capturedAt","rawPayloadId","sampleId","providerModel"]},"point":{"type":["object","null"],"properties":{"id":{"type":"string"},"runId":{"type":"string"},"sourceId":{"type":"string"},"validAt":{"type":"string","format":"date-time"},"capturedAt":{"type":["string","null"],"format":"date-time"},"issuedAt":{"type":["string","null"],"format":"date-time"},"conditionCode":{"type":["string","null"]},"conditionText":{"type":["string","null"]},"values":{"type":"object","properties":{"precip_probability_pct":{"type":["number","null"]},"precip_amount_mm":{"type":["number","null"]},"temperature_c":{"type":["number","null"]},"wind_speed_kph":{"type":["number","null"]},"wind_gust_kph":{"type":["number","null"]},"humidity_pct":{"type":["number","null"]},"snowfall_amount_mm":{"type":["number","null"]},"cloud_cover_pct":{"type":["number","null"]},"dewpoint_c":{"type":["number","null"]},"pressure_hpa":{"type":["number","null"]},"visibility_m":{"type":["number","null"]},"uv_index":{"type":["number","null"]}},"required":["precip_probability_pct","precip_amount_mm","temperature_c","wind_speed_kph","wind_gust_kph","humidity_pct","snowfall_amount_mm","cloud_cover_pct","dewpoint_c","pressure_hpa","visibility_m","uv_index"]}},"required":["id","runId","sourceId","validAt","capturedAt","issuedAt","conditionCode","conditionText","values"]}},"required":["run","point"]}}},"required":["sourceId","name","limited","captures"]}},"facts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["value","change"]},"sourceId":{"type":"string"},"metric":{"type":"string"},"text":{"type":"string"},"refs":{"type":"array","items":{"type":"object","properties":{"runId":{"type":"string"},"pointId":{"type":["string","null"]},"capturedAt":{"type":"string","format":"date-time"}},"required":["runId","pointId","capturedAt"]}},"values":{"type":"array","items":{"anyOf":[{"type":"number"},{"type":"string"},{"type":"boolean"},{"type":"null"},{"type":"null"}]}}},"required":["id","kind","sourceId","metric","text","refs","values"]}}},"required":["schema","location","start","end","hour","units","from","to","receipts","record","providers","facts"]},"packetSha256":{"type":"string"}},"required":["packet","packetSha256"]},"takes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"ledger_artifact_id":{"type":"string"},"iso_artifact_id":{"type":["string","null"]},"packet_sha256":{"type":"string"},"freshness":{"type":"string","enum":["same_evidence","different_evidence","not_compared"]}},"required":["id","created_at","ledger_artifact_id","iso_artifact_id","packet_sha256","freshness"]}},"take":{"type":["object","null"],"properties":{"id":{"type":"string"},"locationId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"packetId":{"type":"string"},"configKey":{"type":"string"},"packetSha256":{"type":"string"},"packet":{"type":"object","properties":{"schema":{"type":"string","enum":["moment-evidence-v1"]},"location":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"lat":{"type":"number"},"lon":{"type":"number"},"timezone":{"type":"string"},"timezoneAssumed":{"type":"boolean"}},"required":["id","name","lat","lon","timezone","timezoneAssumed"]},"start":{"type":"string","format":"date-time"},"end":{"type":"string","format":"date-time"},"hour":{"type":"string","format":"date-time"},"units":{"type":"string","enum":["us","metric"]},"from":{"type":"string","format":"date-time"},"to":{"type":"string","format":"date-time"},"receipts":{"type":"array","items":{"type":"object","properties":{"sql":{"type":"string"},"parameters":{"type":"array","items":{}},"rowCount":{"type":"number"},"rowsSha256":{"type":"string"},"purpose":{"type":"string"}},"required":["sql","parameters","rowCount","rowsSha256","purpose"]}},"record":{"type":"object","properties":{"hour":{"type":"string","format":"date-time"},"paths":{"type":"array","items":{"type":"object","properties":{"sourceId":{"type":"string"},"lens":{"type":"string","enum":["precip_probability_pct","precip_amount_mm","temperature_c","wind_speed_kph","wind_gust_kph","humidity_pct","snowfall_amount_mm","cloud_cover_pct","dewpoint_c","pressure_hpa","visibility_m","uv_index","condition","thunder"]},"first":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"null"}]},"latest":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"null"}]},"changes":{"type":"number"},"missing":{"type":"number"},"captures":{"type":"number"},"low":{"type":["object","null"],"properties":{"value":{"type":"number"},"ref":{"type":"object","properties":{"sourceId":{"type":"string"},"runId":{"type":"string"},"pointId":{"type":["string","null"]},"capturedAt":{"type":"string","format":"date-time"}},"required":["sourceId","runId","pointId","capturedAt"]}},"required":["value","ref"]},"high":{"type":["object","null"],"properties":{"value":{"type":"number"},"ref":{"type":"object","properties":{"sourceId":{"type":"string"},"runId":{"type":"string"},"pointId":{"type":["string","null"]},"capturedAt":{"type":"string","format":"date-time"}},"required":["sourceId","runId","pointId","capturedAt"]}},"required":["value","ref"]},"netChange":{"type":["number","null"]},"firstCapturedAt":{"type":["string","null"],"format":"date-time"},"lastCapturedAt":{"type":["string","null"],"format":"date-time"}},"required":["sourceId","lens","first","latest","changes","missing","captures","firstCapturedAt","lastCapturedAt"]}},"findings":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["first_retained","change","reversal","largest_jump","unchanged"]},"sourceId":{"type":"string"},"lens":{"type":"string","enum":["precip_probability_pct","precip_amount_mm","temperature_c","wind_speed_kph","wind_gust_kph","humidity_pct","snowfall_amount_mm","cloud_cover_pct","dewpoint_c","pressure_hpa","visibility_m","uv_index","condition","thunder"]},"from":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"null"}]},"to":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"null"}]},"refs":{"type":"array","items":{"type":"object","properties":{"sourceId":{"type":"string"},"runId":{"type":"string"},"pointId":{"type":["string","null"]},"capturedAt":{"type":"string","format":"date-time"}},"required":["sourceId","runId","pointId","capturedAt"]}}},"required":["id","kind","sourceId","lens","from","to","refs"]}},"findingsTruncated":{"type":"boolean"}},"required":["hour","paths","findings","findingsTruncated"]},"providers":{"type":"array","items":{"type":"object","properties":{"sourceId":{"type":"string"},"name":{"type":"string"},"limited":{"type":"boolean"},"captures":{"type":"array","items":{"type":"object","properties":{"run":{"type":"object","properties":{"id":{"type":"string"},"sourceId":{"type":"string"},"issuedAt":{"type":["string","null"],"format":"date-time"},"capturedAt":{"type":"string","format":"date-time"},"rawPayloadId":{"type":["string","null"]},"sampleId":{"type":["string","null"]},"providerModel":{"type":["string","null"]}},"required":["id","sourceId","issuedAt","capturedAt","rawPayloadId","sampleId","providerModel"]},"point":{"type":["object","null"],"properties":{"id":{"type":"string"},"runId":{"type":"string"},"sourceId":{"type":"string"},"validAt":{"type":"string","format":"date-time"},"capturedAt":{"type":["string","null"],"format":"date-time"},"issuedAt":{"type":["string","null"],"format":"date-time"},"conditionCode":{"type":["string","null"]},"conditionText":{"type":["string","null"]},"values":{"type":"object","properties":{"precip_probability_pct":{"type":["number","null"]},"precip_amount_mm":{"type":["number","null"]},"temperature_c":{"type":["number","null"]},"wind_speed_kph":{"type":["number","null"]},"wind_gust_kph":{"type":["number","null"]},"humidity_pct":{"type":["number","null"]},"snowfall_amount_mm":{"type":["number","null"]},"cloud_cover_pct":{"type":["number","null"]},"dewpoint_c":{"type":["number","null"]},"pressure_hpa":{"type":["number","null"]},"visibility_m":{"type":["number","null"]},"uv_index":{"type":["number","null"]}},"required":["precip_probability_pct","precip_amount_mm","temperature_c","wind_speed_kph","wind_gust_kph","humidity_pct","snowfall_amount_mm","cloud_cover_pct","dewpoint_c","pressure_hpa","visibility_m","uv_index"]}},"required":["id","runId","sourceId","validAt","capturedAt","issuedAt","conditionCode","conditionText","values"]}},"required":["run","point"]}}},"required":["sourceId","name","limited","captures"]}},"facts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["value","change"]},"sourceId":{"type":"string"},"metric":{"type":"string"},"text":{"type":"string"},"refs":{"type":"array","items":{"type":"object","properties":{"runId":{"type":"string"},"pointId":{"type":["string","null"]},"capturedAt":{"type":"string","format":"date-time"}},"required":["runId","pointId","capturedAt"]}},"values":{"type":"array","items":{"anyOf":[{"type":"number"},{"type":"string"},{"type":"boolean"},{"type":"null"},{"type":"null"}]}}},"required":["id","kind","sourceId","metric","text","refs","values"]}}},"required":["schema","location","start","end","hour","units","from","to","receipts","record","providers","facts"]},"ledger":{"type":["object","null"],"properties":{"schemaVersion":{"type":"number","enum":[1]},"artifact":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["moment_ledger_take","moment_iso_take"]},"content":{"type":"object","properties":{"stage":{"type":"string","enum":["ledger","iso"]},"packetId":{"type":"string"},"packetSha256":{"type":"string"},"passage":{"type":"object","properties":{"sentences":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string"},"citations":{"type":"array","items":{"type":"string"}}},"required":["text","citations"]}}},"required":["sentences"]},"generation":{"type":"object","properties":{"requestedModel":{"type":"string"},"returnedModel":{"type":"string"},"promptVersion":{"type":"string"},"usage":{}},"required":["requestedModel","returnedModel","promptVersion"]}},"required":["stage","packetId","packetSha256","passage","generation"]},"contentSha256":{"type":"string"},"authoredAt":{"type":"string","format":"date-time"},"fidelity":{"type":"string"},"provenance":{"type":"object","additionalProperties":{}}},"required":["kind","content","contentSha256","authoredAt","fidelity","provenance"]},"integrity":{"type":"object","additionalProperties":{}},"execution":{"type":["object","null"],"additionalProperties":{}}},"required":["schemaVersion","artifact","integrity","execution"]},"iso":{"type":["object","null"],"properties":{"schemaVersion":{"type":"number","enum":[1]},"artifact":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["moment_ledger_take","moment_iso_take"]},"content":{"type":"object","properties":{"stage":{"type":"string","enum":["ledger","iso"]},"packetId":{"type":"string"},"packetSha256":{"type":"string"},"passage":{"type":"object","properties":{"sentences":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string"},"citations":{"type":"array","items":{"type":"string"}}},"required":["text","citations"]}}},"required":["sentences"]},"generation":{"type":"object","properties":{"requestedModel":{"type":"string"},"returnedModel":{"type":"string"},"promptVersion":{"type":"string"},"usage":{}},"required":["requestedModel","returnedModel","promptVersion"]}},"required":["stage","packetId","packetSha256","passage","generation"]},"contentSha256":{"type":"string"},"authoredAt":{"type":"string","format":"date-time"},"fidelity":{"type":"string"},"provenance":{"type":"object","additionalProperties":{}}},"required":["kind","content","contentSha256","authoredAt","fidelity","provenance"]},"integrity":{"type":"object","additionalProperties":{}},"execution":{"type":["object","null"],"additionalProperties":{}}},"required":["schemaVersion","artifact","integrity","execution"]}},"required":["id","locationId","createdAt","packetId","configKey","packetSha256","packet","ledger","iso"]},"conversation":{"type":"object","properties":{"id":{"type":"string"},"locationId":{"type":"string"},"takeId":{"type":"string"},"messagesLimited":{"type":"boolean"},"nextCursor":{"type":["string","null"]},"messages":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"role":{"type":"string","enum":["user","assistant"]},"content":{"type":"object","properties":{"text":{"type":"string"},"passage":{"type":"object","properties":{"sentences":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string"},"citations":{"type":"array","items":{"type":"string"}}},"required":["text","citations"]}}},"required":["sentences"]},"generation":{"type":"object","additionalProperties":{}},"packetSha256":{"type":"string"}}},"createdAt":{"type":"string","format":"date-time"}},"required":["id","role","content","createdAt"]}}},"required":["id","locationId","takeId","messagesLimited","nextCursor","messages"]},"conversations":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"take_id":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","take_id","created_at","updated_at"]}},"nextCursor":{"type":["string","null"]},"limit":{"type":"number"}},"required":["ok"]}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/memory/replay":{"get":{"summary":"Forecast Memory replay","description":"Bounded as-of replay using only forecast runs retrieved at or before the requested vantage.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_memory_replay","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"},{"schema":{"type":"string","description":"Replay vantage time (ISO 8601). Invalid or missing values fall back to now.","example":"2026-05-29T02:00:00Z"},"required":false,"name":"asOf","in":"query"},{"schema":{"type":["number","null"],"description":"Forecast horizon from `asOf` in hours, clamped to 1–384. Defaults to 48."},"required":false,"name":"horizonHours","in":"query"}],"responses":{"200":{"description":"Forecast Memory read-model response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForecastMemoryResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/memory/records":{"get":{"summary":"Forecast Memory records","description":"Account-scoped persisted verification records with canonical values, provider and knowledge lead, signed and absolute error, cursor pagination, and CSV export.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_memory_records","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"},{"schema":{"type":"string","description":"Exact-match provider source filter.","example":"weatherkit"},"required":false,"name":"sourceId","in":"query"},{"schema":{"type":"string","description":"Exact-match variable filter.","example":"temperature_c"},"required":false,"name":"variable","in":"query"},{"schema":{"type":"string","description":"Exact-match forecast-run filter."},"required":false,"name":"runId","in":"query"},{"schema":{"type":"string","description":"Exact-match valid-time filter (ISO 8601). A record filter — not the validAt/validTime either-or alias other forecast routes read."},"required":false,"name":"validAt","in":"query"},{"schema":{"type":"string","enum":["0-3h","3-12h","12-24h","24h+"],"description":"Exact-match knowledge-lead bucket filter."},"required":false,"name":"leadBucket","in":"query"},{"schema":{"type":"string","description":"Inclusive valid-time window start (ISO 8601)."},"required":false,"name":"from","in":"query"},{"schema":{"type":"string","description":"Inclusive valid-time window end (ISO 8601)."},"required":false,"name":"to","in":"query"},{"schema":{"type":"string","description":"Opaque keyset cursor from the previous page's `nextCursor`, passed back verbatim. First pages (no cursor) also return `total` and `facets`."},"required":false,"name":"cursor","in":"query"},{"schema":{"type":["number","null"],"description":"Rows per page, clamped to 1–500. Defaults to 100."},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","enum":["csv"],"description":"Set to `csv` for a text/csv attachment export of the same page. CSV responses carry no `nextCursor` — page with `cursor` explicitly via the JSON form. Signed-out callers receive the JSON envelope regardless."},"required":false,"name":"format","in":"query"}],"responses":{"200":{"description":"Cursor-paginated Forecast Memory verification records or CSV export.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForecastMemoryRecordsResponse"}},"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/memory/verification":{"get":{"summary":"Forecast Memory verification","description":"Bounded observed-hour pagination (`limit`) and one series per provider, with station-reference metadata and all forecast clocks. The per-valid-time comparison rows behind `selected` and `providerSeries` are a separate axis, capped by `rowLimit` (default and hard maximum 500) with honest `truncated` metadata.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_memory_verification","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"},{"schema":{"type":"string","description":"Target valid time (ISO 8601). Supply this or the legacy `validTime` alias.","example":"2026-05-29T14:00:00Z"},"required":false,"name":"validAt","in":"query"},{"schema":{"type":"string","description":"Legacy alias for `validAt`, read only when `validAt` is absent. Prefer `validAt`."},"required":false,"name":"validTime","in":"query"},{"schema":{"type":"string","enum":["temperature_c","precip_amount_mm","wind_speed_kph","wind_gust_kph","humidity_pct"]},"required":false,"name":"variable","in":"query"},{"schema":{"type":["number","null"],"description":"Trailing window (hours) searched for observed hours. Clamped 24–744 by the route; default 48."},"required":false,"name":"lookbackHours","in":"query"},{"schema":{"type":["number","null"],"description":"Maximum distinct observed hours to return (paginates the sidebar hour list). Clamped 1–744; default 24. A different axis from `rowLimit` below — this does not bound `selected`/`providerSeries`."},"required":false,"name":"limit","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":500,"description":"Maximum per-valid-time verification-pair rows (and provider-series points) to return. Default and hard maximum 500 — the value this response has always been capped at internally; this only makes the cap caller-visible, adjustable downward, and honestly flagged via `truncated`.","example":500},"required":false,"name":"rowLimit","in":"query"}],"responses":{"200":{"description":"Forecast Memory read-model response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForecastMemoryResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/public/forecast":{"get":{"summary":"Public forecast lookup (keyless)","description":"Keyless, per-IP rate-limited forecast for an arbitrary coordinate or place name. Calls providers server-side for the requested point; never reads or exposes Weather Ledger rows or account locations.","tags":["Public"],"security":[],"operationId":"get_api_public_forecast","parameters":[{"schema":{"type":"string","description":"ZIP code or place name (≥3 chars). Either q or lat+lon is required."},"required":false,"name":"q","in":"query"},{"schema":{"type":["number","null"]},"required":false,"name":"lat","in":"query"},{"schema":{"type":["number","null"]},"required":false,"name":"lon","in":"query"},{"schema":{"type":"string"},"required":false,"name":"name","in":"query"}],"responses":{"200":{"description":"Forecast for the requested point.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicForecastResponse"}}}},"400":{"description":"No usable target (missing q and lat/lon).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded for keyless lookups.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ErrorEnvelope"},{"type":"object","properties":{"limited":{"type":"boolean","enum":[true]},"resetAt":{"type":"string"}}}]}}}},"502":{"description":"Upstream location search or provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/severe-weather":{"get":{"summary":"Severe-weather overview","description":"Read-only severe-weather intelligence for an account-owned saved location. The overview carries an additive nullable `priming` block (Storm Mode priming, a state-only watch flag): `null` means no priming event has been recorded for the location (the sparse store only gains a row on the first qualifying watch, so an evaluated-but-never-watched location also reads null), while a present block reports `primed`, `primed_at`, `cleared_at`, `active_watch_count`, and `updated_at`. A primed block is last-known state as of `updated_at` — the collector holds primed=true across failed alert polls. Priming never changes collection cadence or starts episodes. Signed-out callers receive synthetic example data.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_severe_weather","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"}],"responses":{"200":{"description":"Severe-weather data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SevereWeatherResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/storms":{"get":{"summary":"List storms","description":"Read-only severe-weather intelligence for an account-owned saved location. Signed-out callers receive synthetic example data.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_storms","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"},{"schema":{"type":["number","null"],"description":"Maximum storm episodes, clamped to 1–100. Defaults to 25."},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Severe-weather data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SevereWeatherResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/outlooks":{"get":{"summary":"List outlooks","description":"Read-only severe-weather intelligence for an account-owned saved location. Signed-out callers receive synthetic example data.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_outlooks","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"},{"schema":{"type":["number","null"],"description":"Restrict to one SPC outlook day (1–3). Omit for all days.","example":1},"required":false,"name":"day","in":"query"},{"schema":{"type":["number","null"],"description":"Maximum outlook rows, clamped to 1–100. Defaults to 25."},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Severe-weather data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SevereWeatherResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/soundings":{"get":{"summary":"List soundings","description":"Cursor-paginated collected and imported radiosonde (upper-air) soundings for an account-owned saved location, newest first. Use `validAtEnd` to jump to a historical date and exhaust `nextCursor` rather than treating the first page as the archive. Each sounding carries an additive `derived` block of computed upper-air telemetry when available: freezing level (m/hPa) with crossing count and warm-layer structure, WMO tropopause with tri-state `tropopause_detected` (null = ascent burst too low to tell), inversion layers, max and low-level wind, 0–6 km bulk shear, precipitable water, bulk lapse rates, dewpoint depressions, and parcel thermodynamics (`sb_*`, `ml_*`, and `mu_*` CAPE/CIN plus surface-based LCL/LFC/EL) — any metric is null when the ascent did not sample what it needs. Signed-out callers receive synthetic example data.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_soundings","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"},{"schema":{"type":["number","null"],"description":"Page size, validated from 1–100. Defaults to 25."},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","description":"Optional inclusive ISO launch-time ceiling for jumping to an older window."},"required":false,"name":"validAtEnd","in":"query"},{"schema":{"type":"string","description":"Opaque cursor returned by `nextCursor`; pass it back unchanged for the next older page."},"required":false,"name":"cursor","in":"query"}],"responses":{"200":{"description":"Severe-weather data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SevereWeatherResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/alerts":{"get":{"summary":"List alerts","description":"Historical alerts of any severity (advisory, watch, warning, special weather statement, etc.) collected for an account-owned saved location, independent of the Storm Mode episode mechanism which only links qualifying warning types. Signed-out callers receive synthetic example data.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_alerts","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"},{"schema":{"type":["number","null"],"description":"Maximum alert rows, clamped to 1–100. Defaults to 50."},"required":false,"name":"limit","in":"query"},{"schema":{"type":["number","null"],"description":"Rows to skip for pagination. Floored at 0, no maximum. Defaults to 0."},"required":false,"name":"offset","in":"query"}],"responses":{"200":{"description":"Severe-weather data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SevereWeatherResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/severe-weather/iso-harness":{"get":{"summary":"Export Storm Episodes as an Iso harness","description":"Renders one or several recorded storm episodes as a single self-contained Iso harness — a Markdown dossier whose evidence sections are derived deterministically from the ledger (no model is called and nothing is persisted), interleaved with empty `iso:block` markers a filling agent writes into, and an `iso:signature` slot that ships `unsigned`. Absent measurements render as an em dash, never as zero. Pass ids as a repeated `episodeId` or one comma-separated `episodeIds`; duplicates collapse and 2+ distinct ids add a cross-episode comparison table. Fails closed as a unit: every id is authorized against its OWN episode `location_id`, and one unowned or unknown id fails the entire request (403/404) rather than exporting a partial dossier. All ids must belong to one location (400 otherwise), at most 12 per harness, and signed-out callers receive 401 — there is no example harness. `format=md` returns `text/markdown` as a download; the default returns the document plus its parsed block/meta structure as JSON.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_severe_weather_iso_harness","parameters":[{"schema":{"type":"string","description":"Comma-separated storm episode ids. Combine with or use instead of repeated `episodeId`.","example":"evt-1,evt-2"},"required":false,"name":"episodeIds","in":"query"},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"A single storm episode id. May be repeated."},"required":false,"name":"episodeId","in":"query","style":"form","explode":true},{"schema":{"type":"string","description":"Optional assertion of the expected owning location. When present, an episode owned by any other location is refused with 403."},"required":false,"name":"locationId","in":"query"},{"schema":{"type":"string","enum":["json","md"],"description":"Response shape. `md` downloads the dossier; omit for the JSON envelope."},"required":false,"name":"format","in":"query"}],"responses":{"200":{"description":"Iso harness document, block inventory, and metadata or Markdown export.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SevereWeatherResponse"}},"text/markdown":{"schema":{"type":"string"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/storms/{id}":{"get":{"summary":"Storm episode detail","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_storms_id","parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":false,"name":"locationId","in":"query"}],"responses":{"200":{"description":"Storm episode, warnings, active windows, and linked samples.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SevereWeatherResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/goes-abi-samples":{"get":{"summary":"GOES-19 ABI samples at saved locations","description":"Newest common GOES-19 ABI L2 CMI brightness-temperature sample (bands C08, C13, C15) at every saved location on the caller’s account. There is no coordinate parameter: saved locations only. When the ledger already holds a scan for these locations it is returned with `ledgerStored: true`; otherwise the route makes a bounded on-demand read of public NOAA GOES-19 granules and samples them without persisting anything (`cached` says whether that read came from the in-process cache). Relay `interpretationCaveats` with any interpretation: no parallax or cloud-height correction is applied, and a fixed-location C13 brightness-temperature drop can reflect cloud advection, so it must not be described as cloud-top cooling. `availability: \"partial\"` lists unavailable bands in `missingBands`. A 503 `temporarily_busy` means the process-wide on-demand budget is spent: back off instead of retrying in a loop. Signed-out callers receive an empty example payload.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_goes_abi_samples","responses":{"200":{"description":"ABI samples for the account’s saved locations.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoesAbiSamplesResponse"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Per-IP limit exceeded (`rate_limited`); honor the `Retry-After` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"NOAA granule read failed (`upstream_unreachable`) or a granule exceeded the size bound (`provider_payload_too_large`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"On-demand budget spent (`temporarily_busy`), or no recent or band-compatible scan (`no_recent_granules`, `no_compatible_scan`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/model-guidance/refs":{"get":{"summary":"REFS parallel-distribution inventory","description":"Inventory of the artifacts currently visible in NOAA’s fixed public REFS parallel-distribution directory on NOMADS: cycle, product family, forecast lead, domain, modification time, and transfer size. This is distribution evidence only. The route does not decode GRIB2, store model output, or say anything about forecast skill. The upstream URL is fixed server-side, not caller-controlled, and the result is cached in-process for five minutes. A signed-in session or API key is required; there is no signed-out example.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_model_guidance_refs","responses":{"200":{"description":"Current REFS parallel-directory inventory.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefsInventoryResponse"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"The NOMADS directory could not be read (`refs_inventory_unavailable`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/soundings/{id}":{"get":{"summary":"Sounding profile detail","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_soundings_id","parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"}],"responses":{"200":{"description":"Nearest-station sounding profile, measured levels, and the `derived` computed upper-air telemetry block (freezing level, tropopause, inversions, max wind, bulk shear, precipitable water, and SB/ML/MU parcel CAPE/CIN with surface-based LCL/LFC/EL).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SevereWeatherResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/soundings/national":{"get":{"summary":"List collector-owned national RAOB profiles","description":"Cursor-paginated provider-global radiosonde profiles from the official NWS national grid. Rows come only from collector-owned IEM or NOAA IGRA collection, carry station identity and additive derived upper-air telemetry, and never include account-created imports or location-resolution fan-out. A signed-in FernWX session or bearer API key is required; unlike location-scoped soundings, there is no synthetic signed-out substitute.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_soundings_national","parameters":[{"schema":{"type":"string","description":"Optional 3–8 character upper-air station identifier. Case-insensitive.","example":"KOUN"},"required":false,"name":"stationId","in":"query"},{"schema":{"type":"string","description":"Inclusive ISO launch-time lower bound.","example":"2026-08-10T00:00:00Z"},"required":false,"name":"validAtStart","in":"query"},{"schema":{"type":"string","description":"Inclusive ISO launch-time upper bound.","example":"2026-08-10T12:00:00Z"},"required":false,"name":"validAtEnd","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":500,"description":"Profiles per page. Defaults to 100; maximum 500."},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","description":"Opaque cursor returned as nextCursor. Use unchanged to fetch the next older page."},"required":false,"name":"cursor","in":"query"}],"responses":{"200":{"description":"National provider-global RAOB page.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NationalSoundingListResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/soundings/national/{id}":{"get":{"summary":"Read one collector-owned national RAOB profile","description":"Measured vertical levels plus additive derived upper-air telemetry for one provider-global national RAOB profile. The identifier must name a collector-owned IEM or NOAA IGRA profile; account-created imports are not addressable here.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_soundings_national_id","parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"National provider-global RAOB profile.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NationalSoundingDetailResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/soundings/compare":{"get":{"summary":"Compare 2–6 soundings on a shared pressure grid","description":"Full details (levels + `derived` telemetry) for 2–6 soundings visible to the location, returned in chronological order (oldest first) regardless of requested id order — `soundings` and the positional `aligned.profiles` columns follow that order, each sounding carrying its own `id` for correlation. Plus an `aligned` block interpolating every profile onto shared pressure surfaces (WMO mandatory levels + 50 hPa steps) restricted to the column every ascent sampled — `aligned.top_pressure_hpa` is the shallowest ascent’s top, the equal-extent clamp. `mixed_stations` flags a selection spanning launch sites. 404 when ANY id is not visible to this account/location; 401 signed out (there is no example comparison).","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_soundings_compare","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"},{"schema":{"type":"string","description":"Comma-separated list of 2–6 distinct sounding ids.","example":"sounding-a,sounding-b"},"required":true,"name":"ids","in":"query"}],"responses":{"200":{"description":"Compared soundings and the aligned shared-pressure grid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SevereWeatherResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/soundings/comparisons":{"get":{"summary":"List saved AI comparison syntheses","description":"Account-owned AI syntheses of multi-sounding comparisons for a location, newest first. Each carries the compared `profileIds`, the structured document (summary, `differences` per-metric change narration, sections, takeaways, caveats), model, and creation time. Synthesis, never truth. Generation happens via the app’s signed-in POST …/comparisons/synthesize action, which is not part of this documented read surface.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_soundings_comparisons","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"}],"responses":{"200":{"description":"Saved comparison syntheses for the location.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SevereWeatherResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/text-products":{"get":{"summary":"List NWS text products (AFDs)","description":"Stored NWS text products — Area Forecast Discussions (AFDs) and similar office discussions — newest issuance first. Filter by `office` (e.g. RNK) and/or `type` (e.g. AFD). Supply an account-owned `locationId` to scope results to that location's resolved NWS office and receive its `nws` context; use `limit=1` for the latest discussion. Signed-out callers receive a synthetic example AFD.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_text_products","parameters":[{"schema":{"type":"string","description":"NWS office filter (WMO or AWIPS form, e.g. RNK or KRNK).","example":"RNK"},"required":false,"name":"office","in":"query"},{"schema":{"type":"string","description":"Product type filter, e.g. AFD.","example":"AFD"},"required":false,"name":"type","in":"query"},{"schema":{"type":"string","description":"Account-owned location id; scopes products to that location's NWS office and returns `nws` context."},"required":false,"name":"locationId","in":"query"},{"schema":{"type":["number","null"],"description":"Max products to return. Clamped to 1–100; default 25. Use 1 for the latest discussion.","example":1},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Stored NWS text products.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TextProductsResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/text-products/{id}":{"get":{"summary":"NWS text product detail (full AFD text)","description":"Full narrative and parsed sections for one stored NWS text product. `locationId` is optional: when supplied, the read is scoped to that account-owned location's NWS office (the product must be relevant to it, else 404); when omitted, a signed-in caller reads the product directly by id. Signed-out callers receive the synthetic example AFD.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_text_products_id","parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","description":"Optional account-owned location id. When supplied, scopes the read to that location's NWS office."},"required":false,"name":"locationId","in":"query"}],"responses":{"200":{"description":"The requested NWS text product.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TextProductResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No text product with that id (in scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/climate/enso":{"get":{"summary":"CPC ENSO climate context","description":"Provider-global NOAA CPC ENSO climate context: weekly Niño-region SSTs and anomalies, ONI, and RONI, with per-stream collection health. Shared public NOAA data with no account or location scoping — every signed-in caller receives the identical payload. Signed-out callers receive a synthetic example.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_climate_enso","parameters":[{"schema":{"type":["number","null"],"description":"Recent periods returned per dataset × metric series, floored to an integer and clamped to 1–52. Defaults to 12.","example":12},"required":false,"name":"evolutionPeriods","in":"query"}],"responses":{"200":{"description":"CPC ENSO climate read.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClimateEnsoResponse"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/tropics/history":{"get":{"summary":"Retained NHC storm, forecast and advisory history","description":"Paginated public NOAA history across ALL captured storms, including inactive systems and advisories beyond the active overview caps. Kinds: forecasts (typed forecast points with geometry_id, advisory_code, tau_hours, issued_at, retrieved_at, valid_at, lat/lon, max_wind_kt, gust_kt, pressure_hpa); advisories (identity/provenance, not bulletin text); geometries (complete retained GeoJSON); observations (reported storm states); activity (captured active-id lists). No saved location is required. Winds are knots, pressure hPa. Read evidenceLimits and status: captured history is not a complete NHC archive; same-advisory corrections retain latest geometry only. Use nextOffset and preserve returned window.to to page. Concurrent corrections can change pages. Signed-out callers receive a synthetic example; never use example data as evidence.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_tropics_history","parameters":[{"schema":{"type":"string","enum":["forecasts","advisories","geometries","observations","activity"],"description":"History surface; default forecasts."},"required":false,"name":"kind","in":"query"},{"schema":{"type":"string","description":"Exact NHC identity (al/ep/cp plus storm number and season). Applies to active-id membership for activity.","example":"al062026"},"required":false,"name":"stormId","in":"query"},{"schema":{"type":["integer","null"],"description":"Storm season, 2000 through current UTC year. Omit for all captured seasons. Activity filters member storm seasons, not confirmation year."},"required":false,"name":"season","in":"query"},{"schema":{"type":"string","description":"Inclusive ISO UTC history-time start. Omit for no lower bound. Most kinds use retrieved_at; observations use NHC last_update, and activity uses confirmed_at."},"required":false,"name":"from","in":"query"},{"schema":{"type":"string","description":"Inclusive ISO UTC history-time end; default request time. Preserve the returned value when paging. Does not filter forecast valid_at."},"required":false,"name":"to","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":200,"description":"Rows per page, 1–200; default 100. Narrow stormId when reading large geometry."},"required":false,"name":"limit","in":"query"},{"schema":{"type":["integer","null"],"minimum":0,"maximum":9007199254740991,"description":"Page offset, default 0; use nextOffset until null."},"required":false,"name":"offset","in":"query"}],"responses":{"200":{"description":"Retained NHC history with explicit window, pagination and coverage limits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TropicsHistoryResponse"}}}},"400":{"description":"Invalid history filters (invalid_history_query).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"NHC history migration is unavailable (not_migrated).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/tropics":{"get":{"summary":"NHC tropical cyclone overview","description":"Every active NHC system across the Atlantic, East Pacific and Central Pacific (CPHC storms arrive in the same NHC feed): latest intensity and position, observed track, newest forecast points, how the forecast moved across recent advisories, a season summary per basin, and current threats to the caller’s own saved locations. Winds are knots and pressures hPa, exactly as NHC publishes them. Read `status` before describing activity and `collectedSince` before describing season totals. Signed-out callers receive a synthetic example.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_tropics","parameters":[{"schema":{"type":["integer","null"],"description":"Season year for `seasonStorms` and `basins`, 2000 through the current year. Defaults to the current UTC year.","example":2026},"required":false,"name":"season","in":"query"}],"responses":{"200":{"description":"NHC tropical cyclone overview.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TropicsResponse"}}}},"400":{"description":"Invalid `season` (`invalid_season`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The NHC tables are not migrated on this ledger (`not_migrated`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/accuracy-flags":{"get":{"summary":"List observed-inaccuracy flags","description":"Account-owned observed-inaccuracy flags for one saved location, newest first: each flag contests a reading FernWX displayed (current condition, temperature, or other), snapshotting the platform value, its provider, and retrieval time beside the caller's own observation. Append-only — flags are created via the app's signed-in POST on this path, which is not part of this documented read surface. Signed-out callers receive `{ ok, flags: [], authRequired: true }` with HTTP 200 rather than example data.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_accuracy_flags","parameters":[{"schema":{"type":"string","description":"Account-owned location id. Required when signed in — 400 when missing, 403 when the location is not owned by the calling account (no admin bypass). Ignored for signed-out callers, who always receive the empty `authRequired` envelope.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"}],"responses":{"200":{"description":"Observed-inaccuracy flags for the location.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccuracyFlagsResponse"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/account/settings":{"get":{"summary":"Read account settings and saved locations","description":"Returns the caller’s public account profile, preferences, saved locations, source choices, and collection settings. Read-only with an API key.","tags":["Account Data"],"operationId":"get_api_account_settings","responses":{"200":{"description":"Account-scoped saved information.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountDataEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/account/dashboard":{"get":{"summary":"Read the account dashboard","description":"Returns the same account-scoped evidence cards shown on the signed-in account dashboard.","tags":["Account Data"],"operationId":"get_api_account_dashboard","responses":{"200":{"description":"Account-scoped saved information.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountDataEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/account/weatherkit/availability":{"get":{"summary":"Read saved WeatherKit availability","description":"Returns the last saved WeatherKit dataset-availability check. Refresh remains browser-session only because it calls the provider and writes account state.","tags":["Account Data"],"operationId":"get_api_account_weatherkit_availability","responses":{"200":{"description":"Account-scoped saved information.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountDataEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/account/weatherkit/data":{"get":{"summary":"Read saved account weather data","description":"Returns the selected account location, saved preferences, telemetry, freshness, nowcast, forecast, and alerts.","tags":["Account Data"],"operationId":"get_api_account_weatherkit_data","parameters":[{"schema":{"type":"string","description":"Account location to read. Optional — silently falls back to the account's first saved location.","example":"example-ledger-coastal-ridge"},"required":false,"name":"locationId","in":"query"},{"schema":{"type":["number","null"],"description":"Trailing telemetry window in hours, rounded and clamped to 1–168. Defaults to 24."},"required":false,"name":"hours","in":"query"},{"schema":{"type":["number","null"],"description":"Telemetry-freshness window in days, rounded and clamped to 1–31. Defaults to 7."},"required":false,"name":"days","in":"query"}],"responses":{"200":{"description":"Account-scoped saved information.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountDataEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/analysis":{"get":{"summary":"Read Observatory analysis","description":"Observatory analysis bundle for one location: forecast horizons, histories, and verifications across every tracked variable. Both parameters are optional — omitted values fall back to the account default location and a server-chosen target time.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_analysis","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":false,"name":"locationId","in":"query"},{"schema":{"type":"string","description":"Valid time the analysis is centered on (ISO 8601). Falls back to `validTime`.","example":"2026-05-29T14:00:00Z"},"required":false,"name":"targetValidTime","in":"query"},{"schema":{"type":"string","description":"Legacy alias for `targetValidTime`, read only when it is absent."},"required":false,"name":"validTime","in":"query"}],"responses":{"200":{"description":"Account/location-scoped Weather Ledger information.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountDataEnvelope"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/forecast/drift":{"get":{"summary":"Read forecast drift","description":"How each source’s forecast for one variable at one valid time drifted across successive forecast runs. `locationId` and a valid time are both required for signed-in callers.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_forecast_drift","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"},{"schema":{"type":"string","description":"Target valid time (ISO 8601). Supply this or the legacy `validTime` alias.","example":"2026-05-29T14:00:00Z"},"required":false,"name":"validAt","in":"query"},{"schema":{"type":"string","description":"Legacy alias for `validAt`, read only when `validAt` is absent. Prefer `validAt`."},"required":false,"name":"validTime","in":"query"},{"schema":{"type":"string","enum":["temperature_c","precip_probability_pct","precip_amount_mm","wind_speed_kph","wind_gust_kph","humidity_pct"],"description":"Forecast variable to analyze. Defaults to `temperature_c`."},"required":false,"name":"variable","in":"query"}],"responses":{"200":{"description":"Account/location-scoped Weather Ledger information.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountDataEnvelope"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/forecast/point-history":{"get":{"summary":"Read forecast point history","description":"Per-run forecast point history for one valid time across several variables at once. A valid time is always required; `locationId` is required for signed-in callers.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_forecast_point_history","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"},{"schema":{"type":"string","description":"Target valid time (ISO 8601). Supply this or the legacy `validTime` alias.","example":"2026-05-29T14:00:00Z"},"required":false,"name":"validAt","in":"query"},{"schema":{"type":"string","description":"Legacy alias for `validAt`, read only when `validAt` is absent. Prefer `validAt`."},"required":false,"name":"validTime","in":"query"},{"schema":{"type":"string","description":"Comma-separated subset of temperature_c, precip_probability_pct, wind_speed_kph, wind_gust_kph, humidity_pct. Defaults to all of them. An unrecognized entry returns 400.","example":"temperature_c,wind_gust_kph"},"required":false,"name":"variables","in":"query"},{"schema":{"type":["number","null"],"description":"Minimum samples per series, clamped to 1–100. Defaults to 4."},"required":false,"name":"minSamples","in":"query"}],"responses":{"200":{"description":"Account/location-scoped Weather Ledger information.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountDataEnvelope"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/forecast/verification":{"get":{"summary":"Read forecast verification","description":"Forecast-versus-actual verification rows for one variable at one valid time, with the accuracy reference the comparison used.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_forecast_verification","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"},{"schema":{"type":"string","description":"Target valid time (ISO 8601). Supply this or the legacy `validTime` alias.","example":"2026-05-29T14:00:00Z"},"required":false,"name":"validAt","in":"query"},{"schema":{"type":"string","description":"Legacy alias for `validAt`, read only when `validAt` is absent. Prefer `validAt`."},"required":false,"name":"validTime","in":"query"},{"schema":{"type":"string","enum":["temperature_c","precip_probability_pct","precip_amount_mm","wind_speed_kph","wind_gust_kph","humidity_pct"],"description":"Forecast variable to analyze. Defaults to `temperature_c`."},"required":false,"name":"variable","in":"query"},{"schema":{"type":["number","null"],"description":"Match window around the forecast time, clamped to 1–180. Defaults to 30."},"required":false,"name":"forecastToleranceMinutes","in":"query"},{"schema":{"type":["number","null"],"description":"Match window around the observation time, clamped to 1–360. Defaults to 60."},"required":false,"name":"actualToleranceMinutes","in":"query"},{"schema":{"type":["number","null"],"description":"Maximum verification rows, clamped to 1–500. Defaults to 200."},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","enum":["nws_station","self","combined"],"description":"Truth source for the comparison. Defaults to `nws_station`."},"required":false,"name":"referenceMode","in":"query"},{"schema":{"type":"string","enum":["weatherkit","open_meteo","tomorrow_io","visual_crossing","nws_api"],"description":"Provider used when `referenceMode` is `self` or `combined`. Defaults to `nws_api`."},"required":false,"name":"referenceSourceId","in":"query"},{"schema":{"type":"string","enum":["false"],"description":"Pass `false` to allow verification without a station match. Any other value — including `true` — leaves the server default in place."},"required":false,"name":"stationRequired","in":"query"}],"responses":{"200":{"description":"Account/location-scoped Weather Ledger information.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountDataEnvelope"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/raw":{"get":{"summary":"List saved raw payload evidence","description":"List sanitized raw-provider payload metadata. Every parameter is optional; without a `locationId` a caller without live-ledger access receives an empty list rather than an error.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_raw","parameters":[{"schema":{"type":"string","description":"Restrict to one collector source id.","example":"weatherkit"},"required":false,"name":"sourceId","in":"query"},{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":false,"name":"locationId","in":"query"},{"schema":{"type":["number","null"],"description":"Maximum payload rows to return. Defaults to 50."},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Account/location-scoped Weather Ledger information.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountDataEnvelope"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/telemetry/freshness":{"get":{"summary":"Read telemetry freshness","description":"Per-source freshness for one location over a trailing window.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_telemetry_freshness","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"},{"schema":{"type":["number","null"],"description":"Trailing window in days. Defaults to 7."},"required":false,"name":"days","in":"query"}],"responses":{"200":{"description":"Account/location-scoped Weather Ledger information.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountDataEnvelope"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/telemetry/recent":{"get":{"summary":"Read recent telemetry","description":"Recent telemetry readings for one location over a trailing window.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_telemetry_recent","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"},{"schema":{"type":["number","null"],"description":"Trailing window in hours. Defaults to 24."},"required":false,"name":"hours","in":"query"}],"responses":{"200":{"description":"Account/location-scoped Weather Ledger information.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountDataEnvelope"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/timemachine":{"get":{"deprecated":true,"summary":"Read legacy Time Machine data","description":"Legacy Time Machine read for one variable. Responses are hard-capped at 2,000 rows and report `limit` plus `truncated`; prefer `/api/weather-ledger/time-machine/snapshot` for a compact, modern answer.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_timemachine","parameters":[{"schema":{"type":"string","description":"Ledger location id. Required when signed in; ignored in signed-out example mode.","example":"example-ledger-coastal-ridge"},"required":true,"name":"locationId","in":"query"},{"schema":{"type":"string","enum":["temperature_c","precip_probability_pct","precip_amount_mm","wind_speed_kph","wind_gust_kph","humidity_pct"],"description":"Forecast variable to analyze. Defaults to `temperature_c`."},"required":false,"name":"variable","in":"query"},{"schema":{"type":"string","description":"Valid time to center on (ISO 8601). Optional — omitting it returns the unscoped series. This route reads `validTime` only; it does not accept the `validAt` spelling.","example":"2026-05-29T14:00:00Z"},"required":false,"name":"validTime","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":2000,"description":"Maximum series rows to return. Default 1,000; hard maximum 2,000.","example":1000},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Account/location-scoped Weather Ledger information.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountDataEnvelope"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/raw/{id}":{"get":{"summary":"Read one saved raw payload","description":"Returns one sanitized raw-provider payload only when its location is visible to the caller. If legacy filesystem or object bytes cannot be read, metadata still returns with `body: null` and an explicit `body_unavailable_reason`.","tags":["Weather Ledger"],"operationId":"get_api_weather_ledger_raw_id","parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Sanitized raw payload evidence.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountDataEnvelope"}}}},"400":{"description":"Invalid or missing query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"The location is not available for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Payload not found in the caller’s scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Upstream provider failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/ai-sql/reports":{"get":{"summary":"List saved agentic reports","description":"Read-only access to account-owned saved agent work. Creating, editing, running, or deleting work remains outside this GET operation.","tags":["Saved Agent Work"],"operationId":"get_api_weather_ledger_ai_sql_reports","parameters":[{"schema":{"type":["number","null"],"description":"Page size, snapped up to the next of 10, 25, 50, 100, 200; values above 200 clamp to 200. Defaults to 25."},"required":false,"name":"limit","in":"query"},{"schema":{"type":["number","null"],"description":"Rows to skip for pagination. Truncated to an integer and floored at 0. Defaults to 0."},"required":false,"name":"offset","in":"query"},{"schema":{"type":"string","enum":["created-desc","created-asc","updated-desc","title-asc","steps-desc"],"description":"Sort order. Defaults to `created-desc`."},"required":false,"name":"sort","in":"query"},{"schema":{"type":"string","description":"Filter to one tag (case-insensitive exact match). Empty selects all; the sentinel `__untagged` selects reports with no tags."},"required":false,"name":"tag","in":"query"},{"schema":{"type":"string","enum":["all","today","7d","30d"],"description":"Created-date window. Defaults to `all`."},"required":false,"name":"date","in":"query"},{"schema":{"type":"string","description":"Location-scope filter: `any`, `focused` (single-location reports), `multi`, or `location:<id>`. Unrecognized values match everything."},"required":false,"name":"scope","in":"query"},{"schema":{"type":"string","description":"ISO instant marking the caller-local start of \"today\". Read only when `date=today`; otherwise the server-local midnight is used."},"required":false,"name":"todayStart","in":"query"}],"responses":{"200":{"description":"Account-owned saved agent work.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedAgentWorkEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/ai-sql/reports/summary":{"get":{"summary":"Summarize the saved report library","description":"Read-only access to account-owned saved agent work. Creating, editing, running, or deleting work remains outside this GET operation.","tags":["Saved Agent Work"],"operationId":"get_api_weather_ledger_ai_sql_reports_summary","responses":{"200":{"description":"Account-owned saved agent work.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedAgentWorkEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/ai-sql/run-books":{"get":{"summary":"List saved Run Books","description":"Read-only access to account-owned saved agent work. Creating, editing, running, or deleting work remains outside this GET operation.","tags":["Saved Agent Work"],"operationId":"get_api_weather_ledger_ai_sql_run_books","responses":{"200":{"description":"Account-owned saved agent work.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedAgentWorkEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/ai-sql/dashboards":{"get":{"summary":"List saved dashboards","description":"Read-only access to account-owned saved agent work. Creating, editing, running, or deleting work remains outside this GET operation.","tags":["Saved Agent Work"],"operationId":"get_api_weather_ledger_ai_sql_dashboards","responses":{"200":{"description":"Account-owned saved agent work.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedAgentWorkEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/ai-sql/insights":{"get":{"summary":"List saved insights","description":"Read-only access to account-owned saved agent work. Creating, editing, running, or deleting work remains outside this GET operation.","tags":["Saved Agent Work"],"operationId":"get_api_weather_ledger_ai_sql_insights","responses":{"200":{"description":"Account-owned saved agent work.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedAgentWorkEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/ai-sql/reports/{id}":{"get":{"summary":"Read one saved agentic report","description":"Read one account-owned saved report. report.chartEvidence exposes the same composite-chart warnings and unavailable states as live/PNG rendering; preserve these limitations when interpreting the retained evidence.","tags":["Saved Agent Work"],"operationId":"get_api_weather_ledger_ai_sql_reports_id","parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Account-owned saved artifact.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedReportDetailEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Artifact not found in the caller’s scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/ai-sql/reports/summary/{id}":{"get":{"summary":"Read one saved report summary","description":"Read-only access to one account-owned saved artifact.","tags":["Saved Agent Work"],"operationId":"get_api_weather_ledger_ai_sql_reports_summary_id","parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Account-owned saved artifact.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedAgentWorkEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Artifact not found in the caller’s scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/ai-sql/run-books/{id}":{"get":{"summary":"Read one saved Run Book","description":"Read-only access to one account-owned saved artifact.","tags":["Saved Agent Work"],"operationId":"get_api_weather_ledger_ai_sql_run_books_id","parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Account-owned saved artifact.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedAgentWorkEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Artifact not found in the caller’s scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/ai-sql/dashboards/{id}":{"get":{"summary":"Read one saved dashboard","description":"Read-only access to one account-owned saved artifact.","tags":["Saved Agent Work"],"operationId":"get_api_weather_ledger_ai_sql_dashboards_id","parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Account-owned saved artifact.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedAgentWorkEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Artifact not found in the caller’s scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/ai-sql/insights/{id}":{"get":{"summary":"Read one saved insight","description":"Read-only access to one account-owned saved artifact.","tags":["Saved Agent Work"],"operationId":"get_api_weather_ledger_ai_sql_insights_id","parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Account-owned saved artifact.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedAgentWorkEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Artifact not found in the caller’s scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/weather-ledger/ai-sql/insights/{id}/run":{"get":{"summary":"Run one owned saved insight and read its current evidence","description":"Executes only the authenticated account’s saved SQL through the read-only guard, location authorization, row limit and statement timeout. Report pins and fixed focus take precedence over locationId. Returns scoped rows and the same chartEvidence warnings/unavailable states and result.plausibilityWarnings physical-value review prompts as the UI; preserve both trust signals and do not silently correct returned values. presentation carries the card wording resolved for this run’s locations and staticPlaceWarning when saved wording may name another place. No caller-authored SQL, provider calls or artifact creation. Appends an account-owned query activity log on each run, so this GET is not read-only or idempotent.","tags":["Saved Agent Work"],"operationId":"get_api_weather_ledger_ai_sql_insights_id_run","parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":256,"description":"Optional owned location for a follow-page card. Omit for the account default; pinned and fixed cards retain their saved focus."},"required":false,"name":"locationId","in":"query"}],"responses":{"200":{"description":"Current bounded saved-query result and chart evidence; private, no-store.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedInsightRunEnvelope"}}}},"400":{"description":"Invalid query parameter, rejected SQL or execution failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Account sign-in or API key required, or the presented API key is expired/revoked/invalid (see the `code` field: api_key_expired, api_key_revoked, api_key_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Location not owned by this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Insight not found in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"Saved focus or report pin is no longer authorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}}},"webhooks":{}}