SEC EDGAR API: how to get filings, Form D rounds and financials in code
The SEC publishes everything filed on EDGAR for free, and you don't need an API key. What it doesn't publish is one single API: filings, Form D rounds and financial figures each live behind a different endpoint, with different freshness and formats.
The four official sources
| What you want | SEC source | How fresh |
|---|---|---|
| One company's filings | data.sec.gov/submissions/CIK##########.json |
Updated as filings are accepted |
| Every filing of a form type, across all companies | Daily form indexes in /Archives/edgar/daily-index |
Built each business-day evening (US Eastern time) |
| Form D private offerings | Each filing's primary_doc.xml, found through the daily index |
Same as the daily index |
| Key financials | data.sec.gov/api/xbrl/companyfacts/CIK##########.json |
Updated as XBRL filings are accepted |
EDGAR full-text search (efts.sec.gov) covers filing text from 2001 onwards.
The two rules the SEC asks you to follow
- Declare who you are. Every request should send a
User-Agentwith your company name and a contact email. Scripts that don't send one are often refused with a 403. - Stay under 10 requests a second. That's the SEC's current fair-access limit, and the SEC says it may limit scripts that go over it.
Python: a company's latest 8-K
This turns a ticker into a CIK with the SEC's company_tickers.json, then reads the company's submissions JSON. Put your own name and email in UA.
import json, time, urllib.request
UA = "Your Name your.email@example.com" # the SEC asks every script to say who it is
def get(url):
req = urllib.request.Request(url, headers={"User-Agent": UA, "Accept-Encoding": "identity"})
with urllib.request.urlopen(req, timeout=30) as r:
data = json.load(r)
time.sleep(0.2) # stay well under the SEC's 10 requests a second
return data
tickers = get("https://www.sec.gov/files/company_tickers.json")
cik = next(t["cik_str"] for t in tickers.values() if t["ticker"] == "NVDA")
sub = get(f"https://data.sec.gov/submissions/CIK{cik:010d}.json")
recent = sub["filings"]["recent"]
for form, filed, acc, doc, items in zip(recent["form"], recent["filingDate"], recent["accessionNumber"],
recent["primaryDocument"], recent["items"]):
if form == "8-K":
url = f"https://www.sec.gov/Archives/edgar/data/{cik}/{acc.replace('-', '')}/{doc}"
print(filed, form, items, url)
break
Run on 30 October 2026, it printed NVIDIA's 8-K of 3 September 2026 (item 8.01) and its document link.
Where it trips people up
- CIKs are 10 digits in the API. Pad with zeros:
CIK0001045810, notCIK1045810. - Today's filings aren't in the daily index yet. The index for a business day is built that evening, and there's none at weekends or on federal holidays. For one company's filings as soon as they're accepted, use the submissions JSON.
- Form D amounts aren't money raised. A Form D reports the total offering amount and the amount sold so far when it was filed. Amendments update them, and the SEC doesn't review Form D.
- XBRL concepts vary by company. Revenue can be reported under several concepts, so check which one a company used before you compare figures.
We built this
Disclosure: Your Evenings Ltd built and sells this. It's independent and isn't affiliated with or endorsed by the SEC. SEC EDGAR Filings API: Form D, 8-K & XBRL (Unofficial) on the Apify Store reads the same official sources and gives you clean rows:
- Five modes: filings by ticker or CIK, the latest filings of any form type, Form D private offerings, full-text search and key financials from XBRL.
- Form D rows you can filter by industry group, issuer state, minimum offering size and securities type, with the amounts offered and sold.
- Key financials in one layout: the latest annual and quarterly revenue, operating income, net income, diluted EPS, operating cash flow, assets, liabilities, equity, cash, long-term debt and shares outstanding. Each value names the XBRL concept and filing it came from.
- Monitor mode: schedule it daily and it returns only filings it hasn't returned before.
- Polite to the SEC: every request declares who is making it, paced to at most 5 a second.
Pricing: $0.002 per filing, $0.003 per Form D offering or company financials row, and $0.01 per monitor run that finds something new (base prices; higher Apify plans pay less). Status rows and filtered-out filings are free.
FAQ
Do I need an API key for SEC EDGAR? No. EDGAR's data and APIs are free and need no key, but the SEC asks you to declare a User-Agent with your name and email.
What is the SEC EDGAR rate limit? The SEC's current fair-access limit is 10 requests a second.
Why are today's filings missing from the daily index? Each business day's index is built that evening, US Eastern time. A company's submissions JSON updates as filings are accepted.
Is a Form D amount the amount raised? Not exactly. It's the total offering amount and the amount sold so far at the time of filing. Amendments update them.
Product names and logos belong to their owners. Your Evenings Ltd is not affiliated with or endorsed by them. Data from SEC EDGAR. Your Evenings Ltd is not affiliated with or endorsed by the U.S. Securities and Exchange Commission.
