api.weather.gov gridpoints: validTime is an interval, values are Celsius, and units=us is rejected Checked 2026-09-08 · Health, environment and transport datasets The raw /gridpoints endpoint returns each variable as a run-length list: every entry is {validTime, value} where validTime is an ISO-8601 interval like "2026-09-07T20:00:00+00:00/PT3H", so one entry can stand for three hours. Temperature is degC there whatever your locale, ?units=us is rejected with HTTP 400, and the first entry can be in the past. The /gridpoints/.../forecast child endpoint is the one that gives Fahrenheit. What we saw Temperature on the raw gridpoint is wmoUnit:degC and entries carry variable durations. Source: https://api.weather.gov/gridpoints/TOP/32,81 (properties.temperature.uom and .values, 2026-09-08). uom: wmoUnit:degC {'validTime': '2026-09-07T18:00:00+00:00/PT1H', 'value': 33.888888888888886} {'validTime': '2026-09-07T19:00:00+00:00/PT1H', 'value': 34.44444444444444} {'validTime': '2026-09-07T20:00:00+00:00/PT3H', 'value': 36.666666666666664} {'validTime': '2026-09-07T23:00:00+00:00/PT1H', 'value': 35.55555555555556} 143 entries cover 175 hours, so treating the list as hourly undercounts the horizon by a fifth. Source: https://api.weather.gov/gridpoints/TOP/32,81 (properties.temperature.values, count and summed durations, 2026-09-08). n values: 143 durations: [('PT1H', 122), ('PT3H', 11), ('PT2H', 10)] sum hours 175 The array starts before the moment you fetch it: properties.validTimes says the block began 2026-09-07T18:00Z, fetched on 2026-09-08. values[0] is not "now". Source: https://api.weather.gov/gridpoints/TOP/32,81 (properties.updateTime and .validTimes, 2026-09-08). updateTime 2026-09-08T00:41:26+00:00 validTimes 2026-09-07T18:00:00+00:00/P7DT7H first 2026-09-07T18:00:00+00:00/PT1H last 2026-09-15T00:00:00+00:00/PT1H ?units=us is not accepted on the raw gridpoint — HTTP 400 naming the parameter. Source: https://api.weather.gov/gridpoints/TOP/32,81?units=us (parameterErrors, 2026-09-08). { "correlationId": "582efd95", "parameterErrors": [ { "parameter": "query.units", "message": "Query parameter \"units\" is not recognized" } ], "title": "Bad Request", "type": "https://api.weather.gov/problems/BadRequest", "status": 400 } The /forecast child of the same gridpoint defaults to US units and reports temperature as an integer with temperatureUnit F. Source: https://api.weather.gov/gridpoints/TOP/32,81/forecast (properties.units and properties.periods[0], 2026-09-08). units us {'name': 'Overnight', 'temperature': 76, 'temperatureUnit': 'F', 'probabilityOfPrecipitation': {'unitCode': 'wmoUnit:percent', 'value': 1}} Other variables in the same document carry their own units — precipitation is millimetres, probability is percent — so there is no single unit for the payload. Source: https://api.weather.gov/gridpoints/TOP/32,81 (properties.quantitativePrecipitation.uom and .probabilityOfPrecipitation.uom, 2026-09-08). probabilityOfPrecipitation uom: wmoUnit:percent quantitativePrecipitation uom: wmoUnit:mm A request with no User-Agent is refused with HTTP 403 and an HTML page, so the header is mandatory here. Source: https://api.weather.gov/points/39.7456,-97.0892 (response with User-Agent suppressed, 2026-09-08). http=403