Home / Guides / Streams, funds & search
Streams, funds & search

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

ParameterUse
queryWords or exact phrases in double quotes. Several quoted phrases must all appear.
formTypesComma separated form types, such as 10-K or 8-K,10-Q
startDate, endDateFiling date range, YYYY-MM-DD
page1, 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 filingUrl before drawing conclusions.
  • Results are ordered by relevance, not by date. Sort client side on filedAt if 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 in formTypes when you want them.

Variations

  • Exhibits only: each result has fileType, so you can keep matches in, for example, EX-10 material contracts.
  • Watchlist: run the same phrase for a list of CIKs and alert when a new filing matches.
  • Feed an extractor: pass filingUrl to /v1/extractor to pull the section that contains the phrase.

Next steps

More streams, funds & search guides

Run this guide with your own key

500 free API calls a month. Every example on this page works on the free plan.

Get free API key →