Code Violation Leads: Property Owners, Fines & Violation Types
Pricing
from $0.004 / violation
Code Violation Leads: Property Owners, Fines & Violation Types
Code violations from city open data, filtered by violation type, date range, ZIP and status, with the property owner's name and mailing address. Philadelphia, Detroit, Chicago, Mesa and New York City.
Pricing
from $0.004 / violation
Rating
0.0
(0)
Developer
ScrapeBench
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
4 days ago
Last modified
Categories
Security
Limited permissionsShare
Pain points
- Each city publishes its violations in its own open-data portal, in its own format, without the property owner.
- Finding who owns a cited property means looking each address up again in the county's property records.
- A city's violation codes and wording differ from the next city's, so 'every weed violation' is a different search in every city.
- Telling an owner who lives at the property from a landlord who lives elsewhere takes a second comparison per row.
What we solve
- Five cities' violation feeds read with one input, every row in the same columns.
- The owner's name and mailing address on the row: from the violation record itself in Detroit and Philadelphia, from the county's property roll in Chicago and Mesa, and the owner's name from MapPLUTO in New York City.
- 17 plain-word violation types (weeds, trash, vacant/unsafe, elevators, fire safety, roofs...) matched across every city's own wording, plus your own keywords.
- An absentee flag on every row with an owner address: out of state, out of city, another address in the same city, or owner-occupied.
Summary
Pick a city and the kind of violation you care about (overgrown weeds, trash and junk, vacant or unsafe buildings, rental registration, elevators, fire safety, roofs and exterior walls, pests and 9 more), a date range and optionally ZIP codes, and get every matching code violation the city has published, newest first: the violation, its date, status and code, the property address and parcel number, and the property owner's name and mailing address with a flag for owners who live somewhere else. Get one row per violation, one row per property (with its violation count and history), or one row per owner (with how many properties they own that were cited). Lookup mode answers the other question: give addresses, parcel numbers or owner names and get each one's violation history. Every row also carries every field the city published for that violation, as published.
Who it's for
- Contractors and service companies marketing to owners of cited properties (landscaping, junk removal, roofing, fire protection, elevators, pest control, lead abatement)
- Real estate investors and wholesalers looking for distressed and vacant properties
- Property managers and rental-compliance consultants looking for landlords with registration and inspection problems
- Code-compliance expediters, attorneys and permit services
- Lenders, insurers and buyers checking a property's violation history before a deal
- Journalists and researchers tracking landlords with many violations
How to use
This actor does two jobs. Run it, then collect results from the run's dataset (export to JSON/CSV/Excel, or pull via the Apify API).
Get a list (export): no names, just filters; returns the whole matching list.
{"cities": ["philadelphia"],"lastDays": 30,"categories": ["lawn_weeds"],"absenteeOnly": true,"maxResults": 100}
Check specific properties or owners (lookup): put street addresses, parcel numbers or owner names in mode, cities, lookups; Inputs below says how each is matched.
{"mode": "lookup","cities": ["philadelphia"],"lookups": ["1531 W Flora St","471033600"]}
See Inputs below for every available field.
What you get
One row per record:
| Field | Description |
|---|---|
city | The city whose feed the row came from |
violation_id | The city's own ID for the violation or ticket |
case_number | The city's case, inspection or ticket number |
violation_date | When the violation was cited |
status | open, closed or no_violation |
status_detail | The city's own status words |
categories | Violation types matched from the city's wording (lawn_weeds, trash_junk, roof_exterior...) |
violation_code | The code or ordinance cited |
violation_description | What the city says is wrong |
severity | The city's priority or class (NYC class A, B or C) |
fine_amount | Fine or fee where published |
balance_due | Unpaid balance where published (Detroit, Mesa) |
hearing_date | Hearing date where published (Detroit) |
address | Street address of the property |
zip | ZIP code of the property |
parcel_id | Parcel number (OPA account, APN, BBL, Detroit parcel) |
property_type | residential, commercial, vacant_land... where the property record gives it |
owner_name | The property owner of record |
owner_type | individual, company, trust or government, read from the name |
owner_mailing_address | Where the owner receives mail (plus city, state and ZIP columns) |
absentee | out_of_state, out_of_city, same_city_diff_address, owner_occupied or unknown |
owner_source | Which public record the owner came from |
violation_count | Property and owner rows: violations in the date range, with the list in 'violations' |
property_count | Owner rows: how many cited properties the owner has |
source_url | The source record for this violation |
source_fields | Every field the city published for the violation, as published |
Sample:
{"city": "Philadelphia","state": "PA","violation_id": "VI-2026-091859","case_number": "CF-2026-147729","violation_date": "2026-10-30","status": "open","status_detail": "OPEN / IN VIOLATION","categories": ["lawn_weeds"],"violation_code": "PM15-302.4","violation_description": "EXTERIOR AREA WEEDS","severity": "STANDARD","department": "CLIP - VACANT LOT INVESTIGATOR","address": "1531 W FLORA ST","zip": "19121","parcel_id": "471033600","property_type": "vacant_land","owner_name": "DAVIDS CONSTRUCTION LLC","owner_type": "company","owner_mailing_address": "723 MARTENS LANE","owner_mailing_city": "SPRINGFIELD","owner_mailing_state": "PA","owner_mailing_zip": "19064","absentee": "out_of_city","absentee_basis": "mails to SPRINGFIELD","owner_source": "Philadelphia OPA property roll","source_url": "https://phl.carto.com/api/v2/sql?q=SELECT+%2A+FROM+violations+WHERE+violationnumber+%3D+%27VI-2026-091859%27","source_dataset": "https://opendataphilly.org/datasets/licenses-and-inspections-code-violations/","source_fields": {"casenumber": "CF-2026-147729","casetype": "NOTICE OF VIOLATION","violationcodetitle": "EXTERIOR AREA WEEDS","violationstatus": "OPEN","opa_account_num": "471033600","opa_owner": "DAVIDS CONSTRUCTION LLC"}}
Inputs
| Field | Required | Type | Default | Description |
|---|---|---|---|---|
mode | no | string | "export" | Export: every violation in the cities you pick that matches your filters (dates, violation type, ZIP, owner). Lookup: the violation history of the addresses, parcel numbers or owner names you list. |
cities | no | array | ["philadelphia"] | Which cities to search. Each city is its own open-data feed. One per line: philadelphia (Philadelphia, PA); detroit (Detroit, MI); chicago (Chicago, IL); mesa (Mesa, AZ); new_york (New York City, NY). |
city | no | string | — | One city, for saved tasks and API calls that send a single value. Use Cities above for several. |
lookups | no | array | [] | One per line: a street address (1251 N 17th St), a parcel number (Philadelphia OPA account, Detroit parcel ID, Mesa APN, NYC BBL) or an owner's name (Philadelphia and Detroit publish the owner on each violation). |
lookup | no | string | — | One address, parcel number or owner name, for saved tasks and API calls that send a single value. |
lastDays | no | integer | 30 | Violations from the last N days. Empty: the last 30 days in export mode, all time in lookup mode. 0 means all time (large cities hold millions of rows: New York City added about 15,000 in one week). Ignored when a 'From' date is set. |
dateFrom | no | string | — | YYYY-MM-DD, inclusive. Overrides 'Last N days'. |
dateTo | no | string | — | YYYY-MM-DD, inclusive. Empty means up to today. |
categories | no | array | [] | Keep only violations of these types (matched on the violation's own wording). Empty means every type. One per line: lawn_weeds (Weeds, grass & overgrowth); trash_junk (Trash, junk & debris); vacant_unsafe (Vacant or unsafe buildings); rental_registration (Rental registration & certificates); elevator (Elevators); fire_safety (Fire safety (sprinklers, alarms, extinguishers)); roof_exterior (Roof & exterior walls); windows_doors (Windows & doors); porch_stairs (Porches, stairs & railings); plumbing (Plumbing & leaks); electrical (Electrical); heating_boiler (Heating, boilers & ventilation); pests (Pests & rodents); lead_mold (Lead paint, mold & asbestos); permits_construction (Permits & construction); vehicles (Vehicles & parking); interior (Interior repairs & paint). |
keywords | no | array | [] | Keep only violations whose description contains any of these words (e.g. sprinkler, demolition). Combined with Violation types: both must match. |
zips | no | array | [] | Keep only these 5-digit ZIP codes. Chicago's feed has no ZIP, so there it comes from the matched property record and rows without an owner match are left out. |
status | no | string | — | Open (still unresolved), closed (complied or dismissed) or any. Empty: open in export mode, any in lookup mode. |
includeUnfounded | no | boolean | false | Mesa records complaints an inspector found to be no violation, and duplicates; they are left out unless this is on. |
unpaidOnly | no | boolean | false | Only tickets with a balance due. Detroit is the city that publishes balances; other cities are skipped with a note when this is on. |
propertyTypes | no | array | [] | Keep only these property types, from the property record (Philadelphia and New York City publish it). Rows with no type known are left out when this is set. One per line: residential (Residential); mixed_use (Mixed use); commercial (Commercial); industrial (Industrial); vacant_land (Vacant land); other (Other). |
ownerTypes | no | array | [] | Keep only owners of these kinds, read from the owner's name. One per line: individual (Individual); company (Company (LLC, Inc...)); trust (Trust or estate); government (Government). |
absenteeOnly | no | boolean | false | Only owners whose mailing address is somewhere other than the property (another state, another city, or another address in the same city). |
withOwnerOnly | no | boolean | false | Leave out violations the actor could not match to an owner. |
groupBy | no | string | "violation" | Violation: one row per violation. Property: one row per address, with its violation count, types and the list of violations. Owner: one row per owner, with how many properties and violations they have. |
minViolations | no | integer | 1 | With one row per property or owner: keep only those with at least this many violations in the date range. |
maxResults | no | integer | 100 | Cap for EACH city (and each lookup). Rows are newest first; with one row per property or owner, the most-cited come first. |
Pricing (Pay Per Event)
You pay per result (violation) — no charge for empty runs. Example: 1000 violations at $0.004/result ≈ $4.00.
With one row per property, each property row is charged once ($0.006, event "Property") however many violations it lists; with one row per owner, each owner row once ($0.01, event "Owner"). Owner names and mailing addresses cost nothing extra. Compute is included; you pay only these events.
Use cases
- Trade marketing: every open weed violation in a few ZIP codes from the last 30 days, with the owner's mailing address, for a lawn-care mailer.
- Investor lists: vacant and unsafe properties whose owner lives out of state, one row per property, most-cited first.
- Landlord prospecting: owners with several properties cited for rental-registration failures in Detroit, one row per owner.
- Due diligence: the violation history of a list of addresses or parcel numbers before an offer or a loan.
- Weekly feed: a saved task with 'Last N days' set to 7 returns only what is new each week.
Why this actor
- The owner's name and mailing address on the row, not just the violation.
- One set of columns and 17 violation types across five cities' different feeds.
- Violation, property or owner rows, from the same run.
Limitations & updates
Five cities, each the city's own published feed: what a city does not publish (Chicago's ZIP codes, New York City owners' mailing addresses, fines outside Detroit and Mesa) is not on the rows. Owners come from public property records and are the owner of record or tax-bill name, which can lag a recent sale. Chicago rows get an owner only where one street address is one parcel (54% of a 7-day export on 2026-11-01). Violation types are matched on each city's wording and can miss a violation worded unusually; keywords cover the gaps. Mesa complaints an inspector found to be no violation are left out unless you ask for them. No phone numbers or emails.
FAQ
Which cities are covered?
Philadelphia (Licenses and Inspections code violations), Detroit (blight tickets), Chicago (Department of Buildings violations), Mesa, Arizona (code compliance cases) and New York City (HPD housing maintenance code violations). Each is the city's own open-data feed. Measured on 2026-11-01, the last 7 days held 1,944 violations in Philadelphia, 489 in Detroit, 563 in Chicago, 65 in Mesa and 15,035 in New York City.
Where does the owner come from, and how often is there one?
Detroit's tickets carry the owner's name and mailing address. Philadelphia's violations carry the owner's name, and the mailing address comes from the city's property roll (OPA). Mesa's owners come from the Maricopa County Assessor by parcel number, Chicago's from the Cook County Assessor by street address, and New York City's owner name from MapPLUTO, which publishes no mailing address. In a 7-day export on 2026-11-01 the owner's name was on 99% of Philadelphia rows, 100% of Detroit, 97% of Mesa, 100% of New York City (name only) and 54% of Chicago: Chicago misses are mostly large and condominium buildings, where one address has several parcels and no single owner, so none is given.
Do you return phone numbers or emails?
No. None of these public records carries a phone or email for the owner; the owner's name and mailing address are what is published.
How do the violation types work?
Each city words its violations differently ('EXTERIOR AREA WEEDS' in Philadelphia, 'Excessive weeds or plant growth' in Detroit, 'CUT OR REMOVE HIGH WEEDS' in Chicago). The 17 types match the violation's own wording, so 'Weeds, grass & overgrowth' finds all three. A violation can match several types; one that matches none is 'other'. Keywords search the same wording for anything the types do not cover.
Can I get all violations ever, not just recent ones?
Yes: set 'Last N days' to 0, or give a From date. Large cities hold millions of rows (New York City added about 15,000 in one week), so set 'Maximum rows per city' to what you want to pay for, or split the range into months. Leaving the dates empty means the last 30 days in export mode.
What do 'one row per property' and 'one row per owner' do?
Property rows group the violations in your date range by address (or parcel): the violation count, how many are still open, the types, the first and last date, the unpaid total where published, and the list of violations. Owner rows group by owner: how many cited properties they have and their addresses. Both are sorted most-cited first, and 'Minimum violations' keeps only repeat offenders.
How does lookup mode work?
Give street addresses, parcel numbers or owner names and pick the cities to search. Each one returns its violations (all time unless you set dates; any status unless you set one). Owner-name search works in Philadelphia and Detroit, where the violation record carries the owner; Chicago has no parcel number on its violations, so search Chicago by address.
What does the absentee flag mean?
It compares the owner's mailing address with the property: out_of_state, out_of_city, same_city_diff_address (mailed to another address in the same city) or owner_occupied. With no mailing address (New York City) it is unknown. 'Absentee owners only' keeps the first three.
How am I charged?
$0.004 per violation row, $0.006 per property row or $0.01 per owner row, depending on the row type you choose. Owner names and mailing addresses are included. Free rows (input to fix, no match, a city that did not answer, a stopped run) are never charged. 'Maximum rows per city' caps each city.
Which actor to choose
Works with:
- US County Property Records Export — You want every absentee-owned property in a county, cited or not, with values and sale history.
- US Property Lookup & Listing Scraper by APN/Parcel — You have parcel numbers from these rows and want the property's listing details.
Guides & use cases
Written up on scrapebench.dev — the bench that runs and verifies this actor against the live source every night:
- How-to: How to run Code Violation Leads: Property Owners, Fines & Violation Types
- Use case: Open code violations in Philadelphia with property owners
More actors, coverage and nightly verification results: scrapebench.dev
Works with AI assistants (MCP)
Callable as an MCP tool, so Claude, Cursor, VS Code Copilot and other MCP clients can run it directly. Grab the config from the MCP tab on this page — Apify hosts the server and keeps that snippet current, and OAuth signs you in on first connect, so no API token goes in your config file.
Then just ask:
"Find open weed violations in Philadelphia from the last 30 days where the owner lives somewhere else, with each owner's name and mailing address."
Add ZIP codes or a different violation type (trash, vacant buildings, rental registration) to narrow it; ask for one row per owner to see landlords with several cited properties. Runs started this way bill exactly like any other run.
Data & lawful use
This actor collects publicly available information that the City of Philadelphia (Department of Licenses and Inspections), the City of Detroit (Buildings, Safety Engineering and Environmental Department), the City of Chicago (Department of Buildings), the City of Mesa (Code Compliance), the New York City Department of Housing Preservation and Development, and the Philadelphia Office of Property Assessment, the Cook County Assessor, the Maricopa County Assessor and NYC MapPLUTO for owners publishes for public lookup — licence records, business listings and the contact details professionals list there. Some of it identifies individuals (sole proprietors, licence holders, agents), so treat any names, phone numbers and emails in your results as personal data.
When you run this actor, you decide what is collected and what it is used for, so you are the controller of that data and we act only as your processor (Apify Standard Actor Contract). You need a lawful basis for your use, must honour opt-out and deletion requests, and must follow the marketing rules that apply to you (CAN-SPAM, TCPA, GDPR, CCPA and similar). Don't use the output for unsolicited bulk messaging, for screening covered by the FCRA, or for anything the source's own terms forbid.
Your results are stored in your own Apify account. We don't keep a copy of your results and don't sell or share them.
Disclaimer
This is an independent tool. It is not affiliated with, endorsed by or sponsored by the City of Philadelphia (Department of Licenses and Inspections), the City of Detroit (Buildings, Safety Engineering and Environmental Department), the City of Chicago (Department of Buildings), the City of Mesa (Code Compliance), the New York City Department of Housing Preservation and Development, and the Philadelphia Office of Property Assessment, the Cook County Assessor, the Maricopa County Assessor and NYC MapPLUTO for owners. Names and marks are used only to describe the data source. Records are provided as published by the source and may be out of date or incomplete. For anything consequential (hiring, a permit, a legal decision), confirm the record with the issuing agency. You are responsible for making sure your use complies with applicable law and the source's terms.
Need help?
Open an issue on this actor's Issues tab and we'll respond there. Bug reports, missing fields and feature requests are all welcome. Guides and examples: scrapebench.dev.
If you are a person named in this data and want your record removed from our copy, email apify-help@scrapebench.dev; the source agency remains the official record.
Your run may be used to improve our services. If something looks off, or you want this actor to fit your use better, please share your run data with us: Apify Console → Settings → Security → Share run data with developers. It lets us see exactly what went wrong and keep improving the actor.