← back to Rentv
RENTV: persistent deal registry + per-deal change history — TK-10246
a15c8be05a8635e2f4c772e03e54b03969281ada · 2026-08-05 12:54:08 -0700 · Steve Abrams
Steve: keep a list of ALL deals in the rentv backend; every deal it finds is saved
so changes are visible over time. pull-deals.mjs previously OVERWROTE deals.json each
run — deals dropped off when their story rotated out, and field corrections silently
clobbered the old value with no trail.
- scripts/lib/deal-registry.mjs: append-only ledger keyed by deal id; never drops a
deal; diffs a tracked field set on each pull and appends a created/changed revision
with per-field from→to. Atomic write.
- pull-deals.mjs: records every parsed deal into the registry on each run.
- server.js: GET /api/deals/registry (all deals ever found + change count, filters)
and GET /api/deals/:id/history (full change timeline), both adminOnly.
- public/deals-log.html: backend view — sortable/togglable columns, search-all,
changed-only filter, created date+time, click a row → change-history timeline with
field diffs. Linked from the backend hub.
- Proven live: first real pull recorded +15 new, 2 changed (Seattle→Tukwila; a null
location filled to Inland Empire/CA), 45 total deals ever found.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Files touched
A data/deals-registry.jsonM public/backend.htmlA public/deals-log.htmlA scripts/lib/deal-registry.mjsM scripts/pull-deals.mjsM server.js
Diff
commit a15c8be05a8635e2f4c772e03e54b03969281ada
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Wed Aug 5 12:54:08 2026 -0700
RENTV: persistent deal registry + per-deal change history — TK-10246
Steve: keep a list of ALL deals in the rentv backend; every deal it finds is saved
so changes are visible over time. pull-deals.mjs previously OVERWROTE deals.json each
run — deals dropped off when their story rotated out, and field corrections silently
clobbered the old value with no trail.
- scripts/lib/deal-registry.mjs: append-only ledger keyed by deal id; never drops a
deal; diffs a tracked field set on each pull and appends a created/changed revision
with per-field from→to. Atomic write.
- pull-deals.mjs: records every parsed deal into the registry on each run.
- server.js: GET /api/deals/registry (all deals ever found + change count, filters)
and GET /api/deals/:id/history (full change timeline), both adminOnly.
- public/deals-log.html: backend view — sortable/togglable columns, search-all,
changed-only filter, created date+time, click a row → change-history timeline with
field diffs. Linked from the backend hub.
- Proven live: first real pull recorded +15 new, 2 changed (Seattle→Tukwila; a null
location filled to Inland Empire/CA), 45 total deals ever found.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---
data/deals-registry.json | 2272 +++++++++++++++++++++++++++++++++++++++++
public/backend.html | 1 +
public/deals-log.html | 172 ++++
scripts/lib/deal-registry.mjs | 128 +++
scripts/pull-deals.mjs | 9 +-
server.js | 38 +-
6 files changed, 2618 insertions(+), 2 deletions(-)
diff --git a/data/deals-registry.json b/data/deals-registry.json
new file mode 100644
index 00000000..f1a2a2ef
--- /dev/null
+++ b/data/deals-registry.json
@@ -0,0 +1,2272 @@
+{
+ "updated_at": "2026-08-05T19:53:22.976Z",
+ "total": 45,
+ "deals": {
+ "34086": {
+ "id": "34086",
+ "current": {
+ "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."
+ },
+ "first_seen": "2026-07-23T04:07:13.798Z",
+ "last_seen": "2026-07-23T04:07:13.798Z",
+ "seen_count": 1,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-07-23T04:07:13.798Z",
+ "event": "created",
+ "snapshot": {
+ "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",
+ "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."
+ }
+ }
+ ]
+ },
+ "34169": {
+ "id": "34169",
+ "current": {
+ "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."
+ },
+ "first_seen": "2026-07-23T04:07:13.798Z",
+ "last_seen": "2026-07-23T04:07:13.798Z",
+ "seen_count": 1,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-07-23T04:07:13.798Z",
+ "event": "created",
+ "snapshot": {
+ "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",
+ "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."
+ }
+ }
+ ]
+ },
+ "34171": {
+ "id": "34171",
+ "current": {
+ "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."
+ },
+ "first_seen": "2026-07-23T04:07:13.798Z",
+ "last_seen": "2026-07-23T04:07:13.798Z",
+ "seen_count": 1,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-07-23T04:07:13.798Z",
+ "event": "created",
+ "snapshot": {
+ "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",
+ "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."
+ }
+ }
+ ]
+ },
+ "34172": {
+ "id": "34172",
+ "current": {
+ "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."
+ },
+ "first_seen": "2026-07-23T04:07:13.798Z",
+ "last_seen": "2026-07-23T04:07:13.798Z",
+ "seen_count": 1,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-07-23T04:07:13.798Z",
+ "event": "created",
+ "snapshot": {
+ "title": "Haven Housing buys 264-Unit Res Community in Austin Metro Area",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34172",
+ "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."
+ }
+ }
+ ]
+ },
+ "34174": {
+ "id": "34174",
+ "current": {
+ "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."
+ },
+ "first_seen": "2026-07-23T04:07:13.798Z",
+ "last_seen": "2026-07-23T04:07:13.798Z",
+ "seen_count": 1,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-07-23T04:07:13.798Z",
+ "event": "created",
+ "snapshot": {
+ "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",
+ "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."
+ }
+ }
+ ]
+ },
+ "34177": {
+ "id": "34177",
+ "current": {
+ "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)."
+ },
+ "first_seen": "2026-07-23T04:07:13.798Z",
+ "last_seen": "2026-07-23T04:07:13.798Z",
+ "seen_count": 1,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-07-23T04:07:13.798Z",
+ "event": "created",
+ "snapshot": {
+ "title": "Holland Partner Group Closes $105 Mil Bay Area Res Buy",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34177",
+ "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)."
+ }
+ }
+ ]
+ },
+ "34180": {
+ "id": "34180",
+ "current": {
+ "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."
+ },
+ "first_seen": "2026-07-23T04:07:13.798Z",
+ "last_seen": "2026-07-23T04:07:13.798Z",
+ "seen_count": 1,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-07-23T04:07:13.798Z",
+ "event": "created",
+ "snapshot": {
+ "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",
+ "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."
+ }
+ }
+ ]
+ },
+ "34181": {
+ "id": "34181",
+ "current": {
+ "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."
+ },
+ "first_seen": "2026-07-23T04:07:13.798Z",
+ "last_seen": "2026-07-23T04:07:13.798Z",
+ "seen_count": 1,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-07-23T04:07:13.798Z",
+ "event": "created",
+ "snapshot": {
+ "title": "Redwood West and Panattoni Buy The Pike Destination Center in Long Beach",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34181",
+ "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."
+ }
+ }
+ ]
+ },
+ "34186": {
+ "id": "34186",
+ "current": {
+ "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."
+ },
+ "first_seen": "2026-07-23T04:07:13.798Z",
+ "last_seen": "2026-07-23T04:07:13.798Z",
+ "seen_count": 1,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-07-23T04:07:13.798Z",
+ "event": "created",
+ "snapshot": {
+ "title": "Santa Clara Industrial Property Trades for $25.75 Mil",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34186",
+ "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."
+ }
+ }
+ ]
+ },
+ "34188": {
+ "id": "34188",
+ "current": {
+ "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."
+ },
+ "first_seen": "2026-07-23T04:07:13.798Z",
+ "last_seen": "2026-07-23T04:07:13.798Z",
+ "seen_count": 1,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-07-23T04:07:13.798Z",
+ "event": "created",
+ "snapshot": {
+ "title": "Chino Distribution Facility Leased by Auto Parts Distributor in $42 Mil Deal",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34188",
+ "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."
+ }
+ }
+ ]
+ },
+ "34195": {
+ "id": "34195",
+ "current": {
+ "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."
+ },
+ "first_seen": "2026-07-23T04:07:13.798Z",
+ "last_seen": "2026-07-23T04:07:13.798Z",
+ "seen_count": 1,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-07-23T04:07:13.798Z",
+ "event": "created",
+ "snapshot": {
+ "title": "Borstein Enterprises Picks Up 282k sf OC Industrial Asset",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34195",
+ "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."
+ }
+ }
+ ]
+ },
+ "34196": {
+ "id": "34196",
+ "current": {
+ "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."
+ },
+ "first_seen": "2026-07-23T04:07:13.798Z",
+ "last_seen": "2026-07-23T04:07:13.798Z",
+ "seen_count": 1,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-07-23T04:07:13.798Z",
+ "event": "created",
+ "snapshot": {
+ "title": "Rubicon Point Partners Spends $53 Mil on Silicon Valley Medical/Office Property",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34196",
+ "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."
+ }
+ }
+ ]
+ },
+ "34199": {
+ "id": "34199",
+ "current": {
+ "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 Franciscos 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"
+ },
+ "first_seen": "2026-07-23T04:07:13.798Z",
+ "last_seen": "2026-07-23T04:07:13.798Z",
+ "seen_count": 1,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-07-23T04:07:13.798Z",
+ "event": "created",
+ "snapshot": {
+ "title": "Leasing Assignment for 650k sf San Francisco Office Tower Awarded to CBRE",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34199",
+ "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 Franciscos 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"
+ }
+ }
+ ]
+ },
+ "34202": {
+ "id": "34202",
+ "current": {
+ "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."
+ },
+ "first_seen": "2026-07-23T04:07:13.798Z",
+ "last_seen": "2026-07-23T04:07:13.798Z",
+ "seen_count": 1,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-07-23T04:07:13.798Z",
+ "event": "created",
+ "snapshot": {
+ "title": "SummerHill Apartment Communities Breaks Ground on New 251-Unit Bay Area Res Development",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34202",
+ "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."
+ }
+ }
+ ]
+ },
+ "34203": {
+ "id": "34203",
+ "current": {
+ "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."
+ },
+ "first_seen": "2026-07-23T04:07:13.798Z",
+ "last_seen": "2026-07-23T04:07:13.798Z",
+ "seen_count": 1,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-07-23T04:07:13.798Z",
+ "event": "created",
+ "snapshot": {
+ "title": "The Bascom Group Pays Over $53 Mil for OC Res Community",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34203",
+ "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."
+ }
+ }
+ ]
+ },
+ "34204": {
+ "id": "34204",
+ "current": {
+ "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."
+ },
+ "first_seen": "2026-07-23T04:07:13.798Z",
+ "last_seen": "2026-08-05T19:53:22.976Z",
+ "seen_count": 2,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-07-23T04:07:13.798Z",
+ "event": "created",
+ "snapshot": {
+ "title": "Oceanside Res Community Trades for $77.5 Mil",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34204",
+ "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."
+ }
+ }
+ ]
+ },
+ "34208": {
+ "id": "34208",
+ "current": {
+ "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."
+ },
+ "first_seen": "2026-07-23T04:07:13.798Z",
+ "last_seen": "2026-08-05T19:53:22.976Z",
+ "seen_count": 2,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-07-23T04:07:13.798Z",
+ "event": "created",
+ "snapshot": {
+ "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",
+ "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."
+ }
+ }
+ ]
+ },
+ "34210": {
+ "id": "34210",
+ "current": {
+ "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 markets premier South King County industrial corridor, were acquired on behalf of BKM Industrial Value Fund III."
+ },
+ "first_seen": "2026-07-23T04:07:13.798Z",
+ "last_seen": "2026-08-05T19:53:22.976Z",
+ "seen_count": 2,
+ "revisions": 2,
+ "history": [
+ {
+ "ts": "2026-07-23T04:07:13.798Z",
+ "event": "created",
+ "snapshot": {
+ "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",
+ "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 markets premier South King County industrial corridor, were acquired on behalf of BKM Industrial Value Fund III."
+ }
+ },
+ {
+ "ts": "2026-08-05T19:53:22.976Z",
+ "event": "changed",
+ "changes": [
+ {
+ "field": "city",
+ "from": "Seattle",
+ "to": "Tukwila"
+ }
+ ],
+ "snapshot": {
+ "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",
+ "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 markets premier South King County industrial corridor, were acquired on behalf of BKM Industrial Value Fund III."
+ }
+ }
+ ]
+ },
+ "34214": {
+ "id": "34214",
+ "current": {
+ "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."
+ },
+ "first_seen": "2026-07-23T04:07:13.798Z",
+ "last_seen": "2026-08-05T19:53:22.976Z",
+ "seen_count": 2,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-07-23T04:07:13.798Z",
+ "event": "created",
+ "snapshot": {
+ "title": "Intercontinental Real Estate Corporation Closes $69 Mil Retail Buy in Washington",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34214",
+ "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."
+ }
+ }
+ ]
+ },
+ "34216": {
+ "id": "34216",
+ "current": {
+ "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."
+ },
+ "first_seen": "2026-07-23T04:07:13.798Z",
+ "last_seen": "2026-08-05T19:53:22.976Z",
+ "seen_count": 2,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-07-23T04:07:13.798Z",
+ "event": "created",
+ "snapshot": {
+ "title": "Meta Housing Well Underway with 300-Unit Res Community in Woodland Hills",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34216",
+ "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."
+ }
+ }
+ ]
+ },
+ "34218": {
+ "id": "34218",
+ "current": {
+ "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."
+ },
+ "first_seen": "2026-07-23T04:07:13.798Z",
+ "last_seen": "2026-08-05T19:53:22.976Z",
+ "seen_count": 2,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-07-23T04:07:13.798Z",
+ "event": "created",
+ "snapshot": {
+ "title": "Camden Property Trust Buys Gilbert, AZ Res Community in $124 Mil Deal",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34218",
+ "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."
+ }
+ }
+ ]
+ },
+ "34224": {
+ "id": "34224",
+ "current": {
+ "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."
+ },
+ "first_seen": "2026-07-23T04:07:13.798Z",
+ "last_seen": "2026-08-05T19:53:22.976Z",
+ "seen_count": 2,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-07-23T04:07:13.798Z",
+ "event": "created",
+ "snapshot": {
+ "title": "Shorenstein Buys 77k sf Bay Area Office Building",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34224",
+ "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."
+ }
+ }
+ ]
+ },
+ "34225": {
+ "id": "34225",
+ "current": {
+ "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": "Inland Empire",
+ "state": "CA",
+ "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."
+ },
+ "first_seen": "2026-07-23T04:07:13.798Z",
+ "last_seen": "2026-08-05T19:53:22.976Z",
+ "seen_count": 2,
+ "revisions": 2,
+ "history": [
+ {
+ "ts": "2026-07-23T04:07:13.798Z",
+ "event": "created",
+ "snapshot": {
+ "title": "CentrePoint Properties Spends $30 Mil on Trio of Colorado Retail Assets",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34225",
+ "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."
+ }
+ },
+ {
+ "ts": "2026-08-05T19:53:22.976Z",
+ "event": "changed",
+ "changes": [
+ {
+ "field": "city",
+ "from": null,
+ "to": "Inland Empire"
+ },
+ {
+ "field": "state",
+ "from": null,
+ "to": "CA"
+ }
+ ],
+ "snapshot": {
+ "title": "CentrePoint Properties Spends $30 Mil on Trio of Colorado Retail Assets",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34225",
+ "txn_type": "Sale",
+ "property_type": "Retail",
+ "city": "Inland Empire",
+ "state": "CA",
+ "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."
+ }
+ }
+ ]
+ },
+ "34226": {
+ "id": "34226",
+ "current": {
+ "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."
+ },
+ "first_seen": "2026-07-23T04:07:13.798Z",
+ "last_seen": "2026-08-05T19:53:22.976Z",
+ "seen_count": 2,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-07-23T04:07:13.798Z",
+ "event": "created",
+ "snapshot": {
+ "title": "Carson Distribution Facility Acquired by WareSpace in a $23 Mil Deal",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34226",
+ "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."
+ }
+ }
+ ]
+ },
+ "34227": {
+ "id": "34227",
+ "current": {
+ "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."
+ },
+ "first_seen": "2026-07-23T04:07:13.798Z",
+ "last_seen": "2026-08-05T19:53:22.976Z",
+ "seen_count": 2,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-07-23T04:07:13.798Z",
+ "event": "created",
+ "snapshot": {
+ "title": "MG Properties Buys 188-Unit Portland Res Asset",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34227",
+ "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."
+ }
+ }
+ ]
+ },
+ "34233": {
+ "id": "34233",
+ "current": {
+ "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)."
+ },
+ "first_seen": "2026-07-23T04:07:13.798Z",
+ "last_seen": "2026-08-05T19:53:22.976Z",
+ "seen_count": 2,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-07-23T04:07:13.798Z",
+ "event": "created",
+ "snapshot": {
+ "title": "Tailwind Investment Group Spends $65 Mil on Two Sacramento Res Properties",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34233",
+ "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)."
+ }
+ }
+ ]
+ },
+ "34235": {
+ "id": "34235",
+ "current": {
+ "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."
+ },
+ "first_seen": "2026-07-23T04:07:13.798Z",
+ "last_seen": "2026-08-05T19:53:22.976Z",
+ "seen_count": 2,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-07-23T04:07:13.798Z",
+ "event": "created",
+ "snapshot": {
+ "title": "Retail Portfolio in Downtown Long Beach Fetches $30 Mil",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34235",
+ "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."
+ }
+ }
+ ]
+ },
+ "34236": {
+ "id": "34236",
+ "current": {
+ "id": "34236",
+ "title": "The Swig Company Obtains Refi on Office High-Rise in San Franciscos 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."
+ },
+ "first_seen": "2026-07-23T04:07:13.798Z",
+ "last_seen": "2026-08-05T19:53:22.976Z",
+ "seen_count": 2,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-07-23T04:07:13.798Z",
+ "event": "created",
+ "snapshot": {
+ "title": "The Swig Company Obtains Refi on Office High-Rise in San Franciscos Financial District",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34236",
+ "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."
+ }
+ }
+ ]
+ },
+ "34238": {
+ "id": "34238",
+ "current": {
+ "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."
+ },
+ "first_seen": "2026-07-23T04:07:13.798Z",
+ "last_seen": "2026-08-05T19:53:22.976Z",
+ "seen_count": 2,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-07-23T04:07:13.798Z",
+ "event": "created",
+ "snapshot": {
+ "title": "Gilbert, AZ Multifamily Community Refinanced with New Loan for $51.8 Mil",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34238",
+ "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."
+ }
+ }
+ ]
+ },
+ "34239": {
+ "id": "34239",
+ "current": {
+ "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)."
+ },
+ "first_seen": "2026-07-23T04:07:13.798Z",
+ "last_seen": "2026-08-05T19:53:22.976Z",
+ "seen_count": 2,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-07-23T04:07:13.798Z",
+ "event": "created",
+ "snapshot": {
+ "title": "Fresno Multifamily Sale Works Out to $177k per Unit",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34239",
+ "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)."
+ }
+ }
+ ]
+ },
+ "34245": {
+ "id": "34245",
+ "current": {
+ "id": "34245",
+ "title": "Velo3D Leases 289k sf Bay Area Manufacturing Facility",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34245",
+ "image": "/img/news/news_20302_711ChallengerStLivermoreKaylaCastroColliersJul212026.jpg",
+ "txn_type": "Lease",
+ "property_type": "Industrial",
+ "city": "Livermore",
+ "state": "CA",
+ "amount": 55800000,
+ "amount_label": "$55.8M",
+ "size_label": "40 acres",
+ "units": null,
+ "sqft": null,
+ "address": "711 Challenger St",
+ "occupancy_pct": null,
+ "year_built": null,
+ "summary": "Velo3D has leased a 288. 7k sf facility in Livermore, CA in a $55."
+ },
+ "first_seen": "2026-08-05T19:53:22.976Z",
+ "last_seen": "2026-08-05T19:53:22.976Z",
+ "seen_count": 1,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-08-05T19:53:22.976Z",
+ "event": "created",
+ "snapshot": {
+ "title": "Velo3D Leases 289k sf Bay Area Manufacturing Facility",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34245",
+ "txn_type": "Lease",
+ "property_type": "Industrial",
+ "city": "Livermore",
+ "state": "CA",
+ "amount": 55800000,
+ "amount_label": "$55.8M",
+ "size_label": "40 acres",
+ "units": null,
+ "sqft": null,
+ "address": "711 Challenger St",
+ "occupancy_pct": null,
+ "year_built": null,
+ "summary": "Velo3D has leased a 288. 7k sf facility in Livermore, CA in a $55."
+ }
+ }
+ ]
+ },
+ "34248": {
+ "id": "34248",
+ "current": {
+ "id": "34248",
+ "title": "SFF Realty Buys 104k sf Silicon Valley Office/R&D Property",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34248",
+ "image": "/img/news/news_20306_384SantaTrinitaAveSunnyvaleNickTrombolaNWMKJul232026.jpg",
+ "txn_type": "Sale",
+ "property_type": "Office",
+ "city": "Sunnyvale. Located",
+ "state": null,
+ "amount": null,
+ "amount_label": null,
+ "size_label": "26 SF · 4.6 acres",
+ "units": null,
+ "sqft": 26,
+ "address": "384 Santa Trinita Ave",
+ "occupancy_pct": null,
+ "year_built": null,
+ "summary": "SFF Realty recently acquired a four-story, 104. 5k sf, Class A office/R&D building in Sunnyvale."
+ },
+ "first_seen": "2026-08-05T19:53:22.976Z",
+ "last_seen": "2026-08-05T19:53:22.976Z",
+ "seen_count": 1,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-08-05T19:53:22.976Z",
+ "event": "created",
+ "snapshot": {
+ "title": "SFF Realty Buys 104k sf Silicon Valley Office/R&D Property",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34248",
+ "txn_type": "Sale",
+ "property_type": "Office",
+ "city": "Sunnyvale. Located",
+ "state": null,
+ "amount": null,
+ "amount_label": null,
+ "size_label": "26 SF · 4.6 acres",
+ "units": null,
+ "sqft": 26,
+ "address": "384 Santa Trinita Ave",
+ "occupancy_pct": null,
+ "year_built": null,
+ "summary": "SFF Realty recently acquired a four-story, 104. 5k sf, Class A office/R&D building in Sunnyvale."
+ }
+ }
+ ]
+ },
+ "34251": {
+ "id": "34251",
+ "current": {
+ "id": "34251",
+ "title": "Granite Towers Equity Group Buys 229-Unit Texas Multifamily Asset",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34251",
+ "image": "/img/news/news_20309_2525PrestonRdPlanoKellyMcGarryNWMKJul152026.jpg",
+ "txn_type": "Sale",
+ "property_type": "Office",
+ "city": "Plano",
+ "state": "TX",
+ "amount": null,
+ "amount_label": null,
+ "size_label": "229 units",
+ "units": 229,
+ "sqft": null,
+ "address": "2525 Preston Road",
+ "occupancy_pct": null,
+ "year_built": null,
+ "summary": "Granite Towers Equity Group purchased Hathaway at Willow Bend, a 229-unit multifamily community located at 2525 Preston Road in Plano, TX. The property was sold by S2 Capital."
+ },
+ "first_seen": "2026-08-05T19:53:22.976Z",
+ "last_seen": "2026-08-05T19:53:22.976Z",
+ "seen_count": 1,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-08-05T19:53:22.976Z",
+ "event": "created",
+ "snapshot": {
+ "title": "Granite Towers Equity Group Buys 229-Unit Texas Multifamily Asset",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34251",
+ "txn_type": "Sale",
+ "property_type": "Office",
+ "city": "Plano",
+ "state": "TX",
+ "amount": null,
+ "amount_label": null,
+ "size_label": "229 units",
+ "units": 229,
+ "sqft": null,
+ "address": "2525 Preston Road",
+ "occupancy_pct": null,
+ "year_built": null,
+ "summary": "Granite Towers Equity Group purchased Hathaway at Willow Bend, a 229-unit multifamily community located at 2525 Preston Road in Plano, TX. The property was sold by S2 Capital."
+ }
+ }
+ ]
+ },
+ "34255": {
+ "id": "34255",
+ "current": {
+ "id": "34255",
+ "title": "CapRock Partners Signs Tenant at 1.27 msf Facility in Visalia",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34255",
+ "image": "",
+ "txn_type": "Lease",
+ "property_type": "Office",
+ "city": "Inland Empire",
+ "state": "CA",
+ "amount": null,
+ "amount_label": null,
+ "size_label": "6,600 SF · 75 acres",
+ "units": null,
+ "sqft": 6600,
+ "address": "4001 N. Pl",
+ "occupancy_pct": null,
+ "year_built": null,
+ "summary": "Building 1 at CapRock Central Point III, a four-building, 2. 7 msf speculative industrial development in Visalia, has been fully leased to an undisclosed global corporate tenant."
+ },
+ "first_seen": "2026-08-05T19:53:22.976Z",
+ "last_seen": "2026-08-05T19:53:22.976Z",
+ "seen_count": 1,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-08-05T19:53:22.976Z",
+ "event": "created",
+ "snapshot": {
+ "title": "CapRock Partners Signs Tenant at 1.27 msf Facility in Visalia",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34255",
+ "txn_type": "Lease",
+ "property_type": "Office",
+ "city": "Inland Empire",
+ "state": "CA",
+ "amount": null,
+ "amount_label": null,
+ "size_label": "6,600 SF · 75 acres",
+ "units": null,
+ "sqft": 6600,
+ "address": "4001 N. Pl",
+ "occupancy_pct": null,
+ "year_built": null,
+ "summary": "Building 1 at CapRock Central Point III, a four-building, 2. 7 msf speculative industrial development in Visalia, has been fully leased to an undisclosed global corporate tenant."
+ }
+ }
+ ]
+ },
+ "34256": {
+ "id": "34256",
+ "current": {
+ "id": "34256",
+ "title": "Washington Industrial Facility Sells in $174 Mil Transaction",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34256",
+ "image": "/img/news/news_20313_6920192ndStreetEFredericksonWASavannahDurbanCWJul272026.jpg",
+ "txn_type": "Sale",
+ "property_type": "Industrial",
+ "city": "Frederickson",
+ "state": "WA",
+ "amount": 174000000,
+ "amount_label": "$174.0M",
+ "size_label": null,
+ "units": null,
+ "sqft": null,
+ "address": null,
+ "occupancy_pct": null,
+ "year_built": 2024,
+ "summary": "A 782. 8k sf industrial facility in Frederickson, WA traded hands in a recent $174 mil ($222/sf) transaction."
+ },
+ "first_seen": "2026-08-05T19:53:22.976Z",
+ "last_seen": "2026-08-05T19:53:22.976Z",
+ "seen_count": 1,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-08-05T19:53:22.976Z",
+ "event": "created",
+ "snapshot": {
+ "title": "Washington Industrial Facility Sells in $174 Mil Transaction",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34256",
+ "txn_type": "Sale",
+ "property_type": "Industrial",
+ "city": "Frederickson",
+ "state": "WA",
+ "amount": 174000000,
+ "amount_label": "$174.0M",
+ "size_label": null,
+ "units": null,
+ "sqft": null,
+ "address": null,
+ "occupancy_pct": null,
+ "year_built": 2024,
+ "summary": "A 782. 8k sf industrial facility in Frederickson, WA traded hands in a recent $174 mil ($222/sf) transaction."
+ }
+ }
+ ]
+ },
+ "34260": {
+ "id": "34260",
+ "current": {
+ "id": "34260",
+ "title": "Oxnard Independent Living Facility Lands New Owner",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34260",
+ "image": "/img/news/news_20318_ClearwateratRiverparkOxnardKristenMurphyJLLJul282026.jpg",
+ "txn_type": "Sale",
+ "property_type": "Retail",
+ "city": "Inland Empire",
+ "state": "CA",
+ "amount": null,
+ "amount_label": null,
+ "size_label": "136 units · 809 SF · 3.8 acres",
+ "units": 136,
+ "sqft": 809,
+ "address": "750 Clyde River Pl",
+ "occupancy_pct": null,
+ "year_built": 2018,
+ "summary": "Clearwater at Riverpark, a 136-unit Class A independent living community in Oxnard, was acquired by an unnamed S&P 500 company focused on senior housing. Built in 2018 within the master-planned Riverpark development, Clearwater at Riverpark is located at 750 Clyde River Place."
+ },
+ "first_seen": "2026-08-05T19:53:22.976Z",
+ "last_seen": "2026-08-05T19:53:22.976Z",
+ "seen_count": 1,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-08-05T19:53:22.976Z",
+ "event": "created",
+ "snapshot": {
+ "title": "Oxnard Independent Living Facility Lands New Owner",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34260",
+ "txn_type": "Sale",
+ "property_type": "Retail",
+ "city": "Inland Empire",
+ "state": "CA",
+ "amount": null,
+ "amount_label": null,
+ "size_label": "136 units · 809 SF · 3.8 acres",
+ "units": 136,
+ "sqft": 809,
+ "address": "750 Clyde River Pl",
+ "occupancy_pct": null,
+ "year_built": 2018,
+ "summary": "Clearwater at Riverpark, a 136-unit Class A independent living community in Oxnard, was acquired by an unnamed S&P 500 company focused on senior housing. Built in 2018 within the master-planned Riverpark development, Clearwater at Riverpark is located at 750 Clyde River Place."
+ }
+ }
+ ]
+ },
+ "34261": {
+ "id": "34261",
+ "current": {
+ "id": "34261",
+ "title": "The Dinerstein Companies and PGIM Score $81 Mil Refi on Recently Completed Denver Area Multifamily Development",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34261",
+ "image": "/img/news/news_20319_7800EParkviewAveDenverBrandonBeckDBRJul282026.jpg",
+ "txn_type": "Financing",
+ "property_type": "Multifamily",
+ "city": "Denver",
+ "state": "CO",
+ "amount": 81000000,
+ "amount_label": "$81.0M",
+ "size_label": "330 units",
+ "units": 330,
+ "sqft": null,
+ "address": "7800 E Parkview Ave",
+ "occupancy_pct": 85,
+ "year_built": null,
+ "summary": "Atlas Peakview, a recently completed 330-unit multifamily community in the Denver suburb of Centennial, has been refinanced with a new $81 mil short-term, first-mortgage loan provided by Mesa West Capital. The property, delivered in 2025, is owned by a joint venture between The Dinerstein Companies and PGIM."
+ },
+ "first_seen": "2026-08-05T19:53:22.976Z",
+ "last_seen": "2026-08-05T19:53:22.976Z",
+ "seen_count": 1,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-08-05T19:53:22.976Z",
+ "event": "created",
+ "snapshot": {
+ "title": "The Dinerstein Companies and PGIM Score $81 Mil Refi on Recently Completed Denver Area Multifamily Development",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34261",
+ "txn_type": "Financing",
+ "property_type": "Multifamily",
+ "city": "Denver",
+ "state": "CO",
+ "amount": 81000000,
+ "amount_label": "$81.0M",
+ "size_label": "330 units",
+ "units": 330,
+ "sqft": null,
+ "address": "7800 E Parkview Ave",
+ "occupancy_pct": 85,
+ "year_built": null,
+ "summary": "Atlas Peakview, a recently completed 330-unit multifamily community in the Denver suburb of Centennial, has been refinanced with a new $81 mil short-term, first-mortgage loan provided by Mesa West Capital. The property, delivered in 2025, is owned by a joint venture between The Dinerstein Companies and PGIM."
+ }
+ }
+ ]
+ },
+ "34264": {
+ "id": "34264",
+ "current": {
+ "id": "34264",
+ "title": "Santa Monica Multifamily Property Fetches $928k per Unit",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34264",
+ "image": "/img/news/news_20322_901OceanAveSMonicaAnneMonaghanCBREJul282026.jpg",
+ "txn_type": "Sale",
+ "property_type": "Multifamily",
+ "city": "Santa Monica",
+ "state": "CA",
+ "amount": 928000,
+ "amount_label": "$928,000",
+ "size_label": "28 units",
+ "units": 28,
+ "sqft": null,
+ "address": "901 Ocean Ave",
+ "occupancy_pct": null,
+ "year_built": null,
+ "summary": "A 28-unit coastal multifamily investment property located along Santa Monicas Ocean Avenue corridor sold for $23. 46 mil, with the buyer assuming approximately $2."
+ },
+ "first_seen": "2026-08-05T19:53:22.976Z",
+ "last_seen": "2026-08-05T19:53:22.976Z",
+ "seen_count": 1,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-08-05T19:53:22.976Z",
+ "event": "created",
+ "snapshot": {
+ "title": "Santa Monica Multifamily Property Fetches $928k per Unit",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34264",
+ "txn_type": "Sale",
+ "property_type": "Multifamily",
+ "city": "Santa Monica",
+ "state": "CA",
+ "amount": 928000,
+ "amount_label": "$928,000",
+ "size_label": "28 units",
+ "units": 28,
+ "sqft": null,
+ "address": "901 Ocean Ave",
+ "occupancy_pct": null,
+ "year_built": null,
+ "summary": "A 28-unit coastal multifamily investment property located along Santa Monicas Ocean Avenue corridor sold for $23. 46 mil, with the buyer assuming approximately $2."
+ }
+ }
+ ]
+ },
+ "34265": {
+ "id": "34265",
+ "current": {
+ "id": "34265",
+ "title": "Longpoint Partners Closes $34.6 Mil AZ Industrial Buy",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34265",
+ "image": "/img/news/news_20323_250EElliotRdChandlerAZSavannahDurbanJul282026.jpg",
+ "txn_type": "Sale",
+ "property_type": "Industrial",
+ "city": "Inland Empire",
+ "state": "CA",
+ "amount": 34600000,
+ "amount_label": "$34.6M",
+ "size_label": null,
+ "units": null,
+ "sqft": null,
+ "address": "3191 N. Washington St",
+ "occupancy_pct": null,
+ "year_built": null,
+ "summary": "Longpoint Partners has purchased Eastpoint I & II, a two-building, 136. 6k sf institutional-quality industrial business park in the highly sought-after Chandler submarket of Phoenix."
+ },
+ "first_seen": "2026-08-05T19:53:22.976Z",
+ "last_seen": "2026-08-05T19:53:22.976Z",
+ "seen_count": 1,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-08-05T19:53:22.976Z",
+ "event": "created",
+ "snapshot": {
+ "title": "Longpoint Partners Closes $34.6 Mil AZ Industrial Buy",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34265",
+ "txn_type": "Sale",
+ "property_type": "Industrial",
+ "city": "Inland Empire",
+ "state": "CA",
+ "amount": 34600000,
+ "amount_label": "$34.6M",
+ "size_label": null,
+ "units": null,
+ "sqft": null,
+ "address": "3191 N. Washington St",
+ "occupancy_pct": null,
+ "year_built": null,
+ "summary": "Longpoint Partners has purchased Eastpoint I & II, a two-building, 136. 6k sf institutional-quality industrial business park in the highly sought-after Chandler submarket of Phoenix."
+ }
+ }
+ ]
+ },
+ "34269": {
+ "id": "34269",
+ "current": {
+ "id": "34269",
+ "title": "Sentinel Real Estate Buys 293-Unit Res Property in Folsom, CA",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34269",
+ "image": "/img/news/news_20328_1550BroadstonePkwyFolsomOliviaValloneCBREJul302026.jpg",
+ "txn_type": "Sale",
+ "property_type": "Multifamily",
+ "city": "Folsom",
+ "state": "CA",
+ "amount": null,
+ "amount_label": null,
+ "size_label": "293 units",
+ "units": 293,
+ "sqft": null,
+ "address": "1550 Broadstone Pkwy",
+ "occupancy_pct": 96,
+ "year_built": 2020,
+ "summary": "New York-based Sentinel Real Estate has acquired Talavera, a 293-unit apartment community in Folsom, CA. We�re told that Talavera was the first asset to become available in the Folsom submarket in four years."
+ },
+ "first_seen": "2026-08-05T19:53:22.976Z",
+ "last_seen": "2026-08-05T19:53:22.976Z",
+ "seen_count": 1,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-08-05T19:53:22.976Z",
+ "event": "created",
+ "snapshot": {
+ "title": "Sentinel Real Estate Buys 293-Unit Res Property in Folsom, CA",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34269",
+ "txn_type": "Sale",
+ "property_type": "Multifamily",
+ "city": "Folsom",
+ "state": "CA",
+ "amount": null,
+ "amount_label": null,
+ "size_label": "293 units",
+ "units": 293,
+ "sqft": null,
+ "address": "1550 Broadstone Pkwy",
+ "occupancy_pct": 96,
+ "year_built": 2020,
+ "summary": "New York-based Sentinel Real Estate has acquired Talavera, a 293-unit apartment community in Folsom, CA. We�re told that Talavera was the first asset to become available in the Folsom submarket in four years."
+ }
+ }
+ ]
+ },
+ "34272": {
+ "id": "34272",
+ "current": {
+ "id": "34272",
+ "title": "PCCP and Stonemont Acquire 5.9 msf Industrial Portfolio",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34272",
+ "image": "",
+ "txn_type": "Sale",
+ "property_type": "Industrial",
+ "city": "Inland Empire",
+ "state": "CA",
+ "amount": null,
+ "amount_label": null,
+ "size_label": null,
+ "units": null,
+ "sqft": null,
+ "address": null,
+ "occupancy_pct": 95,
+ "year_built": null,
+ "summary": "A joint venture between PCCP and Stonemont has acquired a 38-asset, 5. 9 msf industrial portfolio diversified across 14 U."
+ },
+ "first_seen": "2026-08-05T19:53:22.976Z",
+ "last_seen": "2026-08-05T19:53:22.976Z",
+ "seen_count": 1,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-08-05T19:53:22.976Z",
+ "event": "created",
+ "snapshot": {
+ "title": "PCCP and Stonemont Acquire 5.9 msf Industrial Portfolio",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34272",
+ "txn_type": "Sale",
+ "property_type": "Industrial",
+ "city": "Inland Empire",
+ "state": "CA",
+ "amount": null,
+ "amount_label": null,
+ "size_label": null,
+ "units": null,
+ "sqft": null,
+ "address": null,
+ "occupancy_pct": 95,
+ "year_built": null,
+ "summary": "A joint venture between PCCP and Stonemont has acquired a 38-asset, 5. 9 msf industrial portfolio diversified across 14 U."
+ }
+ }
+ ]
+ },
+ "34274": {
+ "id": "34274",
+ "current": {
+ "id": "34274",
+ "title": "GO Industrial Starts Work on 1.1 msf Industrial Facility in Phoenix",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34274",
+ "image": "/img/news/news_20332_9797WBuckeyeRdPhnxSavannahDurbanCWJul272026.jpg",
+ "txn_type": "Sale",
+ "property_type": "Industrial",
+ "city": "Phoenix",
+ "state": "AZ",
+ "amount": null,
+ "amount_label": null,
+ "size_label": null,
+ "units": null,
+ "sqft": null,
+ "address": "9797 W. Buckeye Rd",
+ "occupancy_pct": null,
+ "year_built": null,
+ "summary": "GO Industrial has broken ground on a 1. 1 msf industrial building in Phoenix."
+ },
+ "first_seen": "2026-08-05T19:53:22.976Z",
+ "last_seen": "2026-08-05T19:53:22.976Z",
+ "seen_count": 1,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-08-05T19:53:22.976Z",
+ "event": "created",
+ "snapshot": {
+ "title": "GO Industrial Starts Work on 1.1 msf Industrial Facility in Phoenix",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34274",
+ "txn_type": "Sale",
+ "property_type": "Industrial",
+ "city": "Phoenix",
+ "state": "AZ",
+ "amount": null,
+ "amount_label": null,
+ "size_label": null,
+ "units": null,
+ "sqft": null,
+ "address": "9797 W. Buckeye Rd",
+ "occupancy_pct": null,
+ "year_built": null,
+ "summary": "GO Industrial has broken ground on a 1. 1 msf industrial building in Phoenix."
+ }
+ }
+ ]
+ },
+ "34276": {
+ "id": "34276",
+ "current": {
+ "id": "34276",
+ "title": "Gemdale USA Secures $90 Mil in New Financing on 538k sf San Diego Life Science Campus",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34276",
+ "image": "/img/news/news_20334_ApertureDelMarSDIANPATZKERPHOTOJustinaRubinsteinJul232026.jpg",
+ "txn_type": "Financing",
+ "property_type": "Medical/Life Science",
+ "city": "San Diego",
+ "state": "CA",
+ "amount": 90000000,
+ "amount_label": "$90.0M",
+ "size_label": null,
+ "units": null,
+ "sqft": null,
+ "address": null,
+ "occupancy_pct": null,
+ "year_built": null,
+ "summary": "Gemdale USA has obtained a $90 mil mezzanine bridge loan for Aperture Del Mar, a newly constructed, 538k sf Class A life science campus in San Diego. The financing, provided by Breakthrough Properties and Tishman Speyer, will be used to refinance an existing loan."
+ },
+ "first_seen": "2026-08-05T19:53:22.976Z",
+ "last_seen": "2026-08-05T19:53:22.976Z",
+ "seen_count": 1,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-08-05T19:53:22.976Z",
+ "event": "created",
+ "snapshot": {
+ "title": "Gemdale USA Secures $90 Mil in New Financing on 538k sf San Diego Life Science Campus",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34276",
+ "txn_type": "Financing",
+ "property_type": "Medical/Life Science",
+ "city": "San Diego",
+ "state": "CA",
+ "amount": 90000000,
+ "amount_label": "$90.0M",
+ "size_label": null,
+ "units": null,
+ "sqft": null,
+ "address": null,
+ "occupancy_pct": null,
+ "year_built": null,
+ "summary": "Gemdale USA has obtained a $90 mil mezzanine bridge loan for Aperture Del Mar, a newly constructed, 538k sf Class A life science campus in San Diego. The financing, provided by Breakthrough Properties and Tishman Speyer, will be used to refinance an existing loan."
+ }
+ }
+ ]
+ },
+ "34282": {
+ "id": "34282",
+ "current": {
+ "id": "34282",
+ "title": "Step Up Housing Acquires Two California Multifamily Communities in Deals Totaling $91 Mil",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34282",
+ "image": "/img/news/news_20339_6430VernerAveSacramentoJulieChaseAug32026.jpg",
+ "txn_type": "Sale",
+ "property_type": "Multifamily",
+ "city": "Sacramento",
+ "state": "CA",
+ "amount": 91000000,
+ "amount_label": "$91.0M",
+ "size_label": "406 units · 669 SF",
+ "units": 406,
+ "sqft": 669,
+ "address": "6430 Verner Ave",
+ "occupancy_pct": 95,
+ "year_built": 1987,
+ "summary": "Step Up Housing recently acquired two California multifamily communities totaling 406 units -- Copper Creek, a 268-unit community in Sacramento, and Terramonte at Foothill, a 138-unit community in Pomona for a combined price of $91. 35 mil."
+ },
+ "first_seen": "2026-08-05T19:53:22.976Z",
+ "last_seen": "2026-08-05T19:53:22.976Z",
+ "seen_count": 1,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-08-05T19:53:22.976Z",
+ "event": "created",
+ "snapshot": {
+ "title": "Step Up Housing Acquires Two California Multifamily Communities in Deals Totaling $91 Mil",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34282",
+ "txn_type": "Sale",
+ "property_type": "Multifamily",
+ "city": "Sacramento",
+ "state": "CA",
+ "amount": 91000000,
+ "amount_label": "$91.0M",
+ "size_label": "406 units · 669 SF",
+ "units": 406,
+ "sqft": 669,
+ "address": "6430 Verner Ave",
+ "occupancy_pct": 95,
+ "year_built": 1987,
+ "summary": "Step Up Housing recently acquired two California multifamily communities totaling 406 units -- Copper Creek, a 268-unit community in Sacramento, and Terramonte at Foothill, a 138-unit community in Pomona for a combined price of $91. 35 mil."
+ }
+ }
+ ]
+ },
+ "34284": {
+ "id": "34284",
+ "current": {
+ "id": "34284",
+ "title": "Colrich Closes $52 Mil AZ Apartment Buy",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34284",
+ "image": "/img/news/news_20342_Avia266MesaAZKimHoidalCBREAug32026.jpg",
+ "txn_type": "Sale",
+ "property_type": "Multifamily",
+ "city": "Mesa",
+ "state": "AZ",
+ "amount": 52000000,
+ "amount_label": "$52.0M",
+ "size_label": "267 units",
+ "units": 267,
+ "sqft": null,
+ "address": null,
+ "occupancy_pct": null,
+ "year_built": null,
+ "summary": "San Diego-based ColRich acquired Avia 266, a 267-unit multifamily community in Mesa, AZ, in a $52. 4 mil ($196k/unit) transaction, including the assumption of an existing HUD loan."
+ },
+ "first_seen": "2026-08-05T19:53:22.976Z",
+ "last_seen": "2026-08-05T19:53:22.976Z",
+ "seen_count": 1,
+ "revisions": 1,
+ "history": [
+ {
+ "ts": "2026-08-05T19:53:22.976Z",
+ "event": "created",
+ "snapshot": {
+ "title": "Colrich Closes $52 Mil AZ Apartment Buy",
+ "url": "https://www.rentv.com/content/homepage/mainnews/news/34284",
+ "txn_type": "Sale",
+ "property_type": "Multifamily",
+ "city": "Mesa",
+ "state": "AZ",
+ "amount": 52000000,
+ "amount_label": "$52.0M",
+ "size_label": "267 units",
+ "units": 267,
+ "sqft": null,
+ "address": null,
+ "occupancy_pct": null,
+ "year_built": null,
+ "summary": "San Diego-based ColRich acquired Avia 266, a 267-unit multifamily community in Mesa, AZ, in a $52. 4 mil ($196k/unit) transaction, including the assumption of an existing HUD loan."
+ }
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/public/backend.html b/public/backend.html
index e9e9e894..d1db7f9e 100644
--- a/public/backend.html
+++ b/public/backend.html
@@ -40,6 +40,7 @@
<a class="card" href="/desk-admin"><div class="ico">✍️</div><b>Desk Admin</b><span>Add / withdraw sublease inventory</span></a>
<a class="card" href="/admin/pr-intelligence"><div class="ico">📡</div><b>CRE PR Intelligence</b><span>CA/AZ press-contact research · letters · replies</span></a>
<a class="card" href="/closings"><div class="ico">🏠</div><b>Property Closings</b><span>Every reported closed sale · address · date · price</span></a>
+ <a class="card" href="/deals-log.html"><div class="ico">📒</div><b>Deals Log</b><span>Every deal ever found from rentv.com + per-deal change history</span></a>
</div>
<div class="sect">Build & Dashboards</div>
diff --git a/public/deals-log.html b/public/deals-log.html
new file mode 100644
index 00000000..820e3be1
--- /dev/null
+++ b/public/deals-log.html
@@ -0,0 +1,172 @@
+<!doctype html>
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<title>RENTV — Deals Log · every deal ever found + change history</title>
+<style>
+ :root{ --a:#c8102e; --ink:#14171a; --sub:#5b636b; --ln:#e4e7ea; --bg:#fff; --wa:#f5f6f8; --ok:#1a7f37; --chg:#b8860b; }
+ *{box-sizing:border-box}
+ body{margin:0;background:var(--wa);color:var(--ink);font:14px/1.5 'Inter',system-ui,-apple-system,sans-serif}
+ header{background:var(--bg);border-bottom:2px solid var(--a);padding:14px 22px;position:sticky;top:0;z-index:10;display:flex;align-items:baseline;gap:14px;flex-wrap:wrap}
+ header h1{font:700 19px/1 'Playfair Display',Georgia,serif;margin:0}
+ header h1 span{color:var(--a)}
+ header .meta{font-size:12px;color:var(--sub)} header .meta b{color:var(--ink)}
+ .bar{background:var(--bg);border-bottom:1px solid var(--ln);padding:11px 22px;display:flex;gap:10px;flex-wrap:wrap;align-items:center;position:sticky;top:49px;z-index:9}
+ .bar input[type=text]{flex:1;min-width:220px;padding:8px 11px;border:1px solid var(--ln);border-radius:8px;font-size:13px}
+ .bar select,.bar button{padding:7px 10px;border:1px solid var(--ln);border-radius:8px;background:var(--bg);font-size:12px;cursor:pointer}
+ .bar .chip{padding:6px 11px;border:1px solid var(--ln);border-radius:16px;background:var(--bg);font-size:12px;cursor:pointer;user-select:none}
+ .bar .chip.on{border-color:var(--a);color:var(--a);background:rgba(200,16,46,.06)}
+ .cols{padding:8px 22px;background:var(--bg);border-bottom:1px solid var(--ln);font-size:11px;color:var(--sub);display:flex;gap:12px;flex-wrap:wrap;align-items:center}
+ .cols label{display:inline-flex;align-items:center;gap:4px;cursor:pointer}
+ .wrap{padding:16px 22px 60px}
+ table{width:100%;border-collapse:collapse;background:var(--bg);font-size:13px}
+ th,td{text-align:left;padding:9px 11px;border-bottom:1px solid var(--ln);vertical-align:top}
+ th{position:sticky;top:96px;background:var(--wa);font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--sub);cursor:pointer;user-select:none;white-space:nowrap}
+ th.asc::after{content:' ▲';color:var(--a)} th.desc::after{content:' ▼';color:var(--a)}
+ tbody tr{cursor:pointer} tbody tr:hover td{background:var(--wa)}
+ td.num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
+ .tag{display:inline-block;padding:1px 7px;border-radius:10px;font-size:11px;font-weight:600;background:var(--wa);border:1px solid var(--ln)}
+ .chgbadge{display:inline-block;min-width:20px;text-align:center;padding:1px 7px;border-radius:10px;font-size:11px;font-weight:700;background:rgba(184,134,11,.12);color:var(--chg)}
+ .chgbadge.zero{background:var(--wa);color:var(--sub);font-weight:400}
+ .when{font-size:11px;color:var(--sub);white-space:nowrap}
+ .drill{color:var(--a);text-decoration:underline dotted;text-underline-offset:2px}
+ .empty{padding:60px;text-align:center;color:var(--sub)}
+ #ov{display:none;position:fixed;inset:0;background:rgba(0,0,0,.5);z-index:60;align-items:flex-start;justify-content:center;padding:40px 14px;overflow-y:auto}
+ #ov.on{display:flex}
+ #modal{width:min(720px,96vw);background:var(--bg);border-radius:12px;padding:20px 22px;position:relative}
+ #modal h3{margin:0 0 3px;font:700 18px/1.25 'Playfair Display',Georgia,serif}
+ #modal .maddr{color:var(--sub);font-size:12px;margin-bottom:12px}
+ #modal .x{position:absolute;top:12px;right:14px;background:none;border:0;font-size:22px;cursor:pointer;color:var(--sub)}
+ .tl{border-left:2px solid var(--ln);margin-left:6px;padding-left:16px}
+ .ev{position:relative;padding:8px 0}
+ .ev::before{content:'';position:absolute;left:-23px;top:13px;width:9px;height:9px;border-radius:50%;background:var(--a)}
+ .ev.created::before{background:var(--ok)}
+ .ev .ts{font-size:11px;color:var(--sub)}
+ .ev .lbl{font-weight:700;font-size:12px;text-transform:uppercase;letter-spacing:.4px}
+ .ev.created .lbl{color:var(--ok)} .ev.changed .lbl{color:var(--chg)}
+ .diff{font-size:12.5px;margin:3px 0 0;padding-left:2px}
+ .diff .f{color:var(--sub)} .diff .from{color:#b00;text-decoration:line-through} .diff .to{color:var(--ok);font-weight:600}
+</style>
+</head>
+<body>
+<header>
+ <h1>REN<span>TV</span> · Deals Log</h1>
+ <span class="meta" id="hmeta">loading…</span>
+ <span class="meta" style="margin-left:auto"><a href="/backend.html" style="color:var(--a)">← backend</a></span>
+</header>
+<div class="bar">
+ <input type="text" id="q" placeholder="search every field — title, city, state, address, summary… (space = AND)">
+ <select id="fType"><option value="">All property types</option></select>
+ <select id="fTxn"><option value="">All deal types</option></select>
+ <span class="chip" id="cChanged" title="Only deals whose fields have changed since first found">✎ Changed only</span>
+ <button id="reset" title="Clear filters + sort">↺ Reset</button>
+</div>
+<div class="cols" id="cols"></div>
+<div class="wrap"><table id="tbl"><thead><tr id="head"></tr></thead><tbody id="body"><tr><td class="empty">loading…</td></tr></tbody></table></div>
+
+<div id="ov"><div id="modal"><button class="x" onclick="closeOv()">✕</button><div id="mbody"></div></div></div>
+
+<script>
+const $=s=>document.querySelector(s), $$=s=>Array.from(document.querySelectorAll(s));
+const esc=s=>String(s==null?'':s).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"');
+// created date AND time in the admin's local tz (Steve HARD rule for admin cards), full ISO in title=
+function fmtDT(v){ if(!v) return ''; const d=new Date(v); if(isNaN(d)) return ''; return d.toLocaleString(undefined,{year:'numeric',month:'short',day:'numeric',hour:'numeric',minute:'2-digit'}); }
+function dtCell(v){ const s=fmtDT(v); return s?`<span class="when" title="${esc(v)}">${esc(s)}</span>`:'—'; }
+const money=v=>v==null?'—':'$'+(+v).toLocaleString();
+
+// COLUMNS — start tight (Steve rule), togglable, persisted.
+const COLS=[
+ {k:'title', l:'Deal', def:1, cell:d=>`<b>${esc(d.title||'—')}</b>${d.address?`<div class="when">${esc(d.address)}</div>`:''}`},
+ {k:'txn_type',l:'Txn', def:1, cell:d=>d.txn_type?`<span class="tag">${esc(d.txn_type)}</span>`:'—'},
+ {k:'property_type',l:'Type', def:1, cell:d=>d.property_type?`<span class="tag">${esc(d.property_type)}</span>`:'—'},
+ {k:'loc', l:'Location', def:1, cell:d=>esc([d.city,d.state].filter(Boolean).join(', ')||'—'), sort:d=>`${d.state||''} ${d.city||''}`},
+ {k:'amount', l:'Amount', def:1, num:1, cell:d=>esc(d.amount_label||money(d.amount)), sort:d=>d.amount||0},
+ {k:'size_label',l:'Size', def:0, cell:d=>esc(d.size_label||'—')},
+ {k:'changes', l:'Changes', def:1, num:1, cell:d=>`<span class="chgbadge ${d.changes?'':'zero'}">${d.changes||0}</span>`, sort:d=>d.changes||0},
+ {k:'revisions',l:'Revisions', def:0, num:1, cell:d=>d.revisions||1, sort:d=>d.revisions||1},
+ {k:'seen_count',l:'Seen×', def:0, num:1, cell:d=>d.seen_count||1, sort:d=>d.seen_count||1},
+ {k:'first_seen',l:'First found',def:1, cell:d=>dtCell(d.first_seen), sort:d=>d.first_seen||''},
+ {k:'last_seen',l:'Last found', def:1, cell:d=>dtCell(d.last_seen), sort:d=>d.last_seen||''},
+];
+const VIS=(function(){let s={};try{s=JSON.parse(localStorage.getItem('rentvDealCols')||'{}')}catch(e){}const o={};COLS.forEach(c=>o[c.k]=(c.k in s)?!!s[c.k]:!!c.def);return o})();
+function saveVis(){try{localStorage.setItem('rentvDealCols',JSON.stringify(VIS))}catch(e){}}
+let ALL=[], SORT={k:'last_seen',dir:-1};
+const F={q:'',type:'',txn:'',changed:false};
+
+function buildCols(){
+ $('#cols').innerHTML='<b>Columns:</b> '+COLS.map(c=>`<label><input type="checkbox" data-c="${c.k}" ${VIS[c.k]?'checked':''}>${esc(c.l)}</label>`).join('');
+}
+function visCols(){ return COLS.filter(c=>VIS[c.k]); }
+function buildHead(){
+ $('#head').innerHTML=visCols().map(c=>{const s=SORT.k===c.k?(SORT.dir>0?' asc':' desc'):'';return `<th data-k="${c.k}" class="${c.num?'num':''}${s}">${esc(c.l)}</th>`;}).join('');
+}
+function passF(d){
+ if(F.type&&(d.property_type||'').toLowerCase()!==F.type.toLowerCase()) return false;
+ if(F.txn&&(d.txn_type||'').toLowerCase()!==F.txn.toLowerCase()) return false;
+ if(F.changed&&!(d.changes>0)) return false;
+ if(F.q){ const hay=Object.values(d).map(v=>v==null?'':String(v)).join(' ').toLowerCase();
+ if(!F.q.split(/\s+/).filter(Boolean).every(t=>hay.includes(t))) return false; }
+ return true;
+}
+function sortRows(rows){
+ const c=COLS.find(x=>x.k===SORT.k)||COLS[0]; const g=c.sort||(d=>d[c.k]);
+ return rows.slice().sort((a,b)=>{let x=g(a),y=g(b);
+ const xn=(typeof x==='number'),yn=(typeof y==='number');
+ if(!xn) x=String(x==null?'':x).toLowerCase(); if(!yn) y=String(y==null?'':y).toLowerCase();
+ if(x<y) return -SORT.dir; if(x>y) return SORT.dir; return 0;});
+}
+function render(){
+ buildHead();
+ const rows=sortRows(ALL.filter(passF));
+ const cols=visCols();
+ $('#body').innerHTML = rows.length? rows.map(d=>`<tr data-id="${esc(d.id)}">`+cols.map(c=>`<td class="${c.num?'num':''}">${c.cell(d)}</td>`).join('')+`</tr>`).join('')
+ : '<tr><td class="empty" colspan="'+cols.length+'">no deals match these filters.</td></tr>';
+ $('#hmeta').innerHTML=`<b>${rows.length}</b> of <b>${ALL.length}</b> deals ever found · <b>${ALL.filter(d=>d.changes>0).length}</b> with changes`;
+}
+
+// ── change-history drill-down (Steve: every datum drills to deeper data) ──
+async function openHistory(id){
+ const ov=$('#ov'), mb=$('#mbody'); ov.classList.add('on'); mb.innerHTML='<p class="empty">loading history…</p>';
+ let h; try{ h=await (await fetch('/api/deals/'+encodeURIComponent(id)+'/history')).json(); }catch(e){ mb.innerHTML='<p class="empty">could not load history</p>'; return; }
+ if(h.error){ mb.innerHTML='<p class="empty">'+esc(h.error)+'</p>'; return; }
+ const c=h.current||{};
+ const evs=(h.history||[]).slice().reverse().map(ev=>{
+ const diffs=(ev.changes||[]).map(ch=>`<div class="diff"><span class="f">${esc(ch.field)}:</span> <span class="from">${esc(ch.from==null?'∅':ch.from)}</span> → <span class="to">${esc(ch.to==null?'∅':ch.to)}</span></div>`).join('');
+ return `<div class="ev ${ev.event}"><div class="ts">${esc(fmtDT(ev.ts))}</div><div class="lbl">${ev.event==='created'?'✚ First found':'✎ Changed'}</div>${diffs||(ev.event==='created'?'<div class="diff f">initial capture</div>':'')}</div>`;
+ }).join('');
+ mb.innerHTML=`<h3>${esc(c.title||'Deal '+h.id)}</h3>
+ <div class="maddr">${esc([c.city,c.state].filter(Boolean).join(', '))}${c.address?' · '+esc(c.address):''} · ${esc(c.amount_label||money(c.amount))} · ${esc(c.txn_type||'')} ${esc(c.property_type||'')}
+ ${c.url?`· <a class="drill" href="${esc(c.url)}" target="_blank" rel="noopener noreferrer">source ↗</a>`:''}</div>
+ <div class="when" style="margin-bottom:10px">First found ${esc(fmtDT(h.first_seen))} · last found ${esc(fmtDT(h.last_seen))} · seen ${h.seen_count}× · ${h.revisions} revision(s)</div>
+ <div class="tl">${evs||'<p class="empty">no history</p>'}</div>`;
+}
+function closeOv(){ $('#ov').classList.remove('on'); }
+$('#ov').addEventListener('click',e=>{ if(e.target.id==='ov') closeOv(); });
+document.addEventListener('keydown',e=>{ if(e.key==='Escape') closeOv(); });
+
+// ── wiring ──
+$('#body').addEventListener('click',e=>{ const tr=e.target.closest('tr[data-id]'); if(tr) openHistory(tr.dataset.id); });
+$('#head').addEventListener('click',e=>{ const th=e.target.closest('th[data-k]'); if(!th) return; const k=th.dataset.k;
+ if(SORT.k===k) SORT.dir*=-1; else { SORT.k=k; SORT.dir=(k==='first_seen'||k==='last_seen'||k==='amount'||k==='changes'||k==='revisions'||k==='seen_count')?-1:1; } render(); });
+$('#cols').addEventListener('change',e=>{ const cb=e.target.closest('input[data-c]'); if(!cb) return; VIS[cb.dataset.c]=cb.checked; saveVis(); render(); });
+$('#q').addEventListener('input',()=>{ clearTimeout(window._t); window._t=setTimeout(()=>{F.q=$('#q').value.trim().toLowerCase();render();},150); });
+$('#fType').addEventListener('change',()=>{F.type=$('#fType').value;render();});
+$('#fTxn').addEventListener('change',()=>{F.txn=$('#fTxn').value;render();});
+$('#cChanged').addEventListener('click',()=>{F.changed=!F.changed;$('#cChanged').classList.toggle('on',F.changed);render();});
+$('#reset').addEventListener('click',()=>{F.q='';F.type='';F.txn='';F.changed=false;$('#q').value='';$('#fType').value='';$('#fTxn').value='';$('#cChanged').classList.remove('on');SORT={k:'last_seen',dir:-1};render();});
+
+async function boot(){
+ buildCols();
+ let d; try{ d=await (await fetch('/api/deals/registry')).json(); }catch(e){ $('#body').innerHTML='<tr><td class="empty">failed to load registry — admin login required.</td></tr>'; return; }
+ ALL=d.deals||[];
+ const types=[...new Set(ALL.map(x=>x.property_type).filter(Boolean))].sort();
+ const txns=[...new Set(ALL.map(x=>x.txn_type).filter(Boolean))].sort();
+ $('#fType').innerHTML='<option value="">All property types</option>'+types.map(t=>`<option>${esc(t)}</option>`).join('');
+ $('#fTxn').innerHTML='<option value="">All deal types</option>'+txns.map(t=>`<option>${esc(t)}</option>`).join('');
+ render();
+}
+boot();
+</script>
+</body>
+</html>
diff --git a/scripts/lib/deal-registry.mjs b/scripts/lib/deal-registry.mjs
new file mode 100644
index 00000000..35d55379
--- /dev/null
+++ b/scripts/lib/deal-registry.mjs
@@ -0,0 +1,128 @@
+// deal-registry.mjs — the PERSISTENT ledger of every CRE deal RENTV has ever found,
+// with a per-deal CHANGE HISTORY (Steve 2026-08-05, TK-10246: "keep list of all deals in
+// the rentv backend. Every deal should be saved to see changes. every deal it finds").
+//
+// pull-deals.mjs parses the LIVE rentv.com news window into deal cards and OVERWRITES
+// data/deals.json each run — so a deal drops off the moment its story rotates out of the
+// window, and a corrected field (amount/occupancy/…) silently clobbers the old value with
+// no trail. This registry fixes both: it NEVER drops a deal, and every time a deal's fields
+// change it appends a diff’d revision so the change is visible over time.
+//
+// Store: data/deals-registry.json — keyed by deal id. Each entry keeps the CURRENT deal,
+// first/last-seen timestamps, a seen counter, and a history[] of created/changed events.
+// Atomic write (tmp + rename), serialized so concurrent cron pulls can't interleave a
+// half-written file. Pure JSON — matches the codebase idiom (deals.json/news.json).
+import { readFileSync, writeFileSync, renameSync, mkdirSync } from 'node:fs';
+import { dirname, join } from 'node:path';
+import { fileURLToPath } from 'node:url';
+
+const HERE = dirname(fileURLToPath(import.meta.url));
+const DATA = join(HERE, '..', '..', 'data');
+const REGISTRY = join(DATA, 'deals-registry.json');
+
+// Fields that constitute a MEANINGFUL change (a new revision). Volatile/derived fields not
+// in this list (e.g. a re-localized image path) don't spam the history on their own.
+const TRACKED = ['title', 'url', 'txn_type', 'property_type', 'city', 'state', 'amount',
+ 'amount_label', 'size_label', 'units', 'sqft', 'address', 'occupancy_pct', 'year_built', 'summary'];
+
+function load() {
+ try {
+ const j = JSON.parse(readFileSync(REGISTRY, 'utf8'));
+ if (j && typeof j === 'object' && j.deals && typeof j.deals === 'object') return j;
+ } catch { /* first run or corrupt → fresh */ }
+ return { updated_at: null, total: 0, deals: {} };
+}
+
+function saveAtomic(reg) {
+ mkdirSync(DATA, { recursive: true });
+ const tmp = REGISTRY + '.tmp';
+ writeFileSync(tmp, JSON.stringify(reg, null, 1));
+ renameSync(tmp, REGISTRY);
+}
+
+// Compare a stored deal against an incoming one; return the list of {field, from, to} that changed.
+function diffDeal(prev, next) {
+ const changes = [];
+ for (const f of TRACKED) {
+ const a = prev == null ? undefined : prev[f];
+ const b = next == null ? undefined : next[f];
+ // normalize null/undefined/'' so a missing field doesn't read as a change every run
+ const na = a === '' || a === undefined ? null : a;
+ const nb = b === '' || b === undefined ? null : b;
+ if (na !== nb) changes.push({ field: f, from: na, to: nb });
+ }
+ return changes;
+}
+
+// A trimmed snapshot stored per history event — the tracked fields only (keeps history compact).
+function snap(deal) {
+ const o = {};
+ for (const f of TRACKED) if (deal[f] !== undefined) o[f] = deal[f] === '' ? null : deal[f];
+ return o;
+}
+
+/**
+ * Record a batch of freshly-found deals into the persistent registry.
+ * NEW id → added with first_seen + a 'created' history event.
+ * KNOWN id, fields changed → 'changed' history event with the field diffs; current updated.
+ * KNOWN id, no change → just last_seen + seen_count bumped (no history spam).
+ * A deal is NEVER removed — the registry is the append-only master list of everything found.
+ *
+ * @param {Array<object>} deals parsed deal cards (must each have an `id`)
+ * @param {string} [nowISO] timestamp to stamp (defaults to now)
+ * @returns {{added:number, changed:number, unchanged:number, total:number}}
+ */
+export function recordDeals(deals, nowISO) {
+ const now = nowISO || new Date().toISOString();
+ const reg = load();
+ let added = 0, changed = 0, unchanged = 0;
+
+ for (const d of deals || []) {
+ if (!d || d.id == null) continue;
+ const id = String(d.id);
+ const existing = reg.deals[id];
+ if (!existing) {
+ reg.deals[id] = {
+ id, current: d, first_seen: now, last_seen: now, seen_count: 1, revisions: 1,
+ history: [{ ts: now, event: 'created', snapshot: snap(d) }],
+ };
+ added++;
+ continue;
+ }
+ existing.seen_count = (existing.seen_count || 0) + 1;
+ existing.last_seen = now;
+ const changes = diffDeal(existing.current, d);
+ if (changes.length) {
+ existing.current = d;
+ existing.revisions = (existing.revisions || 1) + 1;
+ existing.history.push({ ts: now, event: 'changed', changes, snapshot: snap(d) });
+ changed++;
+ } else {
+ // keep current fresh for non-tracked fields (e.g. re-localized image) without a history entry
+ existing.current = { ...existing.current, ...d };
+ unchanged++;
+ }
+ }
+
+ reg.total = Object.keys(reg.deals).length;
+ reg.updated_at = now;
+ saveAtomic(reg);
+ return { added, changed, unchanged, total: reg.total };
+}
+
+// Read helpers for the server / backend view.
+export function readRegistry() { return load(); }
+export function listDeals() {
+ const reg = load();
+ // newest-first by last_seen; each entry flattened for a list view + a change count
+ return Object.values(reg.deals)
+ .map((e) => ({ ...e.current, id: e.id, first_seen: e.first_seen, last_seen: e.last_seen,
+ seen_count: e.seen_count, revisions: e.revisions, changes: (e.history?.length || 1) - 1 }))
+ .sort((a, b) => String(b.last_seen).localeCompare(String(a.last_seen)));
+}
+export function dealHistory(id) {
+ const reg = load();
+ const e = reg.deals[String(id)];
+ return e ? { id: e.id, current: e.current, first_seen: e.first_seen, last_seen: e.last_seen,
+ seen_count: e.seen_count, revisions: e.revisions, history: e.history } : null;
+}
diff --git a/scripts/pull-deals.mjs b/scripts/pull-deals.mjs
index 4842a26c..7fecf9a4 100644
--- a/scripts/pull-deals.mjs
+++ b/scripts/pull-deals.mjs
@@ -12,6 +12,7 @@ import { dirname, join } from 'node:path';
import { fileURLToPath } from 'node:url';
import { createRequire } from 'node:module';
import { parseLocation } from './lib/parse-location.mjs';
+import { recordDeals } from './lib/deal-registry.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,
@@ -130,10 +131,16 @@ try {
}
// Download each remote photo locally and rewrite image → /img/news/<file> (fail → '' placeholder).
for (const d of deals) { d.image = await localizeImage(d.image); }
- const payload = { source: 'rentv.com — live deal listings', fetched_at: new Date().toISOString(), count: deals.length, deals };
+ const nowISO = new Date().toISOString();
+ const payload = { source: 'rentv.com — live deal listings', fetched_at: nowISO, count: deals.length, deals };
writeFileSync(join(DATA, 'deals.json'), JSON.stringify(payload, null, 1));
+ // PERSIST every deal found into the append-only registry + change history (TK-10246). deals.json
+ // stays the live/current window; the registry is the master list that never drops a deal and
+ // records each field change over time.
+ const reg = recordDeals(deals, nowISO);
const withAmt = deals.filter((d) => d.amount).length;
console.log(`OK: parsed ${deals.length} deal listings (${withAmt} with $ amount)`);
+ console.log(`registry: +${reg.added} new · ${reg.changed} changed · ${reg.unchanged} unchanged · ${reg.total} total deals ever found`);
} catch (e) {
console.error('deals pull failed:', e.message, '— last-good deals.json kept');
process.exitCode = 1;
diff --git a/server.js b/server.js
index 11f208fe..59af8a0a 100644
--- a/server.js
+++ b/server.js
@@ -94,7 +94,7 @@ footer:not(#rentv-footer){display:none!important}
<div class="rf-bar"><span>© 2026 RENTV.com — Commercial Real Estate News across the Western U.S.</span><span>All rights reserved.</span></div>
</footer>`;
// Internal/admin shells never get the customer footer.
-const INTERNAL_PAGE = /(^|\/)(admin|versions|consulting|press|desk|desk-admin|audience|social|backend|summit-leads)(\.html)?$|\/(admin|versions|consulting|press)\//i;
+const INTERNAL_PAGE = /(^|\/)(admin|versions|consulting|press|desk|desk-admin|audience|social|backend|deals-log|summit-leads)(\.html)?$|\/(admin|versions|consulting|press)\//i;
function sendPage(res, absFile) {
let html;
try { html = fs.readFileSync(absFile, 'utf8'); }
@@ -182,6 +182,42 @@ app.get('/api/deals', (req, r) => {
r.json({ source: data.source, fetched_at: data.fetched_at, count: deals.length, deals: deals.slice(0, limit) });
});
+// ── Deal REGISTRY: the persistent master list of EVERY deal ever found + change history
+// (TK-10246, Steve 2026-08-05). Written by scripts/lib/deal-registry.mjs on every pull;
+// never drops a deal, records each field change. Admin/backend surface — the live public
+// /api/deals above stays the current window. Filters: ?type= ?txn= ?q= ?changed=1 (only
+// deals that have been revised) ?since=ISO (first_seen/last_seen after) ?limit. ──
+app.get('/api/deals/registry', adminOnly, (req, r) => {
+ const reg = readJSON('deals-registry.json', { deals: {}, total: 0, updated_at: null });
+ let rows = Object.values(reg.deals || {}).map((e) => ({
+ ...(e.current || {}), id: e.id,
+ first_seen: e.first_seen, last_seen: e.last_seen,
+ seen_count: e.seen_count || 1, revisions: e.revisions || 1,
+ changes: Math.max(0, (Array.isArray(e.history) ? e.history.length : 1) - 1),
+ }));
+ const { type, txn, q, changed, since } = req.query;
+ if (type) rows = rows.filter((d) => (d.property_type || '').toLowerCase() === String(type).toLowerCase());
+ if (txn) rows = rows.filter((d) => (d.txn_type || '').toLowerCase() === String(txn).toLowerCase());
+ if (changed === '1' || changed === 'true') rows = rows.filter((d) => d.changes > 0);
+ if (since) rows = rows.filter((d) => String(d.last_seen) >= String(since));
+ if (q) {
+ const n = String(q).toLowerCase();
+ rows = rows.filter((d) => `${d.title} ${d.city} ${d.state} ${d.address} ${d.summary}`.toLowerCase().includes(n));
+ }
+ rows.sort((a, b) => String(b.last_seen).localeCompare(String(a.last_seen)));
+ const limit = Math.min(parseInt(req.query.limit, 10) || rows.length, 5000);
+ r.json({ updated_at: reg.updated_at, total: reg.total || rows.length, count: rows.length, deals: rows.slice(0, limit) });
+});
+
+// One deal's full CHANGE TIMELINE — created + every revision with per-field diffs.
+app.get('/api/deals/:id/history', adminOnly, (req, r) => {
+ const reg = readJSON('deals-registry.json', { deals: {} });
+ const e = (reg.deals || {})[String(req.params.id)];
+ if (!e) return r.status(404).json({ error: 'deal not found in registry' });
+ r.json({ id: e.id, current: e.current, first_seen: e.first_seen, last_seen: e.last_seen,
+ seen_count: e.seen_count || 1, revisions: e.revisions || 1, history: e.history || [] });
+});
+
// ── Newsletter capture: append-only local JSONL (NO external send-to-list). ──
const SUBS = path.join(DATA, 'subscribers.jsonl');
const MAX_SUBS = 50000; // hard ceiling — guards against disk-fill / append abuse
← 9ea3fd53 Boomer voice fix: re-clone from verified 7/31 VO (VOICE_ID c
·
back to Rentv
·
RENTV: deals+registry ride the 20-min news cron (auto-accumu 955211ec →