Skip to content
All library documents

Ways to Access New SEC 10-K Filings and Historical Fundamentals

Article Quant Q&A · Author: NumenorForLife

Summary

The document compares approaches to retrieving SEC 10-K information, depending on whether a researcher needs standardized financial data or the original filings. For historical fundamentals such as income statements, balance sheets, and cash flow statements, it describes querying a third-party provider’s API for selected companies rather than downloading the entire filing archive. The example response contains financial measures and filing dates. For new filings, it describes a websocket service that sends an event when a 10-K appears, while also mentioning a Python package that accepts ticker lists and a separate downloader designed to retrieve filings at a stated compliant rate.

The discussion highlights the trade-off between retrieving only needed information and maintaining a local archive. It notes that bulk collection can require substantial storage and time, and that the SEC asks bulk downloaders to operate outside regular trading hours. The answers are informal and partly reflect their dates: provider coverage, prices, package capabilities, download limits, and the availability of bulk data may have changed. The methods also differ in scope: structured fundamentals do not replace the full text of a filing, and real-time notifications do not themselves describe a complete historical archive.

Key ideas

  • Query a fundamentals API for selected companies when standardized financial statements are sufficient.
  • A filing notification stream can alert a user when new 10-K documents are published.
  • Ticker-focused extraction can avoid retrieving filings for every company.
  • Bulk downloads require attention to storage, request rates, and the SEC’s timing preferences.
  • Provider coverage and package capabilities may change, so the examples need current verification.

Tags

Full text
# What is the most efficient way to periodically download all new 10-K filings from SEC's EDGAR?


# What is the most efficient way to periodically download all new 10-K filings from SEC's EDGAR?












I found this website which uses a perl script to download all the filings. It states: "There are 200K+ 10-K (and equivalent) filings, which will take considerable harddisk space and time to download. The SEC prefers that bulk-download is done during 'quiet time', i.e., outside the regular trading hours."

Is there a better way than deluging the SEC's servers with requests to get this information?

## Answer by Jay (score 1)

https://quant.stackexchange.com/a/43259

#### 10-K - Historical Fundamentals Only

If you are just interested in the fundamentals (income statement, balance sheet, cash flow statement) of 10-Ks, then you can use the provider eodhistoricaldata.com. I'm a paying customer, and use their APIs on a daily basis. Price is $10/month for accessing fundamentals of 37K stocks (world wide), 6K ETFs, and 20K mutual funds.

You can use the method `getFundamentals(ticker)` provided by the library `eodhistoricaldata-api` (https://www.npmjs.com/package/eodhistoricaldata-api), or access their RESTful API directly.

You can access the API programmatically, without requiring you to download all reports at once.

The API returns JSON data, for example:

```
"Highlights": {
    "MarketCapitalization": 54915055616,
    "MarketCapitalizationMln": "54915.0556",
    "EBITDA": 616286976,
    "PERatio": null,
    "PEGRatio": "-1.5700",
    "WallStreetTargetPrice": "321.8900",
    "BookValue": "26.2790",
    "DividendShare": null,
    "DividendYield": null,
    "EarningsShare": "-4.8500",
    "EPSEstimateCurrentYear": "-6.5600",
    "EPSEstimateNextYear": "-2.0000",
    "EPSEstimateNextQuarter": "-1.6700",
    "MostRecentQuarter": "2018-09-30",
    "ProfitMargin": "-0.1022",
    "OperatingMarginTTM": "-0.0710",
    "ReturnOnAssetsTTM": "-0.0271",
    "ReturnOnEquityTTM": "-0.3397",
    "RevenueTTM": "17523644416.00",
    "RevenuePerShareTTM": "103.3240",
    "QuarterlyRevenueGrowthYOY": "1.2860",
    "GrossProfitTTM": "2222487000.00",
    "DilutedEpsTTM": "-10.5600",
    "QuarterlyEarningsGrowthYOY": null
},
// ...
"Income_Statement": {
        "currency_symbol": "USD",
        "quarterly": {
            "2018-09-30": {
                "date": "2018-09-30",
                "filing_date": "2018-11-02",
                "researchDevelopment": "350848000.00",
                "effectOfAccountingCharges": null,
                "incomeBeforeTax": "271320000.00",
                "minorityInterest": "1344731000.00",
                "netIncome": "311516000.00",
                "sellingGeneralAdministrative": "729876000.00",
                "grossProfit": "1523665000.00",
                "ebit": "442941000.00",
                "operatingIncome": "442941000.00",
                "otherOperatingExpenses": null,
                "interestExpense": "-169858000.00",
                "extraordinaryItems": null,
                "nonRecurring": null,
                "otherItems": null,
                "incomeTaxExpense": "16647000.00",
                "totalRevenue": "6824413000.00",
                "totalOperatingExpenses": "6381472000.00",
                "costOfRevenue": "5300748000.00",
                "totalOtherIncomeExpenseNet": "-171621000.00",
                "discontinuedOperations": null,
                "netIncomeFromContinuingOps": "254673000.00",
                "netIncomeApplicableToCommonShares": "311516000.00"
            },
            // ...
"Balance_Sheet": {
        "currency_symbol": "USD",
        "quarterly": {
            "2018-09-30": {
                "date": "2018-09-30",
                "filing_date": "2018-11-02",
                "intangibleAssets": "291476000.00",
                "totalLiab": "23409144000.00",
                "totalStockholderEquity": "4508838000.00",
                "deferredLongTermLiab": "0.00",
                "otherCurrentLiab": "2266778000.00",
                "totalAssets": "29262713000.00",
                "commonStock": "171000.00",
                "otherCurrentAssets": "158627000.00",
                "retainedEarnings": "-5457315000.00",
                "otherLiab": "2285172000.00",
                "goodWill": "65226000.00",
                "otherAssets": "1233979000.00",
                "cash": "2967504000.00",
                "totalCurrentLiabilities": "9775324000.00",
                "shortLongTermDebt": "2106538000.00",
                "otherStockholderEquity": "8271000.00",
                "propertyPlantEquipment": "19733969000.00",
                "totalCurrentAssets": "7920491000.00",
                "longTermInvestments": "17572000.00",
                "netTangibleAssets": "4152136000.00",
                "shortTermInvestments": "0.00",
                "netReceivables": "1155001000.00",
                "longTermDebt": "9726589000.00",
                "inventory": "3314127000.00",
                "accountsPayable": "3596984000.00",
                "totalPermanentEquity": "0.00",
                "noncontrollingInterestInConsolidatedEntity": "0.00",
                "temporaryEquityRedeemableNoncontrollingInterests": "0.00",
                "accumulatedOtherComprehensiveIncome": "0.00",
                "additionalPaidInCapital": "0.00",
                "commonStockTotalEquity": "0.00",
                "preferredStockTotalEquity": "0.00",
                "retainedEarningsTotalEquity": "0.00",
                "treasuryStock": "0.00"
            },
            // ...
"Cash_Flow": {
        "currency_symbol": "USD",
        "quarterly": {
            "2018-09-30": {
                "date": "2018-09-30",
                "filing_date": "2018-11-02",
                "investments": null,
                "changeToLiabilities": "895197000.00",
                "totalCashflowsFromInvestingActivities": "-560965000.00",
                "netBorrowings": "-221931000.00",
                "totalCashFromFinancingActivities": "-84218000.00",
                "changeToOperatingActivities": "98770000.00",
                "netIncome": "311516000.00",
                "changeInCash": "739728000.00",
                "totalCashFromOperatingActivities": "1391281000.00",
                "depreciation": "502825000.00",
                "otherCashflowsFromInvestingActivities": "128600000.00",
                "dividendsPaid": "0.00",
                "changeToInventory": "-55055000.00",
                "changeToAccountReceivables": "-587594000.00",
                "salePurchaseOfStock": "0.00",
                "otherCashflowsFromFinancingActivities": "42839000.00",
                "changeToNetincome": "179168000.00",
                "capitalExpenditures": "-559765000.00"
            },
```

#### 10-K - Real-Time

I suggest `sec-api` (https://www.npmjs.com/package/sec-api) if you need real-time access to 10-K filings. It provides a websocket (real-time) channel. As soon as a new filing is published on sec.gov EDGAR, the library fires an event, and returns information about the new filing as follows (JSON format):

```
{  
  companyName:            'WALT DISNEY CO/ (0001001039) (Issuer)',  
  cik:                    '0001001039',
  type:                   '10-K',  
  description:            'FORM 10-K',  
  linkToFilingDetails:    'https://www.sec.gov/...',  
  linkToHtmlAnnouncement: 'https://www.sec.gov/...',  
  linkToXbrl:             'https://www.sec.gov/...',  
  announcedAt:            '2018-12-21T20:02:07-05:00'
}
```

The library works with server-side (eg Node.js) and client-side (eg React, React Native, Angular, Vue) JavaScript.

Simple Node.js implementation:

```
const api = require('sec-api')(); 
api.on('filing', filing => console.log(filing));
```

## Answer by Jordan-M-Young (score 0)

https://quant.stackexchange.com/a/55334

I wrote a data mining package for EDGAR in python. It accepts lists of tickers as an input so you don't need to download every 10-k for every company. Just the ones you want. Hope it helps!

https://github.com/Jordan-M-Young/pyQuarry

## Answer by John F (score 0)

https://quant.stackexchange.com/a/80736

You can use the open-source package datamule. It's optimized to download filings from the SEC at the fastest compliant speed, which is 10 filings / second.

```
import datamule as dm

downloader = dm.Downloader()
downloader.download(form='10-K', date = (start_date,end_date))
```

Unfortunately, there are currently no up to date bulk downloads for SEC filings. The SEC does offer bulk downloads, but it includes other filings. Since the SEC caps you at around 30mb/s per request, using bulk downloads to get 10-Ks is very slow.

I'm currently looking into a storage solution that can support hosting bulk data zips, updated monthly.

Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)

This summary was written by Stratmill's research agent from the original; it is not a copy of the source.