{
 "openapi": "3.1.0",
 "info": {
  "title": "groundhog.markets API",
  "version": "1.2.0",
  "summary": "Every free forecast for a place in one call, plus weather markets.",
  "description": "Forecast blends of every open forecast and Kalshi/Polymarket weather markets (settlement station, rule, so far, result; no prices). Text bodies (md, tsv) are the default; format=json or Accept: application/json for JSON. 120 units/min per client: 1 per place, 2 per lat,lon. Guide: https://groundhog.markets/llms.txt. Keep the credits and link the page URL when you repeat numbers.",
  "termsOfService": "https://groundhog.markets/about",
  "license": {
   "name": "Per source; see /credits",
   "url": "https://groundhog.markets/credits"
  }
 },
 "servers": [
  {
   "url": "https://groundhog.markets"
  }
 ],
 "externalDocs": {
  "description": "Guide for agents",
  "url": "https://groundhog.markets/llms.txt"
 },
 "paths": {
  "/api/v1/blend": {
   "get": {
    "operationId": "getForecast",
    "summary": "Forecast blend for one or more places",
    "description": "line (one day, md) | week | table (every source) | series; up to 10 places for line/week.",
    "parameters": [
     {
      "name": "place",
      "in": "query",
      "required": false,
      "description": "Slug (new-york-city), name (Paris), 'City, ST' (Portland, OR), 'City, Country' (Paris, France), ICAO or IATA code (KORD, LAX) or 'lat,lon' (40.7,-74.0). Repeat up to 10 times for line and week. Or lat= + lon= (latitude, longitude, lng also work). An ambiguous name answers the most populous match and lists the others under Also.",
      "schema": {
       "type": "array",
       "items": {
        "type": "string"
       },
       "minItems": 1,
       "maxItems": 10
      },
      "style": "form",
      "explode": true
     },
     {
      "name": "date",
      "in": "query",
      "required": false,
      "description": "today | tomorrow | +N or N (0-7) | YYYY-MM-DD. Each place's own local date: a multi-place call can mix calendar days. Default: today before 15:00 local, else tomorrow. Today = rest of day.",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "days",
      "in": "query",
      "required": false,
      "description": "1-7: days in week and table (default 7).",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 7
      }
     },
     {
      "name": "size",
      "in": "query",
      "required": false,
      "description": "line (one day, one paragraph) | week (one row per day) | table (every source by day) | series (hourly 2 m temperature per source). runs = each source's newest runs by day with run_utc and fetched_at (one place; NBM adds XND, P12, Q12).",
      "schema": {
       "type": "string",
       "enum": [
        "line",
        "week",
        "table",
        "series",
        "runs"
       ]
      }
     },
     {
      "name": "format",
      "in": "query",
      "required": false,
      "description": "md | tsv | json. Default: md for line, tsv otherwise.",
      "schema": {
       "type": "string",
       "enum": [
        "md",
        "tsv",
        "json"
       ]
      }
     },
     {
      "name": "units",
      "in": "query",
      "required": false,
      "description": "F | C. Default F in the US, else C. Rain is inches (0.01) with F, mm (0.1) with C; JSON keeps mm and adds in.",
      "schema": {
       "type": "string",
       "enum": [
        "F",
        "C"
       ]
      }
     },
     {
      "name": "hours",
      "in": "query",
      "required": false,
      "description": "series only: 24-168 (72).",
      "schema": {
       "type": "integer",
       "minimum": 24,
       "maximum": 168
      }
     },
     {
      "name": "step",
      "in": "query",
      "required": false,
      "description": "series step hours: temp 3, rain 6",
      "schema": {
       "type": "integer",
       "enum": [
        1,
        3,
        6
       ]
      }
     },
     {
      "name": "include_6h",
      "in": "query",
      "required": false,
      "description": "1 = count 6-hourly (~) days in hi/lo too.",
      "schema": {
       "type": "integer",
       "enum": [
        0,
        1
       ]
      }
     },
     {
      "name": "all",
      "in": "query",
      "required": false,
      "description": "1 = table also shows twins and stale rows.",
      "schema": {
       "type": "integer",
       "enum": [
        0,
        1
       ]
      }
     },
     {
      "name": "credits",
      "in": "query",
      "required": false,
      "description": "compact (default for line/week) | full (default for table/series) | short (public only): the form of the credit line.",
      "schema": {
       "type": "string",
       "enum": [
        "compact",
        "full",
        "short"
       ]
      }
     },
     {
      "name": "lat",
      "in": "query",
      "required": false,
      "description": "Latitude, with lon instead of place.",
      "schema": {
       "type": "number",
       "minimum": -90,
       "maximum": 90
      }
     },
     {
      "name": "lon",
      "in": "query",
      "required": false,
      "description": "Longitude, with lat instead of place.",
      "schema": {
       "type": "number",
       "minimum": -180,
       "maximum": 180
      }
     },
     {
      "name": "runs",
      "in": "query",
      "required": false,
      "description": "size=runs: newest runs per source, 1-4 (1).",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 4
      }
     },
     {
      "name": "variable",
      "in": "query",
      "required": false,
      "description": "temp (default) | rain",
      "schema": {
       "type": "string",
       "enum": [
        "temp",
        "rain"
       ]
      }
     },
     {
      "name": "win",
      "in": "query",
      "required": false,
      "description": "rain: lst (climate day at a daily-rain settle station) | cal (calendar day)",
      "schema": {
       "type": "string",
       "enum": [
        "lst",
        "cal"
       ]
      }
     },
     {
      "name": "stn",
      "in": "query",
      "required": false,
      "description": "rain: a settle station of the place, e.g. KORD",
      "schema": {
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Forecast blend for one or more places",
      "content": {
       "text/markdown": {
        "schema": {
         "type": "string"
        }
       },
       "text/tab-separated-values": {
        "schema": {
         "type": "string"
        }
       },
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/blend"
        }
       }
      }
     },
     "400": {
      "description": "bad_param: lists the valid params or values.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "404": {
      "description": "unknown_place: try / search say where to look.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "422": {
      "description": "out_of_range: a date outside the stored days (each place's local date).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "429": {
      "description": "rate_limited: Retry-After and RateLimit-* headers.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "503": {
      "description": "warming_up or overloaded: Retry-After.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/markets": {
   "get": {
    "operationId": "getMarkets",
    "summary": "Weather markets of a place, or every market city",
    "description": "Each Kalshi and Polymarket high, low and rain market: settlement station and rule, the value so far under the venue's own rule and unit, ours and the result once settled, forecast at the station. No prices.",
    "parameters": [
     {
      "name": "place",
      "in": "query",
      "required": false,
      "description": "as /api/v1/blend (slug, name, 'City, ST', ICAO); repeat up to 10. Omitted: every market city (the index; costs 10 units)",
      "schema": {
       "type": "array",
       "items": {
        "type": "string"
       },
       "minItems": 1,
       "maxItems": 10
      },
      "style": "form",
      "explode": true
     },
     {
      "name": "family",
      "in": "query",
      "required": false,
      "description": "high | low | rain | all (default all)",
      "schema": {
       "type": "string",
       "enum": [
        "high",
        "low",
        "rain",
        "all"
       ]
      }
     },
     {
      "name": "date",
      "in": "query",
      "required": false,
      "description": "today | tomorrow | yesterday | YYYY-MM-DD, each place's local date (default today)",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "size",
      "in": "query",
      "required": false,
      "description": "line (one paragraph per place; default with place) | table (one TSV table; default without)",
      "schema": {
       "type": "string",
       "enum": [
        "line",
        "table"
       ]
      }
     },
     {
      "name": "format",
      "in": "query",
      "required": false,
      "description": "md | tsv | json (line md, table tsv)",
      "schema": {
       "type": "string",
       "enum": [
        "md",
        "tsv",
        "json"
       ]
      }
     },
     {
      "name": "credits",
      "in": "query",
      "required": false,
      "description": "compact (default) | full",
      "schema": {
       "type": "string",
       "enum": [
        "compact",
        "full",
        "short"
       ]
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Weather markets of a place, or every market city",
      "content": {
       "text/markdown": {
        "schema": {
         "type": "string"
        }
       },
       "text/tab-separated-values": {
        "schema": {
         "type": "string"
        }
       },
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/markets"
        }
       }
      }
     },
     "400": {
      "description": "bad_param: lists the valid params or values.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "404": {
      "description": "unknown_place: try / search say where to look.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "422": {
      "description": "out_of_range: a date outside the stored days (each place's local date).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "429": {
      "description": "rate_limited: Retry-After and RateLimit-* headers.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "503": {
      "description": "warming_up or overloaded: Retry-After.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/receipts": {
   "get": {
    "operationId": "getReceipts",
    "summary": "Our settle value vs the venue's result",
    "description": "Per product and rule version, last 30 days, with every miss.",
    "parameters": [
     {
      "name": "days",
      "in": "query",
      "required": false,
      "description": "last N days (1-30, default 30)",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 30
      }
     },
     {
      "name": "venue",
      "in": "query",
      "required": false,
      "description": "kalshi | polymarket",
      "schema": {
       "type": "string",
       "enum": [
        "kalshi",
        "polymarket"
       ]
      }
     },
     {
      "name": "family",
      "in": "query",
      "required": false,
      "description": "high | low | rain | all",
      "schema": {
       "type": "string",
       "enum": [
        "high",
        "low",
        "rain",
        "all"
       ]
      }
     },
     {
      "name": "format",
      "in": "query",
      "required": false,
      "description": "tsv (default) | md | json",
      "schema": {
       "type": "string",
       "enum": [
        "md",
        "tsv",
        "json"
       ]
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Our settle value vs the venue's result",
      "content": {
       "text/markdown": {
        "schema": {
         "type": "string"
        }
       },
       "text/tab-separated-values": {
        "schema": {
         "type": "string"
        }
       },
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/receipts"
        }
       }
      }
     },
     "400": {
      "description": "bad_param: lists the valid params or values.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "404": {
      "description": "unknown_place: try / search say where to look.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "422": {
      "description": "out_of_range: a date outside the stored days (each place's local date).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "429": {
      "description": "rate_limited: Retry-After and RateLimit-* headers.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "503": {
      "description": "warming_up or overloaded: Retry-After.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/places": {
   "get": {
    "operationId": "searchPlaces",
    "summary": "Find a place",
    "description": "q = name, City, ST, ICAO or lat,lon.",
    "parameters": [
     {
      "name": "q",
      "in": "query",
      "required": true,
      "description": "What to find.",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "description": "1-10 (5)",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 10
      }
     },
     {
      "name": "format",
      "in": "query",
      "required": false,
      "description": "tsv | json",
      "schema": {
       "type": "string",
       "enum": [
        "tsv",
        "json"
       ]
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Find a place",
      "content": {
       "text/tab-separated-values": {
        "schema": {
         "type": "string"
        }
       },
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/places"
        }
       }
      }
     },
     "400": {
      "description": "bad_param: lists the valid params or values.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "404": {
      "description": "unknown_place: try / search say where to look.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "422": {
      "description": "out_of_range: a date outside the stored days (each place's local date).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "429": {
      "description": "rate_limited: Retry-After and RateLimit-* headers.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "503": {
      "description": "warming_up or overloaded: Retry-After.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/sources": {
   "get": {
    "operationId": "listSources",
    "summary": "Sources, licences, freshness",
    "description": "Every live source.",
    "parameters": [
     {
      "name": "format",
      "in": "query",
      "required": false,
      "description": "tsv | json",
      "schema": {
       "type": "string",
       "enum": [
        "tsv",
        "json"
       ]
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Sources, licences, freshness",
      "content": {
       "text/tab-separated-values": {
        "schema": {
         "type": "string"
        }
       },
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/sources"
        }
       }
      }
     },
     "400": {
      "description": "bad_param: lists the valid params or values.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "404": {
      "description": "unknown_place: try / search say where to look.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "422": {
      "description": "out_of_range: a date outside the stored days (each place's local date).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "429": {
      "description": "rate_limited: Retry-After and RateLimit-* headers.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "503": {
      "description": "warming_up or overloaded: Retry-After.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/status": {
   "get": {
    "operationId": "getStatus",
    "summary": "Source and job health",
    "description": "Health of every source and job.",
    "parameters": [
     {
      "name": "format",
      "in": "query",
      "required": false,
      "description": "tsv | json",
      "schema": {
       "type": "string",
       "enum": [
        "tsv",
        "json"
       ]
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Source and job health",
      "content": {
       "text/tab-separated-values": {
        "schema": {
         "type": "string"
        }
       },
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/status"
        }
       }
      }
     },
     "400": {
      "description": "bad_param: lists the valid params or values.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "404": {
      "description": "unknown_place: try / search say where to look.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "422": {
      "description": "out_of_range: a date outside the stored days (each place's local date).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "429": {
      "description": "rate_limited: Retry-After and RateLimit-* headers.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "503": {
      "description": "warming_up or overloaded: Retry-After.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1": {
   "get": {
    "operationId": "getIndex",
    "summary": "Endpoint index",
    "description": "The endpoints of /api/v1.",
    "parameters": [
     {
      "name": "format",
      "in": "query",
      "required": false,
      "description": "tsv | json",
      "schema": {
       "type": "string",
       "enum": [
        "tsv",
        "json"
       ]
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Endpoint index",
      "content": {
       "text/tab-separated-values": {
        "schema": {
         "type": "string"
        }
       },
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/index"
        }
       }
      }
     },
     "400": {
      "description": "bad_param: lists the valid params or values.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "404": {
      "description": "unknown_place: try / search say where to look.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "422": {
      "description": "out_of_range: a date outside the stored days (each place's local date).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "429": {
      "description": "rate_limited: Retry-After and RateLimit-* headers.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "503": {
      "description": "warming_up or overloaded: Retry-After.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/schema.json": {
   "get": {
    "operationId": "getSchema",
    "summary": "JSON Schema of every JSON body",
    "responses": {
     "200": {
      "description": "JSON Schema 2020-12",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     }
    }
   }
  },
  "/credits": {
   "get": {
    "operationId": "getCredits",
    "summary": "Every credit line",
    "responses": {
     "200": {
      "description": "Credit lines",
      "content": {
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/nbm": {
   "get": {
    "operationId": "getNbm",
    "summary": "NBM text columns of one run + the day view",
    "description": "Raw NBE/NBS columns (valid_utc, fhr, el, v as published) and the day view the Kalshi books read. run=latest from the live store; past runs from history. 1 unit.",
    "parameters": [
     {
      "name": "stn",
      "in": "query",
      "required": true,
      "description": "Station ICAO (NBM text covers US stations).",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "prod",
      "in": "query",
      "required": false,
      "description": "nbe (default) | nbs",
      "schema": {
       "type": "string",
       "enum": [
        "nbe",
        "nbs"
       ]
      }
     },
     {
      "name": "run",
      "in": "query",
      "required": false,
      "description": "One run (UTC, YYYY-MM-DDTHH:MMZ).",
      "schema": {
       "type": "string",
       "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}Z)?$"
      }
     },
     {
      "name": "lead",
      "in": "query",
      "required": false,
      "description": "The run issued N UTC days before each date.",
      "schema": {
       "type": "integer",
       "minimum": 0,
       "maximum": 15
      }
     },
     {
      "name": "cycle",
      "in": "query",
      "required": false,
      "description": "With lead: only runs at H UTC.",
      "schema": {
       "type": "integer",
       "minimum": 0,
       "maximum": 23
      }
     },
     {
      "name": "date",
      "in": "query",
      "required": false,
      "description": "Target local date: its day view only (needed with lead).",
      "schema": {
       "type": "string",
       "format": "date"
      }
     },
     {
      "name": "format",
      "in": "query",
      "required": false,
      "description": "tsv (default) | json",
      "schema": {
       "type": "string",
       "enum": [
        "tsv",
        "json"
       ]
      }
     }
    ],
    "responses": {
     "200": {
      "description": "NBM text columns of one run + the day view",
      "content": {
       "text/tab-separated-values": {
        "schema": {
         "type": "string"
        }
       },
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/nbm"
        }
       }
      }
     },
     "400": {
      "description": "bad_param: lists the valid params or values.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "404": {
      "description": "unknown_place: try / search say where to look.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "422": {
      "description": "out_of_range: a date outside the stored days (each place's local date).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "429": {
      "description": "rate_limited: Retry-After and RateLimit-* headers.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "503": {
      "description": "warming_up or overloaded: Retry-After.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/history": {
   "get": {
    "operationId": "getHistory",
    "summary": "As-issued history (backtests, no look-ahead)",
    "description": "Rows as issued with fetched_at and origin (bf:* = backfilled). from..to <= 366 days; ceil(days / 31) units; over 200,000 rows -> 422 with the bulk-file hint.",
    "parameters": [
     {
      "name": "kind",
      "in": "query",
      "required": false,
      "description": "daily (default) | nbm | obs",
      "schema": {
       "type": "string",
       "enum": [
        "daily",
        "nbm",
        "obs"
       ]
      }
     },
     {
      "name": "place",
      "in": "query",
      "required": false,
      "description": "kind=daily: slug, name or ICAO; nbm/obs: its primary station.",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "stn",
      "in": "query",
      "required": false,
      "description": "kind=nbm, obs: station ICAO.",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "from",
      "in": "query",
      "required": true,
      "description": "First target date.",
      "schema": {
       "type": "string",
       "format": "date"
      }
     },
     {
      "name": "to",
      "in": "query",
      "required": false,
      "description": "Last target date (from).",
      "schema": {
       "type": "string",
       "format": "date"
      }
     },
     {
      "name": "source",
      "in": "query",
      "required": false,
      "description": "kind=daily: source ids, comma list.",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "prod",
      "in": "query",
      "required": false,
      "description": "kind=nbm: nbe | nbs",
      "schema": {
       "type": "string",
       "enum": [
        "nbe",
        "nbs"
       ]
      }
     },
     {
      "name": "els",
      "in": "query",
      "required": false,
      "description": "kind=nbm: elements, comma list (TXN,XND,P12,Q12,TMP).",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "view",
      "in": "query",
      "required": false,
      "description": "kind=nbm: raw (default) | day",
      "schema": {
       "type": "string",
       "enum": [
        "raw",
        "day"
       ]
      }
     },
     {
      "name": "product",
      "in": "query",
      "required": false,
      "description": "kind=obs: CLI | METAR_R | ASOS",
      "schema": {
       "type": "string",
       "enum": [
        "CLI",
        "METAR_R",
        "ASOS"
       ]
      }
     },
     {
      "name": "run",
      "in": "query",
      "required": false,
      "description": "One run (UTC, YYYY-MM-DDTHH:MMZ).",
      "schema": {
       "type": "string",
       "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}Z)?$"
      }
     },
     {
      "name": "lead",
      "in": "query",
      "required": false,
      "description": "The run issued N UTC days before each date.",
      "schema": {
       "type": "integer",
       "minimum": 0,
       "maximum": 15
      }
     },
     {
      "name": "cycle",
      "in": "query",
      "required": false,
      "description": "With lead: only runs at H UTC.",
      "schema": {
       "type": "integer",
       "minimum": 0,
       "maximum": 23
      }
     },
     {
      "name": "asof",
      "in": "query",
      "required": false,
      "description": "The newest run groundhog had by this UTC time (no look-ahead).",
      "schema": {
       "type": "string",
       "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}Z)?$"
      }
     },
     {
      "name": "format",
      "in": "query",
      "required": false,
      "description": "tsv (default) | json",
      "schema": {
       "type": "string",
       "enum": [
        "tsv",
        "json"
       ]
      }
     }
    ],
    "responses": {
     "200": {
      "description": "As-issued history (backtests, no look-ahead)",
      "content": {
       "text/tab-separated-values": {
        "schema": {
         "type": "string"
        }
       },
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/history"
        }
       }
      }
     },
     "400": {
      "description": "bad_param: lists the valid params or values.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "404": {
      "description": "unknown_place: try / search say where to look.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "422": {
      "description": "out_of_range: a date outside the stored days (each place's local date).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "429": {
      "description": "rate_limited: Retry-After and RateLimit-* headers.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "503": {
      "description": "warming_up or overloaded: Retry-After.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/history/files": {
   "get": {
    "operationId": "listHistoryFiles",
    "summary": "Bulk history files",
    "description": "gzip TSV per day and per month: path, kind, period, table, rows, bytes, sha256, url. 1 unit.",
    "parameters": [
     {
      "name": "kind",
      "in": "query",
      "required": false,
      "description": "day | month",
      "schema": {
       "type": "string",
       "enum": [
        "day",
        "month"
       ]
      }
     },
     {
      "name": "format",
      "in": "query",
      "required": false,
      "description": "tsv (default) | json",
      "schema": {
       "type": "string",
       "enum": [
        "tsv",
        "json"
       ]
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Bulk history files",
      "content": {
       "text/tab-separated-values": {
        "schema": {
         "type": "string"
        }
       },
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/history_files"
        }
       }
      }
     },
     "400": {
      "description": "bad_param: lists the valid params or values.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "404": {
      "description": "unknown_place: try / search say where to look.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "422": {
      "description": "out_of_range: a date outside the stored days (each place's local date).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "429": {
      "description": "rate_limited: Retry-After and RateLimit-* headers.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "503": {
      "description": "warming_up or overloaded: Retry-After.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/error"
        }
       },
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/history/files/{path}": {
   "get": {
    "operationId": "getHistoryFile",
    "summary": "One bulk history file (gzip TSV)",
    "description": "ETag = its sha256; If-None-Match -> 304. 1 unit.",
    "parameters": [
     {
      "name": "path",
      "in": "path",
      "required": true,
      "description": "A path from the list.",
      "schema": {
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "The file",
      "content": {
       "application/gzip": {
        "schema": {
         "type": "string",
         "contentMediaType": "application/gzip"
        }
       }
      }
     },
     "304": {
      "description": "Not modified"
     },
     "404": {
      "description": "No such file."
     },
     "429": {
      "description": "rate_limited"
     },
     "503": {
      "description": "History not available yet."
     }
    }
   }
  }
 },
 "components": {
  "schemas": {
   "body": {
    "type": "object",
    "properties": {
     "v": {
      "const": 1,
      "description": "Body version (1). /api/v1 bodies only gain fields."
     },
     "size": {
      "enum": [
       "line",
       "week",
       "table",
       "series"
      ],
      "description": "line (one day) | week (one row per day) | table (every source by day) | series (hourly 2 m temperature)."
     },
     "asof": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$",
      "description": "When this blend was built (UTC)."
     },
     "forecast_updated": {
      "anyOf": [
       {
        "type": "string",
        "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
       },
       {
        "type": "null"
       }
      ],
      "description": "When the newest counted forecast became available (UTC)."
     },
     "next_update": {
      "anyOf": [
       {
        "type": "string",
        "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
       },
       {
        "type": "null"
       }
      ],
      "description": "The next scheduled run of this place's sources (UTC): expected, not promised; null when none is scheduled or every one is over 60 min late. A past next_update or an overdue run adds a note starting 'update due:' or 'update overdue:'."
     },
     "place": {
      "type": "object",
      "properties": {
       "slug": {
        "type": "string",
        "description": "Slug of the place (its page is /p/{slug})."
       },
       "display": {
        "type": "string",
        "description": "Display name: city, region, country."
       },
       "name": {
        "type": "string",
        "description": "Place name."
       },
       "cc": {
        "type": "string",
        "description": "ISO 3166-1 alpha-2 country code."
       },
       "admin1": {
        "type": [
         "string",
         "null"
        ],
        "description": "First-level region (US state code), or null."
       },
       "stn": {
        "type": [
         "string",
         "null"
        ],
        "description": "ICAO of the forecast station; null for a grid point."
       },
       "label": {
        "type": [
         "string",
         "null"
        ],
        "description": "Station label shown on pages (· joined)."
       },
       "tz": {
        "type": "string",
        "description": "IANA time zone; dates are local to it."
       },
       "lat": {
        "type": "number",
        "description": "Latitude of the forecast point."
       },
       "lon": {
        "type": "number",
        "description": "Longitude of the forecast point."
       },
       "coverage": {
        "enum": [
         "full",
         "partial",
         "grid"
        ],
        "description": "full (every source) | partial (more sources by the next cycle) | grid (global models only)."
       },
       "snapped_km": {
        "type": [
         "number",
         "null"
        ],
        "description": "A lat,lon snapped to a place: the distance in km; else null."
       },
       "nearest": {
        "anyOf": [
         {
          "type": "array",
          "prefixItems": [
           {
            "type": "string"
           },
           {
            "type": "string"
           },
           {
            "type": "number"
           }
          ],
          "minItems": 3,
          "maxItems": 3
         },
         {
          "type": "null"
         }
        ],
        "description": "Grid points: [slug, display, km] of the nearest full blend; else null."
       },
       "also": {
        "type": "array",
        "items": {
         "type": "string"
        },
        "description": "Other places with the same name (slugs)."
       },
       "via": {
        "type": [
         "string",
         "null"
        ],
        "description": "The ICAO you asked for when it is not this answer's station; null otherwise."
       }
      },
      "required": [
       "slug",
       "display",
       "name",
       "cc",
       "admin1",
       "stn",
       "label",
       "tz",
       "lat",
       "lon",
       "coverage",
       "snapped_km",
       "nearest",
       "also",
       "via"
      ],
      "additionalProperties": false,
      "description": "The place answered."
     },
     "url": {
      "type": "string",
      "pattern": "^https?://\\S+$",
      "description": "The page that shows this answer; link it when you cite numbers."
     },
     "units": {
      "enum": [
       "F",
       "C"
      ],
      "description": "F or C: temperatures in these units; rain in inches (F) or mm (C)."
     },
     "date": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "The local date the answer starts at (YYYY-MM-DD)."
     },
     "when": {
      "type": [
       "string",
       "null"
      ],
      "description": "today | tomorrow | +N | past, at the request time in the place's time zone."
     },
     "days": {
      "anyOf": [
       {
        "type": "array",
        "items": {
         "type": "object",
         "properties": {
          "date": {
           "type": "string",
           "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
           "description": "Local date."
          },
          "when": {
           "type": [
            "string",
            "null"
           ],
           "description": "today | tomorrow | +N | past."
          },
          "rest": {
           "type": "boolean",
           "description": "True for today: the rest of the day."
          },
          "hi": {
           "type": [
            "number",
            "null"
           ],
           "description": "Median daily high; today: max(observed so far, forecast)."
          },
          "lo": {
           "type": [
            "number",
            "null"
           ],
           "description": "Median daily low; today: min(observed so far, forecast)."
          },
          "hi_by": {
           "enum": [
            "obs",
            "fc",
            null
           ],
           "description": "Today only: obs (observed so far) or fc (forecast) set the high; else null."
          },
          "lo_by": {
           "enum": [
            "obs",
            "fc",
            null
           ],
           "description": "Today only: obs or fc set the low; else null."
          },
          "partial": {
           "type": "boolean",
           "description": "Today only: true when routine reports are missing from the observed part."
          },
          "hi_range": {
           "anyOf": [
            {
             "type": "array",
             "items": {
              "type": "number"
             },
             "minItems": 2,
             "maxItems": 2
            },
            {
             "type": "null"
            }
           ],
           "description": "[min, max] of the counted highs."
          },
          "lo_range": {
           "anyOf": [
            {
             "type": "array",
             "items": {
              "type": "number"
             },
             "minItems": 2,
             "maxItems": 2
            },
            {
             "type": "null"
            }
           ],
           "description": "[min, max] of the counted lows."
          },
          "n": {
           "type": "integer",
           "description": "Counted forecasts behind hi."
          },
          "n_lo": {
           "type": "integer",
           "description": "Counted forecasts behind lo."
          },
          "families": {
           "type": "integer",
           "description": "Distinct model groups counted."
          },
          "fam_hi": {
           "type": [
            "number",
            "null"
           ],
           "description": "Median of the group medians (high)."
          },
          "fam_lo": {
           "type": [
            "number",
            "null"
           ],
           "description": "Median of the group medians (low)."
          },
          "sampled_in": {
           "type": "boolean",
           "description": "True when 6-hourly (~) values are inside the median (fewer than 4 other rows remained)."
          },
          "pop": {
           "type": [
            "integer",
            "null"
           ],
           "description": "Chance of 0.25 mm (0.01 in) or more in the day, %; null below blend.pop_min_n sources."
          },
          "pop_n": {
           "type": "integer",
           "description": "Sources behind pop."
          },
          "mm": {
           "type": [
            "number",
            "null"
           ],
           "description": "Median daily rain total, mm."
          },
          "in": {
           "type": [
            "number",
            "null"
           ],
           "description": "The same in inches (0.01) with units=F; else null."
          },
          "mm_n": {
           "type": "integer",
           "description": "Sources behind mm."
          },
          "normal": {
           "anyOf": [
            {
             "type": "object",
             "properties": {
              "hi": {
               "type": "number",
               "description": "Normal high."
              },
              "lo": {
               "type": "number",
               "description": "Normal low."
              }
             },
             "required": [
              "hi",
              "lo"
             ],
             "additionalProperties": false
            },
            {
             "type": "null"
            }
           ],
           "description": "1991-2020 normal high/low at the station (US); else null."
          }
         },
         "required": [
          "date",
          "when",
          "rest",
          "hi",
          "lo",
          "hi_by",
          "lo_by",
          "partial",
          "hi_range",
          "lo_range",
          "n",
          "n_lo",
          "families",
          "fam_hi",
          "fam_lo",
          "sampled_in",
          "pop",
          "pop_n",
          "mm",
          "in",
          "mm_n",
          "normal"
         ],
         "additionalProperties": false
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "One entry per local day (line: 1, week/table: up to 7); null for series."
     },
     "sources": {
      "anyOf": [
       {
        "type": "array",
        "items": {
         "type": "object",
         "properties": {
          "id": {
           "type": "string",
           "description": "Row id (a twin carries *)."
          },
          "src": {
           "type": "string",
           "description": "Source id (/api/v1/sources)."
          },
          "stn": {
           "type": [
            "string",
            "null"
           ],
           "description": "Station of a station product; null for gridded sources."
          },
          "fam": {
           "type": "string",
           "description": "Model group."
          },
          "dd": {
           "enum": [
            "cal",
            "dn"
           ],
           "description": "cal = local calendar day; dn = high 07-19, low 19-08 local."
          },
          "run": {
           "type": "string",
           "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$",
           "description": "Model run or issue time (UTC)."
          },
          "kind": {
           "enum": [
            "run",
            "iss",
            "upd"
           ],
           "description": "Kind of value (point, station, ensemble, ...)."
          },
          "age_h": {
           "type": "number",
           "description": "Hours since the run, issue or update."
          },
          "status": {
           "enum": [
            "ok",
            "late",
            "stale"
           ],
           "description": "ok | stale | ...: freshness of the row."
          },
          "counted": {
           "type": "boolean",
           "description": "True when the row counts in the medians."
          },
          "twin": {
           "type": "boolean",
           "description": "True for another station of the same product (not counted)."
          },
          "pt_km": {
           "type": [
            "number",
            "null"
           ],
           "description": "Grid sources: km from the place to the grid point."
          },
          "terrain": {
           "type": "boolean",
           "description": "Grid point terrain note, or null."
          },
          "days": {
           "type": "array",
           "items": {
            "anyOf": [
             {
              "type": "object",
              "properties": {
               "hi": {
                "type": [
                 "number",
                 "null"
                ],
                "description": "The source's daily high (whole °F / 0.1 °C)."
               },
               "lo": {
                "type": [
                 "number",
                 "null"
                ],
                "description": "The source's daily low."
               },
               "pop": {
                "type": [
                 "integer",
                 "null"
                ],
                "description": "The source's chance of 0.25 mm or more, %, or null."
               },
               "pop_lb": {
                "type": "boolean",
                "description": "True when pop is a lower bound from a part of the day (never counted)."
               },
               "mm": {
                "type": [
                 "number",
                 "null"
                ],
                "description": "The source's daily rain total, mm."
               },
               "s": {
                "enum": [
                 0,
                 1
                ],
                "description": "True for a day built from 6-hourly values (~)."
               },
               "c": {
                "enum": [
                 0,
                 1
                ],
                "description": "True when counted in the medians that day."
               },
               "x": {
                "enum": [
                 0,
                 1
                ],
                "description": "True when left out of hi/lo (6-hourly, enough other rows)."
               }
              },
              "required": [
               "hi",
               "lo",
               "pop",
               "pop_lb",
               "mm",
               "s",
               "c",
               "x"
              ],
              "additionalProperties": false
             },
             {
              "type": "null"
             }
            ]
           },
           "description": "Per-day cells aligned with days[]; null where the source has no value."
          }
         },
         "required": [
          "id",
          "src",
          "stn",
          "fam",
          "dd",
          "run",
          "kind",
          "age_h",
          "status",
          "counted",
          "twin",
          "pt_km",
          "terrain",
          "days"
         ],
         "additionalProperties": false
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "table only: one row per source shown; null otherwise."
     },
     "series": {
      "anyOf": [
       {
        "type": "object",
        "properties": {
         "step_h": {
          "enum": [
           1,
           3,
           6
          ],
          "description": "Hours between rows."
         },
         "times": {
          "type": "array",
          "items": {
           "type": "string"
          },
          "description": "Local times (MM-DDTHH±hh)."
         },
         "times_iso": {
          "type": "array",
          "items": {
           "type": "string",
           "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}[+-]\\d{2}:\\d{2}$"
          },
          "description": "The same as ISO local times with offset."
         },
         "cols": {
          "type": "object",
          "additionalProperties": {
           "type": "array",
           "items": {
            "type": [
             "number",
             "null"
            ]
           }
          },
          "description": "Values per source (and ensemble _p10/_p90)."
         },
         "med": {
          "type": "array",
          "items": {
           "type": [
            "number",
            "null"
           ]
          },
          "description": "Median per row."
         },
         "n": {
          "type": "integer",
          "description": "Sources in the median."
         },
         "excluded": {
          "type": "array",
          "items": {
           "type": "string"
          },
          "description": "Counted sources left out of the series (they do not cover the window)."
         }
        },
        "required": [
         "step_h",
         "times",
         "times_iso",
         "cols",
         "med",
         "n",
         "excluded"
        ],
        "additionalProperties": false
       },
       {
        "type": "null"
       }
      ],
      "description": "series only: hourly 2 m temperature per source; null otherwise."
     },
     "now": {
      "anyOf": [
       {
        "type": "object",
        "properties": {
         "stn": {
          "type": "string",
          "description": "Reporting station."
         },
         "t": {
          "type": "number",
          "description": "Temperature in the body's units."
         },
         "at": {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$",
          "description": "Observation time (UTC)."
         },
         "age_h": {
          "type": "number",
          "description": "Hours from now.at to the body's asof (when the blend was built), not to the request: the live age is the request time minus now.at."
         },
         "flags": {
          "type": "array",
          "items": {
           "type": "string"
          },
          "description": "maint = the station's maintenance flag."
         }
        },
        "required": [
         "stn",
         "t",
         "at",
         "age_h",
         "flags"
        ],
        "additionalProperties": false
       },
       {
        "type": "null"
       }
      ],
      "description": "Latest observation at the station; null when none is recent (and for series)."
     },
     "alerts": {
      "anyOf": [
       {
        "type": "array",
        "items": {
         "type": "object",
         "properties": {
          "id": {
           "type": "string",
           "description": "Alert id at its feed."
          },
          "event": {
           "type": "string",
           "description": "Event name (Flood Warning, ...)."
          },
          "severity": {
           "type": [
            "string",
            "null"
           ],
           "description": "Extreme | Severe | Moderate | Minor | Unknown."
          },
          "onset": {
           "anyOf": [
            {
             "type": "string",
             "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
            },
            {
             "type": "null"
            }
           ],
           "description": "Start (UTC), or null."
          },
          "expires": {
           "anyOf": [
            {
             "type": "string",
             "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
            },
            {
             "type": "null"
            }
           ],
           "description": "End (UTC), or null (until further notice)."
          },
          "headline": {
           "type": [
            "string",
            "null"
           ],
           "description": "The issuer's headline."
          },
          "url": {
           "type": [
            "string",
            "null"
           ],
           "description": "The alert at its source."
          },
          "sender": {
           "type": [
            "string",
            "null"
           ],
           "description": "Issuing service."
          },
          "credit": {
           "type": "string",
           "description": "Credit key of the feed."
          }
         },
         "required": [
          "id",
          "event",
          "severity",
          "onset",
          "expires",
          "headline",
          "url",
          "sender",
          "credit"
         ],
         "additionalProperties": false
        }
       },
       {
        "type": "null"
       }
      ],
      "description": "Active alerts at the place; null when no open feed covers it."
     },
     "alerts_note": {
      "type": [
       "string",
       "null"
      ],
      "description": "Why alerts is null or empty (no open feed, polygon warnings only, feed delayed)."
     },
     "storm": {
      "anyOf": [
       {
        "type": "object",
        "properties": {
         "name": {
          "type": "string",
          "description": "Storm name."
         },
         "km": {
          "type": "integer",
          "description": "Distance from the place, km."
         },
         "url": {
          "type": [
           "string",
           "null"
          ],
          "description": "The storm at its source (NHC)."
         }
        },
        "required": [
         "name",
         "km",
         "url"
        ],
        "additionalProperties": false
       },
       {
        "type": "null"
       }
      ],
      "description": "Nearest named storm within 1,500 km, or null."
     },
     "notes": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Sentences about this answer (coverage, snapping, delays)."
     },
     "credits": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "minItems": 1,
      "description": "Credit strings to keep when you repeat numbers."
     },
     "credit_keys": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "minItems": 1,
      "description": "Their keys (/credits lists every line)."
     },
     "credits_url": {
      "type": "string",
      "format": "uri",
      "description": "The full credits page."
     }
    },
    "required": [
     "v",
     "size",
     "asof",
     "forecast_updated",
     "next_update",
     "place",
     "url",
     "units",
     "date",
     "when",
     "days",
     "sources",
     "series",
     "now",
     "alerts",
     "alerts_note",
     "storm",
     "notes",
     "credits",
     "credit_keys",
     "credits_url"
    ],
    "additionalProperties": false,
    "description": "One place: /api/v1/blend (MCP forecast)."
   },
   "multi": {
    "type": "object",
    "properties": {
     "v": {
      "const": 1
     },
     "size": {
      "enum": [
       "line",
       "week"
      ]
     },
     "asof": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
     },
     "results": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "v": {
         "const": 1,
         "description": "Body version (1). /api/v1 bodies only gain fields."
        },
        "size": {
         "enum": [
          "line",
          "week",
          "table",
          "series"
         ],
         "description": "line (one day) | week (one row per day) | table (every source by day) | series (hourly 2 m temperature)."
        },
        "asof": {
         "type": "string",
         "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$",
         "description": "When this blend was built (UTC)."
        },
        "forecast_updated": {
         "anyOf": [
          {
           "type": "string",
           "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
          },
          {
           "type": "null"
          }
         ],
         "description": "When the newest counted forecast became available (UTC)."
        },
        "next_update": {
         "anyOf": [
          {
           "type": "string",
           "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
          },
          {
           "type": "null"
          }
         ],
         "description": "The next scheduled run of this place's sources (UTC): expected, not promised; null when none is scheduled or every one is over 60 min late. A past next_update or an overdue run adds a note starting 'update due:' or 'update overdue:'."
        },
        "place": {
         "type": "object",
         "properties": {
          "slug": {
           "type": "string",
           "description": "Slug of the place (its page is /p/{slug})."
          },
          "display": {
           "type": "string",
           "description": "Display name: city, region, country."
          },
          "name": {
           "type": "string",
           "description": "Place name."
          },
          "cc": {
           "type": "string",
           "description": "ISO 3166-1 alpha-2 country code."
          },
          "admin1": {
           "type": [
            "string",
            "null"
           ],
           "description": "First-level region (US state code), or null."
          },
          "stn": {
           "type": [
            "string",
            "null"
           ],
           "description": "ICAO of the forecast station; null for a grid point."
          },
          "label": {
           "type": [
            "string",
            "null"
           ],
           "description": "Station label shown on pages (· joined)."
          },
          "tz": {
           "type": "string",
           "description": "IANA time zone; dates are local to it."
          },
          "lat": {
           "type": "number",
           "description": "Latitude of the forecast point."
          },
          "lon": {
           "type": "number",
           "description": "Longitude of the forecast point."
          },
          "coverage": {
           "enum": [
            "full",
            "partial",
            "grid"
           ],
           "description": "full (every source) | partial (more sources by the next cycle) | grid (global models only)."
          },
          "snapped_km": {
           "type": [
            "number",
            "null"
           ],
           "description": "A lat,lon snapped to a place: the distance in km; else null."
          },
          "nearest": {
           "anyOf": [
            {
             "type": "array",
             "prefixItems": [
              {
               "type": "string"
              },
              {
               "type": "string"
              },
              {
               "type": "number"
              }
             ],
             "minItems": 3,
             "maxItems": 3
            },
            {
             "type": "null"
            }
           ],
           "description": "Grid points: [slug, display, km] of the nearest full blend; else null."
          },
          "also": {
           "type": "array",
           "items": {
            "type": "string"
           },
           "description": "Other places with the same name (slugs)."
          },
          "via": {
           "type": [
            "string",
            "null"
           ],
           "description": "The ICAO you asked for when it is not this answer's station; null otherwise."
          }
         },
         "required": [
          "slug",
          "display",
          "name",
          "cc",
          "admin1",
          "stn",
          "label",
          "tz",
          "lat",
          "lon",
          "coverage",
          "snapped_km",
          "nearest",
          "also",
          "via"
         ],
         "additionalProperties": false,
         "description": "The place answered."
        },
        "url": {
         "type": "string",
         "pattern": "^https?://\\S+$",
         "description": "The page that shows this answer; link it when you cite numbers."
        },
        "units": {
         "enum": [
          "F",
          "C"
         ],
         "description": "F or C: temperatures in these units; rain in inches (F) or mm (C)."
        },
        "date": {
         "type": "string",
         "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
         "description": "The local date the answer starts at (YYYY-MM-DD)."
        },
        "when": {
         "type": [
          "string",
          "null"
         ],
         "description": "today | tomorrow | +N | past, at the request time in the place's time zone."
        },
        "days": {
         "anyOf": [
          {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "date": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
              "description": "Local date."
             },
             "when": {
              "type": [
               "string",
               "null"
              ],
              "description": "today | tomorrow | +N | past."
             },
             "rest": {
              "type": "boolean",
              "description": "True for today: the rest of the day."
             },
             "hi": {
              "type": [
               "number",
               "null"
              ],
              "description": "Median daily high; today: max(observed so far, forecast)."
             },
             "lo": {
              "type": [
               "number",
               "null"
              ],
              "description": "Median daily low; today: min(observed so far, forecast)."
             },
             "hi_by": {
              "enum": [
               "obs",
               "fc",
               null
              ],
              "description": "Today only: obs (observed so far) or fc (forecast) set the high; else null."
             },
             "lo_by": {
              "enum": [
               "obs",
               "fc",
               null
              ],
              "description": "Today only: obs or fc set the low; else null."
             },
             "partial": {
              "type": "boolean",
              "description": "Today only: true when routine reports are missing from the observed part."
             },
             "hi_range": {
              "anyOf": [
               {
                "type": "array",
                "items": {
                 "type": "number"
                },
                "minItems": 2,
                "maxItems": 2
               },
               {
                "type": "null"
               }
              ],
              "description": "[min, max] of the counted highs."
             },
             "lo_range": {
              "anyOf": [
               {
                "type": "array",
                "items": {
                 "type": "number"
                },
                "minItems": 2,
                "maxItems": 2
               },
               {
                "type": "null"
               }
              ],
              "description": "[min, max] of the counted lows."
             },
             "n": {
              "type": "integer",
              "description": "Counted forecasts behind hi."
             },
             "n_lo": {
              "type": "integer",
              "description": "Counted forecasts behind lo."
             },
             "families": {
              "type": "integer",
              "description": "Distinct model groups counted."
             },
             "fam_hi": {
              "type": [
               "number",
               "null"
              ],
              "description": "Median of the group medians (high)."
             },
             "fam_lo": {
              "type": [
               "number",
               "null"
              ],
              "description": "Median of the group medians (low)."
             },
             "sampled_in": {
              "type": "boolean",
              "description": "True when 6-hourly (~) values are inside the median (fewer than 4 other rows remained)."
             },
             "pop": {
              "type": [
               "integer",
               "null"
              ],
              "description": "Chance of 0.25 mm (0.01 in) or more in the day, %; null below blend.pop_min_n sources."
             },
             "pop_n": {
              "type": "integer",
              "description": "Sources behind pop."
             },
             "mm": {
              "type": [
               "number",
               "null"
              ],
              "description": "Median daily rain total, mm."
             },
             "in": {
              "type": [
               "number",
               "null"
              ],
              "description": "The same in inches (0.01) with units=F; else null."
             },
             "mm_n": {
              "type": "integer",
              "description": "Sources behind mm."
             },
             "normal": {
              "anyOf": [
               {
                "type": "object",
                "properties": {
                 "hi": {
                  "type": "number",
                  "description": "Normal high."
                 },
                 "lo": {
                  "type": "number",
                  "description": "Normal low."
                 }
                },
                "required": [
                 "hi",
                 "lo"
                ],
                "additionalProperties": false
               },
               {
                "type": "null"
               }
              ],
              "description": "1991-2020 normal high/low at the station (US); else null."
             }
            },
            "required": [
             "date",
             "when",
             "rest",
             "hi",
             "lo",
             "hi_by",
             "lo_by",
             "partial",
             "hi_range",
             "lo_range",
             "n",
             "n_lo",
             "families",
             "fam_hi",
             "fam_lo",
             "sampled_in",
             "pop",
             "pop_n",
             "mm",
             "in",
             "mm_n",
             "normal"
            ],
            "additionalProperties": false
           }
          },
          {
           "type": "null"
          }
         ],
         "description": "One entry per local day (line: 1, week/table: up to 7); null for series."
        },
        "sources": {
         "anyOf": [
          {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "id": {
              "type": "string",
              "description": "Row id (a twin carries *)."
             },
             "src": {
              "type": "string",
              "description": "Source id (/api/v1/sources)."
             },
             "stn": {
              "type": [
               "string",
               "null"
              ],
              "description": "Station of a station product; null for gridded sources."
             },
             "fam": {
              "type": "string",
              "description": "Model group."
             },
             "dd": {
              "enum": [
               "cal",
               "dn"
              ],
              "description": "cal = local calendar day; dn = high 07-19, low 19-08 local."
             },
             "run": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$",
              "description": "Model run or issue time (UTC)."
             },
             "kind": {
              "enum": [
               "run",
               "iss",
               "upd"
              ],
              "description": "Kind of value (point, station, ensemble, ...)."
             },
             "age_h": {
              "type": "number",
              "description": "Hours since the run, issue or update."
             },
             "status": {
              "enum": [
               "ok",
               "late",
               "stale"
              ],
              "description": "ok | stale | ...: freshness of the row."
             },
             "counted": {
              "type": "boolean",
              "description": "True when the row counts in the medians."
             },
             "twin": {
              "type": "boolean",
              "description": "True for another station of the same product (not counted)."
             },
             "pt_km": {
              "type": [
               "number",
               "null"
              ],
              "description": "Grid sources: km from the place to the grid point."
             },
             "terrain": {
              "type": "boolean",
              "description": "Grid point terrain note, or null."
             },
             "days": {
              "type": "array",
              "items": {
               "anyOf": [
                {
                 "type": "object",
                 "properties": {
                  "hi": {
                   "type": [
                    "number",
                    "null"
                   ],
                   "description": "The source's daily high (whole °F / 0.1 °C)."
                  },
                  "lo": {
                   "type": [
                    "number",
                    "null"
                   ],
                   "description": "The source's daily low."
                  },
                  "pop": {
                   "type": [
                    "integer",
                    "null"
                   ],
                   "description": "The source's chance of 0.25 mm or more, %, or null."
                  },
                  "pop_lb": {
                   "type": "boolean",
                   "description": "True when pop is a lower bound from a part of the day (never counted)."
                  },
                  "mm": {
                   "type": [
                    "number",
                    "null"
                   ],
                   "description": "The source's daily rain total, mm."
                  },
                  "s": {
                   "enum": [
                    0,
                    1
                   ],
                   "description": "True for a day built from 6-hourly values (~)."
                  },
                  "c": {
                   "enum": [
                    0,
                    1
                   ],
                   "description": "True when counted in the medians that day."
                  },
                  "x": {
                   "enum": [
                    0,
                    1
                   ],
                   "description": "True when left out of hi/lo (6-hourly, enough other rows)."
                  }
                 },
                 "required": [
                  "hi",
                  "lo",
                  "pop",
                  "pop_lb",
                  "mm",
                  "s",
                  "c",
                  "x"
                 ],
                 "additionalProperties": false
                },
                {
                 "type": "null"
                }
               ]
              },
              "description": "Per-day cells aligned with days[]; null where the source has no value."
             }
            },
            "required": [
             "id",
             "src",
             "stn",
             "fam",
             "dd",
             "run",
             "kind",
             "age_h",
             "status",
             "counted",
             "twin",
             "pt_km",
             "terrain",
             "days"
            ],
            "additionalProperties": false
           }
          },
          {
           "type": "null"
          }
         ],
         "description": "table only: one row per source shown; null otherwise."
        },
        "series": {
         "anyOf": [
          {
           "type": "object",
           "properties": {
            "step_h": {
             "enum": [
              1,
              3,
              6
             ],
             "description": "Hours between rows."
            },
            "times": {
             "type": "array",
             "items": {
              "type": "string"
             },
             "description": "Local times (MM-DDTHH±hh)."
            },
            "times_iso": {
             "type": "array",
             "items": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}[+-]\\d{2}:\\d{2}$"
             },
             "description": "The same as ISO local times with offset."
            },
            "cols": {
             "type": "object",
             "additionalProperties": {
              "type": "array",
              "items": {
               "type": [
                "number",
                "null"
               ]
              }
             },
             "description": "Values per source (and ensemble _p10/_p90)."
            },
            "med": {
             "type": "array",
             "items": {
              "type": [
               "number",
               "null"
              ]
             },
             "description": "Median per row."
            },
            "n": {
             "type": "integer",
             "description": "Sources in the median."
            },
            "excluded": {
             "type": "array",
             "items": {
              "type": "string"
             },
             "description": "Counted sources left out of the series (they do not cover the window)."
            }
           },
           "required": [
            "step_h",
            "times",
            "times_iso",
            "cols",
            "med",
            "n",
            "excluded"
           ],
           "additionalProperties": false
          },
          {
           "type": "null"
          }
         ],
         "description": "series only: hourly 2 m temperature per source; null otherwise."
        },
        "now": {
         "anyOf": [
          {
           "type": "object",
           "properties": {
            "stn": {
             "type": "string",
             "description": "Reporting station."
            },
            "t": {
             "type": "number",
             "description": "Temperature in the body's units."
            },
            "at": {
             "type": "string",
             "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$",
             "description": "Observation time (UTC)."
            },
            "age_h": {
             "type": "number",
             "description": "Hours from now.at to the body's asof (when the blend was built), not to the request: the live age is the request time minus now.at."
            },
            "flags": {
             "type": "array",
             "items": {
              "type": "string"
             },
             "description": "maint = the station's maintenance flag."
            }
           },
           "required": [
            "stn",
            "t",
            "at",
            "age_h",
            "flags"
           ],
           "additionalProperties": false
          },
          {
           "type": "null"
          }
         ],
         "description": "Latest observation at the station; null when none is recent (and for series)."
        },
        "alerts": {
         "anyOf": [
          {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "id": {
              "type": "string",
              "description": "Alert id at its feed."
             },
             "event": {
              "type": "string",
              "description": "Event name (Flood Warning, ...)."
             },
             "severity": {
              "type": [
               "string",
               "null"
              ],
              "description": "Extreme | Severe | Moderate | Minor | Unknown."
             },
             "onset": {
              "anyOf": [
               {
                "type": "string",
                "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
               },
               {
                "type": "null"
               }
              ],
              "description": "Start (UTC), or null."
             },
             "expires": {
              "anyOf": [
               {
                "type": "string",
                "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
               },
               {
                "type": "null"
               }
              ],
              "description": "End (UTC), or null (until further notice)."
             },
             "headline": {
              "type": [
               "string",
               "null"
              ],
              "description": "The issuer's headline."
             },
             "url": {
              "type": [
               "string",
               "null"
              ],
              "description": "The alert at its source."
             },
             "sender": {
              "type": [
               "string",
               "null"
              ],
              "description": "Issuing service."
             },
             "credit": {
              "type": "string",
              "description": "Credit key of the feed."
             }
            },
            "required": [
             "id",
             "event",
             "severity",
             "onset",
             "expires",
             "headline",
             "url",
             "sender",
             "credit"
            ],
            "additionalProperties": false
           }
          },
          {
           "type": "null"
          }
         ],
         "description": "Active alerts at the place; null when no open feed covers it."
        },
        "alerts_note": {
         "type": [
          "string",
          "null"
         ],
         "description": "Why alerts is null or empty (no open feed, polygon warnings only, feed delayed)."
        },
        "storm": {
         "anyOf": [
          {
           "type": "object",
           "properties": {
            "name": {
             "type": "string",
             "description": "Storm name."
            },
            "km": {
             "type": "integer",
             "description": "Distance from the place, km."
            },
            "url": {
             "type": [
              "string",
              "null"
             ],
             "description": "The storm at its source (NHC)."
            }
           },
           "required": [
            "name",
            "km",
            "url"
           ],
           "additionalProperties": false
          },
          {
           "type": "null"
          }
         ],
         "description": "Nearest named storm within 1,500 km, or null."
        },
        "notes": {
         "type": "array",
         "items": {
          "type": "string"
         },
         "description": "Sentences about this answer (coverage, snapping, delays)."
        }
       },
       "required": [
        "v",
        "size",
        "asof",
        "forecast_updated",
        "next_update",
        "place",
        "url",
        "units",
        "date",
        "when",
        "days",
        "sources",
        "series",
        "now",
        "alerts",
        "alerts_note",
        "storm",
        "notes"
       ],
       "additionalProperties": false
      },
      "minItems": 2,
      "maxItems": 10
     },
     "credits": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "minItems": 1
     },
     "credit_keys": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "minItems": 1
     },
     "credits_url": {
      "type": "string",
      "format": "uri"
     }
    },
    "required": [
     "v",
     "size",
     "asof",
     "results",
     "credits",
     "credit_keys",
     "credits_url"
    ],
    "additionalProperties": false,
    "description": "Several places (line/week): one credits footer."
   },
   "error": {
    "type": "object",
    "properties": {
     "error": {
      "enum": [
       "bad_param",
       "unknown_place",
       "out_of_range",
       "rate_limited",
       "warming_up",
       "overloaded",
       "not_found",
       "internal"
      ],
      "description": "Error code."
     },
     "msg": {
      "type": "string",
      "description": "What went wrong, in words."
     },
     "try": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "unknown_place: slugs to try."
     },
     "search": {
      "type": "string",
      "description": "unknown_place: the places search for what you asked."
     },
     "valid": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "bad_param / out_of_range: what we take."
     },
     "retry_s": {
      "type": "integer",
      "description": "Seconds to wait before retrying."
     }
    },
    "required": [
     "error",
     "msg"
    ],
    "additionalProperties": false,
    "description": "Every error: HTTP status + this body (md/tsv: one '# error code: msg' line)."
   },
   "markets": {
    "type": "object",
    "properties": {
     "v": {
      "const": 1,
      "description": "Body version."
     },
     "kind": {
      "const": "markets",
      "description": "Body kind."
     },
     "size": {
      "enum": [
       "line",
       "table"
      ],
      "description": "line (per place) | table."
     },
     "asof": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$",
      "description": "Request time (UTC)."
     },
     "family": {
      "enum": [
       "high",
       "low",
       "rain",
       "all"
      ],
      "description": "Family asked for."
     },
     "date": {
      "type": "string",
      "description": "today | tomorrow | yesterday | YYYY-MM-DD, each place's local date."
     },
     "places": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "slug": {
         "type": "string",
         "description": "Place slug (a lat,lon for a point)."
        },
        "display": {
         "type": "string",
         "description": "Display name."
        },
        "url": {
         "type": [
          "string",
          "null"
         ],
         "description": "Its page."
        },
        "date": {
         "type": "string",
         "description": "Its local date for `date`."
        },
        "when": {
         "type": "string",
         "description": "today | tomorrow | yesterday | +N | past."
        },
        "n_rows": {
         "type": "integer",
         "description": "Its rows in this body."
        }
       },
       "required": [
        "slug",
        "display",
        "url",
        "date",
        "when",
        "n_rows"
       ],
       "additionalProperties": false
      },
      "description": "The places answered (the index: every market city with a row)."
     },
     "url": {
      "type": "string",
      "description": "The page that shows this answer (the place page, else /markets)."
     },
     "rows": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "place": {
         "type": "string",
         "description": "Slug of the market city."
        },
        "venue": {
         "enum": [
          "kalshi",
          "polymarket"
         ],
         "description": "Venue."
        },
        "fam": {
         "enum": [
          "high",
          "low",
          "rain"
         ],
         "description": "Market family."
        },
        "kind": {
         "enum": [
          "day",
          "weekend",
          "month",
          "season",
          "once",
          "window",
          "year"
         ],
         "description": "Market kind."
        },
        "date": {
         "type": "string",
         "description": "The venue's date for this market: YYYY-MM-DD, YYYY-MM (monthly) or YYYY."
        },
        "event": {
         "type": [
          "string",
          "null"
         ],
         "description": "Venue event id (Kalshi event ticker, Polymarket event slug)."
        },
        "stn": {
         "type": [
          "string",
          "null"
         ],
         "description": "Settlement station (ICAO or the source's station id)."
        },
        "product": {
         "type": "string",
         "description": "Settlement product (CLI_T, METAR_R, HKO_T, CLI_P, ...; /llms-full.txt has the glossary)."
        },
        "unit": {
         "enum": [
          "F",
          "C",
          "in",
          "mm"
         ],
         "description": "Unit of every value in this row (the venue's own)."
        },
        "state": {
         "enum": [
          "upcoming",
          "open",
          "settling",
          "proposed",
          "settled",
          "rule_changed",
          "late",
          "link_only",
          "no_data"
         ],
         "description": "Where the market stands."
        },
        "so_far": {
         "type": [
          "number",
          "null"
         ],
         "description": "The value so far under the venue's own rule (temperature, or rain total)."
        },
        "at": {
         "type": [
          "string",
          "null"
         ],
         "description": "UTC time of the report that set so_far (ISO)."
        },
        "partial": {
         "enum": [
          0,
          1,
          null
         ],
         "description": "1 when an hour of the window has no routine report."
        },
        "ours": {
         "type": [
          "number",
          "null"
         ],
         "description": "Our reconstructed settle value once the window is done."
        },
        "result": {
         "type": [
          "string",
          "null"
         ],
         "description": "The venue's official result as text in the market unit (61, 60-61, Yes)."
        },
        "agree": {
         "enum": [
          "match",
          "differs",
          null
         ],
         "description": "Ours vs the venue's result for this event."
        },
        "agree_30d": {
         "type": [
          "string",
          "null"
         ],
         "description": "m/n matches over 30 days once the product passes the claim gate; else null."
        },
        "fc": {
         "type": [
          "number",
          "null"
         ],
         "description": "Forecast at the settlement station: daily max/min (fc_kind daily_extreme), or the chance in % (pop)."
        },
        "fc_kind": {
         "enum": [
          "daily_extreme",
          "pop",
          "rest_of_month",
          null
         ],
         "description": "What fc is."
        },
        "fc_n": {
         "type": [
          "integer",
          "null"
         ],
         "description": "Forecasts (or model families) behind fc."
        },
        "pop": {
         "type": [
          "integer",
          "null"
         ],
         "description": "Rain markets: chance of 0.01 in or more, %."
        },
        "mtd": {
         "type": [
          "number",
          "null"
         ],
         "description": "Monthly rain: month to date."
        },
        "fc_rest": {
         "type": [
          "number",
          "null"
         ],
         "description": "Monthly rain: expected rest of month (mean)."
        },
        "bound": {
         "type": [
          "string",
          "null"
         ],
         "description": "What the result can still be given so far: >=61, <=44, >=1.42."
        },
        "derived": {
         "enum": [
          0,
          1,
          null
         ],
         "description": "1 when the rule names a source we do not fetch and we compute the same number from the open source it shows."
        },
        "url": {
         "type": [
          "string",
          "null"
         ],
         "description": "The market page (Kalshi series page, Polymarket event page)."
        },
        "event_url": {
         "type": [
          "string",
          "null"
         ],
         "description": "The event page (Kalshi: the series page)."
        },
        "src_url": {
         "type": [
          "string",
          "null"
         ],
         "description": "The settlement product we read (NWS CLI product, AWC METAR API URL, ...)."
        },
        "win_start": {
         "type": [
          "string",
          "null"
         ],
         "description": "Window start (UTC ISO); null for link-only rows."
        },
        "win_end": {
         "type": [
          "string",
          "null"
         ],
         "description": "Window end (UTC ISO)."
        },
        "n_obs": {
         "type": [
          "integer",
          "null"
         ],
         "description": "Reports counted so far."
        },
        "ours_src": {
         "enum": [
          "group24",
          "cli_final",
          "cli_cor",
          "rule",
          null
         ],
         "description": "Where ours comes from."
        },
        "mtd_through": {
         "type": [
          "string",
          "null"
         ],
         "description": "Last day inside mtd (YYYY-MM-DD)."
        },
        "fc_rest_thru": {
         "type": [
          "string",
          "null"
         ],
         "description": "Non-US: the rest-of-month forecast stops at this date."
        },
        "flag": {
         "type": [
          "string",
          "null"
         ],
         "description": "low_after_midnight: the low may come after midnight (Kalshi day to 1 am)."
        },
        "note": {
         "type": [
          "string",
          "null"
         ],
         "description": "State text (rule changed, late), else null."
        },
        "rule": {
         "type": [
          "string",
          "null"
         ],
         "description": "Our one-line paraphrase of the rule (never venue text)."
        },
        "fc_by": {
         "enum": [
          "nbm",
          "blend",
          null
         ],
         "description": "Where fc comes from: nbm = the station's NBM (NOAA National Blend of Models; Kalshi CLI days after today), blend = the median."
        },
        "fc_rest_p10": {
         "type": [
          "number",
          "null"
         ],
         "description": "Rain: rest-of-month 10th percentile (rain.enabled); else null."
        },
        "fc_rest_p90": {
         "type": [
          "number",
          "null"
         ],
         "description": "Rain: rest-of-month 90th percentile (rain.enabled); else null."
        },
        "fc_src": {
         "anyOf": [
          {
           "type": "array",
           "items": {
            "type": "string"
           }
          },
          {
           "type": "null"
          }
         ],
         "description": "Rain: model families behind fc (rain.enabled); else null."
        },
        "fc_runs": {
         "anyOf": [
          {
           "type": "array",
           "items": {
            "type": "string"
           }
          },
          {
           "type": "null"
          }
         ],
         "description": "Rain: runs behind fc (rain.enabled); else null."
        },
        "fc_left_h": {
         "type": [
          "number",
          "null"
         ],
         "description": "Rain: hours left in the climate day (rain.enabled); else null."
        },
        "win": {
         "enum": [
          "lst",
          "cal",
          null
         ],
         "description": "Rain: the window of fc (rain.enabled); else null."
        }
       },
       "required": [
        "place",
        "venue",
        "fam",
        "kind",
        "date",
        "event",
        "stn",
        "product",
        "unit",
        "state",
        "so_far",
        "at",
        "partial",
        "ours",
        "result",
        "agree",
        "agree_30d",
        "fc",
        "fc_kind",
        "fc_n",
        "pop",
        "mtd",
        "fc_rest",
        "bound",
        "derived",
        "url",
        "event_url",
        "src_url",
        "win_start",
        "win_end",
        "n_obs",
        "ours_src",
        "mtd_through",
        "fc_rest_thru",
        "flag",
        "note",
        "rule",
        "fc_by",
        "fc_rest_p10",
        "fc_rest_p90",
        "fc_src",
        "fc_runs",
        "fc_left_h",
        "win"
       ],
       "additionalProperties": false
      },
      "description": "One row per venue x family x kind."
     },
     "notes": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Sentences about this answer; always ends with \"No prices.\"."
     },
     "credits": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Credit strings to keep when you repeat numbers."
     },
     "credit_keys": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Their keys (/credits lists every line)."
     },
     "credits_url": {
      "type": "string",
      "description": "The full credits page."
     }
    },
    "required": [
     "v",
     "kind",
     "size",
     "asof",
     "family",
     "date",
     "places",
     "url",
     "rows",
     "notes",
     "credits",
     "credit_keys",
     "credits_url"
    ],
    "additionalProperties": false
   },
   "receipts": {
    "type": "object",
    "properties": {
     "v": {
      "const": 1,
      "description": "Body version."
     },
     "kind": {
      "const": "receipts",
      "description": "Body kind."
     },
     "asof": {
      "type": "string",
      "description": "Response time (UTC); when the QA ran is qa_at."
     },
     "qa_at": {
      "type": [
       "string",
       "null"
      ],
      "description": "When the market QA last ran (UTC); null = never: nothing evaluated yet."
     },
     "state": {
      "enum": [
       "unvalidated",
       "below_claim",
       "reported"
      ],
      "description": "unvalidated = 0 checked (not a perfect score); below_claim = checked but no product has the claim minimum (match/differs null); reported = at least one product shows match/differs."
     },
     "checked": {
      "type": "integer",
      "description": "Events checked, all rows (the denominator)."
     },
     "days": {
      "type": "integer",
      "description": "Days covered (1-30)."
     },
     "venue": {
      "enum": [
       "kalshi",
       "polymarket",
       null
      ],
      "description": "Venue asked for, or null for both."
     },
     "family": {
      "enum": [
       "high",
       "low",
       "rain",
       null
      ],
      "description": "Family asked for, or null for all."
     },
     "rows": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "product": {
         "type": "string",
         "description": "Settlement product."
        },
        "rule_from": {
         "type": [
          "string",
          "null"
         ],
         "description": "The rule version: first date it applies."
        },
        "since": {
         "type": [
          "string",
          "null"
         ],
         "description": "First checked date."
        },
        "checked": {
         "type": "integer",
         "description": "Events checked."
        },
        "match": {
         "type": [
          "integer",
          "null"
         ],
         "description": "Matches; null until the product has the claim minimum of checked events."
        },
        "differs": {
         "type": [
          "integer",
          "null"
         ],
         "description": "Misses; null until the claim minimum."
        },
        "not_checkable": {
         "type": "integer",
         "description": "Events we could not check (reason in the misses)."
        },
        "shown": {
         "type": "boolean",
         "description": "True once match/differs may be shown (claim gate)."
        }
       },
       "required": [
        "product",
        "rule_from",
        "since",
        "checked",
        "match",
        "differs",
        "not_checkable",
        "shown"
       ],
       "additionalProperties": false
      },
      "description": "One row per product x rule version."
     },
     "misses": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "venue": {
         "type": [
          "string",
          "null"
         ],
         "description": "Venue."
        },
        "event": {
         "type": [
          "string",
          "null"
         ],
         "description": "Venue event id."
        },
        "place": {
         "type": [
          "string",
          "null"
         ],
         "description": "City slug."
        },
        "family": {
         "type": [
          "string",
          "null"
         ],
         "description": "high | low | rain."
        },
        "date": {
         "type": [
          "string",
          "null"
         ],
         "description": "The event's date."
        },
        "ours": {
         "type": [
          "number",
          "string",
          "null"
         ],
         "description": "Our value."
        },
        "result": {
         "type": [
          "number",
          "string",
          "null"
         ],
         "description": "The venue's result."
        },
        "reason": {
         "type": [
          "string",
          "null"
         ],
         "description": "Machine-set reason (cli_corrected_after_settle, report_missing, ...)."
        },
        "line": {
         "type": "string",
         "description": "The miss in one line."
        }
       },
       "required": [
        "venue",
        "event",
        "place",
        "family",
        "date",
        "ours",
        "result",
        "reason",
        "line"
       ],
       "additionalProperties": false
      },
      "description": "Every miss and not-checkable event."
     },
     "notes": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Sentences; always ends with \"No prices.\"."
     },
     "credits": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Credit strings to keep when you repeat numbers."
     },
     "credit_keys": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Their keys (/credits lists every line)."
     },
     "credits_url": {
      "type": "string",
      "description": "The full credits page."
     }
    },
    "required": [
     "v",
     "kind",
     "asof",
     "qa_at",
     "state",
     "checked",
     "days",
     "venue",
     "family",
     "rows",
     "misses",
     "notes",
     "credits",
     "credit_keys",
     "credits_url"
    ],
    "additionalProperties": false
   },
   "places": {
    "type": "object",
    "properties": {
     "v": {
      "const": 1,
      "description": "Body version."
     },
     "q": {
      "type": "string",
      "description": "The search."
     },
     "results": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "slug": {
         "type": "string"
        },
        "display": {
         "type": [
          "string",
          "null"
         ]
        },
        "cc": {
         "type": [
          "string",
          "null"
         ]
        },
        "admin1": {
         "type": [
          "string",
          "null"
         ]
        },
        "lat": {
         "type": [
          "number",
          "null"
         ]
        },
        "lon": {
         "type": [
          "number",
          "null"
         ]
        },
        "tz": {
         "type": [
          "string",
          "null"
         ]
        },
        "tier": {
         "type": [
          "string",
          "null"
         ],
         "description": "core | demand | search (settle points are never listed)."
        },
        "coverage": {
         "enum": [
          "full",
          "grid"
         ],
         "description": "full = every source; grid = global models only for now."
        },
        "stations": {
         "type": "array",
         "items": {
          "type": "string"
         },
         "description": "Station ICAOs, primary first."
        }
       },
       "required": [
        "slug",
        "display",
        "cc",
        "admin1",
        "lat",
        "lon",
        "tz",
        "tier",
        "coverage",
        "stations"
       ],
       "additionalProperties": false
      },
      "description": "Best matches first."
     },
     "credits": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Credit strings to keep when you repeat numbers."
     },
     "credit_keys": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Their keys (/credits lists every line)."
     },
     "credits_url": {
      "type": "string",
      "description": "The full credits page."
     }
    },
    "required": [
     "v",
     "q",
     "results",
     "credits",
     "credit_keys",
     "credits_url"
    ],
    "additionalProperties": false
   },
   "sources": {
    "type": "object",
    "properties": {
     "v": {
      "const": 1,
      "description": "Body version."
     },
     "asof": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$",
      "description": "Request time (UTC)."
     },
     "sources": {
      "type": "array",
      "items": {
       "type": "object",
       "required": [
        "id"
       ],
       "properties": {
        "id": {
         "type": "string",
         "description": "Source id."
        },
        "name": {
         "type": [
          "string",
          "null"
         ],
         "description": "Source name."
        },
        "fam": {
         "type": [
          "string",
          "null"
         ],
         "description": "Model group."
        },
        "licence": {
         "type": [
          "string",
          "null"
         ],
         "description": "Licence."
        },
        "credit": {
         "type": [
          "string",
          "null"
         ],
         "description": "Credit key (/credits)."
        },
        "runs": {
         "type": [
          "string",
          "null"
         ],
         "description": "Schedule."
        },
        "latest": {
         "type": [
          "string",
          "null"
         ],
         "description": "Latest run, issue or update (UTC)."
        },
        "age_h": {
         "type": [
          "number",
          "null"
         ],
         "description": "Hours since latest."
        },
        "status": {
         "type": [
          "string",
          "null"
         ],
         "description": "ok | late | down | off."
        },
        "places": {
         "type": [
          "integer",
          "null"
         ],
         "description": "Places it covers."
        }
       },
       "additionalProperties": true
      },
      "description": "Every live source."
     },
     "credits_url": {
      "type": "string",
      "description": "The full credits page."
     }
    },
    "required": [
     "v",
     "asof",
     "sources",
     "credits_url"
    ],
    "additionalProperties": false
   },
   "status": {
    "type": "object",
    "properties": {
     "v": {
      "const": 1,
      "description": "Body version."
     },
     "asof": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$",
      "description": "Request time (UTC)."
     },
     "summary": {
      "type": "object",
      "additionalProperties": true,
      "description": "Health summary (ok, readiness, warming, version, blends, core, limits, markets, ...). ok = liveness only (nothing pages); readiness = one {state, reasons[]} per product: forecasts ok|degraded|stale|warming, rain ok|degraded|off, markets ok|partial|off, validation unvalidated|below_claim|reported|off (with checked and qa_at)."
     },
     "sources": {
      "type": "array",
      "items": {
       "type": "object"
      },
      "description": "Source health rows (as /api/v1/sources)."
     },
     "jobs": {
      "type": "array",
      "items": {
       "type": "object"
      },
      "description": "Scheduler jobs."
     }
    },
    "required": [
     "v",
     "asof",
     "summary",
     "sources",
     "jobs"
    ],
    "additionalProperties": false
   },
   "index": {
    "type": "object",
    "properties": {
     "v": {
      "const": 1,
      "description": "Body version."
     },
     "api": {
      "type": "string"
     },
     "endpoints": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "method": {
         "type": "string"
        },
        "path": {
         "type": "string"
        },
        "what": {
         "type": "string"
        }
       },
       "required": [
        "method",
        "path",
        "what"
       ],
       "additionalProperties": false
      }
     },
     "openapi": {
      "type": "string"
     },
     "guide": {
      "type": "string"
     }
    },
    "required": [
     "v",
     "api",
     "endpoints",
     "openapi",
     "guide"
    ],
    "additionalProperties": false
   },
   "blend_temp": {
    "$ref": "#/components/schemas/body",
    "description": "The temperature body (no variable key)."
   },
   "blend_rain": {
    "description": "Rain body (variable=rain; RAIN_SPEC §3.1). Amounts as *_mm and *_in pairs; chances whole % aligned with thresholds.",
    "oneOf": [
     {
      "type": "object",
      "properties": {
       "v": {
        "const": 1
       },
       "variable": {
        "const": "rain",
        "description": "Rain body (variable=rain)."
       },
       "size": {
        "enum": [
         "line",
         "week",
         "table",
         "series"
        ]
       },
       "asof": {
        "type": "string",
        "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$",
        "description": "When this blend was built (UTC)."
       },
       "forecast_updated": {
        "anyOf": [
         {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
         },
         {
          "type": "null"
         }
        ],
        "description": "When the newest counted forecast became available (UTC)."
       },
       "next_update": {
        "anyOf": [
         {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
         },
         {
          "type": "null"
         }
        ],
        "description": "The next scheduled run of this place's sources (UTC): expected, not promised; null when none is scheduled or every one is over 60 min late. A past next_update or an overdue run adds a note starting 'update due:' or 'update overdue:'."
       },
       "place": {
        "type": "object",
        "properties": {
         "slug": {
          "type": "string",
          "description": "Slug of the place (its page is /p/{slug})."
         },
         "display": {
          "type": "string",
          "description": "Display name: city, region, country."
         },
         "name": {
          "type": "string",
          "description": "Place name."
         },
         "cc": {
          "type": "string",
          "description": "ISO 3166-1 alpha-2 country code."
         },
         "admin1": {
          "type": [
           "string",
           "null"
          ],
          "description": "First-level region (US state code), or null."
         },
         "stn": {
          "type": [
           "string",
           "null"
          ],
          "description": "ICAO of the forecast station; null for a grid point."
         },
         "label": {
          "type": [
           "string",
           "null"
          ],
          "description": "Station label shown on pages (· joined)."
         },
         "tz": {
          "type": "string",
          "description": "IANA time zone; dates are local to it."
         },
         "lat": {
          "type": "number",
          "description": "Latitude of the forecast point."
         },
         "lon": {
          "type": "number",
          "description": "Longitude of the forecast point."
         },
         "coverage": {
          "enum": [
           "full",
           "partial",
           "grid"
          ],
          "description": "full (every source) | partial (more sources by the next cycle) | grid (global models only)."
         },
         "snapped_km": {
          "type": [
           "number",
           "null"
          ],
          "description": "A lat,lon snapped to a place: the distance in km; else null."
         },
         "nearest": {
          "anyOf": [
           {
            "type": "array",
            "prefixItems": [
             {
              "type": "string"
             },
             {
              "type": "string"
             },
             {
              "type": "number"
             }
            ],
            "minItems": 3,
            "maxItems": 3
           },
           {
            "type": "null"
           }
          ],
          "description": "Grid points: [slug, display, km] of the nearest full blend; else null."
         },
         "also": {
          "type": "array",
          "items": {
           "type": "string"
          },
          "description": "Other places with the same name (slugs)."
         },
         "via": {
          "type": [
           "string",
           "null"
          ],
          "description": "The ICAO you asked for when it is not this answer's station; null otherwise."
         }
        },
        "required": [
         "slug",
         "display",
         "name",
         "cc",
         "admin1",
         "stn",
         "label",
         "tz",
         "lat",
         "lon",
         "coverage",
         "snapped_km",
         "nearest",
         "also",
         "via"
        ],
        "additionalProperties": false,
        "description": "The place answered."
       },
       "url": {
        "type": "string",
        "pattern": "^https?://\\S+$",
        "description": "The place page's Rain view."
       },
       "units": {
        "enum": [
         "F",
         "C"
        ],
        "description": "F or C: temperatures in these units; rain in inches (F) or mm (C)."
       },
       "rain_unit": {
        "enum": [
         "in",
         "mm"
        ],
        "description": "Text amounts: inches under F, mm under C (JSON has both)."
       },
       "win": {
        "enum": [
         "lst",
         "cal"
        ],
        "description": "lst = the settle station's climate day (local standard time); cal = the local calendar day."
       },
       "stn": {
        "anyOf": [
         {
          "type": "array",
          "items": {
           "type": "string"
          }
         },
         {
          "type": "null"
         }
        ],
        "description": "Settle stations shown (win=lst)."
       },
       "window": {
        "anyOf": [
         {
          "type": "object",
          "properties": {
           "from_utc": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
           },
           "to_utc": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
           },
           "label": {
            "type": "string",
            "description": "'calendar day' or the climate-day label, e.g. 'climate day, 1 am–1 am CDT (midnight–midnight standard time)'."
           }
          },
          "required": [
           "from_utc",
           "to_utc",
           "label"
          ],
          "additionalProperties": false,
          "description": "The window of `date`: [from_utc, to_utc)."
         },
         {
          "type": "null"
         }
        ],
        "description": "The window of `date` (null for series)."
       },
       "thresholds": {
        "type": "array",
        "items": {
         "type": "object",
         "properties": {
          "in": {
           "type": "number"
          },
          "mm": {
           "type": "number"
          }
         },
         "required": [
          "in",
          "mm"
         ],
         "additionalProperties": false
        },
        "minItems": 5,
        "maxItems": 5,
        "description": "chance[i] is the chance of thresholds[i] or more."
       },
       "date": {
        "anyOf": [
         {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
         },
         {
          "type": "null"
         }
        ],
        "description": "Requested (start) local date; today = the window's open day (under lst the open climate day)."
       },
       "when": {
        "anyOf": [
         {
          "type": "string"
         },
         {
          "type": "null"
         }
        ],
        "description": "today | tomorrow | +N | past."
       },
       "today": {
        "anyOf": [
         {
          "type": "object",
          "properties": {
           "date": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
           },
           "win": {
            "enum": [
             "lst",
             "cal"
            ]
           },
           "label": {
            "type": "string"
           },
           "so_far_mm": {
            "anyOf": [
             {
              "type": "number"
             },
             {
              "type": "null"
             }
            ],
            "description": "Station so far in the window (hourly reports; the climate report can differ); null where no gauge feed."
           },
           "so_far_in": {
            "anyOf": [
             {
              "type": "number"
             },
             {
              "type": "null"
             }
            ]
           },
           "so_far_src": {
            "anyOf": [
             {
              "type": "string"
             },
             {
              "type": "null"
             }
            ]
           },
           "so_far_at": {
            "anyOf": [
             {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
             },
             {
              "type": "null"
             }
            ]
           },
           "partial": {
            "type": "boolean",
            "description": "A routine hour is missing or the gauge is down."
           },
           "gauge_down": {
            "type": "boolean"
           },
           "first_only": {
            "type": "boolean",
            "description": "Wet only because of the window's first report (includes rain before the window)."
           },
           "trace": {
            "type": "boolean"
           },
           "radar_mm": {
            "anyOf": [
             {
              "type": "number"
             },
             {
              "type": "null"
             }
            ],
            "description": "Radar estimate (MRMS, gauge-adjusted) over the window; context, never the so far."
           },
           "radar_in": {
            "anyOf": [
             {
              "type": "number"
             },
             {
              "type": "null"
             }
            ]
           },
           "radar_at": {
            "anyOf": [
             {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
             },
             {
              "type": "null"
             }
            ]
           },
           "radar_flag": {
            "type": "boolean",
            "description": "Radar shows rain the station does not."
           },
           "recorded": {
            "type": "boolean",
            "description": "Station so far is 0.01 in or more (never radar alone, never the first report alone)."
           },
           "rest_from": {
            "anyOf": [
             {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
             },
             {
              "type": "null"
             }
            ],
            "description": "The rest of the window starts here (now)."
           },
           "left_h": {
            "anyOf": [
             {
              "type": "number"
             },
             {
              "type": "null"
             }
            ],
            "description": "Hours left in the window."
           },
           "amt_mm": {
            "anyOf": [
             {
              "type": "number"
             },
             {
              "type": "null"
             }
            ],
            "description": "Rest of the window: median (mm)."
           },
           "amt_in": {
            "anyOf": [
             {
              "type": "number"
             },
             {
              "type": "null"
             }
            ]
           },
           "mean_mm": {
            "anyOf": [
             {
              "type": "number"
             },
             {
              "type": "null"
             }
            ],
            "description": "Rest of the window: expected (mean) (mm)."
           },
           "mean_in": {
            "anyOf": [
             {
              "type": "number"
             },
             {
              "type": "null"
             }
            ]
           },
           "total_mm": {
            "anyOf": [
             {
              "type": "number"
             },
             {
              "type": "null"
             }
            ],
            "description": "so far + rest (median)."
           },
           "total_in": {
            "anyOf": [
             {
              "type": "number"
             },
             {
              "type": "null"
             }
            ]
           },
           "pop": {
            "anyOf": [
             {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
             },
             {
              "type": "null"
             }
            ],
            "description": "Rest-of-window chance of 0.01 in or more (member families); 100 once recorded."
           },
           "pop_n": {
            "type": "integer"
           },
           "pop_src": {
            "type": "array",
            "items": {
             "type": "string"
            }
           },
           "runs": {
            "type": "array",
            "items": {
             "type": "string"
            },
            "description": "Run of each family in pop_src (e.g. 00Z)."
           },
           "chance": {
            "anyOf": [
             {
              "type": "array",
              "items": {
               "anyOf": [
                {
                 "type": "integer",
                 "minimum": 0,
                 "maximum": 100
                },
                {
                 "type": "null"
                }
               ]
              },
              "minItems": 5,
              "maxItems": 5
             },
             {
              "type": "null"
             }
            ]
           },
           "chance_n": {
            "type": "array",
            "items": {
             "type": "integer"
            },
            "minItems": 5,
            "maxItems": 5
           }
          },
          "required": [
           "date",
           "win",
           "label",
           "so_far_mm",
           "so_far_in",
           "so_far_src",
           "so_far_at",
           "partial",
           "gauge_down",
           "first_only",
           "trace",
           "radar_mm",
           "radar_in",
           "radar_at",
           "radar_flag",
           "recorded",
           "rest_from",
           "left_h",
           "amt_mm",
           "amt_in",
           "mean_mm",
           "mean_in",
           "total_mm",
           "total_in",
           "pop",
           "pop_n",
           "pop_src",
           "runs",
           "chance",
           "chance_n"
          ],
          "additionalProperties": false,
          "description": "Today in the window: observed so far plus the rest of the window from now."
         },
         {
          "type": "null"
         }
        ],
        "description": "Today in the body's window (the first station shown under lst)."
       },
       "days": {
        "anyOf": [
         {
          "type": "array",
          "items": {
           "type": "object",
           "properties": {
            "date": {
             "type": "string",
             "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            },
            "when": {
             "anyOf": [
              {
               "type": "string"
              },
              {
               "type": "null"
              }
             ],
             "description": "today | tomorrow | +N | past (relative to the window's open day)."
            },
            "rest": {
             "type": "boolean",
             "description": "True for the open day: the values are the rest of the window from now."
            },
            "amt_mm": {
             "anyOf": [
              {
               "type": "number"
              },
              {
               "type": "null"
              }
             ],
             "description": "Median of the counted sources' totals (mm)."
            },
            "amt_in": {
             "anyOf": [
              {
               "type": "number"
              },
              {
               "type": "null"
              }
             ]
            },
            "amt_range_mm": {
             "anyOf": [
              {
               "type": "array",
               "items": {
                "type": "number"
               },
               "minItems": 2,
               "maxItems": 2
              },
              {
               "type": "null"
              }
             ],
             "description": "Min-max of the same sources (mm)."
            },
            "amt_range_in": {
             "anyOf": [
              {
               "type": "array",
               "items": {
                "type": "number"
               },
               "minItems": 2,
               "maxItems": 2
              },
              {
               "type": "null"
              }
             ]
            },
            "amt_n": {
             "anyOf": [
              {
               "type": "integer"
              },
              {
               "type": "null"
              }
             ],
             "description": "Sources in the amount median."
            },
            "amt_src": {
             "type": "array",
             "items": {
              "type": "string"
             }
            },
            "mean_mm": {
             "anyOf": [
              {
               "type": "number"
              },
              {
               "type": "null"
              }
             ],
             "description": "Expected (mean) total: member means for ensembles, NBM's mean, else each total (mm)."
            },
            "mean_in": {
             "anyOf": [
              {
               "type": "number"
              },
              {
               "type": "null"
              }
             ]
            },
            "wet": {
             "anyOf": [
              {
               "type": "array",
               "items": {
                "type": "integer"
               },
               "minItems": 2,
               "maxItems": 2
              },
              {
               "type": "null"
              }
             ],
             "description": "[k, n]: counted sources with 0.01 in or more."
            },
            "share": {
             "anyOf": [
              {
               "type": "array",
               "items": {
                "type": "integer"
               },
               "minItems": 5,
               "maxItems": 5
              },
              {
               "type": "null"
              }
             ],
             "description": "Counted sources at or above each threshold."
            },
            "pop": {
             "anyOf": [
              {
               "type": "integer",
               "minimum": 0,
               "maximum": 100
              },
              {
               "type": "null"
              }
             ],
             "description": "= chance[0] (for v1 readers)."
            },
            "pop_n": {
             "type": "integer",
             "description": "Model families behind pop."
            },
            "pop_src": {
             "type": "array",
             "items": {
              "type": "string"
             },
             "description": "Family ids: ecmwf (ENS), ncep (GEFS), cmc (GEPS), nbm (NBM calibrated), dwd (MOSMIX), smn (SMN)."
            },
            "chance": {
             "anyOf": [
              {
               "type": "array",
               "items": {
                "anyOf": [
                 {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 100
                 },
                 {
                  "type": "null"
                 }
                ]
               },
               "minItems": 5,
               "maxItems": 5
              },
              {
               "type": "null"
              }
             ],
             "description": "Chance (%) of each threshold or more: median over families of their native chance (ensembles: members' share, raw). Null entries below blend.pop_min_n families."
            },
            "chance_n": {
             "type": "array",
             "items": {
              "type": "integer"
             },
             "minItems": 5,
             "maxItems": 5,
             "description": "Families behind each chance."
            },
            "nbm_cal": {
             "anyOf": [
              {
               "type": "array",
               "items": {
                "anyOf": [
                 {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 100
                 },
                 {
                  "type": "null"
                 }
                ]
               },
               "minItems": 5,
               "maxItems": 5
              },
              {
               "type": "null"
              }
             ],
             "description": "NBM calibrated chances alone (24 h from 06Z, D1-D3), else null."
            },
            "lb": {
             "anyOf": [
              {
               "type": "integer",
               "minimum": 0,
               "maximum": 100
              },
              {
               "type": "null"
              }
             ],
             "description": "Largest lower bound (%) from a period wholly inside the window (never counted)."
            },
            "lb_src": {
             "anyOf": [
              {
               "type": "string"
              },
              {
               "type": "null"
              }
             ]
            },
            "lb_win": {
             "anyOf": [
              {
               "type": "array",
               "items": {
                "type": "string",
                "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
               },
               "minItems": 2,
               "maxItems": 2
              },
              {
               "type": "null"
              }
             ]
            },
            "below_lb": {
             "type": "boolean",
             "description": "The consensus is under the lower bound: sources disagree."
            }
           },
           "required": [
            "date",
            "when",
            "rest",
            "amt_mm",
            "amt_in",
            "amt_range_mm",
            "amt_range_in",
            "amt_n",
            "amt_src",
            "mean_mm",
            "mean_in",
            "wet",
            "share",
            "pop",
            "pop_n",
            "pop_src",
            "chance",
            "chance_n",
            "nbm_cal",
            "lb",
            "lb_src",
            "lb_win",
            "below_lb"
           ],
           "additionalProperties": false
          }
         },
         {
          "type": "null"
         }
        ],
        "description": "One entry per local date (line: the date, plus tomorrow when it is today)."
       },
       "week": {
        "anyOf": [
         {
          "type": "object",
          "properties": {
           "from": {
            "anyOf": [
             {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
             },
             {
              "type": "null"
             }
            ]
           },
           "to": {
            "anyOf": [
             {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
             },
             {
              "type": "null"
             }
            ]
           },
           "amt_mm": {
            "anyOf": [
             {
              "type": "number"
             },
             {
              "type": "null"
             }
            ]
           },
           "amt_in": {
            "anyOf": [
             {
              "type": "number"
             },
             {
              "type": "null"
             }
            ]
           },
           "amt_range_mm": {
            "anyOf": [
             {
              "type": "array",
              "items": {
               "type": "number"
              },
              "minItems": 2,
              "maxItems": 2
             },
             {
              "type": "null"
             }
            ]
           },
           "amt_range_in": {
            "anyOf": [
             {
              "type": "array",
              "items": {
               "type": "number"
              },
              "minItems": 2,
              "maxItems": 2
             },
             {
              "type": "null"
             }
            ]
           },
           "amt_n": {
            "anyOf": [
             {
              "type": "integer"
             },
             {
              "type": "null"
             }
            ]
           },
           "mean_mm": {
            "anyOf": [
             {
              "type": "number"
             },
             {
              "type": "null"
             }
            ]
           },
           "mean_in": {
            "anyOf": [
             {
              "type": "number"
             },
             {
              "type": "null"
             }
            ]
           },
           "q_mm": {
            "anyOf": [
             {
              "type": "array",
              "items": {
               "type": "number"
              },
              "minItems": 7,
              "maxItems": 7
             },
             {
              "type": "null"
             }
            ],
            "description": "Pooled member quantiles p05, p10, p25, p50, p75, p90, p95 (families weighted equally), mm."
           },
           "q_in": {
            "anyOf": [
             {
              "type": "array",
              "items": {
               "type": "number"
              },
              "minItems": 7,
              "maxItems": 7
             },
             {
              "type": "null"
             }
            ]
           },
           "chance": {
            "anyOf": [
             {
              "type": "array",
              "items": {
               "anyOf": [
                {
                 "type": "integer",
                 "minimum": 0,
                 "maximum": 100
                },
                {
                 "type": "null"
                }
               ]
              },
              "minItems": 5,
              "maxItems": 5
             },
             {
              "type": "null"
             }
            ],
            "description": "Members' share (raw) of a week total at each threshold or more."
           }
          },
          "required": [
           "from",
           "to",
           "amt_mm",
           "amt_in",
           "amt_range_mm",
           "amt_range_in",
           "amt_n",
           "mean_mm",
           "mean_in",
           "q_mm",
           "q_in",
           "chance"
          ],
          "additionalProperties": false,
          "description": "Next 7 days (D1-D7) total."
         },
         {
          "type": "null"
         }
        ],
        "description": "Next 7 days (D1-D7)."
       },
       "weekend": {
        "anyOf": [
         {
          "type": "object",
          "properties": {
           "sat": {
            "anyOf": [
             {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
             },
             {
              "type": "null"
             }
            ]
           },
           "sun": {
            "anyOf": [
             {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
             },
             {
              "type": "null"
             }
            ]
           },
           "stn": {
            "anyOf": [
             {
              "type": "string"
             },
             {
              "type": "null"
             }
            ]
           },
           "either": {
            "anyOf": [
             {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
             },
             {
              "type": "null"
             }
            ],
            "description": "Members' share (raw) with Saturday or Sunday at 0.01 in or more (climate days); 100 once Saturday is recorded wet."
           },
           "either_n": {
            "anyOf": [
             {
              "type": "integer"
             },
             {
              "type": "null"
             }
            ]
           },
           "q_mm": {
            "anyOf": [
             {
              "type": "array",
              "items": {
               "type": "number"
              },
              "minItems": 7,
              "maxItems": 7
             },
             {
              "type": "null"
             }
            ]
           },
           "q_in": {
            "anyOf": [
             {
              "type": "array",
              "items": {
               "type": "number"
              },
              "minItems": 7,
              "maxItems": 7
             },
             {
              "type": "null"
             }
            ]
           },
           "recorded": {
            "type": "boolean"
           }
          },
          "required": [
           "sat",
           "sun",
           "stn",
           "either",
           "either_n",
           "q_mm",
           "q_in",
           "recorded"
          ],
          "additionalProperties": false,
          "description": "US market places: the weekend (LST windows at the settle station)."
         },
         {
          "type": "null"
         }
        ],
        "description": "US market places only."
       },
       "month": {
        "anyOf": [
         {
          "type": "object",
          "properties": {
           "month": {
            "type": "string"
           },
           "stn": {
            "anyOf": [
             {
              "type": "string"
             },
             {
              "type": "null"
             }
            ]
           },
           "end_utc": {
            "anyOf": [
             {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
             },
             {
              "type": "null"
             }
            ]
           },
           "mtd_mm": {
            "anyOf": [
             {
              "type": "number"
             },
             {
              "type": "null"
             }
            ],
            "description": "Month to date (the settle product when there is one)."
           },
           "mtd_in": {
            "anyOf": [
             {
              "type": "number"
             },
             {
              "type": "null"
             }
            ]
           },
           "mtd_src": {
            "anyOf": [
             {
              "type": "string"
             },
             {
              "type": "null"
             }
            ]
           },
           "mtd_label": {
            "anyOf": [
             {
              "type": "string"
             },
             {
              "type": "null"
             }
            ]
           },
           "mtd_through": {
            "anyOf": [
             {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
             },
             {
              "type": "null"
             }
            ]
           },
           "rest_mean_mm": {
            "anyOf": [
             {
              "type": "number"
             },
             {
              "type": "null"
             }
            ],
            "description": "Expected (mean) rest of month; raw ensemble mean past D7, then US 1991-2020 normals."
           },
           "rest_mean_in": {
            "anyOf": [
             {
              "type": "number"
             },
             {
              "type": "null"
             }
            ]
           },
           "rest_thru": {
            "anyOf": [
             {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
             },
             {
              "type": "null"
             }
            ]
           },
           "rest_src": {
            "anyOf": [
             {
              "type": "string"
             },
             {
              "type": "null"
             }
            ]
           },
           "q_mm": {
            "anyOf": [
             {
              "type": "array",
              "items": {
               "type": "number"
              },
              "minItems": 7,
              "maxItems": 7
             },
             {
              "type": "null"
             }
            ],
            "description": "Rest-of-month member quantiles p05..p95 when an ensemble reaches month end."
           },
           "q_in": {
            "anyOf": [
             {
              "type": "array",
              "items": {
               "type": "number"
              },
              "minItems": 7,
              "maxItems": 7
             },
             {
              "type": "null"
             }
            ]
           },
           "total_mean_mm": {
            "anyOf": [
             {
              "type": "number"
             },
             {
              "type": "null"
             }
            ],
            "description": "mtd + rest_mean."
           },
           "total_mean_in": {
            "anyOf": [
             {
              "type": "number"
             },
             {
              "type": "null"
             }
            ]
           }
          },
          "required": [
           "month",
           "stn",
           "end_utc",
           "mtd_mm",
           "mtd_in",
           "mtd_src",
           "mtd_label",
           "mtd_through",
           "rest_mean_mm",
           "rest_mean_in",
           "rest_thru",
           "rest_src",
           "q_mm",
           "q_in",
           "total_mean_mm",
           "total_mean_in"
          ],
          "additionalProperties": false,
          "description": "Month to date and the rest of the month (to the settle product's month end)."
         },
         {
          "type": "null"
         }
        ],
        "description": "Month to date and rest of month."
       },
       "lst": {
        "anyOf": [
         {
          "type": "array",
          "items": {
           "type": "object",
           "properties": {
            "stn": {
             "type": "string"
            },
            "venues": {
             "type": "array",
             "items": {
              "type": "string"
             }
            },
            "window": {
             "type": "object",
             "properties": {
              "from_utc": {
               "type": "string",
               "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
              },
              "to_utc": {
               "type": "string",
               "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
              },
              "label": {
               "type": "string",
               "description": "'calendar day' or the climate-day label, e.g. 'climate day, 1 am–1 am CDT (midnight–midnight standard time)'."
              }
             },
             "required": [
              "from_utc",
              "to_utc",
              "label"
             ],
             "additionalProperties": false,
             "description": "The window of `date`: [from_utc, to_utc)."
            },
            "today": {
             "anyOf": [
              {
               "type": "object",
               "properties": {
                "date": {
                 "type": "string",
                 "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
                },
                "win": {
                 "enum": [
                  "lst",
                  "cal"
                 ]
                },
                "label": {
                 "type": "string"
                },
                "so_far_mm": {
                 "anyOf": [
                  {
                   "type": "number"
                  },
                  {
                   "type": "null"
                  }
                 ],
                 "description": "Station so far in the window (hourly reports; the climate report can differ); null where no gauge feed."
                },
                "so_far_in": {
                 "anyOf": [
                  {
                   "type": "number"
                  },
                  {
                   "type": "null"
                  }
                 ]
                },
                "so_far_src": {
                 "anyOf": [
                  {
                   "type": "string"
                  },
                  {
                   "type": "null"
                  }
                 ]
                },
                "so_far_at": {
                 "anyOf": [
                  {
                   "type": "string",
                   "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
                  },
                  {
                   "type": "null"
                  }
                 ]
                },
                "partial": {
                 "type": "boolean",
                 "description": "A routine hour is missing or the gauge is down."
                },
                "gauge_down": {
                 "type": "boolean"
                },
                "first_only": {
                 "type": "boolean",
                 "description": "Wet only because of the window's first report (includes rain before the window)."
                },
                "trace": {
                 "type": "boolean"
                },
                "radar_mm": {
                 "anyOf": [
                  {
                   "type": "number"
                  },
                  {
                   "type": "null"
                  }
                 ],
                 "description": "Radar estimate (MRMS, gauge-adjusted) over the window; context, never the so far."
                },
                "radar_in": {
                 "anyOf": [
                  {
                   "type": "number"
                  },
                  {
                   "type": "null"
                  }
                 ]
                },
                "radar_at": {
                 "anyOf": [
                  {
                   "type": "string",
                   "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
                  },
                  {
                   "type": "null"
                  }
                 ]
                },
                "radar_flag": {
                 "type": "boolean",
                 "description": "Radar shows rain the station does not."
                },
                "recorded": {
                 "type": "boolean",
                 "description": "Station so far is 0.01 in or more (never radar alone, never the first report alone)."
                },
                "rest_from": {
                 "anyOf": [
                  {
                   "type": "string",
                   "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
                  },
                  {
                   "type": "null"
                  }
                 ],
                 "description": "The rest of the window starts here (now)."
                },
                "left_h": {
                 "anyOf": [
                  {
                   "type": "number"
                  },
                  {
                   "type": "null"
                  }
                 ],
                 "description": "Hours left in the window."
                },
                "amt_mm": {
                 "anyOf": [
                  {
                   "type": "number"
                  },
                  {
                   "type": "null"
                  }
                 ],
                 "description": "Rest of the window: median (mm)."
                },
                "amt_in": {
                 "anyOf": [
                  {
                   "type": "number"
                  },
                  {
                   "type": "null"
                  }
                 ]
                },
                "mean_mm": {
                 "anyOf": [
                  {
                   "type": "number"
                  },
                  {
                   "type": "null"
                  }
                 ],
                 "description": "Rest of the window: expected (mean) (mm)."
                },
                "mean_in": {
                 "anyOf": [
                  {
                   "type": "number"
                  },
                  {
                   "type": "null"
                  }
                 ]
                },
                "total_mm": {
                 "anyOf": [
                  {
                   "type": "number"
                  },
                  {
                   "type": "null"
                  }
                 ],
                 "description": "so far + rest (median)."
                },
                "total_in": {
                 "anyOf": [
                  {
                   "type": "number"
                  },
                  {
                   "type": "null"
                  }
                 ]
                },
                "pop": {
                 "anyOf": [
                  {
                   "type": "integer",
                   "minimum": 0,
                   "maximum": 100
                  },
                  {
                   "type": "null"
                  }
                 ],
                 "description": "Rest-of-window chance of 0.01 in or more (member families); 100 once recorded."
                },
                "pop_n": {
                 "type": "integer"
                },
                "pop_src": {
                 "type": "array",
                 "items": {
                  "type": "string"
                 }
                },
                "runs": {
                 "type": "array",
                 "items": {
                  "type": "string"
                 },
                 "description": "Run of each family in pop_src (e.g. 00Z)."
                },
                "chance": {
                 "anyOf": [
                  {
                   "type": "array",
                   "items": {
                    "anyOf": [
                     {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 100
                     },
                     {
                      "type": "null"
                     }
                    ]
                   },
                   "minItems": 5,
                   "maxItems": 5
                  },
                  {
                   "type": "null"
                  }
                 ]
                },
                "chance_n": {
                 "type": "array",
                 "items": {
                  "type": "integer"
                 },
                 "minItems": 5,
                 "maxItems": 5
                }
               },
               "required": [
                "date",
                "win",
                "label",
                "so_far_mm",
                "so_far_in",
                "so_far_src",
                "so_far_at",
                "partial",
                "gauge_down",
                "first_only",
                "trace",
                "radar_mm",
                "radar_in",
                "radar_at",
                "radar_flag",
                "recorded",
                "rest_from",
                "left_h",
                "amt_mm",
                "amt_in",
                "mean_mm",
                "mean_in",
                "total_mm",
                "total_in",
                "pop",
                "pop_n",
                "pop_src",
                "runs",
                "chance",
                "chance_n"
               ],
               "additionalProperties": false,
               "description": "Today in the window: observed so far plus the rest of the window from now."
              },
              {
               "type": "null"
              }
             ]
            },
            "days": {
             "type": "array",
             "items": {
              "type": "object",
              "properties": {
               "date": {
                "type": "string",
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
               },
               "when": {
                "anyOf": [
                 {
                  "type": "string"
                 },
                 {
                  "type": "null"
                 }
                ],
                "description": "today | tomorrow | +N | past (relative to the window's open day)."
               },
               "rest": {
                "type": "boolean",
                "description": "True for the open day: the values are the rest of the window from now."
               },
               "amt_mm": {
                "anyOf": [
                 {
                  "type": "number"
                 },
                 {
                  "type": "null"
                 }
                ],
                "description": "Median of the counted sources' totals (mm)."
               },
               "amt_in": {
                "anyOf": [
                 {
                  "type": "number"
                 },
                 {
                  "type": "null"
                 }
                ]
               },
               "amt_range_mm": {
                "anyOf": [
                 {
                  "type": "array",
                  "items": {
                   "type": "number"
                  },
                  "minItems": 2,
                  "maxItems": 2
                 },
                 {
                  "type": "null"
                 }
                ],
                "description": "Min-max of the same sources (mm)."
               },
               "amt_range_in": {
                "anyOf": [
                 {
                  "type": "array",
                  "items": {
                   "type": "number"
                  },
                  "minItems": 2,
                  "maxItems": 2
                 },
                 {
                  "type": "null"
                 }
                ]
               },
               "amt_n": {
                "anyOf": [
                 {
                  "type": "integer"
                 },
                 {
                  "type": "null"
                 }
                ],
                "description": "Sources in the amount median."
               },
               "amt_src": {
                "type": "array",
                "items": {
                 "type": "string"
                }
               },
               "mean_mm": {
                "anyOf": [
                 {
                  "type": "number"
                 },
                 {
                  "type": "null"
                 }
                ],
                "description": "Expected (mean) total: member means for ensembles, NBM's mean, else each total (mm)."
               },
               "mean_in": {
                "anyOf": [
                 {
                  "type": "number"
                 },
                 {
                  "type": "null"
                 }
                ]
               },
               "wet": {
                "anyOf": [
                 {
                  "type": "array",
                  "items": {
                   "type": "integer"
                  },
                  "minItems": 2,
                  "maxItems": 2
                 },
                 {
                  "type": "null"
                 }
                ],
                "description": "[k, n]: counted sources with 0.01 in or more."
               },
               "share": {
                "anyOf": [
                 {
                  "type": "array",
                  "items": {
                   "type": "integer"
                  },
                  "minItems": 5,
                  "maxItems": 5
                 },
                 {
                  "type": "null"
                 }
                ],
                "description": "Counted sources at or above each threshold."
               },
               "pop": {
                "anyOf": [
                 {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 100
                 },
                 {
                  "type": "null"
                 }
                ],
                "description": "= chance[0] (for v1 readers)."
               },
               "pop_n": {
                "type": "integer",
                "description": "Model families behind pop."
               },
               "pop_src": {
                "type": "array",
                "items": {
                 "type": "string"
                },
                "description": "Family ids: ecmwf (ENS), ncep (GEFS), cmc (GEPS), nbm (NBM calibrated), dwd (MOSMIX), smn (SMN)."
               },
               "chance": {
                "anyOf": [
                 {
                  "type": "array",
                  "items": {
                   "anyOf": [
                    {
                     "type": "integer",
                     "minimum": 0,
                     "maximum": 100
                    },
                    {
                     "type": "null"
                    }
                   ]
                  },
                  "minItems": 5,
                  "maxItems": 5
                 },
                 {
                  "type": "null"
                 }
                ],
                "description": "Chance (%) of each threshold or more: median over families of their native chance (ensembles: members' share, raw). Null entries below blend.pop_min_n families."
               },
               "chance_n": {
                "type": "array",
                "items": {
                 "type": "integer"
                },
                "minItems": 5,
                "maxItems": 5,
                "description": "Families behind each chance."
               },
               "nbm_cal": {
                "anyOf": [
                 {
                  "type": "array",
                  "items": {
                   "anyOf": [
                    {
                     "type": "integer",
                     "minimum": 0,
                     "maximum": 100
                    },
                    {
                     "type": "null"
                    }
                   ]
                  },
                  "minItems": 5,
                  "maxItems": 5
                 },
                 {
                  "type": "null"
                 }
                ],
                "description": "NBM calibrated chances alone (24 h from 06Z, D1-D3), else null."
               },
               "lb": {
                "anyOf": [
                 {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 100
                 },
                 {
                  "type": "null"
                 }
                ],
                "description": "Largest lower bound (%) from a period wholly inside the window (never counted)."
               },
               "lb_src": {
                "anyOf": [
                 {
                  "type": "string"
                 },
                 {
                  "type": "null"
                 }
                ]
               },
               "lb_win": {
                "anyOf": [
                 {
                  "type": "array",
                  "items": {
                   "type": "string",
                   "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
                  },
                  "minItems": 2,
                  "maxItems": 2
                 },
                 {
                  "type": "null"
                 }
                ]
               },
               "below_lb": {
                "type": "boolean",
                "description": "The consensus is under the lower bound: sources disagree."
               }
              },
              "required": [
               "date",
               "when",
               "rest",
               "amt_mm",
               "amt_in",
               "amt_range_mm",
               "amt_range_in",
               "amt_n",
               "amt_src",
               "mean_mm",
               "mean_in",
               "wet",
               "share",
               "pop",
               "pop_n",
               "pop_src",
               "chance",
               "chance_n",
               "nbm_cal",
               "lb",
               "lb_src",
               "lb_win",
               "below_lb"
              ],
              "additionalProperties": false
             }
            }
           },
           "required": [
            "stn",
            "venues",
            "window",
            "today",
            "days"
           ],
           "additionalProperties": false
          },
          "description": "Each daily-rain settle station shown (win=lst): its climate day."
         },
         {
          "type": "null"
         }
        ]
       },
       "sources": {
        "anyOf": [
         {
          "type": "array",
          "items": {
           "type": "object",
           "properties": {
            "id": {
             "type": "string"
            },
            "src": {
             "type": "string"
            },
            "stn": {
             "anyOf": [
              {
               "type": "string"
              },
              {
               "type": "null"
              }
             ]
            },
            "fam": {
             "anyOf": [
              {
               "type": "string"
              },
              {
               "type": "null"
              }
             ]
            },
            "step_h": {
             "anyOf": [
              {
               "type": "integer"
              },
              {
               "type": "null"
              }
             ]
            },
            "win": {
             "enum": [
              "cal",
              "lst",
              "06z",
              null
             ]
            },
            "lb": {
             "type": "boolean",
             "description": "Chances are lower bounds."
            },
            "rain_only": {
             "type": "boolean"
            },
            "credit": {
             "anyOf": [
              {
               "type": "string"
              },
              {
               "type": "null"
              }
             ]
            },
            "run": {
             "anyOf": [
              {
               "type": "string",
               "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
              },
              {
               "type": "null"
              }
             ]
            },
            "age_h": {
             "anyOf": [
              {
               "type": "number"
              },
              {
               "type": "null"
              }
             ]
            },
            "status": {
             "anyOf": [
              {
               "type": "string"
              },
              {
               "type": "null"
              }
             ]
            },
            "counted": {
             "type": "boolean"
            },
            "twin": {
             "type": "boolean"
            },
            "days": {
             "type": "array",
             "items": {
              "anyOf": [
               {
                "type": "object",
                "properties": {
                 "amt_mm": {
                  "anyOf": [
                   {
                    "type": "number"
                   },
                   {
                    "type": "null"
                   }
                  ]
                 },
                 "amt_in": {
                  "anyOf": [
                   {
                    "type": "number"
                   },
                   {
                    "type": "null"
                   }
                  ]
                 },
                 "mean_mm": {
                  "anyOf": [
                   {
                    "type": "number"
                   },
                   {
                    "type": "null"
                   }
                  ]
                 },
                 "mean_in": {
                  "anyOf": [
                   {
                    "type": "number"
                   },
                   {
                    "type": "null"
                   }
                  ]
                 },
                 "pop": {
                  "anyOf": [
                   {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 100
                   },
                   {
                    "type": "null"
                   }
                  ],
                  "description": "The row's native chance, or its lower bound on `lb` rows."
                 },
                 "chance": {
                  "anyOf": [
                   {
                    "type": "array",
                    "items": {
                     "anyOf": [
                      {
                       "type": "integer",
                       "minimum": 0,
                       "maximum": 100
                      },
                      {
                       "type": "null"
                      }
                     ]
                    },
                    "minItems": 5,
                    "maxItems": 5
                   },
                   {
                    "type": "null"
                   }
                  ],
                  "description": "Members' share (or NBM calibrated) at each threshold; null on bound rows."
                 },
                 "mq_mm": {
                  "anyOf": [
                   {
                    "type": "array",
                    "items": {
                     "type": "number"
                    },
                    "minItems": 2,
                    "maxItems": 2
                   },
                   {
                    "type": "null"
                   }
                  ],
                  "description": "Member p10, p90 (mm)."
                 },
                 "mq_in": {
                  "anyOf": [
                   {
                    "type": "array",
                    "items": {
                     "type": "number"
                    },
                    "minItems": 2,
                    "maxItems": 2
                   },
                   {
                    "type": "null"
                   }
                  ]
                 },
                 "c": {
                  "enum": [
                   0,
                   1,
                   null
                  ],
                  "description": "1 = counted that day."
                 },
                 "day": {
                  "enum": [
                   0,
                   1,
                   null
                  ],
                  "description": "1 = a whole-day chance, not counted once the day started."
                 },
                 "lbw": {
                  "anyOf": [
                   {
                    "type": "array",
                    "items": {
                     "anyOf": [
                      {
                       "type": "string",
                       "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
                      },
                      {
                       "type": "null"
                      }
                     ]
                    },
                    "minItems": 2,
                    "maxItems": 2
                   },
                   {
                    "type": "null"
                   }
                  ]
                 }
                },
                "required": [
                 "amt_mm",
                 "amt_in",
                 "mean_mm",
                 "mean_in",
                 "pop",
                 "chance",
                 "mq_mm",
                 "mq_in",
                 "c",
                 "day",
                 "lbw"
                ],
                "additionalProperties": false
               },
               {
                "type": "null"
               }
              ]
             }
            }
           },
           "required": [
            "id",
            "src",
            "stn",
            "fam",
            "step_h",
            "win",
            "lb",
            "rain_only",
            "credit",
            "run",
            "age_h",
            "status",
            "counted",
            "twin",
            "days"
           ],
           "additionalProperties": false
          }
         },
         {
          "type": "null"
         }
        ],
        "description": "size=table: one row per source (all=1 adds twins and rows not counted)."
       },
       "series": {
        "anyOf": [
         {
          "type": "object",
          "properties": {
           "step_h": {
            "type": "integer"
           },
           "hours": {
            "type": "integer"
           },
           "times": {
            "type": "array",
            "items": {
             "type": "string"
            }
           },
           "times_iso": {
            "type": "array",
            "items": {
             "type": "string"
            }
           },
           "cols_mm": {
            "type": "object",
            "additionalProperties": {
             "type": "array",
             "items": {
              "anyOf": [
               {
                "type": "number"
               },
               {
                "type": "null"
               }
              ]
             }
            }
           },
           "cols_in": {
            "type": "object",
            "additionalProperties": {
             "type": "array",
             "items": {
              "anyOf": [
               {
                "type": "number"
               },
               {
                "type": "null"
               }
              ]
             }
            }
           },
           "med_mm": {
            "type": "array",
            "items": {
             "anyOf": [
              {
               "type": "number"
              },
              {
               "type": "null"
              }
             ]
            }
           },
           "med_in": {
            "type": "array",
            "items": {
             "anyOf": [
              {
               "type": "number"
              },
              {
               "type": "null"
              }
             ]
            }
           },
           "n": {
            "type": "integer"
           },
           "excluded": {
            "type": "array",
            "items": {
             "type": "string"
            },
            "description": "Rows not in the series, with the reason (step, coverage)."
           }
          },
          "required": [
           "step_h",
           "hours",
           "times",
           "times_iso",
           "cols_mm",
           "cols_in",
           "med_mm",
           "med_in",
           "n",
           "excluded"
          ],
          "additionalProperties": false
         },
         {
          "type": "null"
         }
        ],
        "description": "size=series: amounts per step bucket (UTC-aligned)."
       },
       "alerts": {
        "anyOf": [
         {
          "type": "array",
          "items": {
           "type": "object",
           "properties": {
            "id": {
             "type": "string",
             "description": "Alert id at its feed."
            },
            "event": {
             "type": "string",
             "description": "Event name (Flood Warning, ...)."
            },
            "severity": {
             "type": [
              "string",
              "null"
             ],
             "description": "Extreme | Severe | Moderate | Minor | Unknown."
            },
            "onset": {
             "anyOf": [
              {
               "type": "string",
               "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
              },
              {
               "type": "null"
              }
             ],
             "description": "Start (UTC), or null."
            },
            "expires": {
             "anyOf": [
              {
               "type": "string",
               "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
              },
              {
               "type": "null"
              }
             ],
             "description": "End (UTC), or null (until further notice)."
            },
            "headline": {
             "type": [
              "string",
              "null"
             ],
             "description": "The issuer's headline."
            },
            "url": {
             "type": [
              "string",
              "null"
             ],
             "description": "The alert at its source."
            },
            "sender": {
             "type": [
              "string",
              "null"
             ],
             "description": "Issuing service."
            },
            "credit": {
             "type": "string",
             "description": "Credit key of the feed."
            }
           },
           "required": [
            "id",
            "event",
            "severity",
            "onset",
            "expires",
            "headline",
            "url",
            "sender",
            "credit"
           ],
           "additionalProperties": false
          }
         },
         {
          "type": "null"
         }
        ],
        "description": "Active alerts at the place; null when no open feed covers it."
       },
       "alerts_note": {
        "type": [
         "string",
         "null"
        ],
        "description": "Why alerts is null or empty (no open feed, polygon warnings only, feed delayed)."
       },
       "storm": {
        "anyOf": [
         {
          "type": "object",
          "properties": {
           "name": {
            "type": "string",
            "description": "Storm name."
           },
           "km": {
            "type": "integer",
            "description": "Distance from the place, km."
           },
           "url": {
            "type": [
             "string",
             "null"
            ],
            "description": "The storm at its source (NHC)."
           }
          },
          "required": [
           "name",
           "km",
           "url"
          ],
          "additionalProperties": false
         },
         {
          "type": "null"
         }
        ],
        "description": "Nearest named storm within 1,500 km, or null."
       },
       "notes": {
        "type": "array",
        "items": {
         "type": "string"
        },
        "description": "Definitions and honest labels (members' share is raw; lower bounds; radar)."
       },
       "credits": {
        "type": "array",
        "items": {
         "type": "string"
        },
        "minItems": 1,
        "description": "Credit strings to keep when you repeat numbers."
       },
       "credit_keys": {
        "type": "array",
        "items": {
         "type": "string"
        },
        "minItems": 1,
        "description": "Their keys (/credits lists every line)."
       },
       "credits_url": {
        "type": "string",
        "format": "uri",
        "description": "The full credits page."
       }
      },
      "required": [
       "v",
       "variable",
       "size",
       "asof",
       "forecast_updated",
       "next_update",
       "place",
       "url",
       "units",
       "rain_unit",
       "win",
       "stn",
       "window",
       "thresholds",
       "date",
       "when",
       "today",
       "days",
       "week",
       "weekend",
       "month",
       "lst",
       "sources",
       "series",
       "alerts",
       "alerts_note",
       "storm",
       "notes",
       "credits",
       "credit_keys",
       "credits_url"
      ],
      "additionalProperties": false,
      "description": "One place: /api/v1/blend?variable=rain (MCP forecast variable=rain)."
     },
     {
      "type": "object",
      "properties": {
       "v": {
        "const": 1
       },
       "variable": {
        "const": "rain"
       },
       "size": {
        "enum": [
         "line",
         "week"
        ]
       },
       "asof": {
        "type": "string",
        "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$",
        "description": "When this blend was built (UTC)."
       },
       "results": {
        "type": "array",
        "items": {
         "type": "object",
         "properties": {
          "v": {
           "const": 1
          },
          "variable": {
           "const": "rain",
           "description": "Rain body (variable=rain)."
          },
          "size": {
           "enum": [
            "line",
            "week",
            "table",
            "series"
           ]
          },
          "asof": {
           "type": "string",
           "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$",
           "description": "When this blend was built (UTC)."
          },
          "forecast_updated": {
           "anyOf": [
            {
             "type": "string",
             "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
            },
            {
             "type": "null"
            }
           ],
           "description": "When the newest counted forecast became available (UTC)."
          },
          "next_update": {
           "anyOf": [
            {
             "type": "string",
             "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
            },
            {
             "type": "null"
            }
           ],
           "description": "The next scheduled run of this place's sources (UTC): expected, not promised; null when none is scheduled or every one is over 60 min late. A past next_update or an overdue run adds a note starting 'update due:' or 'update overdue:'."
          },
          "place": {
           "type": "object",
           "properties": {
            "slug": {
             "type": "string",
             "description": "Slug of the place (its page is /p/{slug})."
            },
            "display": {
             "type": "string",
             "description": "Display name: city, region, country."
            },
            "name": {
             "type": "string",
             "description": "Place name."
            },
            "cc": {
             "type": "string",
             "description": "ISO 3166-1 alpha-2 country code."
            },
            "admin1": {
             "type": [
              "string",
              "null"
             ],
             "description": "First-level region (US state code), or null."
            },
            "stn": {
             "type": [
              "string",
              "null"
             ],
             "description": "ICAO of the forecast station; null for a grid point."
            },
            "label": {
             "type": [
              "string",
              "null"
             ],
             "description": "Station label shown on pages (· joined)."
            },
            "tz": {
             "type": "string",
             "description": "IANA time zone; dates are local to it."
            },
            "lat": {
             "type": "number",
             "description": "Latitude of the forecast point."
            },
            "lon": {
             "type": "number",
             "description": "Longitude of the forecast point."
            },
            "coverage": {
             "enum": [
              "full",
              "partial",
              "grid"
             ],
             "description": "full (every source) | partial (more sources by the next cycle) | grid (global models only)."
            },
            "snapped_km": {
             "type": [
              "number",
              "null"
             ],
             "description": "A lat,lon snapped to a place: the distance in km; else null."
            },
            "nearest": {
             "anyOf": [
              {
               "type": "array",
               "prefixItems": [
                {
                 "type": "string"
                },
                {
                 "type": "string"
                },
                {
                 "type": "number"
                }
               ],
               "minItems": 3,
               "maxItems": 3
              },
              {
               "type": "null"
              }
             ],
             "description": "Grid points: [slug, display, km] of the nearest full blend; else null."
            },
            "also": {
             "type": "array",
             "items": {
              "type": "string"
             },
             "description": "Other places with the same name (slugs)."
            },
            "via": {
             "type": [
              "string",
              "null"
             ],
             "description": "The ICAO you asked for when it is not this answer's station; null otherwise."
            }
           },
           "required": [
            "slug",
            "display",
            "name",
            "cc",
            "admin1",
            "stn",
            "label",
            "tz",
            "lat",
            "lon",
            "coverage",
            "snapped_km",
            "nearest",
            "also",
            "via"
           ],
           "additionalProperties": false,
           "description": "The place answered."
          },
          "url": {
           "type": "string",
           "pattern": "^https?://\\S+$",
           "description": "The place page's Rain view."
          },
          "units": {
           "enum": [
            "F",
            "C"
           ],
           "description": "F or C: temperatures in these units; rain in inches (F) or mm (C)."
          },
          "rain_unit": {
           "enum": [
            "in",
            "mm"
           ],
           "description": "Text amounts: inches under F, mm under C (JSON has both)."
          },
          "win": {
           "enum": [
            "lst",
            "cal"
           ],
           "description": "lst = the settle station's climate day (local standard time); cal = the local calendar day."
          },
          "stn": {
           "anyOf": [
            {
             "type": "array",
             "items": {
              "type": "string"
             }
            },
            {
             "type": "null"
            }
           ],
           "description": "Settle stations shown (win=lst)."
          },
          "window": {
           "anyOf": [
            {
             "type": "object",
             "properties": {
              "from_utc": {
               "type": "string",
               "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
              },
              "to_utc": {
               "type": "string",
               "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
              },
              "label": {
               "type": "string",
               "description": "'calendar day' or the climate-day label, e.g. 'climate day, 1 am–1 am CDT (midnight–midnight standard time)'."
              }
             },
             "required": [
              "from_utc",
              "to_utc",
              "label"
             ],
             "additionalProperties": false,
             "description": "The window of `date`: [from_utc, to_utc)."
            },
            {
             "type": "null"
            }
           ],
           "description": "The window of `date` (null for series)."
          },
          "thresholds": {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "in": {
              "type": "number"
             },
             "mm": {
              "type": "number"
             }
            },
            "required": [
             "in",
             "mm"
            ],
            "additionalProperties": false
           },
           "minItems": 5,
           "maxItems": 5,
           "description": "chance[i] is the chance of thresholds[i] or more."
          },
          "date": {
           "anyOf": [
            {
             "type": "string",
             "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            },
            {
             "type": "null"
            }
           ],
           "description": "Requested (start) local date; today = the window's open day (under lst the open climate day)."
          },
          "when": {
           "anyOf": [
            {
             "type": "string"
            },
            {
             "type": "null"
            }
           ],
           "description": "today | tomorrow | +N | past."
          },
          "today": {
           "anyOf": [
            {
             "type": "object",
             "properties": {
              "date": {
               "type": "string",
               "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
              },
              "win": {
               "enum": [
                "lst",
                "cal"
               ]
              },
              "label": {
               "type": "string"
              },
              "so_far_mm": {
               "anyOf": [
                {
                 "type": "number"
                },
                {
                 "type": "null"
                }
               ],
               "description": "Station so far in the window (hourly reports; the climate report can differ); null where no gauge feed."
              },
              "so_far_in": {
               "anyOf": [
                {
                 "type": "number"
                },
                {
                 "type": "null"
                }
               ]
              },
              "so_far_src": {
               "anyOf": [
                {
                 "type": "string"
                },
                {
                 "type": "null"
                }
               ]
              },
              "so_far_at": {
               "anyOf": [
                {
                 "type": "string",
                 "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
                },
                {
                 "type": "null"
                }
               ]
              },
              "partial": {
               "type": "boolean",
               "description": "A routine hour is missing or the gauge is down."
              },
              "gauge_down": {
               "type": "boolean"
              },
              "first_only": {
               "type": "boolean",
               "description": "Wet only because of the window's first report (includes rain before the window)."
              },
              "trace": {
               "type": "boolean"
              },
              "radar_mm": {
               "anyOf": [
                {
                 "type": "number"
                },
                {
                 "type": "null"
                }
               ],
               "description": "Radar estimate (MRMS, gauge-adjusted) over the window; context, never the so far."
              },
              "radar_in": {
               "anyOf": [
                {
                 "type": "number"
                },
                {
                 "type": "null"
                }
               ]
              },
              "radar_at": {
               "anyOf": [
                {
                 "type": "string",
                 "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
                },
                {
                 "type": "null"
                }
               ]
              },
              "radar_flag": {
               "type": "boolean",
               "description": "Radar shows rain the station does not."
              },
              "recorded": {
               "type": "boolean",
               "description": "Station so far is 0.01 in or more (never radar alone, never the first report alone)."
              },
              "rest_from": {
               "anyOf": [
                {
                 "type": "string",
                 "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
                },
                {
                 "type": "null"
                }
               ],
               "description": "The rest of the window starts here (now)."
              },
              "left_h": {
               "anyOf": [
                {
                 "type": "number"
                },
                {
                 "type": "null"
                }
               ],
               "description": "Hours left in the window."
              },
              "amt_mm": {
               "anyOf": [
                {
                 "type": "number"
                },
                {
                 "type": "null"
                }
               ],
               "description": "Rest of the window: median (mm)."
              },
              "amt_in": {
               "anyOf": [
                {
                 "type": "number"
                },
                {
                 "type": "null"
                }
               ]
              },
              "mean_mm": {
               "anyOf": [
                {
                 "type": "number"
                },
                {
                 "type": "null"
                }
               ],
               "description": "Rest of the window: expected (mean) (mm)."
              },
              "mean_in": {
               "anyOf": [
                {
                 "type": "number"
                },
                {
                 "type": "null"
                }
               ]
              },
              "total_mm": {
               "anyOf": [
                {
                 "type": "number"
                },
                {
                 "type": "null"
                }
               ],
               "description": "so far + rest (median)."
              },
              "total_in": {
               "anyOf": [
                {
                 "type": "number"
                },
                {
                 "type": "null"
                }
               ]
              },
              "pop": {
               "anyOf": [
                {
                 "type": "integer",
                 "minimum": 0,
                 "maximum": 100
                },
                {
                 "type": "null"
                }
               ],
               "description": "Rest-of-window chance of 0.01 in or more (member families); 100 once recorded."
              },
              "pop_n": {
               "type": "integer"
              },
              "pop_src": {
               "type": "array",
               "items": {
                "type": "string"
               }
              },
              "runs": {
               "type": "array",
               "items": {
                "type": "string"
               },
               "description": "Run of each family in pop_src (e.g. 00Z)."
              },
              "chance": {
               "anyOf": [
                {
                 "type": "array",
                 "items": {
                  "anyOf": [
                   {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 100
                   },
                   {
                    "type": "null"
                   }
                  ]
                 },
                 "minItems": 5,
                 "maxItems": 5
                },
                {
                 "type": "null"
                }
               ]
              },
              "chance_n": {
               "type": "array",
               "items": {
                "type": "integer"
               },
               "minItems": 5,
               "maxItems": 5
              }
             },
             "required": [
              "date",
              "win",
              "label",
              "so_far_mm",
              "so_far_in",
              "so_far_src",
              "so_far_at",
              "partial",
              "gauge_down",
              "first_only",
              "trace",
              "radar_mm",
              "radar_in",
              "radar_at",
              "radar_flag",
              "recorded",
              "rest_from",
              "left_h",
              "amt_mm",
              "amt_in",
              "mean_mm",
              "mean_in",
              "total_mm",
              "total_in",
              "pop",
              "pop_n",
              "pop_src",
              "runs",
              "chance",
              "chance_n"
             ],
             "additionalProperties": false,
             "description": "Today in the window: observed so far plus the rest of the window from now."
            },
            {
             "type": "null"
            }
           ],
           "description": "Today in the body's window (the first station shown under lst)."
          },
          "days": {
           "anyOf": [
            {
             "type": "array",
             "items": {
              "type": "object",
              "properties": {
               "date": {
                "type": "string",
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
               },
               "when": {
                "anyOf": [
                 {
                  "type": "string"
                 },
                 {
                  "type": "null"
                 }
                ],
                "description": "today | tomorrow | +N | past (relative to the window's open day)."
               },
               "rest": {
                "type": "boolean",
                "description": "True for the open day: the values are the rest of the window from now."
               },
               "amt_mm": {
                "anyOf": [
                 {
                  "type": "number"
                 },
                 {
                  "type": "null"
                 }
                ],
                "description": "Median of the counted sources' totals (mm)."
               },
               "amt_in": {
                "anyOf": [
                 {
                  "type": "number"
                 },
                 {
                  "type": "null"
                 }
                ]
               },
               "amt_range_mm": {
                "anyOf": [
                 {
                  "type": "array",
                  "items": {
                   "type": "number"
                  },
                  "minItems": 2,
                  "maxItems": 2
                 },
                 {
                  "type": "null"
                 }
                ],
                "description": "Min-max of the same sources (mm)."
               },
               "amt_range_in": {
                "anyOf": [
                 {
                  "type": "array",
                  "items": {
                   "type": "number"
                  },
                  "minItems": 2,
                  "maxItems": 2
                 },
                 {
                  "type": "null"
                 }
                ]
               },
               "amt_n": {
                "anyOf": [
                 {
                  "type": "integer"
                 },
                 {
                  "type": "null"
                 }
                ],
                "description": "Sources in the amount median."
               },
               "amt_src": {
                "type": "array",
                "items": {
                 "type": "string"
                }
               },
               "mean_mm": {
                "anyOf": [
                 {
                  "type": "number"
                 },
                 {
                  "type": "null"
                 }
                ],
                "description": "Expected (mean) total: member means for ensembles, NBM's mean, else each total (mm)."
               },
               "mean_in": {
                "anyOf": [
                 {
                  "type": "number"
                 },
                 {
                  "type": "null"
                 }
                ]
               },
               "wet": {
                "anyOf": [
                 {
                  "type": "array",
                  "items": {
                   "type": "integer"
                  },
                  "minItems": 2,
                  "maxItems": 2
                 },
                 {
                  "type": "null"
                 }
                ],
                "description": "[k, n]: counted sources with 0.01 in or more."
               },
               "share": {
                "anyOf": [
                 {
                  "type": "array",
                  "items": {
                   "type": "integer"
                  },
                  "minItems": 5,
                  "maxItems": 5
                 },
                 {
                  "type": "null"
                 }
                ],
                "description": "Counted sources at or above each threshold."
               },
               "pop": {
                "anyOf": [
                 {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 100
                 },
                 {
                  "type": "null"
                 }
                ],
                "description": "= chance[0] (for v1 readers)."
               },
               "pop_n": {
                "type": "integer",
                "description": "Model families behind pop."
               },
               "pop_src": {
                "type": "array",
                "items": {
                 "type": "string"
                },
                "description": "Family ids: ecmwf (ENS), ncep (GEFS), cmc (GEPS), nbm (NBM calibrated), dwd (MOSMIX), smn (SMN)."
               },
               "chance": {
                "anyOf": [
                 {
                  "type": "array",
                  "items": {
                   "anyOf": [
                    {
                     "type": "integer",
                     "minimum": 0,
                     "maximum": 100
                    },
                    {
                     "type": "null"
                    }
                   ]
                  },
                  "minItems": 5,
                  "maxItems": 5
                 },
                 {
                  "type": "null"
                 }
                ],
                "description": "Chance (%) of each threshold or more: median over families of their native chance (ensembles: members' share, raw). Null entries below blend.pop_min_n families."
               },
               "chance_n": {
                "type": "array",
                "items": {
                 "type": "integer"
                },
                "minItems": 5,
                "maxItems": 5,
                "description": "Families behind each chance."
               },
               "nbm_cal": {
                "anyOf": [
                 {
                  "type": "array",
                  "items": {
                   "anyOf": [
                    {
                     "type": "integer",
                     "minimum": 0,
                     "maximum": 100
                    },
                    {
                     "type": "null"
                    }
                   ]
                  },
                  "minItems": 5,
                  "maxItems": 5
                 },
                 {
                  "type": "null"
                 }
                ],
                "description": "NBM calibrated chances alone (24 h from 06Z, D1-D3), else null."
               },
               "lb": {
                "anyOf": [
                 {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 100
                 },
                 {
                  "type": "null"
                 }
                ],
                "description": "Largest lower bound (%) from a period wholly inside the window (never counted)."
               },
               "lb_src": {
                "anyOf": [
                 {
                  "type": "string"
                 },
                 {
                  "type": "null"
                 }
                ]
               },
               "lb_win": {
                "anyOf": [
                 {
                  "type": "array",
                  "items": {
                   "type": "string",
                   "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
                  },
                  "minItems": 2,
                  "maxItems": 2
                 },
                 {
                  "type": "null"
                 }
                ]
               },
               "below_lb": {
                "type": "boolean",
                "description": "The consensus is under the lower bound: sources disagree."
               }
              },
              "required": [
               "date",
               "when",
               "rest",
               "amt_mm",
               "amt_in",
               "amt_range_mm",
               "amt_range_in",
               "amt_n",
               "amt_src",
               "mean_mm",
               "mean_in",
               "wet",
               "share",
               "pop",
               "pop_n",
               "pop_src",
               "chance",
               "chance_n",
               "nbm_cal",
               "lb",
               "lb_src",
               "lb_win",
               "below_lb"
              ],
              "additionalProperties": false
             }
            },
            {
             "type": "null"
            }
           ],
           "description": "One entry per local date (line: the date, plus tomorrow when it is today)."
          },
          "week": {
           "anyOf": [
            {
             "type": "object",
             "properties": {
              "from": {
               "anyOf": [
                {
                 "type": "string",
                 "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
                },
                {
                 "type": "null"
                }
               ]
              },
              "to": {
               "anyOf": [
                {
                 "type": "string",
                 "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
                },
                {
                 "type": "null"
                }
               ]
              },
              "amt_mm": {
               "anyOf": [
                {
                 "type": "number"
                },
                {
                 "type": "null"
                }
               ]
              },
              "amt_in": {
               "anyOf": [
                {
                 "type": "number"
                },
                {
                 "type": "null"
                }
               ]
              },
              "amt_range_mm": {
               "anyOf": [
                {
                 "type": "array",
                 "items": {
                  "type": "number"
                 },
                 "minItems": 2,
                 "maxItems": 2
                },
                {
                 "type": "null"
                }
               ]
              },
              "amt_range_in": {
               "anyOf": [
                {
                 "type": "array",
                 "items": {
                  "type": "number"
                 },
                 "minItems": 2,
                 "maxItems": 2
                },
                {
                 "type": "null"
                }
               ]
              },
              "amt_n": {
               "anyOf": [
                {
                 "type": "integer"
                },
                {
                 "type": "null"
                }
               ]
              },
              "mean_mm": {
               "anyOf": [
                {
                 "type": "number"
                },
                {
                 "type": "null"
                }
               ]
              },
              "mean_in": {
               "anyOf": [
                {
                 "type": "number"
                },
                {
                 "type": "null"
                }
               ]
              },
              "q_mm": {
               "anyOf": [
                {
                 "type": "array",
                 "items": {
                  "type": "number"
                 },
                 "minItems": 7,
                 "maxItems": 7
                },
                {
                 "type": "null"
                }
               ],
               "description": "Pooled member quantiles p05, p10, p25, p50, p75, p90, p95 (families weighted equally), mm."
              },
              "q_in": {
               "anyOf": [
                {
                 "type": "array",
                 "items": {
                  "type": "number"
                 },
                 "minItems": 7,
                 "maxItems": 7
                },
                {
                 "type": "null"
                }
               ]
              },
              "chance": {
               "anyOf": [
                {
                 "type": "array",
                 "items": {
                  "anyOf": [
                   {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 100
                   },
                   {
                    "type": "null"
                   }
                  ]
                 },
                 "minItems": 5,
                 "maxItems": 5
                },
                {
                 "type": "null"
                }
               ],
               "description": "Members' share (raw) of a week total at each threshold or more."
              }
             },
             "required": [
              "from",
              "to",
              "amt_mm",
              "amt_in",
              "amt_range_mm",
              "amt_range_in",
              "amt_n",
              "mean_mm",
              "mean_in",
              "q_mm",
              "q_in",
              "chance"
             ],
             "additionalProperties": false,
             "description": "Next 7 days (D1-D7) total."
            },
            {
             "type": "null"
            }
           ],
           "description": "Next 7 days (D1-D7)."
          },
          "weekend": {
           "anyOf": [
            {
             "type": "object",
             "properties": {
              "sat": {
               "anyOf": [
                {
                 "type": "string",
                 "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
                },
                {
                 "type": "null"
                }
               ]
              },
              "sun": {
               "anyOf": [
                {
                 "type": "string",
                 "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
                },
                {
                 "type": "null"
                }
               ]
              },
              "stn": {
               "anyOf": [
                {
                 "type": "string"
                },
                {
                 "type": "null"
                }
               ]
              },
              "either": {
               "anyOf": [
                {
                 "type": "integer",
                 "minimum": 0,
                 "maximum": 100
                },
                {
                 "type": "null"
                }
               ],
               "description": "Members' share (raw) with Saturday or Sunday at 0.01 in or more (climate days); 100 once Saturday is recorded wet."
              },
              "either_n": {
               "anyOf": [
                {
                 "type": "integer"
                },
                {
                 "type": "null"
                }
               ]
              },
              "q_mm": {
               "anyOf": [
                {
                 "type": "array",
                 "items": {
                  "type": "number"
                 },
                 "minItems": 7,
                 "maxItems": 7
                },
                {
                 "type": "null"
                }
               ]
              },
              "q_in": {
               "anyOf": [
                {
                 "type": "array",
                 "items": {
                  "type": "number"
                 },
                 "minItems": 7,
                 "maxItems": 7
                },
                {
                 "type": "null"
                }
               ]
              },
              "recorded": {
               "type": "boolean"
              }
             },
             "required": [
              "sat",
              "sun",
              "stn",
              "either",
              "either_n",
              "q_mm",
              "q_in",
              "recorded"
             ],
             "additionalProperties": false,
             "description": "US market places: the weekend (LST windows at the settle station)."
            },
            {
             "type": "null"
            }
           ],
           "description": "US market places only."
          },
          "month": {
           "anyOf": [
            {
             "type": "object",
             "properties": {
              "month": {
               "type": "string"
              },
              "stn": {
               "anyOf": [
                {
                 "type": "string"
                },
                {
                 "type": "null"
                }
               ]
              },
              "end_utc": {
               "anyOf": [
                {
                 "type": "string",
                 "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
                },
                {
                 "type": "null"
                }
               ]
              },
              "mtd_mm": {
               "anyOf": [
                {
                 "type": "number"
                },
                {
                 "type": "null"
                }
               ],
               "description": "Month to date (the settle product when there is one)."
              },
              "mtd_in": {
               "anyOf": [
                {
                 "type": "number"
                },
                {
                 "type": "null"
                }
               ]
              },
              "mtd_src": {
               "anyOf": [
                {
                 "type": "string"
                },
                {
                 "type": "null"
                }
               ]
              },
              "mtd_label": {
               "anyOf": [
                {
                 "type": "string"
                },
                {
                 "type": "null"
                }
               ]
              },
              "mtd_through": {
               "anyOf": [
                {
                 "type": "string",
                 "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
                },
                {
                 "type": "null"
                }
               ]
              },
              "rest_mean_mm": {
               "anyOf": [
                {
                 "type": "number"
                },
                {
                 "type": "null"
                }
               ],
               "description": "Expected (mean) rest of month; raw ensemble mean past D7, then US 1991-2020 normals."
              },
              "rest_mean_in": {
               "anyOf": [
                {
                 "type": "number"
                },
                {
                 "type": "null"
                }
               ]
              },
              "rest_thru": {
               "anyOf": [
                {
                 "type": "string",
                 "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
                },
                {
                 "type": "null"
                }
               ]
              },
              "rest_src": {
               "anyOf": [
                {
                 "type": "string"
                },
                {
                 "type": "null"
                }
               ]
              },
              "q_mm": {
               "anyOf": [
                {
                 "type": "array",
                 "items": {
                  "type": "number"
                 },
                 "minItems": 7,
                 "maxItems": 7
                },
                {
                 "type": "null"
                }
               ],
               "description": "Rest-of-month member quantiles p05..p95 when an ensemble reaches month end."
              },
              "q_in": {
               "anyOf": [
                {
                 "type": "array",
                 "items": {
                  "type": "number"
                 },
                 "minItems": 7,
                 "maxItems": 7
                },
                {
                 "type": "null"
                }
               ]
              },
              "total_mean_mm": {
               "anyOf": [
                {
                 "type": "number"
                },
                {
                 "type": "null"
                }
               ],
               "description": "mtd + rest_mean."
              },
              "total_mean_in": {
               "anyOf": [
                {
                 "type": "number"
                },
                {
                 "type": "null"
                }
               ]
              }
             },
             "required": [
              "month",
              "stn",
              "end_utc",
              "mtd_mm",
              "mtd_in",
              "mtd_src",
              "mtd_label",
              "mtd_through",
              "rest_mean_mm",
              "rest_mean_in",
              "rest_thru",
              "rest_src",
              "q_mm",
              "q_in",
              "total_mean_mm",
              "total_mean_in"
             ],
             "additionalProperties": false,
             "description": "Month to date and the rest of the month (to the settle product's month end)."
            },
            {
             "type": "null"
            }
           ],
           "description": "Month to date and rest of month."
          },
          "lst": {
           "anyOf": [
            {
             "type": "array",
             "items": {
              "type": "object",
              "properties": {
               "stn": {
                "type": "string"
               },
               "venues": {
                "type": "array",
                "items": {
                 "type": "string"
                }
               },
               "window": {
                "type": "object",
                "properties": {
                 "from_utc": {
                  "type": "string",
                  "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
                 },
                 "to_utc": {
                  "type": "string",
                  "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
                 },
                 "label": {
                  "type": "string",
                  "description": "'calendar day' or the climate-day label, e.g. 'climate day, 1 am–1 am CDT (midnight–midnight standard time)'."
                 }
                },
                "required": [
                 "from_utc",
                 "to_utc",
                 "label"
                ],
                "additionalProperties": false,
                "description": "The window of `date`: [from_utc, to_utc)."
               },
               "today": {
                "anyOf": [
                 {
                  "type": "object",
                  "properties": {
                   "date": {
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
                   },
                   "win": {
                    "enum": [
                     "lst",
                     "cal"
                    ]
                   },
                   "label": {
                    "type": "string"
                   },
                   "so_far_mm": {
                    "anyOf": [
                     {
                      "type": "number"
                     },
                     {
                      "type": "null"
                     }
                    ],
                    "description": "Station so far in the window (hourly reports; the climate report can differ); null where no gauge feed."
                   },
                   "so_far_in": {
                    "anyOf": [
                     {
                      "type": "number"
                     },
                     {
                      "type": "null"
                     }
                    ]
                   },
                   "so_far_src": {
                    "anyOf": [
                     {
                      "type": "string"
                     },
                     {
                      "type": "null"
                     }
                    ]
                   },
                   "so_far_at": {
                    "anyOf": [
                     {
                      "type": "string",
                      "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
                     },
                     {
                      "type": "null"
                     }
                    ]
                   },
                   "partial": {
                    "type": "boolean",
                    "description": "A routine hour is missing or the gauge is down."
                   },
                   "gauge_down": {
                    "type": "boolean"
                   },
                   "first_only": {
                    "type": "boolean",
                    "description": "Wet only because of the window's first report (includes rain before the window)."
                   },
                   "trace": {
                    "type": "boolean"
                   },
                   "radar_mm": {
                    "anyOf": [
                     {
                      "type": "number"
                     },
                     {
                      "type": "null"
                     }
                    ],
                    "description": "Radar estimate (MRMS, gauge-adjusted) over the window; context, never the so far."
                   },
                   "radar_in": {
                    "anyOf": [
                     {
                      "type": "number"
                     },
                     {
                      "type": "null"
                     }
                    ]
                   },
                   "radar_at": {
                    "anyOf": [
                     {
                      "type": "string",
                      "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
                     },
                     {
                      "type": "null"
                     }
                    ]
                   },
                   "radar_flag": {
                    "type": "boolean",
                    "description": "Radar shows rain the station does not."
                   },
                   "recorded": {
                    "type": "boolean",
                    "description": "Station so far is 0.01 in or more (never radar alone, never the first report alone)."
                   },
                   "rest_from": {
                    "anyOf": [
                     {
                      "type": "string",
                      "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
                     },
                     {
                      "type": "null"
                     }
                    ],
                    "description": "The rest of the window starts here (now)."
                   },
                   "left_h": {
                    "anyOf": [
                     {
                      "type": "number"
                     },
                     {
                      "type": "null"
                     }
                    ],
                    "description": "Hours left in the window."
                   },
                   "amt_mm": {
                    "anyOf": [
                     {
                      "type": "number"
                     },
                     {
                      "type": "null"
                     }
                    ],
                    "description": "Rest of the window: median (mm)."
                   },
                   "amt_in": {
                    "anyOf": [
                     {
                      "type": "number"
                     },
                     {
                      "type": "null"
                     }
                    ]
                   },
                   "mean_mm": {
                    "anyOf": [
                     {
                      "type": "number"
                     },
                     {
                      "type": "null"
                     }
                    ],
                    "description": "Rest of the window: expected (mean) (mm)."
                   },
                   "mean_in": {
                    "anyOf": [
                     {
                      "type": "number"
                     },
                     {
                      "type": "null"
                     }
                    ]
                   },
                   "total_mm": {
                    "anyOf": [
                     {
                      "type": "number"
                     },
                     {
                      "type": "null"
                     }
                    ],
                    "description": "so far + rest (median)."
                   },
                   "total_in": {
                    "anyOf": [
                     {
                      "type": "number"
                     },
                     {
                      "type": "null"
                     }
                    ]
                   },
                   "pop": {
                    "anyOf": [
                     {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 100
                     },
                     {
                      "type": "null"
                     }
                    ],
                    "description": "Rest-of-window chance of 0.01 in or more (member families); 100 once recorded."
                   },
                   "pop_n": {
                    "type": "integer"
                   },
                   "pop_src": {
                    "type": "array",
                    "items": {
                     "type": "string"
                    }
                   },
                   "runs": {
                    "type": "array",
                    "items": {
                     "type": "string"
                    },
                    "description": "Run of each family in pop_src (e.g. 00Z)."
                   },
                   "chance": {
                    "anyOf": [
                     {
                      "type": "array",
                      "items": {
                       "anyOf": [
                        {
                         "type": "integer",
                         "minimum": 0,
                         "maximum": 100
                        },
                        {
                         "type": "null"
                        }
                       ]
                      },
                      "minItems": 5,
                      "maxItems": 5
                     },
                     {
                      "type": "null"
                     }
                    ]
                   },
                   "chance_n": {
                    "type": "array",
                    "items": {
                     "type": "integer"
                    },
                    "minItems": 5,
                    "maxItems": 5
                   }
                  },
                  "required": [
                   "date",
                   "win",
                   "label",
                   "so_far_mm",
                   "so_far_in",
                   "so_far_src",
                   "so_far_at",
                   "partial",
                   "gauge_down",
                   "first_only",
                   "trace",
                   "radar_mm",
                   "radar_in",
                   "radar_at",
                   "radar_flag",
                   "recorded",
                   "rest_from",
                   "left_h",
                   "amt_mm",
                   "amt_in",
                   "mean_mm",
                   "mean_in",
                   "total_mm",
                   "total_in",
                   "pop",
                   "pop_n",
                   "pop_src",
                   "runs",
                   "chance",
                   "chance_n"
                  ],
                  "additionalProperties": false,
                  "description": "Today in the window: observed so far plus the rest of the window from now."
                 },
                 {
                  "type": "null"
                 }
                ]
               },
               "days": {
                "type": "array",
                "items": {
                 "type": "object",
                 "properties": {
                  "date": {
                   "type": "string",
                   "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
                  },
                  "when": {
                   "anyOf": [
                    {
                     "type": "string"
                    },
                    {
                     "type": "null"
                    }
                   ],
                   "description": "today | tomorrow | +N | past (relative to the window's open day)."
                  },
                  "rest": {
                   "type": "boolean",
                   "description": "True for the open day: the values are the rest of the window from now."
                  },
                  "amt_mm": {
                   "anyOf": [
                    {
                     "type": "number"
                    },
                    {
                     "type": "null"
                    }
                   ],
                   "description": "Median of the counted sources' totals (mm)."
                  },
                  "amt_in": {
                   "anyOf": [
                    {
                     "type": "number"
                    },
                    {
                     "type": "null"
                    }
                   ]
                  },
                  "amt_range_mm": {
                   "anyOf": [
                    {
                     "type": "array",
                     "items": {
                      "type": "number"
                     },
                     "minItems": 2,
                     "maxItems": 2
                    },
                    {
                     "type": "null"
                    }
                   ],
                   "description": "Min-max of the same sources (mm)."
                  },
                  "amt_range_in": {
                   "anyOf": [
                    {
                     "type": "array",
                     "items": {
                      "type": "number"
                     },
                     "minItems": 2,
                     "maxItems": 2
                    },
                    {
                     "type": "null"
                    }
                   ]
                  },
                  "amt_n": {
                   "anyOf": [
                    {
                     "type": "integer"
                    },
                    {
                     "type": "null"
                    }
                   ],
                   "description": "Sources in the amount median."
                  },
                  "amt_src": {
                   "type": "array",
                   "items": {
                    "type": "string"
                   }
                  },
                  "mean_mm": {
                   "anyOf": [
                    {
                     "type": "number"
                    },
                    {
                     "type": "null"
                    }
                   ],
                   "description": "Expected (mean) total: member means for ensembles, NBM's mean, else each total (mm)."
                  },
                  "mean_in": {
                   "anyOf": [
                    {
                     "type": "number"
                    },
                    {
                     "type": "null"
                    }
                   ]
                  },
                  "wet": {
                   "anyOf": [
                    {
                     "type": "array",
                     "items": {
                      "type": "integer"
                     },
                     "minItems": 2,
                     "maxItems": 2
                    },
                    {
                     "type": "null"
                    }
                   ],
                   "description": "[k, n]: counted sources with 0.01 in or more."
                  },
                  "share": {
                   "anyOf": [
                    {
                     "type": "array",
                     "items": {
                      "type": "integer"
                     },
                     "minItems": 5,
                     "maxItems": 5
                    },
                    {
                     "type": "null"
                    }
                   ],
                   "description": "Counted sources at or above each threshold."
                  },
                  "pop": {
                   "anyOf": [
                    {
                     "type": "integer",
                     "minimum": 0,
                     "maximum": 100
                    },
                    {
                     "type": "null"
                    }
                   ],
                   "description": "= chance[0] (for v1 readers)."
                  },
                  "pop_n": {
                   "type": "integer",
                   "description": "Model families behind pop."
                  },
                  "pop_src": {
                   "type": "array",
                   "items": {
                    "type": "string"
                   },
                   "description": "Family ids: ecmwf (ENS), ncep (GEFS), cmc (GEPS), nbm (NBM calibrated), dwd (MOSMIX), smn (SMN)."
                  },
                  "chance": {
                   "anyOf": [
                    {
                     "type": "array",
                     "items": {
                      "anyOf": [
                       {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 100
                       },
                       {
                        "type": "null"
                       }
                      ]
                     },
                     "minItems": 5,
                     "maxItems": 5
                    },
                    {
                     "type": "null"
                    }
                   ],
                   "description": "Chance (%) of each threshold or more: median over families of their native chance (ensembles: members' share, raw). Null entries below blend.pop_min_n families."
                  },
                  "chance_n": {
                   "type": "array",
                   "items": {
                    "type": "integer"
                   },
                   "minItems": 5,
                   "maxItems": 5,
                   "description": "Families behind each chance."
                  },
                  "nbm_cal": {
                   "anyOf": [
                    {
                     "type": "array",
                     "items": {
                      "anyOf": [
                       {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 100
                       },
                       {
                        "type": "null"
                       }
                      ]
                     },
                     "minItems": 5,
                     "maxItems": 5
                    },
                    {
                     "type": "null"
                    }
                   ],
                   "description": "NBM calibrated chances alone (24 h from 06Z, D1-D3), else null."
                  },
                  "lb": {
                   "anyOf": [
                    {
                     "type": "integer",
                     "minimum": 0,
                     "maximum": 100
                    },
                    {
                     "type": "null"
                    }
                   ],
                   "description": "Largest lower bound (%) from a period wholly inside the window (never counted)."
                  },
                  "lb_src": {
                   "anyOf": [
                    {
                     "type": "string"
                    },
                    {
                     "type": "null"
                    }
                   ]
                  },
                  "lb_win": {
                   "anyOf": [
                    {
                     "type": "array",
                     "items": {
                      "type": "string",
                      "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
                     },
                     "minItems": 2,
                     "maxItems": 2
                    },
                    {
                     "type": "null"
                    }
                   ]
                  },
                  "below_lb": {
                   "type": "boolean",
                   "description": "The consensus is under the lower bound: sources disagree."
                  }
                 },
                 "required": [
                  "date",
                  "when",
                  "rest",
                  "amt_mm",
                  "amt_in",
                  "amt_range_mm",
                  "amt_range_in",
                  "amt_n",
                  "amt_src",
                  "mean_mm",
                  "mean_in",
                  "wet",
                  "share",
                  "pop",
                  "pop_n",
                  "pop_src",
                  "chance",
                  "chance_n",
                  "nbm_cal",
                  "lb",
                  "lb_src",
                  "lb_win",
                  "below_lb"
                 ],
                 "additionalProperties": false
                }
               }
              },
              "required": [
               "stn",
               "venues",
               "window",
               "today",
               "days"
              ],
              "additionalProperties": false
             },
             "description": "Each daily-rain settle station shown (win=lst): its climate day."
            },
            {
             "type": "null"
            }
           ]
          },
          "sources": {
           "anyOf": [
            {
             "type": "array",
             "items": {
              "type": "object",
              "properties": {
               "id": {
                "type": "string"
               },
               "src": {
                "type": "string"
               },
               "stn": {
                "anyOf": [
                 {
                  "type": "string"
                 },
                 {
                  "type": "null"
                 }
                ]
               },
               "fam": {
                "anyOf": [
                 {
                  "type": "string"
                 },
                 {
                  "type": "null"
                 }
                ]
               },
               "step_h": {
                "anyOf": [
                 {
                  "type": "integer"
                 },
                 {
                  "type": "null"
                 }
                ]
               },
               "win": {
                "enum": [
                 "cal",
                 "lst",
                 "06z",
                 null
                ]
               },
               "lb": {
                "type": "boolean",
                "description": "Chances are lower bounds."
               },
               "rain_only": {
                "type": "boolean"
               },
               "credit": {
                "anyOf": [
                 {
                  "type": "string"
                 },
                 {
                  "type": "null"
                 }
                ]
               },
               "run": {
                "anyOf": [
                 {
                  "type": "string",
                  "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
                 },
                 {
                  "type": "null"
                 }
                ]
               },
               "age_h": {
                "anyOf": [
                 {
                  "type": "number"
                 },
                 {
                  "type": "null"
                 }
                ]
               },
               "status": {
                "anyOf": [
                 {
                  "type": "string"
                 },
                 {
                  "type": "null"
                 }
                ]
               },
               "counted": {
                "type": "boolean"
               },
               "twin": {
                "type": "boolean"
               },
               "days": {
                "type": "array",
                "items": {
                 "anyOf": [
                  {
                   "type": "object",
                   "properties": {
                    "amt_mm": {
                     "anyOf": [
                      {
                       "type": "number"
                      },
                      {
                       "type": "null"
                      }
                     ]
                    },
                    "amt_in": {
                     "anyOf": [
                      {
                       "type": "number"
                      },
                      {
                       "type": "null"
                      }
                     ]
                    },
                    "mean_mm": {
                     "anyOf": [
                      {
                       "type": "number"
                      },
                      {
                       "type": "null"
                      }
                     ]
                    },
                    "mean_in": {
                     "anyOf": [
                      {
                       "type": "number"
                      },
                      {
                       "type": "null"
                      }
                     ]
                    },
                    "pop": {
                     "anyOf": [
                      {
                       "type": "integer",
                       "minimum": 0,
                       "maximum": 100
                      },
                      {
                       "type": "null"
                      }
                     ],
                     "description": "The row's native chance, or its lower bound on `lb` rows."
                    },
                    "chance": {
                     "anyOf": [
                      {
                       "type": "array",
                       "items": {
                        "anyOf": [
                         {
                          "type": "integer",
                          "minimum": 0,
                          "maximum": 100
                         },
                         {
                          "type": "null"
                         }
                        ]
                       },
                       "minItems": 5,
                       "maxItems": 5
                      },
                      {
                       "type": "null"
                      }
                     ],
                     "description": "Members' share (or NBM calibrated) at each threshold; null on bound rows."
                    },
                    "mq_mm": {
                     "anyOf": [
                      {
                       "type": "array",
                       "items": {
                        "type": "number"
                       },
                       "minItems": 2,
                       "maxItems": 2
                      },
                      {
                       "type": "null"
                      }
                     ],
                     "description": "Member p10, p90 (mm)."
                    },
                    "mq_in": {
                     "anyOf": [
                      {
                       "type": "array",
                       "items": {
                        "type": "number"
                       },
                       "minItems": 2,
                       "maxItems": 2
                      },
                      {
                       "type": "null"
                      }
                     ]
                    },
                    "c": {
                     "enum": [
                      0,
                      1,
                      null
                     ],
                     "description": "1 = counted that day."
                    },
                    "day": {
                     "enum": [
                      0,
                      1,
                      null
                     ],
                     "description": "1 = a whole-day chance, not counted once the day started."
                    },
                    "lbw": {
                     "anyOf": [
                      {
                       "type": "array",
                       "items": {
                        "anyOf": [
                         {
                          "type": "string",
                          "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
                         },
                         {
                          "type": "null"
                         }
                        ]
                       },
                       "minItems": 2,
                       "maxItems": 2
                      },
                      {
                       "type": "null"
                      }
                     ]
                    }
                   },
                   "required": [
                    "amt_mm",
                    "amt_in",
                    "mean_mm",
                    "mean_in",
                    "pop",
                    "chance",
                    "mq_mm",
                    "mq_in",
                    "c",
                    "day",
                    "lbw"
                   ],
                   "additionalProperties": false
                  },
                  {
                   "type": "null"
                  }
                 ]
                }
               }
              },
              "required": [
               "id",
               "src",
               "stn",
               "fam",
               "step_h",
               "win",
               "lb",
               "rain_only",
               "credit",
               "run",
               "age_h",
               "status",
               "counted",
               "twin",
               "days"
              ],
              "additionalProperties": false
             }
            },
            {
             "type": "null"
            }
           ],
           "description": "size=table: one row per source (all=1 adds twins and rows not counted)."
          },
          "series": {
           "anyOf": [
            {
             "type": "object",
             "properties": {
              "step_h": {
               "type": "integer"
              },
              "hours": {
               "type": "integer"
              },
              "times": {
               "type": "array",
               "items": {
                "type": "string"
               }
              },
              "times_iso": {
               "type": "array",
               "items": {
                "type": "string"
               }
              },
              "cols_mm": {
               "type": "object",
               "additionalProperties": {
                "type": "array",
                "items": {
                 "anyOf": [
                  {
                   "type": "number"
                  },
                  {
                   "type": "null"
                  }
                 ]
                }
               }
              },
              "cols_in": {
               "type": "object",
               "additionalProperties": {
                "type": "array",
                "items": {
                 "anyOf": [
                  {
                   "type": "number"
                  },
                  {
                   "type": "null"
                  }
                 ]
                }
               }
              },
              "med_mm": {
               "type": "array",
               "items": {
                "anyOf": [
                 {
                  "type": "number"
                 },
                 {
                  "type": "null"
                 }
                ]
               }
              },
              "med_in": {
               "type": "array",
               "items": {
                "anyOf": [
                 {
                  "type": "number"
                 },
                 {
                  "type": "null"
                 }
                ]
               }
              },
              "n": {
               "type": "integer"
              },
              "excluded": {
               "type": "array",
               "items": {
                "type": "string"
               },
               "description": "Rows not in the series, with the reason (step, coverage)."
              }
             },
             "required": [
              "step_h",
              "hours",
              "times",
              "times_iso",
              "cols_mm",
              "cols_in",
              "med_mm",
              "med_in",
              "n",
              "excluded"
             ],
             "additionalProperties": false
            },
            {
             "type": "null"
            }
           ],
           "description": "size=series: amounts per step bucket (UTC-aligned)."
          },
          "alerts": {
           "anyOf": [
            {
             "type": "array",
             "items": {
              "type": "object",
              "properties": {
               "id": {
                "type": "string",
                "description": "Alert id at its feed."
               },
               "event": {
                "type": "string",
                "description": "Event name (Flood Warning, ...)."
               },
               "severity": {
                "type": [
                 "string",
                 "null"
                ],
                "description": "Extreme | Severe | Moderate | Minor | Unknown."
               },
               "onset": {
                "anyOf": [
                 {
                  "type": "string",
                  "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
                 },
                 {
                  "type": "null"
                 }
                ],
                "description": "Start (UTC), or null."
               },
               "expires": {
                "anyOf": [
                 {
                  "type": "string",
                  "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$"
                 },
                 {
                  "type": "null"
                 }
                ],
                "description": "End (UTC), or null (until further notice)."
               },
               "headline": {
                "type": [
                 "string",
                 "null"
                ],
                "description": "The issuer's headline."
               },
               "url": {
                "type": [
                 "string",
                 "null"
                ],
                "description": "The alert at its source."
               },
               "sender": {
                "type": [
                 "string",
                 "null"
                ],
                "description": "Issuing service."
               },
               "credit": {
                "type": "string",
                "description": "Credit key of the feed."
               }
              },
              "required": [
               "id",
               "event",
               "severity",
               "onset",
               "expires",
               "headline",
               "url",
               "sender",
               "credit"
              ],
              "additionalProperties": false
             }
            },
            {
             "type": "null"
            }
           ],
           "description": "Active alerts at the place; null when no open feed covers it."
          },
          "alerts_note": {
           "type": [
            "string",
            "null"
           ],
           "description": "Why alerts is null or empty (no open feed, polygon warnings only, feed delayed)."
          },
          "storm": {
           "anyOf": [
            {
             "type": "object",
             "properties": {
              "name": {
               "type": "string",
               "description": "Storm name."
              },
              "km": {
               "type": "integer",
               "description": "Distance from the place, km."
              },
              "url": {
               "type": [
                "string",
                "null"
               ],
               "description": "The storm at its source (NHC)."
              }
             },
             "required": [
              "name",
              "km",
              "url"
             ],
             "additionalProperties": false
            },
            {
             "type": "null"
            }
           ],
           "description": "Nearest named storm within 1,500 km, or null."
          },
          "notes": {
           "type": "array",
           "items": {
            "type": "string"
           },
           "description": "Definitions and honest labels (members' share is raw; lower bounds; radar)."
          }
         },
         "required": [
          "v",
          "variable",
          "size",
          "asof",
          "forecast_updated",
          "next_update",
          "place",
          "url",
          "units",
          "rain_unit",
          "win",
          "stn",
          "window",
          "thresholds",
          "date",
          "when",
          "today",
          "days",
          "week",
          "weekend",
          "month",
          "lst",
          "sources",
          "series",
          "alerts",
          "alerts_note",
          "storm",
          "notes"
         ],
         "additionalProperties": false
        }
       },
       "credits": {
        "type": "array",
        "items": {
         "type": "string"
        },
        "minItems": 1,
        "description": "Credit strings to keep when you repeat numbers."
       },
       "credit_keys": {
        "type": "array",
        "items": {
         "type": "string"
        },
        "minItems": 1,
        "description": "Their keys (/credits lists every line)."
       },
       "credits_url": {
        "type": "string",
        "format": "uri",
        "description": "The full credits page."
       }
      },
      "required": [
       "v",
       "variable",
       "size",
       "asof",
       "results",
       "credits",
       "credit_keys",
       "credits_url"
      ],
      "additionalProperties": false,
      "description": "Several places (line/week): one credits footer."
     }
    ]
   },
   "runs": {
    "type": "object",
    "properties": {
     "v": {
      "const": 1,
      "description": "Body version."
     },
     "kind": {
      "const": "runs",
      "description": "Body kind."
     },
     "size": {
      "const": "runs",
      "description": "size=runs."
     },
     "asof": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$",
      "description": "Request time (UTC)."
     },
     "place": {
      "type": "object",
      "properties": {
       "slug": {
        "type": "string",
        "description": "Place slug."
       },
       "display": {
        "type": "string",
        "description": "Display name."
       },
       "stn": {
        "type": [
         "string",
         "null"
        ],
        "description": "Primary station (ICAO)."
       },
       "tz": {
        "type": "string",
        "description": "IANA time zone."
       },
       "cc": {
        "type": "string",
        "description": "Country code."
       },
       "tier": {
        "type": "string",
        "description": "core | demand | settle."
       }
      },
      "required": [
       "slug",
       "display",
       "stn",
       "tz",
       "cc",
       "tier"
      ],
      "additionalProperties": false
     },
     "url": {
      "type": "string",
      "description": "The place page."
     },
     "units": {
      "enum": [
       "F",
       "C"
      ],
      "description": "Temperature unit."
     },
     "rain_unit": {
      "enum": [
       "in",
       "mm"
      ],
      "description": "Rain unit of the rain column and q12_*."
     },
     "runs": {
      "type": "integer",
      "description": "Newest runs per source."
     },
     "from": {
      "type": "string",
      "description": "First local date."
     },
     "to": {
      "type": "string",
      "description": "Last local date."
     },
     "n_rows": {
      "type": "integer",
      "description": "Rows."
     },
     "columns": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Row keys in TSV order."
     },
     "rows": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "src": {
         "type": "string",
         "description": "Source id."
        },
        "stn": {
         "type": [
          "string",
          "null"
         ],
         "description": "Station of a station product (NBM, MOS, NWS); null for a grid model."
        },
        "run_utc": {
         "type": "string",
         "description": "The run (UTC)."
        },
        "fetched_at": {
         "type": [
          "string",
          "null"
         ],
         "description": "When groundhog had the run (UTC)."
        },
        "date": {
         "type": "string",
         "description": "Local date (YYYY-MM-DD)."
        },
        "hi": {
         "type": [
          "number",
          "null"
         ],
         "description": "Daily high in `units` (a native-°F value is its published whole °F)."
        },
        "lo": {
         "type": [
          "number",
          "null"
         ],
         "description": "Daily low in `units`."
        },
        "hi_p10": {
         "type": [
          "number",
          "null"
         ],
         "description": "Ensembles: high 10th percentile."
        },
        "hi_p90": {
         "type": [
          "number",
          "null"
         ],
         "description": "Ensembles: high 90th percentile."
        },
        "lo_p10": {
         "type": [
          "number",
          "null"
         ],
         "description": "Ensembles: low 10th percentile."
        },
        "lo_p90": {
         "type": [
          "number",
          "null"
         ],
         "description": "Ensembles: low 90th percentile."
        },
        "pop": {
         "type": [
          "integer",
          "null"
         ],
         "description": "Chance of rain, % (the source's own)."
        },
        "in": {
         "type": [
          "number",
          "null"
         ],
         "description": "Day rain total, inches (units=F)."
        },
        "mm": {
         "type": [
          "number",
          "null"
         ],
         "description": "Day rain total, mm (units=C)."
        },
        "xnd_hi": {
         "type": [
          "number",
          "null"
         ],
         "description": "NBM: XND (spread of the high), °F (°C with units=C)."
        },
        "xnd_lo": {
         "type": [
          "number",
          "null"
         ],
         "description": "NBM: XND of the low."
        },
        "p12_am": {
         "type": [
          "integer",
          "null"
         ],
         "description": "NBM: P12 00-12Z, %."
        },
        "p12_pm": {
         "type": [
          "integer",
          "null"
         ],
         "description": "NBM: P12 12-00Z, %."
        },
        "q12_am": {
         "type": [
          "number",
          "null"
         ],
         "description": "NBM: Q12 00-12Z in rain_unit."
        },
        "q12_pm": {
         "type": [
          "number",
          "null"
         ],
         "description": "NBM: Q12 12-00Z in rain_unit."
        }
       },
       "additionalProperties": false,
       "required": [
        "src",
        "stn",
        "run_utc",
        "fetched_at",
        "date",
        "hi",
        "lo",
        "hi_p10",
        "hi_p90",
        "lo_p10",
        "lo_p90",
        "pop",
        "xnd_hi",
        "xnd_lo",
        "p12_am",
        "p12_pm",
        "q12_am",
        "q12_pm"
       ]
      },
      "description": "One row per source x station x run x date."
     },
     "notes": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Starts with \"as issued; fetched_at = when groundhog had it\"."
     },
     "credits": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Credit strings to keep when you repeat numbers."
     },
     "credit_keys": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Their keys (/credits lists every line)."
     },
     "credits_url": {
      "type": "string",
      "description": "The full credits page."
     }
    },
    "required": [
     "v",
     "kind",
     "size",
     "asof",
     "place",
     "url",
     "units",
     "rain_unit",
     "runs",
     "from",
     "to",
     "n_rows",
     "columns",
     "rows",
     "notes",
     "credits",
     "credit_keys",
     "credits_url"
    ],
    "additionalProperties": false
   },
   "nbm": {
    "type": "object",
    "properties": {
     "v": {
      "const": 1,
      "description": "Body version."
     },
     "kind": {
      "const": "nbm",
      "description": "Body kind."
     },
     "asof": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$",
      "description": "Request time (UTC)."
     },
     "stn": {
      "type": "string",
      "description": "Station (ICAO)."
     },
     "prod": {
      "enum": [
       "nbe",
       "nbs"
      ],
      "description": "NBM text product."
     },
     "run_utc": {
      "type": "string",
      "description": "The run (UTC)."
     },
     "fetched_at": {
      "type": [
       "string",
       "null"
      ],
      "description": "When groundhog had it (UTC)."
     },
     "origin": {
      "type": [
       "string",
       "null"
      ],
      "description": "live | bf:<tool> (backfilled)."
     },
     "select": {
      "anyOf": [
       {
        "type": "object",
        "properties": {
         "run": {
          "type": [
           "string",
           "null"
          ]
         },
         "lead": {
          "type": [
           "integer",
           "null"
          ]
         },
         "cycle": {
          "type": [
           "integer",
           "null"
          ]
         },
         "asof": {
          "type": [
           "string",
           "null"
          ]
         },
         "date": {
          "type": [
           "string",
           "null"
          ]
         }
        },
        "additionalProperties": false
       },
       {
        "type": "null"
       }
      ],
      "description": "The selection asked for (run, lead, cycle; history: asof; nbm: date)."
     },
     "days": {
      "type": "array",
      "items": {
       "type": "object",
       "additionalProperties": true
      },
      "description": "nbmcols.day_view per local date: date, hi, xnd_hi, lo, xnd_lo, p12_am, p12_pm, q12_am, q12_pm, fhr_hi, fhr_lo (published units)."
     },
     "cols": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "valid_utc": {
         "type": "string"
        },
        "fhr": {
         "type": [
          "integer",
          "null"
         ]
        },
        "el": {
         "type": "string"
        },
        "v": {
         "type": [
          "integer",
          "null"
         ]
        }
       },
       "required": [
        "valid_utc",
        "fhr",
        "el",
        "v"
       ],
       "additionalProperties": false
      },
      "description": "Raw columns as published."
     },
     "units": {
      "type": "string",
      "description": "What v means per element."
     },
     "notes": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Notes."
     },
     "credits": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Credit strings to keep when you repeat numbers."
     },
     "credit_keys": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Their keys (/credits lists every line)."
     },
     "credits_url": {
      "type": "string",
      "description": "The full credits page."
     }
    },
    "required": [
     "v",
     "kind",
     "asof",
     "stn",
     "prod",
     "run_utc",
     "fetched_at",
     "origin",
     "select",
     "days",
     "cols",
     "units",
     "notes",
     "credits",
     "credit_keys",
     "credits_url"
    ],
    "additionalProperties": false
   },
   "history": {
    "type": "object",
    "properties": {
     "v": {
      "const": 1,
      "description": "Body version."
     },
     "kind": {
      "const": "history",
      "description": "Body kind."
     },
     "table": {
      "enum": [
       "daily",
       "nbm",
       "obs"
      ],
      "description": "History table."
     },
     "asof": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$",
      "description": "Request time (UTC)."
     },
     "place": {
      "anyOf": [
       {
        "type": "object",
        "properties": {
         "slug": {
          "type": "string",
          "description": "Place slug."
         },
         "display": {
          "type": "string",
          "description": "Display name."
         },
         "stn": {
          "type": [
           "string",
           "null"
          ],
          "description": "Primary station (ICAO)."
         },
         "tz": {
          "type": "string",
          "description": "IANA time zone."
         },
         "cc": {
          "type": "string",
          "description": "Country code."
         },
         "tier": {
          "type": "string",
          "description": "core | demand | settle."
         }
        },
        "required": [
         "slug",
         "display",
         "stn",
         "tz",
         "cc",
         "tier"
        ],
        "additionalProperties": false
       },
       {
        "type": "null"
       }
      ],
      "description": "The place (kind=daily, or a place given for nbm/obs)."
     },
     "stn": {
      "type": [
       "string",
       "null"
      ],
      "description": "Station (nbm, obs)."
     },
     "url": {
      "type": [
       "string",
       "null"
      ],
      "description": "The place page."
     },
     "prod": {
      "type": [
       "string",
       "null"
      ],
      "description": "nbm: nbe | nbs."
     },
     "view": {
      "type": [
       "string",
       "null"
      ],
      "description": "nbm: raw | day."
     },
     "product": {
      "type": [
       "string",
       "null"
      ],
      "description": "obs: CLI | METAR_R | ASOS."
     },
     "from": {
      "type": "string",
      "description": "First target date."
     },
     "to": {
      "type": "string",
      "description": "Last target date."
     },
     "select": {
      "anyOf": [
       {
        "type": "object",
        "properties": {
         "run": {
          "type": [
           "string",
           "null"
          ]
         },
         "lead": {
          "type": [
           "integer",
           "null"
          ]
         },
         "cycle": {
          "type": [
           "integer",
           "null"
          ]
         },
         "asof": {
          "type": [
           "string",
           "null"
          ]
         },
         "date": {
          "type": [
           "string",
           "null"
          ]
         }
        },
        "additionalProperties": false
       },
       {
        "type": "null"
       }
      ],
      "description": "The selection asked for (run, lead, cycle; history: asof; nbm: date)."
     },
     "n_rows": {
      "type": "integer",
      "description": "Rows."
     },
     "columns": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Row keys in TSV order."
     },
     "rows": {
      "type": "array",
      "items": {
       "type": "object",
       "required": [
        "origin"
       ],
       "additionalProperties": true
      },
      "description": "As-issued rows; every row has origin (live | bf:<tool>) and, for runs, fetched_at."
     },
     "units": {
      "type": "string",
      "description": "Units of the columns."
     },
     "notes": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Notes."
     },
     "credits": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Credit strings to keep when you repeat numbers."
     },
     "credit_keys": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Their keys (/credits lists every line)."
     },
     "credits_url": {
      "type": "string",
      "description": "The full credits page."
     }
    },
    "required": [
     "v",
     "kind",
     "table",
     "asof",
     "place",
     "stn",
     "url",
     "prod",
     "view",
     "product",
     "from",
     "to",
     "select",
     "n_rows",
     "columns",
     "rows",
     "units",
     "notes",
     "credits",
     "credit_keys",
     "credits_url"
    ],
    "additionalProperties": false
   },
   "history_files": {
    "type": "object",
    "properties": {
     "v": {
      "const": 1,
      "description": "Body version."
     },
     "kind": {
      "const": "history_files",
      "description": "Body kind."
     },
     "asof": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$",
      "description": "Request time (UTC)."
     },
     "n_files": {
      "type": "integer",
      "description": "Files."
     },
     "files": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "path": {
         "type": "string",
         "description": "Path under /api/v1/history/files/."
        },
        "kind": {
         "type": [
          "string",
          "null"
         ],
         "description": "day | month."
        },
        "period": {
         "type": [
          "string",
          "null"
         ],
         "description": "YYYY-MM-DD or YYYY-MM."
        },
        "table": {
         "type": [
          "string",
          "null"
         ],
         "description": "Table, if one."
        },
        "rows": {
         "type": [
          "integer",
          "null"
         ],
         "description": "Rows."
        },
        "bytes": {
         "type": [
          "integer",
          "null"
         ],
         "description": "Bytes (gzip)."
        },
        "sha256": {
         "type": [
          "string",
          "null"
         ],
         "description": "sha256 of the file (its ETag)."
        },
        "url": {
         "type": "string",
         "description": "Download URL."
        }
       },
       "required": [
        "path",
        "kind",
        "period",
        "table",
        "rows",
        "bytes",
        "sha256",
        "url"
       ],
       "additionalProperties": false
      },
      "description": "Bulk files, gzip TSV."
     },
     "notes": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Notes."
     },
     "credits_url": {
      "type": "string",
      "description": "The full credits page."
     }
    },
    "required": [
     "v",
     "kind",
     "asof",
     "n_files",
     "files",
     "notes",
     "credits_url"
    ],
    "additionalProperties": false
   },
   "blend": {
    "oneOf": [
     {
      "$ref": "#/components/schemas/blend_temp"
     },
     {
      "$ref": "#/components/schemas/blend_rain"
     },
     {
      "$ref": "#/components/schemas/multi"
     },
     {
      "$ref": "#/components/schemas/runs"
     }
    ]
   }
  }
 }
}
