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
Overview
Example: Python
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
Audit Fees API
Company Subsidiaries
Outstanding Shares & Public Float

SEC Enforcement Actions
SEC Litigation Releases
SEC Administrative Proceedings
AAER Database API
SRO Filings Database

CIK, CUSIP, Ticker Mapping API
EDGAR Entities Database

Financial Statements

Analyze Form D Exempt Offerings using Python

Open In Colab   Download Notebook

On this page:
  • Quick Start
    • Download all Exempt Offerings from Form D
      • Loading the Form D Exempt Offerings
        • Exempt Offerings Over Time
          • Offerings by Year
            • Offerings by Quarter
              • Offerings by Month
              • Top 20 Largest Offerings by Amount Offered
                • Aggregated Annual Offering Amounts by Year
                • Types of Securities Offered
                  • Industry Groups
                    • Offerings per Industry Group over Time
                      • Types of Pooled Investment Funds
                      • Issuer Size: Revenue Range and Net Asset Values

                        This page provides a step-by-step guide on analyzing Form D exempt offerings using Python and the Form D API. Form D filings are submitted by companies that raise capital through private placements under Regulation D, allowing them to sell securities without full SEC registration.

                        What You Will Learn

                        • Use the Form D API to retrieve structured data from offerings filed with the SEC betbween 2008 and 2024.
                        • Understand offering trends over time by visualizing the number of offerings per year, quarter and month.
                        • Find the top 20 largest offerings by amount raised
                        • Determine the types of securities offered
                        • And more...

                        Quick Start

                        The example demonstrates how to retrieve Form D exempt offerings using the .get_data(search_params) method of the FormDApi class from the sec-api Python package. The script queries the database for offerings with a total offering amount of $1,000,000 or more, sorts them by the most recent filings, and returns the 10 most recent results.

                        !pip install sec-api
                        import json
                        from sec_api import FormDApi

                        formDApi = FormDApi("YOUR_API_KEY")

                        search_params = {
                            "query": "offeringData.offeringSalesAmounts.totalOfferingAmount:[1000000 TO *]",
                            "from": "0", # starting position of the result set
                            "size": "10", # number of results to be returned. max: 50
                            "sort": [{"filedAt": {"order": "desc"}}],
                        }

                        response = formDApi.get_data(search_params)
                        offerings = response["offerings"]

                        print(json.dumps(offerings[0], indent=2))
                        {
                          "schemaVersion": "X0708",
                          "submissionType": "D",
                          "testOrLive": "LIVE",
                          "primaryIssuer": {
                            "cik": "0002057923",
                            "entityName": "U.S. Venture Partners Select Fund I-A, L.P.",
                            "issuerAddress": {
                              "street1": "1460 EL CAMINO REAL, SUITE 100",
                              "city": "MENLO PARK",
                              "stateOrCountry": "CA",
                              "stateOrCountryDescription": "CALIFORNIA",
                              "zipCode": "94025"
                            },
                            "issuerPhoneNumber": "650-854-9080",
                            "jurisdictionOfInc": "DELAWARE",
                            "issuerPreviousNameList": [
                              {
                                "value": "None"
                              }
                            ],
                            "edgarPreviousNameList": [
                              {
                                "value": "None"
                              }
                            ],
                            "entityType": "Limited Partnership",
                            "yearOfInc": {
                              "withinFiveYears": true,
                              "value": "2025"
                            }
                          },
                          "relatedPersonsList": {
                            "relatedPersonInfo": [
                              {
                                "relatedPersonName": {
                                  "firstName": "Richard",
                                  "middleName": "W",
                                  "lastName": "Lewis"
                                },
                                "relatedPersonAddress": {
                                  "street1": "1460 El Camino Real, Suite 100",
                                  "city": "Menlo Park",
                                  "stateOrCountry": "CA",
                                  "stateOrCountryDescription": "CALIFORNIA",
                                  "zipCode": "94025"
                                },
                                "relatedPersonRelationshipList": {
                                  "relationship": [
                                    "Executive Officer"
                                  ]
                                },
                                "relationshipClarification": "Managing Member of the General Partner"
                              },
                              {
                                "relatedPersonName": {
                                  "firstName": "Jonathan",
                                  "middleName": "D",
                                  "lastName": "Root"
                                },
                                "relatedPersonAddress": {
                                  "street1": "1460 El Camino Real, Suite 100",
                                  "city": "Menlo Park",
                                  "stateOrCountry": "CA",
                                  "stateOrCountryDescription": "CALIFORNIA",
                                  "zipCode": "94025"
                                },
                                "relatedPersonRelationshipList": {
                                  "relationship": [
                                    "Executive Officer"
                                  ]
                                },
                                "relationshipClarification": "Managing Member of the General Partner"
                              },
                              {
                                "relatedPersonName": {
                                  "firstName": "Casey",
                                  "lastName": "Tansey"
                                },
                                "relatedPersonAddress": {
                                  "street1": "1460 El Camino Real, Suite 100",
                                  "city": "Menlo Park",
                                  "stateOrCountry": "CA",
                                  "stateOrCountryDescription": "CALIFORNIA",
                                  "zipCode": "94025"
                                },
                                "relatedPersonRelationshipList": {
                                  "relationship": [
                                    "Executive Officer"
                                  ]
                                },
                                "relationshipClarification": "Managing Member of the General Partner"
                              },
                              {
                                "relatedPersonName": {
                                  "firstName": "Dafina",
                                  "lastName": "Toncheva"
                                },
                                "relatedPersonAddress": {
                                  "street1": "1460 El Camino Real, Suite 100",
                                  "city": "Menlo Park",
                                  "stateOrCountry": "CA",
                                  "stateOrCountryDescription": "CALIFORNIA",
                                  "zipCode": "94025"
                                },
                                "relatedPersonRelationshipList": {
                                  "relationship": [
                                    "Executive Officer"
                                  ]
                                },
                                "relationshipClarification": "Managing Member of the General Partner"
                              }
                            ]
                          },
                          "offeringData": {
                            "industryGroup": {
                              "industryGroupType": "Pooled Investment Fund",
                              "investmentFundInfo": {
                                "investmentFundType": "Venture Capital Fund",
                                "is40Act": false
                              }
                            },
                            "issuerSize": {
                              "revenueRange": "Not Applicable"
                            },
                            "federalExemptionsExclusions": {
                              "item": [
                                "06b",
                                "3C",
                                "3C.1"
                              ]
                            },
                            "typeOfFiling": {
                              "newOrAmendment": {
                                "isAmendment": false
                              },
                              "dateOfFirstSale": {
                                "yetToOccur": true
                              }
                            },
                            "durationOfOffering": {
                              "moreThanOneYear": false
                            },
                            "typesOfSecuritiesOffered": {
                              "isPooledInvestmentFundType": true
                            },
                            "businessCombinationTransaction": {
                              "isBusinessCombinationTransaction": false
                            },
                            "minimumInvestmentAccepted": 0,
                            "salesCompensationList": {},
                            "offeringSalesAmounts": {
                              "totalOfferingAmount": 10000000,
                              "totalAmountSold": 0,
                              "totalRemaining": 10000000
                            },
                            "investors": {
                              "hasNonAccreditedInvestors": false,
                              "totalNumberAlreadyInvested": 0
                            },
                            "salesCommissionsFindersFees": {
                              "salesCommissions": {
                                "dollarAmount": 0
                              },
                              "findersFees": {
                                "dollarAmount": 0
                              }
                            },
                            "useOfProceeds": {
                              "grossProceedsUsed": {
                                "dollarAmount": 0
                              }
                            },
                            "signatureBlock": {
                              "authorizedRepresentative": false,
                              "signature": [
                                {
                                  "issuerName": "U.S. Venture Partners Select Fund I-A, L.P.",
                                  "signatureName": "/s/ Dale Holladay",
                                  "nameOfSigner": "Dale Holladay",
                                  "signatureTitle": "Chief Financial Officer",
                                  "signatureDate": "2025-02-25"
                                }
                              ]
                            }
                          },
                          "accessionNo": "0002057923-25-000001",
                          "filedAt": "2025-02-25T17:26:03-05:00",
                          "id": "32055cb99476602d44b381101ebf9fa1"
                        }

                        Download all Exempt Offerings from Form D

                        Downloading the complete Form D exempt offerings dataset may take up to 20 minutes and requires approximately 2.6GB of disk space. The final dataset includes over 600,000 records spanning from 2008 to 2024 and is saved in JSONL format as form-d-dataset.jsonl.

                        import os
                        import random
                        import sys
                        import time
                        from concurrent.futures import ThreadPoolExecutor

                        YEARS = range(2024, 2007, -1) # from 2024 to 2008
                        TEMP_FILE_TEMPLATE = "./temp_file_form_d_{}.jsonl"
                        TARGET_FILE = "./form-d-dataset.jsonl"


                        def process_year(year):
                            backoff_time = random.randint(10, 800) / 1000
                            print(f"Starting year {year} with backoff time {backoff_time:,}s")
                            sys.stdout.flush()
                            time.sleep(backoff_time)

                            tmp_filename = TEMP_FILE_TEMPLATE.format(year)
                            tmp_file = open(tmp_filename, "w")

                            for month in range(12, 0, -1):
                                search_from = 0
                                month_counter = 0

                                while True:
                                    query = f"filedAt:[{year}-{month:02d}-01 TO {year}-{month:02d}-31]"
                                    search_params = {
                                        "query": query,
                                        "from": search_from,
                                        "size": "50",
                                        "sort": [{"filedAt": {"order": "desc"}}],
                                    }

                                    response = None
                                    try:
                                        response = formDApi.get_data(search_params)
                                    except Exception as e:
                                        print(f"{year}-{month:02d} error: {e}. Retrying...")
                                        sys.stdout.flush()
                                        continue

                                    if response == None or len(response["offerings"]) == 0:
                                        break

                                    if response["total"]["value"] >= 10000:
                                        print(
                                            f"WARNING: {year}-{month:02d} has more than 10,000 Form D filings."
                                        )
                                        sys.stdout.flush()

                                    search_from += 50
                                    month_counter += len(response["offerings"])
                                    jsonl_data = "\n".join(
                                        [json.dumps(entry) for entry in response["offerings"]]
                                    )
                                    tmp_file.write(jsonl_data + "\n")

                                print(f"Finished loading {month_counter} Form D for {year}-{month:02d}")
                                sys.stdout.flush()

                            tmp_file.close()

                            return year


                        if not os.path.exists(TARGET_FILE):
                            with ThreadPoolExecutor(max_workers=4) as pool:
                                processed_years = list(pool.map(process_year, YEARS))
                            print("Finished processing all years.", processed_years)

                            # merge the temporary files into one final file
                            with open(TARGET_FILE, "a") as outfile:
                                for year in YEARS:
                                    temp_file = TEMP_FILE_TEMPLATE.format(year)
                                    if os.path.exists(temp_file):
                                        with open(temp_file, "r") as infile:
                                            outfile.write(infile.read())
                        else:
                            print("File already exists. Skipping download.")
                        File already exists. Skipping download.

                        Loading the Form D Exempt Offerings

                        import pandas as pd
                        import numpy as np
                        def process_chunk(df_chunk):
                            return pd.json_normalize(df_chunk.to_dict(orient="records"))


                        df_chunks = [
                            process_chunk(chunk)
                            for chunk in pd.read_json(TARGET_FILE, lines=True, chunksize=100000)
                        ]

                        structured_data = pd.concat(df_chunks, ignore_index=True)

                        print(structured_data.shape)
                        (673962, 71)
                        structured_data["filedAt"] = pd.to_datetime(structured_data["filedAt"], utc=True)
                        structured_data["filedAt"] = structured_data["filedAt"].dt.tz_convert("US/Eastern")
                        structured_data = structured_data.sort_values("filedAt", ascending=True).reset_index(
                            drop=True
                        )
                        structured_data["year"] = structured_data["filedAt"].dt.year
                        structured_data["month"] = structured_data["filedAt"].dt.month
                        structured_data["qtr"] = structured_data["month"].apply(lambda x: (x - 1) // 3 + 1)
                        structured_data["dayOfWeek"] = structured_data["filedAt"].dt.day_name()
                        # filedAtClass: preMarket (4:00AM-9:30AM), regularMarket (9:30AM-4:00PM), afterMarket (4:00PM-8:00PM)
                        structured_data["filedAtClass"] = structured_data["filedAt"].apply(
                            lambda x: (
                                "preMarket"
                                if x.hour < 9 or (x.hour == 9 and x.minute < 30)
                                else (
                                    "regularMarket"
                                    if x.hour < 16
                                    else "afterMarket" if x.hour < 20 else "other"
                                )
                            )
                        )

                        structured_data.head()
                        Out[6]:
                        schemaVersionsubmissionTypetestOrLiveaccessionNofiledAtidissuerListprimaryIssuer.cikprimaryIssuer.entityNameprimaryIssuer.issuerAddress.street1...offeringData.typesOfSecuritiesOffered.isMineralPropertyTypeprimaryIssuer.yearOfInc.yetToBeFormedofferingData.salesCompensationList.over100RecipientFlagrelatedPersonsList.over100PersonsFlagissuerList.over100IssuerFlagyearmonthqtrdayOfWeekfiledAtClass
                        0X0101DLIVE0001445388-08-0000012008-09-17 10:14:41-04:00fe0a1228846ceb5480b82521df779de7NaN0001445388Cause Global Impact Fund, LP1266 EAST MAIN STREET...NaNNaNNaNNaNNaN200893WednesdayregularMarket
                        1X0101DLIVE0001348938-08-0000032008-09-18 17:57:02-04:0043e701d16ff1097e33db9a31a3f7218dNaN0001348938Living Independently Group, Inc.767 THIRD AVE...NaNNaNNaNNaNNaN200893ThursdayafterMarket
                        2X0101DLIVE0001445444-08-0000012008-09-19 13:18:32-04:002ead4c7e5bc390b8dae552ae6b832c30NaN0001445444new york atv - sportsman club llc240 WILLOW DRIVE...NaNNaNNaNNaNNaN200893FridayregularMarket
                        3X0101DLIVE0001354488-08-0016362008-09-19 18:21:59-04:00b3d0f624fc2992121605e7ed54fd0c17NaN0001445579Fox Life Settlements 2008-F, LLC2129 N. JOSEY LANE...NaNNaNNaNNaNNaN200893FridayafterMarket
                        4X0101DLIVE0001445773-08-0000022008-09-22 17:15:22-04:00fe1f4adb26cf65f5e059d2f4e6c70bdbNaN0001445773Viking Financial Services Corp4 NICKERSON STREET...NaNNaNNaNNaNNaN200893MondayafterMarket

                        5 rows × 76 columns

                        print(structured_data.info())
                        <class 'pandas.core.frame.DataFrame'>
                        RangeIndex: 673962 entries, 0 to 673961
                        Data columns (total 76 columns):
                         # Column Non-Null Count Dtype
                        --- ------ -------------- -----
                         0 schemaVersion 673962 non-null object
                         1 submissionType 673962 non-null object
                         2 testOrLive 673962 non-null object
                         3 accessionNo 673962 non-null object
                         4 filedAt 673962 non-null datetime64[ns, US/Eastern]
                         5 id 673962 non-null object
                         6 issuerList 0 non-null float64
                         7 primaryIssuer.cik 673962 non-null object
                         8 primaryIssuer.entityName 673962 non-null object
                         9 primaryIssuer.issuerAddress.street1 673962 non-null object
                         10 primaryIssuer.issuerAddress.city 673962 non-null object
                         11 primaryIssuer.issuerAddress.stateOrCountry 673958 non-null object
                         12 primaryIssuer.issuerAddress.stateOrCountryDescription 641363 non-null object
                         13 primaryIssuer.issuerAddress.zipCode 673836 non-null object
                         14 primaryIssuer.issuerPhoneNumber 673953 non-null object
                         15 primaryIssuer.jurisdictionOfInc 673260 non-null object
                         16 primaryIssuer.issuerPreviousNameList 612987 non-null object
                         17 primaryIssuer.edgarPreviousNameList 658658 non-null object
                         18 primaryIssuer.entityType 673962 non-null object
                         19 primaryIssuer.yearOfInc.overFiveYears 185008 non-null object
                         20 relatedPersonsList.relatedPersonInfo 673962 non-null object
                         21 offeringData.industryGroup.industryGroupType 673962 non-null object
                         22 offeringData.issuerSize.revenueRange 433179 non-null object
                         23 offeringData.federalExemptionsExclusions.item 673962 non-null object
                         24 offeringData.typeOfFiling.newOrAmendment.isAmendment 673962 non-null bool
                         25 offeringData.typeOfFiling.dateOfFirstSale.value 579646 non-null object
                         26 offeringData.durationOfOffering.moreThanOneYear 673962 non-null bool
                         27 offeringData.typesOfSecuritiesOffered.isDebtType 52078 non-null object
                         28 offeringData.typesOfSecuritiesOffered.isOptionToAcquireType 45443 non-null object
                         29 offeringData.typesOfSecuritiesOffered.isOtherType 73755 non-null object
                         30 offeringData.typesOfSecuritiesOffered.descriptionOfOtherType 73755 non-null object
                         31 offeringData.businessCombinationTransaction.isBusinessCombinationTransaction 673962 non-null bool
                         32 offeringData.minimumInvestmentAccepted 673962 non-null int64
                         33 offeringData.offeringSalesAmounts.totalOfferingAmount 673962 non-null int64
                         34 offeringData.offeringSalesAmounts.totalAmountSold 673962 non-null int64
                         35 offeringData.offeringSalesAmounts.totalRemaining 673962 non-null int64
                         36 offeringData.investors.hasNonAccreditedInvestors 673962 non-null bool
                         37 offeringData.investors.totalNumberAlreadyInvested 673962 non-null int64
                         38 offeringData.salesCommissionsFindersFees.salesCommissions.dollarAmount 673962 non-null int64
                         39 offeringData.salesCommissionsFindersFees.findersFees.dollarAmount 673962 non-null int64
                         40 offeringData.useOfProceeds.grossProceedsUsed.dollarAmount 673962 non-null int64
                         41 offeringData.useOfProceeds.grossProceedsUsed.isEstimate 173076 non-null object
                         42 offeringData.signatureBlock.authorizedRepresentative 663003 non-null object
                         43 offeringData.signatureBlock.signature 673962 non-null object
                         44 primaryIssuer.issuerAddress.street2 362271 non-null object
                         45 offeringData.typeOfFiling.dateOfFirstSale.yetToOccur 94271 non-null object
                         46 offeringData.typesOfSecuritiesOffered.isEquityType 351392 non-null object
                         47 primaryIssuer.yearOfInc.withinFiveYears 487041 non-null object
                         48 primaryIssuer.yearOfInc.value 487046 non-null object
                         49 offeringData.typesOfSecuritiesOffered.isSecurityToBeAcquiredType 33004 non-null object
                         50 offeringData.industryGroup.investmentFundInfo.investmentFundType 352185 non-null object
                         51 offeringData.industryGroup.investmentFundInfo.is40Act 352185 non-null object
                         52 offeringData.typeOfFiling.newOrAmendment.previousAccessionNumber 261449 non-null object
                         53 offeringData.typesOfSecuritiesOffered.isPooledInvestmentFundType 357613 non-null object
                         54 offeringData.useOfProceeds.clarificationOfResponse 218401 non-null object
                         55 offeringData.investors.numberNonAccreditedInvestors 50701 non-null float64
                         56 offeringData.issuerSize.aggregateNetAssetValueRange 240783 non-null object
                         57 offeringData.salesCompensationList.recipient 151729 non-null object
                         58 offeringData.offeringSalesAmounts.clarificationOfResponse 90326 non-null object
                         59 primaryIssuer.entityTypeOtherDesc 68545 non-null object
                         60 offeringData.salesCommissionsFindersFees.salesCommissions.isEstimate 101935 non-null object
                         61 issuerList.issuer 6073 non-null object
                         62 offeringData.salesCommissionsFindersFees.clarificationOfResponse 71985 non-null object
                         63 offeringData.salesCommissionsFindersFees.findersFees.isEstimate 64687 non-null object
                         64 offeringData.typesOfSecuritiesOffered.isTenantInCommonType 775 non-null object
                         65 offeringData.businessCombinationTransaction.clarificationOfResponse 7761 non-null object
                         66 offeringData.typesOfSecuritiesOffered.isMineralPropertyType 1742 non-null object
                         67 primaryIssuer.yearOfInc.yetToBeFormed 1913 non-null object
                         68 offeringData.salesCompensationList.over100RecipientFlag 91 non-null object
                         69 relatedPersonsList.over100PersonsFlag 1 non-null object
                         70 issuerList.over100IssuerFlag 1 non-null object
                         71 year 673962 non-null int32
                         72 month 673962 non-null int32
                         73 qtr 673962 non-null int64
                         74 dayOfWeek 673962 non-null object
                         75 filedAtClass 673962 non-null object
                        dtypes: bool(4), datetime64[ns, US/Eastern](1), float64(2), int32(2), int64(9), object(58)
                        memory usage: 367.6+ MB
                        None
                        unique_years = structured_data["year"].nunique()
                        unique_issuers = structured_data["primaryIssuer.cik"].nunique()
                        unique_filings = structured_data["accessionNo"].nunique()
                        min_year = structured_data["year"].min()
                        max_year = structured_data["year"].max()
                        max_year_full = max_year # to avoid incomplete data for the current year
                        print("Loaded Form D filings")
                        print(f"Number of filings: {unique_filings:,}")
                        print(f"Number of years: {unique_years:,} ({min_year}-{max_year})")
                        print(f"Number of unique issuers: {unique_issuers:,}")
                        Loaded Form D filings
                        Number of filings: 673,962
                        Number of years: 17 (2008-2024)
                        Number of unique issuers: 312,008

                        Exempt Offerings Over Time

                        import matplotlib.pyplot as plt
                        import matplotlib.style as style
                        import matplotlib.ticker as mtick
                        import seaborn as sns

                        style.use("default")

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

                        plt.rcParams.update(params)
                        submissionTypeCount = structured_data["submissionType"].value_counts().to_frame()
                        submissionTypeCount.columns = ["count"]
                        submissionTypeCount["pct"] = (
                            submissionTypeCount["count"] / submissionTypeCount["count"].sum() * 100
                        )
                        submissionTypeCount["pct"] = submissionTypeCount["pct"].round(1)
                        submissionTypeCount
                        Out[10]:
                        countpct
                        submissionType
                        D41251361.2
                        D/A26144938.8

                        Offerings by Year

                        form_d = structured_data[structured_data["submissionType"] == "D"]
                        form_d_a = structured_data[structured_data["submissionType"] == "D/A"]

                        counts_d = form_d.groupby(["year"]).size().to_frame(name="count")
                        counts_d_a = form_d_a.groupby(["year"]).size().to_frame(name="count")

                        print(f"Form D counts from {min_year} to {max_year_full}.")
                        counts_d.T
                        Form D counts from 2008 to 2024.
                        Out[11]:
                        year20082009201020112012201320142015201620172018201920202021202220232024
                        count37913770175861817018190198412219423030230972458927272275022814742506416713186832701
                        def plot_timeseries(ts, title):
                            fig, ax = plt.subplots(figsize=(4, 2.5))
                            ts["count"].plot(ax=ax, legend=False)
                            ax.set_title(title)
                            ax.set_xlabel("Year")
                            ax.set_ylabel("Number of\nForm D Filings")
                            ax.set_xticks(np.arange(min_year, max_year_full + 1, 1))
                            ax.yaxis.set_major_formatter(mtick.StrMethodFormatter("{x:,.0f}"))
                            ax.set_xlim(min_year - 1, max_year_full + 1)
                            ax.grid(axis="x")
                            ax.set_axisbelow(True)
                            plt.xticks(rotation=90)

                            for year in range(min_year, max_year_full + 1, 1):
                                year_y_max = ts.loc[year, "count"]
                                ax.vlines(year, 0, year_y_max, linestyles=":", colors="grey", alpha=0.5, lw=1)

                            plt.tight_layout()
                            plt.show()


                        plot_timeseries(
                            counts_d,
                            title=f"Form D Disclosures per Year ({min_year} - {max_year_full})",
                        )
                        plot_timeseries(
                            counts_d_a,
                            title=f"Form D/A Disclosures per Year ({min_year} - {max_year_full})",
                        )

                        Offerings by Quarter

                        counts_qtr_yr_piv = (form_d.groupby(["year", "qtr"]).size().unstack().fillna(0)).astype(
                            int
                        )

                        print(f"Form D counts by quarter from {min_year} to {max_year_full}.")
                        counts_qtr_yr_piv.T
                        Form D counts by quarter from 2008 to 2024.
                        Out[14]:
                        year20082009201020112012201320142015201620172018201920202021202220232024
                        qtr
                        1015474649484849705031554657866107640569926761721893031246583207924
                        20388644034460457245685504578057576047680370255958105131076480958248
                        33641264104450642384942543556795448583465876889677610498955877358027
                        434342114430435644105300570957855785630368906827819512192888477188502
                        plt.figure(figsize=(6, 2))
                        sns.heatmap(
                            counts_qtr_yr_piv.T,
                            annot=True,
                            fmt="d",
                            cmap="magma",
                            cbar_kws={"label": "Count"},
                            mask=counts_qtr_yr_piv.T == 0,
                            cbar=False,
                            annot_kws={"fontsize": 6},
                        )
                        plt.grid(False)
                        plt.title(f"Form D Counts by Quarter ({min_year} - {max_year_full})")
                        plt.xlabel("Year")
                        plt.ylabel("Quarter")
                        plt.tight_layout()
                        plt.show()
                        counts_qtr_yr = counts_qtr_yr_piv.stack().reset_index(name="count")

                        fig, ax = plt.subplots(figsize=(6, 2.5))
                        counts_qtr_yr_piv.plot(kind="bar", ax=ax, legend=True)
                        ax.legend(title="Quarter", loc="upper right", bbox_to_anchor=(1.15, 1))
                        ax.set_title(f"Number of Form D Disclosures per Quarter\n({min_year}-{max_year_full})")
                        ax.set_xlabel("Year")
                        ax.set_ylabel("Number of\nForm D Filings")
                        ax.yaxis.set_major_formatter(mtick.StrMethodFormatter("{x:,.0f}"))
                        ax.grid(axis="x")
                        ax.set_axisbelow(True)
                        plt.tight_layout()
                        plt.show()

                        Offerings by Month

                        counts_month_yr_piv = (
                            form_d.groupby(["year", "month"]).size().unstack().fillna(0)
                        ).astype(int)

                        print(
                            f"Descriptive statistics for Form D counts by month from 2009 to {max_year_full}."
                        )
                        month_stats = (
                            counts_month_yr_piv.loc[2009:]
                            .describe(percentiles=[0.025, 0.975])
                            .round(0)
                            .astype(int)
                        )
                        month_stats
                        Descriptive statistics for Form D counts by month from 2009 to 2024.
                        Out[17]:
                        month123456789101112
                        count161616161616161616161616
                        mean226418732355218021002119218921291956220720052381
                        std839754857766702647649669611706632814
                        min1742181155134612311309145912891246138412981481
                        2.5%7236171349138012661370146613271249138813221499
                        50%217018462220194618782049203620031812203019502207
                        97.5%367633474274382234953480348634443216359033564052
                        max410636664693397736243670356234823454397336854534
                        fig, ax = plt.subplots(figsize=(3.5, 3))

                        counts_month_yr_piv.loc[2009:].boxplot(
                            ax=ax,
                            grid=False,
                            showfliers=False,
                            flierprops=dict(marker="o", markersize=3),
                            patch_artist=True,
                            boxprops=dict(facecolor="white", color="tab:blue"),
                            showmeans=True,
                            meanline=True,
                            meanprops={"color": "tab:blue", "linestyle": ":"},
                            medianprops={"color": "black"},
                            capprops={"color": "none"},
                        )

                        ax.set_title(f"Form D Filings by Month\n({min_year} - {max_year_full})")
                        ax.set_xlabel("")
                        ax.set_ylabel("Form D Count")
                        xticklabels = [pd.to_datetime(str(x), format="%m").strftime("%b") for x in range(1, 13)]
                        ax.set_xticklabels(xticklabels)
                        plt.xticks(rotation=45)
                        plt.tight_layout()
                        plt.show()
                        counts_month_yr_piv_d_a = (
                            form_d_a.groupby(["year", "month"]).size().unstack().fillna(0)
                        ).astype(int)

                        print(
                            f"Descriptive statistics for Form D/A counts by month from 2009 to {max_year_full}."
                        )
                        month_stats = (
                            counts_month_yr_piv_d_a.loc[2009:]
                            .describe(percentiles=[0.025, 0.975])
                            .round(0)
                            .astype(int)
                        )
                        month_stats
                        Descriptive statistics for Form D/A counts by month from 2009 to 2024.
                        Out[19]:
                        month123456789101112
                        count161616161616161616161616
                        mean149514532580140412081200129011131101126410341194
                        std542404533423399411392366328354306401
                        min441722028510449413642487492546467495
                        2.5%2845632057627502498681544533604527546
                        50%168015022409142412341298133811611183128010601212
                        97.5%206519233750204118361797183517711556174914491788
                        max208819883942208618841830189918361580184214841866
                        fig, ax = plt.subplots(figsize=(3.5, 3))

                        counts_month_yr_piv_d_a.loc[2009:].boxplot(
                            ax=ax,
                            grid=False,
                            showfliers=False,
                            flierprops=dict(marker="o", markersize=3),
                            patch_artist=True,
                            boxprops=dict(facecolor="white", color="tab:blue"),
                            showmeans=True,
                            meanline=True,
                            meanprops={"color": "tab:blue", "linestyle": ":"},
                            medianprops={"color": "black"},
                            capprops={"color": "none"},
                        )

                        ax.set_title(f"Form D/A Filings by Month\n({min_year} - {max_year_full})")
                        ax.set_xlabel("")
                        ax.set_ylabel("Form D/A Count")
                        xticklabels = [pd.to_datetime(str(x), format="%m").strftime("%b") for x in range(1, 13)]
                        ax.set_xticklabels(xticklabels)
                        plt.xticks(rotation=45)
                        plt.tight_layout()
                        plt.show()

                        Top 20 Largest Offerings by Amount Offered

                        pd.options.display.float_format = "{:,.0f}".format

                        col = "offeringData.offeringSalesAmounts.totalOfferingAmount"

                        top_20 = (
                            form_d.sort_values(by=col, ascending=False)
                            .head(20)
                            .sort_values(by=col, ascending=True)
                            .reset_index(drop=True)
                        )
                        top_20["year"] = top_20["filedAt"].dt.year
                        # cut names to 50 characters
                        top_20["primaryIssuer.entityName"] = top_20["primaryIssuer.entityName"].str.slice(0, 50)

                        years = top_20["filedAt"].dt.year.to_list()

                        top_20.plot(
                            kind="barh",
                            x="primaryIssuer.entityName",
                            y=col,
                            figsize=(6, 3.5),
                        )

                        ax = plt.gca()
                        for p, year in zip(ax.patches, years):
                            ax.annotate(
                                year,
                                (p.get_x() + p.get_width(), p.get_y()),
                                xytext=(0, 0),
                                textcoords="offset points",
                                fontsize=7,
                            )

                        ax.xaxis.set_major_formatter(
                            mtick.FuncFormatter(lambda x, p: format(int(x) / 1000000000, ",.0f"))
                        )
                        ax.grid(True)
                        ax.set_axisbelow(True)
                        ax.grid(color="gray", linestyle="dashed", alpha=0.3)
                        ax.spines["top"].set_visible(False)
                        ax.spines["right"].set_visible(False)
                        ax.yaxis.grid(False), ax.legend().remove()
                        plt.title(f"Top 20 Largest Exempt Offerings by Total Proceeds\n({min_year} - {max_year})")
                        plt.xlabel("Total Proceeds (USD, in billions)")
                        plt.ylabel("")
                        plt.tight_layout()
                        plt.show()
                        print(f"Top 20 Largest Offerings by Total Offering Amounts (in $ billions, {min_year} - {max_year})")
                        top_20["offeringAmount"] = top_20[col] / 1_000_000_000
                        top_20[["primaryIssuer.entityName", "offeringAmount", "year"]].sort_values(
                            by="offeringAmount", ascending=False
                        ).reset_index(drop=True)
                        Top 20 Largest Offerings by Total Offering Amounts (in $ billions, 2008 - 2024)
                        Out[22]:
                        primaryIssuer.entityNameofferingAmountyear
                        01B USD WORLDWIDE VENTURE CAPITAL FUND1,0002017
                        1Royal Bank of Amexem Trust9992021
                        2Grace & Trust S.a.r.l.9502018
                        3Curtis Gregory Smith Junior ACH Thrift Fund 05...9002021
                        4JAAME AMUN RE EL9002011
                        5Shaykamaxum Republic Tribal Government9002021
                        6Crusade of Connor Stephens, LLC6402018
                        7Reginald Cupid Noble ACH Investment Thrift Fun...5412021
                        8MEL FREE EL5002016
                        9JOHN ADAMS SMART EL5002016
                        10PERI AL HEDRO CARTA DEY5002015
                        11One World Bancorp, Inc.5002022
                        12HELENE HOLLOMAN CHIN EL5002016
                        13One World Bancorp, Inc.5002024
                        14ESTATE OF HAZINE CHERMON CHERY4002018
                        15BYRON DEVON LYNCH IV ESTATE4002020
                        16Mcclain Zachary Christian4002022
                        17ZACHARY CHRISTIAN MCCLAIN4002024
                        18T&B Imports International Inc2002021
                        19National Investment & Infrastructure Fund1602021

                        Aggregated Annual Offering Amounts by Year

                        total = form_d[["year", col]].copy()
                        total.fillna(0, inplace=True)
                        total = total.apply(pd.to_numeric, errors="coerce").fillna(0)
                        total
                        Out[23]:
                        yearofferingData.offeringSalesAmounts.totalOfferingAmount
                        02008300000000
                        1200811498347
                        22008500000
                        320083300000
                        4200810000000
                        .........
                        673956202426000
                        6739582024-1
                        67395920242500000
                        67396020242000000
                        67396120245000000

                        412513 rows × 2 columns

                        total_by_year = total.groupby("year").sum()
                        total_by_year.plot(kind="bar", figsize=(4, 3))
                        plt.title(f"Annual Form D Offering Amounts per Year\n({min_year} - {max_year})")
                        plt.ylabel("Offering Amount\n(USD, in billions)"); plt.xlabel("")
                        ax = plt.gca()
                        ax.yaxis.set_major_formatter(mtick.FuncFormatter(lambda x, p: format(int(x) / 1000000000, ",.0f")))
                        ax.get_legend().remove(), ax.grid(), ax.set_axisbelow(True)
                        ax.grid(True); ax.set_axisbelow(True); ax.grid(color="gray", linestyle="dashed", alpha=0.3)
                        ax.spines["top"].set_visible(False); ax.spines["right"].set_visible(False); ax.xaxis.grid(False)
                        plt.setp(ax.get_xticklabels(), fontsize=7); plt.tight_layout(); plt.show()

                        Types of Securities Offered

                        typesOfSecuritiesOfferedCols = [col for col in form_d.columns if "typesOfSecuritiesOffered" in col]
                        typesOfSecuritiesOfferedCols.remove("offeringData.typesOfSecuritiesOffered.descriptionOfOtherType")
                        typesOfSecuritiesOffered = form_d[["year", *typesOfSecuritiesOfferedCols]]
                        typesOfSecuritiesOffered = typesOfSecuritiesOffered.groupby("year").count()
                        typesOfSecuritiesOffered.columns = [col.split(".")[-1] for col in typesOfSecuritiesOffered.columns]

                        print("Types of Securities Offered by Year")
                        typesOfSecuritiesOffered
                        Types of Securities Offered by Year
                        Out[25]:
                        isDebtTypeisOptionToAcquireTypeisOtherTypeisEquityTypeisSecurityToBeAcquiredTypeisPooledInvestmentFundTypeisTenantInCommonTypeisMineralPropertyType
                        year
                        2008515046239256433
                        200918481936179886321092317433119
                        2010222625102167116161527403422152
                        2011229923492298122111522422751149
                        2012237722172267120761530446131146
                        2013267121602203128901522527227134
                        2014302123142314145551667592428175
                        201531262258245414796158666534482
                        201629722260224014966168968675836
                        201728012348248116130172777423744
                        201829872358304417119180092854460
                        201929752390273317425190895163760
                        2020272124152821166981945115644542
                        2021285626313612226162005212945742
                        2022238023273611214791781213424665
                        2023215822403039178651621151222452
                        2024199022113022180351662163663257
                        fig, ax = plt.subplots(figsize=(6, 3))

                        typesOfSecuritiesOffered.loc[2009:].plot(kind="bar", stacked=True, ax=ax)

                        ax.set_title("Offerings by Type of Security")
                        ax.set_xlabel("Year")
                        ax.set_ylabel("Number of Offerings")
                        ax.yaxis.set_major_formatter(mtick.StrMethodFormatter("{x:,.0f}"))
                        ax.grid(axis="x")
                        ax.set_axisbelow(True)
                        ax.legend(title="Type of Security", bbox_to_anchor=(1.02, 1))
                        plt.xticks(rotation=90)
                        plt.tight_layout()
                        plt.show()

                        Industry Groups

                        industryGroupType = form_d["offeringData.industryGroup.industryGroupType"].value_counts().to_frame()
                        industryGroupType.index.name = "industryGroupType"
                        industryGroupType["count"] = industryGroupType["count"].apply(lambda x: f"{x:,}")
                        industryGroupType
                        Out[72]:
                        count
                        industryGroupType
                        Pooled Investment Fund149,718
                        Other57,952
                        Other Technology56,359
                        Commercial19,627
                        Other Health Care15,923
                        Other Real Estate14,889
                        Residential12,196
                        Biotechnology11,133
                        REITS and Finance8,839
                        Investing8,283
                        Oil and Gas7,906
                        Manufacturing6,325
                        Other Banking and Financial Services6,160
                        Retailing4,529
                        Other Energy4,308
                        Pharmaceuticals4,004
                        Business Services3,546
                        Restaurants3,128
                        Computers2,990
                        Commercial Banking2,629
                        Insurance2,575
                        Telecommunications2,111
                        Agriculture1,961
                        Hospitals and Physicians1,027
                        Construction995
                        Lodging and Conventions591
                        Energy Conservation590
                        Environmental Services516
                        Other Travel375
                        Investment Banking353
                        Tourism and Travel Services293
                        Electric Utilities258
                        Health Insurance169
                        Coal Mining132
                        Airlines and Airports123

                        Offerings per Industry Group over Time

                        topIndustryGroupTypes = industryGroupType.head(10).index.to_list()
                        topIndustryGroupTypes.remove("Other")

                        # create piv table for industry group type, year, and count
                        form_d_top_10_others = form_d.copy()
                        form_d_top_10_others.loc[
                            ~form_d_top_10_others["offeringData.industryGroup.industryGroupType"].isin(
                                topIndustryGroupTypes
                            ),
                            "offeringData.industryGroup.industryGroupType",
                        ] = "Other"
                        industryGroupTypePiv = (
                            form_d_top_10_others.groupby(
                                ["offeringData.industryGroup.industryGroupType", "year"]
                            )
                            .size()
                            .unstack()
                            .fillna(0)
                        )
                        industryGroupTypePiv.index.name = "industryGroupType"
                        industryGroupTypePiv["total"] = industryGroupTypePiv.sum(axis=1)
                        industryGroupTypePiv = industryGroupTypePiv.reindex(
                            index=topIndustryGroupTypes + ["Other"]
                        )

                        print("Offerings by Top 10 Industry Groups per Year")
                        industryGroupTypePiv.apply(lambda x: x.apply(lambda y: f"{y:,}"), axis=1)
                        Offerings by Top 10 Industry Groups per Year
                        Out[109]:
                        year20082009201020112012201320142015201620172018201920202021202220232024total
                        industryGroupType
                        Pooled Investment Fund683,4074,1824,3044,4555,2325,8446,4536,6217,4879,1029,41311,35520,93020,67314,50015,692149,718
                        Other Technology571,9992,5792,9252,9923,2103,6823,8763,7783,7494,1403,8793,6184,7414,2603,5883,28656,359
                        Commercial142794294985636947961,0381,2011,3781,4891,7371,5112,1282,3861,6601,82619,627
                        Other Health Care236969129209169261,0201,0681,0891,1061,0951,1391,0301,1859561,01183115,923
                        Other Real Estate163173904835476148118748429841,0941,2821,0951,4151,5211,1931,41114,889
                        Residential101912542843985175937498388308379838681,3931,4631,07491412,196
                        Biotechnology1153668763862260666171370674675072678382373472966211,133
                        REITS and Finance3931612113464035455086207676936317257189887746538,839
                        Investing113674764913944214824604584695075125727946735076898,283
                        Other1665,8857,5167,4166,9577,2187,7607,2916,9447,0737,5657,2006,5908,3798,0176,8326,737115,546
                        fig, ax = plt.subplots(figsize=(6, 3))

                        industryGroupTypePiv.T.loc[2009:2024, :].plot(kind="bar", stacked=True, ax=ax)

                        ax.set_title("Offerings by Industry Group Type")
                        ax.set_xlabel("Year")
                        ax.set_ylabel("Number of Offerings")
                        ax.yaxis.set_major_formatter(mtick.StrMethodFormatter("{x:,.0f}"))
                        ax.grid(axis="x")
                        ax.set_axisbelow(True)
                        handles, labels = ax.get_legend_handles_labels()
                        ax.legend(
                            reversed(handles),
                            reversed(labels),
                            title="Industry Group Type",
                            bbox_to_anchor=(1.02, 1),
                            labelspacing=0.15,
                        )
                        plt.xticks(rotation=90)
                        plt.tight_layout()
                        plt.show()

                        Types of Pooled Investment Funds

                        form_d_pooledInvestmentFunds = form_d[
                            form_d["offeringData.industryGroup.industryGroupType"] == "Pooled Investment Fund"
                        ]
                        pooledFundTypes = (
                            form_d_pooledInvestmentFunds[
                                "offeringData.industryGroup.investmentFundInfo.investmentFundType"
                            ]
                            .value_counts()
                            .to_frame()
                        )
                        pooledFundTypes["count"] = pooledFundTypes["count"].apply(lambda x: f"{x:,}")
                        pooledFundTypes.index.name = "Pooled Investment Fund Type"

                        print("Offerings per Type of Pooled Investment Fund (2008 - 2024)")
                        pooledFundTypes
                        Offerings per Type of Pooled Investment Fund (2008 - 2024)
                        Out[91]:
                        count
                        Pooled Investment Fund Type
                        Venture Capital Fund42,098
                        Other Investment Fund39,549
                        Private Equity Fund39,214
                        Hedge Fund28,857
                        pooledFundTypesPiv = (
                            form_d_pooledInvestmentFunds.groupby(
                                ["offeringData.industryGroup.investmentFundInfo.investmentFundType", "year"]
                            )
                            .size()
                            .unstack()
                            .fillna(0)
                        )
                        pooledFundTypesPiv.index.name = "Pooled Investment Fund Type"
                        pooledFundTypesPiv["total"] = pooledFundTypesPiv.sum(axis=1)
                        pooledFundTypesPiv = pooledFundTypesPiv.sort_values(by="total", ascending=False)

                        print("Offerings by Pooled Investment Fund Type per Year")
                        pooledFundTypesPiv.apply(lambda x: x.apply(lambda y: f"{y:,}"), axis=1)
                        Offerings by Pooled Investment Fund Type per Year
                        Out:
                        year20082009201020112012201320142015201620172018201920202021202220232024total
                        Pooled Investment Fund Type
                        Venture Capital Fund51312323283654746829368969251,2662,2523,3008,6319,2956,0036,37742,098
                        Other Investment Fund148039689741,0551,2571,6481,9872,0882,5413,1722,7223,2615,4585,0013,1973,40339,549
                        Private Equity Fund75278401,0341,0831,3901,5821,7061,9362,2562,7942,9483,1944,8274,7363,9224,43239,214
                        Hedge Fund421,9462,1421,9681,9522,1111,9321,8241,7011,7651,8701,4911,6002,0141,6411,3781,48028,857
                        fig, ax = plt.subplots(figsize=(4, 3))

                        pooledFundTypesPiv.T.loc[2009:2024, :].plot(kind="bar", stacked=True, ax=ax)

                        ax.set_title("Offerings by Type of Pooled Investment Fund")
                        ax.set_xlabel("Year")
                        ax.set_ylabel("Number of Offerings")
                        ax.yaxis.set_major_formatter(mtick.StrMethodFormatter("{x:,.0f}"))
                        ax.grid(axis="x")
                        ax.set_axisbelow(True)
                        handles, labels = ax.get_legend_handles_labels()
                        ax.legend(
                            reversed(handles),
                            reversed(labels),
                            title="Fund Type",
                            labelspacing=0.15,
                        )
                        plt.xticks(rotation=90)
                        plt.tight_layout()
                        plt.show()

                        Issuer Size: Revenue Range and Net Asset Values

                        revenueRange = form_d["offeringData.issuerSize.revenueRange"].value_counts().to_frame()
                        revenueRange["count"] = revenueRange["count"].apply(lambda x: f"{x:,}")
                        revenueRange.index.name = "Revenue Range"
                        print("Issuer Size by Revenue Range")
                        revenueRange
                        Issuer Size by Revenue Range
                        Out[28]:
                        count
                        Revenue Range
                        Decline to Disclose254,194
                        No Revenues39,942
                        1−1,000,00021,831
                        Not Applicable9,899
                        1,000,001−5,000,0008,643
                        5,000,001−25,000,0005,307
                        25,000,001−100,000,0002,228
                        Over $100,000,0002,063
                        netAssetRange = form_d["offeringData.issuerSize.aggregateNetAssetValueRange"].value_counts().to_frame()
                        netAssetRange["count"] = netAssetRange["count"].apply(lambda x: f"{x:,}")
                        netAssetRange.index.name = "Net Asset Range"
                        print("Issuer Size by Net Asset Range")
                        netAssetRange
                        Issuer Size by Net Asset Range
                        Out[29]:
                        count
                        Net Asset Range
                        Decline to Disclose60,605
                        1−5,000,0002,294
                        5,000,001−25,000,0001,397
                        No Aggregate Net Asset Value1,281
                        Not Applicable1,120
                        Over $100,000,000773
                        25,000,001−50,000,000501
                        50,000,001−100,000,000435

                        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
                        • Audit Fees 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.