City Building Permits API: Austin, Seattle, SF
Pricing
from $1.40 / 1,000 permits
City Building Permits API: Austin, Seattle, SF
Get building permits from Austin, Seattle and San Francisco in one format. Filter by dates, permit type, keyword and cost. One row per permit with address, cost, status and licence. $2.00 per 1,000 permits. Independent tool, not affiliated with any city.
Pricing
from $1.40 / 1,000 permits
Rating
0.0
(0)
Developer
Don Mangu
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
an hour ago
Last modified
Categories
Share
Use this city building permits API to get building permits from Austin, Seattle and San Francisco in one format for $2.00 per 1,000 permits. Filter by dates, permit type, keyword and estimated cost. Every row is one permit with its address, status, dates, cost, coordinates, a link to the source record and the licence of the data set.
You need no login, no API key and no proxy. The Actor reads the open data portals of the three cities. It does not read contractor, applicant or owner names, phone numbers or e-mail addresses. This is an unofficial tool built by an independent developer. It is not affiliated with, endorsed by or operated by the City of Austin, the City of Seattle or the City and County of San Francisco.
What this city building permits API returns
One row is one permit. The three cities name their columns in different ways. The Actor maps them to one schema, so you can join, sort and compare permits of different cities.
The fields of a row:
- Identity: recordId (unique key, such as austin:2026-131896 EP), city, state and permitId.
- Type: permitType, permitClass, workClass and status.
- Dates: applicationDate and issueDate, year-month-day.
- Place: address, zip, parcel, latitude and longitude.
- Size: estimatedCost in US dollars and housingUnits.
- Text: description of the work, as plain text. E-mail addresses and phone numbers are removed. Long text is shortened to about 2,000 characters.
- Source: sourceUrl (link to the permit record), sourceDataset, licence, attribution and retrievedAt.
Fields that a city does not fill are null. The table shows the data sets and how much of each field they fill. The fill rates come from a real run on 11.10.2026 that read the 3,334 newest permits of each city.
| City | Data set | Licence of the data set | Size of the data set | estimatedCost filled | Coordinates filled |
|---|---|---|---|---|---|
| Austin, TX | Issued Construction Permits (data.austintexas.gov, ID 3syk-w9eu) | Public Domain U.S. Government | 2,379,658 rows | 45% | 64% |
| Seattle, WA | Building Permits (data.seattle.gov, ID 76t5-zqzr) | Public Domain | 193,605 rows | 100% | 99.9% |
| San Francisco, CA | Building Permits (data.sf.gov, ID i98e-djp9) | Open Data Commons Public Domain Dedication and License | 1,150,767 permits | 100% | 100% |
Notes on the cities:
- Austin lists building, electrical, mechanical and plumbing permits and driveway and sidewalk permits. Many trade permits list no valuation, so estimatedCost is null for them. For a building permit the Actor uses the total job valuation. For other permits it adds the trade valuations.
- Seattle also lists permits that are in progress. They have no issue date. Set Date field to Application date to read them.
- San Francisco repeats a permit once for each address. The Actor reads the row of the primary address, so each permit comes once. San Francisco lists the revised cost and the estimated cost. The Actor uses the revised cost when it exists. The fields permitClass and workClass are null for San Francisco.
- The cities use their own status words. A run of 6,275 permits showed Active, Final, Issued and Complete. The Actor changes only the case of a status. It does not merge the words.
- The newest permits in the data sets were issued on 09.10.2026 when this page was written. The cities update their data sets every day.
How to get building permits, step by step
- Open the Actor and go to Input.
- Pick Cities. Austin is the default. Pick two or three cities to compare them. The Max results limit is shared between the cities in equal parts. A city with fewer permits hands its share to the others.
- Set the dates. Days back reads the last 30 days by default. Use 7 for a weekly run. Enter Date from and Date to for a fixed period. The day in Date to is included.
- Enter Permit type contains to limit the rows to a type of work, such as electrical, demolition or new. The word is checked against the permit type and the work class.
- Enter Keyword to find a word in the description, such as solar, roof or pool.
- Enter Minimum cost (USD) to keep large projects only. Permits without a listed cost are left out when you set a minimum.
- Open Advanced and change Date field to Application date if you want permits that are applied for and not issued yet.
- Set Max results. Start small, for example 10. The maximum is 10,000 per run.
- Start the run. Download the rows as JSON, CSV or Excel, or read them through the API.
- Schedule the Actor to run every week and use the output as a list of new projects.
Rows come newest first. A run reads the portals with one request per second, 1,000 rows per request. Real runs on 11.10.2026: 10 permits take 3 seconds, 6,275 permits (all three cities, 30 days) take 13 seconds with 9 requests, and 10,000 permits take 17 seconds.
Run it every day
Switch on Only new since the last run to get each permit once. A daily run then returns only the permits that earlier runs of the same monitor did not deliver.
- Open the Actor, pick the Cities and fill the filters, for example Days back = 7 and Minimum cost (USD) = 100000.
- Switch on Only new since the last run and type a Monitor name, for example permits-daily.
- Save the input as a Task.
- In the Apify Console go to Schedules, choose Create new, pick the Task and enter a cron expression for once a day, for example
0 7 * * *.
The first run returns every permit that matches and becomes the baseline. Every later run returns only new permits. Keep Days back at 7 for a daily run, so permits that a city adds to its data set a few days late are still caught. The memory lives in a key-value store in your own account named permits-monitor-<monitorName> (letters are lower case). It holds record IDs only (the city and the permit number), no permit content. A permit counts as delivered when it is saved to the dataset, so a permit that Max results cut off in one run comes in the next run. Permits that the memory skips cost no row price.
Use one Monitor name per saved Task. The memory is also split by the filters (dates, date field, permit type, keyword and minimum cost), so the same name with other filters starts a new baseline. You can add a city to the Cities field later: the permits of the new city are delivered and the permits of the other cities stay remembered. A permit is delivered once. When a permit you received as applied for is issued later, it does not come again, so use the default Date field (issue date) when you want issued permits.
Worked example with the prices of this page: a Task for the three cities with Days back 7 and Minimum cost 100,000, which returned 117 permits in one week (the figure from the worked example below). The first run costs 117 x $0.002 + $0.00005 = $0.23405. The next 29 daily runs return about 29 x 117 / 7 = 485 new permits, which cost 485 x $0.002 + 29 x $0.00005 = $0.97145. One month costs about $0.23405 + $0.97145 = $1.2055. The same Task without Only new since the last run returns the whole 7 day window every day: 30 x $0.23405 = $7.0215. The permit counts depend on the cities and the season, so your cost differs.
Each run writes the counts (new delivered, already delivered and skipped, first run) to the monitor part of the STATS record and to the final status message.
City building permits API pricing
The price is $0.002 per permit returned ($2.00 per 1,000 permits) on the Free plan, plus $0.00005 for each run start. Paid Apify plans pay less per permit: $0.0018 (Bronze), $0.0016 (Silver) and $0.0014 (Gold), which is $1.80, $1.60 and $1.40 per 1,000. Only a permit saved to the dataset is charged. A run that finds nothing, a run with a wrong input and a run that stops on a portal error charge the start fee and no permit.
Worked example on the Free plan: a weekly run for the three cities with Days back 7 and Minimum cost 100,000 returned 117 permits on 11.10.2026. Cost is 117 x $0.002 + $0.00005 = $0.23405 per run, and 4 weekly runs cost 4 x $0.23405 = $0.9362 per month. A one-off pull of 10,000 permits costs 10,000 x $0.002 + $0.00005 = $20.00005. Set Max results or the maximum charge of the run to cap the cost. The Actor stops when the limit is reached.
Input example
This is the input of the Task below. It returns the 10 newest permits with a cost of at least $1,000,000 from the last 7 days in the three cities.
{"cities": ["austin", "seattle", "san-francisco"],"lastDays": 7,"minCost": 1000000,"limit": 10}
The default input of the form reads the 10 newest permits of Austin from the last 30 days.
{"cities": ["austin"],"lastDays": 30,"limit": 10}
Output example
Both rows come from one real run of this Actor against the live portals on 11.10.2026. The run used the Task input above and took 3 seconds with 3 requests. It returned 10 permits: 4 from Austin, 4 from Seattle and 2 from San Francisco. The first row is the seventh row of that run and the second row is the eighth.
{"recordId": "seattle:7046346-CN","city": "Seattle","state": "WA","permitId": "7046346-CN","permitType": "Building","permitClass": "Commercial","workClass": "New","status": "Issued","description": "Construct new mixed-use building occupy per plan. Mechanical Included.","applicationDate": "2025-09-25","issueDate": "2026-10-08","address": "2929 27TH AVE S","zip": "98144","parcel": null,"estimatedCost": 69876675,"housingUnits": 241,"latitude": 47.57701356,"longitude": -122.298734,"sourceUrl": "https://services.seattle.gov/portal/customize/LinkToRecord.aspx?altId=7046346-CN","sourceDataset": "https://data.seattle.gov/d/76t5-zqzr","licence": "Public Domain","attribution": "City of Seattle, Seattle Department of Construction and Inspections, data.seattle.gov","retrievedAt": "2026-10-11T12:42:05.094Z"}
{"recordId": "san-francisco:202509155257","city": "San Francisco","state": "CA","permitId": "202509155257","permitType": "Additions alterations or repairs","permitClass": null,"workClass": null,"status": "Issued","description": "convert basement parking to loading zones only; electrification of bldg heating & water heating systems; upgrading lights to led; convert 3-units to mobility; 2-units to hvi; playground replacement 1/f; selective glazing; accessibility upgrade to comm romm @ 9/f lounge; roofing replacment; bldg sign","applicationDate": "2025-09-25","issueDate": "2026-10-09","address": "125 Mason St","zip": "94102","parcel": "0331/018","estimatedCost": 13000000,"housingUnits": 81,"latitude": 37.784767486,"longitude": -122.409543523,"sourceUrl": "https://data.sf.gov/resource/i98e-djp9.json?record_id=1731347455683","sourceDataset": "https://data.sf.gov/d/i98e-djp9","licence": "Open Data Commons Public Domain Dedication and License","attribution": "City and County of San Francisco, Department of Building Inspection, DataSF","retrievedAt": "2026-10-11T12:42:05.094Z"}
Each run also writes a STATS record in the key-value store with the cities read, the rows delivered for each city, the requests, the retries, the bytes, the duration and the peak memory.
Related Actors
- USAspending Awards API: federal contracts and grants that agencies awarded. Use it to see public construction money.
- US State Open Business Registry API: business registrations of US states. Use it to look up a company that you found elsewhere.
- EU and UK Public Tenders: public tenders from TED and UK notices, for building work outside the US.
FAQ
Is it legal to use this data? The three data sets are public and the cities publish them for reuse. The portal metadata states these licences: Austin "Public Domain U.S. Government", Seattle "Public Domain" and San Francisco "Open Data Commons Public Domain Dedication and License". The Austin terms of use say the data are "offered free and without restriction" and ask for "proper credit be given". Each row therefore holds the fields licence and attribution. The Seattle terms say data "does not require specific attribution". They also say that a list of individuals is "not to be used for a commercial purpose". Permits are records of properties. The Actor does not read any person name. The San Francisco terms say "your use of the Data is at your sole risk". The three cities give the data "as is" and make no promise that it is complete or correct. Check a permit on the source page before you rely on it. This is not legal advice. Check your own use of the data.
Does the Actor return contractor names, applicant names or phone numbers? No. The Actor asks the portals for a fixed list of columns. The list holds no contractor, applicant or owner column. The Austin terms say "will not take any measures to re-identify the data". The free text of a description can hold a contact. The Actor removes e-mail addresses and phone numbers from it.
Which source does the Actor read, and does it need an app token? It reads the Socrata open data API (SODA) of each portal: data.austintexas.gov, data.seattle.gov and data.sf.gov. It needs no app token. The Socrata documentation says that requests without a token "come from a shared pool via IP address" and may be throttled. The Actor sends one request per second. That is the Crawl-delay in the robots.txt file of the three portals. A test on 11.10.2026 sent 380 requests to the three portals (180 in a row at about 2.5 requests per second and a burst of 200 at about 19 per second) and got no throttling answer. The Actor stops on an HTTP 401 or 403 answer and does not try to get around it. It waits for the Retry-After time on an HTTP 429 answer, up to 3 times. It retries server errors up to 5 times with waits of 2, 4, 8, 16 and 32 seconds.
Is the list complete? The Actor reads every row that matches your filters, in pages of 1,000. On 11.10.2026 the portals listed 4,588 permits for Austin, 456 for Seattle and 1,231 for San Francisco issued from 11.09.2026 to 10.10.2026. A run with those dates and the maximum limit returned 4,588, 456 and 1,231 permits. The San Francisco data set holds 1,379 rows for the same period, because it repeats a permit for each address. A permit is listed once in the output.
Why is estimatedCost empty for many Austin permits? Austin lists a valuation for building permits and for some trade permits. Electrical, plumbing and mechanical permits often list none. The Actor returns null and does not guess a value. A minimum cost in the input leaves such permits out. Some cities enter placeholder values such as 0 or 1 for the cost. The Actor passes the value on as it is.
What do the dates mean? issueDate is the date the city issued the permit. applicationDate is the date of the application. The portals store dates without a time zone. The Actor cuts them to year-month-day. Date to includes the whole day.
How do I get only new permits? Schedule a weekly run with Days back set to 7. Use recordId as the unique key if you store the rows. A permit can change its status later, so a row can appear again with a new status in a later run. To get each permit once, switch on Only new since the last run (see Run it every day).
Can I add another city? Not in this version. The three cities are the ones whose data set licence and terms were checked. More cities may follow.
The run stopped with a message about the portal. The portal answered 401, 403 or 429, or an error that stayed after the retries. Nothing is charged for such a run apart from the start fee. If one of several cities fails, the rows of the other cities are kept and the message names the city. Run again later.
This is an unofficial, independent tool. It is not affiliated with, endorsed by or operated by the City of Austin, the City of Seattle or the City and County of San Francisco.