Steadman apparent temperature calculator with wind and radiation
The Steadman apparent temperature calculator estimates how warm or cool conditions feel by combining air temperature with moisture, moving air, and radiant heat.
Run — free
Unlike a conventional heat index, this calculation can represent the cooling effect of wind and the added load from absorbed radiation. Enter temperature in degrees Celsius, relative humidity from zero to one hundred percent, wind speed in metres per second, and optional net radiation in watts per square metre. The result includes the apparent temperature, calculated vapour pressure, and each individual contribution for a transparent, reproducible assessment.
Choose measurements that describe the same exposure
Apparent temperature is most useful when all inputs represent the conditions experienced by the same person, place, and moment. Enter air temperature in degrees Celsius and relative humidity as a percentage, not a fraction. Wind speed should describe airflow at the exposed person rather than a distant weather station if local shelter, machinery, or building geometry changes it. Net radiation is the absorbed radiant heat per square metre after incoming and outgoing effects are combined. Set it to zero when you want the commonly used shaded version or when no defensible radiation measurement exists. A positive value represents net radiant gain, such as exposure to sun or a hot surface, while a negative value represents net radiant loss. Do not substitute solar irradiance directly unless it has already been converted to the net radiation absorbed by the subject. Keeping the measurements consistent matters more than adding a highly uncertain radiation estimate, because the calculator faithfully applies whatever values it receives.
Understand how the Steadman equation builds the result
The calculation first converts temperature and relative humidity into water-vapour pressure using a saturation-vapour-pressure approximation. That pressure drives the positive evaporation-related term in the Steadman expression: humid air generally reduces the body's opportunity to shed heat through evaporation, so its apparent-temperature contribution rises. Wind contributes a negative term proportional to speed, representing convective cooling. Radiation contributes through a term divided by wind speed plus ten, so the same radiant load has a smaller temperature effect as airflow increases. Finally, the equation combines these contributions with air temperature and a fixed calibration offset. The response exposes vapour pressure and all three contributions alongside the final apparent temperature. These fields make comparisons easier: users can hold temperature constant, vary one environmental input, and see exactly which part moved. Rounding happens only for the reported fields; the formula uses full floating-point precision internally before producing the selected number of decimal places.
Interpret the estimate with appropriate caution
Use the result as an environmental indicator, not as a personal medical threshold. Steadman's apparent temperature represents a standardized heat-balance relationship and cannot account for every person's clothing, work rate, hydration, acclimatization, age, health, or access to shade. It is valuable for comparing scenarios, enriching weather observations, screening outdoor plans, and documenting how wind or radiant exposure changes a baseline condition. For operational heat safety, combine it with the rules, measurements, and exposure limits required by the relevant workplace or public-health authority. Relative humidity must remain between zero and one hundred percent; values outside that physical percentage range cause an error rather than being silently corrected. Negative wind speed is also invalid. When radiation is unknown, report that the zero-radiation shaded form was used so readers do not mistake the result for a full-sun estimate. Automated users can call the API for $0.002 per request, while browser calculations use the same deterministic formula without sending the calculation elsewhere.
What you can do with it
Compare shade and radiant exposure
Evaluate otherwise identical conditions with zero and measured net radiation to quantify the radiant contribution.
Enrich a weather observation
Turn temperature, humidity, and wind readings into an auditable apparent temperature with visible component terms.
Screen outdoor operating scenarios
Compare planned times or locations before applying the organization’s required heat-safety procedure.
FAQ
Which Steadman formula is used?
The radiation-aware SI form: air temperature plus 0.348 times vapour pressure, minus 0.70 times wind speed, plus 0.70 times net radiation divided by wind speed plus 10, minus 4.25.
What should I enter when radiation is unknown?
Leave net radiation omitted or enter zero. The result then represents the shaded, zero-net-radiation form.
Why does humidity outside 0–100 cause an error?
Relative humidity is supplied as a physical percentage. Rejecting an out-of-range value exposes a measurement or unit mistake instead of hiding it through clamping.
Is this the same as the NWS heat index?
No. The NWS heat index commonly uses temperature and humidity with the Rothfusz regression. This Steadman calculation additionally represents wind and optional net radiation.
Can I use solar irradiance as net radiation?
Not directly. Net radiation should represent radiant energy absorbed after relevant incoming, reflected, and outgoing effects; raw solar irradiance may overstate that input.
How much does an API calculation cost?
Each API request costs $0.002. The same deterministic calculation is available in the browser.
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/earth/heat-index-steadman \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"temperature_c":30,"relative_humidity":65,"wind_speed_m_s":2.5}'const res = await fetch("https://api.kit.forhosting.com/earth/heat-index-steadman", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"temperature_c": 30,
"relative_humidity": 65,
"wind_speed_m_s": 2.5
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/earth/heat-index-steadman",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"temperature_c": 30,
"relative_humidity": 65,
"wind_speed_m_s": 2.5
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/earth/heat-index-steadman", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"temperature_c":30,"relative_humidity":65,"wind_speed_m_s":2.5}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"temperature_c":30,"relative_humidity":65,"wind_speed_m_s":2.5}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/earth/heat-index-steadman", 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_c": 30,
"relative_humidity": 65,
"wind_speed_m_s": 2.5
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "earth.heat_index_steadman",
"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. |