← 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.**