San Francisco Business Registrations & Licenses Scraper avatar

San Francisco Business Registrations & Licenses Scraper

Pricing

from $6.15 / 1,000 results

Go to Apify Store
San Francisco Business Registrations & Licenses Scraper

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

Scrapers Lat

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 days ago

Last modified

Share

San Francisco Business Registrations & Licenses Scraper

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.

CapabilityThis actorfortuitous_pirate/sf-business-licensesparseforge/sf-open-data-scraper
Business name / owner searchYes (DBA and owner)Yes (name only)Manual SoQL only
NAICS code filterYesYesManual SoQL only
Neighborhood filterYes (dropdown)Yes (free text)Manual SoQL only
ZIP filterYesYesManual SoQL only
Active-only filterYesYesManual SoQL only
Registration date rangeYes (from and to)From onlyManual SoQL only
Business activity keywordYesNoManual SoQL only
Supervisor district filterYesNoManual SoQL only
Raw SoQL $where and $orderYesNoYes
Migrating-input aliases acceptedYes (businessName, zipCode, startDateAfter, maxItems)n/an/a
Derived NAICS sector titleYesNoNo
Mailing address, tax flags, corridor, community benefit districtYesPartialOnly if you select the columns
Coordinates (lat / lng)YesPartialOnly if you select the columns
Owner-portfolio add-on (multi-location detection)YesNoNo
No API key requiredYesYesYes

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

FieldTypeRequiredDefaultDescription
querystringno(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.
neighborhoodenumno(any)Restrict to one San Francisco neighborhood, for example Mission, Tenderloin, South of Market.
businessTypestringno(empty)Match the registered business activity, for example RESTAURANT, MASSAGE, TATTOO, BAR. Case-insensitive text match.
supervisorDistrictenumno(any)Restrict to one Board of Supervisors district, 1 to 11.
activeOnlybooleannofalseWhen on, only businesses with no location end date (still registered) are returned. Off includes closed and past registrations.
zipstringno(empty)Match by 5-digit ZIP code, for example 94103. Alias: zipCode.
startFromstringno(empty)Only businesses registered (DBA start date) on or after this date (YYYY-MM-DD). Alias: startDateAfter.
startTostringno(empty)Only businesses registered on or before this date (YYYY-MM-DD).
naicsCodestringno(empty)Filter by NAICS code prefix, for example 722 for food service. Present only on a subset of records.
maxBusinessesintegerno10Maximum records to collect. Range 1 to 1000000. Free Apify plans are capped at 10 per run. Alias: maxItems.
withOwnerPortfoliobooleannofalsePaid add-on. For each result, count how many registered San Francisco locations share the same owner name and how many are active.
sortstringnodba_start_date DESCOptional SoQL $order override, for example dba_name ASC.
soqlWherestringno(empty)Optional raw SoQL $where fragment for power users, combined with the filters above using AND.
appTokenstringno(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.

FieldTypeDescription
dbaNamestringBusiness name (DBA).
ownershipNamestringRegistered owner name.
businessTypestringRegistered business activity, or null.
businessTypeListstringFull list of registered activities, or null.
licCodestringCity LIC (license) code, or null.
naicsCodestringSelf-reported NAICS industry code, or null.
selfReportedNaicsCodestringSame self-reported NAICS code (kept for compatibility), or null.
naicsSectorstringTwo-digit NAICS sector derived from the code, or null.
naicsSectorTitlestringNAICS sector title derived from the code, for example Accommodation and Food Services, or null.
naicsDescriptionstringSame derived NAICS sector title (kept for compatibility). The dataset has no code-level description.
fullBusinessAddressstringStreet address of the business location.
citystringCity.
statestringState (CA).
zipstring5-digit ZIP code.
neighborhoodstringAnalysis neighborhood.
businessCorridorstringNamed business corridor, or null.
supervisorDistrictstringBoard of Supervisors district.
communityBenefitDistrictstringCommunity benefit district, or null.
mailingAddressstringMailing street address.
mailCitystringMailing city.
mailStatestringMailing state.
mailZipstringMailing ZIP.
dbaStartDatestringRegistration (DBA start) date (YYYY-MM-DD).
dbaEndDatestringDBA end date, or null.
locationStartDatestringLocation start date (YYYY-MM-DD).
locationEndDatestringLocation end date, or null when still at the address.
isActivebooleantrue when the location has no end date and is not administratively closed.
administrativelyClosedbooleantrue when the city administratively closed the account.
parkingTaxbooleantrue when the business is subject to parking tax.
transientOccupancyTaxbooleantrue when subject to transient occupancy (hotel) tax.
businessAccountNumberstringCity business account number (BAN).
certificateNumberstringRegistration certificate number.
ttxidstringTreasurer and Tax Collector location ID.
uniqueIdstringStable unique record identifier.
latitudenumberLatitude of the location, or null.
longitudenumberLongitude of the location, or null.
dataAsOfstringSource data as-of date.
dataLoadedAtstringDate the source refreshed the row.
observedAtstringISO 8601 timestamp of when the record was collected.
ownerTotalLocationsnumberAdd-on. Total registered SF locations sharing the same owner name, or null.
ownerActiveLocationsnumberAdd-on. Active registered SF locations for that owner, or null.
ownerIsMultiLocationbooleanAdd-on. true when the owner has more than one registered location.
ownerPortfolioSummarystringAdd-on. Human-readable owner portfolio summary.
errorstringnull 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:

# JSON
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"
# CSV
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"
# Paginate large datasets
curl "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 (result event). See the pricing tab for the current per-result price.
  • Owner-portfolio add-on. When withOwnerPortfolio is on, each enriched result is billed once (details event), 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 error field and does not charge for it. Empty runs cost nothing.
  • Spend cap respected. Set maxTotalChargeUsd on 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.

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.