The headline number is the median asking rent on everything currently listed. The number under it — the median on listings posted in the last four weeks — is usually lower, and it is the more useful one: whatever is still sitting on the market after months is still sitting there for a reason. How this is measured.
People do not shop “San Juan” — they shop Santurce, or Condado, or Hato Rey, and the gap between them is larger than any month-to-month move. Each district is priced, supplied and cleared separately below, then broken down into the named neighborhoods inside it.
“Pulled” means a person took the listing down, which is the closest observable thing to renting it. Ads that simply timed out are counted separately and are not included here — see how fast it moves.
| Neighborhood | District | Asking now | Typical range | Per bedroom | Listings since Mar | Live now | Pulled in 30d |
|---|
Bedroom count explains more of the price than anything except location. Studios are pulled out of the one-bedroom pile where the ad text says so, because the source site has no studio category and files them all as one-bedrooms.
Read the bar, not the dot. The dot is the measured gap; the bar is the range the gap could plausibly be given how many listings it rests on. A bar that crosses the zero line means the difference is within what splitting this many apartments would produce by chance, whatever the dot says. The darker bar compares like for like — same district, same bedroom count — because buildings with a pool are also the buildings with three-bedroom units and they are in Condado rather than Río Piedras, so without that adjustment the pool is charging for the extra bedroom and the postcode. Hover a row to see which comparison it got. Neither bar makes this a price tag: it is what listings with the feature ask, not what the feature is worth.
| Feature | Says yes | Says no | Does not say | Of those who say | Of all listings |
|---|
Three answers, not two. Most ads simply never mention parking, and counting that silence as a “no” would be inventing data — so the last two columns give both readings: the share among ads that addressed it, and the share of the whole market.
A listing can leave the market two ways, and they mean opposite things. Somebody can take it down — which usually means it rented — or it can hit the source site’s 27-day expiry clock and vanish on its own. Both are tracked here separately, because a market where ads expire is not a market where apartments rent.
Zero is the whole market. A segment sitting to the right gets taken down faster than average, to the left slower — and the bar is again the range, so only a bar clear of the zero line is a difference worth acting on. “Taken down” excludes listings that simply hit the site’s expiry clock, which is why a segment full of ads nobody touched cannot show up here as a segment that cleared.
| Advertised | Listings | Median rent | Taken down by day 30 | Without it | Gap |
|---|
| Day | Still up | Listings old enough | Share |
|---|
No model at all: a unit either was or was not still up on day N. Listings too young to have reached day N are left out rather than counted as gone.
Every price change is recorded, so this is not a survey of what landlords say they would accept — it is what they have already done, in public, on their own listing. Two numbers matter and they behave differently: how often an asking price gets cut, which varies enormously by segment, and how deep the cut goes when it happens, which barely varies at all. The section closes inside single buildings, which are the only comparables that really compare: same lobby, same view, same commute, so the difference left over is the price.
Find the column for what you are looking at and read down to how long it has been listed. Every listing in a cell had been up at least that long — not exactly that long — because grouping by final lifespan would count only the listings that came down inside the window, and load every cell with the ones that ended there. The second figure is the cut rate multiplied by the typical depth: what an offer at asking is worth giving up on average, across everyone in that cell, including the majority who never moved a dollar.
| Segment | Listings | Have cut | 95% range | Typical cut | In dollars | Expected off asking |
|---|
| Building | District | Live now | Asking now | vs same size nearby | Have cut | Sitting firm |
|---|
Measured on newly posted listings only. Tracking the price of everything currently listed sounds more complete but is not: expensive apartments sit longer, so they pile up in the standing inventory and drag its median around for reasons that have nothing to do with the market. New listings are a clean weekly sample of what landlords are asking today.
Everything above rests on choices about what to count and what to throw away. They are stated here in full, including the ones that cost us data.
Source ads expire after about 27 days whether or not the apartment rented, so landlords repost. Ads sharing a phone number, price, bedroom count and district — or an identical description — that never overlap in time and reappear within 21 days are treated as one apartment relisted. Ads that do overlap are kept apart: that is a landlord marketing several similar apartments at once, not one apartment posted twice. Every count on this page is a count of apartments.
When a listing disappears, the ad’s own page is re-fetched to find out why. A page that redirects away has been taken down deliberately; a page showing an expiry notice timed out on its own. That distinction is measured for a growing share of closed listings and inferred from the timing of the 27-day cliff for the rest. Because expiry removes a listing from the site entirely, it cannot be treated as a listing we merely stopped watching — the two outcomes are estimated together, which is why section 03 reports shares by day rather than a single “average days to rent”.
The price band being collected widened partway through, and rents before that change are medians of a narrower slice of the market by construction. Comparing across that date would show a jump that never happened, so everything here starts at the change instead.
A panel that starts empty fills up over one full time-on-market cycle, and expensive units linger while cheap ones turn over, so the standing inventory takes months to settle. Reading the trend off standing inventory produced an apparent citywide decline of roughly 20% — and an apparent 33% collapse in Santurce — entirely from the sample filling in. Measured on new listings, which is an independent sample every week, asking rents have been approximately flat. Both readings are exported; the page draws the second.
Where the bedroom field is blank but the description states the count in Spanish or English, the count is read from the text. Where the ad describes a studio or efficiency, it is counted as a studio even though the site filed it as a one-bedroom. Rent-per-bedroom treats a studio as one sleeping space rather than zero, since dividing by zero would drop the cheapest segment off the chart entirely.
The first day of collection captures apartments that had already been listed for an unknown length of time. Their measured age is not their real age, so they take no part in any duration or trend figure while still counting toward inventory.
Collection targets a price band, and every figure on this page is computed inside it. A few listings above the ceiling arrive anyway, because the source site’s own price filter leaks on featured placements.
Feature flags reflect what an ad says, parsed with attention to negation and scope (“includes water, does not include electricity” is read as two different answers). Nothing here is verified against the property.
Collected from publicly available listings by automated extraction. The dataset is a series of snapshots and may not reflect the current state of any listing. Coverage may be uneven across districts, periods and listing types. Results are analytical estimates, not listing verification, and nothing here is an appraisal or an offer.