Investment analysis
Run full investment underwriting against any of our 2.1M+ UK properties, or in standalone mode with your own numbers. Covers buy-to-let metrics (yield, cash flow, ROI, payback), four specialist strategy calculators (HMO, BRRR, Flip, Serviced Accommodation), side-by-side strategy comparison, stamp duty across all three UK tax systems, and a saved-calculations store. Rental estimates are derived from our market data tables (refreshed continuously from live listings) when you don’t supply rent yourself. Required scope:investment:read
Cost: 1 request per call
Available on: Starter, Professional, Business
Calculate investment metrics for a property
Body parameters
| Param | Type | Required | Description |
|---|---|---|---|
purchase_price | float | No | Override price (defaults to the property’s listing price) |
deposit_percentage | float | No | Deposit % (5–100, default 25) |
mortgage_rate | float | No | Annual interest rate % (0–20, default 5.5) |
mortgage_term_years | integer | No | Term in years (1–40, default 25) |
monthly_rent | float | No | Expected monthly rent (estimated from market data if omitted) |
is_additional_property | boolean | No | Affects stamp duty surcharge (default true) |
refurbishment_costs | float | No | Refurbishment budget (default 0) |
other_costs | float | No | Any other acquisition costs (default 0) |
ground_rent_annual | float | No | Annual ground rent (default 0) |
service_charge_annual | float | No | Annual service charge (default 0) |
Request
Response
cached is true the payload also includes cache_hit_time_ms instead of calculation_time_ms.
Strategy calculators (HMO / BRRR / Flip / SA)
Four specialist calculators share the same pattern: a property-specific variant that loads the listing price from our database, and astandalone variant where you supply the purchase price yourself.
| Strategy | Key body params | Headline response fields |
|---|---|---|
| HMO | rooms[] (min 3, each {room_type, monthly_rent}), occupancy_rate, utilities_monthly, cleaning_monthly, hmo_license_cost, management_fee_percentage | metrics.gross_yield_percentage, net_yield_percentage, monthly_cashflow, roi_percentage, total_room_rent, average_rent_per_room, plus compliance_notes[] |
| BRRR | refurbishment_costs (itemised dict), after_repair_value (must exceed purchase price), refinance_ltv, bridge_ltv, bridge_finance_rate, bridge_finance_months, monthly_rent | metrics.cash_left_in_deal, equity_released, refinance_amount, roce_percentage, capital_efficiency_percentage, bridge_finance_cost |
| Flip | purchase_price (required), renovation_costs (itemised dict), expected_sale_price, holding_period_months, bridge_finance_rate, agent_fee_percentage, location (standalone) | metrics.net_profit, profit_on_cost_percentage, annualized_return_percentage, total_costs, stamp_duty, tax_system_name (SDLT/LBTT/LTT), plus tax_notes[] |
| SA | nightly_rate, occupancy_rate, platform_fee_percentage, cleaning_cost_per_booking, average_stay_nights, optional seasonal model (use_seasonal_model + peak/shoulder/offpeak_occupancy) | metrics.revpan, occupancy_adjusted_revenue, bookings_per_year, net_revenue, plus comparison_with_btl and licensing_notes[] |
deposit_percentage, mortgage_rate, mortgage_term_years, interest_only) and an optional sourcing_fee. Validation errors (e.g. BRRR after_repair_value not exceeding purchase price) return 400; an unknown property_id returns 404.
Request (HMO example)
Response (HMO, abridged)
{success, metrics, warnings, calculated_at} envelope with the strategy-specific metrics fields from the table above (Flip adds tax_notes[], SA adds comparison_with_btl and licensing_notes[]). Numeric metrics are serialised as decimal strings.
Compare strategies
Body parameters
| Param | Type | Required | Description |
|---|---|---|---|
strategies | string[] | Yes | 2–5 of BTL, HMO, BRRR, FLIP, SA |
hmo_params | object | Conditional | Required when HMO is selected (HMO body, see above) |
brrr_params | object | Conditional | Required when BRRR is selected |
flip_params | object | Conditional | Required when FLIP is selected |
sa_params | object | Conditional | Required when SA is selected |
Request
Response
Stamp duty
Body parameters
| Param | Type | Required | Description |
|---|---|---|---|
price | float | Yes | Property purchase price (must be > 0) |
is_additional_property | boolean | No | Apply the additional-property surcharge (default true) |
Request
Response
Quick investment estimate
Query parameters
| Param | Type | Required | Description |
|---|---|---|---|
price | integer | Yes | Property price (> 0) |
bedrooms | integer | Yes | Number of bedrooms (1–10) |
area | string | Yes | Area name (echoed back in the response) |
Request
Response
estimate is returned (purchase_price, estimated_monthly_rent, estimated_gross_yield, area, bedrooms) with a note explaining it’s a rough estimate.
Mortgage calculator
Query parameters
| Param | Type | Required | Description |
|---|---|---|---|
loan_amount | float | Yes | Loan amount (> 0) |
interest_rate | float | Yes | Annual interest rate % (0–20) |
term_years | integer | Yes | Loan term in years (1–40) |
Request
Response
Find high-yield properties
Query parameters
| Param | Type | Required | Description |
|---|---|---|---|
min_yield | float | No | Minimum gross yield % (0–20, default 6.0) |
max_price | integer | No | Maximum property price |
limit | integer | No | Max results (1–100, default 20) |
Request
Response
ROI scenarios
/calculate/{property_id}. Cached for 2 hours.
Request
Response
Calculations (saved calculations)
CRUD store for persisting calculator runs against your account — useful for keeping underwriting alongside a property and re-importing it later.Save — body parameters
| Param | Type | Required | Description |
|---|---|---|---|
calculator_type | string | Yes | One of rental-yield, mortgage, stamp-duty, roi, cashflow, btl, hmo, brrr, flip, sa |
name | string | Yes | Calculation name (1–100 chars) |
inputs | object | Yes | The inputs you ran the calculation with (free-form) |
outputs | object | Yes | The calculated outputs (free-form) |
notes | string | No | Optional notes (max 1,000 chars) |
property_id | string | No | Property ID to link the calculation to |
List — query parameters
| Param | Type | Required | Description |
|---|---|---|---|
property_id | string | No | Filter to calculations linked to a property |
calculator_type | string | No | Filter by calculator type |
limit | integer | No | Max results (default 50, cap 100) |
offset | integer | No | Pagination offset (default 0) |
Request
Response (save / get)
{"calculations": [...], "total": 20}. DELETE returns {"success": true, "message": "Calculation deleted"}. All saved-calculation endpoints are scoped to the authenticated key’s account — requesting another account’s calculation returns 404.
Related endpoints
- Properties — Search and retrieve the property records these calculators run against
- Market data — Sold history, comparables, and rental market data feeding the estimates
- Area aggregates — Area-level yields, rents and agent stats for screening