# CPA Firm Directory Scraper \[$4💰] | Firm Emails & Phones (`ahmed_jasarevic/cpa-scraper`) Actor

Find and export CPA & accounting firm leads from CPAdirectory.com and the Oregon CPA Society (OSCPA). Get firm names, emails, phones, addresses, websites, staff size, services and practice areas to build B2B prospect lists and run CPA market research.

- **URL**: https://apify.com/ahmed\_jasarevic/cpa-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.70 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## US CPA Firms Directory Scraper — Accounting & Tax Firm Leads

Extract CPA firm contact data from **CPAdirectory.com** and the **Oregon CPA Society (OSCPA) Find-a-CPA™ directory** to build fresh accounting firm prospect lists, CPA email lists, and B2B lead databases — firm names, emails, phones, addresses, websites, staff size, services, and practice areas.

### Main Use Cases

- **Accounting firm prospecting & B2B lead generation** — build targeted prospect lists of US CPA and accounting firms
- **CPA firm email & phone lists** — collect business contact data directly from public firm listings
- **CPA market research & competitive analysis** — analyze firm size, services, and practice areas by market
- **Structured CPA firm database creation** — export every listing to a clean dataset (JSON, CSV, Excel)
- **Local (Oregon) CPA directory monitoring** — track the OSCPA Find-a-CPA directory over time
- **Tax preparation firm outreach** — identify tax, audit, bookkeeping, and advisory firms for vendor marketing

### How It Works

The actor runs a [Crawlee](https://crawlee.dev/) Cheerio crawler that starts from directory listing pages, extracts every firm profile link on the page, follows pagination automatically, and then visits each firm profile to pull structured data from JSON-LD markup and page HTML. The source directory is detected automatically from the URL — no configuration needed to switch between CPAdirectory.com and the Oregon CPA Society directory.

### Build a US CPA Firm Prospect List Without Buying Mailing Lists

Paid "CPA email list" vendors resell static records that decay within weeks. This actor scrapes **live, public directory listings on demand**, so every prospect list you build is current at the moment of extraction:

- **Fresh data** — firm listings are pulled from live directory pages, not a stale database
- **No per-record mailing-list fees** — you pay only for the actual scrape ($0.004 per firm profile)
- **Firmographic context** — staff size, services, and industries on OSCPA listings help you segment before outreach
- **CRM-ready output** — the dataset exports to JSON, CSV, or Excel for direct import into HubSpot, Salesforce, or your outreach tool

### Extract CPA Firm Contact Data From CPAdirectory.com and the Oregon CPA Society

Two public CPA directories are supported out of the box:

| Data available | CPAdirectory.com | Oregon CPA Society (OSCPA) |
|---|---|---|
| Firm name, address, city, state, ZIP | ✅ | ✅ |
| Phone | ✅ | ✅ |
| Website | ✅ | ✅ |
| Email | — | ✅ |
| Staff size | — | ✅ |
| Services offered | — | ✅ |
| Industries served | — | ✅ |
| Firm description | ✅ | ✅ |

CPAdirectory.com covers accounting firms nationally. The OSCPA Find-a-CPA™ directory covers CPA firms enrolled as OSCPA firm members in Oregon.

### Scrape Accounting Firm Leads for B2B Email & Phone Outreach

Accounting firms are a high-intent B2B audience for accounting software, practice management tools, payroll, CPE, insurance, and professional services vendors. Each scraped firm record contains the fields needed to qualify and contact a prospect — including business email addresses on Oregon CPA Society listings. See the [Legal & Compliance Disclaimer](#legal--compliance-disclaimer) before running outreach with this data.

### Understand Your CPA Market: Staff Size, Services & Practice Areas

OSCPA firm profiles publish **staff size, services, and industries**, which make it possible to benchmark a local market: how many firms serve the nonprofit or construction vertical, what share offer bookkeeping or audit & assurance, and how firm size clusters by city. This turns a simple directory scrape into competitive intelligence for growing CPA firms and the vendors that sell to them.

### Input Parameters for Your CPA Directory Scrape

| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
| `startUrls` | array of `{ url }` | ✅ | `https://cpadirectory.com/accounting-firms` | Listing URLs only, from either supported directory (e.g. `https://www.orcpa.org/find-a-cpa`). Firm profile URLs are discovered and queued automatically. |
| `maxFirms` | integer | ❌ | `50` | Maximum number of firm profiles to scrape. `0` = unlimited. Capped at **10** for free (non-paying) Apify accounts. |
| `proxyConfiguration` | object | ❌ | `{ "useApifyProxy": false }` | Apify proxy config. Leave disabled for maximum speed; enable if the target directory blocks direct requests. |

### Output Fields: What This CPA Firm Scraper Returns

Each dataset item is one CPA firm profile:

| Field | Description | CPAdirectory.com | OSCPA |
|---|---|---|---|
| `firmName` | Firm name | ✅ | ✅ |
| `description` | Firm description/meta description | ✅ | ✅ |
| `address` | Full address (`streetAddress, city, state, postalCode`) | ✅ | ✅ |
| `streetAddress` | Street address | ✅ | ✅ |
| `city` | City | ✅ | ✅ |
| `state` | State | ✅ | ✅ |
| `postalCode` | ZIP/postal code | ✅ | ✅ |
| `phone` | Phone number | ✅ | ✅ |
| `email` | Business email | — | ✅ |
| `website` | Firm website URL | ✅ | ✅ |
| `staffSize` | Staff size (range) | — | ✅ |
| `services` | List of services offered | — | ✅ |
| `industries` | List of client industries served | — | ✅ |
| `source` | Source directory (`cpadirectory.com` or `orcpa.org`) | ✅ | ✅ |
| `sourceUrl` | URL of the scraped profile page | ✅ | ✅ |
| `scrapedAt` | ISO timestamp of the scrape | ✅ | ✅ |

> Note: the crawler's output interface also declares `fax` and `partners` fields, but the current build does not populate them — treat them as unset.

### Example Input

```json
{
  "startUrls": [
    { "url": "https://cpadirectory.com/accounting-firms" },
    { "url": "https://www.orcpa.org/find-a-cpa" }
  ],
  "maxFirms": 100
}
```

### Example Output

```json
[
  {
    "firmName": "Aldrich CPAs + Advisors LLP",
    "description": "Full-service public accounting firm serving businesses and individuals.",
    "address": "519 SW Third Ave, Suite 600, Portland, OR, 97204",
    "streetAddress": "519 SW Third Ave, Suite 600",
    "city": "Portland",
    "state": "OR",
    "postalCode": "97204",
    "phone": "(503) 555-0147",
    "email": "info@example-aldrich.com",
    "website": "https://www.example-aldrich.com",
    "staffSize": "51-100",
    "services": ["Accounting", "Audit & Assurance", "Tax Planning & Preparation", "Bookkeeping"],
    "industries": ["Construction", "Manufacturing", "Nonprofit"],
    "source": "orcpa.org",
    "sourceUrl": "https://www.orcpa.org/find-a-cpa/aldrich-cpas-advisors",
    "scrapedAt": "2026-09-19T12:00:00.000Z"
  },
  {
    "firmName": "Smith & Johnson CPA",
    "description": "CPA firm in Austin, TX offering tax preparation and small business accounting.",
    "address": "901 Congress Ave, Austin, TX, 78701",
    "streetAddress": "901 Congress Ave",
    "city": "Austin",
    "state": "TX",
    "postalCode": "78701",
    "phone": "(512) 555-0148",
    "website": "https://www.smith-johnson-cpa.example",
    "source": "cpadirectory.com",
    "sourceUrl": "https://cpadirectory.com/accounting-firms/smith-johnson-cpa/4821",
    "scrapedAt": "2026-09-19T12:00:00.000Z"
  }
]
```

*Illustrative examples — field names are the real schema fields; the sample values are placeholders.*

### Integrations & Automation: Keep Your Accounting Firm Leads Fresh

- **Apify API** — run the actor and download datasets programmatically (`GET /v2/datasets/{datasetId}/items`)
- **Webhooks** — trigger a downstream workflow (CRM import, email tool, Slack) every time a run finishes
- **Schedules** — repeat runs automatically from the Apify Console
- **Apify integrations** — push results to Google Sheets, Zapier, Make, or other tools via the [integrations](https://apify.com/integrations) catalog

Directories change over time. We recommend scheduling this actor **weekly** for lead monitoring or **monthly** for market research, so your CPA firm database stays current.

### Related Actors: Build a Complete Accounting & Lead Generation Stack

- [Google Maps Places Scraper](https://apify.com/compass/crawler-google-places) — local business leads and company data from Google Maps, the traffic anchor of the local-lead-generation cluster
- [**Apify Web Scraper**](https://apify.com/apify/web-scraper) — general-purpose scraping for any directory not covered by a specialized actor
- [AICPA CPA Directory Scraper](https://apify.com/parseforge/aicpa-cpa-directory-scraper) — complementary CPA profile data from the AICPA member directory
- [CPA Leads Scraper USA (Emails, Phones, Accounting Firms)](https://apify.com/giovannibiancia/cpa-leads-scraper-usa-emails-phones-accounting-firms) — an alternative CPAdirectory.com source with state/zip filtering
- [NASBA CPA Directory Scraper](https://apify.com/muhammadafzal/nasba-cpa-directory-scraper) — CPA license verification from the official NASBA registry

### FAQ

#### Why use this actor instead of the official directory API?

CPAdirectory.com and the OSCPA Find-a-CPA™ directory are public directory websites and do not document a public data API for bulk firm extraction. This actor reads the same publicly visible pages a browser sees and converts them into structured data — no API key, no per-listing licensing, no login.

#### What are alternatives to this actor / to CPAdirectory.com?

- **AICPA member directory** — via the [AICPA CPA Directory Scraper](https://apify.com/parseforge/aicpa-cpa-directory-scraper)
- **NASBA CPAverify** — license and disciplinary records, via any NASBA directory Scraper
- **State CPA societies** — many states run directories like the OSCPA Find-a-CPA; this actor supports OSCPA (Oregon) directly and generic directories via [Apify Web Scraper](https://apify.com/apify/web-scraper)
- **Paid CPA email-list vendors** — faster to buy, but static and far more expensive per record

#### How can I build a CPA firm email list?

Emails are extracted directly from Oregon CPA Society (OSCPA) firm profiles. Run the actor with `https://www.orcpa.org/find-a-cpa` as the `startUrl`, export the dataset, and filter to records where `email` is populated. Many national CPAdirectory.com listings link to the firm's website, which you can crawl separately to find published business contacts.

#### Is scraping CPA firm directory data legal?

Public business directory data is generally low-risk to collect in the US (public pages, no login), but you remain responsible for each directory's Terms of Service and for how you use personal contact data. The OSCPA Find-a-CPA™ directory states that its information is "provided for private individual use only" and that commercial or research use without prior express permission from the Oregon Society of CPAs is strictly prohibited. See the [Legal & Compliance Disclaimer](#legal--compliance-disclaimer).

#### Which CPA directories besides CPAdirectory.com cover US firms?

AICPA member directory, state CPA society directories such as the Oregon Society of CPAs (OSCPA), NASBA CPAverify, and consumer directories such as CPA Locator, ListMyCPA, and AccountingNearYou.

#### How do I scrape the Oregon Society of CPAs directory?

Set `startUrls` to `https://www.orcpa.org/find-a-cpa`. The actor detects the ORCPA source automatically, follows the paginated listing, and extracts email, staff size, services, and industries from each firm profile.

#### How are results priced?

Pay-per-event: a small actor-start event charge ($0.00005 per event, one event per GB of memory) plus **$0.004 per firm record** saved to the dataset. There are no add-on fees for email or website enrichment.

#### What is the best way to use this data for accounting firm outreach?

Segment by firm size, services, and industry (available on OSCPA records), verify emails before sending, target business mailboxes, identify yourself honestly, and always include an easy opt-out. Time campaigns around the tax calendar — responding to a relevant problem outside tax season outperforms a generic blast during it.

### SEO Keywords

cpa firm directory, cpa firm email list, accounting firm leads, cpa firm database, cpa firm contact list, accounting firm prospect list, cpa directory scraping, cpadirectory.com alternative, cpadirectory.com data, oregon cpa firm directory, oregon cpa leads, find-a-cpa oregon, accountant lead generation, cpa firm size data, cpa firm practice areas, cpa firm staff size, accounting firm websites list, tax firm prospecting list, business directory scraping, cpa mailing list, accountant email list, cpa lead scraping

### For AI Agents & LLM Apps

This actor is callable via the Apify API and the Apify MCP server. It returns one dataset item per CPA firm profile scraped from CPAdirectory.com and/or the Oregon CPA Society (OSCPA) directory.

**Minimal working input:**

```json
{
  "startUrls": [{ "url": "https://cpadirectory.com/accounting-firms" }],
  "maxFirms": 10
}
```

**Variant inputs:**

```json
{
  "startUrls": [{ "url": "https://www.orcpa.org/find-a-cpa" }],
  "maxFirms": 50
}
```

(This input enables OSCPA-only scraping, which is the only supported source that populates `email`, `staffSize`, `services`, and `industries`.)

**Output field list:** `firmName`, `description`, `address`, `streetAddress`, `city`, `state`, `postalCode`, `phone`, `email` (OSCPA only), `website`, `staffSize` (OSCPA only), `services` (OSCPA only), `industries` (OSCPA only), `source`, `sourceUrl`, `scrapedAt`.

**Behaviors an agent should know:**

- `startUrls` must contain **listing** URLs (`…/accounting-firms` or `…/find-a-cpa`) — firm detail pages are discovered automatically; passing a detail URL as a start URL yields no results.
- `maxFirms` defaults to `50` but is **capped at 10 for free Apify accounts**; `0` means unlimited for paying accounts.
- Pagination of listing pages is followed automatically via the directory's next-page link; there is no pagination field to configure.
- The crawler budgets `maxRequestsPerCrawl = maxFirms + 50`, so very large `maxFirms` values require the `startUrls` listing pages to contain enough firm links.
- `proxyConfiguration` defaults to disabled (no proxy) — enable Apify proxy if the directory starts blocking.
- Billing is pay-per-event: ~$0.00005 per actor-start event (one event per GB of memory) + **$0.004 per result item** in the default dataset.

### Legal & Compliance Disclaimer

This actor is an independent tool and is **not affiliated with, endorsed by, or sponsored by** CPAdirectory.com or the Oregon Society of CPAs (OSCPA). "CPAdirectory.com" and "Find-a-CPA™" are trademarks or service names of their respective owners.

The actor accesses **only publicly available pages** — it does not log in, bypass paywalls, solve CAPTCHAs, or circumvent any technical access control. It extracts the same firm information that is visible to any visitor of the public directory pages.

The OSCPA **Find-a-CPA™ directory states in its terms** that its information is "provided for private individual use only and commercial use, research use, or other solicitation without the prior express permission of the Oregon Society of CPAs is strictly prohibited." **You are responsible for obtaining any permission the source directories require** and for complying with their Terms of Service, robots.txt signals, and rate limits.

Where the dataset contains personal contact data (names, business emails, phone numbers), your collection and use may be regulated by laws such as the CCPA/CPRA (California), GDPR (EU/EEA data subjects), and CAN-SPAM (commercial email in the US). Do not use scraped contact data for unsolicited commercial outreach that violates applicable law, and honor opt-out and deletion requests. **This section is factual disclosure, not legal advice** — consult a qualified attorney for your specific use case.

# Actor input Schema

## `startUrls` (type: `array`):

URLs to start scraping from. Defaults to CPAdirectory.com accounting firms listing.

## `maxFirms` (type: `integer`):

Maximum number of firm profiles to scrape (0 = unlimited).

## `proxyConfiguration` (type: `object`):

Select proxies to be used by your crawler. Leave disabled to scrape directly from your IP for maximum speed.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://cpadirectory.com/accounting-firms"
    }
  ],
  "maxFirms": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

# 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 = {
    "startUrls": [
        {
            "url": "https://cpadirectory.com/accounting-firms"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/cpa-scraper").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 = { "startUrls": [{ "url": "https://cpadirectory.com/accounting-firms" }] }

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/cpa-scraper").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 '{
  "startUrls": [
    {
      "url": "https://cpadirectory.com/accounting-firms"
    }
  ]
}' |
apify call ahmed_jasarevic/cpa-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ahmed_jasarevic/cpa-scraper"
        }
    }
}
```

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/F0ptwHmVXngSE7RsU/builds/pbU5N6hnWU3x88xRW/openapi.json
