Debt yield calculator
A property with 50,000 of net operating income and a 500,000 loan has a debt yield of 10%: its income equals a tenth of the amount borrowed. Enter the income and the loan to get the percentage. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Noi
- 50,000
- Loan amount
- 500,000
- Decimal places
- 4
- Debt yield percent
- 10
Debt yield = NOI / loan amount as a percent. Search intent: debt yield calculator. No network calls, no random seeds, and no server state are required for a correct answer. Failed jobs are not billed. Landings target
What debt yield measures
Debt yield compares a property's net operating income with the size of the loan against it. You divide the income by the loan principal and multiply by 100, so the answer is a percentage. With 50,000 of net operating income and a loan of 500,000, the debt yield is 10%: the property's income equals a tenth of the amount borrowed. Because only these two figures are involved, the interest rate, the repayment term and the monthly payments do not change the result, which makes it a simple way to set what a property earns against the money lent on it.
Using the figure without slips
Enter the loan principal, not the purchase price or the value of the property, and keep both figures in the same currency. A higher income or a smaller loan raises the percentage; a larger loan lowers it. To find the loan that matches a target, divide the income by the target percentage over 100: at 10%, 50,000 of income corresponds to a loan of 500,000. You can choose how many decimals to show, and rounding is applied only once, at the end, so the figure is not distorted by repeated rounding.
When to use it
Use when the search intent matches this tool. Debt yield = NOI / loan amount as a percent. No network calls, no random seeds, and no server state are required for a correct answer.
Failed jobs are not billed. Landings target the stated search intent with precise keywords. Prefer explicit units and ranges over silent coercion of bad types.
When a field is optional, defaults are documented in params and echoed in the output.
FAQ
Locales?
EN-only delivery; Nitro hydrates the other seven languages.
How is debt yield calculated?
Divide the net operating income by the loan principal and multiply by 100. With 50,000 of income and a 500,000 loan, that gives a debt yield of 10%.
Do the interest rate or loan term change the debt yield?
No. Only the net operating income and the loan amount go into it, so the result is the same whatever the interest rate, the repayment term or the size of the monthly payments.
How do I find the loan that matches a target debt yield?
Divide the income by the target percentage over 100. At 10%, 50,000 of net operating income corresponds to a loan of 500,000; enter that pair here to check it.
Which loan amount should I enter?
The loan principal, in the same currency as the net operating income. Do not enter the purchase price or the value of the property, which would give a lower and misleading percentage.
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-yield \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"noi":50000,"loan_amount":500000}'const res = await fetch("https://api.kit.forhosting.com/finance/debt-yield", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"noi": 50000,
"loan_amount": 500000
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/finance/debt-yield",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"noi": 50000,
"loan_amount": 500000
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/finance/debt-yield", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"noi":50000,"loan_amount":500000}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"noi":50000,"loan_amount":500000}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/finance/debt-yield", 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,
"loan_amount": 500000
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "finance.debt_yield",
"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
The calculator is free in the browser, deterministic, and identical in the API path. Inputs are validated before any arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE results when decimals are requested. Use the same JSON contract from spreadsheets, CMS hooks, automation, or teaching demos.
How it works
No network calls, no random seeds, and no server state are required for a correct answer. Failed jobs are not billed. Landings target the stated search intent with precise keywords. Prefer explicit units and ranges over silent coercion of bad types. When a field is optional, defaults are documented in params and echoed in the output. Debt yield = NOI / loan amount as a percent. debt_yield% = 100 × NOI / loan_amount. The calculator is free in the browser, deterministic, and identical in the API path. Inputs are validated before any arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE results when decimals are requested. Use the same JSON contract from spreadsheets, CMS hooks, automation, or teaching demos.
Inputs, limits and rounding
Outputs echo inputs for logging. No network calls, no random seeds, and no server state are required for a correct answer. Failed jobs are not billed. Landings target the stated search intent with precise keywords. Prefer explicit units and ranges over silent coercion of bad types. When a field is optional, defaults are documented in params and echoed in the output. Provide required JSON fields. Optional decimals use half-up once from raw IEEE values. Invalid types or ranges raise invalid_input. The calculator is free in the browser, deterministic, and identical in the API path. Inputs are validated before any arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE results when decimals are requested. Use the same JSON contract from spreadsheets, CMS hooks, automation, or teaching demos.
When to use it
The calculator is free in the browser, deterministic, and identical in the API path. Inputs are validated before any arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE results when decimals are requested. Use the same JSON contract from spreadsheets, CMS hooks, automation, or teaching demos.
Integration use cases
Quick check
Use the free widget to verify a formula before production.
Automation
Call the API with the same JSON contract from scripts or CMS.
Teaching
Show pinned golden examples without proprietary software.
Technical questions
Is the browser widget free?
Yes. Tier A is free client-side with the same core as the API.
Does it use the network?
No. Computation is local and deterministic.
What on bad input?
invalid_input is thrown; failed jobs are not billed.
API compatible?
Yes — same JSON fields as params.json.