FINRA APIfinra.org ↗
Search FINRA disciplinary actions and BrokerCheck data for broker firms and individuals. Access CRD numbers, disclosure history, registration status, and case documents.
What is the FINRA API?
The FINRA API exposes 4 endpoints covering disciplinary actions and BrokerCheck records for registered broker-dealer firms and individual financial professionals. Use search_disciplinary_actions to retrieve paginated case records including respondent names, action dates, summaries, and PDF document links, or use search_broker_individuals and search_broker_firms to look up CRD numbers, registration status, and disclosure counts.
curl -X GET 'https://api.parse.bot/scraper/40fbc4b0-7f95-453f-b59c-47dc93c2a889/search_disciplinary_actions?page=0&query=fraud' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace finra-org-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
from parse_apis.finra_brokercheck_api import Finra, DisciplinaryAction, Firm, Individual, Employment
finra = Finra()
# Search for disciplinary actions related to fraud
for action in finra.disciplinaryactions.search(query="fraud", limit=5):
print(action.case_id, action.respondent_name, action.action_date, action.document_type)
# Search for broker firms by name
for firm in finra.firms.search(query="Goldman Sachs", limit=3):
print(firm.firm_id, firm.name, firm.status, firm.disclosures)
print(firm.address.city, firm.address.state, firm.address.postal_code)
# Search for individual brokers
for individual in finra.individuals.search(query="Smith", limit=3):
print(individual.individual_id, individual.first_name, individual.last_name, individual.status)
for emp in individual.current_employments:
print(emp.firm_name, emp.branch_city, emp.branch_state)
# List firms alphabetically
for firm in finra.firms.list_alphabetical(letter="B", limit=5):
print(firm.firm_id, firm.name, firm.crd, firm.branch_count)
Search FINRA disciplinary actions by keyword or phrase. Returns paginated results (15 per page) including respondent names, case summaries, action dates, and links to PDF documents. When no query is provided, returns the most recent actions. Pagination is 0-indexed.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination (0-indexed). Each page contains up to 15 results. |
| query | string | Search keyword or phrase (e.g. 'fraud', 'insider trading'). |
{
"type": "object",
"fields": {
"page": "integer current page number",
"cases": "array of case objects with case_id, respondent_name, action_date, summary, document_type, document_url",
"total_results": "integer total number of matching cases",
"results_per_page": "integer number of results per page (15)"
},
"sample": {
"data": {
"page": 0,
"cases": [
{
"case_id": "2023077612101",
"summary": "Between August 2021 and October 2022...",
"action_date": "06/01/2026",
"document_url": "https://www.finra.org/sites/default/files/fda_documents/2023077612101%20Clayton%20K.%20Shum%20CRD%204412927%20AWC%20ks.pdf",
"document_type": "AWCs (Letters of Acceptance, Waiver, and Consent)",
"respondent_name": "Clayton K. Shum"
}
],
"total_results": 1438,
"results_per_page": 15
},
"status": "success"
}
}About the FINRA API
Disciplinary Actions
The search_disciplinary_actions endpoint accepts a query string (e.g. "fraud", "unauthorized trading") and a 0-indexed page parameter. Each response contains up to 15 case objects, each with case_id, respondent_name, action_date, summary, document_type, and a document_url pointing to the associated PDF filing. The total_results field lets you calculate how many pages to iterate.
BrokerCheck: Firms
search_broker_firms accepts a firm query (name or CRD number) with optional limit (up to 100) and offset for pagination. Each firm object in the response includes crd, sec_number, status, disclosures, branch_count, address, and any other_names the firm has operated under. The list_firms_alphabetical endpoint mirrors this structure but accepts a single letter parameter to enumerate all registered firms starting with that character — useful for bulk data collection.
BrokerCheck: Individuals
search_broker_individuals searches by name or CRD number and returns individual records containing first_name, middle_name, last_name, other_names, crd, status, disclosures, and registration details. The total field supports pagination via limit and offset. Disclosure presence is indicated per record, enabling quick triage of advisers with regulatory history.
Coverage and Scope
All four endpoints reflect FINRA's publicly available BrokerCheck and disciplinary action databases. Firm and individual records include registration status and disclosure counts but do not expose the full text of individual disclosure events — those require following the document_url links returned in disciplinary action results.
The FINRA API is a managed, monitored endpoint for finra.org — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when finra.org changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official finra.org API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Screen a financial adviser's CRD number for prior disciplinary actions before engagement
- Bulk-enumerate registered broker-dealer firms alphabetically using
list_firms_alphabeticalfor compliance databases - Search BrokerCheck by firm name to retrieve SEC number, branch count, and current registration status
- Aggregate disciplinary case counts by keyword (e.g. 'churning', 'misrepresentation') for regulatory research
- Verify whether an individual broker has disclosure events on record before onboarding
- Cross-reference a firm's CRD number against its disclosure history for due diligence workflows
- Build an alert system that monitors new disciplinary actions matching a keyword over time
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does FINRA offer an official public developer API?+
What does the `search_broker_individuals` endpoint return beyond a name match?+
crd, status, disclosures (a count or flag), other_names, and registration fields. It does not return the full employment history narrative or the detailed text of each disclosure event. The disclosures field signals whether a record exists, and you can use the CRD number to look up the associated disciplinary action documents via search_disciplinary_actions.Does the disciplinary actions endpoint return the full text of case documents?+
document_url linking to the PDF filing on finra.org, plus a summary field and metadata (case_id, respondent_name, action_date, document_type). Full document parsing is not part of the current response. You can fork this API on Parse and add an endpoint that fetches and parses the linked PDF if your workflow requires the full case text.Can I filter disciplinary actions by date range or action type?+
search_disciplinary_actions endpoint currently accepts only a query string and a page number. Filtering by date range, action type (e.g. AWC, Decision), or specific respondent type is not supported in the current parameters. You can fork the API on Parse and revise the endpoint to add those filter parameters if the underlying data supports them.How does pagination work across the BrokerCheck endpoints?+
search_broker_firms and search_broker_individuals use limit and offset parameters; the response includes a total field so you can calculate the number of pages needed. search_disciplinary_actions uses a 0-indexed page parameter with a fixed page size of 15 results, and returns total_results to support full iteration.