Code Violations Scraper - Distressed & Motivated Seller Leads avatar

Code Violations Scraper - Distressed & Motivated Seller Leads

Pricing

from $3.00 / 1,000 violations

Go to Apify Store
Code Violations Scraper - Distressed & Motivated Seller Leads

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

PermitData

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

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 listHow to get it
Code violation property list (any covered city)default scrape mode, pick sources
Distressed property list / motivated sellersdistressScoring: 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 listBaltimore vacant-building notices, Cleveland active condemnations, category: vacant_abandoned anywhere
Tax-delinquent + violation stackCleveland (county enrichment adds unpaid-tax balance + foreclosure flag)
Demolition / unsafe structure listcategories: ["demolition", "unsafe_structure"]
Daily alert feed of new violationsmonitor 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) with distress_reasons; higher means more likely a motivated seller (open case, severe category like demolition/unsafe/vacant, long-unresolved, absentee owner, unpaid taxes). Filter to minDistressScore: 60 and status: open for 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

CityStatusLast verifiedRefreshOwnerSeverity signal
Detroit, MI (Blight Violations)✅ verified2026-07-03dailyname + mailing addressabsentee-owner flag
Philadelphia, PA (L&I Violations)✅ verified2026-07-04dailyowner name~2M records, OPEN/CLOSED
Chicago, IL (Building Violations)✅ verified2026-07-03dailyOPEN/CLOSED status
New York City, NY (HPD housing)✅ verified2026-07-03~weeklyname (PLUTO)class A/B/C hazard
Cincinnati, OH (Code Enforcement)✅ verified2026-07-03dailystatus + type
San Francisco, CA (DBI complaints)✅ verified2026-07-04dailyNOV type + status
Seattle, WA (SDCI code)✅ verified2026-07-04dailycomplaint vs violation
New Orleans, LA (Code Enforcement)✅ verified2026-07-04dailyviolation type
Los Angeles, CA (open code cases)✅ verified2026-07-04weeklyall cases open/active
Austin, TX (Code Complaints)✅ verified2026-07-04dailystatus + repeat-offender flag
Baltimore, MD (vacant-building notices)✅ verified2026-07-04dailyname + mailing addressall open + vacant
Boston, MA (building & property violations)✅ verified2026-07-04dailyname + mailing + assessed valueOPEN/CLOSED + absentee
Cleveland, OH (B&H violation notices)✅ verified2026-07-04weeklyname + mailing + tax dataopen + tax-delinquency
Cleveland, OH (active condemnations)✅ verified2026-07-04weeklyname + mailing + tax datacondemned + tax-delinquency
Columbus, OH (code enforcement cases)✅ verified2026-07-04daily❌ (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 ActorPropStream / BatchLeads / DealMachine
AccessAPI-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 pathSource-direct city & county open dataAggregated third-party feeds
Coverage honestyPer-city matrix + daily verified badgeOpaque
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 (sinceDays or explicit sinceDate/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

  1. Click Try for free (first 25 records are free; no card needed on the free plan).
  2. Pick your sources (start with an owner-data city: detroit, cleveland, or baltimore).
  3. Set sinceDays: 30, distressScoring: true, minDistressScore: 60, statuses: ["open"].
  4. 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 ApifyClient
client = 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 distressScoring is 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.

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.