Code Violations Scraper - Distressed & Motivated Seller Leads
Pricing
from $3.00 / 1,000 violations
Code Violations Scraper - Distressed & Motivated Seller Leads
Motivated-seller leads from city code violations: owner name + mailing address, absentee-owner, tax-delinquency & foreclosure flags, 0-100 distress score. 15 verified sources (Chicago, NYC, Philly, Detroit +11) checked daily. Source-direct government data from $3/1,000.
Pricing
from $3.00 / 1,000 violations
Rating
0.0
(0)
Developer
PermitData
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
US Code Violations Scraper: Distressed Property & Motivated Seller Leads
A code violation is the city telling you a property is in trouble, long before it hits the MLS. This Actor watches code enforcement feeds across 15 verified city sources, normalizes every record to one schema, scores it 0-100 for distress, and, where the government publishes it, attaches the property owner's name and mailing address, an absentee-owner flag, tax-delinquency balance, and foreclosure status. Built for real-estate wholesalers, fix-and-flip investors, and agents hunting off-market deals. It's driving for dollars without the driving, source-direct from official city open-data APIs. No proxies, no fragile HTML scraping, no reseller feed that can vanish.
Pick your lead list
| Lead list | How to get it |
|---|---|
| Code violation property list (any covered city) | default scrape mode, pick sources |
| Distressed property list / motivated sellers | distressScoring: true, minDistressScore: 60, statuses: ["open"] |
| Absentee owner list (owner mails out-of-state) | owner-data cities (Detroit, Cleveland, Baltimore) — filter extra.absentee_owner |
| Vacant & condemned property list | Baltimore vacant-building notices, Cleveland active condemnations, category: vacant_abandoned anywhere |
| Tax-delinquent + violation stack | Cleveland (county enrichment adds unpaid-tax balance + foreclosure flag) |
| Demolition / unsafe structure list | categories: ["demolition", "unsafe_structure"] |
| Daily alert feed of new violations | monitor mode on an Apify schedule + webhook |
Why this one
- Verified coverage, not claimed coverage. Every listed city passes an automated daily canary check. If a source breaks, it gets flagged here and in your run's health report, so you never pay for a silently broken city. Each city shows its last-verified date below.
- A distress score built for lead-gen. Every case gets a transparent
distress_score(0-100) withdistress_reasons; higher means more likely a motivated seller (open case, severe category like demolition/unsafe/vacant, long-unresolved, absentee owner, unpaid taxes). Filter tominDistressScore: 60andstatus: openfor a hot-lead list. - Owner data where it exists, free. Six of the fifteen feeds carry the owner's name (five with mailing address) from government records, at no extra charge.
- Honest schema. A field a city doesn't publish is
null, never guessed. The per-city matrix below tells you exactly what you'll get before you run. - Monitor mode. Run it on a schedule and get only new cases since your last run: watermarked, deduplicated, webhook-ready.
- Works with AI agents. Callable via MCP from Claude, Cursor, or any MCP client.
Who buys this
Real-estate wholesalers ("we buy houses"), fix-and-flip and buy-and-hold investors, agents targeting distressed inventory, property-service contractors (repair/cleanup work), and PropTech/insurance teams. Code violations are a leading signal of a property in trouble, and of an owner who may sell below market.
Coverage
| City | Status | Last verified | Refresh | Owner | Severity signal |
|---|---|---|---|---|---|
| Detroit, MI (Blight Violations) | ✅ verified | 2026-07-03 | daily | ✅ name + mailing address | absentee-owner flag |
| Philadelphia, PA (L&I Violations) | ✅ verified | 2026-07-04 | daily | ✅ owner name | ~2M records, OPEN/CLOSED |
| Chicago, IL (Building Violations) | ✅ verified | 2026-07-03 | daily | ❌ | OPEN/CLOSED status |
| New York City, NY (HPD housing) | ✅ verified | 2026-07-03 | ~weekly | ✅ name (PLUTO) | class A/B/C hazard |
| Cincinnati, OH (Code Enforcement) | ✅ verified | 2026-07-03 | daily | ❌ | status + type |
| San Francisco, CA (DBI complaints) | ✅ verified | 2026-07-04 | daily | ❌ | NOV type + status |
| Seattle, WA (SDCI code) | ✅ verified | 2026-07-04 | daily | ❌ | complaint vs violation |
| New Orleans, LA (Code Enforcement) | ✅ verified | 2026-07-04 | daily | ❌ | violation type |
| Los Angeles, CA (open code cases) | ✅ verified | 2026-07-04 | weekly | ❌ | all cases open/active |
| Austin, TX (Code Complaints) | ✅ verified | 2026-07-04 | daily | ❌ | status + repeat-offender flag |
| Baltimore, MD (vacant-building notices) | ✅ verified | 2026-07-04 | daily | ✅ name + mailing address | all open + vacant |
| Boston, MA (building & property violations) | ✅ verified | 2026-07-04 | daily | ✅ name + mailing + assessed value | OPEN/CLOSED + absentee |
| Cleveland, OH (B&H violation notices) | ✅ verified | 2026-07-04 | weekly | ✅ name + mailing + tax data | open + tax-delinquency |
| Cleveland, OH (active condemnations) | ✅ verified | 2026-07-04 | weekly | ✅ name + mailing + tax data | condemned + tax-delinquency |
| Columbus, OH (code enforcement cases) | ✅ verified | 2026-07-04 | daily | ❌ (parcel number included) | Active/status + type |
| More major cities | 🔜 rolling out | — | — | — | — |
Detroit is the flagship native source: the city itself publishes the property owner's name and mailing address, so the feed flags absentee owners (owner mailing state ≠ property state), one of the strongest motivated-seller signals. Fine amounts and collection status included.
New cities ship regularly. Want a specific city or county? Open an issue and it goes to the top of the queue.
Owner & financial-distress enrichment (absentee owners, unpaid taxes, foreclosure)
For supported cities, each record is joined to the county assessor's public parcel records (on the parcel number the violation already carries) to add data the code dataset itself doesn't publish:
- Owner name and mailing address → automatic absentee-owner flagging (owner mailing state ≠ property state).
- Tax-delinquency balance and foreclosure status. A property with an open violation, unpaid taxes, and an out-of-state owner is a prime lead, and the distress score reflects all three.
Live now: Cleveland (Cuyahoga County Fiscal Office: owner name, mailing address,
tax-delinquency, foreclosure; daily), New York City (Dept. of City Planning PLUTO:
owner name by tax lot/BBL), Baltimore (city real property: owner name, mailing
address, vacant indicator), and Boston (FY2026 Property Assessment, joined via the
city's live SAM address registry: owner name, owner mailing address, assessed value,
owner-occupied flag, plus the parcel ID backfilled onto each record). More cities and
counties are rolling out. Enrichment is on by default and adds no extra charge; turn it
off with enrichOwners: false. Owner data is public record, published by the government
for public use.
PropStream / DealMachine / BatchLeads alternative?
If you're paying a monthly seat plus credits just to pull code violation and distressed-property lists, this Actor replaces that slice of your stack with source-direct government data:
| This Actor | PropStream / BatchLeads / DealMachine | |
|---|---|---|
| Access | API-first (Apify, schedules, webhooks, MCP) | Web app / app, seat-based |
| Price | $0.003/record, $0.02/scored lead, no subscription | ~$60–120/mo + credits |
| Data path | Source-direct city & county open data | Aggregated third-party feeds |
| Coverage honesty | Per-city matrix + daily verified badge | Opaque |
| Owner phones | ❌ no skip-tracing (see FAQ) | Included at credit prices |
Honest trade-off: this Actor does not skip-trace phone numbers. It hands you the owner's name and mailing address (where government records publish them), exactly the inputs that make any skip-trace tool or direct-mail campaign work. Pair it with the skip-tracer you already use and you're still paying a fraction of a per-credit platform.
Output schema (one row per violation)
{"violation_id": "chicago:7511764","case_number": "7511764","source": "chicago","source_label": "Chicago, IL","state": "IL","status": "open","status_raw": "OPEN","category": "unsafe_structure","categories_all": ["unsafe_structure", "vacant_abandoned"],"severity": "high","violation_type_raw": "DANGEROUS AND UNSAFE - VACANT OPEN AND HAZARDOUS","description": "…","address": "4959 S BLACKSTONE AVE","zip": null,"latitude": 41.804,"longitude": -87.590,"opened_date": "2026-07-01","last_activity_date": "2026-07-01","department": "BUILDING","parcel_number": "20-11-114-001","owner_name": null,"distress_score": 70,"distress_reasons": ["category:unsafe_structure(+40)", "multi:vacant_abandoned(+5)", "open(+25)"],"dedupe_key": "…","first_seen_at": "2026-07-03T…Z"}
On owner-data cities, owner_name is populated and extra carries
owner_mailing_address / owner_mailing_state, absentee_owner, and (Cleveland)
tax_delinquent_balance + foreclosure flags.
Categories: demolition, unsafe_structure, vacant_abandoned, fire, health_safety, vehicles, vegetation, junk_debris, zoning, occupancy, property_maintenance, other. Classification is deterministic keyword matching on the violation type + description. Reproducible, no LLM randomness.
Distress score (how it's computed, no magic)
Starts from the violation category (demolition/unsafe/vacant = highest), then adds points
for: an open/unresolved case, a long-unresolved open case (older = more motivated),
NYC class C (immediately hazardous) / class B, multiple violation types at once, a
known owner, an absentee owner (+12), tax delinquency (+8, +12 above $1k/$5k), and
foreclosure (+15). Every row shows the exact breakdown in distress_reasons. Filter
with minDistressScore + statuses: ["open"].
Modes
- Scrape: pull a date range (
sinceDaysor explicitsinceDate/untilDate). - Monitor: stateful, emits only cases you haven't seen, with a 3-day overlap re-check. Point a schedule + webhook at it and you have a distressed-property alert feed.
- Canary: free self-test of all sources; optionally posts the health summary to a Discord webhook. I run it daily myself.
How to use
- Click Try for free (first 25 records are free; no card needed on the free plan).
- Pick your
sources(start with an owner-data city:detroit,cleveland, orbaltimore). - Set
sinceDays: 30,distressScoring: true,minDistressScore: 60,statuses: ["open"]. - Save & Start, then download JSON/CSV/Excel from the Output tab, ready for your dialer, direct-mail list, or CRM.
From Python:
from apify_client import ApifyClientclient = ApifyClient("<APIFY_TOKEN>")run = client.actor("permitdata/us-code-violations-scraper").call(run_input={"mode": "scrape","sources": ["detroit", "cleveland", "baltimore"],"sinceDays": 30,"distressScoring": True,"minDistressScore": 60,"statuses": ["open"],})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row["distress_score"], row["address"], row.get("owner_name"))
Pricing
- First 25 records free (per account, ever).
- $0.003 per violation (raw normalized record), $3.00 per 1,000.
- $0.02 per scored lead when
distressScoringis on. Replaces the per-violation charge, so you're never double-billed for the same row. - Owner enrichment is free, with no per-lookup charge.
Example: a weekly Detroit + Cleveland + Baltimore pull of ~500 scored, filtered hot leads costs about $10, less than most platforms charge for 100 credits.
FAQ
How do I get a code violation list for my city?
If your city is in the coverage table, select it in sources and run. If it isn't, open
an issue; cities with open data get added quickly.
Can I get owner phone numbers?
No. This Actor does no skip-tracing. It returns the owner name and mailing address where government records publish them, which is the input every skip-trace tool needs. This keeps the data 100% public-record and keeps your compliance story clean.
What is an absentee owner and why does it matter?
An owner whose tax bill mails to a different state than the property. Combined with an open violation, it's one of the strongest signals of a neglected property and a seller open to an offer. The Actor flags this automatically on owner-data cities.
Can I schedule a daily or weekly motivated-seller feed?
Yes: use monitor mode with an Apify schedule and a webhook. You'll get only new
violations since the last run, deduplicated.
Is this legal to use?
The data comes from official government open-data portals published for public use under open/public-domain licenses. Accessing public records for investment research is legal in the US. See the FCRA disclaimer below; you're responsible for how you use the output.
Does it work with AI agents?
Yes, the Actor is callable via MCP from Claude, Cursor, or any MCP client, so an agent can pull scored leads as a tool call.
FCRA disclaimer
This Actor is intended for real-estate purchase offers and investment research only. The output may not be used for tenant screening, credit decisions, employment screening, insurance underwriting, or any other purpose regulated by the Fair Credit Reporting Act (FCRA), 15 U.S.C. § 1681 et seq. You are solely responsible for your use of the output.
Fair use & data provenance
All data comes from official government open-data portals published for public use, under open / public-domain licenses. No login-walled sources, no private databases, no skip-tracing; owner data appears only where a government source itself publishes it.
Some sources carry a share-alike open license (e.g. Cleveland's datasets are under the Open
Data Commons Open Database License, ODbL); attribution to the originating city is preserved
in each record's source / source_label and source_portal fields.
Support
Issues tab, or the contact form on my profile. Broken-source reports are typically fixed within 24-48h; my own daily canary usually catches breakage before users hit it.
If this Actor helps you find deals, a quick review on this page helps other investors find it, and city/county requests from reviewers get built first.