← back to Wholivedthere
mcp-la-records/LA_GIS_NOTES.md
68 lines
# LA County GIS REST — field notes
Validated 2026-04-29.
## Endpoint
```
https://public.gis.lacounty.gov/public/rest/services/
```
No API key required (public layer). No CAPTCHA. CORS-friendly.
## Services available
| Folder/Service | Type | Use |
|---|---|---|
| `CAMS_Locator` | GeocodeServer | Address → lat/lng + match score |
| `LACounty_Cache/LACounty_Parcel` | MapServer | **The big one** — full parcel data |
| `LACounty_Cache/LACounty_Aerial_2011..2013` | MapServer | Historical aerial tiles |
| `LACounty_Dynamic/Administrative_Boundaries` | MapServer/FeatureServer | City, council districts, school districts |
| `LACounty_Dynamic/Hazards` | MapServer | Flood, fire, seismic — useful for insurance pages |
| `LACounty_Dynamic/LARIAC_Buildings_2020` | MapServer | Building footprints with heights |
## Parcel layer — covers most of what we need without scraping
`/LACounty_Cache/LACounty_Parcel/MapServer/0/query`
Returns per-parcel:
- **Identity**: AIN, APN, OBJECTID
- **Address**: SitusHouseNo + SitusFraction + SitusDirection + SitusUnit + SitusStreet + SitusCity + SitusZIP, plus pre-formatted `SitusFullAddress`
- **Use**: UseCode, UseType, UseDescription
- **Buildings (up to 5 per parcel)**: DesignType{1..5}, YearBuilt{1..5}, EffectiveYear{1..5}, Units{1..5}, Bedrooms{1..5}, Bathrooms{1..5}, SQFTmain{1..5}, QualityClass{1..5}
- **Assessment**: Roll_Year, Roll_LandValue, Roll_ImpValue, Roll_PersPropValue, Roll_FixtureValue, Roll_HomeOwnersExemp, Roll_RealEstateExemp, Roll_PersPropExemp, Roll_FixtureExemp, Roll_LandBaseYear, Roll_ImpBaseYear
- **Legal**: LegalDescLine1..5, LegalDescLineLast, LegalDescription
- **Geometry**: CENTER_LAT, CENTER_LON, full polygon Shape
**NOT in this layer:** owner name (intentionally redacted from public layer for privacy), permit history, deed transfer history, zoning code (only TaxRateCity).
## Working query
`SitusFullAddress LIKE '%HOLLYWOOD%'` returns real records. `SitusStreet=` exact match doesn't work — the formatting is unpredictable. **Use LIKE on SitusFullAddress for all address searches.**
```bash
curl -sS "https://public.gis.lacounty.gov/public/rest/services/LACounty_Cache/LACounty_Parcel/MapServer/0/query?where=SitusFullAddress+LIKE+'%25HOLLYWOOD%25'&outFields=APN,SitusFullAddress,YearBuilt1,SQFTmain1,Roll_LandValue,Roll_ImpValue,CENTER_LAT,CENTER_LON&f=json&resultRecordCount=10"
```
For APN lookup: `where=APN%3D'2303-004-020'`. APN format is hyphenated like `2303-004-020`.
## What's missing (still need scrapers/other sources for):
- **Owner name** — intentionally redacted from public GIS. Need Assessor portal scraper or Recorder data.
- **Permit history** — go to LADBS (`ladbsservices2.lacity.org`)
- **Deed transfers / sale history** — go to Recorder (`lavote.gov/home/recorder` or Socrata)
- **Detailed zoning code** — go to ZIMAS (`zimas.lacity.org`) — public layer only has tax rate city
- **Beverly Hills parcels** — NOT in LA County layer. BH has own assessor. Separate scraper needed.
## Beverly Hills
Test confirmed: queries with `SitusCity LIKE '%BEVERLY HILLS%'` return parcels but Beverly Hills has its own city-managed assessor records. Some parcels appear in LA County data (older flat-record style) but recent assessment values aren't reliable. Plan: build separate `mcp-bh-records` for BH-only.
## Geocoder
`CAMS_Locator/GeocodeServer/findAddressCandidates?SingleLine=...` works but returns null candidates for some addresses. Likely covers LA County only, not BH. For a national fallback, plug in Mapbox geocoder (paid, but generous free tier).
## Performance
Single parcel query: ~150–300ms. Bulk scan (1000 parcels at a time): ~2–5s. Full LA County is ~2.4M parcels — full snapshot via paginated queries would take ~6 hours. **Do not full-scan; query on demand only.**