DSCR calculator
A property with 50,000 of net operating income and 40,000 of yearly debt service has a DSCR of 1.25 and a 10,000 cushion, enough to pass the usual 1.25 minimum. Enter income and loan payments to check yours. 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
- 50,000
- Debt service
- 40,000
- Debt service coverage ratio (DSCR)
- 1.25
- Debt-service cushion
- 10,000
- Required threshold
- 1.25
This calculator divides a property's net operating income (NOI) by its annual debt service to produce the debt service coverage ratio (DSCR), the absolute cash cushion left after the loan, and a pass/fail flag against a lender threshold.
What the coverage ratio tells a lender
The debt service coverage ratio compares what a property earns with what its loan costs. Net operating income is divided by the debt service due over the year. A ratio of exactly 1.0 means income just covers the payments with nothing to spare; below 1.0, the property does not earn enough to pay its loan. Lenders usually want more room than that: 1.25 is the common minimum for commercial mortgages and the starting threshold here, and you can replace it with your lender's figure. With 50,000 of income and 40,000 of debt service, the ratio is 1.25 and the property passes.
Reading the ratio and the cushion together
The cushion, income minus debt service, shows the same margin as an amount: 10,000 in that example. The ratio is shown to three decimals by default, because coverage tests often turn on small differences, and the pass or fail check uses the unrounded figure, so a value sitting right on the threshold is judged correctly. Negative income gives a negative ratio, which describes a property that is losing money. To stress test a deal, lower the income or raise the payments, for example after a rate rise, and watch when the ratio drops under 1.25.
What DSCR measures and how it is computed
The debt service coverage ratio tells a lender how comfortably a property's income covers its loan payments. Worked example: an NOI of 50,000 against debt service of 40,000 gives a DSCR of 1.25, a cushion of 10,000, and passes: true at the default 1.25 threshold. A DSCR of exactly 1.0 means income precisely equals the loan payment with no margin; anything below 1.0 means the property does not earn enough to service its debt.
Inputs, defaults, rounding and validation
The threshold defaults to 1.25, the common commercial-mortgage minimum, but you can pass any lender-specific hurdle. The dscr is rounded with a half-up rule to a configurable number of decimals (default 3, finer than most outputs because coverage ratios turn on small differences), while the cushion is always rounded to 2 decimals as a currency figure. The pass/fail test uses the raw, unrounded ratio, so a value sitting right on the threshold is judged correctly.
What you can do with it
Loan sizing and covenants
Check whether a property's NOI clears a lender's DSCR minimum before submitting a loan request, and see the exact cash cushion above the payment.
Scenario stress testing
Sweep NOI and debt service assumptions to see how a rate rise or income dip pushes the ratio under 1.25 and turns passes to false.
FAQ
What DSCR counts as passing?
The tool returns passes: true when dscr is greater than or equal to the threshold, which defaults to 1.25 but can be set to any lender's minimum.
Can NOI be negative?
Yes. A loss-making property is allowed and yields a negative DSCR and a negative cushion, which will fail against any positive threshold.
What does a DSCR of exactly 1.0 mean?
That the property's income just equals its loan payments, with nothing to spare. Anything below 1.0 means it does not earn enough to service its debt, which is why lenders ask for a margin above it.
Can I use my lender's own threshold?
Yes. The starting threshold is 1.25, the common minimum for commercial mortgages, but you can enter any figure your lender requires. The check passes when the ratio is equal to or above it.
What is the cushion in the result?
Net operating income minus debt service, shown as an amount rather than a ratio. With 50,000 of income and 40,000 of debt service, the cushion is 10,000 a year.
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/finance/debt-service-coverage \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"noi":50000,"debt_service":40000}'const res = await fetch("https://api.kit.forhosting.com/finance/debt-service-coverage", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"noi": 50000,
"debt_service": 40000
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/finance/debt-service-coverage",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"noi": 50000,
"debt_service": 40000
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/finance/debt-service-coverage", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"noi":50000,"debt_service":40000}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"noi":50000,"debt_service":40000}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/finance/debt-service-coverage", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"noi": 50000,
"debt_service": 40000
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "finance.debt_service_coverage",
"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. |
Technical notes
What DSCR measures and how it is computed
The tool divides net operating income (noi) by annual debt_service to produce the dscr, and separately reports the cushion — the plain dollar difference noi minus debt_service — so you see both the ratio and the absolute margin. It then compares the ratio to a threshold (default 1.25) and returns passes: true when dscr is greater than or equal to that threshold.
Inputs, defaults, rounding and validation
Both noi and debt_service are required. noi must be a finite number and may be negative to model a property currently losing money, which yields a negative DSCR. debt_service must be a number strictly greater than zero — a zero or negative debt service returns a typed invalid_input error, because dividing by it would be undefined or meaningless.
Widget, API and eight-language landings
Use the API to score a whole loan book, run covenant checks across a portfolio, or test many NOI and debt scenarios against different thresholds in one batch. API tasks are billed from $0.002 against prepaid KIT balance, and only successful runs are charged. The landing is published in eight languages with translated slugs and keywords so an analyst or borrower searching in their own language finds a local page, while the JSON contract — noi, debt_service, threshold in, dscr, cushion, passes out — stays identical across every locale.
Integration use cases
Portfolio covenant monitoring
Call the API to score DSCR across many properties against each loan's threshold and flag any that fall below their covenant.
Technical questions
What is the cushion output?
It is the absolute dollar difference between NOI and debt service (noi minus debt_service), rounded to 2 decimals — the cash left over after the loan payment.
Why must debt service be greater than zero?
DSCR is NOI divided by debt service, so a zero or negative debt_service is undefined and returns a typed invalid_input error.
Is the browser tool free and accurate?
The widget is free and deterministic, matching the API exactly. The API is billed from $0.002 and only charges successful tasks.