BYTETOOLS

SEC EDGAR Full-Text Search API

Free SEC EDGAR full-text search API with no key: search the text of 10-K, 10-Q, 8-K and every other filing since 2001 by phrase, form type, company and date range.

No API key requiredHTTPSFree tier

Endpoint tested and returned HTTP 200 on 2026-08-21

What is the SEC EDGAR Full-Text Search API?

The SEC's EDGAR full-text search runs over the body text of filings and is exposed as a free JSON API with no key. It supports exact phrases, form-type filters and date ranges across filings from 2001 onwards.

EDGAR's structured APIs tell you what a company reported as numbers. This one tells you what it wrote. Searching for a phrase across every 10-K in a quarter — a risk factor, a technology, a counterparty name — is a fundamentally different question from pulling XBRL facts, and it is the question that surfaces things nobody has tagged. Quote a phrase to search it exactly; without quotes the terms are matched independently.

Two operational facts govern how you use it. Coverage starts in 2001, so anything earlier is invisible to this endpoint even though EDGAR holds the documents. And the SEC requires every automated request to send a descriptive `User-Agent` identifying you with contact details — requests with a default library agent get blocked, and the block is applied to the IP rather than the request. Results come back in raw Elasticsearch shape, with each hit's `_id` combining the accession number and the document filename.

Quick facts

Base URL
https://efts.sec.gov/LATEST
Authentication
No key, but the SEC requires a descriptive User-Agent header naming your application and a contact address. Requests without one are blocked.
Rate limit
10 requests per second across all SEC endpoints, enforced per IP.
Pricing
Free.
CORS
Not enabled — call it from your server
Official docs
Read the docs

How to use the SEC EDGAR Full-Text Search API

Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.

1. 10-K filings mentioning "climate risk" in Q1 2025

GET https://efts.sec.gov/LATEST/search-index?q=%22climate%20risk%22&forms=10-K&dateRange=custom&startdt=2025-01-01&enddt=2025-03-31

curl
curl 'https://efts.sec.gov/LATEST/search-index?q=%22climate%20risk%22&forms=10-K&dateRange=custom&startdt=2025-01-01&enddt=2025-03-31'
JavaScript (fetch)
const res = await fetch("https://efts.sec.gov/LATEST/search-index?q=%22climate%20risk%22&forms=10-K&dateRange=custom&startdt=2025-01-01&enddt=2025-03-31");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);
Python (requests)
import requests

res = requests.get("https://efts.sec.gov/LATEST/search-index?q=%22climate%20risk%22&forms=10-K&dateRange=custom&startdt=2025-01-01&enddt=2025-03-31", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200 (truncated)
{
  "took": 2541,
  "timed_out": false,
  "_shards": {
    "total": 50,
    "successful": 50,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 277,
      "relation": "eq"
    },
    "max_score": 7.0256405,
    "hits": [
      {
        "_index": "edgar_file",
        "_id": "0001163165-25-000012:cop-20241231.htm",
        "_score": 7.0256405,
        "_source": {
          "ciks": [
            "0001163165"
          ],
          "period_ending": "2024-12-31",
          "file_num": [
            "001-32395"
          ],
          "display_names": [
            "CONOCOPHILLIPS  (COP)  (CIK 0001163165)"
          ],
          "xsl": null,
          "sequence": 1,
          "root_forms": [
            "10-K"
          ],
          "file_date": "2025-02-18",
          "biz_states": [
            "TX"
          ],
          "sics": [
            "2911"
          ],
          "form": "10-K",
          "adsh": "0001163165-25-000012",
          "film_num": [
            "25634395"
          ],
          "biz_locations": [
            "Houston, TX"
          ],
          "file_type": "10-K",
          "file_description": "10-K",
          "inc_states": [
            "DE"
          ],
          "items": []
        }
      },
      {
        "_index": "edgar_file",
        "_id": "0000083246-25-000007:hsbcusa-20241231.htm",
        "_score": 5.5230966,
        "_source": {
          "ciks": [
            "0000083246"
          ],
          "period_ending": "2024-12-31",
          "file_num": [
            "001-07436"
          ],
          "display_name

Parameters

ParameterTypeRequiredDescription
qqueryRequiredSearch terms. Wrap in double quotes for an exact phrase; unquoted terms match independently. "climate risk"
formsqueryOptionalComma-separated form types to restrict to. 10-K
dateRangequeryOptional`custom` to enable the explicit date bounds below. custom
startdt / enddtqueryOptionalFiling date bounds in `YYYY-MM-DD`, used with `dateRange=custom`. 2025-01-01
ciksqueryOptionalRestrict to specific filers by zero-padded CIK. 0001163165
fromqueryOptionalResult offset for paging. 10

Response fields

hits.total.valueinteger
Number of matching documents.
hits.hits[]._idstring
Accession number and filename joined by a colon — enough to build the document URL.
hits.hits[]._scorenumber
Relevance score for the match.
hits.hits[]._source.display_namesarray
Filer name with ticker and CIK in one display string.
hits.hits[]._source.ciksarray
Zero-padded CIK numbers of the filers on this document.
hits.hits[]._source.form / root_formsstring
Form type, and its root type with amendment suffixes stripped.
hits.hits[]._source.file_datestring
Date the filing was submitted.
hits.hits[]._source.period_endingstring
Reporting period the filing covers, which is not the filing date.
hits.hits[]._source.sicsarray
SIC industry classification codes for the filer.
hits.hits[]._source.biz_states / biz_locationsarray
Registered business location of the filer.

What you can build with the SEC EDGAR Full-Text Search API

  • Find every 10-K discussing a specific risk factor in a period
  • Track how often a term appears in filings over time
  • Locate filings that name a particular counterparty or product
  • Build a research corpus of filing text for a topic

Common errors and how to fix them

403 or a rate-limit page

No descriptive User-Agent was sent.

Fix: The SEC requires a `User-Agent` naming your application and a contact email. A default library agent will be blocked.

No results before 2001

Not an error — the index starts in 2001.

Fix: Earlier filings exist in EDGAR but are not full-text indexed. Use the archive browse endpoints instead.

Unexpectedly broad matches

The phrase was not quoted.

Fix: Wrap multi-word phrases in double quotes inside `q`, URL-encoded. Unquoted terms are matched independently.

429

More than 10 requests per second.

Fix: The limit is shared across all SEC endpoints from your IP. Space requests and cache aggressively.

SEC EDGAR Full-Text Search API — frequently asked questions

Is SEC full-text search free to use?

Yes. It needs no key or registration, but the SEC requires every automated request to send a descriptive User-Agent identifying your application and a contact address.

How far back does full-text search go?

To 2001. EDGAR holds older filings but they are not in the full-text index, so a pre-2001 phrase search returns nothing even though the document exists.

How is this different from the EDGAR company facts API?

Company facts returns structured XBRL numbers a filer tagged. Full-text search runs over the prose of the filing itself, which surfaces things no one tagged — risk language, named counterparties, product descriptions.

How do I build the URL for a matching document?

The `_id` combines the accession number and filename with a colon. Split it and assemble the EDGAR archive path from the accession number with dashes removed and the filer's CIK.

Tools that pair with this API

SEC EDGAR Full-Text Search is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.