sec-api.ioSEC API by D2V
FilingsPricingSandboxDocs
Log inGet Free API Key
API Documentation
Introduction

Filing Query API
Full-Text Search API
Stream API
Download & PDF Generator API
XBRL-to-JSON Converter 
Extractor API 

Form ADV API - Investment Advisers

Form 3/4/5 API - Insider Trading
Form 144 API - Restricted Sales
Form 13F API - Institut. Holdings
Form 13D/13G API - Activist Invst.
Form N-PORT API - Mutual Funds

Form N-CEN API - Annual Reports
Form N-PX API - Proxy Voting

Form S-1/424B4 API - IPOs, Notes
Form C API - Crowdfunding
Form D API - Private Sec. Offerings
Form 1-A/1-K/1-Z - Reg A Offerings

Form 8-K API - Item 4.01
Form 8-K API - Item 4.02
Form 8-K API - Item 5.02

Executive Compensation API
Directors & Board Members
Company Subsidiaries
Outstanding Shares & Public Float

SEC Enforcement Actions
SEC Litigation Releases
Overview
Example: Python
SEC Administrative Proceedings
AAER Database API
SRO Filings Database

CIK, CUSIP, Ticker Mapping API
EDGAR Entities Database

Financial Statements

Analyzing SEC Litigation Releases in Python

Open In Colab   Download Notebook

On this page:
  • Litigations by Year and Month
    • Litigations by Year and Settlement Type
      • Litigations by Year And Count of Agreements to Pay Penalties
      • Penalty Amount Analysis
        • Penalty Amount by Year
          • Top 10 Penalty Amounts
            • Penalties by Type of Defendant
            • Litigations by Category
              • Requested Reliefs by Category
                • Violated Securities Laws
                  • Persons & Agencies Conducting the Investigations
                    • Other Agencies Involved

                      In this guide, we will analyze all SEC litigation releases from 1995 to 2025 obtained from the litigation database. The dataset contains information about all litigation releases published by the U.S. Securities and Exchange Commission (SEC) from 1995 to 2025 and includes information about the defendants, charges, penalty amounts, and other relevant details.

                      Our analysis will focus on several key aspects of the dataset, including:

                      • The number of litigation releases published each year and month
                      • Litigations by settlement type and agreement to pay penalties
                      • Penalty amounts by year
                      • Top 10 penalties by amount
                      • Categories of requested reliefs, violations, and more
                      import pandas as pd
                      import numpy as np
                      import matplotlib.pyplot as plt
                      import matplotlib.style as style

                      style.use("default")

                      params = {
                          "axes.labelsize": 8,
                          "font.size": 8,
                          "legend.fontsize": 8,
                          "xtick.labelsize": 8,
                          "ytick.labelsize": 8,
                          "text.usetex": False,
                          "font.family": "sans-serif",
                          "axes.spines.top": False,
                          "axes.spines.right": False,
                          "grid.color": "grey",
                          "axes.grid": True,
                          "axes.grid.axis": "y",
                          "axes.grid.axis": "x",
                          "grid.alpha": 0.5,
                          "grid.linestyle": ":",
                      }

                      plt.rcParams.update(params)

                      For the sake of brevity, we downloaded all SEC litigation data from 1995 to 2025 and saved it as a JSONL file. We will load this data into a pandas DataFrame and perform our analysis using Python.

                      df = pd.read_json(
                          # TODO: replace with your path
                          "/path/to/sec-litigation-releases.jsonl",
                          lines=True,
                      )
                      # convert "releasedAt" to datetime and to EST timezone
                      df["releasedAt"] = pd.to_datetime(df["releasedAt"], utc=True)
                      df["releasedAt"] = df["releasedAt"].dt.tz_convert("US/Eastern")
                      df["releasedAtYear"] = df["releasedAt"].dt.year
                      df["releasedAtMonth"] = df["releasedAt"].dt.month
                      df["releasedAtYearMonth"] = df["releasedAt"].dt.to_period("M")
                      # Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
                      df["releasedAtDay"] = df["releasedAt"].dt.day_name()
                      df["hasAgreedToSettlement"] = df["hasAgreedToSettlement"].astype(bool)
                      df["hasAgreedToPayPenalty"] = df["hasAgreedToPayPenalty"].astype(bool)
                      df['caseCitation'] = df['caseCitations'].map(lambda x: x[0] if x else None)

                      print(f"Loaded {len(df):,.0f} SEC litigation releases from 1995 to 2025\n")
                      print(df.info())
                      Loaded 11,536 SEC litigation releases from 1995 to 2025

                      <class 'pandas.core.frame.DataFrame'>
                      RangeIndex: 11536 entries, 0 to 11535
                      Data columns (total 26 columns):
                       # Column Non-Null Count Dtype
                      --- ------ -------------- -----
                       0 id 11536 non-null object
                       1 releaseNo 11536 non-null object
                       2 releasedAt 11536 non-null datetime64[ns, US/Eastern]
                       3 url 11536 non-null object
                       4 title 11535 non-null object
                       5 subTitle 11536 non-null object
                       6 caseCitations 11536 non-null object
                       7 resources 11536 non-null object
                       8 summary 11524 non-null object
                       9 tags 11524 non-null object
                       10 entities 11524 non-null object
                       11 complaints 11524 non-null object
                       12 parallelActionsTakenBy 11524 non-null object
                       13 hasAgreedToSettlement 11536 non-null bool
                       14 hasAgreedToPayPenalty 11536 non-null bool
                       15 penaltyAmounts 11524 non-null object
                       16 requestedRelief 11524 non-null object
                       17 violatedSections 11524 non-null object
                       18 investigationConductedBy 11524 non-null object
                       19 litigationLedBy 11524 non-null object
                       20 otherAgenciesInvolved 11524 non-null object
                       21 releasedAtYear 11536 non-null int32
                       22 releasedAtMonth 11536 non-null int32
                       23 releasedAtYearMonth 11536 non-null period[M]
                       24 releasedAtDay 11536 non-null object
                       25 caseCitation 11192 non-null object
                      dtypes: bool(2), datetime64[ns, US/Eastern](1), int32(2), object(20), period[M](1)
                      memory usage: 2.0+ MB
                      None
                      /var/folders/q3/bt7922t52p78qdm75h_8m5yh0000gn/T/ipykernel_39183/1704038985.py:6: UserWarning: Converting to PeriodArray/Index representation will drop timezone information.
                        df["releasedAtYearMonth"] = df["releasedAt"].dt.to_period("M")
                      df.head()
                      Out:
                      idreleaseNoreleasedAturltitlesubTitlecaseCitationsresourcessummarytags...requestedReliefviolatedSectionsinvestigationConductedBylitigationLedByotherAgenciesInvolvedreleasedAtYearreleasedAtMonthreleasedAtYearMonthreleasedAtDaycaseCitation
                      0c3772c013f5a90d0c1c0170bbed8ad6aLR-262312025-01-22 21:17:05-05:00https://www.sec.gov/enforcement-litigation/lit...Gabriel RebeizSEC Charges Technical Consultant with Insider ...[Securities and Exchange Commission v. Gabriel...[{'label': 'SEC Complaint', 'url': 'https://ww...The SEC filed settled charges against Gabriel ...[insider trading]...[disgorgement of profits, civil penalties, per...[Section 10(b) of the Securities Exchange Act ...[Sara Kalin, John Rymas, Stephen Kam][Diana Tani, Joseph Sansone][{'name': 'Financial Industry Regulatory Autho...202512025-01WednesdaySecurities and Exchange Commission v. Gabriel ...
                      1860c50b5c1bfa963e68568f2b6008ba4LR-262302025-01-21 15:00:18-05:00https://www.sec.gov/enforcement-litigation/lit...Old South Trading Co., LLC; Brendan H. Church;...SEC Charges Father and Son for $25.8 Million U...[Securities and Exchange Commission v. Old Sou...[{'label': 'SEC Complaint', 'url': 'https://ww...The SEC has charged Old South Trading Co., LLC...[unregistered securities offering, unregistere......[injunctive relief, disgorgement of allegedly ...[Sections 5(a) and (c) of the Securities Act o...[Jonathan Shapiro, Andrew Elliott, Margaret Vi...[Dean Conway][]202512025-01TuesdaySecurities and Exchange Commission v. Old Sout...
                      21485373724567b64d7cee1c8ce853fe3LR-262292025-01-18 19:09:46-05:00https://www.sec.gov/enforcement-litigation/lit...Nova Labs, Inc.SEC Charges Nova Labs, Inc. with Fraud and Reg...[Securities and Exchange Commission v. Nova La...[{'label': 'SEC Complaint', 'url': 'https://ww...The SEC has charged Nova Labs, Inc. with fraud...[fraud, registration violations, crypto]...[permanent and conduct-based injunctions, disg...[Sections 5(a), 5(c), and 17(a)(2) of the Secu...[Emmy E. Rush, Christopher Colorado, Kim Han, ...[Emmy E. Rush, Christopher Colorado, Peter Man...[]202512025-01SaturdaySecurities and Exchange Commission v. Nova Lab...
                      335ebfbcaf74cef9401e78f8e92b934e6LR-262282025-01-17 22:20:10-05:00https://www.sec.gov/enforcement-litigation/lit...Arete Wealth Management LLC; Arete Wealth Advi...SEC Charges Arete Wealth Broker-Dealer and Adv...[Securities and Exchange Commission v. Arete W...[{'label': 'SEC Complaint', 'url': 'https://ww...The SEC has charged Arete Wealth Management LL...[fraud, illegal securities offering, recordkee......[permanent injunctions, civil penalties, condu...[Sections 206(1) and 206(2) of the Investment ...[Theresa H. Gue, Austin Thompson, Christopher ...[Oren Gleich, Preethi Krishnamurthy][{'name': 'U.S. Attorney's Office for the East...202512025-01FridaySecurities and Exchange Commission v. Arete We...
                      460cabddfdd7abcf4c1da9bffebc55a1eLR-262272025-01-17 21:56:17-05:00https://www.sec.gov/enforcement-litigation/lit...Naufal SanaullahSEC Charges Fund Executive with Making False S...[Securities and Exchange Commission v. Naufal ...[{'label': 'SEC Complaint', 'url': 'https://ww...The SEC charged Naufal Sanaullah with making f...[disclosure fraud, securities fraud]...[permanent injunctive relief, disgorgement alo...[Section 17(a) of the Securities Act of 1933, ...[Heather Marlow, Kimberly L. Frederick, Nichol...[Zachary Carlyle, Gregory A. Kasper, Nicholas ...[{'name': 'Federal Bureau of Investigation', '...202512025-01FridaySecurities and Exchange Commission v. Naufal S...

                      5 rows × 26 columns

                      Litigations by Year and Month

                      # piv table with years = col, months = index, values = count of cases
                      df_year_month = df.pivot_table(
                          index="releasedAtYear",
                          columns="releasedAtMonth",
                          values="id",
                          aggfunc="count",
                          fill_value=0,
                      )

                      total_col = df_year_month.sum(axis=1)
                      mean_col = round(df_year_month.mean(axis=1), 0)
                      median_col = round(df_year_month.median(axis=1), 0)

                      df_year_month["total"] = total_col
                      df_year_month["mean"] = mean_col
                      df_year_month["median"] = median_col

                      total_row = df_year_month.sum(axis=0)
                      mean_row = round(df_year_month.mean(axis=0), 0)
                      median_row = round(df_year_month.median(axis=0), 0)

                      df_year_month.loc["total"] = total_row
                      df_year_month.loc["mean"] = mean_row
                      df_year_month.loc["median"] = median_row

                      df_year_month = df_year_month.astype(int)

                      print("SEC Litigation Releases by Year and Month")
                      df_year_month
                      SEC Litigation Releases by Year and Month
                      Out:
                      releasedAtMonth123456789101112totalmeanmedian
                      releasedAtYear
                      19950000000023393625123100
                      19963722303632402730734226344293633
                      19973732394624202839532726294003330
                      19982820353534313036534419253903232
                      19993824312740332442522331213863231
                      20002341383245402534684427344513836
                      20013935283241362730554935414483736
                      20025838604942555260496545446175150
                      20034849496541456051645840496195249
                      20043440503940444348533636324954140
                      20053946594631502736573930384984239
                      20063431534234383235394032264363634
                      20073036413539394246513824404613839
                      20082627423357263532633422224193532
                      20093642633844484929404043425144342
                      20104129444030452427433841374393739
                      20113635443832393226313327414143434
                      20123327403632242334362430273663031
                      20132521343118243123383419203182624
                      20141420242527241822252518242662224
                      20151625152422221916442417262702222
                      2016162033172435212139916182692220
                      20172126342430222036282121253082624
                      20181521313625274034472834173553030
                      2019726212922402434462324223182624
                      20203120322515211520591417323012520
                      20211619242318262437471322232922423
                      20222416162524302733532016213052524
                      20232326331638283023571117143162624
                      20241711152923252728532214242882424
                      202525000000000002520
                      total8678251058973924977876962143995780587311536957910
                      mean2827343130322831463126283723129
                      median2826343231312733493326263863231
                      fig, ax = plt.subplots(figsize=(5, 3))

                      df_year_month.loc[1995:2024]["total"].plot(
                          kind="line",
                          ax=ax,
                          marker="o",
                          markersize=3,
                          linewidth=1,
                      )

                      ax.set_title("SEC Litigation Releases per Year")
                      ax.set_xlabel("Year")
                      ax.set_ylabel("Number of Cases")
                      plt.tight_layout()
                      plt.grid(axis="x")
                      ax.set_axisbelow(True)
                      plt.show()

                      Litigations by Year and Settlement Type

                      # piv table for hasAgreedToSettlement
                      # col = hasAgreedToSettlement (true, false), index = year, values = count of cases
                      df_year_settlement = df.pivot_table(
                          index="releasedAtYear",
                          columns="hasAgreedToSettlement",
                          values="id",
                          aggfunc="count",
                          fill_value=0,
                      )

                      total_col = df_year_settlement.sum(axis=1)
                      mean_col = round(df_year_settlement.mean(axis=1), 0)
                      median_col = round(df_year_settlement.median(axis=1), 0)

                      total_row = df_year_settlement.sum(axis=0)
                      mean_row = round(df_year_settlement.mean(axis=0), 0)
                      median_row = round(df_year_settlement.median(axis=0), 0)

                      df_year_settlement.loc["total"] = total_row
                      df_year_settlement.loc["mean"] = mean_row
                      df_year_settlement.loc["median"] = median_row

                      df_year_settlement = df_year_settlement.astype(int)

                      df_year_settlement
                      Out:
                      hasAgreedToSettlementFalseTrue
                      releasedAtYear
                      19956360
                      1996215214
                      1997195205
                      1998209181
                      1999196190
                      2000239212
                      2001214234
                      2002337280
                      2003322297
                      2004244251
                      2005241257
                      2006177259
                      2007210251
                      2008188231
                      2009273241
                      2010205234
                      2011194220
                      2012190176
                      2013161157
                      2014135131
                      2015160110
                      2016149120
                      2017174134
                      2018177178
                      2019171147
                      2020161140
                      2021173119
                      2022165140
                      2023165151
                      2024146142
                      2025718
                      total58565680
                      mean189183
                      median188181
                      # stacked bar chart for hasAgreedToSettlement
                      fig, ax = plt.subplots(figsize=(6, 4))

                      df_year_settlement.drop(["total", "mean", "median"]).plot(
                          kind="bar", stacked=False, ax=ax, color=["#1f77b4", "#ff7f0e"]
                      )

                      plt.title("SEC Litigation Releases by Year and Settlement")
                      plt.xlabel("Year")
                      plt.ylabel("Count")
                      plt.legend(["No Settlement", "Settlement"], loc="upper right")
                      plt.grid(axis="x")
                      ax.set_axisbelow(True)
                      plt.tight_layout()
                      plt.show()

                      Litigations by Year And Count of Agreements to Pay Penalties

                      # piv table for hasAgreedToPayPenalty
                      # col = hasAgreedToPayPenalty (true, false), index = year, values = count of cases
                      df_year_penalty = df.pivot_table(
                          index="releasedAtYear",
                          columns="hasAgreedToPayPenalty",
                          values="id",
                          aggfunc="count",
                          fill_value=0,
                      )

                      total_col = df_year_penalty.sum(axis=1)
                      mean_col = round(df_year_penalty.mean(axis=1), 0)
                      median_col = round(df_year_penalty.median(axis=1), 0)

                      total_row = df_year_penalty.sum(axis=0)
                      mean_row = round(df_year_penalty.mean(axis=0), 0)
                      median_row = round(df_year_penalty.median(axis=0), 0)

                      df_year_penalty.loc["total"] = total_row
                      df_year_penalty.loc["mean"] = mean_row
                      df_year_penalty.loc["median"] = median_row

                      df_year_penalty = df_year_penalty.astype(int)

                      df_year_penalty
                      Out:
                      hasAgreedToPayPenaltyFalseTrue
                      releasedAtYear
                      19958835
                      1996296133
                      1997266134
                      1998254136
                      1999222164
                      2000285166
                      2001251197
                      2002375242
                      2003339280
                      2004270225
                      2005243255
                      2006205231
                      2007230231
                      2008224195
                      2009308206
                      2010225214
                      2011219195
                      2012183183
                      2013172146
                      2014144122
                      2015154116
                      2016162107
                      2017173135
                      2018200155
                      2019182136
                      2020171130
                      2021191101
                      2022165140
                      2023192124
                      2024144144
                      20251114
                      total65444992
                      mean211161
                      median205146
                      # stacked bar chart for hasAgreedToSettlement
                      fig, ax = plt.subplots(figsize=(6, 4))

                      df_year_penalty.drop(["total", "mean", "median"]).plot(
                          kind="bar", stacked=False, ax=ax, color=["#1f77b4", "#ff7f0e"]
                      )

                      plt.title("SEC Litigation Releases by Year and Penalty")
                      plt.xlabel("Year")
                      plt.ylabel("Count")
                      plt.legend(["Did not agree to penalty", "Agreed to penalty"], loc="upper right")
                      plt.grid(axis="x")
                      ax.set_axisbelow(True)
                      plt.tight_layout()
                      plt.show()

                      Penalty Amount Analysis

                      all_penalties = []
                      case_citations = {}

                      # iterate over all rows, extract penalties and append to all_penalties
                      for i, row in df.drop_duplicates(subset=["caseCitation"], keep="last").iterrows():
                          penaltyAmounts = row["penaltyAmounts"]

                          if isinstance(penaltyAmounts, list):
                              for penalty in penaltyAmounts:
                                  if "penaltyAmount" in penalty:
                                      # find entity with "name" == "imposedOn"
                                      entity = list(filter(lambda x: x["name"] == penalty["imposedOn"], row["entities"]))
                                      entity_type = entity[0]["type"] if entity else None

                                      all_penalties.append(
                                          {
                                              "caseCitation": row['caseCitation'],
                                              "releaseNo": row["releaseNo"],
                                              "releasedAt": row["releasedAt"],
                                              "releasedAtYear": row["releasedAtYear"],
                                              "releasedAtMonth": row["releasedAtMonth"],
                                              "amount": penalty["penaltyAmount"],
                                              "imposedOn": penalty["imposedOn"],
                                              "imposedOnType": entity_type,
                                              "url": row["url"],
                                          }
                                      )

                      all_penalties_df = pd.DataFrame(all_penalties)
                      all_penalties_df["amount"] = all_penalties_df["amount"].astype(float)

                      # remove all doubles by caseCitation and imposedOn
                      all_penalties_df = all_penalties_df.drop_duplicates(
                          subset=["caseCitation", "imposedOn", "amount"], keep="last"
                      )

                      all_penalties_df
                      Out:
                      caseCitationreleaseNoreleasedAtreleasedAtYearreleasedAtMonthamountimposedOnimposedOnTypeurl
                      0Securities and Exchange Commission v. Gabriel ...LR-262312025-01-22 21:17:05-05:0020251360673.00Gabriel Rebeizindividualhttps://www.sec.gov/enforcement-litigation/lit...
                      1Securities and Exchange Commission v. Arete We...LR-262282025-01-17 22:20:10-05:0020251200000.00Michael Sealyindividualhttps://www.sec.gov/enforcement-litigation/lit...
                      2Securities and Exchange Commission v. American...LR-262252025-01-17 17:57:15-05:00202511876115.22Ross C. Miles, American Equities, Inc., and Am...Nonehttps://www.sec.gov/enforcement-litigation/lit...
                      3Securities and Exchange Commission v. American...LR-262252025-01-17 17:57:15-05:00202511146307.10Ross C. Miles, American Equities, Inc., and Am...Nonehttps://www.sec.gov/enforcement-litigation/lit...
                      4Securities and Exchange Commission v. American...LR-262252025-01-17 17:57:15-05:0020251230464.00Ross C. Miles, American Equities, Inc., and Am...Nonehttps://www.sec.gov/enforcement-litigation/lit...
                      ..............................
                      9421SECURITIES AND EXCHANGE COMMISSION v. CROSS FI...LR-146491995-09-21 14:18:04-04:00199598600000.00Douglas S. Crossindividualhttps://www.sec.gov/files/litigation/litreleas...
                      9422SECURITIES AND EXCHANGE COMMISSION v. CROSS FI...LR-146491995-09-21 14:18:04-04:00199592600000.00Michael J. Colelloindividualhttps://www.sec.gov/files/litigation/litreleas...
                      9423SECURITIES AND EXCHANGE COMMISSION v. ROBERT M...LR-146441995-09-20 14:18:03-04:0019959922741.00Stifel, Nicolaus and Company, Incorporatedcompanyhttps://www.sec.gov/files/litigation/litreleas...
                      9424SECURITIES AND EXCHANGE COMMISSION v. ROBERT M...LR-146441995-09-20 14:18:03-04:0019959263637.00Stifel, Nicolaus and Company, Incorporatedcompanyhttps://www.sec.gov/files/litigation/litreleas...
                      9425SECURITIES AND EXCHANGE COMMISSION v. ROBERT M...LR-146441995-09-20 14:18:03-04:0019959250000.00Stifel, Nicolaus and Company, Incorporatedcompanyhttps://www.sec.gov/files/litigation/litreleas...

                      9291 rows × 9 columns

                      Penalty Amount by Year

                      # aggregate amount by year
                      penalties_year = all_penalties_df.groupby("releasedAtYear")["amount"].sum()
                      penalties_year = penalties_year.astype(int)
                      penalties_year = pd.DataFrame(penalties_year)
                      penalties_year["amount"] = round(penalties_year["amount"] / 1_000_000, 2)
                      print("Total Penalties in Million USD by Year")
                      penalties_year
                      Total Penalties in Million USD by Year
                      Out:
                      amount
                      releasedAtYear
                      1995107.50
                      1996187.45
                      1997119.11
                      1998201.08
                      1999384.33
                      2000365.14
                      2001398.37
                      20021051.64
                      20037185.29
                      20041265.45
                      20052510.20
                      20064326.68
                      20071033.73
                      20082178.02
                      20091787.05
                      20103566.43
                      20111355.98
                      20121681.49
                      20131485.04
                      20141824.30
                      2015690.43
                      20163168.99
                      2017934.54
                      2018411.99
                      2019495.31
                      20201043.57
                      2021803.07
                      2022757.16
                      2023539.52
                      20241111.01
                      202544.36
                      fig, ax = plt.subplots(figsize=(5, 3))

                      penalties_year.loc[1995:2024]["amount"].plot(
                          kind="line",
                          ax=ax,
                          marker="o",
                          markersize=3,
                          linewidth=1,
                      )

                      # format y labels to , notation
                      ax.get_yaxis().set_major_formatter(plt.FuncFormatter(lambda x, loc: "{:,}".format(int(x))))
                      ax.set_title("SEC Penalties per Year")
                      ax.set_xlabel("Year")
                      ax.set_ylabel("Penalty Amount\nin Million USD")
                      plt.tight_layout()
                      plt.grid(axis="x")
                      ax.set_axisbelow(True)
                      plt.show()

                      Top 10 Penalty Amounts

                      # sort all penalties by amount, show top 10
                      top_10_penalties = all_penalties_df.sort_values("amount", ascending=False).head(10)
                      top_10_penalties["amount"] = round(top_10_penalties["amount"] / 1_000_000, 2)
                      top_10_penalties["amount"] = top_10_penalties["amount"].map("{:,.1f}".format)
                      print("Top 10 SEC Penalties in Million USD between 1995 and 2024")
                      # show all columns in full width
                      pd.set_option("display.max_colwidth", None)
                      top_10_penalties[['amount', 'imposedOn', 'releasedAt', 'releaseNo', 'url']]
                      Top 10 SEC Penalties in Million USD between 1995 and 2024
                      Out:
                      amountimposedOnreleasedAtreleaseNourl
                      68462,250.0WorldCom, Inc.2003-08-07 14:21:04-04:00LR-18277https://www.sec.gov/enforcement-litigation/litigation-releases/lr-18277
                      58871,600.0American International Group, Inc.2006-02-09 14:22:14-05:00LR-19560https://www.sec.gov/enforcement-litigation/litigation-releases/lr-19560
                      69741,510.0WorldCom Inc.2003-05-19 14:20:57-04:00LR-18147https://www.sec.gov/enforcement-litigation/litigation-releases/lr-18147
                      2056957.0Braskem S.A.2016-12-21 14:26:01-05:00LR-23705https://www.sec.gov/enforcement-litigation/litigation-releases/lr-23705
                      6731894.0ten firms, Grubman and Blodget2003-10-31 14:21:13-05:00LR-18438https://www.sec.gov/enforcement-litigation/litigation-releases/lr-18438
                      2502806.2Marlon Quan and the other defendants2014-09-25 14:25:28-04:00LR-23093https://www.sec.gov/enforcement-litigation/litigation-releases/lr-23093
                      5888800.0American International Group, Inc.2006-02-09 14:22:14-05:00LR-19560https://www.sec.gov/enforcement-litigation/litigation-releases/lr-19560
                      2058632.0Braskem S.A.2016-12-21 14:26:01-05:00LR-23705https://www.sec.gov/enforcement-litigation/litigation-releases/lr-23705
                      1012601.0CR Intrinsic and the relief defendants2021-02-03 14:27:14-05:00LR-25022https://www.sec.gov/enforcement-litigation/litigation-releases/lr-25022
                      4626569.0Siemens Aktiengesellschaft2008-12-15 14:23:23-05:00LR-20829https://www.sec.gov/enforcement-litigation/litigation-releases/lr-20829
                      # reset display options
                      pd.reset_option("display.max_colwidth")

                      Penalties by Type of Defendant

                      # create piv table across years and imposedOnType, with values = sum of penalties
                      penalties_entity_type = all_penalties_df.pivot_table(
                          index="releasedAtYear",
                          columns="imposedOnType",
                          values="amount",
                          aggfunc="sum",
                          fill_value=0,
                      )

                      total_col = penalties_entity_type.sum(axis=1)
                      mean_col = round(penalties_entity_type.mean(axis=1), 0)
                      median_col = round(penalties_entity_type.median(axis=1), 0)

                      total_row = penalties_entity_type.sum(axis=0)
                      mean_row = round(penalties_entity_type.mean(axis=0), 0)
                      median_row = round(penalties_entity_type.median(axis=0), 0)

                      penalties_entity_type.loc["total"] = total_row
                      penalties_entity_type.loc["mean"] = mean_row
                      penalties_entity_type.loc["median"] = median_row

                      # format to million and , notation
                      penalties_entity_type = round(penalties_entity_type / 1_000_000, 2)
                      penalties_entity_type = penalties_entity_type.map("{:,.1f}".format)

                      print("SEC Penalties in Million USD by Year and Entity Type")

                      penalties_entity_type = penalties_entity_type[['company', 'individual']]
                      penalties_entity_type
                      SEC Penalties in Million USD by Year and Entity Type
                      Out:
                      imposedOnTypecompanyindividual
                      releasedAtYear
                      199532.453.1
                      199637.458.8
                      199721.293.3
                      199836.671.4
                      1999173.0186.1
                      200044.2259.9
                      2001122.8236.4
                      2002284.8680.6
                      20035,197.41,043.4
                      2004994.095.8
                      2005856.71,648.6
                      20063,749.3540.9
                      2007572.6451.6
                      20081,893.3245.2
                      20091,261.2358.7
                      20102,650.8451.2
                      2011959.1305.9
                      2012964.6515.1
                      20131,032.5358.3
                      2014225.9537.7
                      2015259.6374.4
                      20162,760.4338.6
                      2017140.3732.5
                      201834.3348.1
                      2019230.3200.8
                      2020788.1104.7
                      202171.296.3
                      202285.3320.9
                      2023199.3239.7
                      2024781.9307.7
                      20255.236.0
                      total26,465.811,291.5
                      mean853.7364.2
                      median259.6307.7
                      fig, ax = plt.subplots(figsize=(5, 3))

                      data_to_plot = penalties_entity_type.loc[1995:2024].map(
                          lambda x: float(x.replace(",", ""))
                      )

                      data_to_plot.plot(kind="bar", stacked=False, ax=ax, color=["#1f77b4", "#ff7f0e"])

                      plt.title("SEC Penalties by Year and Entity Type")
                      plt.xlabel("Year")
                      plt.ylabel("Penalty Amount\nin Million USD")
                      plt.legend(["Company", "Individual"], loc="upper right")
                      plt.grid(axis="x")
                      ax.set_axisbelow(True)
                      plt.tight_layout()
                      plt.show()

                      Litigations by Category

                      all_tags = []

                      for i, row in df.iterrows():
                          tags = row["tags"]
                          if isinstance(tags, list):
                            all_tags.extend(tags)

                      all_tags = pd.Series(all_tags)
                      all_tags = all_tags.value_counts().reset_index()
                      all_tags.columns = ["tag", "count"]

                      print("Top 10 Tags in SEC Litigation Releases")
                      all_tags.head(10)
                      Top 10 Tags in SEC Litigation Releases
                      Out:
                      tagcount
                      0disclosure fraud5875
                      1securities fraud3389
                      2insider trading1900
                      3fraud1454
                      4ponzi scheme932
                      5accounting fraud676
                      6unregistered securities656
                      7misappropriation474
                      8investment fraud404
                      9securities violation312

                      Requested Reliefs by Category

                      # count all unique requestedRelief
                      all_requested_relief = []

                      for i, row in df.iterrows():
                          requestedRelief = row["requestedRelief"]
                          if isinstance(requestedRelief, list):
                              all_requested_relief.extend(requestedRelief)

                      all_requested_relief = pd.Series(all_requested_relief)
                      all_requested_relief = all_requested_relief.value_counts().reset_index()

                      all_requested_relief.columns = ["requestedRelief", "count"]

                      print("Top 10 Requested Reliefs in SEC Litigation Releases")
                      all_requested_relief.head(10)
                      Top 10 Requested Reliefs in SEC Litigation Releases
                      Out:
                      requestedReliefcount
                      0permanent injunctions6522
                      1civil penalties5632
                      2disgorgement of profits3931
                      3permanent injunction1274
                      4prejudgment interest1185
                      5disgorgement of ill-gotten gains979
                      6disgorgement911
                      7asset freeze576
                      8civil money penalties401
                      9permanent injunctive relief390

                      Violated Securities Laws

                      # count all unique violatedSections
                      all_violated_sections = []

                      for i, row in df.iterrows():
                          violatedSections = row["violatedSections"]
                          if isinstance(violatedSections, list):
                              all_violated_sections.extend(violatedSections)

                      all_violated_sections = pd.Series(all_violated_sections)
                      all_violated_sections = all_violated_sections.value_counts().reset_index()

                      all_violated_sections.columns = ["violatedSections", "count"]

                      print("Top 10 Violated Securities Laws in SEC Litigation Releases")
                      all_violated_sections.head(10)
                      Top 10 Violated Securities Laws in SEC Litigation Releases
                      Out:
                      violatedSectionscount
                      0Rule 10b-56185
                      1Section 10(b) of the Securities Exchange Act o...5684
                      2Section 17(a) of the Securities Act of 19333827
                      3Sections 5(a), 5(c) and 17(a) of the Securitie...690
                      4Sections 206(1) and 206(2) of the Investment A...523
                      5Sections 5(a), 5(c), and 17(a) of the Securiti...469
                      6Section 15(a) of the Exchange Act410
                      7Section 17(a) of the Securities Act402
                      8Sections 10(b) and 13(b)(5) of the Securities ...311
                      9Sections 5(a) and 5(c) of the Securities Act o...309

                      Persons & Agencies Conducting the Investigations

                      all_investigation_conducted_by = []

                      for i, row in df.iterrows():
                          investigationConductedBy = row["investigationConductedBy"]
                          if isinstance(investigationConductedBy, list):
                              all_investigation_conducted_by.extend(investigationConductedBy)

                      all_investigation_conducted_by = pd.Series(all_investigation_conducted_by)
                      all_investigation_conducted_by = all_investigation_conducted_by.value_counts().reset_index()

                      all_investigation_conducted_by.columns = ["investigationConductedBy", "count"]

                      print("Top 10 Investigation Conducted By in SEC Litigation Releases")
                      all_investigation_conducted_by.head(10)
                      Top 10 Investigation Conducted By in SEC Litigation Releases
                      Out:
                      investigationConductedBycount
                      0Securities and Exchange Commission437
                      1Division of Enforcement256
                      2U.S. Securities and Exchange Commission161
                      3SEC103
                      4John Rymas83
                      5Amy Gwiazda81
                      6New York Regional Office72
                      7Federal Bureau of Investigation61
                      8Boston Regional Office59
                      9Miami Regional Office55

                      Other Agencies Involved

                      # count unique otherAgenciesInvolved
                      all_other_agencies_involved = []

                      for i, row in df.iterrows():
                          otherAgenciesInvolved = row["otherAgenciesInvolved"]
                          if isinstance(otherAgenciesInvolved, list):
                              all_other_agencies_involved.extend(otherAgenciesInvolved)

                      all_other_agencies_involved = pd.DataFrame(all_other_agencies_involved)
                      all_other_agencies_involved = all_other_agencies_involved['name'].value_counts().reset_index()

                      all_other_agencies_involved.columns = ["otherAgenciesInvolved", "count"]

                      print("Top 10 Other Agencies Involved in SEC Litigation Releases")
                      all_other_agencies_involved.head(10)
                      Top 10 Other Agencies Involved in SEC Litigation Releases
                      Out:
                      otherAgenciesInvolvedcount
                      0Federal Bureau of Investigation1172
                      1Financial Industry Regulatory Authority552
                      2British Columbia Securities Commission98
                      3Ontario Securities Commission82
                      4Options Regulatory Surveillance Authority78
                      5Texas State Securities Board77
                      6New York Stock Exchange77
                      7Internal Revenue Service71
                      8U.S. Attorney's Office for the Southern Distri...71
                      9U.S. Postal Inspection Service69

                      Footer

                      Products

                      • EDGAR Filing Search API
                      • Full-Text Search API
                      • Real-Time Filing Stream API
                      • Filing Download & PDF Generator API
                      • XBRL-to-JSON Converter
                      • 10-K/10-Q/8-K Item Extractor
                      • Investment Adviser & Form ADV API
                      • Insider Trading Data - Form 3, 4, 5
                      • Restricted Sales Notifications - Form 144
                      • Institutional Holdings - Form 13F
                      • Form N-PORT API - Investment Company Holdings
                      • Form N-CEN API - Annual Reports by Investment Companies
                      • Form N-PX API - Proxy Voting Records
                      • Form 13D/13G API
                      • Form S-1/424B4 - IPOs, Debt & Rights Offerings
                      • Form C - Crowdfunding Offerings
                      • Form D - Private Placements & Exempt Offerings
                      • Regulation A Offering Statements API
                      • Changes in Auditors & Accountants
                      • Non-Reliance on Prior Financial Statements
                      • Executive Compensation Data API
                      • Directors & Board Members Data
                      • Company Subsidiaries Database
                      • Outstanding Shares & Public Float
                      • SEC Enforcement Actions
                      • Accounting & Auditing Enforcement Releases (AAERs)
                      • SRO Filings
                      • CIK, CUSIP, Ticker Mapping

                      General

                      • Pricing
                      • Features
                      • Supported Filings
                      • EDGAR Filing Statistics

                      Account

                      • Sign Up - Start Free Trial
                      • Log In
                      • Forgot Password

                      Developers

                      • API Sandbox
                      • Documentation
                      • Resources & Tutorials
                      • Python API SDK
                      • Node.js API SDK

                      Legal

                      • Terms of Service
                      • Privacy Policy

                      Legal

                      • Terms of Service
                      • Privacy Policy

                      SEC API

                      © 2025 sec-api.io by Data2Value GmbH. All rights reserved.

                      SEC® and EDGAR® are registered trademarks of the U.S. Securities and Exchange Commission (SEC).

                      EDGAR is the Electronic Data Gathering, Analysis, and Retrieval system operated by the SEC.

                      sec-api.io and Data2Value GmbH are independent of, and not affiliated with, sponsored by, or endorsed by the U.S. Securities and Exchange Commission.

                      sec-api.io is classified under SIC code 7375 (Information Retrieval Services), providing on-demand access to structured data and online information services.