Code Violation Leads (Accela Code Enforcement Cases)
Pricing
from $6.00 / 1,000 enforcement case records
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
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
2
Monthly active users
5 days ago
Last modified
Categories
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.
| Field | Example |
|---|---|
permitNumber | VR-2026-00483 (the case number) |
temporaryNumber | 26TMP-050333 if the case was still being filed |
permitType | Property Registration, Zoning Complaint |
status | As published; often empty while a case is being opened |
appliedDate | 2026-09-14 (date opened or last updated) |
addressFull, street, addressCity, addressState, zip, parcelId | 1014 ADA AVE NW, ATLANTA GA 30318 |
description, shortNotes | The case description and notes columns |
detailUrl | Direct link to the public case record, when one exists |
recordKind | enforcement_case |
agencyKey, agencyName, city, state, module | Which portal the row came from |
isNewSinceLastRun, previousStatus, statusChanged | Set by the incremental and monitoring modes |
scrapedAt | UTC 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, choose how far back to look, run.
{"agency": "ATLANTA_GA","module": "Enforcement","lastDays": 7,"maxResults": 200}
lastDays is prefilled at 7: the last 7 calendar days ending today (UTC), including today, so a
saved task stays current. For a fixed window, set lastDays to 0 and give dateFrom and
dateTo; both dates are inclusive. A run that gives neither also searches the last 7 days.
maxResults caps the rows you pay for.
permitTypeContains keeps only rows whose record type contains one of your words. To choose types
yourself instead, set recordTypes to names from the selected module's Record Type menu, for
example ["Code Complaint"] in Atlanta. Up to 25 types are accepted. A name the portal does not
offer stops the run and lists examples of what it does offer; if the portal publishes no menu, clear
recordTypes and the actor searches every type. permitTypeContains still filters the rows when
recordTypes is set, and leaving both empty returns every type. A narrow filter can still take a
while on portals where the actor has to read the whole date window.
maxPages (60 by default) is the most result pages one run reads, counting every record type it
searches, even types with no matches. A run that reaches it stops and tells you to raise maxPages,
shorten the date window or pick fewer recordTypes. What you keep from a run that stops early
depends on the mode:
- A run without
includeDetailsor a status monitor saves rows page by page, so you keep every finished page even if a later page fails or the run is aborted. - With
includeDetails, rows are saved at the end, once the actor has checked that enough case pages loaded (see Good to know). A details run that is aborted or times out before then saves no rows, so give it enough time. - A status monitor saves all or nothing: an incomplete run delivers no rows and leaves the saved
statuses as they were.
statusMonitorMaxPagesalso limits monitors, and the lower of it andmaxPagesapplies. - An incomplete run never moves the
sinceLastRunmarker forward, so nothing is skipped; rows it did deliver may come again, and be charged again, on the next run.
In Atlanta, the Enforcement module's Record Type menu offers Code Complaint and Property Registration. Use the case types from the Enforcement menu, not Building permit types. Other agencies may offer 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. Set lastDays to 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. It also remembers which cases it delivered, so a case the portal republishes
without an applied date is not sent to you twice. 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 on aca-prod.accela.com: set agency to the portal's agency code and
portalUrl to its base URL, for example https://aca-prod.accela.com/CITYNAME/. Portals a city
hosts on its own domain are not supported yet. 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.
- 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.
- Click Start and wait until the run shows Succeeded.
- Open the Output tab to see the cases as a table.
- Click Export, choose CSV or Excel, and download the file.
- 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.
| Event | Price | When |
|---|---|---|
actor-start | $0.01 | Once per run |
permit-record | $0.006 | Per case row delivered |
contractor-detail-page | $0.004 | Per 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 Building Permit Scraper (Accela cities) by the same publisher
(Atlanta, Hillsborough County, Tampa, Sacramento, Milwaukee, Reno, Hartford and others), plus any
Accela Citizen Access portal on aca-prod.accela.com 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.
Set module to Building or Planning to get permits or planning cases with the same fields.
Good to know
- If a case's own record page still fails to load after retries, the case is delivered from the
search results with
detailFetchFailed: true, the fields that come only from that page empty, and nocontractor-detail-pagecharge. If more than 25 record pages, or more than 20% of those tried, fail, the run stops and saves no rows. - Public records only. If a portal blocks access, the run fails with a clear message rather than returning an empty result.
- 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.
Related actors
- Building Permit Scraper (Accela cities): building permits with contractor details from Accela cities and counties.
- Florida Lis Pendens, Pre-Foreclosure & Deed Leads: lis pendens and deeds from six Florida county clerks.
- Florida Vacant Land & Absentee Owner Leads: vacant parcels and out-of-state owners in every Florida county.
Questions or a portal that misbehaves? Open an issue on the actor page and include the agency and date range.