DSCR calculator
Net operating income of 180,000 against 120,000 of annual loan payments gives a DSCR of 1.5: the property earns one and a half times what its debt costs each year. At 1.00, income only just covers the payments. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Net operating income
- 180,000
- Total annual debt service
- 120,000
- Dscr
- 1.5
Debt service coverage ratio, almost always abbreviated DSCR in commercial real estate and business credit, is the number a lender uses to test whether operating cash can actually pay the loan. A result of 1.00 means income exactly meets scheduled principal and interest; 1.25 is the conventional commercial-mortgage floor many covenants still print; anything below 1.00 means the asset does not currently cover its debt.
What DSCR measures and how the ratio is formed
The debt service coverage ratio answers a single underwriting question: after operating expenses, does the property or operating company still produce enough cash to make every scheduled loan payment this year? Searchers who type dscr calculator want that quotient, not a loan-to-value, not a capitalization rate, and not a spreadsheet that silently changes the decimal separator.
Net operating income is the numerator: typically effective rental revenue plus other operating income, minus operating expenses such as vacancy allowance, property tax, insurance, utilities, repairs, and management, and before debt service, income tax, depreciation, and capital expenditure that a lender treats separately. Total annual debt service is the denominator: twelve months of required principal and interest, including any amortizing note, interest-only period payment, or mandatory reserve the credit agreement counts as debt service. This tool divides those two finite amounts and returns dscr.
A ratio of 1.00 means income equals the payment with no cushion. A ratio of 1.25 is the conventional commercial-mortgage covenant many term sheets still print. A ratio below 1.00 means operations do not currently cover the loan.
Negative net operating income is accepted and yields a negative ratio, which is the honest picture of a loss-making asset rather than a fabricated coverage figure. The calculator does not convert currencies, does not split principal from interest, and does not apply a lender hurdle: those belong on the term sheet.
Where a DSCR calculator earns its keep
Loan-origination desks and borrower portals rank for dscr calculator because a credit committee thinks in the coverage ratio, not in a raw rent roll. Asset managers and special servicers live on trailing-twelve-month statements; dividing NOI by contractual annual debt service gives the same monitoring figure without forcing an analyst to remember whether a cell already subtracted the mortgage. Educators teaching real-estate finance can seed classroom examples that fail loudly on zero debt service instead of printing Infinity a student might treat as infinite coverage.
Failed validation does not consume balance. Keep annual debt service strictly positive, pin the rounded dscr field in tests, and you get a reproducible coverage ratio for widgets, course modules, and edge workers without standing up a credit-policy engine of your own.
What you can do with it
Commercial mortgage term-sheet check
Turn trailing-twelve-month net operating income and the proposed annual principal-and-interest payment into the DSCR a lender will quote on the term sheet.
Vacancy and rate-reset stress
Re-run the ratio after cutting NOI or raising the annual payment so a refinance package shows how close the asset sits to a 1.00 shortfall.
FAQ
What happens if annual debt service is zero?
DSCR is a quotient, so a zero denominator is undefined and is not billed.
Can net operating income be negative?
Yes. A loss-making property or company is allowed and yields a negative DSCR, which honestly describes an asset that does not cover its loan.
Does this calculator apply a lender threshold such as 1.25?
No. It returns the ratio only. Compare dscr to your own covenant in the calling application if you need a pass or fail flag.
What counts as net operating income?
Rental and other operating revenue minus operating costs such as vacancy, property tax, insurance, utilities, repairs and management. It is measured before loan payments, income tax, depreciation and capital spending.
What goes into total annual debt service?
Twelve months of required principal and interest on the loan, including interest-only payments and any mandatory reserve your credit agreement counts as debt service.
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/fin/dscr \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"net_operating_income":180000,"total_annual_debt_service":120000}'const res = await fetch("https://api.kit.forhosting.com/fin/dscr", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"net_operating_income": 180000,
"total_annual_debt_service": 120000
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/fin/dscr",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"net_operating_income": 180000,
"total_annual_debt_service": 120000
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/fin/dscr", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"net_operating_income":180000,"total_annual_debt_service":120000}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"net_operating_income":180000,"total_annual_debt_service":120000}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/fin/dscr", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"net_operating_income": 180000,
"total_annual_debt_service": 120000
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "fin.dscr",
"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_abs_value | 1000000000000000 |
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
This calculator accepts net operating income and total annual debt service as finite numbers, divides the first by the second, and returns the ratio as a deterministic JSON contract. Zero annual debt service is rejected with invalid_input because the quotient is undefined.
What DSCR measures and how the ratio is formed
Because division by zero is undefined, a total_annual_debt_service of zero fails with invalid_input instead of Infinity, NaN, or a hollow ratio a form might treat as a pass.
Input contract, response shape, and error behaviour
Negative annual debt service is likewise rejected, because a coverage ratio with a negative denominator is not the DSCR a credit agreement describes. On success the body echoes both inputs, returns dscr as the rounded quotient, and includes a formula string restating the identity. POST a JSON body that supplies net_operating_income and total_annual_debt_service. net_operating_income is the period NOI in a single currency unit, a finite number that may be negative when the asset is currently losing money, with aliases noi, annual_noi, noi_annual, and net_operating_income_annual. total_annual_debt_service is the twelve-month principal-plus-interest obligation in the same currency, a finite number that must be strictly greater than zero, with aliases debt_service, ads, annual_debt_service, tads, and total_debt_service. Each numeric field may arrive as a JSON number or as a numeric string. Missing net_operating_income, missing total_annual_debt_service, empty strings, non-finite values, or a magnitude above the declared limit fail with invalid_input naming the field and are not billed. Zero annual debt service is the error this landing exists to catch: the message contains total_annual_debt_service and must not be zero so a form can highlight that control instead of showing a global alert. Example: net_operating_income of one hundred eighty thousand against total_annual_debt_service of one hundred twenty thousand yields dscr of 1.5. Example: net_operating_income of seventy-five thousand against ninety thousand of annual debt service yields a ratio below one, which is a clear shortfall rather than a silent empty payload. Pair the ratio with your own lender threshold if the term sheet needs a pass or fail flag; this endpoint computes the coverage ratio only and does not invent a covenant result.
Where a DSCR calculator earns its keep
Small-business credit and franchise underwriting use the same identity on company NOI rather than property NOI, and the JSON contract does not care which story produced the numerator. Portfolio scripts can call the same module in a loop over many notes; each item is one request, the unit is item, and the free browser path remains byte-for-byte identical to the API so a landing-page preview never lies about the figure that will be stored after a save.
Integration use cases
Portfolio covenant monitoring
Score many notes from the API by sending each property's NOI and contractual annual debt service, then store the returned dscr next to the loan.
Technical questions
How is DSCR calculated from NOI and annual debt service?
Send finite numbers net_operating_income and total_annual_debt_service. The API returns dscr as net_operating_income divided by total_annual_debt_service, rounded to six decimal places.
What does the DSCR calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.