# FINRA BrokerCheck Scraper (`rdx1s/finra-brokercheck-scraper`) Actor

Extract broker and financial-advisor records from FINRA BrokerCheck by name, firm, or location. Get CRD numbers, registration status, disclosure flags, and firm details as clean structured data — for lead generation, compliance, recruiting, and market research. No API key needed.

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

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

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

## FINRA BrokerCheck Scraper — Brokers, Advisors & Firms

Turn the public **FINRA BrokerCheck** database into clean, structured data —
every US broker, financial advisor, broker-dealer and RIA. Search by name, firm,
state, exam/license, or CRD number and export **30+ fields** per record to CSV,
JSON, or Excel.

✅ **No API key. No rate limits. No login.** BrokerCheck is public record
published by FINRA — this Actor just makes it usable, with built-in retry/backoff
so large pulls finish cleanly.

### What you can do with it

- **Build a targeted list** — e.g. *every advisor at LPL Financial in Texas*,
  with firm, office address, tenure, and disclosures.
- **Verify a roster of CRDs** — paste a list of CRD numbers and get back current
  status, firm, registered states and disclosure history (compliance & KYC).
- **Recruit by license** — find everyone holding a **Series 65 / Series 7** (or
  any exam) at a given firm or state.
- **Pull firm / RIA data** — search broker-dealers and RIAs (Form ADV): status,
  SEC #, branch count, office address, disclosures.
- **Feed an AI agent** — call it as a tool over **MCP**, or wire it into
  **n8n, Make and Zapier** to monitor advisors automatically.

### Example input

```json
{
  "searchType": "individual",
  "firm": "LPL FINANCIAL",
  "state": "TX",
  "examNames": ["Series 65"],
  "fetchDetails": true,
  "maxResults": 200
}
```

### Sample output (one record, trimmed)

```json
{
  "crd": "1113790",
  "firstName": "JOHN",
  "lastName": "SMITH",
  "statusText": "Active",
  "currentFirm": "LPL FINANCIAL LLC",
  "currentFirmSince": "5/7/2020",
  "branchStreet": "14 MAIN STREET, SUITE 305B",
  "branchCity": "MADISON",
  "branchState": "NJ",
  "latitude": "40.758346",
  "longitude": "-74.420134",
  "registeredStateCodes": ["CA", "CO", "DE", "FL", "NJ", "NY"],
  "disclosureCount": 0,
  "brokerCheckUrl": "https://brokercheck.finra.org/individual/summary/1113790"
}
```

### What you get (30+ fields)

- **Identity:** CRD, name, broker & advisor status (human-readable), industry
  start date, registration count.
- **Firm & office:** current firm + CRD, tenure, and the exact **branch street
  address with latitude/longitude** (with `fetchDetails`).
- **Licensing:** exams held (Series 7/65/…), and **registered states** with
  scope, status and date.
- **Risk:** disclosure count and full disclosure history; previous employment
  history.
- **Trust:** a one-click link to the official BrokerCheck profile.
- **Firms:** name, BD/RIA status, SEC #, branch count, office address, disclosures.

### Works with AI agents & automation

Every Apify Actor is exposed as a tool over the **Model Context Protocol
(MCP)**, so AI agents can call this scraper directly. It also runs from
**n8n, Make, Zapier**, the Apify API, or on a schedule.

### Good to know

- Source: public FINRA BrokerCheck — no PII beyond what FINRA publishes.
- `fetchDetails` enriches each person with disclosures, exams, registered states,
  tenure, branch address and geo (one extra request per record).
- CRD look-ups always resolve a known person regardless of other filters.

### Input reference

| Field               | Type    | Description                                                                 |
|---------------------|---------|-----------------------------------------------------------------------------|
| `query`             | string  | Name, firm, location, or CRD number to search.                              |
| `searchType`        | string  | `individual` (brokers & advisors) or `firm` (broker-dealers & RIAs).        |
| `queries`           | array   | Run several searches in one go; merged and de-duplicated by CRD.            |
| `crdNumbers`        | array   | Look up specific people directly by CRD number (verify a known list).       |
| `state`             | string  | Two-letter state code (e.g. `NY`). Keeps records registered in that state.  |
| `firm`              | string  | Individuals only: keep only people at this firm, e.g. `LPL FINANCIAL`.      |
| `examNames`         | array   | Individuals only: keep only holders of these exams, e.g. `Series 65`.       |
| `maxResults`        | integer | Max number of records to collect (default 100).                            |
| `fetchDetails`      | boolean | Enrich each person with disclosures, exams, states, tenure, branch & geo.   |
| `activeOnly`        | boolean | Keep only currently active records.                                        |
| `hasDisclosureOnly` | boolean | Keep only records with disclosure events.                                  |
| `includeRaw`        | boolean | Include the full raw FINRA source object (default off).                     |

### Run locally

```bash
pip install -r requirements.txt
apify run
```

# Actor input Schema

## `query` (type: `string`):

Name, firm, location, or a CRD number to search on FINRA BrokerCheck.

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

Search individuals (brokers & advisors) or firms (broker-dealers & RIAs).

## `queries` (type: `array`):

Run several searches in one go. Results are merged and de-duplicated by CRD.

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

Individuals only: look up specific people directly by CRD number (ideal for verifying a known list).

## `state` (type: `string`):

Two-letter state code (e.g. NY, CA, TX). Keeps people/firms registered in that state (filtered on FINRA's side). Note: a person's current office may be in a neighbouring state.

## `firm` (type: `string`):

Individuals only: keep only people at this firm, e.g. 'LPL FINANCIAL'. Filtered on FINRA's side.

## `examNames` (type: `array`):

Individuals only: keep only people who hold one of these exams, e.g. 'Series 65', 'Series 7'. Turns on full details automatically.

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

Maximum number of records to collect.

## `fetchDetails` (type: `boolean`):

Individuals only: enrich each record with disclosures, exams, registered states, tenure, and full employment history.

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

Keep only currently active brokers/advisors (or active firms). Filtered on FINRA's side for individuals.

## `hasDisclosureOnly` (type: `boolean`):

Keep only records that have disclosure events.

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

Individuals only: add the full raw FINRA source object to each record.

## Actor input object example

```json
{
  "query": "smith",
  "searchType": "individual",
  "queries": [],
  "crdNumbers": [],
  "examNames": [],
  "maxResults": 100,
  "fetchDetails": false,
  "activeOnly": false,
  "hasDisclosureOnly": false,
  "includeRaw": false
}
```

# Actor output Schema

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

Collected FINRA BrokerCheck records.

# 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 = {
    "query": "smith"
};

// Run the Actor and wait for it to finish
const run = await client.actor("rdx1s/finra-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 = { "query": "smith" }

# Run the Actor and wait for it to finish
run = client.actor("rdx1s/finra-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 '{
  "query": "smith"
}' |
apify call rdx1s/finra-brokercheck-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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