Feels-like temperature calculator
This feels-like temperature calculator chooses the weather formula for you. Enter the measured air temperature and provide wind speed, relative humidity, or both.
Run — free
In cold and windy conditions it calculates wind chill; in hot conditions with humidity it calculates the heat index. When neither formula is valid for the supplied conditions, it returns the measured temperature instead of extending an equation beyond its intended range. Results use the same Celsius or Fahrenheit unit as your temperature input.
One result from the weather data you have
A feels-like reading is not produced by one universal equation. Cold moving air increases heat loss from exposed skin, while hot humid air makes perspiration less effective at cooling the body. This calculator accepts an air temperature and whichever supporting observation is available: wind speed, relative humidity, or both. It first normalizes the values internally, then selects the formula whose published applicability conditions match them. The returned feels-like temperature stays in the temperature unit you selected, so a Celsius input produces Celsius output and a Fahrenheit input produces Fahrenheit output. The response also names the formula used. That explicit label matters in automated workflows because a downstream system can distinguish a calculated wind chill or heat index from a case where the measured air temperature was retained. At least one of wind speed and humidity must be present. Supplying both is encouraged when a weather station records both, because it lets the selector make the decision from a complete observation without requiring the caller to pre-classify the weather.
How automatic formula selection works
Wind chill is considered only when wind speed is above 3 miles per hour and the air temperature is 50 degrees Fahrenheit or lower, equivalent to about 4.8 kilometres per hour and 10 degrees Celsius. Within that range, the calculator uses the North American wind chill equation based on temperature and wind speed. If the cold-weather test does not apply, heat index is considered when relative humidity is supplied and the air temperature is at least 80 degrees Fahrenheit, about 26.7 degrees Celsius. The heat calculation uses the Rothfusz regression and its standard low-humidity and high-humidity adjustments. Near the lower boundary, the simpler preliminary heat-index estimate determines whether the full regression is appropriate. Wind chill receives priority only when its cold and windy conditions are actually met; therefore providing both observations does not create an arbitrary average of unrelated formulas. Outside both accepted ranges, the formula field is air_temperature and the feels-like value equals the measured temperature. This conservative fallback avoids presenting an unsupported extrapolation as meteorological precision.
Reading and using the result responsibly
The output contains the rounded feels-like temperature, the original air temperature, the temperature unit, and the formula selected. Use the formula field when displaying a label such as wind chill or heat index, and retain the measured value when you need an audit trail. The result describes standardized outdoor exposure conditions; it is not a personalized medical forecast. Sunlight, shade, clothing, activity, age, health, wind shelter, and local microclimates can all change how a person experiences the same observation. Weather agencies may also publish values based on station sampling rules or rounding that differ slightly from a calculation using raw inputs. For operational alerts, compare the result with the thresholds and official guidance appropriate to the location rather than treating the number alone as a safety decision. The calculator is deterministic and performs no network lookup, so it will not fetch current weather or infer missing observations. That makes it suitable for processing sensor readings, archived datasets, and forecast values where you already control the source and timestamp of each input.
What you can do with it
Add a feels-like field to station data
Convert temperature, wind, and humidity observations into one consistently labelled apparent-temperature value.
Process mixed seasonal forecasts
Use one integration for winter wind chill and summer heat index without selecting a formula in advance.
Check outdoor plans
Estimate standardized cold or heat exposure from forecast values while keeping the selected formula visible.
FAQ
What does the API request cost?
The base price is $0.002 per request. The same deterministic calculation can run in the browser for free.
What happens if I provide both wind speed and humidity?
The calculator checks the cold, windy wind-chill conditions first, then the hot, humid heat-index conditions. It never averages the two formulas.
Why does the result sometimes equal the air temperature?
Neither standard formula applies outside its defined weather range, so the calculator conservatively returns the measured temperature and labels the formula as air_temperature.
Which wind speed units are accepted?
You can supply kilometres per hour, miles per hour, or metres per second by selecting km/h, mph, or m/s.
Can I omit humidity?
Yes, if wind speed is present. A cold and windy observation can produce wind chill without humidity; otherwise the measured temperature is returned.
Can I omit wind speed?
Yes, if humidity is present. A sufficiently hot observation can produce a heat index without wind speed.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/calc3/temperature-feels-like-wind-or-humidity \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"temperature":35,"wind_speed":25}'const res = await fetch("https://api.kit.forhosting.com/calc3/temperature-feels-like-wind-or-humidity", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"temperature": 35,
"wind_speed": 25
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/calc3/temperature-feels-like-wind-or-humidity",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"temperature": 35,
"wind_speed": 25
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/calc3/temperature-feels-like-wind-or-humidity", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"temperature":35,"wind_speed":25}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"temperature":35,"wind_speed":25}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/calc3/temperature-feels-like-wind-or-humidity", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"temperature": 35,
"wind_speed": 25
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "calc3.temperature_feels_like_wind_or_humidity",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |