Full-text search of SEC filings
Search the text of every SEC filing and exhibit since 2001 for exact phrases, filter by form type and date, page results and count mentions over time.
The Filing Query API searches filing metadata: company, form type, dates. Full-text search searches what the filings say. /v1/full-text-search covers the text of filings and exhibits since 2001 and returns matching filings with company, ticker, form type, filing date, period and links.
Parameters
| Parameter | Use |
|---|---|
query | Words or exact phrases in double quotes. Several quoted phrases must all appear. |
formTypes | Comma separated form types, such as 10-K or 8-K,10-Q |
startDate, endDate | Filing date range, YYYY-MM-DD |
page | 1, 2, ... with 100 results per page |
The code
import os
import requests
BASE = "https://secfeedapi.com"
HEADERS = {"Authorization": f"Bearer {os.environ['SECFEED_KEY']}"}
def search(query, **params):
r = requests.get(f"{BASE}/v1/full-text-search", params={"query": query, **params}, headers=HEADERS, timeout=120)
r.raise_for_status()
return r.json()
# 1. one phrase, one form type, one date range
res = search('"substantial doubt" "going concern"', formTypes="10-K", startDate="2026-01-01", endDate="2026-09-30")
print(res["total"]["value"], "10-K filings in 2026 mention both phrases")
for f in res["filings"][:5]:
print(f" {f['filedAt']} {(f['ticker'] or '-'):6} {f['companyNameLong'][:46]:46} period {f['periodOfReport']}")
# 2. how often a phrase appears in annual reports, year by year
print("\n10-K filings mentioning each phrase, by filing year:")
for phrase in ('"artificial intelligence"', '"tariffs"'):
counts = []
for year in (2019, 2021, 2023, 2025):
t = search(phrase, formTypes="10-K", startDate=f"{year}-01-01", endDate=f"{year}-12-31")["total"]
counts.append(f"{year}: {t['value']:,}{'+' if t['relation'] != 'eq' else ''}")
print(f" {phrase:26} " + " ".join(counts))
# 3. several form types at once, with paging
res = search('"material weakness"', formTypes="8-K,10-Q", startDate="2026-09-01", endDate="2026-09-30")
print(f"\n{res['total']['value']} 8-K and 10-Q filings in September 2026 mention a material weakness")
forms = {}
for page in (1, 2):
for f in search('"material weakness"', formTypes="8-K,10-Q", startDate="2026-09-01", endDate="2026-09-30", page=page)["filings"]:
forms[f["formType"]] = forms.get(f["formType"], 0) + 1
print(" first two pages by form:", forms)
Output
Run on 2026-10-13.
1621 10-K filings in 2026 mention both phrases
2026-09-02 - MYX Inc. (CIK 0002087656) period 2026-05-31
2026-03-18 - Palisades Venture Inc. (CIK 0002010982) period 2025-12-31
2026-03-31 GPLB Green Planet Bio Engineering Co. Ltd. (GPLB) period 2025-12-31
2026-07-29 BRLS Borealis Foods Inc. (BRLS, BRLSW) (CIK 00018 period 2025-12-31
2026-02-25 TKO TKO Group Holdings, Inc. (TKO) (CIK 00019732 period 2025-12-31
10-K filings mentioning each phrase, by filing year:
"artificial intelligence" 2019: 445 2021: 848 2023: 1,295 2025: 3,324
"tariffs" 2019: 2,622 2021: 3,239 2023: 3,321 2025: 4,104
181 8-K and 10-Q filings in September 2026 mention a material weakness
first two pages by form: {'8-K': 113, '10-Q/A': 11, '10-Q': 54, '8-K/A': 3}
Reading the result
- A match means the phrase appears somewhere in the filing or its exhibits. "Going concern" also appears in accounting policy notes of companies with no going concern issue, so open
filingUrlbefore drawing conclusions. - Results are ordered by relevance, not by date. Sort client side on
filedAtif you need a timeline. - Year by year totals are a quick way to measure how a topic spreads through disclosures: 10-K filings mentioning "artificial intelligence" grew from 445 in 2019 to 3,324 in 2025.
- Amendments come back as their own form types (
10-Q/A,8-K/A), so include them informTypeswhen you want them.
Variations
- Exhibits only: each result has
fileType, so you can keep matches in, for example,EX-10material contracts. - Watchlist: run the same phrase for a list of CIKs and alert when a new filing matches.
- Feed an extractor: pass
filingUrlto/v1/extractorto pull the section that contains the phrase.
Next steps
- Full-Text Search API
- Lucene query syntax for metadata search
- Extract 10-K risk factors
- API reference