# Data-source feasibility: 2026-10-29

Question: for finished middle-housing projects in Bellingham, can we tell whether each unit **sold** (price, date, buyer type), **rented** (rent, date), or is **held**, and get listing photos and descriptions?

**Answer: yes, with useful ambiguity.** County sales history and Redfin MLS history cover sales well. Rentals need inference (ownership patterns), plus Zillow and the rental registry for confirmation.

---

## 1. Universe: City permits (scope correction)
- The original CSVs only covered permits **applied for since 2025**. Of those, only 47 projects are finaled, almost all ADUs. That's the wrong window for studying finished products.
- `feasibility/pull_all_mm.py` pulls **2015+** from the same layer, with an expanded set of Housing_Type values. Result: **1,617 permits, 1,094 FINALED, grouped into 621 finaled projects** by `PARENT_PROJECT_NO`.
- Finaled permits by type: TOWNHOUSE (ITK) 401, DADU 189, SFR (ATTACHED) 135, AADU 90, DUPLEX 59, null 45 (mostly Barkley/Sussex Dr townhomes), SMALL LOT (ITK) 42, TOWNHOUSE 27, SFR W/ AADU 26, COTTAGE (ITK) 20, SIXPLEX 12, GARDEN COURT (ITK) 11, TRIPLEX 10, DUPLEX (ITK) 7, SMALL LOT W/ AADU 6, FOURPLEX 6, SHARED COURT (ITK) 3, FIVEPLEX 1, TRIPLEX (ITK) 1.
- Finals per year: 2016 45 … 2022 120, 2023 158, 2024 132, 2025 211, 2026 (through Oct) 135.
- `mm.py` misses these types: COTTAGE (ITK), SHARED COURT (ITK), SFR (ATTACHED), DUPLEX (ITK), FOURPLEX, FIVEPLEX, SIXPLEX, and permits with a null Housing_Type. Null Housing_Type plus PermitType 'NEW CONSTRUCTION TOWNHOME' catches the Barkley ones.
- Largest finaled projects: Barkley Heights II (SUB2020-0005, 70 permits, Sussex Dr), Silver Springs (Ambrosia Ln, 36), Aurora Court 2 (Braeburn/Cameo Ln, 36+31), Larrabee Springs (W Kline/Venture Way/Northview, 30+19+17), Hansen Townhomes (Track St, 23), Sunset Village (Sunup Loop, 20 TH + 16 cottages), Maris/Tull Brothers (Tull Pl/Ct), 3710 Irongate (Deemer Rd), Bakerview Dev Group, Sunset Commons cottages (E Illinois).
- Data quality: repair permits on existing duplexes get Housing_Type DUPLEX (for example a $376 window replacement). Filter on new units, new floor area, or PermitSubType = new construction.
- Permits also carry `GEO_OWNER_*` (owner at time of the permit), `Num_1Beds`…`Num_4Beds`, `NEW_FLOOR_AREA`, `JOBVALUE`, `FEES_PAID`, `SITE_APN`, `PARENT_SITE_APN`.

## 2. City tax parcels → County assessor
- Parcel layer: `https://maps.cob.org/arcgis3/rest/services/Maps/Grp_Land/MapServer/5/query`. Query `PARCEL_CODE='<SITE_APN>'` to get `Property_ID`, Owner_Name, FullOwnerAddr, Subdivision_Description, Land_Use_Description (e.g. "ZERO LL 2 BD" = zero-lot-line townhouse), and Ownership_URL.
- Assessor page: `https://property.whatcomcounty.us/propertyaccess/Property.aspx?cid=0&year=2026&prop_id=<Property_ID>`. Plain HTML, about 50 KB, scriptable with a normal request. Parser is in `feasibility/assessor_probe.py`.
- **Hit rate: 48 of 49** sampled finaled permits matched a parcel and an assessor page. The miss was 1223 E Laurel (Hartman small lots, finaled 10/2026), probably not split into its own parcel yet.
- Gives: owner, mailing address, market value, improvement type and sqft, and **sales history with deed type, grantor, grantee and price.**
- Gotchas:
  - $0 quit-claims between related LLCs, such as Barkley Heights II LLC → Barkley Living LLC and Sunset Village LLC → BCS V2 LLC. These are internal transfers, not sales, and they often mean the builder is **moving finished units into a holding/rental entity**.
  - Duplicate sale rows.
  - Whole-project parcels: Tull Brothers II owns 34 units on one parcel, valued at $11.55M. These are rentals by construction; there's no per-unit sale.
  - Parent-parcel APNs before platting.
  - The exemptions field parse is unreliable. Use mailing address = site address as the owner-occupancy signal instead.

### Status inference from assessor data (validated on the sample)
| Pattern | Meaning | Example |
|---|---|---|
| Warranty-deed sale from builder to a person, mailing address = site | **Sold to owner-occupier** | 4837 Springside St, Larrabee Springs → Fong, $554,900 (4/2022); 1734 Sunup Loop, Sunset Village → Briagas, $455,000 (5/2025) |
| Sale to a person or trust whose mailing address is elsewhere | **Sold to investor, likely rented** | 1423 Texas St cottage → Walla Trust (Tacoma), $391k (10/2020) |
| Still builder LLC or affiliate, $0 quit-claim to a "…Living/Holdings" LLC | **Held, build-to-rent** | Barkley Heights (Sussex Dr), Sunset Village → BCS V2 LLC, 3710 Irongate (Deemer Rd), Aurora Court 2 |
| Multiple units on one parcel, owned by an LLC | **Rental building** | Tull Pl/Ct (Tull Brothers), sixplexes, fourplexes |
| Builder LLC owner, finaled recently, Redfin shows "Listed/Pending" | **For sale now** | 4437 Blackstone Way (Alliance Properties), pending 10/22/2026 |

## 3. Redfin (probe worked, but no bulk use: robots.txt disallows `/stingray/`; see CLAUDE.md guardrails)
- Method: open a redfin.com tab in Claude's built-in browser and call Redfin's own same-origin JSON endpoints with `fetch()`. Script: `feasibility/redfin_probe.js`. No header spoofing.
- Endpoints:
  - `location-autocomplete` maps an address to a propertyId, a URL and a `hasRental` flag.
  - `belowTheFold` gives `propertyHistoryInfo.events`, amenities and public records.
  - `aboveTheFold` gives photos (the 1734 Sunup Loop page had 13).
- **Hit rate on 40 random finaled attached units (townhouse, small lot, plex, etc.):**
  - 37 of 40 addresses matched a Redfin property.
  - 15 of 40 have any listing history.
  - 13 have an MLS sale; 10 of those sold after the permit final, meaning a new-construction sale.
  - 3 have rental events.
- The 22 with no history are mostly units held by one company: Barkley/Sussex, Aurora Court (Braeburn/Cameo), Track St, Venture Way, Ambrosia (Silver Springs). That fits build-to-rent with private leasing, so the absence of history is itself a signal.
- Example new-construction sales:

  | Address | Sale | Notes |
  |---|---|---|
  | 1618 Sunup Loop (Sunset Village TH) | $425k, 3/2022 | 6 days on market |
  | 1606 Sunup Loop | $425k, 4/2022 | |
  | 1716 Sunup Loop | $378k, 6/2026 | listed at $410k 7/2025, 3 price cuts, about 11 months on market. Softening! |
  | 4237 / 4239 Ambrosia Ln (Silver Springs) | $489k each, 2/2026 and 5/2026 | |
  | 2804 Moore St (small lot) | $515k, 2/2023 | listed at $545k |
  | 3503 Sussex Dr | sold $639k, 2/2025 | relisted 7/2026 at $659k, now $599k: resale under water |

- Rental events seen: 1016 Billy Frank Jr St listed for rent at $2,575 (3/2024); 4732 Spring Vista Way listed at $2,950, then $2,750 (6–8/2024).
- Area search (`/stingray/api/gis`) **returned a default set and ignored the filters**. It needs the right `market`/region parameters; see the Housing Book standard-house-index session ("US housing index standard"), which used `market=seattle` successfully elsewhere. Bellingham is city region 1411 (autocomplete id `2_1411`). Worth fixing to get all Bellingham townhouse, condo and new-construction sales as comps.

## 4. Zillow (best for rentals; bulk access blocked)
- A **normal page view in the built-in browser works**, and `__NEXT_DATA__` → `gdpClientCache` → `property` gives `priceHistory` (including Zillow Rentals events), `rentZestimate`, zestimate, beds/baths/sqft, photos and description.
- Example: 3645 Sussex Dr (Barkley TH, 3BR/2.5BA, 1,773 sf) was listed for rent at $3,100 (9/2025), cut to $2,885 (11/2025), back to $3,100, then removed 2/12/2026, which probably means leased. Rent Zestimate $3,231. This is the build-to-rent data Redfin lacks.
- **`fetch()` of other Zillow pages from the tab returned 403 "Access denied" (bot protection) for 5 of 5.** Don't try to get around it.
- Usable options:
  - (a) Visit one page at a time in the browser for a curated set, such as one or two representative units per build-to-rent project, and stop if a challenge appears.
  - (b) Ted browses Zillow rentals himself and pastes links or numbers into the app's notes.
  - (c) Rely on Rent Zestimate-style estimates only for spot checks.

## 5. City rental registration (SOLVED: public data layer)
- The old PDF link and the old `maps.cob.org` Planning/RentalRegistration layer are stale. cob.org/services/permits/rentals now links **"See Registered Rentals and Inspection Results"**, an ArcGIS Online dashboard: `https://bellingham.maps.arcgis.com/apps/dashboards/2ffe2095a1fe41bea424e9f341539bb1`.
- It's backed by a **public feature service**: `https://services1.arcgis.com/mg5xPlZs10O6tWPP/arcgis/rest/services/Plan_RentalRegistrations/FeatureServer`. Standard open REST queries work, no tricks needed. Script: `feasibility/pull_rental_registry.py`.
  - Layer 1, current registered locations: **5,386 rows**. Fields: LICENSE_NO, STATUS, **SITE_APN**, NUMBER_OF_UNITS, UNIT_NOS, SITE_ADDR, N_HOOD, UNIT_TYPE, EXEMPTION_STATUS, INSPECTION_TYPE, **CONTACT_NAME** (owner or property manager).
  - Layer 23, inspections: **25,413 rows**. Fields: ACTIVITYID (RR license), COMPLETED_DATE, RESULT, SITE_APN. The first inspection date roughly shows when a unit started being rented.
  - Layer 24: unit-count summary.
- **Joins on SITE_APN to the permits. 488 of 1,094 finaled middle-housing permits (45%) are on registered-rental parcels.** By type:

  | Type | Registered |
  |---|---|
  | TOWNHOUSE (ITK) | 132/401 |
  | DADU | 89/189 |
  | AADU | 57/90 |
  | DUPLEX | 44/59 |
  | SFR (ATTACHED) | 39/135 |
  | Null type (Barkley) | 33/46 |
  | SMALL LOT | 16/42 |
  | COTTAGE | 4/20 |
  | SIXPLEX | 8/12 |
  | FOURPLEX | 6/6 |

  Examples: Tull Brothers II, 34 units registered as apartments; 3645 Sussex Dr registered to Barkley Living LLC; the Billy Frank Jr St sixplex.
- Caveats:
  - Parent-APN matches can over-count.
  - Owner-occupied units are exempt, and non-compliance exists, so being absent from the registry doesn't prove a unit isn't rented. Aurora Court (Braeburn/Cameo) and Track St weren't found, so check those by hand.
  - The registry gives no rent amounts. Those still come from Zillow, Redfin, property-manager sites or RentCast.
- The old PDF (`cob.org/Documents/planning/housing/rentals/rental-reg-list.pdf`) isn't needed.

## 6. Rent-amount alternatives to Zillow (researched, not yet tested)
- **Property-manager listing pages: TESTED, very readable.** `utopiamanagement.com/rental-list/bellingham-wa` gives 12 cards per page, about 5 pages, each with days listed, rent, beds and baths. Each "Full Property Details" page (e.g. `/rental-list/property-at-23-spring-rd`) gives the **address**, rent, sqft, beds, baths, deposit, minimum income and amenities, and can be fetched from the same tab. Example: 23 Spring Rd, $3,300/mo, 1,922 sf, 4bd/3ba. The listings are hosted on AppFolio, so other managers using AppFolio likely have similar pages. Other Bellingham managers to check: Gather, Coast, Muljat, Windermere PM, Brandywine. **Current listings only, no history**, so history has to be built by saving a snapshot each time we look.
- **RentCast API:** official, with active rental listings, rent estimates and comps. Free plan is 50 calls a month; paid plans from about $74 a month.
- **Redfin rental events:** sparse, but captured automatically by the probe.
- **Ted's own duplex:** a known data point on actual rent, demand and time to lease.
- **Zillow page-by-page in the built-in browser, at human pace**, for a curated set. Never bulk, never around a challenge.

## 7. Other sources not yet tried
- Whatcom County assessor **Sales Search** (by date range or plat) could list every sale in a subdivision at once.
- **WA Dept of Revenue excise (real estate excise tax, REET) data**.
- Whatcom County Auditor recorded documents: deeds, unit-lot plats, condo declarations.
- Property-manager sites (Muljat, Windermere PM, Brandywine, Exit, Kendall): likely where build-to-rent townhomes advertise.
- Craigslist Bellingham rentals.
- MLS via an agent: the most complete source, if Ted has an agent who will pull comps.
- Census and HUD fair-market rents for context.

## Ted's direction (2026-10-29)
- **No general market or trend data** (ZORI, metro indices, etc.). Ted already knows the market. The value is **unit- and project-level facts** about specific finished middle-housing projects.
- **Load on demand for small sets.** When Ted is looking at a project or a handful of projects, Claude looks them up in the built-in browser: Zillow page views, Redfin, property-manager sites, and anything else where a listing shows up. Listings are often re-posted on several sites, and some sites are much easier to read than others. Ted is fine with pages loaded in the in-app browser and logging in to things manually himself.
- Never bulk-crawl blocked sites. Never get around challenges.


## 6. Other Whatcom cities (Ferndale, Blaine, Lynden): county parcel layer
- **No building-permit data is published.**
  - Ferndale's GIS (`arcgis.cityofferndale.org/server/rest/services`) only has `FerndaleOnline/iMap_CDDDevelopmentProjects` layer 1. That's 43 land-use projects (plats, PUDs, site plans) with Name, PermitNum, Lots, Units and UnitType. It's useful for spotting big pipeline projects (e.g. Silver Hawk PUD, 310 units; KCLT Thornton, 46), but it isn't building permits.
  - Blaine's AGOL org (`services6.arcgis.com/ZGYHIuOAkxkv8laH`) has parcels, zoning and capacity, but no permits.
  - Both cities' permit portals would need a separate look if permit trails matter there.
- **County-wide parcel layer works:** `https://wcgis.whatcomcounty.us/arcgis/rest/services/EnterprisePublishing/WhatcomCo_Property/MapServer/1` ("Public Tax Parcels"), open REST.
  - Fields include prop_id, situs address and city, zoning, subdivision, **property_use_description**, **yr_blt**, sqft_la, imprv_type, market values, taxpayer and title owner with mailing address, and the assessor Hyperlink.
  - The same prop_id feeds the assessor page parser, so sales history works for any city.
- Parcels with yr_blt ≥ 2015, by use code (2026-10-29 counts):

  | City | Zero-lot-line 2BD / 3BD | Duplex | Fourplex | Condominiums | Notes |
  |---|---|---|---|---|---|
  | Ferndale | 24 / 104 | 13 | 24 | 44 | |
  | Blaine | – / 14 | 26 | 26 | 89 | |
  | Lynden | – | 31 | 34 | 209 | plus 10 triplex, 8 "4 BDRM W/ ADU" |
  | Bellingham (cross-check) | 249 / 266 | 50 | – | 371 | plus "W/ ADU" variants; the permit universe is better here |

- Caveats:
  - The use code describes the parcel, not the project. Group parcels by subdivision and owner to rebuild projects.
  - Condos mix true flats with townhouse-style condos; check imprv_type, sqft and the subdivision name.
  - Detached ADUs are visible only via the "W/ ADU" codes, so ADUs outside Bellingham will be undercounted.
  - There are no applied, issued or final dates. Use yr_blt plus the first sale as a proxy.
