Skip to content

Quickstart

Base URL: https://api.plantedmoney.ai. Reads need no key in the public beta; the limit is 30 calls/min per IP (auth). Full schema: /api/openapi.json.

Terminal window
curl https://api.plantedmoney.ai/api/health

Returns ok plus binding checks (d1, kv), last_run (kind, finished, found, new_count), active_listings, and stale_model_rows (rows scored by an older model version). Listings refresh daily at 13:00 UTC; if last_run is older than ~24 h, the run failed.

Terminal window
curl https://api.plantedmoney.ai/api/tracts/chicago

Returns {vintage, count, tracts[]} — 1,492 Cook + Lake census tracts with every metric behind the map: flip/BRRRR scores, effective tax, reassessment shock, Section-8 gap, and the rest (data sources has definitions and vintages). Cached 1 h.

Terminal window
curl https://api.plantedmoney.ai/api/listings/chicago

Up to 200 active listings, deduped by address — from the licensed RentCast feed plus an interim unofficial Redfin feed (attributions); licensed MLS access is planned. deal_score: null means unscored (no valuation basis) — never a fake 0. Valuation, investor-target and motivation fields may be null when their evidence gates do not pass; each row carries model_version and reason/provenance fields.

Terminal window
curl "https://api.plantedmoney.ai/api/underwrite?lat=41.9243&lon=-87.7169&price=500000&units=2"

That is a Logan Square 2-flat at $500k. The response is one valuation object:

  • tract — geoid, muni, flip/BRRRR scores, effective tax, SAFMR 2BR, reassessment status
  • arv_source"real comps (N sales, conf C)" when live comps clear the gates (similarity ≥ 0.45, ≥ 4 comps, dispersion ≤ 45%, confidence ≥ 55), else "tract heuristic"
  • comp_arv — base/conservative/aggressive plus the comps used; absent when the gates refuse
  • risk — separate 0–100 score, band, and flags with reasons
  • underwrite — ARV, both offers, DSCR, economics_factor, and the full assumptions block
  • read — a one-sentence verdict

This exact point is the audit probe that returned ARV $1.37M before the 2026-07 comp guards; today a mixed-condition comp set gets refused (“insufficient comps”) instead of averaged. Every response also carries the disclosure verbatim:

Automated valuation model — not an appraisal. ARV = renovated-comp evidence (Tier 1), a neighborhood-premium estimate (Tier 2), or suppressed (Tier 3) — the method + confidence + range are on every response. value_as_is is the dated/distressed stratum (never blended into ARV). Four strategy scores (flip/BRRRR/hold/house-hack) are hard-gated against their own economics (INV-4) then ranked to a per-strategy inventory percentile; tract scores are location context only. Not for tenant screening or credit decisions (FCRA).

Per-segment error and suppression rates are published at /api/metrics/scorecard.

The same engine is exposed as six tools for Claude or any MCP client — connect via MCP.

Every contract behind this page ships as JSON, generated from the same source the engine runs — point tooling at these instead of scraping the prose:

The public app’s optional analytics endpoint is intentionally not a general event API. It accepts only explicit analytics-v1 consent, a closed coarse taxonomy, and a short tab session; DNT/GPC opt out before parsing. Operator-only beta funnel aggregates are available at GET /api/admin/analytics?days=14 with WRITE_SECRET.

Deprecation policy. Renamed fields and tools keep working under their old name — the MCP v2 rename (search_deals, underwrite, compssearch_investment_inventory, deep_underwrite_asset, get_comps) shipped its old names as aliases, not breaking changes. Removal is never silent: it ships with a changelog entry and at least 90 days’ notice after that entry, never before.