San Francisco Building Permits Feed: DataSF Open Data (PDDL)
Pricing
$2.00 / 1,000 building permits
San Francisco Building Permits Feed: DataSF Open Data (PDDL)
New building permits from San Francisco's DataSF open data API (public domain, PDDL 1.0): address, parcel, work description, permit type, status, dates, estimated cost, uses, units and map point. Keyword, cost and ZIP filters, dedupe across runs. Unofficial.
Pricing
$2.00 / 1,000 building permits
Rating
0.0
(0)
Developer
Scott Williams
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Security
Limited permissionsShare
San Francisco Building Permits Feed: Daily Permit Data from DataSF
A daily feed of new San Francisco building permits, read from the City's official open data portal (DataSF) through its keyless Socrata SODA API.
- Source: the DataSF "Building Permits" dataset (
i98e-djp9), published by the City and County of San Francisco under the Open Data Commons Public Domain Dedication and License (PDDL) 1.0. - What each record holds: every permit becomes one flat record with the address, parcel, work description, permit type, status, filed, issued and completed dates, estimated cost, existing and proposed use, units, stories, neighborhood, supervisor district and map point.
- Filters: keyword, minimum estimated cost or ZIP code.
- Scheduled runs only return permits you haven't already received. This is a new-permits feed: when a permit you already received changes status later, it is not sent again.
Unofficial. This Actor is not affiliated with or endorsed by the City and County of San Francisco. City data can change or be corrected after it is published, so check the source record (
sourceUrl) before you rely on it.
Who uses building permit data
- Contractors, solar installers, roofers and suppliers looking for active projects. Filter by
keyword(for examplesolar,ADUordemolition) orminEstimatedCost. - Real estate and proptech teams watching renovation, unit changes and new construction by ZIP code or neighborhood.
- Analysts and journalists tracking permit volume and project value over time with
date_rangemode.
Privacy and responsible use
The DataSF building permits dataset has no owner, tenant, applicant or contact fields, and the Actor adds no data from other sources. The work-site street address is part of every record, and that may be a private home.
Responsible use: business or contractor names can contain individuals' names, for example a sole trader's business name, or a name written into the free-text description or use fields. You must follow the FCRA, TCPA and CAN-SPAM, and you must not use this data for consumer eligibility decisions (credit, employment, insurance or housing).
Input
| Input | Default | Notes |
|---|---|---|
mode | daily_feed | daily_feed reads the last lookbackDays. date_range reads startDate to endDate (up to 10 years, from 1980-01-01 onward). |
lookbackDays | 7 | 0 to 90 days, counted in Pacific time. Used in daily_feed mode. |
startDate, endDate | none | YYYY-MM-DD, for date_range mode. |
dateBasis | issued | issued (issue date) or filed (application filed date). |
keyword | none | Searches the work description, ignoring case. |
minEstimatedCost | none | In USD. The Console form is prefilled with 50000. |
zipCodes | none | 5-digit San Francisco ZIP codes, for example 94110. |
maxItems | 4 | Also 4 when left empty. |
onlyNewSinceLastRun, stateKey | auto, default | auto skips permits already delivered, in daily_feed mode only. yes and no force it on or off. Use one stateKey per schedule. |
Example: large projects, checked daily.
{"mode": "daily_feed", "lookbackDays": 3, "minEstimatedCost": 500000, "maxItems": 500}
Output: San Francisco permit records
This is a real record from a test run on 30 October 2026, with {"maxItems": 3}:
{"city": "san-francisco","cityName": "San Francisco, CA","permitNumber": "202610290111","permitType": "otc alterations permit","status": "issued","statusDate": "2026-10-29","filedDate": "2026-10-29","issuedDate": "2026-10-29","completedDate": null,"description": "like for like replacement east facing wall in garage area. remove damaged mudsill studs, framing and sheathing. install all new like for like new framing, mudsill sheath, waterproof per plan. re-establish connections. no change to use or foot print","estimatedCost": 25000,"address": "22 Tioga Av","unit": null,"zipCode": "94134","neighborhood": "Visitacion Valley","district": "Supervisor district 10","parcel": "6192/010","existingUse": "1 family dwelling","proposedUse": "1 family dwelling","existingUnits": 1,"proposedUnits": 1,"proposedStories": 2,"latitude": 37.715988733,"longitude": -122.403159677,"sourceUrl": "https://data.sf.gov/resource/i98e-djp9.json?permit_number=202610290111","datasetUrl": "https://data.sf.gov/d/i98e-djp9","licence": "Open Data Commons Public Domain Dedication and License (PDDL) 1.0","licenceUrl": "https://opendatacommons.org/licenses/pddl/1-0/","attribution": "Source: DataSF, City and County of San Francisco (data.sf.gov). Unofficial; not endorsed by the City.","generatedInternalId": "san-francisco:202610290111","scrapedAt": "2026-10-31T01:33:24+00:00"}
Text fields such as description and permitType are passed through exactly as the City publishes them.
The run summary (key-value store record RUN_SUMMARY) records:
- how many permits were returned;
- how many were skipped as already seen or duplicated;
- how many requests were made.
Pricing
Pricing is pay per event: $0.002 per permit returned, which is $2 per 1,000 permits.
- There is no start fee and there are no other events.
- Permits skipped as already delivered are free.
- Invalid input (not a JSON object, a field of a type that cannot be read such as
zipCodesgiven as a number, or a value that is not allowed such as an unknown mode, a bad date or a ZIP code that is not 5 digits) fetches nothing and ends with one free status row:Invalid input, nothing was fetched or charged: <reason>. - An empty input
{}or the prefilled Console input returns at most 4 permits, which costs at most $0.008.
San Francisco issued between 53 and 68 permits each weekday from 15 to 28 October 2026 (counted from DataSF). So a daily feed with no filters cost roughly $0.11 to $0.14 a weekday over that period. Set a maximum cost per run to stop early.
Use it from n8n, Make or Zapier
Schedule the Actor in Apify, or trigger it from Make, Zapier or n8n through the Apify integrations or the Apify API. Then read the dataset items, for example to send new permits above a cost threshold to a CRM, a spreadsheet or a team chat. Using onlyNewSinceLastRun (on by default in daily_feed mode) means each scheduled run only delivers permits you haven't received yet. The Apify Console's API tab for this Actor shows the exact endpoint URLs.
FAQ
Which cities are covered? San Francisco only. Its dataset has a named open licence (PDDL 1.0) that was checked. Other cities will be added only after their licences have been read.
Will I get a permit again when its status changes? No. This is a new-permits feed. Dedupe is by permit number, so a permit you have already received is not sent again in later scheduled runs, even when its status or dates change. To see current statuses, run date_range mode with onlyNewSinceLastRun: "no".
Is estimatedCost the real project cost? No. It's the applicant's estimate as published, not the final value.
Do I need an API key or proxy? No. DataSF's SODA API is keyless. The Actor checks robots.txt on every run, honours the portal's Crawl-delay: 1, makes at most 1 request per second and sends a descriptive User-Agent. If the portal blocks it, or returns anything other than JSON, the run stops cleanly.
Why did I get 0 permits? The likely reasons:
- your filters are too narrow;
- the lookback window has no new issued permits, for example a weekend;
- every permit in the window was already delivered to this
stateKey.
Check RUN_SUMMARY.
Data source and licence
San Francisco data comes from DataSF, City and County of San Francisco, under the PDDL 1.0.