The Mine Works
Browse on Apify
← All posts
tutorial June 22, 2026 · 2 min read Updated June 22, 2026

How to Search SEC EDGAR Filings by Keyword (Full-Text Search API)

SEC EDGAR has a free full-text search API called EFTS. Learn how to search 10-K, 10-Q, and 8-K filings by keyword, filter by form type and date, and extract matched text with Python.

Try the scraper

The actor referenced in this article is live on Apify. Pay only for results delivered.

Open on Apify →

Most people know SEC EDGAR for looking up filings by company. Fewer know about EDGAR’s full-text search: the ability to search the body text of every filing ever submitted. This unlocks cross-company research that is impossible with the standard EDGAR API.

What EDGAR full-text search covers

The EDGAR Full-Text Search System (EFTS) indexes the body text of all filings submitted since 1996. That includes:

  • 10-K annual reports and 10-Q quarterly reports
  • 8-K current reports (earnings, mergers, executive changes)
  • DEF 14A proxy statements
  • S-1 registration statements
  • 13F institutional holdings reports
  • 200+ other form types

The EFTS endpoint

The base URL is https://efts.sec.gov/LATEST/search-index?q="your+query". The API requires no authentication and returns JSON.

import requests

params = {
    "q": '"supply chain disruption"',  # use quotes for exact phrase
    "dateRange": "custom",
    "startdt": "2024-01-01",
    "enddt": "2024-12-31",
    "forms": "10-K",
}

r = requests.get("https://efts.sec.gov/LATEST/search-index", params=params)
hits = r.json()['hits']['hits']

for hit in hits:
    src = hit['_source']
    print(src['file_date'], src['entity_name'], src['form_type'])
    print(src['file_num'])

Pagination

EFTS returns 10 results per page by default. Use from= to paginate:

all_results = []
offset = 0

while True:
    params['from'] = offset
    r = requests.get("https://efts.sec.gov/LATEST/search-index", params=params)
    data = r.json()
    hits = data['hits']['hits']
    if not hits:
        break
    all_results.extend(hits)
    offset += len(hits)
    if offset >= data['hits']['total']['value']:
        break

Using the Apify actor

The SEC EDGAR Full-Text Search scraper wraps EFTS with automatic pagination, rate-limit handling, and structured output:

import apify_client

client = apify_client.ApifyClient('YOUR_APIFY_TOKEN')

run_input = {
    "query": "material weakness internal controls",
    "formTypes": ["10-K", "10-Q"],
    "startDate": "2024-01-01",
    "endDate": "2024-12-31",
    "maxResults": 200,
}

run = client.actor('themineworks/sec-edgar-fulltext-search').call(run_input=run_input)

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item['company'], item['form_type'], item['filing_date'])
    print(item['filing_url'])

High-value search queries

Risk research: "going concern" — companies auditors flagged as at risk of bankruptcy.

M&A research: "definitive agreement to acquire" — all announced acquisitions across all filers.

Executive changes: "appointed as Chief Executive Officer" in 8-K filings.

Climate risk: "physical risks of climate change" across all 10-K filings in a sector.

Litigation: "class action lawsuit" to track filings disclosing active litigation.

Pricing

First 25 results free. Pay per filing returned. Zero charge on empty searches.

Related Actor

Try the scraper referenced in this article — live on Apify, pay only for results.

Open sec-edgar-fulltext-search on Apify →

Frequently asked questions

What is EDGAR EFTS? +

EDGAR Full-Text Search (EFTS) is the SEC own search endpoint at efts.sec.gov. It indexes the full body text of all filings submitted after 1996.

Can I search inside 10-K risk factors? +

Yes. EFTS searches the full body text of each filing, including the Risk Factors, MD&A, and all other sections of 10-K and 10-Q filings.

Is the EDGAR full-text search API free? +

Yes. EFTS is a free, unauthenticated endpoint with no rate limit documented by the SEC. Fair-use scraping is acceptable per the SEC robots.txt and EDGAR guidelines.