Direct capitalization calculator (cap rate value)
Direct capitalization calculator: property value from NOI and a cap rate, or the cap rate a price implies, with reserves and lease-up deductions.
What it computes
Direct capitalization values an income property by dividing one year's net operating income (NOI) by a capitalization rate. The calculator works in both directions. Given a cap rate, it returns a stabilized value and an as-is value after reserves and below-the-line adjustments. Given a price, it returns the cap rate that price implies. With both, it also reports the difference between the as-is value and the price.
Method and conventions
-
Capitalized income =
noi − capex_reserve_annual. It must be positive. -
Below-the-line deductions =
lease_up_costs + free_rent_burn_off − Σ other_adjustments.amount. Other adjustments are signed: a negative amount (deferred maintenance) reduces value and a positive amount (excess land) adds to it. -
Stabilized value =
capitalized income ÷ cap_rate, rounded to the cent. -
As-is value =
stabilized value − deductions. Withround_value_to, it is also reported rounded to that increment, half away from zero (for example to the nearest 100,000). Value per square foot uses the unrounded as-is value. -
Implied cap rate =
capitalized income ÷ price. Two variants are also returned: before reserves (noi ÷ price) and all-in (capitalized income ÷ (price + deductions)), which is the yield on the price once the below-the-line costs are paid.
A cap rate applies only to income on the same basis as the market evidence it
came from. FactLot records the basis in noi_basis as
trailing_12, forward_12 or stabilized.
It does not check the basis against the cap rate, and it warns when the basis
is missing. The usual sequence for a property that is not yet stabilized is to
capitalize stabilized NOI and then deduct the cost of getting there. That is
what lease_up_costs and free_rent_burn_off do. The
output is labeled stabilized value whatever basis is chosen.
Sources differ on where capital reserves sit. Some cap rates are quoted on NOI
before reserves and others after. FactLot deducts
capex_reserve_annual before capitalizing and reports the implied
cap rate both ways. When the reserve is zero, it warns that comparables quoted
after reserves would need one. Practice also varies on below-the-line items.
Some appraisers discount lease-up costs for the time they take or add an
entrepreneurial incentive. FactLot deducts the amounts at face value, with no
discounting and no profit allowance. Rounding of the final value, common in
appraisal reports, is optional and reported separately, so the exact figure is
still available.
Inputs that matter
-
noi: annual net operating income before capital reserves. -
noi_basis:trailing_12,forward_12orstabilized; recorded in the steps. -
cap_rate: capitalization rate as a decimal; it gives the value. -
price: purchase or asking price; it gives the implied cap rate. -
capex_reserve_annual: annual replacement reserve deducted before capitalizing. -
lease_up_costs: one-time tenant improvements, commissions and lost rent needed to reach stabilized NOI. -
free_rent_burn_off: free rent still owed under signed leases that the stabilized NOI assumes is collected. -
other_adjustments: up to 20 labeled, signed value adjustments. -
area_sfandround_value_to: optional value and price per square foot, and a rounded as-is value.
Limits
- It capitalizes a single year of income. There is no holding period, no income growth and no reversion; that is a discounted cash flow, not direct capitalization.
- It does not build NOI from a rent roll or operating statement.
- It does not derive or select a cap rate. Market surveys, band-of-investment and comparable-sale extraction happen outside the calculator.
- Lease-up costs and free rent are deducted undiscounted. Transaction costs, taxes and financing are not considered.
-
At least one of
cap_rateandpriceis required. A reserve at or above NOI is an error. - Deductions larger than the stabilized value give a non-positive as-is value, with a warning. Per-unit values (per apartment or per key) are not reported; only per square foot.
Worked example
Inputs from FactLot's shared test case "value with reserves and below-the-line adjustments, and the cap rate the price implies (hand check: 975,000 ÷ 6.5% = 15,000,000)", which the TypeScript and Python libraries must both reproduce:
{
"noi": 1000000,
"noi_basis": "forward_12",
"cap_rate": 0.065,
"price": 15000000,
"capex_reserve_annual": 25000,
"lease_up_costs": 300000,
"free_rent_burn_off": 100000,
"other_adjustments": [
{
"label": "excess land",
"amount": 50000
}
],
"area_sf": 100000,
"round_value_to": 100000
}
Result
| Result | Value |
|---|---|
noi | 1,000,000 |
capitalized_income | 975,000 |
cap_rate | 0.065 |
stabilized_value | 15,000,000 |
total_deductions | 350,000 |
as_is_value | 14,650,000 |
as_is_value_rounded | 14,700,000 |
value_per_sf | 146.5 |
price | 15,000,000 |
implied_cap_rate | 0.065 |
implied_cap_rate_before_reserves | 0.066667 |
implied_cap_rate_all_in | 0.063518 |
price_per_sf | 150 |
Audit trail
Every intermediate value, in order, with the formula that produced it. Formula calc.direct_cap@1.
| Step | Value | Formula |
|---|---|---|
| NOI basis | forward 12 | |
| Capitalized income | 975,000 USD/yr | $1,000,000.00 NOI − $25,000.00 capital reserve |
| Below-the-line deductions | $350,000.00 | $300,000.00 lease-up + $100,000.00 free-rent burn-off − $50,000.00 excess land |
| Stabilized value | $15,000,000.00 | $975,000.00 ÷ 6.5% |
| As-is value | $14,650,000.00 | $15,000,000.00 − $350,000.00 below-the-line |
| As-is value, rounded | $14,700,000.00 | to the nearest $100,000.00 |
| Implied cap rate | 0.065 | $975,000.00 capitalized income ÷ $15,000,000.00 price |
| Implied cap rate before reserves | 0.066667 | $1,000,000.00 NOI ÷ $15,000,000.00 |
| Implied cap rate, all-in | 0.063518 | $975,000.00 ÷ ($15,000,000.00 price + $350,000.00 below-the-line) |
| Value versus price | -$350,000.00 | $14,650,000.00 as-is value − $15,000,000.00 price |
Use it from an agent or your code
- MCP: tool
calc_direct_caponhttps://api.factlot.com/mcp(connect a client). - Python:
factlot.run_tool("calc_direct_cap", input)runs the same calculation offline (Python SDK). - Input schema: every field is described in tools.json.
curl -s https://api.factlot.com/v1/calc/direct_cap \
-H 'content-type: application/json' \
-d '{"noi":1000000,"noi_basis":"forward_12","cap_rate":0.065,"price":15000000,"capex_reserve_annual":25000,"lease_up_costs":300000,"free_rent_burn_off":100000,"other_adjustments":[{"label":"excess land","amount":50000}],"area_sf":100000,"round_value_to":100000}'