John Cole

Jul 27, 2026 • 3 min read

How to Build an RIA Contact List from SEC Data with One API

Query 250,000+ SEC-registered investment advisor contacts and RIA firms as JSON. Filter by city, state, or CRD number and export a lead list.

  • I kept rebuilding the same pipeline for finance prospecting projects: download the SEC's compiled advisor data, unpack a very large file, and write parsers to join individuals to their firms. It works once. Then next month's snapshot lands and you rerun everything, because the bulk files never tell you what changed. So I turned it into a query API.

    The SEC Investment Advisors Search is a scraper-backed database you query like an API: filters in, contact and firm records out, with pagination and incremental updates handled for you. It covers 250,000+ investment professionals and 15,000+ RIA firms from the public Investment Adviser Public Disclosure registry.

    What the API returns

    You query by name, city, state, or CRD number and choose firms, contacts, or both. Each contact links to its firm and carries:

    • Contact name and firm name, with firm-level CRD identifiers

    • Email, with a verification status

    • Phone number, when present at the contact level

    • Professional profile URL, where a profile was found

    • Office address and firm website

    Run it in three steps

    Open the SEC Investment Advisors Search and click Try for free. Pick a query_type (firms, contacts, or both) and set filters like firm_city or firm_state. Run it and download the dataset as JSON or CSV. You pay per contact returned, and contacts_limit caps the spend before a run starts.

    Use it as a REST API

    Start a run with a POST to the Apify API and read the dataset when it finishes:

    POST /v2/acts/johnvc~SECInvestmentAdvisorContacts/runs
    
    {
     "query_type": "both",
     "firm_city": "New York",
     "firm_state": "NY",
     "contacts_limit": 25
    }

    Wire it into Claude with MCP

    Because Apify exposes Actors over the Model Context Protocol, Claude, Claude Code, and Cursor can run advisor searches as a tool call. "Find me RIA firms in Austin and pull their contacts" becomes a prompt instead of a script, and the structured records land in the conversation.

    What people build with it

    Sales teams selling into financial services build outreach lists; market researchers map how advisory firms distribute across states; CRM operators enrich stale records with verified emails and firm associations. There are runnable examples on the project page, including Build financial advisor lead lists from SEC data and List SEC registered investment advisors in Texas.

    FAQ About Scraping SEC Investment Advisor Data

    What does the SEC advisor scraper cost per contact?

    About a cent per contact returned, plus a couple of tenths of a cent in run setup fees. contacts_limit caps the spend before a run starts, and the free credit on a new Apify account covers a real first list.

    How do I call the scraper as a REST API?

    POST to the Actor's run endpoint with your filters as JSON, then read the default dataset as JSON or CSV when the run finishes. One row per contact, each linked to its firm.

    Can I use the scraper from Claude or other MCP clients?

    Yes. Connect it through Apify's MCP server and it appears as a callable tool, so an agent can pull advisor lists mid-conversation with no scraping code.

    What won't this scraper give you?

    It covers SEC-registered investment advisors, so brokers, insurance agents, and state-only registrants outside that registry will not appear. Emails carry a verification status but no guarantee of deliverability, and profile URLs exist only where a profile was found. Treat it as a strong starting list, not a finished campaign.

    Questions or a field you wish it returned? I usually respond within a day on the Actor's Issues tab.

Join John on Peerlist!

Join amazing folks like John and thousands of other builders on Peerlist.

peerlist.io/

It’s available... this username is available! 😃

Claim your username before it's too late!

This username is already taken, you’re a little late.😐

0

0

0