For agents & developers

Underwriting API

The same multifamily math behind our free calculators, available as JSON. No API key, no account, no rate-limit tier. Every endpoint is a pure function of its query string — same input, same answer, no state stored.

Base URL

https://keptdo.com/api/v1

Machine-readable description: /openapi.json (OpenAPI 3.1) · Catalog: /.well-known/api-catalog

Endpoints

All endpoints accept GET and return JSON. Percentages are passed as percents, so 6.5 means 6.5%.

GET/noiRequired: capRate, price

Net operating income from a cap rate and price.

/api/v1/noi?capRate=6.5&price=8000000
GET/cap-rateRequired: noi, price

Cap rate from NOI and price, plus price per unit.

/api/v1/cap-rate?noi=570000&price=8000000&units=100
GET/loan-paymentRequired: principal, rate

Monthly payment, annual debt service, and total interest.

/api/v1/loan-payment?principal=1000000&rate=6.5&years=30
GET/amortizationRequired: principal, rate

Year-by-year payoff schedule, with optional extra payment.

/api/v1/amortization?principal=1000000&rate=6.5&extraMonthly=500
GET/irrRequired: cashflows

Internal rate of return for a cash flow series.

/api/v1/irr?cashflows=-1000000,80000,85000,90000,1400000
GET/napkinRequired: grossRent, capRate

Full deal screen: NOI, value, DSCR, cash-on-cash, IRR, equity multiple.

/api/v1/napkin?grossRent=1200000&capRate=6.5&units=100
GET/roiRequired: dealsPerYear

Analyst hours and dollars saved versus a manual underwrite.

/api/v1/roi?dealsPerYear=30&hourlyRate=150
GET/healthRequired:

Service status.

/api/v1/health

Response shape

Every calculation echoes the inputs it used, so a result is self-describing even when defaults filled in the gaps.

{
  "inputs":  { "capRate": 6.5, "price": 8000000 },
  "result":  { "noi": 520000, "noiMonthly": 43333.33 },
  "formula": "NOI = cap rate × purchase price",
  "disclaimer": "Quick screen only — not investment, tax, or legal advice."
}

A value that cannot be computed — a cap rate with no price, an IRR that cannot be bracketed — comes back as null rather than zero, so it is never mistaken for a real answer.

Errors

A missing, non-numeric, or out-of-range parameter returns 400 with a message naming the field at fault.

{
  "error": "bad_request",
  "message": "Missing required parameter \"capRate\"."
}

Using this from an agent

We publish a skill describing how to screen a deal with these endpoints, including how to read the output and which assumptions to disclose.

Skills index: /.well-known/agent-skills/index.json

Skill: multifamily-napkin-underwriting

Pages on this site also return markdown to clients that send Accept: text/markdown.

Limits and honesty

These are screens, not investment advice. The napkin model assumes a level fixed-rate loan, operating expenses held at the entered ratio, NOI growing at the entered rate, and a sale priced on forward-year NOI at the exit cap rate. It excludes capital expenditures, income taxes, and reserves — so a heavy value-add deal will look better here than it will in reality.

There is no authentication because there is nothing to protect: no data is stored and no account exists. Please be reasonable with request volume. If you need something this API does not cover, email mdelval@delvalinvestmentgroup.com.

For a full underwrite — normalized T-12, rent roll analysis, scenario modeling, market comps, and LP-ready output — see the Multifamily Deal Analyzer Pro.