"Is this a parcel worth a phone call?"
What the two weeks actually look like
There is no phase of a deal called "data acquisition." Data acquisition is a standing tax levied on every other phase, paid by whoever is least senior enough to argue. In a real shop the pattern is consistent: an analyst has a site, and over roughly the next two weeks works through the following.
| Step | What it involves |
|---|---|
| Assessor record | Pull the parcel's assessor record |
| Zoning | Find the zoning and read the zoning ordinance PDF to work out what the zone code actually permits |
| Flood hazard | Check FEMA flood |
| Fire hazard | Check fire hazard |
| Census tract status | Check whether the tract is a QCT or DDA |
| Income limits and rents | Look up this year's income limits and derive max rents |
| Basis limits | Find the applicable threshold basis limits |
| Comparable awards | Look for nearby comparable LIHTC awards to sanity-check density and cost |
| Construction cost | Get a number from either a GC relationship or last year's deal escalated by a guess |
Roughly half of those steps involve reading a PDF and typing numbers into Excel by hand. The distribution is not even.
| Data type | How often it's actually refreshed |
|---|---|
| Site-screening data | Queried in seconds |
| Underwriting data (income limits, rents) | Refreshed annually, by hand, in a panic, in the two weeks after HUD publishes income limits, because every model in the shop has last year's rents hardcoded in it |
| Zoning data | Refreshed never, until someone gets burned |
Two decisions come out of this phase. The first is whether to pursue the site at all. The second — usually within days of the first — is what price goes into the LOI, and that is where screening quietly becomes underwriting. Under 4 CCR Section 10325(c)(9)(A), if the paid purchase price exceeds appraised value, the leveraged soft resources amount in the tiebreaker is discounted by the overage, unless the Executive Director waives it under Section 10327(c)(6). A developer who overpaid for land can be scored out of the round for it. That consequence is rarely modeled at LOI time, and it is pure arithmetic if the tiebreaker is modeled before the price is agreed.
The parcel layer is a fleet of adapters, not a dataset
There is no single authoritative statewide California parcel layer with attributes. There are three partial answers, and the working one is per-county ArcGIS REST services. That is not a "write one adapter" problem — it is a fleet of fragile adapters that need monitoring, and it does not get easier with expansion. Every new county is a new adapter, and every new state is a new legal regime for whether assessor data is even public.
The breakage is real and current.
| County | Issue |
|---|---|
| San Diego (SanGIS/SANDAG) | Advertises a maxRecordCount of 2000 and returns geometry in EPSG:2230 (California State Plane Zone 6, US survey feet), not WGS84 — while at least one internal note claims 10k paging was confirmed |
| Los Angeles | Genuine endpoint churn: public.gis.lacounty.gov parcel paths 404, apps.gis.lacounty.gov sits behind a bot-detection shim, and only dpw.gis.lacounty.gov responded cleanly |
| Imperial | GIS host does not resolve in DNS at all |
Those cannot both be true, and an ingestion loop that believes it got 10,000 records and got 2,000 produces a partial county that looks complete.
The fallbacks are worse than they sound.
| Fallback | What it actually gives you |
|---|---|
| Statewide 2014 parcel snapshot | Roughly 3.4 GB zipped; standardized down to essentially the parcel number alone — geometry with an APN and nothing else, twelve years stale. A geometry backstop, not an underwriting source. |
| Regrid (commercial) | Publishes nationwide coverage starting at $80K/year; whether that license permits redisplaying parcel attributes to your own paying end users, as opposed to internal analytic use, is not answerable from the public pricing page. |
That single term should be nailed down before anything is built on top of it.
Zoning: the code is a pointer, and the pointer has a vintage
Zoning normalization is usually hand-waved as "every city is different." The real reason is more specific: a zone code (R-3, MU-2, PD-14) is a pointer into a municipal code document, not a value. Two cities' R-3 are unrelated. The density, height, and parking that actually drive a feasibility model live in a table inside a PDF ordinance, and in overlays, specific plans, and planned developments that override the base zone. There are 539 jurisdictions in California, each amending independently.
For Southern California, SCAG's regional land use layers are the best available answer and are parcel-keyed.
| Field | What it carries |
|---|---|
| APN24 | Joins directly to a parcel table with no spatial overlay |
| ZN24_CITY | Raw local zone code |
| ZN24_SCAG | SCAG's normalized zone code |
| ZN24_SCAG_2ND / ZN24_RATIO_2ND | Secondary zone and its area ratio, for split-zoned parcels |
| YEAR_ZN | Vintage of the underlying local zoning |
Vintage is the weakness, and it is measurable.
Roughly a third of Riverside jurisdictions have zoning of unknown age. Any zoning-derived number must be displayed with its vintage attached, and where the vintage is null that must be shown as null rather than silently omitted.
The statewide fallback — California Statewide Zoning North/South, published by the Office of Land Use and Climate Innovation — is open, downloadable in unusually many formats, and older. Its own metadata is candid: data was collected from 535 of California's 539 jurisdictions, with PDF and image maps geo-referenced and transposed onto assessor parcel geometry, collection beginning in late 2021 and mostly finished in late 2022. The state disclaims accuracy outright.
| Field | Problem | Guidance |
|---|---|---|
| Date | Free text, not a date — distinct values include 1998, 2007, 2009, 2014 through 2023, plus truncated fragments, a blank, and a null | Salvage it as a string, not a date |
| ucd_number | Inconsistently populated — six of fourteen description values carry a NULL number | Key on ucd_description or build your own crosswalk; do not key on ucd_number |
One asymmetry belongs in the data model rather than papered over: SCAG covers five of the six counties in EZFeasi's footprint. San Diego is outside SCAG and needs SANDAG's own layer or the statewide fallback.
The hazard layers you can query are not the ones that kill deals
This is the most important structural fact about environmental screening, and it should be stated in the product rather than buried in terms of service. Flood and fire — the hazards that mostly cost money — are wide open.
| Layer | Access |
|---|---|
| FEMA National Flood Hazard Layer | Public, unauthenticated, federal, and therefore fully portable; flood hazard zones sit on layer 28 of the NFHL MapServer |
| CAL FIRE Fire Hazard Severity Zones | On data.ca.gov under CC-BY, in REST, CSV, GeoJSON, SHP and KML (the agency host egis.fire.ca.gov 404s — go through data.ca.gov) |
The hazards that end deals are the ones behind a wall.
| Layer | Status |
|---|---|
| DTSC EnviroStor site_search API | Returned HTTP 403 to a scripted client |
| SWRCB GeoTracker bulk download | Also returned 403 |
| Archaeological and SHPO site locations | Withheld by law to prevent looting |
| Tribal cultural resources | Confidential by statute |
There is no engineering fix for the last category, and there should not be.
The corpus disagrees on EnviroStor specifically, and the disagreement is worth surfacing rather than resolving silently. One source lists EnviroStor as bot-blocked and puts it on a do-not-automate list; another lists it as verified-live and machine-readable. They tested different endpoints — the 403 came from envirostor.dtsc.ca.gov/public/api/site_search, while the ArcGIS Public Data Export responded and carries an apn field, meaning it joins directly to a parcel roster with no spatial work. The do-not-scrape-past-a-403 principle is correct; applying it to the dataset name rather than the endpoint suppressed a near-free build. GeoTracker really is blocked — link out, do not work around.
The practical consequence for anyone building or using a screen: absence of a hit on the layers you can query says nothing about the layers you cannot. A green checkmark across every published environmental layer implies a cleanliness the screen cannot support, and contamination discovered at Phase I or Phase II — after site control, with escrow money already spent — is a recurring deal-ender. Seismic layers carry a related trap: "not in a zone" and "never evaluated" are different answers, and a screen that collapses the unevaluated layer into a clean result is reporting something false.
Screening evidence is not certification
4 CCR Section 10325(c)(2)(N) makes "certification of site amenities, distances or service amenities that were, in the Executive Director's sole discretion, inaccurate or misleading" a negative-points offense. Negative points attach to people and firms, not projects — Section 10325(c)(2) allows up to 10 negative points per project and/or per violation, assignable to general partners, co-developers, management agents, consultants, guarantors, or any member or agent of the Development Team, across 23 enumerated grounds.
In a field like that, a single negative point is fatal for as long as it applies.
This is the largest liability surface in any automated screening product, and the discipline is simple: a computed distance is screening evidence with a cited source, to be independently verified by a human before it is certified. It is never the certification itself.
Two related corrections belong here because they are cases of a screen implying more than it knows. First, an Opportunity Area designation does not, in 2026, confer a threshold basis limit benefit in Southern California: the 10% High/Highest Resource basis-limit increase is gated on the county's unadjusted 9% two-bedroom limit being at or below $500,000.
| County | 2BR limit |
|---|---|
| Los Angeles | $608,800 |
| Orange | $559,200 |
| San Diego | $545,600 |
| Riverside / San Bernardino / Imperial | $531,200 |
The lowest among the six covered counties is $531,200 — above the $500,000 gate, so the Opportunity Area basis-limit bump is unavailable across all six counties today. The gate can flip in a future January.
Second, a transit tier derived purely from HQTA captures the Government Code Section 65912.123(b)(1)(E) density override and none of AB 2011's actual gating — treating it as an eligibility signal materially overstates AB 2011 availability.
Where the screen stops, and what it cannot tell you
The further right you go in a deal's life, the worse the data gets, which is the inverse of what a feasibility product wants.
| Data | Source | Format |
|---|---|---|
| Restricted rents (2026 income and rent limits) | CTCAC, not HUD | All seven linked data files are PDFs — no XLSX, no CSV, no API. Tables branch on three placed-in-service vintages, because a property's applicable limit depends on when it was placed in service. |
| Threshold basis limits | CTCAC | Annual PDF |
| HUD SAFMR by ZIP | HUD | Easy to carry at screening, but it is a voucher payment standard, not a Section 42 restricted rent, and should never stand in for one. |
Construction cost is the biggest hole in the landscape. There is no free, authoritative, California-specific, unit-level affordable-housing cost dataset.
| Source | What it gives you |
|---|---|
| BLS Producer Price Index (inputs-to-construction series) | Free, keyless, federal. July 2026 reading: 374.039, flagged preliminary — all indexes subject to monthly revision for up to four months after publication. Gives escalation, not level. |
| RSMeans / ENR | Subscription products whose terms should be assumed to prohibit redistribution |
| Threshold basis limits | Regulatory caps on eligible basis, not cost estimates — conflating the two is a classic and expensive error |
Jurisdiction behavior is partially answerable and almost nobody uses it.
| Attribute | Detail |
|---|---|
| Format | Twelve CSV tables published under the Gov. Code Section 65400 mandate |
| Coverage | Raw data available from 2018 forward |
| What it answers | Permits issued against RHNA allocation, by income category, by year — a defensible quantitative answer to "does this city ever actually permit anything?" |
| License | License field reads "License not specified," which is not an affirmative grant |
What APR data does not give you is entitlement duration: it tells you a permit issued in a year, not that the application took 31 months. Per-project entitlement duration does not exist as a public dataset anywhere in California. It lives in city permit portals with no public API, in staff memory, and in land-use counsel's heads. CEQAnet is not a substitute — ministerial pathways generate no CEQA document at all, so a CEQAnet-derived sample is systematically composed of slow discretionary deals, which is precisely the path a streamlined affordable project is trying to avoid.
One free asset worth wiring in at screening: CTCAC's List_of_Projects.xlsx.
It carries both APN and census tract, so it joins directly to a parcel table. It gives unit counts by bedroom and by AMI band, annual federal award, total state award, developer, general partners and management company.
| Field | Gotcha |
|---|---|
| Credit type | Stored as a float (0.09 / 0.04), not as "9%" |
| Award columns | Stored as strings |
| Blanks | Appear as both None and empty string |
Finally, the honest limit. Whether the seller will actually extend the option, whether the city planner will fight the project or fast-track it, whether a competitor is about to file in your region and at roughly what tiebreaker — none of that is a dataset, and none of it should be synthesized. Give the user a place to record their own judgment and its date. What screening can and should do is make sure the arithmetic questions are answered before the phone call: the region's available apportionment, the tiebreaker at the LOI price, the site control clock, and the hazard layers you can actually see.
Where this goes wrong
- Silent pagination truncation: an ingestion loop that believes it received 10,000 features when the service capped it at 2,000 produces a partial county that looks complete, and nobody notices until a user asks why their parcel is missing.
- Reading only ZN24_SCAG on a split-zoned parcel. ZN24_SCAG_2ND and ZN24_RATIO_2ND exist because split zoning is common; ignoring them overstates buildable density on a meaningful fraction of parcels.
- Parsing the statewide zoning layer's Date field as a date. It is free text containing values like 1998 and 2007 alongside truncated fragments, a blank and a null. Salvage it as a string.
- Keying on ucd_number in the statewide zoning layer. Six of fourteen distinct description values carry a NULL number, including Urban residential, Suburban residential and Planned area.
- Hardcoding an LA County parcel endpoint. The public.gis.lacounty.gov parcel paths 404 and apps.gis.lacounty.gov is behind bot detection; whatever URL is hardcoded for LA will break.
- Presenting a clean hazard screen as environmental clearance. Contamination sits behind a 403, archaeological and SHPO locations are withheld by law, and tribal cultural resources are confidential by statute — the layers that most often kill a deal are the least accessible.
- Collapsing the seismic Unevaluated Areas layer into a boolean. "Not in a zone" and "never evaluated" are different answers and only one of them is reassuring.
- Treating a computed amenity distance as the certification rather than as evidence. 4 CCR Section 10325(c)(2)(N) makes inaccurate or misleading amenity/distance certification a negative-points offense at the Executive Director's sole discretion.
- Implying that an Opportunity Area designation confers a threshold basis limit benefit. The 10% increase is gated at an unadjusted 9% 2BR limit of $500,000 or less, and the lowest of the six covered counties is $531,200.
- Deriving AB 2011 eligibility from an HQTA-based transit tier. That derivation captures only the Government Code Section 65912.123(b)(1)(E) density override and none of AB 2011's actual gating, so it overstates eligibility.
- Agreeing an LOI price without modeling the tiebreaker. Purchase price above appraised value discounts the leveraged soft resources term under 4 CCR Section 10325(c)(9)(A) unless waived under Section 10327(c)(6).
- Using HUD SAFMR as a rent assumption. It is a voucher payment standard, not a Section 42 restricted rent, and the restricted rent tables exist only as PDFs branching on three placed-in-service vintages.
- Benchmarking entitlement duration from CEQAnet. Ministerial pathways generate no CEQA document, so the sample is systematically composed of slow discretionary deals — the opposite of the pathway most affordable projects use.
- Screening a site well and never checking the region's available apportionment. Multiple geographic regions in 2026 Round 1 had no recommended projects at all.
- HUD
- LIHTC
- State QAPs
- IRS § 42
- Housing Finance Agencies
