If you've ever tried to pull U.S. company filings straight from SEC EDGAR, you know the pain. The data is free and public — but using it in a real app is a different story.
Here's the problem, and a shortcut I built to get around it.
The problem with raw EDGAR
SEC's official API at data.sec.gov is great until you actually depend on it:
- Rate limits. You're capped at 10 requests/second, and if you cross it your IP is blocked for ~10 minutes. That's fine for a script, brutal for a production feature.
- Inconsistent shape. Every form type and endpoint returns a slightly different JSON structure. Parsing becomes a maintenance tax.
- Missing metadata. You get a CIK and a raw SIC code — but no sector, no industry, no exchange, and no idea what an 8-K "item 2.02" actually means.
So you end up writing a crawler, a cache, a rate-limiter, a SIC→sector map, and an 8-K item lookup table… just to answer "what did Apple just file?"
The shortcut
I got tired of rebuilding that every project, so I packaged it into a small API that crawls, caches, and enriches EDGAR for you. It's served entirely from a cache (refreshed every 6 hours), so you never hit SEC's rate limits, and every response uses one consistent schema.
Four endpoints:
-
GET /companies/{ticker}— enriched company: CIK, exchange, sector, industry -
GET /companies/{ticker}/filings— a company's filings, filter by form (8-K,10-K,10-Q…) -
GET /filings/latest— latest 8-K feed, filter by sector -
GET /funds/{cik}/13f/latest— parsed 13F institutional holdings
Quick example
Grab a free key from the listing page, then:
curl "https://sec-edgar-data-api1.p.rapidapi.com/companies/AAPL" \
-H "X-RapidAPI-Key: YOUR_KEY" \
-H "X-RapidAPI-Host: sec-edgar-data-api1.p.rapidapi.com"
{
"cik": "0000320193",
"ticker": "AAPL",
"name": "Apple Inc.",
"exchange": "Nasdaq",
"sic": "3571",
"sic_description": "Electronic Computers",
"sector": "Information Technology",
"industry": "Industrial Machinery & Computer Equipment",
"fiscal_year_end": "0926"
}
Note the sector and industry fields — SEC doesn't give you those. They're derived from the SIC code so you can filter and group companies without maintaining your own mapping.
In Python:
import requests
BASE = "https://sec-edgar-data-api1.p.rapidapi.com"
HEADERS = {
"X-RapidAPI-Key": "YOUR_KEY",
"X-RapidAPI-Host": "sec-edgar-data-api1.p.rapidapi.com",
}
# Latest 8-K filings in Health Care, with plain-English item labels
r = requests.get(f"{BASE}/filings/latest",
headers=HEADERS,
params={"form": "8-K", "sector": "Health Care", "limit": 5})
for f in r.json()["filings"]:
print(f["ticker"], f["filing_date"], f["item_descriptions"])
LLY 2026-04-30 ['Results of Operations and Financial Condition', 'Financial Statements and Exhibits']
MRK 2026-04-29 ['Other Events', 'Financial Statements and Exhibits']
...
That item_descriptions field is the other bit of enrichment — instead of decoding 2.02 and 9.01 yourself, you get what the 8-K actually reports.
Institutional holdings (13F)
curl "https://sec-edgar-data-api1.p.rapidapi.com/funds/1067983/13f/latest" \
-H "X-RapidAPI-Key: YOUR_KEY" \
-H "X-RapidAPI-Host: sec-edgar-data-api1.p.rapidapi.com"
Returns Berkshire Hathaway's latest 13F with holdings parsed out of the information table — issuer, CUSIP, value, and share count — so you don't have to fetch and parse the XML yourself.
Pricing
There's a free tier (500 calls/month) to try it, then paid tiers for higher volume. Billing runs through RapidAPI, so you just need a RapidAPI key.
Fair warning
This is an independent project and is not affiliated with or endorsed by the U.S. SEC. The data comes from public EDGAR filings, and nothing here is financial advice — always verify against the primary source for anything that matters.
I built this to scratch my own itch, and I'd genuinely like it to be useful to others building screeners, alerts, or research tools. What filing types or fields would make this actually fit your workflow? Let me know in the comments — I'm actively adding to it.
Top comments (0)