dataset · OpenDataPhilly · Carto

L&I Complaints

Every resident-reported complaint to License & Inspections — unsafe conditions, vacant buildings, illegal use, no-heat, construction without permit. Each row is one phone call, not one complaint; multiple calls can share a complaint number. The intake-side companion to L&I Violations.

data through 2026-06-11 · 1,033,110 rows

About L&I Complaints

The L&I Complaints dataset is the call log of Philadelphia's Department of Licenses & Inspections. A complaint typically comes in by phone (and increasingly through 311) and triggers an inspector visit, which — if a violation is confirmed — produces a record in the sibling L&I Violations dataset. The two read as a two-stage pipeline: complaints are intake, violations are enforcement.

One-row-per-call, not one-row-per-complaint

A single complaint can spawn multiple calls (the same neighbor calls back twice, a property manager and a tenant both call). The complaintnumber field is the dedup key: count(DISTINCT complaintnumber) gives unique complaints, count(*) gives raw call volume. Stories should pick one and stick with it; mixing the two leads to double-counting against 311.

Useful join keys

  • ticket_num_311 — joins back to public_cases_fc for complaints that started life as a 311 call.
  • opa_account_num — joins to OPA assessment records (and to L&I violations on the same OPA).
  • parcel_id_num — joins to DOR parcels for spatial roll-ups.
  • complaintnumber + casenumber — links calls, cases, and the eventual violation notice.

Caveats

A complaint is a report, not a confirmed problem. Codes are categorized at intake ("EMERGENCY", "VACANT BLDG", "ILLEGAL USE", etc) before any inspection has happened, and a meaningful fraction get re-coded or closed without action after the inspector visit. As with 311, the dataset measures the reporting behavior overlaid on the underlying conditions — both signal and noise come baked in.