Technical writing
SEC Enforcement Actions: The Public Record of Every Securities Law Violation
Every time the Securities and Exchange Commission charges a person or entity with violating federal securities law, it publishes a record. Those records — spanning Administrative Proceedings, Litigation Releases, and Do Not Pay final orders — form one of the most complete public enforcement databases maintained by any federal financial regulator.
Three enforcement channels
The SEC pursues violations through three distinct legal channels, each generating its own public record. Understanding which channel produced a given action matters because the remedies available, the procedural posture, and the downstream searchability differ substantially across the three.
Administrative Proceedings are brought before the SEC's own administrative law judges under Exchange Act Section 15(b) and related authority. The Commission issues an Order Instituting Proceedings (OIP) that sets out the charges and schedules a hearing. Possible outcomes include cease-and-desist orders, suspension from practice before the Commission, permanent bars from the securities industry, revocation of broker-dealer or investment adviser registrations, and civil monetary penalties. Administrative proceedings are the channel for most actions against regulated professionals — brokers, investment advisers, auditors, and attorneys — because the SEC has direct jurisdiction over their registrations.
Litigation Releases announce civil actions filed in federal district court. When the SEC sues in federal court — typically seeking injunctive relief, disgorgement of ill-gotten gains, prejudgment interest, and civil monetary penalties — the Office of Investor Education and Advocacy publishes a Litigation Release describing the complaint. Federal court cases proceed under the Federal Rules of Civil Procedure and are publicly docketed in PACER. Defendants may contest the charges before an Article III judge. Settlements require court approval. The full complaint, any consent judgment, and the final order are public PACER documents.
Do Not Pay — final orders and judgments is the third channel. The SEC is required by the Digital Accountability and Transparency Act to report final orders and civil monetary judgments to the Do Not Pay Business Center operated by the Treasury Bureau of the Fiscal Service. This feeds into the government-wide debt collection and payment integrity system. The Do Not Pay database is not itself publicly searchable, but the underlying orders that feed it are public through the Administrative Proceedings and Litigation Releases systems.
The SEC Enforcement Actions page
The canonical starting point for SEC enforcement data is sec.gov/divisions/enforce/enforcements.shtml. The Division of Enforcement maintains this page with annual summary statistics, links to the year's press releases, and narrative descriptions of major cases. Annual statistics published there include total actions filed, total monetary remedies, number of whistleblower awards, number of trading suspensions, and a breakdown by enforcement program area (insider trading, accounting fraud, market manipulation, investment adviser fraud, municipal securities, and so on).
These aggregate numbers reveal enforcement priority shifts across administrations. The SEC brought roughly 700 to 800 enforcement actions per year between 2015 and 2024, recovering between $4 billion and $5 billion annually in disgorgement, prejudgment interest, and civil penalties. The composition of those actions — how many target individuals versus institutions, how many involve jury trials versus settlements, how many result in officer-and-director bars — shifts measurably with the political priorities of each Commission chair.
The Litigation Releases bulletin
The Litigation Releases archive at sec.gov/litigation/litreleases.shtml is organized by year into chronological HTML index pages. Each index entry contains the release date, the release number (in the format LR-NNNNN), a hyperlink to the full press release, and a one-line summary naming the defendant and the nature of the charges. Annual indexes go back to 1995 and are complete. The full-text press releases go back further and are individually linked.
Each Litigation Release press release follows a standard structure: the defendant's name and location, the district court where the complaint was filed, the statutes alleged to have been violated, a narrative description of the alleged scheme, and the remedies sought. Where a case has been settled, the release also describes the consent judgment terms — whether the defendant admitted or denied the allegations, the amount of disgorgement, prejudgment interest, and civil penalties, and any injunctive relief. The PACER case number is usually embedded in the press release text, enabling direct retrieval of the underlying complaint and all subsequent filings.
The Administrative Proceedings bulletin
The Administrative Proceedings archive at sec.gov/litigation/admin.shtml mirrors the structure of the Litigation Releases index: annual chronological HTML pages, each row containing a date, a release number (in the format 34-NNNNN for Exchange Act proceedings, IA-NNNNN for investment adviser proceedings, or AAE-NNNNN for accounting and auditing enforcement), a link, and a brief description naming the respondent.
Administrative Proceedings are also indexed in EDGAR. The SEC's full-text order — the Order Instituting Proceedings, any initial decision by the administrative law judge, and the final Commission opinion — is filed on EDGAR and is searchable through EDGAR Full-Text Search. This means that EDGAR, in addition to its role as the repository for company filings, is also the primary repository for administrative enforcement orders. Searching EDGAR for “Order Instituting Proceedings” or “cease-and-desist” returns the full text of orders, not just metadata.
What each action record contains
Taken together, the Litigation Releases and Administrative Proceedings records contain a consistent set of structured and semi-structured fields:
- Defendant or respondent — individual name, corporate name, or both. Multiple respondents are common in administrative proceedings involving an advisory firm and its principals.
- Action type — civil complaint, administrative order, consent decree, default judgment, or contested decision.
- Statute violated — specific Exchange Act, Securities Act, Investment Advisers Act, or Investment Company Act sections cited. Common citations include Securities Act Section 17(a) (fraud in the offer or sale), Exchange Act Section 10(b) and Rule 10b-5 (fraud in connection with securities transactions), and Exchange Act Section 13(a) (reporting violations by public companies).
- Charges — a narrative description of the alleged conduct, including the time period, the financial instruments involved, and the named victims or class of investors.
- Sanctions — the specific remedies imposed or agreed to, including the exact dollar amounts for disgorgement, prejudgment interest, and civil monetary penalties, as well as any industry bars (officer-and-director bar, broker bar, investment adviser bar, auditor suspension from practice before the Commission).
- Admission or denial — whether the respondent admitted the allegations as a condition of settlement, denied them, or neither admitted nor denied (the most common settlement posture prior to 2012, when the SEC began requiring admissions in certain cases under Chair Mary Jo White).
- Date filed and date decided — the filing date of the complaint or OIP, and the date of the final order or judgment.
Disgorgement, penalties, and how the money is allocated
Disgorgement is the SEC's primary equitable remedy: the defendant must give up the profits causally connected to the violation. Prejudgment interest is added to approximate the time value of money from the date of the violation to the date of the order. Civil monetary penalties are punitive, imposed under the Securities Enforcement Remedies and Penny Stock Reform Act of 1990 and subsequent amendments; the maximum per-violation penalty is adjusted for inflation annually.
The Supreme Court's 2020 decision in Liu v. SEC held that disgorgement must be limited to a defendant's net profits — not gross revenues — and must be returned to harmed investors rather than paid to the Treasury. This tightened the SEC's disgorgement authority and reduced the headline dollar amounts in some settlements, while increasing the proportion of settlements that include an explicit Fair Fund distribution plan.
A Fair Fund is established under Sarbanes-Oxley Section 308 when the SEC collects civil penalties along with disgorgement. The combined proceeds are placed in a distribution fund administered for the benefit of harmed investors. Fair Fund distributions are administered by a court-appointed distribution agent and may take years to complete. The SEC maintains a public list of active and completed Fair Fund distributions on its website.
The whistleblower program
Section 21F of the Securities Exchange Act, enacted in Dodd-Frank, established the SEC Whistleblower Program. A whistleblower who voluntarily provides original information that leads to an enforcement action resulting in sanctions exceeding $1 million is entitled to between 10% and 30% of those sanctions. The program is administered by the Office of the Whistleblower, which publishes an annual report with aggregate statistics on tips received, awards paid, and covered actions.
Annual whistleblower awards have exceeded $400 million in recent years. The largest single award to date — $279 million paid in 2023 — went to a single individual whose tip led to charges against multiple international broker-dealers involved in a spoofing scheme. Whistleblower tips are confidential; the Office publishes award orders that describe the covered action and the percentage award without identifying the recipient.
The whistleblower program's financial incentives have materially increased the volume of substantive tips reaching the Division of Enforcement. Internal reporting channels are no longer the exclusive path for employees who witness securities violations, which has changed the risk calculus for compliance failures at regulated firms.
How journalists use SEC enforcement data
Three analytical applications dominate investigative use of SEC enforcement records:
Serial violator identification. Because the SEC publishes enforcement records going back to 1995 in machine-readable HTML, it is possible to build a respondent database and check for repeat appearances. An individual or firm that appears in SEC enforcement records across multiple years — particularly where earlier consent orders included injunctions against future violations — may face enhanced penalties under recidivist-aggravation provisions. ProPublica, the Wall Street Journal, and the New York Times have each published analyses identifying broker-dealers and investment advisers with multiple enforcement actions across years.
Revolving door tracking. The SEC's Office of Inspector General and external researchers have documented the movement of staff between the Commission and regulated firms. SEC enforcement attorneys who leave to represent defendants create at least an appearance of structural conflict. Joining enforcement records against SEC ethics disclosures, FINRA BrokerCheck, and SEC Form ADV filings reveals cases where former SEC staff subsequently represented clients who faced actions the staff member may have previously worked on. This analysis requires entity resolution across disparate government databases.
Enforcement priority shifts by administration.The composition of SEC enforcement actions changes measurably across Commission chairs. Comparing year-over-year counts of insider trading actions versus accounting fraud actions versus investment adviser fraud actions, along with the ratio of individual-versus-entity defendants and the frequency of admissions-required settlements, provides a quantitative window into how enforcement discretion is being exercised. These shifts are politically visible but rarely quantified; the public enforcement record makes quantification straightforward.
Scraping and parsing the public record
The Litigation Releases and Administrative Proceedings index pages are stable HTML tables. The following Python script fetches annual indexes for both channels, parses each entry, and optionally enriches each record by fetching the individual press release to extract statute citations and sanction types:
import requests
from bs4 import BeautifulSoup
import re
import csv
import time
from datetime import datetime
# ── Litigation Releases ────────────────────────────────────────────────────────
LR_BASE = "https://www.sec.gov/litigation/litreleases"
def fetch_lr_index(year: int) -> list[dict]:
"""Fetch the annual Litigation Releases index page and parse each entry."""
url = f"{LR_BASE}/{year}.shtml"
resp = requests.get(url, headers={"User-Agent": "research-bot/1.0"})
resp.raise_for_status()
soup = BeautifulSoup(resp.text, "html.parser")
records = []
for row in soup.select("table tr"):
cells = row.find_all("td")
if len(cells) < 3:
continue
date_text = cells[0].get_text(strip=True)
lr_link = cells[1].find("a")
summary = cells[2].get_text(strip=True)
if not lr_link:
continue
lr_number = lr_link.get_text(strip=True)
lr_url = "https://www.sec.gov" + lr_link["href"] if lr_link["href"].startswith("/") else lr_link["href"]
records.append({
"source": "LR",
"date": date_text,
"release": lr_number,
"url": lr_url,
"summary": summary,
})
return records
# ── Administrative Proceedings ─────────────────────────────────────────────────
AP_BASE = "https://www.sec.gov/litigation/admin"
def fetch_ap_index(year: int) -> list[dict]:
"""Fetch the annual Administrative Proceedings index and parse each entry."""
url = f"{AP_BASE}/{year}.shtml"
resp = requests.get(url, headers={"User-Agent": "research-bot/1.0"})
resp.raise_for_status()
soup = BeautifulSoup(resp.text, "html.parser")
records = []
for row in soup.select("table tr"):
cells = row.find_all("td")
if len(cells) < 3:
continue
date_text = cells[0].get_text(strip=True)
ap_link = cells[1].find("a")
respondents = cells[2].get_text(strip=True)
if not ap_link:
continue
release_no = ap_link.get_text(strip=True)
ap_url = "https://www.sec.gov" + ap_link["href"] if ap_link["href"].startswith("/") else ap_link["href"]
records.append({
"source": "AP",
"date": date_text,
"release": release_no,
"url": ap_url,
"respondents": respondents,
})
return records
# ── Enrich: pull the press-release page to extract statute and sanction ────────
STATUTE_RE = re.compile(r"Section\s+[\d]+[\w()+]* of the", re.IGNORECASE)
def enrich_record(record: dict) -> dict:
"""GET the individual release page and extract statute citations."""
try:
resp = requests.get(record["url"], headers={"User-Agent": "research-bot/1.0"}, timeout=15)
resp.raise_for_status()
soup = BeautifulSoup(resp.text, "html.parser")
body = soup.get_text(" ", strip=True)
statutes = list(set(STATUTE_RE.findall(body)))
record["statutes"] = "; ".join(statutes)
# Detect key sanction types mentioned in the release text
record["disgorgement"] = "disgorgement" in body.lower()
record["civil_penalty"] = "civil money" in body.lower() or "civil penalty" in body.lower()
record["bar_order"] = "bar" in body.lower() and "officer" in body.lower()
except Exception as exc:
record["statutes"] = ""
record["disgorgement"] = False
record["civil_penalty"] = False
record["bar_order"] = False
record["_error"] = str(exc)
time.sleep(0.5) # be polite to SEC servers
return record
# ── Main: build a structured CSV for a range of years ─────────────────────────
def build_enforcement_database(start_year: int, end_year: int, out_path: str) -> None:
all_records: list[dict] = []
for year in range(start_year, end_year + 1):
print(f"Fetching LR index {year}...")
all_records.extend(fetch_lr_index(year))
print(f"Fetching AP index {year}...")
all_records.extend(fetch_ap_index(year))
print(f"Enriching {len(all_records)} records...")
enriched = [enrich_record(r) for r in all_records]
fieldnames = ["source", "date", "release", "url", "summary",
"respondents", "statutes", "disgorgement",
"civil_penalty", "bar_order"]
with open(out_path, "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=fieldnames, extrasaction="ignore")
writer.writeheader()
writer.writerows(enriched)
print(f"Wrote {len(enriched)} records to {out_path}")
if __name__ == "__main__":
build_enforcement_database(2015, 2024, "sec_enforcement_actions.csv")
The script uses requests and BeautifulSoup. The 0.5-second sleep between enrichment requests is consistent with polite crawling of government sites. The SEC's robots.txt does not prohibit crawling the litigation pages. For bulk access across the full historical archive (30 years, roughly 25,000 records), the enrichment step should be parallelized with a bounded thread pool and exponential backoff on 429 responses.
The resulting CSV, with one row per enforcement action, can be loaded into any relational database, normalized by respondent name using fuzzy matching, and joined against FINRA BrokerCheck, SEC EDGAR company search, and the Corporate Prosecution Registry to identify defendants who faced simultaneous SEC civil and DOJ criminal proceedings.
Limitations
Several structural gaps affect the completeness of the public record. First, the SEC resolves some investigations through informal means — deficiency letters, examination findings referred to compliance staff, and Wells Notices that result in voluntary remediation — that never generate a public enforcement action. The public record documents only cases the SEC chose to charge. Second, the SEC can, and in national security-adjacent cases does, seek court orders to seal portions of complaints or judgments. Third, individual dollar amounts for disgorgement and penalties are sometimes expressed in aggregate for multiple respondents in a single release, making it impossible to attribute a specific amount to a specific defendant without reading the underlying PACER documents.
Despite these limitations, the SEC enforcement record is among the most complete, consistently structured, and historically deep public enforcement databases maintained by any federal financial regulator. The combination of EDGAR full-text search, chronological HTML bulletins, and annual statistical summaries provides more access points than most comparable agencies offer.
For audit-level securities enforcement data from the PCAOB, including inspection findings for every registered audit firm: One in four audits flagged: indexing PCAOB deficiency data across the Big 4 →
For the Section 16 insider transaction record that runs parallel to SEC enforcement: SEC Form 4: The Public Record of Every Insider Stock Transaction →
For the DOJ counterpart to SEC civil enforcement — deferred prosecution agreements and non-prosecution agreements in criminal securities cases: The DPA database: every federal deferred prosecution agreement since 1992 →