Code Violation Leads (Accela Code Enforcement Cases) avatar

Code Violation Leads (Accela Code Enforcement Cases)

Pricing

from $6.00 / 1,000 enforcement case records

Go to Apify Store
Code Violation Leads (Accela Code Enforcement Cases)

Code Violation Leads (Accela Code Enforcement Cases)

Code violation leads: code enforcement cases from any Accela Citizen Access city or county with case type, status, address and date. Distressed property lists.

Pricing

from $6.00 / 1,000 enforcement case records

Rating

0.0

(0)

Developer

Final Dynamics

Final Dynamics

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

17 hours ago

Last modified

Share

Pull code violation leads and code enforcement cases from any city or county that runs Accela Citizen Access: property registrations, complaints, violation notices, stop-work orders and the other records a code enforcement office opens. Give it an agency and a date range; get one row per case with the type, status, address and a link to the public record.

A code violation is often the first public sign of a distressed or neglected property. Real estate investors, wholesalers, property managers and contractors use these rows as leads weeks before the same address shows up in foreclosure or tax lists.

What you get

One row per case. Every field is flat, so the dataset drops straight into Google Sheets, Airtable or a CRM.

FieldExample
permitNumberVR-2026-00483 (the case number)
temporaryNumber26TMP-050333 if the case was still being filed
permitTypeProperty Registration, Zoning Complaint
statusAs published; often empty while a case is being opened
appliedDate2026-09-14 (date opened or last updated)
addressFull, street, addressCity, addressState, zip, parcelId1014 ADA AVE NW, ATLANTA GA 30318
description, shortNotesThe case description and notes columns
detailUrlDirect link to the public case record, when one exists
recordKindenforcement_case
agencyKey, agencyName, city, state, moduleWhich portal the row came from
isNewSinceLastRun, previousStatus, statusChangedSet by the incremental and monitoring modes
scrapedAtUTC timestamp

Anything the portal does not publish is null. Owner names are off by default because owners are usually private individuals; turn on includeOwnerName together with includeDetails if you need them and your use allows it.

How to use it

Pick an agency, set a date range, run.

{
"agency": "ATLANTA_GA",
"module": "Enforcement",
"dateFrom": "2026-09-08",
"dateTo": "2026-09-15",
"maxResults": 200
}

Both dates are inclusive. maxResults caps the rows you pay for.

The actor reads the selected module's Record Type list and uses permitTypeContains to choose matching case types for server-side searches. It scans the full date window and filters rows locally when the agency publishes no list, nothing matches, or more than 25 types match; the run log explains the fallback. Leaving both filters empty includes all types.

To choose types yourself, set recordTypes to names or raw values from that menu, for example ["Code Complaint"] in Atlanta. Up to 25 explicit types are accepted. An unknown name stops the run with examples from the available list; if the list is unavailable, clear recordTypes to use the full scan. permitTypeContains still filters the returned rows when recordTypes is set.

maxPages defaults to 60 result pages across all type searches, including searches with no matches. At the limit the run stops and tells you to raise maxPages, narrow lastDays or dateFrom/dateTo, or select fewer recordTypes. Plain runs write rows page by page, preserving completed pages if a later request fails or the run is killed. With includeDetails, rows wait until the run-wide detail failure check passes. Persistent status-monitor runs keep all-or-nothing delivery: an incomplete run writes no rows and does not seed or advance its baseline. Both maxPages and statusMonitorMaxPages apply to monitors across all searches; the lower limit wins. An incomplete run never advances the sinceLastRun watermark.

Atlanta's saved Enforcement form publishes Code Complaint and Property Registration in that menu. Selection uses those case types from the Enforcement module, not Building permit types. Other agencies may publish a different list or none at all.

Recent cases on a schedule: set lastDays: 14 to search the last 14 calendar days ending today (UTC), including today. The date window moves automatically on every run, overriding dateFrom and dateTo, so saved tasks stay current. Leave lastDays at 0 to use fixed dates.

Complaints and violation notices only, skipping routine registrations:

{
"agency": "ATLANTA_GA",
"module": "Enforcement",
"dateFrom": "2026-09-01",
"dateTo": "2026-09-15",
"permitTypeContains": ["complaint", "violation"]
}

Parcel numbers and permanent case numbers: set includeDetails: true to read each case's public detail page. Enforcement detail pages carry less than permit pages do, so start without it.

Only cases you have not seen before: create a key-value store in Apify Console, select it as stateStoreId, set sinceLastRun: true, and reuse the same run configuration (a saved task). Each complete run remembers the newest applied date it delivered and the next run emits only cases with a newer applied date. A run that hits a cap or an error never moves that marker, so nothing is skipped.

Status changes on a schedule: create a key-value store in Apify Console, select it as statusStateStoreId, and schedule the task. The first complete run stores every case's status; later runs emit only cases whose status changed, with previousStatus filled in. Give each schedule its own store.

Any other Accela portal: set agency to the portal's agency code and portalUrl to its base URL, for example https://aca-prod.accela.com/CITYNAME/. Not every agency publishes an Enforcement module; when one does not, the run says so.

Quick start

No code needed; about two minutes from input to spreadsheet. For a longer walkthrough with example output, read the guide Build a code violation research spreadsheet.

  1. Open the example "Code violation leads, Atlanta, last 14 days" on this actor's page, or paste one of the inputs above into the input form.
  2. Click Start and wait until the run shows Succeeded.
  3. Open the Output tab to see the cases as a table.
  4. Click Export, choose CSV or Excel, and download the file.
  5. In Google Sheets, choose File > Import > Upload and select the file.

Automate it

A weekly lead pull: keep lastDays in the task (for example 7 or 14) so the date window moves with every run. Click Save as a new task, then add a schedule for that task under Schedules in Apify Console (for example every Monday at 07:00). To get only cases you have not received before, turn on sinceLastRun and select a key-value store as stateStoreId.

Into Google Sheets with n8n: add the Apify node with the On new Apify Event trigger, choose your task and the succeeded event, then add an Apify node with Get Dataset Items using the run's defaultDatasetId, and finish with a Google Sheets node that appends the rows. Every scheduled run then adds its cases to the same sheet. Make and Zapier have Apify integrations that work the same way.

Pricing

Pay per event. There are no platform usage charges on top.

EventPriceWhen
actor-start$0.01Once per run
permit-record$0.006Per case row delivered
contractor-detail-page$0.004Per case page fetched, only when includeDetails is on

Examples: 200 cases cost $1.21. A weekly pull of 50 new cases is $0.31. A run that finds nothing costs $0.01. Set a maximum charge on the run for a hard ceiling; the actor stops cleanly at the cap.

Coverage

The same 24 bundled portals as the Accela Building Permit Scraper by the same publisher (Atlanta, Hillsborough County, Tampa, Sacramento, Milwaukee, Reno, Hartford and others), plus any Accela Citizen Access portal you supply with portalUrl. Whether an agency exposes an Enforcement module is up to that agency; Atlanta does. Try one short date range first on a new agency.

This listing runs the same code as the Accela Building Permit Scraper. Set module to Building or Planning here and you get permits or planning cases with the same fields.

Good to know

  • If a case detail page remains unavailable after retries, its grid row is retained with detailFetchFailed: true, null detail-only fields and no detail-page charge, unless more than 20% of attempted detail pages or more than 25 pages fail, which stops the run before row delivery.
  • Public records only. The actor reads the same pages a visitor sees, honours the portal's robots rules, and never logs in, solves CAPTCHAs or uses proxies. A block is a failed run, never an empty success.
  • Requests are polite: at most two at a time per portal, with retries and backoff on errors.
  • The date column is what the agency publishes. For Atlanta it is the case's most recent activity date, so a case can reappear with a newer date.
  • Cases still being filed show a temporary number and no detail link; the permanent number appears once the agency publishes the record.
  • The actor is not affiliated with Accela or with any listed agency. Public records can be incomplete or corrected later.

FAQ

How do I get a code violation list for my city?

If the city runs Accela Citizen Access with an Enforcement module (Atlanta does), enter its agency key and lastDays. One short run shows whether cases come back.

Are code violations good leads for real estate investors?

A violation often marks a neglected or vacant property whose owner may want to sell. The list gives you the address and case details; owner names and phone numbers are not part of it.

Can I export code violations to Excel?

Yes. Open the Output tab after the run and export CSV or Excel, or send each scheduled run to Google Sheets as described above.

Questions or a portal that misbehaves? Open an issue on the actor page and include the agency and date range.