# Pennsylvania Business Registry Officers & New Filings (`jserle/pa-business-registry-officers`) Actor

Pennsylvania registered businesses with their officers, organizers and incorporators from the PA Department of State open dataset. Filter by creation date, county, officer role, name and registration type. One record per officer or one per business. Monthly refresh. $0.002/record.

- **URL**: https://apify.com/jserle/pa-business-registry-officers.md
- **Developed by:** [JS Tech Solutions](https://apify.com/jserle) (community)
- **Categories:** Lead generation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 business officer records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Pennsylvania Business Registry Officers & New Filings

Pulls Pennsylvania registered businesses with the people behind them from the Pennsylvania Department of State's open dataset into clean JSON records: business name, filing number, registration type, creation date, street address, county, map coordinates, and the officer, organizer or incorporator on file with their role. Filter by creation-date window, county, officer role, business-name substring and registration type. One record per officer row, or one record per business with the officers collected into an array.

The source is the Department's full roster of active registrations (4,074,720 rows on 2026-08-23, one row per business and officer), refreshed monthly. The default run returns the newest businesses first, so with no input at all you get a fresh Pennsylvania new-business list with the filer's name.

### Who uses this data

- **B2B lead generation** for insurance agencies, payroll and HR providers, merchant services, commercial lenders and banks: every new LLC and corporation in a county, with the organizer's name and the address on file, a few days after month end.
- **KYB and compliance teams** confirming that a Pennsylvania entity exists, its filing number, its registration type and who organized or incorporated it.
- **Registered agents, accountants and business-formation services** prospecting newly formed entities in their service area.
- **Market researchers and journalists** counting formations by county, month and entity type.

### What you get

One dataset item per business x officer row, newest creation date first. A real item from `{"creationDateFrom": "2026-07-01", "creationDateTo": "2026-07-31", "county": "Lancaster", "registrationType": "Domestic Limited Liability Company"}`:

```json
{
  "filingNumber": "0015756482",
  "businessName": "Benco Investments Llc",
  "registrationType": "Domestic Limited Liability Company",
  "creationDate": "2026-07-31",
  "officerRole": "Organizer",
  "officerFirstName": "Benuel",
  "officerMiddleName": "K",
  "officerLastName": "Fisher",
  "officerFullName": "Benuel K Fisher",
  "addressLine1": "113 Esbenshade Rd",
  "addressLine2": null,
  "city": "Ronks",
  "state": "PA",
  "zip": "17572-9547",
  "county": "Lancaster",
  "countyCode": 36,
  "latitude": 39.99024,
  "longitude": -76.14004,
  "sourceRowId": "row-yici.dz2y.3inu",
  "sourceDataset": "xvd7-5r2c",
  "source": "https://data.pa.gov/resource/xvd7-5r2c.json",
  "datasetPage": "https://data.pa.gov/d/xvd7-5r2c",
  "attribution": "Pennsylvania Department of State",
  "sourcePublishedAt": "2026-08-04T14:12:34.000Z",
  "fetchedAt": "2026-08-23T16:37:24.795Z"
}
```

With `dedupeByBusiness` on, the officer fields are replaced by an `officers` array (`role`, `firstName`, `middleName`, `lastName`, `fullName`), an `officerCount`, and `sourceRowIds` listing the source rows that were merged. A business the Department lists with no officer at all is still delivered, with an empty array.

`officerRole` is the Department's own Governor/Principal Officer column. It is free text on the source: `Member`, `MEMBER` and `member` all occur. Officer name fields are `null` when the source row carries a role but no person (the organizer was an entity, or the name was not captured). `countyCode` is the Department's 1 to 67 alphabetical county code. `sourcePublishedAt` is the dataset's last update as reported by the portal; `fetchedAt` is when this run read it.

### Input

| Field | Type | Default | What it does |
| --- | --- | --- | --- |
| `creationDateFrom` | string | first day of the month 45 days ago | Businesses created on or after this date (YYYY-MM-DD). The default is always a month the Department has already published. Omitted when you set only `creationDateTo`. |
| `creationDateTo` | string | today | Created on or before this date, inclusive. |
| `county` | string | any | Pennsylvania county name, case-insensitive exact match (`Philadelphia`, `Allegheny`, `Montgomery`...). Non-PA addresses carry `Out of State`. |
| `partyType` | string | any | Officer role, case-insensitive exact match: `Organizer`, `Incorporator`, `President`, `Governor`, `Treasurer`, `Secretary`, `Vice President`, `General Partner`, `Member`, `Owner`, `Managing Member`, `Manager`, `CEO` and others. |
| `businessNameContains` | string | any | Case-insensitive substring of the business name. |
| `registrationType` | select | `any` | One of the 18 Department registration types: Domestic/Foreign Limited Liability Company, Domestic/Foreign Business Corporation, Domestic/Foreign Nonprofit Corporation, Domestic Limited Partnership (LP/LLLP), Foreign Limited Partnership, Business Trust, General Partnership, Professional Association, Authority, Credit Union, Land Bank, Financial Institution. |
| `dedupeByBusiness` | boolean | `false` | One record per filing number with officers as an array. `maxResults` then counts businesses. |
| `maxResults` | integer | `100` | Stop after this many records (max 50,000). Each delivered record is one paid unit. |
| `allowPartial` | boolean | `false` | The Actor reads at most four source rows per requested record (at least 65,000) to complete `maxResults`. Off: if that cap is hit with matches still on the source, the run fails with nothing delivered, so a short result is never mistaken for a full one. On: the complete records read so far are delivered and the summary marks `stoppedByScanCap`. |
| `includeRaw` | boolean | `false` | Attach the untouched source row under `raw`. |

Every filter runs on the source as a SoQL `$where`, so the Actor fetches only matching rows and you are charged only for records you receive. A filter that matches nothing returns zero records and costs nothing.

#### Example inputs

New LLCs in Philadelphia last month, one record per business:

```json
{"creationDateFrom": "2026-07-01", "creationDateTo": "2026-07-31", "county": "Philadelphia", "registrationType": "Domestic Limited Liability Company", "dedupeByBusiness": true, "maxResults": 2000}
```

Every corporation statewide that lists a Treasurer, created in 2025:

```json
{"creationDateFrom": "2025-01-01", "creationDateTo": "2025-12-31", "partyType": "Treasurer", "registrationType": "Domestic Business Corporation", "maxResults": 5000}
```

Find a business by name, any age:

```json
{"creationDateTo": "2026-12-31", "businessNameContains": "keystone plumbing", "maxResults": 50}
```

### Pricing

Pay per result: $0.002 per delivered record. No charge for a run that matches nothing, and no charge for rows that were skipped as duplicates or malformed.

### Data source, refresh and licence

- **Agency:** Pennsylvania Department of State. This Actor is not affiliated with or endorsed by the Pennsylvania Department of State.
- **Dataset:** "Registered Businesses in PA Current by County Department of State", https://data.pa.gov/d/xvd7-5r2c (Socrata id `xvd7-5r2c`, API endpoint https://data.pa.gov/resource/xvd7-5r2c.json). Read with the public SODA API, no token, no login, no HTML scraping, one request per second as the host's robots.txt asks.
- **Licence, as stated in the dataset's own metadata:** "Public Domain U.S. Government" (licence id `USGOV_WORKS`, terms link https://www.usa.gov/government-works). Attribution: "Department of State". Every record carries `attribution`, `source`, `sourcePublishedAt` and `fetchedAt`.
- **Refresh:** the metadata declares "Monthly". On 2026-08-23 the dataset was last updated 2026-08-04 and its newest creation date was 2026-08-01, so a month's filings appear a few days after the month ends. July 2026 carried 13,179 officer rows across 9,969 businesses.
- **Size:** 4,074,720 rows with creation dates back to 1753.

### Limitations

- **Recent filings mostly list the filer, not the officers.** On new LLCs the party on file is almost always the `Organizer`; on new corporations it is the `Incorporator`. Officer titles such as President, Treasurer and Secretary fill in later, as the Department records subsequent filings: businesses created in 2025 carry 21,212 President rows, businesses created in 2026 carry 33 (read 2026-08-23). Filtering a recent window by `partyType: "President"` will return very little.
- **The source over-counts active businesses.** The Department's own dataset notes say statutory limits on removing defunct businesses mean the roster shows more active businesses than currently exist.
- **Exact duplicate rows exist on the source** (one filing lists each of its four organizers three times). The Actor dedupes on filing number + role + officer name, so you are never charged twice for the same officer. Of the first 100 rows in the default window on 2026-08-23, 20 were repeats.
- **About a quarter of all rows carry no officer** (976,463 of 4,074,720 have no `party_type`; most of those are domestic LLCs and corporations). They are delivered with `null` officer fields.
- No registered-agent, status-change, dissolution, phone or email fields: the Department does not publish them in this dataset.

The run fails, with nothing delivered and nothing charged, when the default window returns no rows, when an expected column disappears from every fetched row, when the dataset metadata carries no update timestamp, when paging ends before the row count the source itself reported, or when the row-scan cap is hit before `maxResults` records are complete and `allowPartial` is off. Rows that fail validation (missing required fields, unparseable date) are skipped and counted in the run summary under `malformedRowsSkipped`.

### FAQ

#### How do I get a list of new businesses in Pennsylvania?

Run with no input: you get the 100 newest officer rows for businesses created since the first day of the most recent fully published month. Raise `maxResults` or set `creationDateFrom` and `creationDateTo` to a calendar month for the full monthly list. Set `dedupeByBusiness` to count businesses instead of officer rows.

#### Can I search the Pennsylvania business registry by owner or officer name?

Not by officer name directly: the source API has no name index, and a statewide scan per name would be slow and expensive. Filter by county, window and `partyType`, then match names in the output. Searching by business name (`businessNameContains`) is supported on the source.

#### Does it include the registered agent or commercial registered office provider?

No. The dataset carries the business address and the governor/principal officer rows only.

#### How often is the Pennsylvania business registry data updated?

Monthly, per the Department's metadata. Observed on 2026-08-23: updated 2026-08-04 with creation dates through 2026-08-01.

#### Is this the same as the Department's online Business Entity Search?

It is the Department's open-data export of the registry, refreshed monthly, delivered in bulk and filterable by county, date, role and entity type rather than one name lookup at a time.

#### Can I export Pennsylvania LLC filings to CSV or Excel?

Yes. Every run's dataset downloads as JSON, CSV, Excel or XML from the Apify Console or API. Field names are stable, so repeated monthly runs append cleanly.

### Related datasets

Other datasets by the same author, all pay-per-record with source, refresh cadence and licence stated on each listing:

**Business registries and public records**

- [NYC PASSPort Procurement Scraper (RFPs, Bids & Contracts)](https://apify.com/jserle/nyc-passport-procurement)
- [E-Rate Form 470 RFP Scraper (USAC School & Library Bids)](https://apify.com/jserle/erate-form-470-rfp-feed)

**Healthcare provider and facility data**

- [New York Nursing Home Bed Availability (NYSDOH) Scraper](https://apify.com/jserle/ny-nursing-home-bed-census)
- [Nursing Home Deficiency Citations (CMS) Scraper](https://apify.com/jserle/nursing-home-deficiency-citations)
- [Nursing Home Fines & Civil Money Penalties (CMS) Scraper](https://apify.com/jserle/nursing-home-penalties-fines)
- [Nursing Home Directory & Ownership (CMS Form 671) Scraper](https://apify.com/jserle/ltc-facility-characteristics)
- [Nursing Home Daily Nurse Staffing (CMS PBJ) Scraper](https://apify.com/jserle/cms-nursing-home-staffing-daily)
- [Nursing Home Change of Ownership (CMS SNF CHOW) Scraper](https://apify.com/jserle/snf-change-of-ownership-tracker)
- [Medicare Revoked Providers List (CMS Revocations) Scraper](https://apify.com/jserle/medicare-revoked-providers)
- [Medicare Opt-Out Providers List (CMS Affidavits) Scraper](https://apify.com/jserle/medicare-opt-out-physicians)
- [Medicare Revalidation Due Date List (CMS) Scraper](https://apify.com/jserle/medicare-revalidation-due-leads)

**Developer and AI test data**

- [Synthetic Invoice OCR Ground Truth Dataset Generator](https://apify.com/jserle/ocr-ground-truth-document-factory)

# Actor input Schema

## `creationDateFrom` (type: `string`):

ISO date (YYYY-MM-DD). Businesses whose creation date is on or after this day. Default: the first day of the month 45 days ago, which is always a month the Department has already published (refresh is monthly, a few days after month end).

## `creationDateTo` (type: `string`):

ISO date (YYYY-MM-DD), inclusive. Default: today.

## `county` (type: `string`):

Pennsylvania county name, case-insensitive exact match. Examples: Philadelphia, Allegheny, Montgomery, Bucks, Delaware, Chester, Lancaster. Businesses with a non-Pennsylvania address carry the value Out of State.

## `partyType` (type: `string`):

Case-insensitive exact match on the role the Department recorded (the Governor/Principal Officer column). Most common values: Organizer (new LLCs), Incorporator (new corporations), President, Governor, Treasurer, Secretary, Vice President, General Partner, Member, Owner, Managing Member, Manager, CEO. The field is free text on the source, so Member and MEMBER both exist and both match "member".

## `businessNameContains` (type: `string`):

Case-insensitive substring matched against the business name. Example: plumbing

## `registrationType` (type: `string`):

Type of business registration as the Department classifies it. Any keeps all 18 types.

## `dedupeByBusiness` (type: `boolean`):

Off: one record per business x officer row (the source grain), so a corporation with a president, a treasurer and a secretary is three records. On: one record per filing number with the officers collected in an officers array. maxResults then counts businesses.

## `maxResults` (type: `integer`):

Stop after this many records. Each delivered record is one paid unit. Maximum 50000.

## `allowPartial` (type: `boolean`):

Off: if the Actor has to read more than its scan cap of source rows (four per requested record, at least 65,000) without completing maxResults records, the run FAILS with nothing delivered, so a short delivery is never mistaken for a complete one. On: the complete records read so far are delivered and the run summary marks stoppedByScanCap. Only relevant for very large maxResults on duplicate-heavy windows or with one record per business.

## `includeRaw` (type: `boolean`):

Attach the untouched Socrata row under raw (an array of rows when one record per business is on).

## Actor input object example

```json
{
  "registrationType": "any",
  "dedupeByBusiness": false,
  "maxResults": 100,
  "allowPartial": false,
  "includeRaw": false
}
```

# Actor output Schema

## `results` (type: `string`):

Registered businesses with officer name and role, address, county, registration type and creation date.

## `summary` (type: `string`):

Source publication date, creation-date window, matching row count on the source, rows fetched, duplicates and malformed rows dropped, delivered records, and whether a limit stopped the run.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "registrationType": "any",
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("jserle/pa-business-registry-officers").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "registrationType": "any",
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("jserle/pa-business-registry-officers").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "registrationType": "any",
  "maxResults": 100
}' |
apify call jserle/pa-business-registry-officers --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jserle/pa-business-registry-officers"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Cqdrwrq9c4Px1CvOJ/builds/XtxUvYqsHZkZKIJdb/openapi.json
