Independent · Public Data · Updated Daily

Philadelphia Rental License — Change Log

Two public records in one place: a daily log of every Active and Expired rental license in Philadelphia, and a full archive of every rental-license violation the City has issued since 2010.

…Licenses tracked
Daily~4:15 AM ET
…Violations archived
…Last updated

Search recent license changes

Every license status change captured since the 2026-08-21 baseline — expirations, renewals (lapses closed), new licenses and licenses that left the set. Type a street address, an OPA account number, a ZIP code, or a license number, then Search. This is the daily diff the City throws away.

Loading the recent-changes log the first time you search…

Note: the license log only reaches back to 2026-08-21 — it cannot show a status from before that date. For older enforcement history, use the violations search further down (back to 2010). To look up a property’s current status, use the live tool: 4philly.net (opens in a new tab).

Today’s changes

Just what moved on the most recent run — replaced by a new day each day. The full history below is never overwritten; this is a live window onto the newest entries.

Loading the latest run…

What the City keeps, and what it discards

Philadelphia publishes rental license data across four public surfaces. Every one shows only a license’s current state. When a license expires and is later renewed, the lapsed period is overwritten — no public system can tell you what a license’s status was on a given past date.

SurfaceExpiration?Renewal date?Status history?
Atlas atlas.phila.govno columnnono
Property History li.phila.govno rownono
eCLIPSE eclipse.phila.govyespartialno
Carto API phl.carto.comyesyes (hidden field)no

Violations are different. When L&I cites a property for operating without a valid rental license, that record is permanent. It carries its own dates, case number, resolution and public notice document — and a later renewal does not erase it. That enforcement history reaches back to 2010.

What each source answers
Was this license expired on a given past date?Not available — overwritten
When was it last renewed?Available — mostrecentissuedate
Was the property cited for operating unlicensed, and when?Available & permanent — since 2010
The gap that remains. Not every lapse produces a violation. A license that expires and is renewed before an inspector visits leaves no enforcement record — and no status history either. Those lapses are invisible in every public system. That is what the daily license log is for: it records the change as it happens, so a silent lapse is still documented.

What this does

Once a day this project pulls the City’s public Carto data and appends only what changed to permanent logs. Each day is a timestamped Git commit, and GitHub’s Activity log records every push — including any force-push — with compare links, visible to anyone with read access. See REWRITE_LOG.md for any history changes.

How to use it

Download the log

curl -O https://thumpersecure.github.io/phl-rental-license-log/changes.ndjson

One JSON object per line (NDJSON).

Look up a single license

grep '"licensenum":"602204"' changes.ndjson | jq .

Every license that expired

jq -c 'select(.diff.licensestatus.to == "Expired")' changes.ndjson

Every lapse that was later closed (the lapse detector)

jq -c 'select(.diff.licensestatus.from == "Expired" and
              .diff.licensestatus.to   == "Active")' changes.ndjson

Find every property cited for operating unlicensed

curl -O https://thumpersecure.github.io/phl-rental-license-log/violations_changes.ndjson

jq -c 'select(.new.violationcode | startswith("9-3902"))
       | {case:.new.casenumber, addr:.new.address,
          issued:.new.violationdate, status:.new.violationstatus,
          resolved:.new.violationresolutiondate}' violations_changes.ndjson

Violations for one address

grep '"address":"315-23 N 12TH ST"' violations_changes.ndjson | jq .

Each record includes publicnov — a direct link to the City’s official Notice of Violation PDF.

Check the latest run

curl -s https://thumpersecure.github.io/phl-rental-license-log/latest.json | jq .

Files

changes.ndjsonAppend-only. One line per detected change.
violations_changes.ndjsonRental-license violations (§ 9-3902), 2010–present.
violations_latest.jsonSummary of the most recent violations run.
state.jsonLast-known state of every tracked license.
latest.jsonSummary of the most recent run.
README.mdFull documentation.

Record shapes

{"ts":"…","licensenum":"602204","change":"updated",
 "diff":{"licensestatus":{"from":"Expired","to":"Active"}}, "new":{…}}

{"ts":"…","licensenum":"000001","change":"initial","new":{…}}
{"ts":"…","licensenum":"…","change":"left_set","last":{…}}

License fields tracked: licensestatus, expirationdate, mostrecentissuedate (renewal), inactivedate, plus address, OPA account and ZIP.
Violation fields tracked: violationcode, violationcodetitle, violationstatus, violationdate, violationresolutiondate, casestatus, underappeal, publicnov.

Scope. The violations archive is complete history — every § 9-3902 citation the City has issued since 2010. The license log is forward-capturing: it records status changes from 2026-08-21 onward and cannot reconstruct a license’s status before that date.

Look up a property (no downloads needed)

Search every rental-license violation the City issued before August 22, 2026 — the historical record. Type a street address, an owner name, an OPA account number, or a ZIP code, and (optionally) pick a council district. No spreadsheet required.

Loading the historical file the first time you search…

How to read a result: a red OPEN / IN VIOLATION tag means the case was not yet resolved as of the data pull; a grey COMPLIED / CLOSED tag means it was cured. A violation means the City cited that property for operating a rental without a current license. Not every lapse gets cited, so a property with no result here is not proof it was always licensed.

Questions or feedback

onlinemartialartist@pm.me