Docs navigation
analyze_deal FREE
The core tool: a full underwrite of one property under one strategy. Returns the 0β100 deal score, the strategy's headline metrics (the same ones the REIzer analyzer screens show), stress-test scenarios with verdicts, break-even thresholds, and a shareable 30-day report_url.
| Argument | Description | |
|---|---|---|
strategy | required | One of ltr, str, brrr, multifamily, flip, newc. |
inputs | required | Deal inputs in camelCase engine keys. Minimum: price plus the income driver (see the strategy table below). Rates and percents are fractions β 0.0675, never 6.75. Omitted operating inputs get documented defaults, and the response lists them under assumptions.estimated_fields. |
analyze_deal({
"strategy": "ltr",
"inputs": { "price": 285000, "marketRent": 3100,
"downPct": 0.25, "rate": 0.0675, "term": 30,
"closing": 6000, "vacancyPct": 0.05,
"taxes": 3200, "insurance": 1500,
"mgmtPct": 0.08, "maintPct": 0.05, "capexPct": 0.05 }
}){
"score": 96, "verdict": "Strong",
"metrics": { "monthly_cash_flow": 636.85, "dscr": 1.4594,
"cap_rate": 0.0852, "cash_on_cash": 0.0989, β¦ },
"stress": [ 7 scenarios, each with a verdict ],
"thresholds": { "break_even_rent": 2282.47, "max_rate": 0.0878, β¦ },
"summary": "Strong (96/100). $637/mo cash flow, DSCR 1.46, β¦",
"report_url": "https://reizer.io/report.html?id=β¦"
}best_use FREE
One property, every angle. Send a superset of inputs; REIzer runs every strategy the property qualifies for and ranks them by score. Strategies missing their required inputs are listed under skipped with the reason.
| Argument | Description | |
|---|---|---|
inputs | required | One property's inputs across strategies β e.g. price, marketRent, adr + occupancy, rehabBudget, arv, units. |
"best_use": "ltr" "ranked": 1. ltr 91 Strong 2. str 77 Strong 3. brrr 29 Weak 4. flip 5 Weak "skipped": multifamily, newc (missing unit / land inputs)
solve_max_offer FREE
Works backwards: instead of "is this price good?", it answers "what's the most I can pay?" β a binary search over the real engine, not a rule-of-thumb formula. Each strategy has sensible default targets; override any of them.
| Argument | Description | |
|---|---|---|
strategy | required | Strategy to solve under. |
inputs | required | Deal inputs. price is optional β an asking price or ARV anchors the price-derived defaults (taxes, insurance, closing); with neither, those defaults follow each price the solver tests. |
targets | optional | Target overrides, e.g. {"monthlyCF": 400, "cocReturn": 0.08}. Rentals default to cash-on-cash β₯ 8%, DSCR β₯ 1.2, cash flow β₯ $0; flips to after-tax margin β₯ 10% and annualized ROI β₯ 15%; BRRRR adds capital recovery β₯ 80%. |
// same inputs as above, with targets { monthlyCF: 400, cocReturn: 0.08 } "mao": 303657 "binding_constraint": { "label": "cash-on-cash return", "target": 0.08 } "metrics_at_mao": { "monthlyCF": 546.10, "dscr": 1.3697, "cocReturn": 0.08 } "ceilings_per_target": { "cocReturn": 303657, "dscr": 346599, "monthlyCF": 333691 }
list_strategies FREE
Machine-readable discovery: every strategy with its required and optional inputs and their meanings. AI clients call this first when unsure what a strategy needs β no arguments.
pull_comps ACCOUNT
Needs a REIzer account: connect https://reizer.io/mcp/account and sign in, or send an API key header.
Real comparables from licensed data β the same feed as the in-app comps panel. Returns comparable sales (with a value estimate and range), rental comps (with a rent estimate), and ZIP-level market stats. Counts against the account's monthly property-comp allowance.
| Argument | Description | |
|---|---|---|
street | required | Street address incl. house number, e.g. "812 7th St SE". |
city | required | City name. |
state | required | Two-letter state, e.g. "TX". |
zip | optional | ZIP code β disambiguates the address when a street name repeats in a metro. |
saleCount | optional | Comparable sales to return (default 10). |
rentCount | optional | Rental comps to return (default 10). |
{
"sales": { "value", "valueRange": {low, high}, "medianPrice", "medianPpsf",
"rows": [ {address, beds, baths, sqft, yearBuilt, price,
pricePerSqft, saleDate, distanceMi, β¦} ] },
"rentals": { "rent", "rentRange", "medianRent", "rows": [ β¦ ] },
"market": { "zip", "saleMedianPrice", "saleMedianDom", "saleYoyChange",
"rentMedianPrice", "rentYoyChange", "saleHistory", β¦ }
}str_market_data ACCOUNT
Short-term-rental market performance for a property: nearby STR listings with ADR, occupancy, and revenue quartiles. Give the US address β REIzer places it on the map itself, and says so if it could only match the ZIP code. Coordinates work too if your AI already has them. Counts against the monthly STR-comp allowance; an address that can't be placed uses none.
| Argument | Description | |
|---|---|---|
address | one of | Full US address in one line, e.g. "812 7th St SE, Minneapolis, MN 55414". |
street, city, state, zip | one of | The same address in parts. A ZIP on its own searches around the ZIP's centre (approximate). |
latitude, longitude | one of | Only if your AI already has coordinates. |
bedrooms | optional | Bedrooms filter (default 2). |
baths | optional | Bathrooms filter. |
guests | optional | Guest-capacity filter. |
my_deals SIGNED IN
Your saved deals β the same list as My Deals on reizer.io and in the REIzer app β newest first, with each deal's id, strategy, address, last score, headline metric and a link that opens it in the analyzer. Only on the signed-in connector (https://reizer.io/mcp/account); it only ever sees the signed-in account's deals.
| Argument | Description | |
|---|---|---|
strategy | optional | Only deals of one strategy: ltr, str, brrr, multifamily, flip or newc. |
query | optional | Text to match in the deal name or address. |
limit | optional | How many to return (default 10, max 25). |
get_my_deal SIGNED IN
One saved deal by id: its full inputs and the metrics saved with it. The inputs use analyze_deal's keys, so your AI can re-run the deal with a different rate, rent or price and compare.
| Argument | Description | |
|---|---|---|
id | required | The deal id from my_deals. |
save_deal SIGNED IN
Saves a deal to My Deals. It runs the same analysis as analyze_deal and stores the inputs with the score, so the deal opens in the REIzer analyzer on the web and in the phone app exactly as if you had saved it there. Counts against the account's monthly saved-deal allowance.
| Argument | Description | |
|---|---|---|
strategy | required | ltr, str, brrr, multifamily, flip or newc. |
inputs | required | Same keys and units as analyze_deal (rates and percents as fractions). |
name | optional | A name for the deal; defaults to the street address. |
address | optional | Property address, e.g. "812 7th St SE, Minneapolis, MN 55414". |
Money-field units
Same dollars periods as the REST API β send these to analyze_deal / best_use / solve_max_offer:
| Field | Unit | Notes |
|---|---|---|
marketRent, ltrRent | $/mo | Gross monthly rent |
hoa | $/mo | All strategies, including STR |
utilities | $/mo | Owner-paid utilities |
taxes, insurance | $/yr | Annual totals |
reserves | $/yr | Flat annual reserve (not CapEx %) |
Changelog (2026-08-16): hoa is monthly on every strategy, including STR (previously STR behaved as annual in the engine). Rates stay fractions (0.0675). API version remains v1.
Strategy input cheat-sheet
What analyze_deal minimally needs per strategy (everything else defaults, labeled in the response):
| Strategy | Required inputs | Analyzes |
|---|---|---|
ltr | price, marketRent | Long-term rental: cash flow, DSCR, cap rate, 10-yr projection |
str | price, adr, occupancy | Short-term rental: revenue, break-even occupancy, levers |
brrr | price, rehabBudget, marketRent, arv | BRRRR: refi scenarios, capital recovery, post-refi cash flow |
multifamily | price, units | Rent-roll driven: NOI, value-add lift, per-unit economics |
flip | price, rehabBudget, arv | Fix-n-flip: after-tax profit, 70% rule, break-even sale |
newc | landPrice, livingSqft, buildPsf, btsArv | New construction: build-to-sell vs build-to-rent head-to-head |