search_sec_filings
Search SEC Filings
What it does
Search and list SEC filings by company (CIK), form type, date range, 8-K item codes and excluded forms, optionally with a full-text query over filing bodies and by COMPANY FACTS (market cap, float, price, sector, industry, exchange, company type, foreign issuer, recent IPO).
Rows carry id (the filingId for get_filing_document / get_filing_exhibits), cik, company_name, accession_number, form_type, filing_date, acceptedAt, primaryDocument, bodyStored and itemNumbers (plus rank and snippet with q); pagination has total, totalRelation ("eq" exact; "gte" a lower bound cut at 10,000, when totalEstimate is "about N"), hasMore and nextCursor.
The ciks filter matches the filing's own CIK: a Form 4 filed under the reporting owner's CIK is NOT returned for the issuer's CIK. Coverage: Signal8's SEC EDGAR archive, updated through the day, in its held range (see archiveFrom in each response; currently from late 2021, expanding back to 2016 as the history backfill fills in).
Before archiveFrom it holds only a scatter, so ABSENCE BEFORE archiveFrom IS NOT EVIDENCE a filing was never filed; check SEC EDGAR for earlier periods. Record-only rows (bodyStored: false) have no stored body; open them at their sec.gov URL.
Every response carries archiveFrom and rangeStartsBeforeArchive: a range with no dateFrom or starting before archiveFrom is NEVER definitive (searchIndex.complete: false, reason: "outside_held_range", heldFrom); report "the archive only holds filings from <archiveFrom>", never "no such filing exists". An empty text result is definitive only when searchIndex.complete is true.
Full-text q: Query syntax: unquoted words must ALL appear (any order, any distance); "quoted phrase" = exact wording; OR between alternatives (merger OR acquisition); -word or -"phrase" to exclude; w1 NEAR/10 w2 (also NEAR(10), or bare NEAR = within 10) = words close together; word* = prefix of 4+ letters (dilut* matches dilution, dilutive); $AAPL or a capitalised ticker scopes to that company; a form code (8-K, 10-Q, S-1), "item 5.02" / "8-K 1.05" and a bare year (2024) scope to that form / 8-K item / year.
The archive's reading of the query is in meta.understanding (understand=false searches the words literally). facets=true adds facets per form / year / 8-K item over the whole result set (absent = not measured, never zero). sort=relevance caps page 1 per company; meta.diversity {maxPerCompany, hidden} names who has more (page with nextCursor or filter by CIK). section / exhibitTypes filters apply only when meta.sections / appliedFilters confirm them; otherwise meta.unsupported says why and the whole filing was searched.
COMPANY FILTERS (minMarketCap … recentIpo): only issuer-filed forms are searched (third-party Form 4 / 144 / 13D/G go to companyFilter.droppedForms unless companyFilter.subjectMatch is true; with no formTypes the default is 10-K, 10-Q, 8-K, S-1, S-3, DEF 14A, 20-F, 40-F, 6-K); companies with no measured value are EXCLUDED, never assumed (companyFilter.unknown counts them); an unknown value is a 400 listing allowed names; when the archive cannot answer the call FAILS with COMPANY_FILTER_NOT_APPLIED and never returns unfiltered rows; results are cursor-paged, cannot combine with acceptedFrom/acceptedTo/bodyStored, and carry no snippet (use search_filing_text).
To count or list companies rather than filings, use screen_companies.
Ask your AI
With the Signal8 MCP server connected, your assistant calls this tool when a question needs it. For example:
Using Signal8, search and list SEC filings by company.
Parameters
| Name | Type | Description |
|---|---|---|
ciksoptional | string | Comma-separated CIK numbers to filter by (e.g., "320193,1018724"; zero-padded also accepted) |
qoptional | string | Full-text query over filing bodies. Query syntax: unquoted words must ALL appear (any order, any distance); "quoted phrase" = exact wording; OR between alternatives (merger OR acquisition); -word or -"phrase" to exclude; w1 NEAR/10 w2 (also NEAR(10), or bare NEAR = within 10) = words close together; word* = prefix of 4+ letters (dilut* matches dilution, dilutive); $AAPL or a capitalised ticker scopes to that company; a form code (8-K, 10-Q, S-1), "item 5.02" / "8-K 1.05" and a bare year (2024) scope to that form / 8-K item / year. Example: '$AAPL "share repurchase" -"no longer"', 'cyber* NEAR/10 incident', 'item 5.02 resign*'. |
sortoptional | "newest" | "relevance" | newest (by acceptance time, default) or relevance (requires q; best match first) |
matchoptional | "exact" | "stemmed" | Word matching for q. exact = a word matches only itself ("split" does NOT match "splits" or "splitting") — EDGAR full-text search's own behaviour; stemmed = English word variations also match. Default when omitted: stemmed. The mode actually APPLIED is in the response's meta.matchMode (with meta.matchModeFallbackReason when it differs from the one asked for); meta.engine names the search engine. Ignored without q. |
facetsoptional | boolean | true = also return facets: { forms, years, items }, each a list of { value, count } over the WHOLE result set (not just this page). Present only when the archive measured them (its OpenSearch engine); absent means NOT MEASURED, never zero. Default false. |
understandoptional | boolean | Query understanding (default true): the archive recognises tickers/$TICKER, company names, form codes, "item N.NN" and expands synonyms, reporting what it applied in meta.understanding. false = search the words literally (also disables synonym expansion). Ignored without q. |
sectionoptional | string | Restrict MATCHING to sections (comma-separated): business, risk_factors, cybersecurity, legal_proceedings, mdna, market_risk, controls (10-K/10-Q/20-F narrative items, by meaning — mdna is 10-K Item 7, 10-Q Part I Item 2 and 20-F Item 5), ex99 (press-release / EX-99.x exhibit text) and item_X_YY (the text under an 8-K item, e.g. item_5_02). Aliases: mda, risk, legal, cyber, press_release, 5.02. Unknown names are a 400. Needs q. Applied ONLY when the response's meta.sections names it — otherwise meta.unsupported says why (e.g. the archive index does not have sections yet) and matches may come from ANYWHERE in the filing. |
exhibitTypesoptional | string | Keep only filings carrying ANY of these exhibit types (comma-separated): a family such as EX-10 (material contracts) matches every member (EX-10.1, EX-10.2…); an exact type such as EX-99.1 (usually the press release) only itself. Others: EX-97 clawback policy, EX-3 charter/bylaws, EX-4 instruments/warrants, EX-21 subsidiaries, EX-23 consents. "10.1" is accepted for EX-10.1. Listed in appliedFilters when the rows prove it; otherwise in ignoredFilters / meta.unsupported — treat the rows as unfiltered then. |
matchedSectionsoptional | boolean | Per-row matchedSections (default true): the sections the text matched in. ABSENT on a row means not measured (index without sections), never "matched nowhere". Ignored without q. |
cursoroptional | string | Opaque keyset cursor from a previous response's pagination.nextCursor. Prefer it over page for deep paging — it is stable while new filings arrive. Required for page 2+ of a company-filtered search. |
pageoptional | number | Page number (1-indexed, default: 1). Ignored when cursor is set; not allowed with company filters. |
pageSizeoptional | number | Results per page (default: 25, max: 100) |
formTypesoptional | string | Comma-separated form types (e.g., "10-K,10-Q,8-K,S-1,S-3,424B5"). Exact match — list amendments (e.g. "10-K/A") explicitly. (With company filters, amendments are added automatically.) |
excludeFormsoptional | string | Comma-separated form types to EXCLUDE (e.g., "4,13F-HR"). Exact match. |
itemsoptional | string | Comma-separated 8-K item codes, ALL required (e.g., "2.02,9.01" = results + financial statements; "5.02" = officer/director changes; "1.01" = material agreements; "3.01" = delisting notice). |
dateFromoptional | string | Start filing date (YYYY-MM-DD). The archive only holds filings from its archiveFrom date (stated in every response; currently late 2021, expanding back to 2016): omitting dateFrom, or starting earlier, makes an empty result non-definitive. |
dateTooptional | string | End filing date (YYYY-MM-DD) |
minMarketCapoptional | number | COMPANY FILTER. Minimum market cap in USD (price × shares outstanding), e.g. 50000000 for $50M |
maxMarketCapoptional | number | COMPANY FILTER. Maximum market cap in USD, e.g. 300000000 for under $300M |
minFloatoptional | number | COMPANY FILTER. Minimum public float, in SHARES |
maxFloatoptional | number | COMPANY FILTER. Maximum public float, in SHARES |
minPriceoptional | number | COMPANY FILTER. Minimum latest share price in USD |
maxPriceoptional | number | COMPANY FILTER. Maximum latest share price in USD |
sectorsoptional | string | COMPANY FILTER. Sector names separated by "|" (or a bare comma), exact and case-sensitive (e.g. "Healthcare|Technology"). An unknown name returns a 400 listing every valid sector. |
industriesoptional | string | COMPANY FILTER. Industry names separated by "|", exact and case-sensitive (e.g. "Biotechnology|Airlines, Airports & Air Services" — some names contain ", ", so prefer "|"; a bare comma with no space after it also separates). An unknown name returns a 400 listing every valid industry. |
exchangesoptional | string | COMPANY FILTER. Comma-separated listing venues: NASDAQ, NYSE, AMEX (= NYSE American), OTC |
companyTypesoptional | string | COMPANY FILTER. Comma-separated: operating, fund (registered funds/ETFs; adds N-CSR, N-CEN, N-PX, 485BPOS, 497/497K to the default forms), spac (blank-check companies) |
foreignIssueroptional | boolean | COMPANY FILTER. true = companies with foreign-issuer evidence (a 20-F, 40-F or 6-K seen, or an ADR listing); false = none seen since the evidence log began (companyFilter.foreignEvidenceSince) |
recentIpooptional | boolean | COMPANY FILTER. true = first listed within the last 365 days, with no evidence of earlier public status (renames and relistings are excluded). false is the same as omitting it. |
Other SEC filings & EDGAR tools
- get_exhibit_contentFull text/HTML of a single exhibit.
- get_filing_documentFull raw text/HTML of a filing by internal id.
- get_filing_documentsEvery document in a filing, with the ids to read each one.
- get_filing_exhibitsList the readable exhibits within a filing.
- get_filing_structuredParsed Form 3/4/5 transactions, 13F holdings, and Schedule 13D/G.
- lookup_accession_numberLook up a filing/exhibit by accession number.
- screen_sec_filingsScreen filings across all companies by company + filing filters.
- screen_sec_filings_performancePrice performance after filings, with aggregate stats.
- search_filing_textFull-text search that returns the matching passage per filing.