At sea level, feelslike_c is a reasonable shorthand. At 2,500 metres, it can be quietly misleading in ways your users will notice before you do.
The two formulas behind feels-like temperature — wind chill and heat index — were both derived from empirical studies conducted on human subjects at low altitudes with normal atmospheric pressure. The NWS wind chill formulation was calibrated at temperatures between −46°C and +10°C and wind speeds up to roughly 80 km/h. The Steadman heat index is a regression fit to perceived discomfort under standard sea-level humidity and pressure. Neither formula accounts for the fact that at altitude, the same absolute humidity produces a lower relative humidity, air density is lower so convective cooling works differently, and solar radiation intensity increases roughly 10–12% per 1,000 metres of elevation gain.
That last point is the one that actually bites people. A hiker at 3,000 metres on a clear day is receiving meaningfully more direct solar radiation than either formula assumes. feelslike_c might return 14°C because temperature is moderate and wind is light — which sounds fine — while the actual perceived thermal load from radiation pushes conditions closer to 22°C. The same hiker at rest in shade with wind picking up will experience convective cooling the formula also can’t fully capture at reduced air density.
Where the Formulas Actually Switch
Most API implementations — including ours — apply wind chill when temperature is at or below ~10°C and wind speed exceeds a threshold (roughly 4.8 km/h in the standard NWS model), and switch to heat index when temperature is above ~27°C with humidity above ~40%. Between those bounds, apparent temperature is usually just the dry-bulb temperature, sometimes with minor humidity adjustment.
The problem at altitude is that conditions frequently fall into that middle zone — temperatures in the teens, moderate humidity — where neither formula fires. So feelslike_c returns something very close to temp_c and the response looks completely normal. But the combination of UV intensity, lower air density, and rapidly shifting wind exposure makes that number essentially decorative for anyone actually exposed to the environment.
You can’t fix this purely from the API response side without a radiation model, which we don’t expose in the current payload. What you can do is detect the situations where feelslike_c is least trustworthy and flag them explicitly in your application.
A Detection Pattern Worth Building
If your app tracks lat, lon, and elevation_m — and you should be, for any outdoor use case with real terrain — you can implement a straightforward reliability flag on the feels-like field. The logic we use:
- Elevation above ~1,500m: Begin soft-flagging. Above ~2,500m, hard-flag.
- UV index ≥ 6 and cloud cover < 30%: Feels-like is likely undercounting perceived heat even when temperature looks benign.
- Temperature between 10°C and 26°C: Neither formula is active.
feelslike_c≈temp_c. At altitude, this window is especially deceptive. - Wind speed < 5 km/h: Wind chill won’t trigger. High-elevation solar exposure is unmitigated.
All four together — high elevation, strong UV, mild temperature, calm wind — is the worst case. The API returns a feelslike_c that looks completely plausible while the thermal load on an exposed person is substantially higher than any single field suggests.
Something like this in practice:
function feelsLikeReliability(elevationM, uvIndex, cloudPct, tempC, windKph) {
if (elevationM < 1000) return 'ok';
const midRange = tempC > 10 && tempC < 27;
const highUV = uvIndex >= 6 && cloudPct < 30;
const calmWind = windKph < 5;
if (elevationM >= 2500 && midRange && highUV) return 'unreliable';
if (elevationM >= 1500 && midRange && highUV && calmWind) return 'degraded';
return 'ok';
}
If feelsLikeReliability returns anything other than ok, either suppress feelslike_c in your UI or annotate it with a caveat. “Feels like 15°C” without context is worse than no feels-like value when the real thermal experience is materially different.
Getting Elevation Into Your Request Flow
WeatherAPI returns location.lat and location.lon in every response but not elevation directly — you need to pull that from a DEM source separately. The Copernicus DEM at 30m resolution is freely available; for most outdoor-focused apps, calling a tile elevation API once per unique location and caching the result is all you need. SRTM data works too and is easier to self-host if you’re already running your own infrastructure.
The pattern we use: grab elevation on first lookup, store it against the location key, and pass it through to the reliability check on every subsequent response. One lookup per location, not per request.
What We Actually Can’t Fix Here
There’s no clean workaround for the missing radiation term. Physiological Equivalent Temperature (PET) and the Universal Thermal Climate Index (UTCI) both incorporate mean radiant temperature, which requires modelling direct and diffuse solar flux, terrain-reflected radiation, and longwave surface emission. We expose uv_index and solar radiation in W/m² on some endpoints, but assembling a full UTCI calculation from those fields is a real engineering project. UTCI — published by Fiala et al. and maintained under WMO auspices — is the right target for any serious high-altitude outdoor thermal comfort application. It’s not something you can bolt onto a feels-like field after the fact.
The honest position: feelslike_c is accurate enough at low elevation in the conditions it was designed for. Above ~1,500m on a clear, calm day, treat it as an approximation that leans toward underestimating perceived warmth. Flag it rather than suppress it — most users are better served by a caveat than by no number at all.
If you’re building for alpine hiking, ski resort conditions, or high-altitude construction scheduling, add the reliability check before you ship. It’s about 20 lines of code. The alternative is a support thread from someone who noticed the “feels like 13°C” reading while standing in full sun at 3,000 metres in July — and they’ll be right to complain.
