Lifting condensation level temperature calculator
The lifting condensation level temperature calculator estimates the temperature an unsaturated parcel of surface air reaches when lifted until it first becomes saturated.
Run — free
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. API automation costs $0.002 per request, while the same deterministic calculation can run in the browser without a network-dependent algorithm.
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.
How much does API use cost?
Each API request costs $0.002. The deterministic browser calculation is available without an API request.
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. |