# SEC Investment Adviser Firms & Contacts (`automation-lab/sec-registered-investment-advisers-list-and-contacts`) Actor

Build state-filtered SEC investment adviser firm lists from the official IAPD compilation. Export legal and business names, CRD/SEC identifiers, registration, office address, phone, websites, and dated feed provenance.

- **URL**: https://apify.com/automation-lab/sec-registered-investment-advisers-list-and-contacts.md
- **Developed by:** [Automation Lab](https://apify.com/automation-lab) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.92 / 1,000 adviser firm exporteds

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

## SEC Investment Adviser Firms & Contacts

Build and refresh state-filtered lists of **SEC investment adviser firms** from the official IAPD firm compilation. Export business and legal names, public office contacts, regulatory identifiers, registration dates, reported regulatory assets, and dated source provenance.

This Actor returns **firms**, not individual advisers. It includes only records marked `Registered` and `APPROVED`; exempt reporting advisers in the SEC feed are excluded. It is not affiliated with or endorsed by the SEC or FINRA.

### Who is it for?

- Compliance analysts refreshing an adviser-firm reference list.
- Financial-services researchers comparing firms by office state and reported assets.
- Business development teams building public firm-level prospecting lists without individual contact enrichment.

### Why use this Actor?

The official compilation provides a reproducible snapshot rather than a relevance-ranked name search. Every row includes the exact dated feed URL, its generation date, and the retrieval timestamp. Filters are applied locally and consistently; the complete compilation is streamed without loading the XML into memory.

Use CRD as the durable comparison key in your own pipeline. Registration and contact details are reported data, not independent verification or investment advice.

### Get started

1. Enter main office state codes, such as `TX`.
2. Optionally narrow by a literal firm-name substring or minimum regulatory assets.
3. Set the global maximum firms you want returned.
4. Run the Actor and inspect the default dataset.
5. Download JSON, CSV, Excel, or XML using Apify dataset exports.

```json
{"states":["TX"],"maxItems":10}
```

Leave `states` empty to include all main office locations, including foreign offices.

### Input parameters

| Field | Default | Meaning |
| --- | --- | --- |
| `states` | `[]` | ANY main-office state in the supplied two-letter US state/territory codes. Case-insensitive and trimmed. Not notice filings or branches. |
| `nameContains` | `""` | Case-insensitive literal substring in business OR legal name. Input edges trimmed; internal whitespace and punctuation preserved. Not whole-word equality. |
| `minAssets` | `0` | Inclusive minimum USD total regulatory assets from Form ADV Item 5F Q5F2C. Zero disables filtering; positive values exclude missing assets. |
| `maxItems` | `100` | Global accepted unique-firm cap, 1–50000, in feed order after filtering and deduplication. Zero/unlimited is unsupported. |

All enabled filters combine with AND. Unsupported fields and malformed filters fail rather than being silently ignored. No login, cookie, proxy, historical-feed URL, or external enrichment input is needed.

For example, `{"states":["TX","CA"],"nameContains":"capital","minAssets":100000000,"maxItems":100}` selects firms whose main office is in either state, whose business or legal name contains that substring, and whose reported assets meet the minimum.

### Extracted data

| Field | Meaning |
| --- | --- |
| `crdNumber`, `secNumber` | Firm CRD and full SEC identifiers, preserved as strings. |
| `businessName`, `legalName` | Business and legal names from the feed. |
| `firmType`, `registrationStatus`, `registrationDate` | Registered/APPROVED status and its associated date. |
| `address` | Main office street lines, city, state, country and postal code. |
| `phone` | Public main office phone as reported, or null. |
| `websites` | Declared web addresses, including any social profiles, deduplicated. |
| `noticeFiledStates` | Codes for filed notices; not guaranteed service coverage or licenses. |
| `assetsUnderManagement` | Reported total regulatory assets in USD, or null. |
| `filingDate` | Form ADV filing date, or null. |
| `profileUrl` | Official IAPD firm summary link. |
| `sourceUrl`, `feedGeneratedOn`, `retrievedAt` | Exact compilation URL, root generation date and UTC retrieval timestamp. |

Missing optional source values remain null or empty arrays. Websites are not crawled or verified; no personal emails are supplied.

### Output example

A representative record from the official compilation:

```json
{
  "crdNumber": "306053",
  "secNumber": "801-118060",
  "businessName": "SAVE ADVISERS LLC",
  "legalName": "SAVE ADVISERS LLC",
  "firmType": "Registered",
  "registrationStatus": "APPROVED",
  "registrationDate": "2020-02-07",
  "address": {"street1":"4306 YOAKUM BLVD","street2":"SUITE 200","city":"HOUSTON","state":"TX","country":"United States","postalCode":"77006"},
  "phone": "254-284-7283",
  "websites": ["http://www.joinsave.com","https://www.marketsavings.com"],
  "noticeFiledStates": ["TX"],
  "assetsUnderManagement": 3500000,
  "filingDate": "2026-04-09",
  "profileUrl": "https://adviserinfo.sec.gov/firm/summary/306053",
  "sourceUrl": "https://reports.adviserinfo.sec.gov/reports/CompilationReports/IA_FIRM_SEC_Feed_10_10_2026.xml.gz",
  "feedGeneratedOn": "2026-10-10",
  "retrievedAt": "2026-10-10T20:07:06.969Z"
}
```

The `SUMMARY` key-value record contains scanned/emitted counts, feed generation date, exact source URL, and effective filters after the complete feed validates.

### How much does it cost to export SEC investment adviser firms?

Pay-per-event pricing consists of one `start` event per valid run plus one `item` event per exported firm. Filtered-out and duplicate firms have no item charge. Address, phone, websites, and provenance are included in the firm event, with no separate contact charge.

The start fee is **$0.001 per run**. Firm prices by qualifying aggregate monthly Store spend tier are: FREE $0.00368, BRONZE $0.0032, SILVER $0.002496, and GOLD/PLATINUM/DIAMOND $0.00192 per firm. These are Apify Store discount tiers, not a private per-Actor volume schedule. For example, estimated BRONZE totals are $0.0042 for one firm, $0.033 for 10, and $0.321 for 100, including the start fee. Consult the pricing panel for applicable charges; estimates are not guaranteed invoices. A run with no matches still incurs the start charge. Invalid input fails before charging. Platform run limits or an upstream failure may leave charged partial output; do not treat a failed run as a completed snapshot.

### Coverage, limits and freshness

The Actor discovers the current SEC firm gzip through the official compilation manifest. It does not search individual advisers, state-only registered firms, historical filings, emails, or private records. SEC feed membership alone does not mean a firm is registered: exempt advisers are explicitly excluded.

The feed generation date defines freshness. This is not a real-time status check and does not automatically compare runs, send alerts, or detect changes. Schedule runs and compare CRD-keyed exports downstream if you need recurring refreshes.

A smaller result cap reduces output, not compilation scanning. When you hit the cap, matching firms may remain; increase it to obtain more. Compilation order is not a ranking. Feed changes can alter which firms appear first.

### Reliability and troubleshooting

Manifest requests have bounded transient retries. A interrupted feed, non-success response, wrong XML root, incomplete firm identity, or malformed/truncated XML fails the run honestly. The full gzip is consumed for integrity validation even after the output cap. No automatic paid proxy or search fallback changes the scope.

- **Zero firms?** Inspect `SUMMARY` and broaden states, name or assets. A valid empty match is not a source failure.
- **Unexpected state?** `states` refers to the main office, not notice filings, branches or representative locations.
- **Fewer than the cap?** The cap is a maximum, not a promised count.
- **Failed run with rows?** Those rows are partial; investigate the error before using them as a full snapshot.

### Integrations

Use Apify schedules for periodic list refreshes, then send dataset exports to a spreadsheet or warehouse. Join CRD identifiers to your internal compliance records and compare `feedGeneratedOn` before interpreting changes. Webhooks can trigger your own downstream job on successful completion. The Actor itself does not send emails or operate a CRM.

### API usage

Keep your Apify token in environment variables, not shared URLs or documents.

```bash
curl -X POST -H "Authorization: Bearer $APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"states":["TX"],"maxItems":10}' \
  'https://api.apify.com/v2/acts/automation-lab~sec-registered-investment-advisers-list-and-contacts/runs'
```

The response contains a run ID and storage IDs, not result rows. Wait for that run to succeed, then retrieve its `defaultDatasetId` through the dataset API.

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/sec-registered-investment-advisers-list-and-contacts').call({ states: ['TX'], maxItems: 10 });
if (run.status !== 'SUCCEEDED') throw new Error(`Run ${run.id}: ${run.status}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems({ limit: 10 });
console.log(items);
```

```python
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/sec-registered-investment-advisers-list-and-contacts').call(run_input={'states':['TX'], 'maxItems':10})
if run['status'] != 'SUCCEEDED':
    raise RuntimeError(run['status'])
rows = client.dataset(run['defaultDatasetId']).list_items(limit=10).items
```

### MCP usage

Select a stable Actor-specific subset:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/sec-registered-investment-advisers-list-and-contacts"
```

For Claude Desktop, Cursor, and VS Code clients (use the client's supported remote MCP configuration):

```json
{"mcpServers":{"apify":{"url":"https://mcp.apify.com?tools=automation-lab/sec-registered-investment-advisers-list-and-contacts"}}}
```

Example prompts:

- "Export 10 SEC registered adviser firms with main offices in Texas."
- "List five California adviser firms with capital in their name and at least $100 million in regulatory assets."

Discover actual names and argument schemas with read-only `tools/list`. Actor selection also exposes supporting run/data tools, not exactly one tool. For an authorized invocation, ask: “Export 10 SEC registered adviser firms with main offices in Texas.” Start once, retain the run ID, and follow that same run. Server waiting is bounded; a client timeout is not permission to restart.

Use `get-actor-run` with bounded backoff, for example 2/4/8 seconds capped at 10 and a 120-second total deadline. Configure the client timeout above the selected server wait plus transport margin, within that deadline. At deadline report pending with the known run ID. If a timeout leaves the run ID unknown, report uncertainty rather than blindly rerunning. Report terminal failures honestly: any available rows are partial, not a successful full snapshot.

On success call `get-dataset-items` with the returned `defaultDatasetId`, explicit `limit: 20`, `offset: 0`, and projected `fields` for `crdNumber`, `secNumber`, `businessName`, `address`, `phone`, `assetsUnderManagement`, `sourceUrl`, and `feedGeneratedOn`. Use the actual argument names and field-list representation discovered in `tools/list`, not an assumed schema. Prefer untransformed JSON and continue at source offsets 20, 40, etc., using pagination metadata rather than transformed row counts.

Admit at most 100 rows or 64 KiB of serialized UTF-8 results across all pages into model context, whichever comes first. Process pages host-side before model injection; omit or summarize oversized rows/pages with disclosure. If your client cannot intercept oversized responses, do not promise a hard byte guarantee. Stop at exhaustion or budget; report returned rows, continuation offset and partial/truncated status. Full exports stay in downstream storage. These are consumer context budgets, not Actor collection limits. No universal token-saving claim is made.

### Legality, responsible use and diagnostics

Use public firm contact information lawfully and honor applicable privacy and outreach rules. Registration is not an SEC endorsement, an investment recommendation or a guarantee of accuracy. Verify material facts against official records before making compliance decisions.

No AI model is used at runtime. Apify stores datasets, SUMMARY and logs under your account's retention settings; the company plan retains platform data for 31 days. You can delete run datasets and key-value stores through Console or API. Exported copies remain under your control. There is no cross-run cache. For help, open an issue in the Actor's Apify Issues tab.

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, and reports are retained for 30 days.

### FAQ

**Does the Actor return individual advisers or email addresses?** No. It exports firm-level official compilation records and public office contacts only.

**Can I find all firms serving Texas?** Not from the state filter: it selects main offices in Texas. Notice filings are included for context, not proof of service coverage.

**Can I monitor changes?** Schedule runs and compare exports in your own system. No built-in change detector or alerts are supplied.

**Does it include exempt reporting advisers?** No, even though the SEC feed includes them.

### Related Actors

For targeted name/CRD lookup and additional IAPD details rather than compilation lists, see [SEC Investment Adviser Public Disclosure Scraper](https://apify.com/automation-lab/sec-investment-adviser-public-disclosure-scraper). These are distinct workflows; this Actor focuses on reproducible firm-list refreshes.

# Changelog

This Actor's version history is a separate document: https://apify.com/automation-lab/sec-registered-investment-advisers-list-and-contacts/changelog.md

# Actor input Schema

## `states` (type: `array`):

ANY of these two-letter US state or territory codes, matched exactly against the main office state, case-insensitively after trimming. Empty selects all states, including foreign offices. This does not filter notice filings or branch locations.

## `nameContains` (type: `string`):

Case-insensitive literal substring in the business or legal name. Leading/trailing input whitespace is trimmed; internal whitespace and punctuation remain literal. Empty disables this filter. Not a whole-word or exact-name search.

## `minAssets` (type: `number`):

Inclusive minimum total regulatory assets under management reported in Form ADV Item 5F, Q5F2C, in US dollars. Zero disables the filter and includes firms with missing assets; a positive value excludes missing assets.

## `maxItems` (type: `integer`):

Global run cap on unique accepted firms after all filters, in source feed order. Default 100, range 1–50000. Zero/unlimited is unsupported. The complete feed is still streamed to verify integrity; a cap may truncate matching firms and is not an upstream coverage guarantee.

## Actor input object example

```json
{
  "states": [
    "TX"
  ],
  "nameContains": "",
  "minAssets": 0,
  "maxItems": 10
}
```

# Actor output Schema

## `dataset` (type: `string`):

Filtered SEC registered firm records.

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

Validated feed counts and effective filters.

# 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 = {
    "states": [
        "TX"
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/sec-registered-investment-advisers-list-and-contacts").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 = {
    "states": ["TX"],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/sec-registered-investment-advisers-list-and-contacts").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 '{
  "states": [
    "TX"
  ],
  "maxItems": 10
}' |
apify call automation-lab/sec-registered-investment-advisers-list-and-contacts --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/sec-registered-investment-advisers-list-and-contacts"
        }
    }
}
```

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/YcDCHG2llhaTAfVUT/builds/OjKscw4S6sVmwdSlk/openapi.json
