Everyone assumes financial data means a paid API — Bloomberg, a scraper you have to
babysit, or some $200/month "filings API" wrapper. For raw SEC filings, none of that
is necessary. The SEC runs its own free, public JSON API, and it's been stable and
keyless for years.
The three endpoints that cover almost everything
1. Ticker → CIK lookup
SEC filings are indexed by CIK (Central Index Key), not ticker. One file maps every
public company:
curl -s -H "User-Agent: Your Name your@email.com" \
https://www.sec.gov/files/company_tickers.json | head -c 200
Returns a JSON object keyed by row number, each with cik_str, ticker, title.
Apple is CIK 320193 — zero-pad it to 10 digits for the endpoints below.
2. A company's full filing history
curl -s -H "User-Agent: Your Name your@email.com" \
https://data.sec.gov/submissions/CIK0000320193.json | head -c 400
That single call returns the company's name, SIC industry code, exchange/ticker, and
a filings.recent array with every filing — form type (10-K, 10-Q, 8-K, 4
for insider trades, 13F-HR for institutional holdings, DEF 14A, S-1, …),
filingDate, reportDate, and accessionNumber (which you turn into a direct
document URL). No pagination dance for recent history — at least a year, or the
1,000 most recent filings, in one response.
3. Full-text search across every filing, ever
Want every 8-K that mentions a specific phrase, across every company? That's a
separate index:
curl -s -H "User-Agent: Your Name your@email.com" \
"https://efts.sec.gov/LATEST/search-index?q=%22material+weakness%22&forms=10-K&startdt=2026-01-01&enddt=2026-06-30"
Results come back Elasticsearch-style under hits.hits, each with a display name,
CIK, form type, filing date, and accession number — everything you need to build the
document URL without a second request.
The only two rules
-
Send a real
User-Agent. Not a browser string — an actual identifier: your name and an email address. This is the SEC's entire "access control" — no key, no OAuth, no sign-up form. Skip it and you'll get blocked. -
Stay under 10 requests/second. That's the documented fair-access ceiling
across
data.sec.govandefts.sec.govcombined. Fine for almost any real workload; just don't fire filings in a tight loop with zero delay.
That's the whole barrier to entry. No key rotation, no free-tier quota that resets
monthly, no CAPTCHA wall — because there isn't a wall.
Where this gets tedious at scale
The endpoints above are clean, but real usage runs into the boring parts fast: CIK
padding, mapping every form-type filter you actually want (10-K and 10-K/A,
say), pagination past the first page of full-text search results, retry/backoff to
respect the rate limit, and turning accession numbers into working document links.
None of that is hard — it's just the kind of glue code you don't want to write twice.
That's basically what SEC EDGAR Filings Scraper & Full-Text
Search wraps: same free
official API underneath, but you pass tickers or CIKs plus optional form filters and
a date range, and get back one flat row per filing — company, CIK, form, dates,
accession number, and a direct filing URL, ready to drop into a spreadsheet or a
pipeline. Same data as the curl calls above, just without the glue code.
Want the endpoints without the narrative? Full reference table + curl examples +
gotchas: SEC EDGAR JSON API — a
cheatsheet.
If you liked this one, I also wrote up how job boards expose a public JSON API
underneath the "no API" LinkedIn/Indeed
experience — same pattern, different domain: the data's public, you just have to know where to look.

Top comments (0)