San Francisco Registered Businesses Scraper
Pricing
from $6.15 / 1,000 results
San Francisco Registered Businesses Scraper
Scrape registered business locations in San Francisco. Extract business name, owner, full address, neighborhood, supervisor district, business activity, registration dates and coordinates. Export to JSON, CSV or 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
20 hours ago
Last modified
Categories
Share
San Francisco Registered Businesses Scraper
Here is one real result, with every field the actor returns:
{"dbaName": "Seiyun Yemeni Coffee","ownershipName": "Seiyun Yemeni Coffee LLC","businessType": "RESTAURANT - UNDER 1,000 SQFT","businessTypeList": "RESTAURANT - UNDER 1,000 SQFT","naicsCode": null,"selfReportedNaicsCode": null,"naicsDescription": null,"fullBusinessAddress": "260 5th St","city": "San Francisco","state": "CA","zip": "94103","neighborhood": "South of Market","businessCorridor": null,"supervisorDistrict": "6","communityBenefitDistrict": "Yerba Buena","mailingAddress": "4464 Lone Tree Way 2082","mailCity": "Antioch","mailState": "CA","mailZip": "94531","dbaStartDate": "2026-02-10","dbaEndDate": null,"locationStartDate": "2026-02-10","locationEndDate": null,"isActive": true,"administrativelyClosed": false,"parkingTax": false,"transientOccupancyTax": false,"businessAccountNumber": "1410779","certificateNumber": "1179350","ttxid": "1410779-02-261","uniqueId": "1410779-02-261-1179350","latitude": 37.780677,"longitude": -122.404158,"dataAsOf": "2026-08-14","observedAt": "2026-08-15T09:54:00.700Z","enrichedEmail": null,"enrichedContactName": null,"enrichedJobTitle": null,"enrichedEmailStatus": null,"enrichedSource": null,"enrichedConfidence": null,"error": null}
The most complete San Francisco registered business scraper available. It returns every field the city's registered business dataset exposes for each location, from owner and full address to neighborhood, supervisor district, tax flags and coordinates, with eight filters and an optional contact enrichment add-on to build targeted, contactable lead lists.
📥 Input · 📤 Output · 💰 Pricing · ▶️ Examples
Table of contents
- What it does
- Quickstart
- Input reference
- Output reference
- Example output record
- Run via API and CLI
- Fetch results
- Billing and limits
- FAQ and troubleshooting
What it does
The actor reads the City of San Francisco registered business locations dataset, 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, NAICS code, registration and location dates, active status, 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. An optional paid add-on tries to find a public contact email and name for each result that has none.
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. |
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. |
startFrom | string | no | (empty) | Only businesses registered (DBA start date) on or after this date (YYYY-MM-DD). |
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. |
enrichContacts | boolean | no | false | Paid add-on. For each result without an email, attempt to find a public contact email and person's name. Billed per attempt plus an extra charge only when an email is found. |
enrichContactsMax | integer | no | 50 | Cap how many results the add-on tries to enrich. Free Apify accounts are capped at 3. |
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. |
naicsCode | string | NAICS industry code, or null. |
selfReportedNaicsCode | string | Self-reported NAICS code, or null. |
naicsDescription | string | NAICS description, or null. |
fullBusinessAddress | string | Street address of the business location. |
city | string | City (San Francisco). |
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. |
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. |
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. |
observedAt | string | ISO 8601 timestamp of when the record was collected. |
enrichedEmail | string | Paid add-on. Found public contact email, or null. |
enrichedContactName | string | Paid add-on. Found contact person name, or null. |
enrichedJobTitle | string | Paid add-on. Found contact job title, or null. |
enrichedEmailStatus | string | Paid add-on. Verification status of the found email, or null. |
enrichedSource | string | Paid add-on. Source the contact was found on, or null. |
enrichedConfidence | string | Paid add-on. Confidence in the found contact, or null. |
error | string | null on success. On a failed run, a single item with a populated error field is written instead. |
Example output record
Real record from a live run (input {"maxBusinesses": 10}, newest registered first):
{"dbaName": "Nathan Hood","ownershipName": "Nathan Hood","businessType": null,"businessTypeList": null,"naicsCode": "311811","selfReportedNaicsCode": "311811","naicsDescription": null,"fullBusinessAddress": "50 Jones St Apt 903","city": "San Francisco","state": "CA","zip": "94102","neighborhood": "Tenderloin","businessCorridor": "Central Market","supervisorDistrict": "5","communityBenefitDistrict": "Tenderloin","mailingAddress": "50 Jones St Apt 903","mailCity": "San Francisco","mailState": "CA","mailZip": "94102","dbaStartDate": "2026-08-09","dbaEndDate": null,"locationStartDate": "2026-08-09","locationEndDate": null,"isActive": true,"administrativelyClosed": false,"parkingTax": false,"transientOccupancyTax": false,"businessAccountNumber": "1429523","certificateNumber": "1187327","ttxid": "1429523-08-261","uniqueId": "1429523-08-261-1187327","latitude": 37.781802,"longitude": -122.4117495,"dataAsOf": "2026-08-10","observedAt": "2026-08-10T14:17:44.229Z","error": null}
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. - Contact enrichment add-on. When
enrichContactsis on, the add-on is billed per enrichment attempt, plus an extra charge only when an email is found. Control cost withenrichContactsMax. - 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. - Free Apify plans are capped at 10 records per run, and the enrichment add-on is capped at 3 attempts. Upgrade for higher limits.
FAQ and troubleshooting
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.
How do I get only businesses still open at the address?
Set activeOnly to true. This keeps only records with no locationEndDate.
How does contact enrichment charge?
It bills per attempt on results that have no email, plus an extra charge only when an email is actually found. Cap attempts with enrichContactsMax.
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.
