[object Object]

← back to Rentv V1

fix(deals): correct city mis-assignment — shared parse-location.mjs prefers in-text asset cues over firm-HQ names (killed false 'Phoenix'), infers state for known cities; re-derived deals.json (23 fixed); repairs /pulse geography (Other $853M->$49M), /metros, /deals; future pulls use the fixed parser

cbaea83a952d45ccec5ea909da4a84e06128985a · 2026-07-23 17:51:19 -0700 · Steve

Files touched

Diff

commit cbaea83a952d45ccec5ea909da4a84e06128985a
Author: Steve <steve@designerwallcoverings.com>
Date:   Thu Jul 23 17:51:19 2026 -0700

    fix(deals): correct city mis-assignment — shared parse-location.mjs prefers in-text asset cues over firm-HQ names (killed false 'Phoenix'), infers state for known cities; re-derived deals.json (23 fixed); repairs /pulse geography (Other $853M->$49M), /metros, /deals; future pulls use the fixed parser
---
 data/deals.json                  | 578 +--------------------------------------
 data/markets.json                |   2 +-
 data/news.json                   |   2 +-
 data/ticker.json                 |   2 +-
 scripts/lib/parse-location.mjs   |  78 ++++++
 scripts/pull-deals.mjs           |  26 +-
 scripts/rederive-deal-cities.mjs |  29 ++
 tools/specs/geofix.json          |  23 ++
 8 files changed, 139 insertions(+), 601 deletions(-)

diff --git a/data/deals.json b/data/deals.json
index 82b2f51..c03842a 100644
--- a/data/deals.json
+++ b/data/deals.json
@@ -1,577 +1 @@
-{
- "source": "rentv.com — live deal listings",
- "fetched_at": "2026-07-23T04:07:13.798Z",
- "count": 30,
- "deals": [
-  {
-   "id": "34238",
-   "title": "Gilbert, AZ Multifamily Community Refinanced with New Loan for $51.8 Mil",
-   "url": "https://www.rentv.com/content/homepage/mainnews/news/34238",
-   "image": "/img/news/news_20296_4353EElliotRdGilbertAZDarcieGiacchettoJul212026.jpg",
-   "txn_type": "Financing",
-   "property_type": "Multifamily",
-   "city": "Gilbert",
-   "state": "AZ",
-   "amount": 51800000,
-   "amount_label": "$51.8M",
-   "size_label": "236 units · 986 SF",
-   "units": 236,
-   "sqft": 986,
-   "address": "4353 E. Elliot Rd.",
-   "occupancy_pct": 97,
-   "year_built": 2025,
-   "summary": "A joint venture between Phoenix Capital Management and P. B."
-  },
-  {
-   "id": "34236",
-   "title": "The Swig Company Obtains Refi on Office High-Rise in San Francisco’s Financial District",
-   "url": "https://www.rentv.com/content/homepage/mainnews/news/34236",
-   "image": "/img/news/news_20294_220MontgomeryStSFNancyAmaralA2N2Jul162026.jpg",
-   "txn_type": "Financing",
-   "property_type": "Office",
-   "city": "San Francisco",
-   "state": null,
-   "amount": 95000000,
-   "amount_label": "$95.0M",
-   "size_label": null,
-   "units": null,
-   "sqft": null,
-   "address": "220 Montgomery St",
-   "occupancy_pct": null,
-   "year_built": 1891,
-   "summary": "RENTV. com - Commercial real estate news and property information window."
-  },
-  {
-   "id": "34233",
-   "title": "Tailwind Investment Group Spends $65 Mil on Two Sacramento Res Properties",
-   "url": "https://www.rentv.com/content/homepage/mainnews/news/34233",
-   "image": "/img/news/news_20291_6633ValleyHiDrSacramentoDavidHulmeTailwindJul182026.jpg",
-   "txn_type": "Sale",
-   "property_type": "Multifamily",
-   "city": "Sacramento",
-   "state": null,
-   "amount": 65000000,
-   "amount_label": "$65.0M",
-   "size_label": "419 units",
-   "units": 419,
-   "sqft": null,
-   "address": "4350 Galbrath Dr",
-   "occupancy_pct": 94,
-   "year_built": null,
-   "summary": "Tailwind Investment Group has acquired two multifamily properties totaling 419 units in Sacramento for a combined price of $65 mil.  The properties include Bent Tree Apartments (208 units) and California Place Apartments (211 units)."
-  },
-  {
-   "id": "34239",
-   "title": "Fresno Multifamily Sale Works Out to $177k per Unit",
-   "url": "https://www.rentv.com/content/homepage/mainnews/news/34239",
-   "image": "/img/news/news_20297_585WestSierraAveFresnoDaveEbelingJul212026.jpg",
-   "txn_type": "Sale",
-   "property_type": "Multifamily",
-   "city": "Fresno",
-   "state": null,
-   "amount": 177000,
-   "amount_label": "$177,000",
-   "size_label": "248 units · 878 SF",
-   "units": 248,
-   "sqft": 878,
-   "address": null,
-   "occupancy_pct": null,
-   "year_built": null,
-   "summary": "In a Fresno multifamily trade, Maroa Park Apartments, a 248-unit community, was purchased by a private investor for $44 mil ($177. 4k/unit)."
-  },
-  {
-   "id": "34235",
-   "title": "Retail Portfolio in Downtown Long Beach Fetches $30 Mil",
-   "url": "https://www.rentv.com/content/homepage/mainnews/news/34235",
-   "image": "/img/news/news_20293_MosiacLongBeachAnneMonaghanJul202026.jpg",
-   "txn_type": "Sale",
-   "property_type": "Retail",
-   "city": "Long Beach",
-   "state": null,
-   "amount": 30000000,
-   "amount_label": "$30.0M",
-   "size_label": "4.8 acres",
-   "units": null,
-   "sqft": null,
-   "address": "50 East 4th St",
-   "occupancy_pct": 78,
-   "year_built": null,
-   "summary": "Mosaic, a six building, 148. 4k sf retail portfolio spanning multiple city blocks in Downtown Long Beach, traded hands in a recent $30 mil ($202/sf transaction."
-  },
-  {
-   "id": "34224",
-   "title": "Shorenstein Buys 77k sf Bay Area Office Building",
-   "url": "https://www.rentv.com/content/homepage/mainnews/news/34224",
-   "image": "/img/news/news_20283_550AllertonRedwoodCityNickTrombolaNWMKJul162026.jpg",
-   "txn_type": "Sale",
-   "property_type": "Office",
-   "city": "Bay Area",
-   "state": null,
-   "amount": null,
-   "amount_label": null,
-   "size_label": null,
-   "units": null,
-   "sqft": null,
-   "address": null,
-   "occupancy_pct": 81,
-   "year_built": null,
-   "summary": "Shorenstein has closed on a Bay Area office buy, acquiring 550 Allerton, a 76. 6k sf, Class A property in the heart of Downtown Redwood City."
-  },
-  {
-   "id": "34226",
-   "title": "Carson Distribution Facility Acquired by WareSpace in a $23 Mil Deal",
-   "url": "https://www.rentv.com/content/homepage/mainnews/news/34226",
-   "image": "/img/news/news_20285_860SandhillAveCarsonElisabethManvilleSmartJul162026.jpg",
-   "txn_type": "Sale",
-   "property_type": "Industrial",
-   "city": "Phoenix",
-   "state": null,
-   "amount": 23000000,
-   "amount_label": "$23.0M",
-   "size_label": null,
-   "units": null,
-   "sqft": null,
-   "address": "860 Sandhill Ave",
-   "occupancy_pct": null,
-   "year_built": null,
-   "summary": "A 90. 5k sf, industrial distribution facility in the city of Carson traded hands in a $23 mil ($254/sf) transaction."
-  },
-  {
-   "id": "34218",
-   "title": "Camden Property Trust Buys Gilbert, AZ Res Community in $124 Mil Deal",
-   "url": "https://www.rentv.com/content/homepage/mainnews/news/34218",
-   "image": "/img/news/news_20278_3150ERayRdGilbertKimHoidalCBREJul132026.jpg",
-   "txn_type": "Sale",
-   "property_type": "Multifamily",
-   "city": "Gilbert",
-   "state": "AZ",
-   "amount": 124000000,
-   "amount_label": "$124.0M",
-   "size_label": "320 units",
-   "units": 320,
-   "sqft": null,
-   "address": "3150 E Ray Rd",
-   "occupancy_pct": null,
-   "year_built": null,
-   "summary": "In a major Arizona multifamily trade, Camden Property Trust acquired The Tyler, a 320-unit multifamily community located in the Agritopia master-planned community in Gilbert.  The asset was sold by StreetLights Residential in a deal worth $124."
-  },
-  {
-   "id": "34225",
-   "title": "CentrePoint Properties Spends $30 Mil on Trio of Colorado Retail Assets",
-   "url": "https://www.rentv.com/content/homepage/mainnews/news/34225",
-   "image": "",
-   "txn_type": "Sale",
-   "property_type": "Retail",
-   "city": "Phoenix",
-   "state": null,
-   "amount": 30000000,
-   "amount_label": "$30.0M",
-   "size_label": null,
-   "units": null,
-   "sqft": null,
-   "address": null,
-   "occupancy_pct": null,
-   "year_built": null,
-   "summary": "CentrePoint Properties has purchased a three-property Colorado retail portfolio, including Cottonwood Square in Parker, Bristol Pointe in Aurora and Foothill Green in Littleton.  The assets were sold by Western Centers Inc in a $30."
-  },
-  {
-   "id": "34227",
-   "title": "MG Properties Buys 188-Unit Portland Res Asset",
-   "url": "https://www.rentv.com/content/homepage/mainnews/news/34227",
-   "image": "/img/news/news_20286_TupeloAlleyPortlandPaulKaseburgMGPropJul162026.jpg",
-   "txn_type": "Sale",
-   "property_type": "Multifamily",
-   "city": "Portland",
-   "state": null,
-   "amount": null,
-   "amount_label": null,
-   "size_label": "188 units",
-   "units": 188,
-   "sqft": null,
-   "address": "3850 N. Mississippi Ave",
-   "occupancy_pct": null,
-   "year_built": 2009,
-   "summary": "MG Properties has acquired Tupelo Alley, a 188-unit mixed use apartment community in Portland, OR.  Located at 3850 N."
-  },
-  {
-   "id": "34216",
-   "title": "Meta Housing Well Underway with 300-Unit Res Community in Woodland Hills",
-   "url": "https://www.rentv.com/content/homepage/mainnews/news/34216",
-   "image": "/img/news/news_20277_21300WOxnardStWHillsHollyJenvyJul152026.jpg",
-   "txn_type": "Development",
-   "property_type": "Multifamily",
-   "city": "Phoenix",
-   "state": null,
-   "amount": null,
-   "amount_label": null,
-   "size_label": "300 units · 400 SF",
-   "units": 300,
-   "sqft": 400,
-   "address": "21300 W. Oxnard St",
-   "occupancy_pct": null,
-   "year_built": null,
-   "summary": "Meta Housing, with R. D."
-  },
-  {
-   "id": "34214",
-   "title": "Intercontinental Real Estate Corporation Closes $69 Mil Retail Buy in Washington",
-   "url": "https://www.rentv.com/content/homepage/mainnews/news/34214",
-   "image": "/img/news/news_20274_1402LakeTappsPkwySEAuburnWABruceBeckJul152026.jpg",
-   "txn_type": "Sale",
-   "property_type": "Retail",
-   "city": "Auburn",
-   "state": "WA",
-   "amount": 69000000,
-   "amount_label": "$69.0M",
-   "size_label": "13,000 SF · 12.61 acres",
-   "units": null,
-   "sqft": 13000,
-   "address": "1402 Lake Tapps Pkwy",
-   "occupancy_pct": 100,
-   "year_built": 2002,
-   "summary": "Intercontinental Real Estate Corporation has acquired Lakeland Town Center, a 125. 2k sf grocery-anchored retail center located in the Seattle/Tacoma suburb of Auburn, WA, for $69."
-  },
-  {
-   "id": "34208",
-   "title": "Eagle Partners and The Vistria Group Spend $132 Mil on Garden Grove Mixed-Income Res Community",
-   "url": "https://www.rentv.com/content/homepage/mainnews/news/34208",
-   "image": "/img/news/news_20267_12091BayportStGardenGroveCOSTARAnnieNoebelCornersCommJul142026.jpg",
-   "txn_type": "Sale",
-   "property_type": "Multifamily",
-   "city": "Phoenix",
-   "state": null,
-   "amount": 132000000,
-   "amount_label": "$132.0M",
-   "size_label": "402 units",
-   "units": 402,
-   "sqft": null,
-   "address": "12091 Bayport St",
-   "occupancy_pct": null,
-   "year_built": 1968,
-   "summary": "Eagle Partners and The Vistria Group have purchased Crystal View Apartments, a 402-unit apartment mixed-income workforce housing community located in Garden Grove, for $132. 5 mil, or $329."
-  },
-  {
-   "id": "34204",
-   "title": "Oceanside Res Community Trades for $77.5 Mil",
-   "url": "https://www.rentv.com/content/homepage/mainnews/news/34204",
-   "image": "/img/news/news_20262_3851SherbourneDrOceansideDANKIRKSEYClaudiaLipmannCBREJul142026.jpg",
-   "txn_type": "Sale",
-   "property_type": "Multifamily",
-   "city": "Phoenix",
-   "state": null,
-   "amount": 77500000,
-   "amount_label": "$77.5M",
-   "size_label": "240 units · 14.24 acres",
-   "units": 240,
-   "sqft": null,
-   "address": "3851 Sherbourne Dr",
-   "occupancy_pct": null,
-   "year_built": 1975,
-   "summary": "Sunterra, a 240-unit multifamily community in Oceanside, has traded hands in a $77. 5 mil ($323k/unit) transaction."
-  },
-  {
-   "id": "34210",
-   "title": "BKM Capital Partners Boosts Pac Northwest Holdings with Purchase of 400k sf Industrial Buy in Washington",
-   "url": "https://www.rentv.com/content/homepage/mainnews/news/34210",
-   "image": "/img/news/news_20270_SouthcenterWestBusinessParkTukwilaWASuleAygorenConnectJul142026.jpg",
-   "txn_type": "Sale",
-   "property_type": "Industrial",
-   "city": "Tukwila",
-   "state": "WA",
-   "amount": 4000000,
-   "amount_label": "$4.0M",
-   "size_label": "21 units · 19 acres",
-   "units": 21,
-   "sqft": null,
-   "address": null,
-   "occupancy_pct": 84,
-   "year_built": null,
-   "summary": "BKM Capital Partners has acquired a five-building Metro Seattle industrial portfolio.  The assets, located in the market’s premier South King County industrial corridor, were acquired on behalf of BKM Industrial Value Fund III."
-  },
-  {
-   "id": "34203",
-   "title": "The Bascom Group Pays Over $53 Mil for OC Res Community",
-   "url": "https://www.rentv.com/content/homepage/mainnews/news/34203",
-   "image": "/img/news/news_20261_6968CampusDrBuenaParkJerryFinkBascomJul132026.jpg",
-   "txn_type": "Sale",
-   "property_type": "Multifamily",
-   "city": "Phoenix",
-   "state": null,
-   "amount": 53000000,
-   "amount_label": "$53.0M",
-   "size_label": "183 units · 8.7 acres",
-   "units": 183,
-   "sqft": null,
-   "address": "6968 Campus Dr",
-   "occupancy_pct": null,
-   "year_built": 1985,
-   "summary": "The Bascom Group LLC has acquired Castlewood Park Apartments, a low-density, 183-unit value-add apartment community in Buena Park, for $53. 125 mil, or $290k per unit."
-  },
-  {
-   "id": "34199",
-   "title": "Leasing Assignment for 650k sf San Francisco Office Tower Awarded to CBRE",
-   "url": "https://www.rentv.com/content/homepage/mainnews/news/34199",
-   "image": "/img/news/news_20259_415NatomaSFranciscoIrineSpivakCBREJun162026.jpg",
-   "txn_type": "Lease",
-   "property_type": "Office",
-   "city": "San Francisco",
-   "state": null,
-   "amount": null,
-   "amount_label": null,
-   "size_label": null,
-   "units": null,
-   "sqft": null,
-   "address": null,
-   "occupancy_pct": null,
-   "year_built": null,
-   "summary": "The Meridian Group and Fenway Capital Advisors have awarded the leasing assignment for 415 Natoma, a 25-story, 650k sf Class A office tower in San Francisco’s SoMa neighborhood, to CBRE.  Delivered in 2022 as the trophy office component of the 5M mixed-use development, 415 Natoma is the newest high-rise office tower in"
-  },
-  {
-   "id": "34202",
-   "title": "SummerHill Apartment Communities Breaks Ground on New 251-Unit Bay Area Res Development",
-   "url": "https://www.rentv.com/content/homepage/mainnews/news/34202",
-   "image": "/img/news/news_20260_11ElcaminoRealSMateoAnneMonaghanJul72026.jpg",
-   "txn_type": "Development",
-   "property_type": "Multifamily",
-   "city": "Bay Area",
-   "state": null,
-   "amount": null,
-   "amount_label": null,
-   "size_label": "251 units · 2.2 acres",
-   "units": 251,
-   "sqft": null,
-   "address": null,
-   "occupancy_pct": null,
-   "year_built": null,
-   "summary": "SummerHill Apartment Communities has broken ground on 11 El Camino Real, a new 251-unit multifamily rental community in San Mateo County.  The development, which includes 38 essential affordable homes at various income levels, brings a contemporary, pedestrian-oriented design to a prominent 2."
-  },
-  {
-   "id": "34196",
-   "title": "Rubicon Point Partners Spends $53 Mil on Silicon Valley Medical/Office Property",
-   "url": "https://www.rentv.com/content/homepage/mainnews/news/34196",
-   "image": "",
-   "txn_type": "Sale",
-   "property_type": "Office",
-   "city": "Silicon Valley",
-   "state": null,
-   "amount": 53000000,
-   "amount_label": "$53.0M",
-   "size_label": null,
-   "units": null,
-   "sqft": null,
-   "address": null,
-   "occupancy_pct": 93,
-   "year_built": null,
-   "summary": "In a recent Bay Area office trade, Rubicon Point Partners purchased Wolfe Square, a 118k sf Class A asset in Cupertino, for $53 mil ($449/sf).  The two-building, multi-tenant office/medical property is located at 10050 and 10080 N."
-  },
-  {
-   "id": "34195",
-   "title": "Borstein Enterprises Picks Up 282k sf OC Industrial Asset",
-   "url": "https://www.rentv.com/content/homepage/mainnews/news/34195",
-   "image": "/img/news/news_20256_15339BarrancaPkwyIrvineSavannahDurbinCWJul62026.jpg",
-   "txn_type": "Sale",
-   "property_type": "Industrial",
-   "city": "Phoenix",
-   "state": null,
-   "amount": null,
-   "amount_label": null,
-   "size_label": "16.2 acres",
-   "units": null,
-   "sqft": null,
-   "address": null,
-   "occupancy_pct": null,
-   "year_built": null,
-   "summary": "Borstein Enterprises has acquired Barranca Business Park, a 13-building industrial business park totaling 282k sf of space on 16. 2 acres of land in Irvine."
-  },
-  {
-   "id": "34188",
-   "title": "Chino Distribution Facility Leased by Auto Parts Distributor in $42 Mil Deal",
-   "url": "https://www.rentv.com/content/homepage/mainnews/news/34188",
-   "image": "/img/news/news_20252_16380EuclidAveChinoElisabethManvilleSmartJul22026.jpg",
-   "txn_type": "Lease",
-   "property_type": "Industrial",
-   "city": "Phoenix",
-   "state": null,
-   "amount": 42000000,
-   "amount_label": "$42.0M",
-   "size_label": null,
-   "units": null,
-   "sqft": null,
-   "address": "16380 Euclid Ave",
-   "occupancy_pct": null,
-   "year_built": null,
-   "summary": "An auto parts distribution company, believed to be Titanium Plus Auto Parts, has inked a lease for a 522. 3k sf distribution facility in Chino for $42 mil."
-  },
-  {
-   "id": "34186",
-   "title": "Santa Clara Industrial Property Trades for $25.75 Mil",
-   "url": "https://www.rentv.com/content/homepage/mainnews/news/34186",
-   "image": "/img/news/news_20250_651MartinAveSClaraGraceLewisJLLJul12026.jpg",
-   "txn_type": "Sale",
-   "property_type": "Industrial",
-   "city": "Phoenix",
-   "state": null,
-   "amount": 25750000,
-   "amount_label": "$25.8M",
-   "size_label": "7.17 acres",
-   "units": null,
-   "sqft": null,
-   "address": "651 Martin Ave",
-   "occupancy_pct": null,
-   "year_built": null,
-   "summary": "In a Bay Area development purchase, Lift Partners acquired a 7. 17-acre infill site in Santa Clara for $25."
-  },
-  {
-   "id": "34181",
-   "title": "Redwood West and Panattoni Buy The Pike Destination Center in Long Beach",
-   "url": "https://www.rentv.com/content/homepage/mainnews/news/34181",
-   "image": "/img/news/news_20245_95SPineAveLongBeachJessicaSpauldingJun302026.jpg",
-   "txn_type": "Sale",
-   "property_type": "Retail",
-   "city": "Long Beach",
-   "state": null,
-   "amount": 20000000,
-   "amount_label": "$20.0M",
-   "size_label": null,
-   "units": null,
-   "sqft": null,
-   "address": "95 S. Pine Ave",
-   "occupancy_pct": 91,
-   "year_built": 2003,
-   "summary": "Redwood West, in partnership with Panattoni, has acquired The Pike, a 394. 6k sf waterfront retail, dining, and entertainment lifestyle center in Long Beach."
-  },
-  {
-   "id": "34180",
-   "title": "Kennedy Wilson and Jamison Form Partnership to Develop 4,000 Units of Affordable Housing in Los Angeles",
-   "url": "https://www.rentv.com/content/homepage/mainnews/news/34180",
-   "image": "/img/news/news_20244_350SHopeBruceBeckJune302026.jpg",
-   "txn_type": "Development",
-   "property_type": "Office",
-   "city": "Los Angeles",
-   "state": null,
-   "amount": null,
-   "amount_label": null,
-   "size_label": "4,000 units",
-   "units": 4000,
-   "sqft": null,
-   "address": "350 S. Figueroa St",
-   "occupancy_pct": null,
-   "year_built": null,
-   "summary": "Kennedy Wilson and L. A."
-  },
-  {
-   "id": "34086",
-   "title": "Oak Park Investments and Arise Investments Acquire Westlake Village Warehouse/Office Building in $19 Mil Transaction",
-   "url": "https://www.rentv.com/content/homepage/mainnews/news/34086",
-   "image": "/img/news/news_20161_5785LinderoCanyonRdWstlkVillageDannySoroudiAriseJune22026.jpg",
-   "txn_type": "Sale",
-   "property_type": "Office",
-   "city": "Phoenix",
-   "state": null,
-   "amount": 19000000,
-   "amount_label": "$19.0M",
-   "size_label": null,
-   "units": null,
-   "sqft": null,
-   "address": null,
-   "occupancy_pct": null,
-   "year_built": null,
-   "summary": "Oak Park Investments and Arise Investments, in partnership with Nelnet Real Estate Ventures, have acquired a 98. 1k sf warehouse facility in Westlake Village for $19."
-  },
-  {
-   "id": "34177",
-   "title": "Holland Partner Group Closes $105 Mil Bay Area Res Buy",
-   "url": "https://www.rentv.com/content/homepage/mainnews/news/34177",
-   "image": "/img/news/news_20242_1432WestSanCarlosSt.jpg",
-   "txn_type": "Sale",
-   "property_type": "Multifamily",
-   "city": "Bay Area",
-   "state": null,
-   "amount": 105000000,
-   "amount_label": "$105.0M",
-   "size_label": "218 units",
-   "units": 218,
-   "sqft": null,
-   "address": "1432 West San Carlos St",
-   "occupancy_pct": null,
-   "year_built": 2015,
-   "summary": "In a significant NoCal res trade, Holland Partner Group has purchased Meridian at Midtown, a 218-unit luxury apartment complex in San Jose.  The asset was sold by Essex Property Trust in a deal valued at around $105 mil ($482k/unit)."
-  },
-  {
-   "id": "34172",
-   "title": "Haven Housing buys 264-Unit Res Community in Austin Metro Area",
-   "url": "https://www.rentv.com/content/homepage/mainnews/news/34172",
-   "image": "/img/news/news_20237_15001StrathavenPassPflugervilleTXElliottGolanConnectJun262026.jpg",
-   "txn_type": "Sale",
-   "property_type": "Multifamily",
-   "city": "Austin",
-   "state": null,
-   "amount": null,
-   "amount_label": null,
-   "size_label": "264 units",
-   "units": 264,
-   "sqft": null,
-   "address": null,
-   "occupancy_pct": null,
-   "year_built": 2018,
-   "summary": "Haven Housing has acquired Wells Park Apartments, a 264-unit garden-style apartment community in Pflugerville, TX, a growing suburb of Austin.  Haven Housing is the affordable and multifamily housing platform of BH Properties."
-  },
-  {
-   "id": "34174",
-   "title": "MG Properties Acquires Two Multifamily Properties in Gresham, OR in Deals Totaling $60.8 Mil",
-   "url": "https://www.rentv.com/content/homepage/mainnews/news/34174",
-   "image": "/img/news/news_20239_ParksideApartmentsGreshamORPaulKasebergMGPropJune262026.jpg",
-   "txn_type": "Sale",
-   "property_type": "Multifamily",
-   "city": "Gresham",
-   "state": "OR",
-   "amount": 60800000,
-   "amount_label": "$60.8M",
-   "size_label": "337 units · 32 acres",
-   "units": 337,
-   "sqft": null,
-   "address": null,
-   "occupancy_pct": null,
-   "year_built": null,
-   "summary": "San Diego-based MG Properties purchased two multifamily communities totaling 337 units in Gresham, OR in deals worth just over $60 mil.  The acquisitions were of Mountain High Apartments for $18."
-  },
-  {
-   "id": "34171",
-   "title": "Leading AI Firm Leases 1.1 msf of Space at Luke Field in Glendale, AZ",
-   "url": "https://www.rentv.com/content/homepage/mainnews/news/34171",
-   "image": "/img/news/news_20236_7733LitchfieldRdGlendaleAZStaceyHershauerJun242026.jpg",
-   "txn_type": "Lease",
-   "property_type": "Industrial",
-   "city": "Glendale",
-   "state": "AZ",
-   "amount": 152000000,
-   "amount_label": "$152.0M",
-   "size_label": "140 acres",
-   "units": null,
-   "sqft": null,
-   "address": "13543 A and 13543 B Northern Ave",
-   "occupancy_pct": 100,
-   "year_built": null,
-   "summary": "There have been two full-building leases to report at Luke Field, a 2. 4 msf development from Lincoln Property Company in Glendale, AZ."
-  },
-  {
-   "id": "34169",
-   "title": "Seattle Area Res Community Refinanced with $82.5 Mil Loan from Mesa West Capital",
-   "url": "https://www.rentv.com/content/homepage/mainnews/news/34169",
-   "image": "/img/news/news_20233_OlinFieldsEverettWABruceBeckJun242026.jpg",
-   "txn_type": "Financing",
-   "property_type": "Multifamily",
-   "city": "Seattle",
-   "state": null,
-   "amount": 82500000,
-   "amount_label": "$82.5M",
-   "size_label": "352 units · 16 acres",
-   "units": 352,
-   "sqft": null,
-   "address": null,
-   "occupancy_pct": null,
-   "year_built": null,
-   "summary": "A Harrison Street Asset Management and Security Properties joint venture has secured a refi loan of $82. 5 mil on Olin Fields, a 352-unit, garden-style apartment community in the Seattle suburb of Everett, WA."
-  }
- ]
-}
\ No newline at end of file
+{"source":"rentv.com — live deal listings","fetched_at":"2026-07-23T04:07:13.798Z","count":30,"deals":[{"id":"34238","title":"Gilbert, AZ Multifamily Community Refinanced with New Loan for $51.8 Mil","url":"https://www.rentv.com/content/homepage/mainnews/news/34238","image":"/img/news/news_20296_4353EElliotRdGilbertAZDarcieGiacchettoJul212026.jpg","txn_type":"Financing","property_type":"Multifamily","city":"Gilbert","state":"AZ","amount":51800000,"amount_label":"$51.8M","size_label":"236 units · 986 SF","units":236,"sqft":986,"address":"4353 E. Elliot Rd.","occupancy_pct":97,"year_built":2025,"summary":"A joint venture between Phoenix Capital Management and P. B."},{"id":"34236","title":"The Swig Company Obtains Refi on Office High-Rise in San Francisco’s Financial District","url":"https://www.rentv.com/content/homepage/mainnews/news/34236","image":"/img/news/news_20294_220MontgomeryStSFNancyAmaralA2N2Jul162026.jpg","txn_type":"Financing","property_type":"Office","city":"San Francisco","state":"CA","amount":95000000,"amount_label":"$95.0M","size_label":null,"units":null,"sqft":null,"address":"220 Montgomery St","occupancy_pct":null,"year_built":1891,"summary":"RENTV. com - Commercial real estate news and property information window."},{"id":"34233","title":"Tailwind Investment Group Spends $65 Mil on Two Sacramento Res Properties","url":"https://www.rentv.com/content/homepage/mainnews/news/34233","image":"/img/news/news_20291_6633ValleyHiDrSacramentoDavidHulmeTailwindJul182026.jpg","txn_type":"Sale","property_type":"Multifamily","city":"Sacramento","state":"CA","amount":65000000,"amount_label":"$65.0M","size_label":"419 units","units":419,"sqft":null,"address":"4350 Galbrath Dr","occupancy_pct":94,"year_built":null,"summary":"Tailwind Investment Group has acquired two multifamily properties totaling 419 units in Sacramento for a combined price of $65 mil.  The properties include Bent Tree Apartments (208 units) and California Place Apartments (211 units)."},{"id":"34239","title":"Fresno Multifamily Sale Works Out to $177k per Unit","url":"https://www.rentv.com/content/homepage/mainnews/news/34239","image":"/img/news/news_20297_585WestSierraAveFresnoDaveEbelingJul212026.jpg","txn_type":"Sale","property_type":"Multifamily","city":"Fresno","state":"CA","amount":177000,"amount_label":"$177,000","size_label":"248 units · 878 SF","units":248,"sqft":878,"address":null,"occupancy_pct":null,"year_built":null,"summary":"In a Fresno multifamily trade, Maroa Park Apartments, a 248-unit community, was purchased by a private investor for $44 mil ($177. 4k/unit)."},{"id":"34235","title":"Retail Portfolio in Downtown Long Beach Fetches $30 Mil","url":"https://www.rentv.com/content/homepage/mainnews/news/34235","image":"/img/news/news_20293_MosiacLongBeachAnneMonaghanJul202026.jpg","txn_type":"Sale","property_type":"Retail","city":"Long Beach","state":"CA","amount":30000000,"amount_label":"$30.0M","size_label":"4.8 acres","units":null,"sqft":null,"address":"50 East 4th St","occupancy_pct":78,"year_built":null,"summary":"Mosaic, a six building, 148. 4k sf retail portfolio spanning multiple city blocks in Downtown Long Beach, traded hands in a recent $30 mil ($202/sf transaction."},{"id":"34224","title":"Shorenstein Buys 77k sf Bay Area Office Building","url":"https://www.rentv.com/content/homepage/mainnews/news/34224","image":"/img/news/news_20283_550AllertonRedwoodCityNickTrombolaNWMKJul162026.jpg","txn_type":"Sale","property_type":"Office","city":"Bay Area","state":"CA","amount":null,"amount_label":null,"size_label":null,"units":null,"sqft":null,"address":null,"occupancy_pct":81,"year_built":null,"summary":"Shorenstein has closed on a Bay Area office buy, acquiring 550 Allerton, a 76. 6k sf, Class A property in the heart of Downtown Redwood City."},{"id":"34226","title":"Carson Distribution Facility Acquired by WareSpace in a $23 Mil Deal","url":"https://www.rentv.com/content/homepage/mainnews/news/34226","image":"/img/news/news_20285_860SandhillAveCarsonElisabethManvilleSmartJul162026.jpg","txn_type":"Sale","property_type":"Industrial","city":"Carson","state":"CA","amount":23000000,"amount_label":"$23.0M","size_label":null,"units":null,"sqft":null,"address":"860 Sandhill Ave","occupancy_pct":null,"year_built":null,"summary":"A 90. 5k sf, industrial distribution facility in the city of Carson traded hands in a $23 mil ($254/sf) transaction."},{"id":"34218","title":"Camden Property Trust Buys Gilbert, AZ Res Community in $124 Mil Deal","url":"https://www.rentv.com/content/homepage/mainnews/news/34218","image":"/img/news/news_20278_3150ERayRdGilbertKimHoidalCBREJul132026.jpg","txn_type":"Sale","property_type":"Multifamily","city":"Gilbert","state":"AZ","amount":124000000,"amount_label":"$124.0M","size_label":"320 units","units":320,"sqft":null,"address":"3150 E Ray Rd","occupancy_pct":null,"year_built":null,"summary":"In a major Arizona multifamily trade, Camden Property Trust acquired The Tyler, a 320-unit multifamily community located in the Agritopia master-planned community in Gilbert.  The asset was sold by StreetLights Residential in a deal worth $124."},{"id":"34225","title":"CentrePoint Properties Spends $30 Mil on Trio of Colorado Retail Assets","url":"https://www.rentv.com/content/homepage/mainnews/news/34225","image":"","txn_type":"Sale","property_type":"Retail","city":null,"state":null,"amount":30000000,"amount_label":"$30.0M","size_label":null,"units":null,"sqft":null,"address":null,"occupancy_pct":null,"year_built":null,"summary":"CentrePoint Properties has purchased a three-property Colorado retail portfolio, including Cottonwood Square in Parker, Bristol Pointe in Aurora and Foothill Green in Littleton.  The assets were sold by Western Centers Inc in a $30."},{"id":"34227","title":"MG Properties Buys 188-Unit Portland Res Asset","url":"https://www.rentv.com/content/homepage/mainnews/news/34227","image":"/img/news/news_20286_TupeloAlleyPortlandPaulKaseburgMGPropJul162026.jpg","txn_type":"Sale","property_type":"Multifamily","city":"Portland","state":"OR","amount":null,"amount_label":null,"size_label":"188 units","units":188,"sqft":null,"address":"3850 N. Mississippi Ave","occupancy_pct":null,"year_built":2009,"summary":"MG Properties has acquired Tupelo Alley, a 188-unit mixed use apartment community in Portland, OR.  Located at 3850 N."},{"id":"34216","title":"Meta Housing Well Underway with 300-Unit Res Community in Woodland Hills","url":"https://www.rentv.com/content/homepage/mainnews/news/34216","image":"/img/news/news_20277_21300WOxnardStWHillsHollyJenvyJul152026.jpg","txn_type":"Development","property_type":"Multifamily","city":"Woodland Hills","state":"CA","amount":null,"amount_label":null,"size_label":"300 units · 400 SF","units":300,"sqft":400,"address":"21300 W. Oxnard St","occupancy_pct":null,"year_built":null,"summary":"Meta Housing, with R. D."},{"id":"34214","title":"Intercontinental Real Estate Corporation Closes $69 Mil Retail Buy in Washington","url":"https://www.rentv.com/content/homepage/mainnews/news/34214","image":"/img/news/news_20274_1402LakeTappsPkwySEAuburnWABruceBeckJul152026.jpg","txn_type":"Sale","property_type":"Retail","city":"Auburn","state":"WA","amount":69000000,"amount_label":"$69.0M","size_label":"13,000 SF · 12.61 acres","units":null,"sqft":13000,"address":"1402 Lake Tapps Pkwy","occupancy_pct":100,"year_built":2002,"summary":"Intercontinental Real Estate Corporation has acquired Lakeland Town Center, a 125. 2k sf grocery-anchored retail center located in the Seattle/Tacoma suburb of Auburn, WA, for $69."},{"id":"34208","title":"Eagle Partners and The Vistria Group Spend $132 Mil on Garden Grove Mixed-Income Res Community","url":"https://www.rentv.com/content/homepage/mainnews/news/34208","image":"/img/news/news_20267_12091BayportStGardenGroveCOSTARAnnieNoebelCornersCommJul142026.jpg","txn_type":"Sale","property_type":"Multifamily","city":"Garden Grove","state":"CA","amount":132000000,"amount_label":"$132.0M","size_label":"402 units","units":402,"sqft":null,"address":"12091 Bayport St","occupancy_pct":null,"year_built":1968,"summary":"Eagle Partners and The Vistria Group have purchased Crystal View Apartments, a 402-unit apartment mixed-income workforce housing community located in Garden Grove, for $132. 5 mil, or $329."},{"id":"34204","title":"Oceanside Res Community Trades for $77.5 Mil","url":"https://www.rentv.com/content/homepage/mainnews/news/34204","image":"/img/news/news_20262_3851SherbourneDrOceansideDANKIRKSEYClaudiaLipmannCBREJul142026.jpg","txn_type":"Sale","property_type":"Multifamily","city":"Oceanside","state":"CA","amount":77500000,"amount_label":"$77.5M","size_label":"240 units · 14.24 acres","units":240,"sqft":null,"address":"3851 Sherbourne Dr","occupancy_pct":null,"year_built":1975,"summary":"Sunterra, a 240-unit multifamily community in Oceanside, has traded hands in a $77. 5 mil ($323k/unit) transaction."},{"id":"34210","title":"BKM Capital Partners Boosts Pac Northwest Holdings with Purchase of 400k sf Industrial Buy in Washington","url":"https://www.rentv.com/content/homepage/mainnews/news/34210","image":"/img/news/news_20270_SouthcenterWestBusinessParkTukwilaWASuleAygorenConnectJul142026.jpg","txn_type":"Sale","property_type":"Industrial","city":"Seattle","state":"WA","amount":4000000,"amount_label":"$4.0M","size_label":"21 units · 19 acres","units":21,"sqft":null,"address":null,"occupancy_pct":84,"year_built":null,"summary":"BKM Capital Partners has acquired a five-building Metro Seattle industrial portfolio.  The assets, located in the market’s premier South King County industrial corridor, were acquired on behalf of BKM Industrial Value Fund III."},{"id":"34203","title":"The Bascom Group Pays Over $53 Mil for OC Res Community","url":"https://www.rentv.com/content/homepage/mainnews/news/34203","image":"/img/news/news_20261_6968CampusDrBuenaParkJerryFinkBascomJul132026.jpg","txn_type":"Sale","property_type":"Multifamily","city":"Buena Park","state":"CA","amount":53000000,"amount_label":"$53.0M","size_label":"183 units · 8.7 acres","units":183,"sqft":null,"address":"6968 Campus Dr","occupancy_pct":null,"year_built":1985,"summary":"The Bascom Group LLC has acquired Castlewood Park Apartments, a low-density, 183-unit value-add apartment community in Buena Park, for $53. 125 mil, or $290k per unit."},{"id":"34199","title":"Leasing Assignment for 650k sf San Francisco Office Tower Awarded to CBRE","url":"https://www.rentv.com/content/homepage/mainnews/news/34199","image":"/img/news/news_20259_415NatomaSFranciscoIrineSpivakCBREJun162026.jpg","txn_type":"Lease","property_type":"Office","city":"San Francisco","state":"CA","amount":null,"amount_label":null,"size_label":null,"units":null,"sqft":null,"address":null,"occupancy_pct":null,"year_built":null,"summary":"The Meridian Group and Fenway Capital Advisors have awarded the leasing assignment for 415 Natoma, a 25-story, 650k sf Class A office tower in San Francisco’s SoMa neighborhood, to CBRE.  Delivered in 2022 as the trophy office component of the 5M mixed-use development, 415 Natoma is the newest high-rise office tower in"},{"id":"34202","title":"SummerHill Apartment Communities Breaks Ground on New 251-Unit Bay Area Res Development","url":"https://www.rentv.com/content/homepage/mainnews/news/34202","image":"/img/news/news_20260_11ElcaminoRealSMateoAnneMonaghanJul72026.jpg","txn_type":"Development","property_type":"Multifamily","city":"Bay Area","state":"CA","amount":null,"amount_label":null,"size_label":"251 units · 2.2 acres","units":251,"sqft":null,"address":null,"occupancy_pct":null,"year_built":null,"summary":"SummerHill Apartment Communities has broken ground on 11 El Camino Real, a new 251-unit multifamily rental community in San Mateo County.  The development, which includes 38 essential affordable homes at various income levels, brings a contemporary, pedestrian-oriented design to a prominent 2."},{"id":"34196","title":"Rubicon Point Partners Spends $53 Mil on Silicon Valley Medical/Office Property","url":"https://www.rentv.com/content/homepage/mainnews/news/34196","image":"","txn_type":"Sale","property_type":"Office","city":"Silicon Valley","state":"CA","amount":53000000,"amount_label":"$53.0M","size_label":null,"units":null,"sqft":null,"address":null,"occupancy_pct":93,"year_built":null,"summary":"In a recent Bay Area office trade, Rubicon Point Partners purchased Wolfe Square, a 118k sf Class A asset in Cupertino, for $53 mil ($449/sf).  The two-building, multi-tenant office/medical property is located at 10050 and 10080 N."},{"id":"34195","title":"Borstein Enterprises Picks Up 282k sf OC Industrial Asset","url":"https://www.rentv.com/content/homepage/mainnews/news/34195","image":"/img/news/news_20256_15339BarrancaPkwyIrvineSavannahDurbinCWJul62026.jpg","txn_type":"Sale","property_type":"Industrial","city":"Irvine","state":"CA","amount":null,"amount_label":null,"size_label":"16.2 acres","units":null,"sqft":null,"address":null,"occupancy_pct":null,"year_built":null,"summary":"Borstein Enterprises has acquired Barranca Business Park, a 13-building industrial business park totaling 282k sf of space on 16. 2 acres of land in Irvine."},{"id":"34188","title":"Chino Distribution Facility Leased by Auto Parts Distributor in $42 Mil Deal","url":"https://www.rentv.com/content/homepage/mainnews/news/34188","image":"/img/news/news_20252_16380EuclidAveChinoElisabethManvilleSmartJul22026.jpg","txn_type":"Lease","property_type":"Industrial","city":"Chino","state":"CA","amount":42000000,"amount_label":"$42.0M","size_label":null,"units":null,"sqft":null,"address":"16380 Euclid Ave","occupancy_pct":null,"year_built":null,"summary":"An auto parts distribution company, believed to be Titanium Plus Auto Parts, has inked a lease for a 522. 3k sf distribution facility in Chino for $42 mil."},{"id":"34186","title":"Santa Clara Industrial Property Trades for $25.75 Mil","url":"https://www.rentv.com/content/homepage/mainnews/news/34186","image":"/img/news/news_20250_651MartinAveSClaraGraceLewisJLLJul12026.jpg","txn_type":"Sale","property_type":"Industrial","city":"Santa Clara","state":"CA","amount":25750000,"amount_label":"$25.8M","size_label":"7.17 acres","units":null,"sqft":null,"address":"651 Martin Ave","occupancy_pct":null,"year_built":null,"summary":"In a Bay Area development purchase, Lift Partners acquired a 7. 17-acre infill site in Santa Clara for $25."},{"id":"34181","title":"Redwood West and Panattoni Buy The Pike Destination Center in Long Beach","url":"https://www.rentv.com/content/homepage/mainnews/news/34181","image":"/img/news/news_20245_95SPineAveLongBeachJessicaSpauldingJun302026.jpg","txn_type":"Sale","property_type":"Retail","city":"Long Beach","state":"CA","amount":20000000,"amount_label":"$20.0M","size_label":null,"units":null,"sqft":null,"address":"95 S. Pine Ave","occupancy_pct":91,"year_built":2003,"summary":"Redwood West, in partnership with Panattoni, has acquired The Pike, a 394. 6k sf waterfront retail, dining, and entertainment lifestyle center in Long Beach."},{"id":"34180","title":"Kennedy Wilson and Jamison Form Partnership to Develop 4,000 Units of Affordable Housing in Los Angeles","url":"https://www.rentv.com/content/homepage/mainnews/news/34180","image":"/img/news/news_20244_350SHopeBruceBeckJune302026.jpg","txn_type":"Development","property_type":"Office","city":"Los Angeles","state":"CA","amount":null,"amount_label":null,"size_label":"4,000 units","units":4000,"sqft":null,"address":"350 S. Figueroa St","occupancy_pct":null,"year_built":null,"summary":"Kennedy Wilson and L. A."},{"id":"34086","title":"Oak Park Investments and Arise Investments Acquire Westlake Village Warehouse/Office Building in $19 Mil Transaction","url":"https://www.rentv.com/content/homepage/mainnews/news/34086","image":"/img/news/news_20161_5785LinderoCanyonRdWstlkVillageDannySoroudiAriseJune22026.jpg","txn_type":"Sale","property_type":"Office","city":null,"state":null,"amount":19000000,"amount_label":"$19.0M","size_label":null,"units":null,"sqft":null,"address":null,"occupancy_pct":null,"year_built":null,"summary":"Oak Park Investments and Arise Investments, in partnership with Nelnet Real Estate Ventures, have acquired a 98. 1k sf warehouse facility in Westlake Village for $19."},{"id":"34177","title":"Holland Partner Group Closes $105 Mil Bay Area Res Buy","url":"https://www.rentv.com/content/homepage/mainnews/news/34177","image":"/img/news/news_20242_1432WestSanCarlosSt.jpg","txn_type":"Sale","property_type":"Multifamily","city":"San Jose","state":"CA","amount":105000000,"amount_label":"$105.0M","size_label":"218 units","units":218,"sqft":null,"address":"1432 West San Carlos St","occupancy_pct":null,"year_built":2015,"summary":"In a significant NoCal res trade, Holland Partner Group has purchased Meridian at Midtown, a 218-unit luxury apartment complex in San Jose.  The asset was sold by Essex Property Trust in a deal valued at around $105 mil ($482k/unit)."},{"id":"34172","title":"Haven Housing buys 264-Unit Res Community in Austin Metro Area","url":"https://www.rentv.com/content/homepage/mainnews/news/34172","image":"/img/news/news_20237_15001StrathavenPassPflugervilleTXElliottGolanConnectJun262026.jpg","txn_type":"Sale","property_type":"Multifamily","city":"Austin","state":"TX","amount":null,"amount_label":null,"size_label":"264 units","units":264,"sqft":null,"address":null,"occupancy_pct":null,"year_built":2018,"summary":"Haven Housing has acquired Wells Park Apartments, a 264-unit garden-style apartment community in Pflugerville, TX, a growing suburb of Austin.  Haven Housing is the affordable and multifamily housing platform of BH Properties."},{"id":"34174","title":"MG Properties Acquires Two Multifamily Properties in Gresham, OR in Deals Totaling $60.8 Mil","url":"https://www.rentv.com/content/homepage/mainnews/news/34174","image":"/img/news/news_20239_ParksideApartmentsGreshamORPaulKasebergMGPropJune262026.jpg","txn_type":"Sale","property_type":"Multifamily","city":"Gresham","state":"OR","amount":60800000,"amount_label":"$60.8M","size_label":"337 units · 32 acres","units":337,"sqft":null,"address":null,"occupancy_pct":null,"year_built":null,"summary":"San Diego-based MG Properties purchased two multifamily communities totaling 337 units in Gresham, OR in deals worth just over $60 mil.  The acquisitions were of Mountain High Apartments for $18."},{"id":"34171","title":"Leading AI Firm Leases 1.1 msf of Space at Luke Field in Glendale, AZ","url":"https://www.rentv.com/content/homepage/mainnews/news/34171","image":"/img/news/news_20236_7733LitchfieldRdGlendaleAZStaceyHershauerJun242026.jpg","txn_type":"Lease","property_type":"Industrial","city":"Glendale","state":"AZ","amount":152000000,"amount_label":"$152.0M","size_label":"140 acres","units":null,"sqft":null,"address":"13543 A and 13543 B Northern Ave","occupancy_pct":100,"year_built":null,"summary":"There have been two full-building leases to report at Luke Field, a 2. 4 msf development from Lincoln Property Company in Glendale, AZ."},{"id":"34169","title":"Seattle Area Res Community Refinanced with $82.5 Mil Loan from Mesa West Capital","url":"https://www.rentv.com/content/homepage/mainnews/news/34169","image":"/img/news/news_20233_OlinFieldsEverettWABruceBeckJun242026.jpg","txn_type":"Financing","property_type":"Multifamily","city":"Seattle","state":"WA","amount":82500000,"amount_label":"$82.5M","size_label":"352 units · 16 acres","units":352,"sqft":null,"address":null,"occupancy_pct":null,"year_built":null,"summary":"A Harrison Street Asset Management and Security Properties joint venture has secured a refi loan of $82. 5 mil on Olin Fields, a 352-unit, garden-style apartment community in the Seattle suburb of Everett, WA."}],"city_rederived_at":"2026-07-24T00:49:36.764Z"}
\ No newline at end of file
diff --git a/data/markets.json b/data/markets.json
index 465ee8a..8621a7c 100644
--- a/data/markets.json
+++ b/data/markets.json
@@ -1,5 +1,5 @@
 {
-  "fetched_at": "2026-07-24T00:06:07.934Z",
+  "fetched_at": "2026-07-24T00:46:09.667Z",
   "source": "Yahoo Finance — live (CBOE Treasury yields, Dow Jones/MSCI REIT indices)",
   "curve": [
     {
diff --git a/data/news.json b/data/news.json
index d6c49c8..499ba4e 100644
--- a/data/news.json
+++ b/data/news.json
@@ -1,6 +1,6 @@
 {
  "source": "rentv.com — live",
- "fetched_at": "2026-07-24T00:06:07.597Z",
+ "fetched_at": "2026-07-24T00:46:09.388Z",
  "count": 30,
  "items": [
   {
diff --git a/data/ticker.json b/data/ticker.json
index fcc7756..0781f45 100644
--- a/data/ticker.json
+++ b/data/ticker.json
@@ -1,5 +1,5 @@
 {
-  "fetched_at": "2026-07-24T00:06:07.903Z",
+  "fetched_at": "2026-07-24T00:46:09.636Z",
   "la_office_vac": {
     "label": "LA OFFICE VAC",
     "value": "23.1%",
diff --git a/scripts/lib/parse-location.mjs b/scripts/lib/parse-location.mjs
new file mode 100644
index 0000000..b28f337
--- /dev/null
+++ b/scripts/lib/parse-location.mjs
@@ -0,0 +1,78 @@
+// Shared, testable deal-location parser. The asset's location is what we want —
+// NOT a firm's HQ that happens to be named in the body (the old bug grabbed
+// "Phoenix" from "Phoenix Capital Management"). Priority, most-trusted first:
+//   1. "City, ST" in the TITLE            (authoritative, asset-about)
+//   2. asset cue in title/body: "in [the city of] <City>" / title-lead "<City> <AssetWord>"
+//   3. "City, ST" in the BODY
+//   4. KNOWN_CITY in the TITLE            (title is about the asset)
+//   5. KNOWN_CITY in the BODY, but ONLY when not glued to a firm word
+//   else null (frontend buckets null as "Location unconfirmed")
+
+export const KNOWN_CITY = /\b(Bay Area|Silicon Valley|Inland Empire|Orange County|South Bay|East Bay|Downtown L\.?A\.?|Los Angeles|San Francisco|San Diego|Sacramento|Fresno|Oakland|San Jose|Long Beach|Irvine|Anaheim|Pasadena|Garden Grove|Santa Ana|Costa Mesa|Huntington Beach|Newport Beach|Oceanside|Carlsbad|Chula Vista|Culver City|Santa Monica|Burbank|Glendale|Pomona|Ontario|Riverside|San Bernardino|Torrance|Carson|Chino|Corona|Temecula|Ventura|Santa Barbara|Bakersfield|Stockton|Modesto|Santa Clara|Sunnyvale|Mountain View|Palo Alto|Fremont|Hayward|Woodland Hills|Sherman Oaks|Thousand Oaks|Phoenix|Scottsdale|Tempe|Chandler|Gilbert|Tucson|Mesa|Peoria|Glendale AZ|Las Vegas|Reno|Henderson|Seattle|Bellevue|Tacoma|Auburn|Tukwila|Kent|Redmond|Portland|Beaverton|Gresham|Hillsboro|Denver|Boulder|Dallas|Houston|Austin|San Antonio|Miami|Atlanta|Chicago|New York|Boston)\b/;
+
+// City, ST — the token right before ", ST", optionally extended by a known prefix.
+const ST_RE = /\b((?:San|Los|Long|Santa|New|Bay|Silicon|Inland|Orange|South|East|West|North|Downtown|Mission|Culver|Sherman|Garden|Costa|Newport|Huntington|Chula|Thousand|Woodland|Mountain|Palo)\s)?([A-Z][a-z.\-]{2,}),\s?([A-Z]{2})\b/;
+// Asset cue: "in [the city of/downtown] <City>" — capture 1-2 Capitalized words.
+const IN_RE = /\bin (?:the city of |[Dd]owntown )?([A-Z][a-z.'\-]+(?:\s[A-Z][a-z.'\-]+)?)/;
+const PLACE_SUFFIX = /\b(Grove|Beach|Valley|Mesa|Clara|Ana|Hills|Park|Springs|City|Vista|Ridge|Heights|Gardens|Oaks|Creek|Canyon|Ranch|Bay|Shore|Lake|View|Point|Harbor|Island|Monica|Barbara|Jose|Diego|Francisco|Angeles|Cruz)\b/;
+// Title lead: "<City> <AssetWord> …" e.g. "Oceanside Res Community…", "Carson Distribution…".
+const LEAD_RE = /^([A-Z][a-z.'\-]+(?:\s[A-Z][a-z.'\-]+)?)\s+(?:Res|Multifamily|Office|Industrial|Retail|Apartment|Apartments|Distribution|Mixed|Community|Property|Tower|Center|Portfolio|Plaza|Ranch|Warehouse|Logistics|Medical|Self[- ]Storage|Hotel|Assisted)/;
+const FIRM_ADJ = /(Capital|Management|Partners|Properties|Realty|Advisors|Group|Ventures|Investments|Trust|Holdings|Development|Equity|Fund|Bank|Financial|Insurance)/;
+
+const clean = (s) => (s || '').trim().replace(/[’']s$/, '').replace(/[.,]$/, '');
+// Words that are NOT a city even when Capitalized (asset types, directions, filler).
+const NOT_CITY = /^(Retail|Office|Industrial|Multifamily|Mixed|Res|Residential|Apartment|Apartments|Distribution|Warehouse|Logistics|Medical|Hotel|Self|Portfolio|Property|Properties|Community|Center|Tower|Plaza|Ranch|Facility|Trio|Pac|New|Downtown|The|A|An|This|That|Its|His|Her|Their|Two|Three|Both|North|South|East|West|Northwest|Southwest|Northeast|Southeast|Pacific|Greater)$/i;
+// Strip trailing non-place words a capture may have swallowed ("Oceanside Res" → "Oceanside").
+const tidy = (c) => {
+  c = clean(c).replace(/\s+(Res|Metro|Area|Region|Residential|Portfolio|Community|Property|Properties|Industrial|Office|Retail|Facility|Facilities|Holdings|Assets|Buy|Sale|Deal)$/i, '');
+  const first = (c.split(' ')[0] || '');
+  return (!c || c.length < 3 || FIRM_ADJ.test(c) || NOT_CITY.test(first) || NOT_CITY.test(c)) ? null : c;
+};
+const looksPlace = (c) => !!tidy(c);
+
+// Fill in the state for a known bare city so state-level rollups (/pulse) are accurate.
+const CITY_STATE = {
+  CA: ['Los Angeles', 'San Francisco', 'San Diego', 'San Jose', 'Sacramento', 'Fresno', 'Oakland', 'Long Beach', 'Irvine', 'Anaheim', 'Pasadena', 'Garden Grove', 'Santa Ana', 'Costa Mesa', 'Huntington Beach', 'Newport Beach', 'Oceanside', 'Carlsbad', 'Chula Vista', 'Culver City', 'Santa Monica', 'Burbank', 'Glendale', 'Pomona', 'Ontario', 'Riverside', 'San Bernardino', 'Torrance', 'Carson', 'Chino', 'Corona', 'Temecula', 'Ventura', 'Santa Barbara', 'Bakersfield', 'Stockton', 'Modesto', 'Santa Clara', 'Sunnyvale', 'Mountain View', 'Palo Alto', 'Fremont', 'Hayward', 'Woodland Hills', 'Sherman Oaks', 'Thousand Oaks', 'Buena Park', 'Bay Area', 'Silicon Valley', 'Inland Empire', 'Orange County', 'South Bay', 'East Bay'],
+  AZ: ['Phoenix', 'Scottsdale', 'Tempe', 'Chandler', 'Gilbert', 'Tucson', 'Mesa', 'Peoria'],
+  WA: ['Seattle', 'Bellevue', 'Tacoma', 'Auburn', 'Tukwila', 'Kent', 'Redmond'],
+  OR: ['Portland', 'Beaverton', 'Gresham', 'Hillsboro'],
+  NV: ['Las Vegas', 'Reno', 'Henderson'],
+  CO: ['Denver', 'Boulder'],
+  TX: ['Dallas', 'Houston', 'Austin', 'San Antonio'],
+};
+const STATE_OF = {};
+for (const [st, cities] of Object.entries(CITY_STATE)) for (const c of cities) STATE_OF[c.toLowerCase()] = st;
+
+export function parseLocation(title = '', body = '') {
+  const r = _parseLocation(title, body);
+  if (r.city && !r.state) { const s = STATE_OF[r.city.toLowerCase()]; if (s) r.state = s; }
+  return r;
+}
+
+function _parseLocation(title = '', body = '') {
+  const join = (m) => clean((m[1] || '') + m[2]);
+  let m;
+  // 1. City, ST in title
+  if ((m = title.match(ST_RE))) return { city: join(m), state: m[3] };
+  // 2a. title lead "<City> <AssetWord>"
+  if ((m = title.match(LEAD_RE))) {
+    const c = tidy(m[1]);
+    if (c && (KNOWN_CITY.test(c) || PLACE_SUFFIX.test(c))) return { city: c, state: null };
+  }
+  // 2b. asset "in <City>" in title, then body — accept only a plausible place
+  for (const src of [title, body]) {
+    const im = src.match(IN_RE);
+    const c = im && tidy(im[1]);
+    if (c && (KNOWN_CITY.test(c) || PLACE_SUFFIX.test(c))) return { city: c, state: null };
+  }
+  // 3. City, ST in body
+  if ((m = body.match(ST_RE))) return { city: join(m), state: m[3] };
+  // 4. KNOWN_CITY in title
+  if ((m = title.match(KNOWN_CITY))) return { city: m[1], state: null };
+  // 5. KNOWN_CITY in body, but not when glued to a firm word (…"Phoenix Capital Management")
+  if ((m = body.match(KNOWN_CITY))) {
+    const idx = m.index, after = body.slice(idx + m[1].length, idx + m[1].length + 14);
+    if (!FIRM_ADJ.test(after)) return { city: m[1], state: null };
+  }
+  return { city: null, state: null };
+}
diff --git a/scripts/pull-deals.mjs b/scripts/pull-deals.mjs
index f2270b9..4842a26 100644
--- a/scripts/pull-deals.mjs
+++ b/scripts/pull-deals.mjs
@@ -11,6 +11,7 @@ import { writeFileSync, readFileSync, mkdirSync } from 'node:fs';
 import { dirname, join } from 'node:path';
 import { fileURLToPath } from 'node:url';
 import { createRequire } from 'node:module';
+import { parseLocation } from './lib/parse-location.mjs';
 const HERE = dirname(fileURLToPath(import.meta.url));
 const DATA = join(HERE, '..', 'data'); mkdirSync(DATA, { recursive: true });
 // Localize deal-card photos into public/img/news/ — the Deals grid serves them locally,
@@ -68,27 +69,10 @@ function classify(title, body) {
   return { txn, type };
 }
 
-// "Gilbert, AZ" / "Los Angeles, CA" — first City, ST in the title, else body.
-// Falls back to a bare city (title lead word or "in <City>") when no state is stated.
-const KNOWN_CITY = /\b(Bay Area|Silicon Valley|Inland Empire|Orange County|South Bay|East Bay|Downtown L\.?A\.?|Los Angeles|San Francisco|San Diego|Sacramento|Fresno|Oakland|San Jose|Long Beach|Irvine|Anaheim|Pasadena|Phoenix|Scottsdale|Tucson|Mesa|Las Vegas|Reno|Henderson|Seattle|Portland|Denver|Dallas|Houston|Austin|Miami|Atlanta|Chicago|New York|Boston)\b/;
-function parseLocation(title, body) {
-  // City token is the ONE word right before ", ST", optionally extended left by a
-  // known multi-word prefix (San/Los/Long/…) — this stops the match from swallowing
-  // preceding verbs/entities ("…Trust Buys Gilbert, AZ" → "Gilbert", not "Property Trust").
-  const re = /\b((?:San|Los|Long|Santa|New|Bay|Silicon|Inland|Orange|South|East|West|North|Downtown|Mission|Culver|Sherman)\s)?([A-Z][a-z.\-]{2,}),\s?([A-Z]{2})\b/;
-  // Title is authoritative for place — a body can name several cities (comps,
-  // buyer HQ) and pick the wrong one. Only fall to the body if the title has none.
-  const join = (m) => ((m[1] || '') + m[2]).trim().replace(/[’']s$/, '');
-  const tm = title.match(re);
-  if (tm) return { city: join(tm), state: tm[3] };
-  const tk = title.match(KNOWN_CITY);
-  if (tk) return { city: tk[1], state: null };
-  const bm = body.match(re);
-  if (bm) return { city: join(bm), state: bm[3] };
-  const bk = body.match(KNOWN_CITY);
-  if (bk) return { city: bk[1], state: null };
-  return { city: null, state: null };
-}
+// Location parsing now lives in ./lib/parse-location.mjs (shared + unit-tested).
+// The old inline version fell back to a bare KNOWN_CITY match in the body, which
+// grabbed a firm's HQ city ("Phoenix Capital Management" → "Phoenix") instead of
+// the asset location — fixed 2026-07-24 by preferring in-text asset cues.
 
 function parseSize(text) {
   const units = text.match(/([\d,]+)[- ]unit/i);
diff --git a/scripts/rederive-deal-cities.mjs b/scripts/rederive-deal-cities.mjs
new file mode 100644
index 0000000..9a29122
--- /dev/null
+++ b/scripts/rederive-deal-cities.mjs
@@ -0,0 +1,29 @@
+#!/usr/bin/env node
+// One-off: re-derive city/state on the EXISTING data/deals.json using the fixed
+// shared parser (no re-scrape, fully local). Backs up the old file first.
+import { readFileSync, writeFileSync } from 'node:fs';
+import { dirname, join } from 'node:path';
+import { fileURLToPath } from 'node:url';
+import { parseLocation } from './lib/parse-location.mjs';
+
+const HERE = dirname(fileURLToPath(import.meta.url));
+const FILE = join(HERE, '..', 'data', 'deals.json');
+const doc = JSON.parse(readFileSync(FILE, 'utf8'));
+const deals = doc.deals || [];
+
+let changed = 0;
+for (const d of deals) {
+  const loc = parseLocation(d.title || '', d.summary || '');
+  if ((loc.city || null) !== (d.city || null) || (loc.state || null) !== (d.state || null)) {
+    changed++;
+    d.city = loc.city;
+    d.state = loc.state;
+  }
+}
+
+if (changed) {
+  writeFileSync(FILE + '.bak-' + Date.now(), JSON.stringify(doc, null, 0)); // safety backup (git-ignored *.bak)
+  doc.city_rederived_at = new Date().toISOString();
+  writeFileSync(FILE, JSON.stringify(doc, null, 0));
+}
+console.log(JSON.stringify({ ok: true, total: deals.length, changed }));
diff --git a/tools/specs/geofix.json b/tools/specs/geofix.json
new file mode 100644
index 0000000..349ab19
--- /dev/null
+++ b/tools/specs/geofix.json
@@ -0,0 +1,23 @@
+{
+  "slug": "geofix",
+  "title": "Sharper Deal Geography",
+  "subtitle": "Deals mapped to their real markets",
+  "voice": "Samantha",
+  "scenes": [
+    {
+      "url": "/metros",
+      "say": "RENTV just sharpened its deal geography. A data fix now maps every transaction to its real market, ranked by volume across the Western U.S.",
+      "caption": "Every deal mapped to its real market"
+    },
+    {
+      "url": "/metros?open=Garden%20Grove",
+      "say": "This one-hundred-thirty-two-million-dollar deal used to be mis-filed under the buyer's headquarters city. Now it correctly lands in Garden Grove, where the property actually is.",
+      "caption": "Fixed: a deal now lands in its true city, not the buyer's HQ"
+    },
+    {
+      "url": "/metros?sort=cnt",
+      "say": "The cleanup flows through Market Pulse too — California now clearly leads the West — and anything we still can't confirm stays honestly in its own bucket, never faked.",
+      "caption": "Cleaner Pulse geography · unconfirmed stays honest"
+    }
+  ]
+}

← d3cb47f metros: Deal Flow by Metro (/metros) — metros ranked by volu  ·  back to Rentv V1  ·  sector: Sector Deep-Dives (/sector) — per-property-type page a0ad97e →