San Francisco Business Registration Records
Pricing
from $4.17 / 1,000 item extracteds
San Francisco Business Registration Records
Search official San Francisco registered-business locations by name, DBA, ZIP and opening or closure dates. Export business identity, published addresses and source freshness for prospecting.
Pricing
from $4.17 / 1,000 item extracteds
Rating
0.0
(0)
Developer
Automation Lab
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
21 days ago
Last modified
Categories
Share
Find newly registered business locations for recurring B2B prospecting and market research. Search San Francisco business licenses and registration-location open data by legal name, DBA, business ZIP and business opening or closure dates.
This Actor reads the official DataSF Registered Business Locations corpus. It exports city business account and location identifiers, published names and addresses, dates, optional license codes and source freshness. It does not retrieve county fictitious-business-name filing certificates, California Secretary of State entities, permits or Los Angeles registrations.
What you get
One dataset row represents one city registered-business location record, not necessarily one company. A company may have multiple locations, DBAs or historical records. The source also includes businesses registered with San Francisco whose published locations are outside the city.
Who is it for?
- Sales teams identifying newly registered city businesses.
- Researchers studying business openings and closures by ZIP.
- Analysts matching city registration IDs against their own CRM.
- Location-intelligence teams exporting a bounded slice of the public registry.
Registration dates are administrative signals, not a guarantee that a business physically opened on that date.
Why use this Actor?
It combines explicit filters, stable registry identifiers, typed nullable fields and direct source lookup links in one export. Source freshness is separate from collection time. The Actor uses the public JSON route without browser or proxy overhead.
It does not infer email addresses, phone numbers, decision makers or permission to contact anyone.
Getting started
- Choose a business ZIP, name or date range.
- Set the global maximum number of location records.
- Run the Actor.
- Review the default dataset and source timestamps.
- Download JSON, CSV, Excel or other formats using Apify dataset export.
Example:
{"zip": "94109","status": "active","maxItems": 10}
Input parameters
All supplied filters are combined with AND. Strings are trimmed. Empty strings and unsupported fields fail validation rather than being silently ignored.
| Input | Meaning |
|---|---|
name | Case-insensitive literal substring in legal ownership name OR DBA; maximum 150 characters. |
dba | Case-insensitive literal substring in DBA only; AND with name if both supplied. |
zip | Exact five-digit business ZIP, not mailing ZIP. |
openedSince | Inclusive lower bound on DBA start date, YYYY-MM-DD. |
openedBefore | Exclusive upper bound on DBA start date. |
closedSince | Inclusive lower bound on DBA end date. |
closedBefore | Exclusive upper bound on DBA end date. |
status | all (default), active or closed, as defined below. |
maxItems | Global run limit, default 100; integer 1–10000. No unlimited or zero mode. |
Name matching is a substring, not a whole word or exact whole-field equality. % and _ are ordinary characters, not wildcard operators. Dates are calendar dates applied to source timezone-free timestamps.
Empty input exports the first 100 matching registry IDs, not the newest 100 businesses.
Opening and closure searches
For a bounded opening window:
{"openedSince": "2026-09-01","openedBefore": "2026-10-01","maxItems": 100}
Opening filters use dba_start_date, not the start date at the individual location. Closure filters use dba_end_date; they exclude administrative-only or location-only closures with no DBA end date.
The end boundary is exclusive, so consecutive monthly windows do not overlap at midnight. Reversed ranges and impossible dates are rejected.
Registry status definitions
active means both DBA and location end dates are absent, with no administrative flag equal to YES, Y or TRUE (case-insensitive).
closed means a DBA/location end date exists or that administrative flag is set. all applies no status restriction. These are source-derived classifications, not an independently verified operational status. Source inconsistencies can remain.
An active search cannot be combined with closure-date filters. The source describes administrative closure as lack of filing/communication for three years or a closure notification from another city department.
Output fields
| Field | Meaning |
|---|---|
recordId | Stable composite registry row identifier. |
certificateNumber | City registered-business account number; not a county filing certificate. |
locationId | City location identifier. |
legalName, dbaName | Published ownership and DBA/location names. |
address, city, state, zip | Published business location address; may be outside San Francisco. |
dbaStartDate, dbaEndDate | Published business start/end dates. |
locationStartDate, locationEndDate | Dates at this location. |
administrativelyClosed, status | Administrative flag interpretation and derived classification. |
naicsCode | Self-reported NAICS, when supplied. |
licenseCodes, licenseDescription | Published city license code information, when supplied. |
dataAsOf | Record update timestamp in the source system. |
dataLoadedAt | Open-data portal loading timestamp. |
sourceUrl | Official JSON lookup for this exact record. |
scrapedAt | UTC collection timestamp. |
Optional source fields are null when missing. IDs and ZIPs remain strings. Source date timestamps have no inferred timezone. There is no separate charge for included license codes or freshness fields.
Output example
Public registry record observed during development (collection timestamps vary):
{"recordId": "0001921-04-001-0001921","certificateNumber": "0001921","locationId": "0001921-04-001","legalName": "Avis Rent A Car System Inc","dbaName": "Avis Rent A Car System Inc","address": "675 Post St","city": "San Francisco","state": "CA","zip": "94109","status": "active","dbaStartDate": "2013-05-31T00:00:00.000","dbaEndDate": null,"dataAsOf": "2026-10-09T00:00:00.000","dataLoadedAt": "2026-10-09T04:21:40.000"}
This abbreviated example omits optional fields listed above. Actual records include every output field.
How much does it cost to search San Francisco business registrations?
Pay-per-event billing includes a $0.005 start fee and a charge for each emitted location record. BRONZE pricing is $0.006954 per record. FREE is $0.0079971, SILVER $0.0054241, and GOLD, PLATINUM and DIAMOND $0.0041724 per record. Spend tiers follow your qualifying aggregate monthly Apify Store spend, not a private per-Actor volume discount.
BRONZE total estimates, including the start fee:
| Emitted locations | Estimated total (USD) |
|---|---|
| 1 | 0.011954 |
| 10 | 0.07454 |
| 100 | 0.7004 |
Formula: start fee + emitted locations × your applicable tier's per-record charge. A valid no-match search charges only the start fee. Malformed input is rejected before our start event. Apify pricing and applicable account limits remain authoritative.
These are modeled customer charges, not guaranteed developer payouts or revenue. Refunds, fraud, disputes, taxes, corrections and clawbacks can affect final receipts. Your account may have additional platform costs. Check live pricing before scheduling large exports.
Pagination and reliability
The Actor requests pages of at most 500 records, ordered by unique registry ID, and continues with a keyset cursor until the requested limit or source exhaustion. Ordering is by ID, not newest opening date. Repeated or non-advancing IDs fail rather than silently emitting duplicates.
Transient network failures, HTTP 429 and server errors retry at most three attempts per request with bounded backoff and 30-second request timeouts. Permanent HTTP failures, HTML responses and unexpected JSON structures fail visibly. If failure occurs after earlier pages, those rows are partial output; inspect run status before treating an export as complete.
This is a live dataset, not a transactional snapshot. Changes while paging can affect completeness. No cross-run cache or deduplication is provided. A configured run/billing limit can end an export early; a failed run must not be interpreted as a complete result.
Integrations
Export the dataset to a spreadsheet, CRM import, database or webhook workflow. Use recordId as a reconciliation key; do not deduplicate only by name or address.
For recurring prospecting, schedule a date-window input in Apify, store the exports downstream and compare IDs there. This Actor does not itself schedule, retain previous results, calculate differences or send alerts.
Use source timestamps to distinguish a fresh extraction from old source data. Apify supports CSV and Excel export without the Actor creating separate download files.
API usage
Start a run using your own Apify token:
curl -X POST \'https://api.apify.com/v2/acts/automation-lab~california-city-business-register/runs' \-H "Authorization: Bearer $APIFY_TOKEN" \-H 'Content-Type: application/json' \-d '{"zip":"94109","status":"active","maxItems":10}'
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/california-city-business-register').call({ zip: '94109', status: 'active', maxItems: 10 });const { items } = await client.dataset(run.defaultDatasetId).listItems({ limit: 10 });console.log(items);
Python:
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('automation-lab/california-city-business-register').call(run_input={'zip': '94109', 'status': 'active', 'maxItems': 10})items = client.dataset(run['defaultDatasetId']).list_items(limit=10).itemsprint(items)
MCP and AI agents
Use an Actor-scoped endpoint:
claude mcp add --transport http apify \'https://mcp.apify.com?tools=automation-lab/california-city-business-register'
Claude Desktop, Cursor, and VS Code configuration (supply authentication through your client):
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=automation-lab/california-city-business-register"}}}
Example prompt: “Search active San Francisco registered-business locations in ZIP 94109, capped at 10 rows. Show names, registration IDs and source freshness; do not infer contact permission.”
Discover the actual argument schemas with scoped tools/list. Actor selection also exposes run/storage helpers; it is not exactly one tool. Discovery is read-only, not permission to execute.
Start once and retain the returned run ID and storage IDs. call-actor waits at most 45 seconds (default 30); returned metadata is not dataset rows. If still running, check the same run with get-actor-run, backoff 2/4/8 seconds capped at 10, and a 120-second total deadline. Configure client timeout above the server wait plus transport margin. After a client timeout recover the known run; do not blindly launch another. At deadline report pending and stop polling.
After success, read bounded get-dataset-items pages, for example 20 source rows per page, at most 100 rows and 64 KiB of serialized results admitted to model context. Enforce the byte ceiling host-side; omit/summarize oversized content with disclosure. If the client cannot intercept responses, do not claim a hard byte guarantee. Track source offsets and report truncation/continuation. Keep full exports outside model context. Terminal failures mean any rows are partial. No universal token-saving claim is made.
Source and limitations
Source: Registered Business Locations – San Francisco.
DataSF publishes its own update cadence. This Actor reports observed source timestamps, not a guarantee of daily completeness or real-time change detection. Missing optional fields and stale or inaccurate registrations may remain.
The dataset does not establish current legal standing, name availability, county DBA filing status, license eligibility or permission to operate. Use the relevant official authority for those decisions. No LA, county certificate, SOS, council-district or permit workflow is implied by the internal Actor slug.
Legality and privacy
No AI model is used for extraction or enrichment. This is an independent Actor, not affiliated with or endorsed by the City of San Francisco, DataSF or Apify.
Output and input remain in your Apify run storage under your platform retention settings; the Actor has no persistent cache. Delete run storage through Apify Console/API when no longer needed. Use the Actor's Apify issue/support channel for questions; include a run link and avoid credentials or private data in reports.
Use the public data according to source terms and applicable law. Published business addresses can include home-based businesses and ownership names; treat them responsibly. Do not assume publication permits spam, profiling or unrestricted personal-data reuse. Verify material decisions with official sources.
Failed operations send sanitized diagnostic input, exceptions and Actor/build/run IDs to our private GlitchTip service for repair. Secret fields and URL query strings are removed; reports are retained for 30 days.
FAQ and troubleshooting
Why is my result empty? All filters must match. Check ZIP, literal spelling, status and date boundaries. A valid empty search is not a source error.
Why are old businesses returned? ID order is not newest-first. Use openedSince and openedBefore for an opening window.
Why is one company repeated? Each row is a location/registration, not a unique company. Use the registry row ID for downstream reconciliation.
Does closedSince include every administrative closure? No. It requires a DBA end date. Use closed status without a date bound to include location-only or administrative-only closures.
Can I retrieve certificates or owner contacts? No. This Actor exports the published location corpus only.
Why did a run fail with some rows? A later source or billing failure can leave earlier pages. Check status and rerun intentionally with narrower filters after diagnosing the error; do not treat partial rows as a complete export.
Related Actors
Chicago Business Licenses Scraper covers a separate city's official license records. It is an adjacent workflow, not substitute coverage for San Francisco or California legal entities.
Changelog
See the Actor changelog for shipped capability and limitations.