Betz Limit Maximum Wind Power Calculator
The Betz limit maximum wind power calculator estimates the theoretical upper bound on power that an ideal wind turbine can extract from moving air.
Run — free
Enter the rotor swept area and undisturbed wind speed, and optionally adjust air density. The calculator first finds the kinetic power crossing the rotor area, then applies the Betz coefficient of 0.593. The result is a physical ceiling, not a prediction of the electrical output of a particular turbine.
Understand what the Betz limit represents
Wind carries kinetic energy, but a turbine cannot remove all of it while allowing air to continue flowing through and beyond the rotor. If the air were brought completely to rest at the rotor, no fresh air could pass through to sustain power production. Ideal actuator-disk theory balances the slowing of the air with continued mass flow and establishes a maximum power coefficient. This calculator uses 0.593, the familiar rounded Betz limit, meaning that at most 59.3 percent of the kinetic power crossing the swept area is treated as extractable. The result is therefore a theoretical aerodynamic ceiling. It does not include blade-profile losses, wake rotation, gearbox losses, generator efficiency, electrical conversion, control strategy, cut-in or cut-out behavior, turbulence, tower shadow, or downtime. A real turbine should produce less than this limit under the same stated conditions. Use the value to check physical plausibility, compare broad rotor-and-wind scenarios, or establish an optimistic bound before applying machine-specific performance data such as a certified power curve.
Enter area, speed, and air density correctly
Provide rotor_area_m2 as the swept area of the blades, not the blade surface area. For a conventional circular rotor, swept area is pi multiplied by the square of the rotor radius. Provide wind_speed_m_s in meters per second as the undisturbed upstream wind speed appropriate to the rotor location and hub height. Wind speed cannot be negative; zero is valid and produces zero power. The optional air_density_kg_m3 field defaults to 1.225 kilograms per cubic meter, a commonly used reference value. Actual density varies with temperature, pressure, altitude, and humidity, so measured or site-adjusted density improves scenario accuracy. The calculator evaluates one operating point and assumes the supplied values are spatially representative across the entire rotor disk. It does not extrapolate wind measurements between heights, average gusts, or convert a wind-speed distribution into annual energy. Keep all inputs in the declared SI units. If you begin with rotor diameter, divide it by two to obtain radius and calculate the circular area before submitting the request.
Interpret the returned power values
The calculation begins with available_wind_power_w = 0.5 × air density × rotor area × wind speed cubed. It then multiplies that value by the fixed betz_coefficient of 0.593 to obtain maximum_power_w and reports the same bound in maximum_power_kw for convenience. The cubic dependence on speed is crucial: doubling wind speed multiplies the instantaneous theoretical power by eight when area and density remain fixed. Doubling rotor area doubles power. These relationships make the calculator useful for sensitivity checks, but they also make poor wind-speed assumptions especially costly. Do not multiply a single maximum-power result by all hours in a year to estimate annual energy unless the wind truly remains constant, which it does not at real sites. Annual estimates require a wind-speed frequency distribution, turbine power curve, availability, and electrical-loss assumptions. Treat this result as an upper-bound benchmark. When evaluating equipment, compare the manufacturer curve at the same air-density basis and confirm that rated power, control limits, and operating range are considered separately from the aerodynamic Betz ceiling.
What you can do with it
Screen a turbine concept
Estimate the physical upper bound for a proposed rotor before adding aerodynamic, mechanical, and electrical efficiency assumptions.
Check a claimed power figure
Compare a stated output with the kinetic power in the wind and the Betz ceiling at the same area, density, and speed.
Explore wind-speed sensitivity
Evaluate operating points to see how the cubic wind-speed relationship changes the maximum extractable power.
FAQ
What does the calculation cost?
It runs free in the browser on this page. API requests cost $0.002 each.
Does the result equal actual turbine output?
No. It is an ideal aerodynamic maximum before real blade, drivetrain, generator, control, availability, and electrical losses.
Why is wind speed cubed?
Air mass flow grows with wind speed while kinetic energy per unit mass grows with speed squared, producing a cubic relationship.
What rotor area should I enter?
Enter the swept disk area in square meters. For a circular rotor, calculate pi times the rotor radius squared.
Can wind speed be zero or negative?
Zero is valid and returns zero power. Negative wind speed is rejected because this calculation uses speed magnitude.
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/betz-limit-power \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"rotor_area_m2":100,"wind_speed_m_s":10}'const res = await fetch("https://api.kit.forhosting.com/earth/betz-limit-power", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"rotor_area_m2": 100,
"wind_speed_m_s": 10
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/earth/betz-limit-power",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"rotor_area_m2": 100,
"wind_speed_m_s": 10
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/earth/betz-limit-power", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"rotor_area_m2":100,"wind_speed_m_s":10}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"rotor_area_m2":100,"wind_speed_m_s":10}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/earth/betz-limit-power", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"rotor_area_m2": 100,
"wind_speed_m_s": 10
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "earth.betz_limit_power",
"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. |