San Francisco Business Registrations & Licenses Scraper
Pricing
from $6.15 / 1,000 results
San Francisco Business Registrations & Licenses Scraper
Scrape registered businesses and business licenses in San Francisco from DataSF open data, no API key. Get owner, DBA name, full address, NAICS code, neighborhood, supervisor district, tax flags, dates and coordinates. Filter by name, industry, ZIP or district. Export JSON, CSV, Excel.
Pricing
from $6.15 / 1,000 results
Rating
0.0
(0)
Developer
Scrapers Lat
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 days ago
Last modified
Categories
Share
San Francisco Business Registrations & Licenses Scraper
Scrape registered businesses and business licenses in San Francisco straight from the official DataSF open data, with no API key required. This is the most complete San Francisco business registrations scraper on Apify: it returns every field the city's Registered Business Locations dataset exposes for each location, from owner and full address to NAICS industry code, neighborhood, supervisor district, tax flags and map coordinates, with nine filters and an optional owner-portfolio add-on to build targeted, contactable local business leads.
Here is one real result, with every field the actor returns:
{"dbaName": "Grasslands Bar & Lounge","ownershipName": "Sml Capital Group LLC","businessType": "BARS/TAVERNS W/O FOOD PREP","businessTypeList": "BARS/TAVERNS W/O FOOD PREP","licCode": "H86R","naicsCode": "722410","selfReportedNaicsCode": "722410","naicsSector": "72","naicsSectorTitle": "Accommodation and Food Services","naicsDescription": "Accommodation and Food Services","fullBusinessAddress": "905 Kearny St","city": "San Francisco","state": "CA","zip": "94133","neighborhood": "Chinatown","businessCorridor": "Chinatown","supervisorDistrict": "3","communityBenefitDistrict": null,"mailingAddress": "744 Rollingwood Dr","mailCity": "Vallejo","mailState": "CA","mailZip": "94591","dbaStartDate": "2026-07-22","dbaEndDate": null,"locationStartDate": "2026-07-22","locationEndDate": null,"isActive": true,"administrativelyClosed": false,"parkingTax": false,"transientOccupancyTax": false,"businessAccountNumber": "1428085","certificateNumber": "1186720","ttxid": "1428085-07-261","uniqueId": "1428085-07-261-1186720","latitude": 37.796445,"longitude": -122.4053955,"dataAsOf": "2026-09-04","dataLoadedAt": "2026-09-04","observedAt": "2026-09-04T14:22:03.000Z","error": null}
Who it is for
- Local business lead generation in San Francisco. Pull fresh, newest-first registered businesses by industry, neighborhood, ZIP or supervisor district and export ready-to-use CSV lead lists.
- B2B sales and marketing. Target restaurants, bars, retailers, contractors, salons or any activity by NAICS sector or business activity keyword.
- Market and competitive research. Map how many businesses opened in an area, in what industries, and whether they are still active.
- KYB, due diligence and compliance. Verify a San Francisco business account, owner name, registration and location dates, parking and transient occupancy tax status.
- Data and GIS teams. Get clean, normalized DataSF business data with latitude and longitude for mapping and analysis, without writing SoQL.
What it does
The actor reads the City of San Francisco Registered Business Locations dataset (DataSF / Socrata SODA API, resource g8m3-pdis), applies the filters you pass as input, and writes one normalized record per registered business location to the run's dataset, newest registered first. Each record carries the DBA name, owner, full business and mailing address, neighborhood, business corridor, supervisor district, community benefit district, registered business activity, LIC code, NAICS code plus derived NAICS sector, registration and location dates, active status, parking and transient occupancy tax flags, coordinates and the city's stable identifiers.
Missing source values are returned as null, never invented. Filters combine with logical AND, so you can target one neighborhood, one activity and one date range at once. No API key or Socrata app token is needed.
Superset comparison
We accept every input and return every output of the other San Francisco business scrapers on Apify, plus more.
| Capability | This actor | fortuitous_pirate/sf-business-licenses | parseforge/sf-open-data-scraper |
|---|---|---|---|
| Business name / owner search | Yes (DBA and owner) | Yes (name only) | Manual SoQL only |
| NAICS code filter | Yes | Yes | Manual SoQL only |
| Neighborhood filter | Yes (dropdown) | Yes (free text) | Manual SoQL only |
| ZIP filter | Yes | Yes | Manual SoQL only |
| Active-only filter | Yes | Yes | Manual SoQL only |
| Registration date range | Yes (from and to) | From only | Manual SoQL only |
| Business activity keyword | Yes | No | Manual SoQL only |
| Supervisor district filter | Yes | No | Manual SoQL only |
Raw SoQL $where and $order | Yes | No | Yes |
| Migrating-input aliases accepted | Yes (businessName, zipCode, startDateAfter, maxItems) | n/a | n/a |
| Derived NAICS sector title | Yes | No | No |
| Mailing address, tax flags, corridor, community benefit district | Yes | Partial | Only if you select the columns |
| Coordinates (lat / lng) | Yes | Partial | Only if you select the columns |
| Owner-portfolio add-on (multi-location detection) | Yes | No | No |
| No API key required | Yes | Yes | Yes |
Accepted competitor aliases: pass businessName, zipCode, startDateAfter or maxItems and they map to this actor's fields automatically, so existing inputs run without changes.
Quickstart
Open the actor, paste this into the input, and press Run. It returns the 10 most recently registered restaurants matching COFFEE.
{"query": "COFFEE","businessType": "RESTAURANT","maxBusinesses": 10}
Combine filters to narrow further:
{"neighborhood": "Mission","activeOnly": true,"startFrom": "2024-01-01","maxBusinesses": 100}
Every field is optional. With an empty input the actor returns the most recently registered businesses across all of San Francisco.
Input reference
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
query | string | no | (empty) | Match on the business name (DBA) or owner name, for example COFFEE, UBER, or a person's name. Empty browses all businesses. Alias: businessName. |
neighborhood | enum | no | (any) | Restrict to one San Francisco neighborhood, for example Mission, Tenderloin, South of Market. |
businessType | string | no | (empty) | Match the registered business activity, for example RESTAURANT, MASSAGE, TATTOO, BAR. Case-insensitive text match. |
supervisorDistrict | enum | no | (any) | Restrict to one Board of Supervisors district, 1 to 11. |
activeOnly | boolean | no | false | When on, only businesses with no location end date (still registered) are returned. Off includes closed and past registrations. |
zip | string | no | (empty) | Match by 5-digit ZIP code, for example 94103. Alias: zipCode. |
startFrom | string | no | (empty) | Only businesses registered (DBA start date) on or after this date (YYYY-MM-DD). Alias: startDateAfter. |
startTo | string | no | (empty) | Only businesses registered on or before this date (YYYY-MM-DD). |
naicsCode | string | no | (empty) | Filter by NAICS code prefix, for example 722 for food service. Present only on a subset of records. |
maxBusinesses | integer | no | 10 | Maximum records to collect. Range 1 to 1000000. Free Apify plans are capped at 10 per run. Alias: maxItems. |
withOwnerPortfolio | boolean | no | false | Paid add-on. For each result, count how many registered San Francisco locations share the same owner name and how many are active. |
sort | string | no | dba_start_date DESC | Optional SoQL $order override, for example dba_name ASC. |
soqlWhere | string | no | (empty) | Optional raw SoQL $where fragment for power users, combined with the filters above using AND. |
appToken | string | no | (empty) | Optional Socrata app token. The source is keyless; a free token raises the rate limit for very large pulls. |
Output reference
One dataset item per registered business location. Types: string, number, boolean, or null when the source value is absent.
| Field | Type | Description |
|---|---|---|
dbaName | string | Business name (DBA). |
ownershipName | string | Registered owner name. |
businessType | string | Registered business activity, or null. |
businessTypeList | string | Full list of registered activities, or null. |
licCode | string | City LIC (license) code, or null. |
naicsCode | string | Self-reported NAICS industry code, or null. |
selfReportedNaicsCode | string | Same self-reported NAICS code (kept for compatibility), or null. |
naicsSector | string | Two-digit NAICS sector derived from the code, or null. |
naicsSectorTitle | string | NAICS sector title derived from the code, for example Accommodation and Food Services, or null. |
naicsDescription | string | Same derived NAICS sector title (kept for compatibility). The dataset has no code-level description. |
fullBusinessAddress | string | Street address of the business location. |
city | string | City. |
state | string | State (CA). |
zip | string | 5-digit ZIP code. |
neighborhood | string | Analysis neighborhood. |
businessCorridor | string | Named business corridor, or null. |
supervisorDistrict | string | Board of Supervisors district. |
communityBenefitDistrict | string | Community benefit district, or null. |
mailingAddress | string | Mailing street address. |
mailCity | string | Mailing city. |
mailState | string | Mailing state. |
mailZip | string | Mailing ZIP. |
dbaStartDate | string | Registration (DBA start) date (YYYY-MM-DD). |
dbaEndDate | string | DBA end date, or null. |
locationStartDate | string | Location start date (YYYY-MM-DD). |
locationEndDate | string | Location end date, or null when still at the address. |
isActive | boolean | true when the location has no end date and is not administratively closed. |
administrativelyClosed | boolean | true when the city administratively closed the account. |
parkingTax | boolean | true when the business is subject to parking tax. |
transientOccupancyTax | boolean | true when subject to transient occupancy (hotel) tax. |
businessAccountNumber | string | City business account number (BAN). |
certificateNumber | string | Registration certificate number. |
ttxid | string | Treasurer and Tax Collector location ID. |
uniqueId | string | Stable unique record identifier. |
latitude | number | Latitude of the location, or null. |
longitude | number | Longitude of the location, or null. |
dataAsOf | string | Source data as-of date. |
dataLoadedAt | string | Date the source refreshed the row. |
observedAt | string | ISO 8601 timestamp of when the record was collected. |
ownerTotalLocations | number | Add-on. Total registered SF locations sharing the same owner name, or null. |
ownerActiveLocations | number | Add-on. Active registered SF locations for that owner, or null. |
ownerIsMultiLocation | boolean | Add-on. true when the owner has more than one registered location. |
ownerPortfolioSummary | string | Add-on. Human-readable owner portfolio summary. |
error | string | null on success. On a failed run, a single item with a populated error field is written instead. |
Owner-portfolio add-on
Set withOwnerPortfolio to true to turn one lead into a multi-location signal. For each result the actor counts how many registered San Francisco locations share the same owner name and how many are still active, then adds ownerTotalLocations, ownerActiveLocations, ownerIsMultiLocation and ownerPortfolioSummary. Use it to find franchise operators, chains and portfolio owners. It is billed per enriched result (see the pricing tab) and is charged only after a result is delivered and the lookup succeeds.
Run via API and CLI
Start a run and wait for it to finish, then read the dataset. Replace <TOKEN> with your Apify API token.
Run synchronously and get dataset items in one call:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~sf-business-registrations-scraper/run-sync-get-dataset-items?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"query":"COFFEE","businessType":"RESTAURANT","maxBusinesses":25}'
Start a run asynchronously:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~sf-business-registrations-scraper/runs?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"neighborhood":"Mission","activeOnly":true,"maxBusinesses":100}'
Apify CLI:
apify call scrapers_lat/sf-business-registrations-scraper \--input '{"zip":"94103","businessType":"BAR"}'
Fetch results
Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing format:
# JSONcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"# CSVcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"# Paginate large datasetscurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"
<DATASET_ID> is returned as defaultDatasetId in the run object. Use offset and limit to page through large result sets. clean=true drops empty and internal fields.
Billing and limits
- Pay per result. You are charged per business record returned (
resultevent). See the pricing tab for the current per-result price. - Owner-portfolio add-on. When
withOwnerPortfoliois on, each enriched result is billed once (detailsevent), only after it is delivered and the owner lookup succeeds. - No charge on failure. If a run errors, the actor writes a single item with a populated
errorfield and does not charge for it. Empty runs cost nothing. - Spend cap respected. Set
maxTotalChargeUsdon the run; once reached, the actor stops emitting and charging further billable results and add-ons. - Free Apify plans are capped at 10 records per run. Upgrade for higher limits.
FAQ and troubleshooting
Do I need an API key or Socrata app token? No. The San Francisco Open Data source is keyless. An optional app token only raises the rate limit for very large pulls.
A run returned 0 records. Why?
The filter combination matched nothing. Loosen filters (remove neighborhood or widen the date range) and rerun. Zero-result runs are not charged.
Why is businessType or naicsCode null?
Those fields are only present on a subset of the city's records, especially very recent registrations. Missing source values are returned as null, never invented. When a NAICS code is present, naicsSector and naicsSectorTitle are derived from it.
How do I get only businesses still open at the address?
Set activeOnly to true. This keeps only records with no locationEndDate.
How do I find owners with multiple locations?
Turn on withOwnerPortfolio. Each result gains ownerTotalLocations, ownerActiveLocations and ownerIsMultiLocation.
I used another SF business scraper. Will my input work here?
Yes. This actor also accepts the businessName, zipCode, startDateAfter and maxItems field names and maps them automatically.
Is this an official City of San Francisco tool? No. This actor is independent and has no affiliation with the City of San Francisco. It reads only publicly available open data. Use it in accordance with the city's open data terms.
Related scrapers
- Colorado Business Entities Scraper: Colorado registered business entities.
- Chicago Building Permits Scraper: Chicago building permit records.
- Google Maps Business Leads Scraper: local business leads with contacts.
- California CSLB Scraper: California licensed contractors.
- Cybo Business Leads Scraper: business directory leads worldwide.
More scrapers at scrapers.lat
Built and maintained by scrapers.lat, where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at scrapers.lat.
Independent tool, not affiliated with the City of San Francisco. Accesses only publicly available open data. Use in accordance with the city's open data terms of service.
