CFM calculator
A 20 by 15 foot room with an 8 foot ceiling and 6 air changes per hour needs 240 CFM. Enter your room and the air changes you want to pick a fan that is neither weak nor oversized. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Length
- 20
- Width
- 15
- Ceiling height
- 8
- Ach
- 6
- Volume
- 2,400 CFM
- Minutes per hour
- 60
- Cfm
- 240
Sizing ventilation by guesswork either starves a room of fresh air or wastes fan energy on an oversized blower that short-cycles. This CFM calculator converts four positive numbers—room length, room width, ceiling height, and desired air changes per hour—into the required airflow in cubic feet per minute. The method is the standard HVAC volume formula: cubic footage times ACH, divided by sixty minutes in an hour, so a workshop that needs eight air changes uses more CFM than a bedroom of the same footprint that only needs four.
How length, width, ceiling height, and ACH become cubic feet per minute
Required airflow in this calculator is the product of room air volume and desired air changes per hour, divided by sixty minutes. Length and width are the interior plan dimensions in feet; for a rectangular room they are the two wall-to-wall distances, and for an L-shaped or bay-windowed space they should come from a measured plan so volume is not understated.
Ceiling height is the vertical distance from finished floor to finished ceiling in feet; vaulted or tray ceilings should use the average height so the cubic footage matches the air that actually sits in the room. Volume is simply length times width times ceiling height, which is the cubic footage that the fan must replace.
Air changes per hour, often written ACH, is how many times that full volume should be exchanged every hour: a quiet bedroom might target two to four, a bathroom six to eight, a kitchen seven to eight, and a dusty workshop eight to ten or more. Multiplying volume by ACH gives cubic feet per hour; dividing by sixty converts that hourly volume into cubic feet per minute, the nameplate unit on exhaust fans, supply registers, and inline blowers.
A twenty-by-fifteen-foot room with an eight-foot ceiling and six air changes per hour therefore needs two hundred forty CFM, because twenty times fifteen times eight is two thousand four hundred cubic feet, times six is fourteen thousand four hundred cubic feet per hour, divided by sixty is two hundred forty.
What you send, what you get back, and how validation fails
A twelve-by-ten-foot room with a nine-foot ceiling and eight air changes per hour yields one hundred forty-four CFM, which is a typical small bathroom exhaust. Raise the ceiling or the ACH target and the airflow climbs because both volume and exchange rate increased. Validation failures name the offending field so a form can highlight length when someone types zero, or ach when a spreadsheet leaked a negative.
Wire the free browser form for retail floor staff and homeowners, then call the identical contract from your backend when you size catalog filters or contractor intake. Upper limits protect the isolate: length and width at most ten thousand feet, ceiling height at most one hundred feet, and ACH at most one hundred twenty.
Where a CFM calculator earns its keep
Home improvement retailers and marketplace listings need a quick CFM band so customers pick a bathroom fan or kitchen exhaust that can actually turn the listed room over instead of returning an underpowered unit after the first stuffy week. Property managers and short-term rental hosts estimate supplemental ventilation for windowless baths and converted attics before buying inline fans for guest season.
HVAC sales desks and insulation contractors use the same four-input model as a first-pass sanity check before committing to a full Manual J or ASHRAE 62.2 survey with occupancy, infiltration tests, and duct friction. Builders and interior designers working on studio conversions, garden rooms, and garage workshops want a volume-aware number that does not pretend every room has an eight-foot ceiling or the same air-change target.
If you later need a unit conversion from CFM to litres per second, cooling BTU from room size, or HVAC tonnage, treat those as separate search intents and landings rather than overloading this CFM page. The tool is a volume-and-ACH rule of thumb, not a substitute for a licensed ventilation design on a whole house or a commercial fit-out.
What you can do with it
Bathroom and kitchen exhaust shopping
Homeowners enter room length, width, ceiling height, and a target ACH to pick an exhaust fan whose nameplate CFM covers the required airflow without guessing from square footage alone.
Contractor intake and catalog filters
HVAC desks and e-commerce configurators map room dimensions and ACH to a CFM band so product filters and first-pass quotes stay consistent with the published calculator.
FAQ
How is required CFM calculated from room size and air changes?
CFM equals length (ft) times width (ft) times ceiling height (ft) times air changes per hour, divided by 60. That is room volume in cubic feet times ACH, converted from cubic feet per hour into cubic feet per minute.
What air changes per hour should I use?
Typical residential targets: bedrooms about 2–4 ACH, living rooms 3–4, bathrooms 6–8, kitchens 7–8, and workshops 8–10 or more. The field is a positive number, so you can pass a code-required or measured ACH instead of a closed list.
What happens if a dimension is zero or negative?
Length, width, ceiling height, and air changes per hour must all be positive; a non-positive dimension cannot size required airflow and is not billed.
Is this a full ASHRAE or Manual J ventilation design?
No. It is the standard volume-and-ACH rule of thumb for first-pass fan sizing. Occupancy, infiltration, duct friction, and climate-zone tables are out of scope and belong on other landings.
What ceiling height should I enter for a vaulted ceiling?
Enter the average height of the room. That way the volume matches the air that actually sits in the space, and the fan is sized for the real room rather than for its lowest or highest point.
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/build/cfm \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"length":20,"width":15,"ceiling_height":8,"ach":6}'const res = await fetch("https://api.kit.forhosting.com/build/cfm", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"length": 20,
"width": 15,
"ceiling_height": 8,
"ach": 6
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/build/cfm",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"length": 20,
"width": 15,
"ceiling_height": 8,
"ach": 6
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/build/cfm", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"length":20,"width":15,"ceiling_height":8,"ach":6}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"length":20,"width":15,"ceiling_height":8,"ach":6}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/build/cfm", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"length": 20,
"width": 15,
"ceiling_height": 8,
"ach": 6
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "build.cfm",
"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.
Limits
max_length | 10000 |
min_length | 1e-9 |
max_width | 10000 |
min_width | 1e-9 |
max_ceiling_height | 100 |
min_ceiling_height | 1e-9 |
max_ach | 120 |
min_ach | 1e-9 |
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
Identical inputs always produce identical CFM; there is no network, no clock, and no model drift between the public page and the API.
How length, width, ceiling height, and ACH become cubic feet per minute
Every arithmetic step is deterministic floating-point math with stable rounding: the same four positives always produce the same JSON. Missing fields, non-finite numbers, and any dimension that is zero or negative fail early with invalid_input and are not charged.
What you send, what you get back, and how validation fails
Send four required numeric fields. length is a finite positive number for interior room length in feet. width is a finite positive number for interior room width in feet. ceiling_height is a finite positive number for ceiling height in feet. ach is a finite positive number for desired air changes per hour. Strings that parse as finite numbers are accepted the same as JSON numbers, and aliases such as length_ft, room_width, height, and air_changes_per_hour are recognized so existing forms do not need a rename. On success the response echoes the cleaned inputs, the computed volume in cubic feet, the constant sixty minutes per hour, the required cfm value, a unit of CFM, the formula string, and a method tag. Pricing for successful API calls is the published base of $0.002 per item; validation failures do not consume prepaid balance.
Where a CFM calculator earns its keep
E-commerce configurators and chat agents call the API to map length, width, ceiling height, and ACH into a CFM recommendation that stays identical to the public calculator page. Because this capability is a pure parse engine, API pricing is the published base of $0.002 per successful item and failed validation does not consume balance.
Integration use cases
Rental and property-manager ventilation checks
Hosts and facilities teams size supplemental fans for windowless baths and converted attics before guest season, using the same contract the public widget runs.
Technical questions
What does the CFM calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.