From leasing websites to rental data you can compare.
I built a system that collects floor-plan prices and advertised concessions from community websites. It keeps asking rents, rents after concessions and collection dates together, giving me a consistent basis for rental comparisons and underwriting assumptions.
For AI and data professionals
- Collect advertised prices.
Python readers collect floor plans, rents and advertised availability from leasing websites, with a language model as fallback. Published unit prices remain distinct from ranges.
- Standardize rents and concessions.
Supported free-rent offers become weeks for a standard 52-week net-effective comparison. Original offer text is retained; dollar credits are recorded separately and excluded from that calculation.
- Validate and track freshness.
Checks look for missing fields, implausible rents, duplicates and stale observations against each market’s schedule. Collection dates and extraction failures remain visible for review.
- Supply comps and market summaries.
Dated snapshots feed dashboards, market summaries, underwriting comps and read-only MCP tools for AI assistants. I review the pricing basis and offer terms before relying on a comp.
For real estate professionals
- Find comparable communities.
Tracked build-for-rent and apartment communities provide a starting set, compared by product, bedroom count and size. Published unit prices are distinguished from starting rents and ranges.
- Compare asking and net-effective rents.
Asking rents appear alongside the effect of recorded free-rent offers, spread over a standard twelve-month comparison. Actual lease terms, eligibility, fees and dollar credits need separate review.
- Assess availability and market context.
Listed units, move-in dates and market summaries put prices in context. These are advertised offers, not signed leases or a complete vacancy measure; coverage and collection dates affect the comparison.
- Set underwriting assumptions.
Comps average the lowest five observed rents in a group, or all when fewer exist; range-only prices use the minimum. I confirm comparability and material offer terms before setting the rent assumption.
Four rent methods sit on the same MCP server as the supply and demand tools —
rent_market_summary, rent_comps_near, rent_community_lookup,
rent_coverage — so a rent question can be chained with what is being built nearby.
The chat box, the full tool table and connect instructions are on the
Connectors tab.
Headline totals were measured on September 30, 2026. Historical rent records count priced floor-plan groups from successful collections; repeated observations over time count separately, not as unique apartments. The dashboard below uses its own dated snapshot.
- 16,843communities tracked
- 4.66Munits under coverage
- 22metros
- 66,124live floor plans
- 32,460currently under concession
- 25,801observations, last 30 days
Refreshed from the live database on October 6, 2026.
The expensive way to do this is to point a language model at every leasing page and pay for the reading. The cheap way is to notice that most communities do not have a bespoke website — they run on a leasing platform, and each platform serves its floor plans from an endpoint that returns the same shape every time. So the pipeline tries 19 deterministic adapters first, one per platform, and only falls through to the model when a site is genuinely bespoke. That tail is about 29% of runs — 13,456 reads over the last two months — and it goes out as one overnight batch at half price rather than one request at a time.
The adapters are also the accuracy story, not just the cost one. An adapter reading a JSON endpoint either returns the floor plan or fails loudly; it cannot hallucinate a two-bedroom. The model only ever sees the sites where there was nothing structured to read, and its output goes through the same validation every adapter's does.
Successful reads by engine over the last 60 days. Every row except the LLM one is a platform adapter; the LLM row names each model that ran in the window.
Markets do not all run weekly. A metro's cadence is a column in a rotation table — weekly, fortnightly, or monthly — and every staleness check derives its window from that same column, so a fortnightly market cannot be reported stale for being fortnightly. Daily assertions check the things that would otherwise rot quietly: coverage rates per market, snapshot freshness, geocode gaps, duplicate communities arriving under two names.
Two different numbers, and conflating them is the easiest way to overstate a database like this. Tracked means the community is in the universe with a confirmed leasing URL. Live plans means the last scrape actually came back with floor plans and rents. A metro seeded last month has the first number and is still working on the second — Dallas–Fort Worth is mid-first-pass as I write this, which is why its two columns are so far apart.
| Metro | Tracked | Units | BFR | Live plans | Median ask | $/sf | Concession | Last read |
|---|---|---|---|---|---|---|---|---|
| DFW Dallas–Fort Worth, TX | 2,700 | 816,916 | 135 | 10,506 | $1,561 | $1.74 | 52% | Oct 5 |
| HOU Houston, TX | 2,249 | 638,254 | 69 | 9,596 | $1,383 | $1.50 | 40% | Oct 5 |
| ATL Atlanta, GA | 1,791 | 490,124 | 122 | 7,110 | $1,674 | $1.67 | 43% | Oct 5 |
| LAX Los Angeles / Orange County, CA | 1,538 | 399,635 | — | 4,520 | $2,858 | $3.47 | 35% | Sep 30 |
| PHX Phoenix, AZ | 1,446 | 367,192 | 179 | 5,517 | $1,590 | $1.77 | 53% | Oct 5 |
| AUS Austin, TX | 1,240 | 344,735 | 54 | 5,408 | $1,495 | $1.67 | 59% | Oct 6 |
| CLT Charlotte, NC | 917 | 234,821 | 72 | 4,186 | $1,586 | $1.69 | 61% | Sep 30 |
| DEN Denver, CO | 827 | 246,029 | — | 3,296 | $1,925 | $2.19 | 68% | Sep 30 |
| MCO Orlando, FL | 795 | 241,993 | 31 | 2,972 | $1,786 | $1.85 | 46% | Sep 30 |
| TPA Tampa, FL | 779 | 219,863 | 53 | 3,129 | $1,805 | $1.89 | 50% | Oct 5 |
| NSH Nashville, TN | 695 | 174,838 | 47 | 2,694 | $1,649 | $1.82 | 48% | Oct 5 |
| LAS Las Vegas, NV | 594 | 163,573 | 22 | 2,050 | $1,505 | $1.61 | 52% | Oct 5 |
| RDU Raleigh–Durham, NC | 523 | 135,071 | 29 | 2,305 | $1,547 | $1.59 | 46% | Sep 27 |
| JAX Jacksonville, FL | 391 | 109,537 | 34 | 1,416 | $1,569 | $1.54 | 43% | Sep 28 |
| HSV Huntsville, AL | 165 | 41,653 | 22 | 710 | $1,246 | $1.32 | 49% | Sep 26 |
| SRQ Sarasota, FL | 96 | 22,943 | 20 | 411 | $1,941 | $1.91 | 62% | Oct 2 |
| SAT San Antonio, TX | 39 | 7,033 | 39 | 134 | $1,949 | $1.36 | 84% | Oct 1 |
| TYS Knoxville, TN | 14 | 2,268 | 10 | 39 | $2,200 | $1.58 | 31% | Oct 2 |
| CHA Chattanooga, TN | 13 | 1,261 | 12 | 33 | $1,793 | $1.40 | 18% | Sep 26 |
| CHI Chicago, IL | 11 | 2,626 | 3 | 42 | $2,377 | $2.20 | 12% | Sep 26 |
| GSP Greenville, SC | 11 | 1,579 | 11 | 28 | $2,120 | $1.08 | 54% | Oct 2 |
| SAV Savannah, GA | 9 | 1,492 | 9 | 22 | $2,045 | $1.21 | 32% | Sep 25 |
Greyed rents are computed over fewer than 400 live floor plans — a metro part-way through its first pass, where the median is a handful of communities rather than a market. They will settle as the first pass completes.
By vintage
The unknown bar is almost entirely build-for-rent. A garden apartment's leasing page states its year built; a new single-family rental community usually does not, because it is still delivering.
By unit type
| Plan | Plans | Median rent | Median sf | $/sf |
|---|---|---|---|---|
| Studio | 4,168 | $1,414 | 553 | $2.55 |
| 1 bed | 25,637 | $1,410 | 746 | $1.89 |
| 2 bed | 25,658 | $1,758 | 1,098 | $1.60 |
| 3 bed | 9,497 | $2,168 | 1,390 | $1.54 |
| 4 bed | 943 | $2,503 | 1,900 | $1.28 |
| 5 bed | 126 | $2,724 | 2,496 | $1.12 |
Rent per square foot falls as plans get bigger, which is the pattern you want to see — it is the cheapest sanity check that the extraction is reading plans correctly rather than mixing up columns.
By product
| Product | Structure | Communities | Plans | Median rent | Median sf |
|---|---|---|---|---|---|
| Multifamily | — | 8,859 | 47,473 | $1,625 | 960 |
| Multifamily | MF | 3,587 | 15,149 | $1,563 | 905 |
| Build-for-rent | — | 662 | 2,286 | $2,246 | 1,504 |
| Multifamily | TH | 306 | 553 | $1,976 | 1,269 |
| Build-for-rent | SFD | 71 | 226 | $2,275 | 1,753 |
| Build-for-rent | TH | 87 | 220 | $2,199 | 1,541 |
| Build-for-rent | MF | 80 | 201 | $2,054 | 1,317 |
Product comes off the community record, not off the model's read of the page. The model's own structure guess is kept in a separate column and shown here beside it, because on a few hundred rows the two disagree and I would rather that be visible than quietly reconciled.
A rent comp that ignores concessions is the most common way a rent assumption goes wrong, and it is wrong in the direction that makes a deal look better. Six weeks free on a twelve-month lease is not a marketing flourish; it is an eleven percent haircut to the rent you will actually collect. So the scraper reads the concession banner as well as the plan grid, parses it into weeks, and stores an asking rent and a net-effective rent side by side. 32,460 of 66,124 live plans are carrying one right now.
The spread between those two numbers is the part you cannot get from a listings site, and it varies enormously by metro. That variation is the whole point: in the metro at the top of this list, seven in ten communities are buying occupancy, and that is telling you something a median asking rent never will.
Share of live floor plans advertising a concession, and the average discount to asking rent where one is being given. Metros with at least 400 live plans.
Here is the honest limit of this thing. Fleet-wide collection only reached full coverage in August, so there is no rent index here and I am not going to draw one. What the history can support is direction of travel: of the 7,481 communities seen at least twice, at least two weeks apart, over an average gap of 40 days, 47% cut a plan rent and 42% raised one. Ask me again in six months and this section becomes a chart.
Observations per week
Every week with reads in the last sixteen. The ramp is markets coming online, not a change in how often any one community is read. The final bar is the week in progress.
Where rents went
- Cut 3,549
- Unchanged 822
- Raised 3,110
Median plan rent at a community's first and last read in the window. 8,215 of 13,086 communities have been read more than once so far, averaging 4 reads each.
Counts are abstract, so here is what the rows actually look like — a stable random draw of up to 20 communities per metro, weighted to include the build-for-rent tail, which is small and is the part I care most about. Only communities that have been read and carry a priced floor plan are drawn. Average rent is the mean advertised asking rent across a community's floor plans at its last read, using the low end of each plan's range.
Unit counts come from public records: the county property record, a Florida apartment licence, or the City of Austin's building permits. Year built comes from the same records where one exists, otherwise from third-party market data. Hover a figure to see which. A dash in Units means no public record covers that community yet; build-for-rent homes sit on many separate lots and rarely have one.
| Community | Product | Units | Built | Avg rent | Last read |
|---|