Permits and property
Accela Citizen Access and EnerGov Permit Data as JSON
Many cities and counties publish no permit dataset at all. Their permits are only searchable in an Accela Citizen Access (ACA) or Tyler EnerGov Citizen Self Service (CSS) portal. This Actor reads those portals and returns each permit as JSON.
Accela Citizen Access & EnerGov Permit Scraper (Any City). Pay per result; see the Store page for current pricing.
The source and its limits
Accela Citizen Access and Tyler EnerGov Citizen Self Service are permit portals that many US local governments use for public permit search. The Actor talks to the same public search the portal page uses: EnerGov's JSON search API, and ACA's General Search page. It pages newest-first and writes every permit in the same schema as the open-data Building Permits Scraper, so records from both can share one pipeline.
31 portals are in the registry (17 EnerGov, 14 Accela), each verified live, including Richmond, VA, Overland Park, KS, Hernando County, FL, Riverside County, CA, Sacramento, Tampa, Oakland, Denver and Fort Worth. With an optional free Accela developer app id, Accela agencies can instead be read through the Construct API's anonymous mode; the README describes that path as best-effort.
Limits worth knowing
- EnerGov filters on the issued date. ACA's General Search filters on the record (application) date and shows no issue date, so on ACA portals
issuedDateis null andappliedDateholds the record date. - Valuation, contractor, license, owner and applicant come from each permit's detail record, which needs
includeDetails(one extra request per permit). - Requests to each portal are spaced at least one second apart. A portal that shows a CAPTCHA or blocks datacenter traffic returns an error item and is listed as unsupported; the Actor does not work around it.
- The window is capped at 365 days, and ACA agencies commonly cap their own date range at one year.
Fields you get
| Field | What it holds |
|---|---|
permitNumber, permitType, permitSubtype | Permit number, type and work class |
workDescription, status | Description and current status (Issued, Finaled, Applied and so on) |
appliedDate, issuedDate, finalizedDate, expirationDate | Dates as the portal publishes them |
estimatedCost | Valuation, with includeDetails |
address, city, state, zip, parcelId | Location; coordinates only through the Accela API engine |
contractorName, contractorLicense, ownerName, applicantName | With includeDetails |
sourceApi | energov, accela-aca or accela-api |
sourceUrl, detailFetched, isNew | Link to the permit, whether details were fetched, and the monitor-mode flag |
Example output
One EnerGov permit from Hernando County, FL, with details fetched (from the Actor's README):
{
"jurisdiction": "hernando-county-fl",
"jurisdictionName": "Hernando County, FL",
"permitNumber": "ELER-000154-2026",
"permitType": "General Electric - Residential",
"permitSubtype": "Electrical",
"workDescription": "Replace 200A service panel and meter can",
"status": "Issued",
"appliedDate": "2026-10-14T10:40:15",
"issuedDate": "2026-10-16T15:12:23",
"finalizedDate": null,
"expirationDate": "2027-04-14T15:12:23",
"estimatedCost": 3630,
"address": "1234 Example Ave, SPRING HILL, FL, 34606",
"city": "SPRING HILL",
"state": "FL",
"zip": "34606",
"parcelId": "1097388",
"contractorName": "RIVERA'S ELECTRIC INC.",
"contractorLicense": "ID-000000718",
"ownerName": null,
"applicantName": "RIVERA'S ELECTRIC INC.",
"sourceApi": "energov",
"sourceUrl": "https://hernandocountyfl-energovweb.tylerhost.net/apps/selfservice#/permit/8c0f…",
"fetchedAt": "2026-10-17T10:50:12.345Z",
"detailFetched": true,
"isNew": true
}
Use cases
Re-roof permits with contractor names
Most EnerGov and Accela portals file re-roofs under their own permit type. permitTypes: ["roof"] with includeDetails on returns the week's re-roof permits with contractors.
One feed across portal types
Combine this Actor with the open-data scraper. Both write the same fields, so a single table can hold permits from Chicago's Socrata portal and Tampa's Accela portal.
Daily monitor for a county
With onlyNewSinceLastRun, details are fetched only for permits not seen before, and a webhookUrl receives the new ones.
How to run it
You need an Apify account and its API token (Console → Settings → API & Integrations). Each run is billed per result to your account; set a maximum total charge for the run to cap spend.
With curl
The sync endpoint starts a run, waits up to 300 seconds and returns the dataset items. Roofing permits issued in Hernando County, FL in the last 7 days, with contractor details:
export APIFY_TOKEN=<your Apify API token>
curl -sS -X POST \
"https://api.apify.com/v2/acts/owlabee~accela-energov-permit-scraper/run-sync-get-dataset-items" \
-H "Authorization: Bearer ${APIFY_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"jurisdictions": [
"hernando-county-fl"
],
"issuedWithinDays": 7,
"permitTypes": [
"roof"
],
"includeDetails": true,
"maxResultsPerJurisdiction": 100,
"onlyNewSinceLastRun": false
}'
From an AI agent (MCP)
Apify hosts an MCP server. This config exposes only this Actor to the agent:
{
"mcpServers": {
"owlabee-accela-energov-permit-scraper": {
"url": "https://mcp.apify.com/?tools=owlabee/accela-energov-permit-scraper",
"headers": {
"Authorization": "Bearer ${APIFY_TOKEN}"
}
}
}
}
Then ask, for example: Find the roofing permits issued in Hernando County, Florida this week and list each address with the contractor who pulled it.
Python, Node.js and more examples
Runnable curl.sh, python.py, node.mjs and mcp.json files for this Actor are in examples/accela-energov-permit-scraper on GitHub.
FAQ
Which portals are supported?
The 31 jurisdictions in the registry, or all, all-energov and all-accela. Portals that load search through partial postbacks or show reCAPTCHA are not supported.
Why is issuedDate null on Accela portals?
ACA's General Search lists records by application date and shows no issue date. status tells you whether the permit was issued.
Does it need proxies or a login?
No. Both portal families answer plain HTTPS requests for every jurisdiction in the registry.
Can you add my city?
If it runs EnerGov Citizen Self Service or Accela Citizen Access with a public General Search page, usually yes. Ask on the Store page.
How do I keep runs small?
Use a short issuedWithinDays, cap maxResultsPerJurisdiction, leave includeDetails off unless you need valuation or contractor fields, and set a maximum total charge.