# BrokerCheck Scraper - Financial Advisors, Brokers & Firms (`scrapesage/brokercheck-scraper`) Actor

Scrape FINRA BrokerCheck & SEC IAPD: brokers, investment advisers and firms by name, CRD or firm roster. Full reports — employment history, Series exams/licenses, registered states, disclosures, firm AUM/address/phone. Monitoring + leads. No login, no API key, no browser.

- **URL**: https://apify.com/scrapesage/brokercheck-scraper.md
- **Developed by:** [Scrape Sage](https://apify.com/scrapesage) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Stats:** 2 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 adviser / broker scrapeds

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/platform/actors/running/actors-in-store#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

## BrokerCheck Scraper — Financial Advisors, Brokers & Firms (CRDs, Licenses, Disclosures & Leads)

Extract **complete broker, investment adviser and firm data** straight from the authoritative public registries — **FINRA BrokerCheck** and the **SEC's Investment Adviser Public Disclosure (IAPD)**. Search by name, by CRD number, or pull **every adviser and broker registered at a firm** in one run. Each record ships the full report: **current and previous firms, Series exams & licenses, registered states, SRO categories, disclosures (regulatory actions & customer disputes), years of experience** — and for firms, **type, size, office address, phone, owners and Form ADV brochures**.

No login, no cookies, no browser, no API key — fast, reliable JSON extraction from the official source the whole industry trusts.

### Why this BrokerCheck scraper?

Other "financial advisor" scrapers pull a **subset** from Google Maps or a single membership directory (CFP, NAPFA, FPA). This actor reads the **complete, authoritative U.S. universe** — ~630,000 brokers and ~440,000 investment-adviser reps across ~15,000+ firms — directly from FINRA and the SEC, and ships the **richest dataset in the category**.

| Data | Typical scrapers | This actor |
|---|---|---|
| Authoritative source (FINRA + SEC) | ❌ Maps / one directory | ✅ official registries |
| CRD number (the industry key) | ❌ | ✅ |
| Broker **and** investment-adviser status | partial | ✅ both |
| Series exams & licenses (7, 63, 65, 66…) | ❌ | ✅ |
| Registered states + SRO categories | ❌ | ✅ |
| Current **and** previous firms (work history) | ❌ | ✅ |
| **Disclosures** (regulatory actions, disputes) | ❌ | ✅ |
| Firm type, size, owners, Form ADV brochures | ❌ | ✅ |
| Firm office address + phone | partial | ✅ |
| Full adviser/broker **roster of any firm** | ❌ | ✅ by firm CRD |
| Disclosure-change **monitoring** | ❌ | ✅ |
| Firm contact leads (emails, socials from its site) | ❌ | ✅ opt-in |
| Lead score (0–100) | ❌ | ✅ |

### Use cases

- **Recruiting & competitive intelligence** — pull a competitor's entire adviser/broker roster by firm CRD, complete with licenses, experience and location. The fastest way to build a recruiting list of in-market reps.
- **Fintech & wealthtech sales / lead generation** — target RIA firms and broker-dealers by location, type and size; score them and enrich firm websites for contact emails and socials.
- **Compliance, RegTech & due diligence** — screen brokers, advisers and firms for disclosures (regulatory actions, customer disputes), and monitor for **new** disclosure events over time.
- **Market & M\&A research** — map firm size, ownership, registrations and adviser movement (employment history) across the industry.
- **Verification & onboarding** — confirm a CRD's registrations, licenses and clean/flagged status before doing business.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) — the free plan is enough to try this actor.
2. Open the **BrokerCheck Scraper**, choose **Individuals** or **Firms**, and enter search terms, CRD numbers, or a firm CRD to pull its full roster.
3. Click **Start** and watch results stream into the dataset table.
4. **Export** as JSON, CSV, Excel, XML, or RSS — or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

### Input

```json
{
    "searchType": "individuals",
    "firmCrdNumbers": ["6413"],
    "maxResultsPerTerm": 100,
    "includeDetails": true,
    "stateFilter": "NJ",
    "roleFilter": "advisers",
    "activeOnly": true
}
```

- **searchType** — `individuals` (brokers & advisers) or `firms` (broker-dealers & RIAs).
- **searchTerms** — person names (`John Smith`) or firm names (`Edward Jones`). Each is paginated up to the limit.
- **firmCrdNumbers** — firm CRD numbers (e.g. `6413` = LPL Financial) → list **every** broker & adviser registered there. The recruiting wedge (Individuals mode).
- **crdNumbers** — fetch full reports for specific CRD numbers directly (individuals or firms per the mode).
- **source** *(default `auto`)* — `auto` (BrokerCheck for individuals; BrokerCheck + SEC IAPD merged for firms), `brokercheck` (brokers), or `sec_iapd` (investment advisers).
- **includeDetails** *(default true)* — fetch each record's full report (history, exams, registrations, disclosures; firms add address/phone/owners/brochures). Off = fast lightweight records.
- **roleFilter** *(default any)* — `brokers`, `advisers`, or `any` (Individuals).
- **stateFilter** — keep one US state (`NY` or `New York`); individuals match branch or registered states, firms match office state.
- **activeOnly / withDisclosuresOnly** — registration-status and disclosure filters.
- **enrichFirmContacts** *(default false)* — crawl a firm's own website (home + contact/about) for emails, phones and socials.
- **monitorMode** *(default false)* — emit only records that are new, or whose disclosure count changed since the last run.
- **maxResultsPerTerm** — cap per search term / per firm roster (paginates automatically).

### Output

One record per individual (`type: "individual"`) or firm (`type: "firm"`). An individual record:

```json
{
    "type": "individual",
    "crd": "1113790",
    "fullName": "Joseph Thomas Smith",
    "isBroker": true,
    "isInvestmentAdviser": true,
    "role": "Broker & Investment Adviser",
    "brokerStatus": "Active",
    "adviserStatus": "Active",
    "industryStartDate": "1984-01-14",
    "yearsExperience": 42,
    "currentFirmName": "LPL Financial Llc",
    "currentFirmCrd": "6413",
    "branchCity": "Madison",
    "branchState": "NJ",
    "branchZip": "07940",
    "latitude": 40.76,
    "longitude": -74.42,
    "currentFirms": [{ "firmCrd": "6413", "firmName": "LPL Financial Llc", "registrationBeginDate": "2020-05-07", "branchCity": "Madison", "branchState": "NJ" }],
    "previousFirms": [{ "firmCrd": "7556", "firmName": "Prudential", "branchState": "NJ" }],
    "licenses": ["Series 65", "Series 63", "Series 7"],
    "exams": [{ "category": "Series 65", "name": "Uniform Investment Adviser Law Examination", "scope": "IA", "takenDate": "2002-08-02" }],
    "registeredStateNames": ["California", "Colorado", "Florida", "Maryland", "New Jersey"],
    "registeredStatesCount": 10,
    "registeredSROs": [{ "sro": "FINRA", "status": "APPROVED", "categories": ["General Securities Representative", "Securities Trader"] }],
    "hasDisclosures": false,
    "disclosureCount": 0,
    "disclosures": [],
    "reportUrl": "https://brokercheck.finra.org/individual/summary/1113790",
    "source": "brokercheck",
    "leadScore": 86,
    "scrapedAt": "2026-06-15T12:00:00.000Z"
}
```

A firm record (`type: "firm"`) carries `crd`, `firmName`, `firmType`, `firmSize`, `isBrokerDealer`, `isInvestmentAdviser`, `regulator`, `district`, `formedState`, `street`/`city`/`state`/`postalCode`, `phone`, `secNumber`, `hasDisclosures`/`disclosureCount`/`disclosures`, `directOwners`, `brochures` (Form ADV), `reportUrl`, plus `website`/`contactEmails`/`contactPhones`/`socialLinks` when contact enrichment is on.

#### What to expect (field coverage)

This is official registry data, so the core fields are essentially always present; some are populated only when they exist for that record.

| Entity | Always present | Usually present | Present when it exists |
|---|---|---|---|
| **Individual** | CRD, name, broker/adviser status, role, report URL | current firm + branch location, licenses, registered states, years of experience | previous firms, disclosures (only flagged reps), SRO categories |
| **Firm** | CRD, name, type, broker-dealer/adviser status, report URL | office address, phone, regulator, formed state | direct owners, Form ADV brochures, disclosures, website/emails (with enrichment) |

A blank field means the registry doesn't hold that value for the record — never that scraping failed. Nothing is dropped, so you always get the richest dataset available.

### Automate & schedule

Run this actor on autopilot and pull results into your own stack:

- **[Apify API](https://docs.apify.com/api/v2)** — start runs, fetch datasets, and manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** — official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** — run it daily/weekly with `monitorMode` to catch new advisers at a firm, newly registered firms, or **new disclosures** as they post.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** — trigger downstream actions (CRM import, Slack alert, compliance review) the moment a run finishes.

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

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/brokercheck-scraper').call({
    searchType: 'individuals',
    firmCrdNumbers: ['6413'],
    maxResultsPerTerm: 200,
    includeDetails: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} brokers & advisers`);
```

### Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** — multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** — push new adviser/firm leads straight into your CRM.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** — get alerted when a monitored firm adds a rep or posts a new disclosure.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** — auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** — pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** — trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. Call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** — ask your assistant to "list every active investment adviser at LPL Financial in New Jersey with their licenses" and let it run this scraper for you.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready** — AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)** — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) — no account, no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)** — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### More scrapers from scrapesage

Build a complete **financial & B2B intelligence stack** — pair adviser/broker data with company, contract and filing intel:

- **[SEC EDGAR Scraper](https://apify.com/scrapesage/sec-edgar-scraper)** — filings, XBRL financials, and company profiles.
- **[USAspending Scraper](https://apify.com/scrapesage/usaspending-scraper)** — federal awards, contractors and leads.
- **[SAM.gov Scraper](https://apify.com/scrapesage/sam-gov-scraper)** — federal contract opportunities and contacts.
- **[Companies House Scraper](https://apify.com/scrapesage/companies-house-scraper)** — UK companies, directors and PSCs.
- **[Healthgrades Scraper](https://apify.com/scrapesage/healthgrades-scraper)** — doctors, reviews and provider leads.
- **[Y Combinator Scraper](https://apify.com/scrapesage/ycombinator-scraper)** — startups, founders and jobs.
- **[Product Hunt Scraper](https://apify.com/scrapesage/product-hunt-scraper)** — launches, makers and leads.
- **[LinkedIn Jobs Scraper](https://apify.com/scrapesage/linkedin-jobs-scraper)** — job postings as hiring-intent signals.

### Tips

- **Pull a firm's whole roster**: put the firm's CRD in `firmCrdNumbers` (find it by searching the firm name first, or from the firm's BrokerCheck URL). Then filter by `stateFilter` and `roleFilter` to slice the list.
- **Fastest runs**: turn `includeDetails` off for lightweight records (name, CRD, current firm, location, status) when you don't need the full report — then re-run with details on for the CRDs you keep.
- **Compliance monitoring**: schedule with `monitorMode` on; you'll only get records that are new or whose disclosure count changed — perfect for watchlists.
- **Investment advisers vs brokers**: `roleFilter: "advisers"` (or `source: "sec_iapd"`) for RIAs; `roleFilter: "brokers"` for registered reps. Many professionals are both.
- **Firm emails**: turn on `enrichFirmContacts` — FINRA/SEC never publish emails, so the actor crawls the firm's own website for them.

### FAQ

**Where does the data come from?** FINRA BrokerCheck (`brokercheck.finra.org`) and the SEC's Investment Adviser Public Disclosure (`adviserinfo.sec.gov`) — the official, public U.S. registries for brokers and investment advisers. No API key or login is needed.

**What is a CRD number?** The Central Registration Depository number — FINRA's unique ID for each individual and firm. It's the reliable key for direct lookups and firm rosters.

**Can I get every adviser at a specific firm?** Yes — put the firm's CRD in `firmCrdNumbers` (Individuals mode) and the actor pages through the firm's entire roster, up to your limit.

**Do records include emails or phone numbers?** Firms include their official business phone and address. FINRA/SEC don't publish emails — turn on `enrichFirmContacts` to crawl the firm's own website for contact emails, phones and socials.

**Can I export to Google Sheets, CSV, or Excel?** Yes — one click in the dataset view, or automatically on every run via the [Google Drive integration](https://docs.apify.com/platform/integrations/drive).

**How do I monitor for new disclosures?** Create a [Schedule](https://docs.apify.com/platform/schedules) and turn on `monitorMode`. The actor remembers each CRD's disclosure count and emits a record only when something is new or has changed.

**Is scraping this data legal?** This actor collects publicly available regulatory data only. You are responsible for using the data in compliance with applicable laws (e.g. FCRA, GDPR/CCPA for personal data) and FINRA/SEC terms. It is not a consumer report and must not be used for FCRA-regulated decisions.

**A field is empty — why?** The registry simply doesn't hold that value for that record (e.g. a rep with no previous firms or no disclosures). Fields are blank only when the data doesn't exist — never because the scraper skipped them.

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome — this actor is actively maintained.

# Actor input Schema

## `searchType` (type: `string`):

Scrape individuals (brokers & investment advisers) or firms (broker-dealers & RIA firms). Search terms, CRD numbers and the role/state filters apply to whichever you pick.

## `searchTerms` (type: `array`):

Keywords to search FINRA/SEC for. For individuals use person names (`John Smith`); for firms use firm names (`Morgan Stanley`, `Edward Jones`). One per row. Each is paginated up to the limit below.

## `firmCrdNumbers` (type: `array`):

List every broker & adviser registered at these firms (use the firm's CRD number, e.g. `6413` for LPL Financial). The recruiting/competitive-intel wedge. Used when scraping Individuals.

## `crdNumbers` (type: `array`):

Fetch full reports for specific CRD numbers directly. Treated as individuals or firms depending on the mode above. One CRD per row.

## `source` (type: `string`):

Auto uses FINRA BrokerCheck for individuals and both BrokerCheck + SEC IAPD for firms (merged). Force one registry if you only want brokers (BrokerCheck) or investment advisers (SEC IAPD).

## `maxResultsPerTerm` (type: `integer`):

Cap the number of records returned per search term or per firm roster. Results paginate automatically until this limit or the result set is exhausted.

## `includeDetails` (type: `boolean`):

Open each record's full report: employment history, Series exams & licenses, registered states, SRO categories, disclosures, and (firms) address, phone, type, size, owners and Form ADV brochures. Off = fast lightweight records from search only.

## `roleFilter` (type: `string`):

Keep only brokers, only investment advisers, or any. Applies to the Individuals mode.

## `stateFilter` (type: `string`):

Keep only records in this US state — `NY` or `New York`. Individuals match by branch office or any registered state; firms match by office state. Leave blank for all states.

## `activeOnly` (type: `boolean`):

Keep only currently-active brokers/advisers (or active firms). Off includes former/inactive registrations too.

## `withDisclosuresOnly` (type: `boolean`):

Keep only records that have reportable disclosures (regulatory actions, customer disputes, etc.) — for compliance, due-diligence and screening.

## `enrichFirmContacts` (type: `boolean`):

Opt-in lead enrichment for firms that publish a website: crawl the firm's own site (home + a contact/about page) for contact emails, phone numbers and social links. FINRA/SEC do not expose emails — this is the only public source.

## `monitorMode` (type: `boolean`):

Remember CRDs seen in previous runs and emit ONLY records that are new — or whose disclosure count changed (a new regulatory event). Ideal for compliance monitoring. Pairs with Apify Schedules to track changes over time.

## `monitorStoreName` (type: `string`):

Named key-value store that holds the 'already seen' CRDs (and their disclosure counts) for monitoring mode. Use a different name per tracked target to keep histories separate.

## `maxConcurrency` (type: `integer`):

Maximum parallel requests. Lower it if you hit rate limits on very large runs.

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

Proxy settings. FINRA BrokerCheck and SEC IAPD work fine through the default Apify datacenter proxy.

## Actor input object example

```json
{
  "searchType": "individuals",
  "firmCrdNumbers": [
    "6413"
  ],
  "source": "auto",
  "maxResultsPerTerm": 50,
  "includeDetails": true,
  "roleFilter": "any",
  "stateFilter": "",
  "activeOnly": false,
  "withDisclosuresOnly": false,
  "enrichFirmContacts": false,
  "monitorMode": false,
  "monitorStoreName": "brokercheck-monitor",
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All scraped records in the default dataset. Individual rows carry full registration, license, employment and disclosure data; firm rows carry profile, address, phone, disclosures and lead fields.

# 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 = {
    "firmCrdNumbers": [
        "6413"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/brokercheck-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 = { "firmCrdNumbers": ["6413"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/brokercheck-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "firmCrdNumbers": [
    "6413"
  ]
}' |
apify call scrapesage/brokercheck-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scrapesage/brokercheck-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/6KFW1PevzklMWcw0R/builds/G0IItDnqGI2Z4Jmgv/openapi.json
