How to get Accela building permits with the API
Accela Citizen Access is the public building-permit search a US city or county hosts. Atlanta's portal is one of them. A run reads that public list and saves one row per permit.
The steps below start a run from the API and then read the saved rows.
Set up the Apify actor
Apify is where this list gets collected. An actor is the program that reads the city's public permit search. A task is that program saved with your city and your row limit, so the next section can ask for the latest rows. You need a free Apify account.
- 01Open US Accela Building Permit Grid and click Try for free. Create an Apify account if you do not have one. The Free plan does not ask for a card.
- 02You are on the input form. Keep the sample for this first run: tenant
SLCREF, moduleBuilding, Days to look back 90, and Max permit rows 5.SLCREFis the first folder in Salt Lake City's Accela address (aca-prod.accela.com/SLCREF/), not the city name. Five rows is enough to see the columns. - 03Leave the proxy setting as it is. Click Start and wait until the run says Succeeded.
- 04Open Storage, then Dataset. You should see a record number, an address, a status, and a filed date. Those are the permits.
- 05When you want the real list, raise Max permit rows. If the start and end dates stay empty, Days to look back sets the window. A quiet portal widens that window to 90 days, then to 365.
- 06Go back to the input and choose Save as a new task. Name it after the portal, for example Salt Lake City building permits.
- 07Open the task. Copy the task ID from the address bar. Excel, Sheets, Power BI, and the other guides ask for this ID.
- 08On the task, open Schedules and add a weekly run if you want fresh rows. Each run pays the start charge and the charge for the rows. The amounts are in the price list on this page.
- 09Open Settings, then API & Integrations, and copy an API token. Excel, Sheets, and the other guides put this token in a download link. Anyone with that link can download the rows, so treat it like a password.
How to set up with the API
- 01Use the API token from Set up the Apify actor, above.
- 02Send this request. Replace
YOUR_TOKEN. It waits up to 120 seconds. Five rows is the sample cap. RaisemaxItemsfor a real export.curl -X POST "https:// api.apify.com/ v2/ acts/ bakos_bence~accela-permits/ runs? token=YOUR_TOKEN& waitForFinish=120" \ -H "Content-Type: application/ json" \ -d '{"tenants":["SLCREF"],"module":"Building","daysBack":90,"maxItems":5}' - 03From the response, copy
defaultDatasetId. - 04Fetch the rows. Replace
DATASET_IDandYOUR_TOKEN.https:// api.apify.com/ v2/ datasets/ DATASET_ID/ items? format=json& clean=true& token=YOUR_TOKEN - 05The API tab on the actor has the same call in JavaScript, Python, and the CLI. Client docs: JavaScript, Python, Run an Actor.
- 06To repeat it, use the task and the weekly schedule from Set up the Apify actor, above. A scheduled task's newest rows are this URL, with your task id and token:
https:// api.apify.com/ v2/ actor-tasks/ TASK_ID/ runs/ last/ dataset/ items? format=json& clean=true& status=SUCCEEDED& token=YOUR_TOKEN - 07Anyone with a URL that contains the token can read the rows.
Schema
Examples are invented, not a live permit.
| Name | Description | Example |
|---|---|---|
recordNumber | The permit's record number, as the city prints it on the public list. | BLD2026-001234 |
recordType | The permit type, such as Building Permit. | Building |
description | What the permit is for. Empty when the city left that cell blank. | Interior |
address | The property address from the public list. | 123 |
status | Where the permit stands, such as Issued or In Review. | Issued |
filedDate | The date the permit was filed. | 2026-08-20 |
module | Which Accela module was searched. Usually Building. | Building |
agencyCode | The city's portal code: the first folder in the Accela URL. SLCREF is the sample for Salt Lake City, not the words Salt Lake City. | SLCREF |
detailUrl | The city's own page for this permit, when the list has one. | https:/ |
scrapedAt | When this run saved the row, in UTC. | 2026-09-25T14:00:00.000Z |
recordNumberThe permit's record number, as the city prints it on the public list.BLD2026-001234recordTypeThe permit type, such as Building Permit.BuildingPermit descriptionWhat the permit is for. Empty when the city left that cell blank.Interiorremodel addressThe property address from the public list.123MAIN ST, SALT LAKE CITY UT 84101 statusWhere the permit stands, such as Issued or In Review.IssuedfiledDateThe date the permit was filed.2026-08-20moduleWhich Accela module was searched. Usually Building.BuildingagencyCodeThe city's portal code: the first folder in the Accela URL. SLCREF is the sample for Salt Lake City, not the words Salt Lake City.SLCREFdetailUrlThe city's own page for this permit, when the list has one.https:// aca-prod.accela.com/ SLCREF/ Cap/ CapDetail.aspx scrapedAtWhen this run saved the row, in UTC.2026-09-25T14:00:00.000Z
The same row as JSON
{
"recordNumber": "BLD2026-001234",
"recordType": "Building Permit",
"description": "Interior remodel",
"address": "123 MAIN ST, SALT LAKE CITY UT 84101",
"status": "Issued",
"filedDate": "2026-08-20",
"module": "Building",
"agencyCode": "SLCREF",
"detailUrl": "https://aca-prod.accela.com/SLCREF/Cap/CapDetail.aspx",
"scrapedAt": "2026-09-25T14:00:00.000Z"
}