Accela Building Permit Scraper: Contractors & Status Changes avatar

Accela Building Permit Scraper: Contractors & Status Changes

Pricing

from $6.00 / 1,000 permit records

Go to Apify Store
Accela Building Permit Scraper: Contractors & Status Changes

Accela Building Permit Scraper: Contractors & Status Changes

Building permit data and leads from any Accela Citizen Access city or county: permit type, status, address, valuation and contractor details, with status change alerts.

Pricing

from $6.00 / 1,000 permit records

Rating

0.0

(0)

Developer

Final Dynamics

Final Dynamics

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 hours ago

Last modified

Share

Pull building permit data and building permit leads from any city or county that runs Accela Citizen Access, the permitting portal used by hundreds of US jurisdictions. Give it an agency and a date range; get one clean row per permit with the type, status, address, valuation and, if you want them, the contractor's name, licence and phone from the permit page.

Built for people who buy permit data on a schedule: roofing, solar, HVAC and remodeling contractors looking for fresh projects, lead sellers, suppliers watching new construction, and anyone who needs a weekly feed instead of a one-off export.

What you get

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

FieldExample
permitNumberBP-202603758
permitTypeCommercial - Fire Sprinkler
permitTypeNormalizedroofing, solar, hvac, new_construction, electrical, plumbing, demolition or other
statusRouted for Review
appliedDate2026-09-15
addressFull, street, addressCity, addressState, zip140 CHASTAIN PARK AVE NW, ATLANTA GA 30339
descriptionProject description as published
declaredValuationUsd48500 (from the permit page, when published)
contractorName, contractorLicense, contractorPhoneFrom the permit page with includeDetails
parcelId, issuedDate, finalDateFrom the permit page, when published
detailUrlDirect link to the public permit record
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": "Building",
"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 permit 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 ["Commercial Demolition"] 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.

Recent permits 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.

Roofing and solar jobs worth $10,000 or more, with contractor details:

{
"agency": "SACRAMENTO",
"module": "Building",
"dateFrom": "2026-09-01",
"dateTo": "2026-09-15",
"permitTypeContains": ["roof", "solar"],
"minValuation": 10000,
"includeDetails": true
}

permitTypeContains matches any of the words against the permit type. Valuation and contractor fields live on the permit page, so includeDetails must be on for minValuation to apply.

Only permits 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 permits 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 permit's status; later runs emit only permits whose status changed, with previousStatus filled in. Give each schedule its own store.

Other record types: set module to Enforcement for code enforcement cases or Planning for planning and zoning cases. The same fields are used; permitNumber holds the case number.

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/. Portals must offer a public General Search with a date range; a handful do not, and the run reports that clearly.

Quick start

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

  1. Open the example "Sacramento roofing and solar permits, 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 permits 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 permit 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 permits you have not received before, turn on sinceLastRun and select a key-value store as stateStoreId; for status changes use statusStateStoreId as described above.

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 permits 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 permit row delivered
contractor-detail-page$0.004Per permit page fetched, only when includeDetails is on

Examples: 200 permits without details cost $1.21. Twenty permits with contractor details cost $0.21. A weekly pull of 500 permits with details is about $5.01. A run that finds nothing costs $0.01.

Set a maximum charge on the run if you want a hard ceiling; the actor stops cleanly at the cap.

Coverage

These portals are bundled and verified. Any other portal hosted on aca-prod.accela.com works with portalUrl; portals a city hosts on its own domain are not supported yet.

Agency keyJurisdictionState
ANAHEIMAnaheimCA
ATLANTA_GAAtlantaGA
BREABreaCA
CRYSTALLAKECrystal LakeIL
CULVERCITYCulver CityCA
DELANDDeLandFL
DOWNEYDowneyCA
FONTANAFontanaCA
GOODYEARGoodyearAZ
HARTFORDHartfordCT
HCFLHillsborough CountyFL
HERMOSABEACHHermosa BeachCA
LOVELANDLovelandCO
MANTECAMantecaCA
MILWAUKEEMilwaukeeWI
MISSOULAMissoulaMT
MONTEREYPARKMonterey ParkCA
PALOALTOPalo AltoCA
RENORenoNV
SACRAMENTOSacramentoCA
STOCKTONStocktonCA
TAMPATampaFL
THURSTONCOThurston CountyWA
VISALIAVisaliaCA

Some fields vary by agency: a few portals publish no valuation in the results grid, and a few list the address in a different column. Rows always carry what the portal shows.

Good to know

  • If a permit 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. If a portal blocks access, the run fails with a clear message rather than returning an empty result.
  • Requests are polite: at most two at a time per portal, with retries and backoff on errors.
  • Dates are the portal's local calendar dates. A permit's applied date is what the agency shows in the results grid; on some portals that is the last update date.
  • 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 list of new building permits for my city?

If your city or county runs Accela Citizen Access (the site address usually contains aca-prod.accela.com), enter its agency key and a date range or lastDays. The Coverage table lists the portals we have verified.

Can I get roofing, solar or HVAC permit leads only?

Yes. Put words from the permit type in permitTypeContains, for example ["roof", "solar"], and turn on includeDetails for the contractor's name, licence and phone.

Can I look up a permit by address?

The actor searches by date, not by address. Pull the date range you need and filter the address column in your spreadsheet.

Is building permit data public?

Yes. Permits are public records, and the actor reads the same public pages anyone can open on the city's portal.

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