Lifting condensation level temperature calculator
Surface air at 30 °C with a 20 °C dew point becomes saturated at 17.665117 °C when lifted: that is the lifting condensation level temperature, shown in Celsius and Kelvin. It gives the saturation temperature only, not the height or pressure of that level. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Surface temperature c
- 30
- Dew point c
- 20
- Lcl temperature c
- 17.665117
- Lcl temperature k
- 290.815117
The lifting condensation level temperature calculator estimates the temperature an unsaturated parcel of surface air reaches when lifted until it first becomes saturated. Enter the surface air temperature and dew point in degrees Celsius, and the calculator applies the Bolton relation to return the LCL temperature in both Celsius and Kelvin. It is useful for meteorology exercises, sounding analysis, forecasting workflows, and quick consistency checks when the two surface measurements are already known.
What the lifting condensation level temperature means
The lifting condensation level, usually shortened to LCL, is the level where a rising parcel of initially unsaturated air first reaches saturation. As the parcel rises and expands, it cools. Before saturation, its temperature generally falls faster than its dew point, so the two approach each other.
The temperature at which they meet is the LCL temperature calculated here. This value is not the height or pressure of the LCL, and the calculator does not infer either quantity. It gives the parcel temperature at saturation from two surface observations: air temperature and dew point.
That distinction matters when reading a sounding or comparing formulas, because LCL height, LCL pressure, and LCL temperature describe related but different properties. A small initial temperature–dew-point spread usually produces an LCL temperature close to the starting temperature, while a dry surface parcel generally must cool farther before saturation. The output can therefore serve as a compact measure of the thermodynamic change required for cloud-base saturation, provided the parcel assumptions are appropriate for the analysis.
How the Bolton relation is applied
The calculation converts both Celsius inputs to Kelvin and evaluates the commonly used Bolton approximation: the reciprocal of the sum of one divided by the dew-point temperature minus 56 kelvins and the natural logarithm of the temperature-to-dew-point ratio divided by 800, followed by adding 56 kelvins. The result is converted back to Celsius as well as retained in Kelvin. Both returned values are rounded to six decimal places for stable, readable output; the equation itself is evaluated with full JavaScript floating-point precision before that final formatting step.
The relation expects physically consistent surface measurements. Dew point cannot be higher than air temperature in the input model, so the capability returns an invalid-input error when that condition is violated. Equal values are allowed and represent air that is already saturated at the surface, producing an LCL temperature equal to the supplied temperature apart from normal numerical representation.
Values at or below absolute zero and non-finite values are also rejected rather than being passed into the logarithm and producing a misleading numerical result.
Using the result responsibly
Use representative, co-located surface observations and keep both inputs in degrees Celsius. For example, a temperature from one station combined with a dew point from another elevation may be mathematically accepted but may not describe a real parcel. The result is best treated as an analytic parcel estimate, not a complete cloud forecast.
Actual cloud bases can be influenced by mixing, terrain, inversions, fronts, precipitation, measurement uncertainty, and whether parcels are lifted from the surface at all. The Bolton relation is widely useful because it compresses the temperature and moisture information into a direct LCL temperature estimate, but it does not model those environmental complications. In automated work, check for the typed invalid-input response before storing or using the result.
In manual analysis, compare the returned LCL temperature with the temperature profile or with other parcel diagnostics, and remember that a temperature alone does not locate the LCL vertically. Further calculations need pressure, height, or a sounding profile.
What you can do with it
Analyze a weather sounding
Estimate the parcel temperature at saturation before comparing the LCL with observed temperature and moisture profiles.
Check forecasting worksheets
Verify a hand calculation or spreadsheet that uses surface temperature and dew point with the Bolton approximation.
Validate meteorological data pipelines
Add a deterministic LCL temperature step and reject records whose dew point is greater than their air temperature.
FAQ
Which Bolton equation does this calculator use?
It uses the Bolton approximation for LCL temperature based on surface air temperature and dew point converted to Kelvin.
What units should I enter?
Enter both surface temperature and dew point in degrees Celsius. The result is returned in Celsius and Kelvin.
Why can the dew point not exceed the temperature?
For the surface parcel represented by this calculation, a dew point above air temperature is physically inconsistent, so it is rejected as invalid input.
Does the result give cloud-base height?
No. It gives temperature at the lifting condensation level. Estimating LCL height or pressure requires a separate relation and additional interpretation.
What happens when temperature equals dew point?
The parcel is already saturated, so the calculated LCL temperature equals the supplied surface temperature.
Related tools
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/lcl-temperature \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"surface_temperature_c":30,"dew_point_c":20}'const res = await fetch("https://api.kit.forhosting.com/earth/lcl-temperature", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"surface_temperature_c": 30,
"dew_point_c": 20
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/earth/lcl-temperature",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"surface_temperature_c": 30,
"dew_point_c": 20
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/earth/lcl-temperature", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"surface_temperature_c":30,"dew_point_c":20}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"surface_temperature_c":30,"dew_point_c":20}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/earth/lcl-temperature", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"surface_temperature_c": 30,
"dew_point_c": 20
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "earth.lcl_temperature",
"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. |
Technical notes
Using the result responsibly
API automation costs $0.002 per request, while the same deterministic calculation can run in the browser without a network-dependent algorithm.
Technical questions
How much does API use cost?
Each API request costs $0.002. The deterministic browser calculation is available without an API request.