SEC EDGAR Scraper - Filings and Full-Text Search
Pricing
Pay per event
SEC EDGAR Scraper - Filings and Full-Text Search
Pull SEC filings by ticker or CIK, or search the full text of every filing. Returns form type, filing and report dates, XBRL flags and direct document links from the SEC's own public APIs.
SEC EDGAR Scraper
Pull SEC filings for any public company by ticker or CIK, or search the full text of every filing to find which companies used a phrase. Form type, filing and report dates, XBRL flags, and a direct link to the document itself.
This reads the SEC's own public APIs. No key, no login.
Two questions, two modes
"What has this company filed?"
companies: ["AAPL", "MSFT"]forms: "10-K,10-Q"
Tickers are resolved to CIK numbers against the SEC's own published ticker file, so you do not need to look them up. CIK numbers work directly too, padded or not.
"Which companies talk about this?"
search: "climate risk"forms: "10-K"
Full-text search runs across every filing on EDGAR. Searching "climate risk" in 10-K filings returns 10,000 hits across hundreds of companies. This is the mode that answers questions a company-by-company pull cannot: which filers disclose a material weakness, mention a competitor by name, or first used a term and when.
Why this Actor connects directly
Worth explaining, because it is unusual in this collection. Measured on 3 September 2026, same URL:
| Route | Result |
|---|---|
| Direct | HTTP 200, 164 KB, Apple Inc., 1,001 filings |
| Through a residential proxy, US-pinned | CONNECT tunnel failed, response 491 |
A 491 on the CONNECT is the proxy refusing to tunnel to the host, not the
SEC refusing us. Routing around that would be solving the wrong problem: the SEC
publishes these APIs for automated use. Their fair-access policy asks only
that callers identify themselves and stay under ten requests a second, and this
Actor does both — it paces itself well under that, and puts your
contact_email in the User-Agent.
Supplying a real address is the polite thing and the more reliable one. Runs work without it, but a bare library default is what gets throttled, and deservedly.
The trap in this data
filings.recent is columnar. It is not a list of filings — it is a dozen
parallel arrays, form[], filingDate[], accessionNumber[],
primaryDocument[] and more, each 1,001 entries long for Apple. There is no
per-filing object anywhere in the response.
Zip them by index and you get filings. Index them independently and every field belongs to a different filing, and nothing raises. You get a 10-K with a 10-Q's date and a link to the wrong document, in a run that reports success.
This Actor takes the length from the shortest array and builds every row at one index, so a ragged response truncates rather than misaligning. The tests pin that.
Fields
- Filer:
cik,company,ticker,tickers,exchanges,sic,sic_description,state_of_incorporation,fiscal_year_end - Filing:
accession_number,form,filing_date,report_date,acceptance_datetime,file_number,size_bytes - Documents:
primary_document,primary_doc_description,document_url(a direct link to the filing),filing_index_url - Structured data:
is_xbrl,is_inline_xbrl - 8-K only:
items, the item numbers cited
filing_date and report_date are different and both matter: a 10-K filed on
31 October 2025 reports on a fiscal year that ended 27 September 2025. Comparing
companies on the wrong one mixes up reporting periods.
On full-text search results, EDGAR crams three facts into one string —
CARNIVAL CORP (CCL) (CIK 0000815097) — and this Actor splits them into
company, ticker and cik rather than writing that whole line into a name
column.
Input reference
| Field | Type | Default |
|---|---|---|
companies | tickers or CIKs | ["AAPL","MSFT"] |
search | full-text phrase | — |
forms | comma separated form types | all |
date_from, date_to | YYYY-MM-DD, search mode only | — |
contact_email | goes in the User-Agent | a generic address |
limit | 1-5000 | 100 |
retries | 1-6 | 3 |
Typical uses
- Filing monitoring. Watch a set of companies for new 8-K or 10-Q filings on
a schedule, and pull
document_urlstraight into whatever reads them. - Disclosure research. Full-text search for a risk factor, an accounting term or a competitor's name across every 10-K, and see who says it.
- Insider activity. Filter
forms: "4"for a company and you have its insider transaction filings. On a typical recent-30 pull for Microsoft, 20 of 30 filings were Form 4. - Peer sets.
sicandsic_descriptiongroup filers by industry as the SEC classifies them, which is often cleaner than a vendor's sector labels. - XBRL pipelines.
is_inline_xbrltells you which filings carry machine readable financials before you download anything.
Notes on behaviour
A ticker with no company on EDGAR returns a not_found error naming it, never a
row of nulls. A 404 is definitive and not retried; a 429 is the SEC throttling
and is waited out rather than retried immediately, because rotating away from a
throttle you caused is the wrong response.
Full-text search covers filings from 2001 onward and caps at 10,000 hits per
query, which the run summary reports as totalHits so you can narrow rather
than assume you have everything.
The submissions endpoint returns roughly the last 1,000 filings per company. Older ones live in separate archive files that this Actor does not currently fetch.