DTI calculator
Monthly debt payments of 2,000 against a gross monthly income of 5,000 give a debt-to-income ratio of 40%, the figure lenders read before approving a loan. Enter both monthly totals in the same currency. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Monthly debt payments
- 2,000
- Gross monthly income
- 5,000
- Dti percent
- 40
The debt-to-income ratio, or DTI, is the share of gross monthly income already committed to recurring debt payments. Lenders, mortgage underwriters, and credit desks read that single percentage before they price a loan, size a housing payment, or decide whether an application sits inside a program cap. This DTI calculator takes two numbers in the same currency — total monthly debt payments and gross monthly income — divides them, multiplies by one hundred, and returns the ratio as a percentage with the formula shown beside the result.
How debt-to-income turns monthly payments and gross pay into one percent
The debt-to-income ratio of a household is total monthly debt payments divided by gross monthly income, then scaled to a percent. Total monthly debt payments is the sum of the recurring contractual payments a lender will count on a file: first-mortgage principal and interest, property tax and insurance when they are escrowed, a second lien or HELOC payment, auto notes, student-loan installments, minimum credit-card payments, personal-loan payments, and court-ordered support.
Gross monthly income is the paycheck before tax, retirement, and benefit deductions — documented wages, self-employment draws, Social Security, alimony received, and other qualifying income that underwriting already accepts. Two thousand of monthly debt on five thousand of gross income is forty percent; one thousand eight hundred on six thousand is thirty percent; a borrower with no counted debt on four thousand of income is zero.
Zero debt is a legitimate outcome and returns a ratio of zero rather than an error: the file has no monthly obligations on the date you measured. What is not legitimate is zero or negative gross monthly income, because dividing by a non-positive paycheck does not produce a debt-to-income ratio. You supply both numbers in one currency and one month; the calculator divides them and rounds the percentage half-up to six decimal places so goldens compare byte-for-byte across runtimes.
This is a consumer debt-to-income percent from two cash-flow totals, not a debt-to-equity multiple, not a debt-service coverage ratio, not combined loan-to-value, and not a budget leftover.
What you can do with it
Mortgage pre-qualification before the pull
Divide counted monthly debt payments by documented gross monthly income into one DTI percent before you walk overlays, compensating factors, and the housing payment.
FAQ
How is the debt-to-income ratio calculated?
Two thousand over five thousand comes back as 40, not 0.4. The percent is rounded half-up to six decimal places.
Can monthly debt payments be zero, and what is counted as debt?
Zero counted debt prints a DTI of zero.
Is this front-end housing ratio or back-end total DTI?
This calculator divides the two numbers you send.
Should I use gross or take-home income?
Gross income: your pay before tax, retirement and benefit deductions, plus other income a lender accepts, such as self-employment draws or alimony received. Using take-home pay makes the ratio look higher than the one a lender will see.
What if I'm paid weekly or every two weeks?
Convert your pay to a monthly figure before entering it. The calculator does not turn weekly or biweekly pay into a monthly amount, so both numbers must already describe the same month.
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/dti \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"monthly_debt_payments":2000,"gross_monthly_income":5000}'const res = await fetch("https://api.kit.forhosting.com/fin/dti", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"monthly_debt_payments": 2000,
"gross_monthly_income": 5000
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/fin/dti",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"monthly_debt_payments": 2000,
"gross_monthly_income": 5000
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/fin/dti", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"monthly_debt_payments":2000,"gross_monthly_income":5000}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"monthly_debt_payments":2000,"gross_monthly_income":5000}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/fin/dti", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"monthly_debt_payments": 2000,
"gross_monthly_income": 5000
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "fin.dti",
"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
Gross monthly income that is zero, negative, or not a finite number is rejected with invalid_input and is not billed, because a non-positive paycheck cannot define a debt-to-income ratio.
How debt-to-income turns monthly payments and gross pay into one percent
The identity this calculator uses is dti_percent equals monthly_debt_payments divided by gross_monthly_income, times one hundred. This endpoint does not split a front-end housing ratio from a back-end total DTI, does not decide which debts a particular program will count, does not annualize weekly or biweekly pay, and does not convert currencies.
Input contract, response shape, and error behaviour
Zero debt payments are allowed: a file with no counted obligations against positive income produces a DTI of zero, which is the honest going-in result rather than a clamped percentage. Example: two thousand of monthly debt payments and five thousand of gross monthly income yield a debt-to-income ratio of forty. POST a JSON body with two required finite numbers. monthly_debt_payments is the sum of counted monthly obligations in one currency unit; aliases debt_payments, monthly_debt, total_monthly_debt, and total_debt_payments map to the same field so a worksheet can keep its column names. gross_monthly_income is pre-tax monthly income in that same currency; aliases monthly_income, income, gross_income, and gmi are accepted. Each numeric field may arrive as a JSON number or a numeric string. Missing fields, empty strings, and non-finite values fail with invalid_input naming the field. Negative monthly_debt_payments is also rejected, because a contractual payment cannot be less than zero. Those failures are not billed. On success the body echoes monthly_debt_payments and gross_monthly_income, then reports dti_percent as the rounded percentage, plus a formula string restating the identity. Pair the JSON with your own note for which debts and which income definition match the program you are testing — back-end total DTI, housing-only front-end, qualifying income after exclusions — because this endpoint divides the two numbers you send; it does not rebuild a 1003, strip utilities, or convert pay frequencies. Keep gross_monthly_income strictly positive, pin the rounded percent in tests, and you get a reproducible DTI for teasers, LMS plugins, and edge workers without standing up an underwriting engine of your own.
Where a debt-to-income calculator earns its keep
Mortgage originators use a DTI calculator to turn last month's counted payments and documented gross income into one comparable percent before they walk a pre-qualification, a program overlay, or a compensating-factor memo. Debt-to-income prices consumer cash-flow load in one percent. Failed validation does not consume balance. Housing counselors and nonprofit coaches re-run the same two fields when a client pays off a car note or a raise lands, then pin dti_percent in a session worksheet so every conversation starts from one number. Product and credit teams batch the JSON over application extracts to flag files whose stated DTI sits above a conventional, FHA, or internal cap without opening a full AUS. Keep gross_monthly_income strictly positive, pin the rounded percent in tests, and you get a reproducible debt-to-income ratio for landing pages, LMS plugins, and edge workers without standing up an underwriting engine of your own.
Integration use cases
Counseling after a payoff or a raise
Re-price a household when a car note clears or a raise lands: same calculator, new inputs, one shared dti_percent for the session worksheet.
Batch flags on application extracts
Run the JSON over stated payments and income so files above a conventional, FHA, or internal cap surface before a full automated underwrite.
Technical questions
What happens if gross monthly income is zero or negative?
The task fails with invalid_input. Debt-to-income is undefined when the paycheck is not positive, so gross_monthly_income (aliases monthly_income, income, gross_income, gmi) must be a finite number greater than zero. That failure is not billed.
What does the DTI calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.