Code Violation Leads: Property Owners, Fines & Violation Types avatar

Code Violation Leads: Property Owners, Fines & Violation Types

Pricing

from $0.004 / violation

Go to Apify Store
Code Violation Leads: Property Owners, Fines & Violation Types

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

ScrapeBench

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

4 days ago

Last modified

Security

Limited permissions

Share

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:

FieldDescription
cityThe city whose feed the row came from
violation_idThe city's own ID for the violation or ticket
case_numberThe city's case, inspection or ticket number
violation_dateWhen the violation was cited
statusopen, closed or no_violation
status_detailThe city's own status words
categoriesViolation types matched from the city's wording (lawn_weeds, trash_junk, roof_exterior...)
violation_codeThe code or ordinance cited
violation_descriptionWhat the city says is wrong
severityThe city's priority or class (NYC class A, B or C)
fine_amountFine or fee where published
balance_dueUnpaid balance where published (Detroit, Mesa)
hearing_dateHearing date where published (Detroit)
addressStreet address of the property
zipZIP code of the property
parcel_idParcel number (OPA account, APN, BBL, Detroit parcel)
property_typeresidential, commercial, vacant_land... where the property record gives it
owner_nameThe property owner of record
owner_typeindividual, company, trust or government, read from the name
owner_mailing_addressWhere the owner receives mail (plus city, state and ZIP columns)
absenteeout_of_state, out_of_city, same_city_diff_address, owner_occupied or unknown
owner_sourceWhich public record the owner came from
violation_countProperty and owner rows: violations in the date range, with the list in 'violations'
property_countOwner rows: how many cited properties the owner has
source_urlThe source record for this violation
source_fieldsEvery 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

FieldRequiredTypeDefaultDescription
modenostring"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.
citiesnoarray["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).
citynostring—One city, for saved tasks and API calls that send a single value. Use Cities above for several.
lookupsnoarray[]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).
lookupnostring—One address, parcel number or owner name, for saved tasks and API calls that send a single value.
lastDaysnointeger30Violations 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.
dateFromnostring—YYYY-MM-DD, inclusive. Overrides 'Last N days'.
dateTonostring—YYYY-MM-DD, inclusive. Empty means up to today.
categoriesnoarray[]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).
keywordsnoarray[]Keep only violations whose description contains any of these words (e.g. sprinkler, demolition). Combined with Violation types: both must match.
zipsnoarray[]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.
statusnostring—Open (still unresolved), closed (complied or dismissed) or any. Empty: open in export mode, any in lookup mode.
includeUnfoundednobooleanfalseMesa records complaints an inspector found to be no violation, and duplicates; they are left out unless this is on.
unpaidOnlynobooleanfalseOnly tickets with a balance due. Detroit is the city that publishes balances; other cities are skipped with a note when this is on.
propertyTypesnoarray[]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).
ownerTypesnoarray[]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).
absenteeOnlynobooleanfalseOnly owners whose mailing address is somewhere other than the property (another state, another city, or another address in the same city).
withOwnerOnlynobooleanfalseLeave out violations the actor could not match to an owner.
groupBynostring"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.
minViolationsnointeger1With one row per property or owner: keep only those with at least this many violations in the date range.
maxResultsnointeger100Cap 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:

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.