Search & Browse

Company search, exchanges, sectors, and curated subsets. All endpoints live under https://api.edgar.tools/v1.

GET /v1/search#

Tier: Free

Search for companies by name, ticker, or CIK.

ParameterTypeDescription
qstring (required)Search query (company name, ticker, or CIK)
curl "https://api.edgar.tools/v1/search?q=Apple" \
  -H "Authorization: Bearer etk_your_key_here"
{
  "entities": [
    {
      "cik": "0000320193",
      "name": "Apple Inc.",
      "ticker": "AAPL",
      "entity_type": "company",
      "sic_description": "Electronic Computers",
      "state_of_incorporation": "CA",
      "fiscal_year_end": "0930"
    }
  ],
  "total": 1,
  "query": "Apple"
}

Free CIK lookup (no key required)#

Tier: Free — no API key, no login

For the single most common lookup — resolving a ticker or company name to its SEC CIK number — there's a zero-auth endpoint on the app host. Useful for scripts and AI agents that just need the identifier.

curl "https://app.edgar.tools/tools/cik-lookup.json?q=AAPL"
{
  "query": "AAPL",
  "count": 1,
  "results": [
    {
      "cik": 320193,
      "cik_padded": "0000320193",
      "name": "Apple Inc.",
      "ticker": "AAPL",
      "exchange": "Nasdaq",
      "company_url": "https://app.edgar.tools/companies/AAPL"
    }
  ]
}

Accepts a ticker, company name, or numeric CIK as q. Human-readable version at app.edgar.tools/tools/cik-lookup. For richer entity data (industry, incorporation, filings), use the authenticated /v1/search above.

GET /v1/search/full-text#

Tier: Professional+

Full-text search across every SEC filing since 2001 — searches inside the filing body, not just company metadata. Backed by SEC EDGAR's EFTS index.

You must provide at least one of q, forms, ciks, or locations.

Query syntax#

The q parameter supports four operators:

SyntaxExampleMeaning
Phrase quotes"material weakness"Exact phrase match
Booleanrevenue OR earnings, gas NOT renewableOR / NOT (AND is implicit between bare terms)
ProximityNEAR(revenue, decline, 5)Two terms within N tokens of each other
Suffix wildcardgas*Prefix-match — matches gas, gases, gasoline, etc.

Form codes are case-sensitive when used as terms (10-K, not 10-k).

Parameters#

ParameterTypeDescription
qstringSearch query. Required if no forms/ciks/locations provided
formsstring (CSV)Filter by SEC form types (e.g. 10-K,8-K)
ciksstring (CSV)Filter by company CIKs (zero-padding optional)
date_fromstring (YYYY-MM-DD)Start date (inclusive). Omitting both date_from and date_to applies a default window — see Default date window
date_tostring (YYYY-MM-DD)End date (inclusive)
locationsstring (CSV)State/country codes (e.g. CA,NY,UK)
location_typestringlocated (HQ) or incorporated — only meaningful with locations
itemsstring (CSV)8-K item codes (e.g. 2.02,5.02) — only meaningful with forms=8-K
sortstring (default relevance)relevance (match score blended with recency), recent (newest first), or oldest
expandbool (default true)Widen a colloquial q into the filing-language phrases it maps to — see Query expansion. Set expand=0 for a literal search
understandbool (default true)Lift form/item codes out of the q text into filters (apple 10-Kforms=10-K, q=apple) — see Query understanding. Set understand=0 to search the raw text. Ignored when you pass explicit forms/ciks/items
fromint (default 0)Pagination offset. Bounded by your tier's result cap
sizeint (default 20, max 100)Results per page

Example#

# Find every 10-K filed since 2024 mentioning "material weakness"
curl "https://api.edgar.tools/v1/search/full-text?q=%22material+weakness%22&forms=10-K&date_from=2024-01-01&size=5" \
  -H "Authorization: Bearer etk_your_key_here"

Response#

{
  "results": [
    {
      "id": "0000320193-24-000123:filing.htm",
      "score": 12.4,
      "accession": "0000320193-24-000123",
      "form": "10-K",
      "root_forms": ["10-K"],
      "file_type": "10-K",
      "file_date": "2024-11-01",
      "period_ending": "2024-09-28",
      "filename": "filing.htm",
      "url": "https://www.sec.gov/Archives/edgar/data/320193/...",
      "entities": [
        { "cik": "0000320193", "name": "Apple Inc.", "ticker": "AAPL" }
      ],
      "ciks": ["0000320193"],
      "biz_states": ["CA"],
      "biz_locations": ["CA"],
      "inc_states": ["CA"],
      "sics": ["3571"],
      "items": [],
      "is_primary": true,
      "is_amendment": false
    }
  ],
  "total": 142,
  "total_relation": "eq",
  "from": 0,
  "size": 5,
  "tier": "professional",
  "tier_cap": 500,
  "tier_capped": false,
  "applied_default_window": null,
  "also_matched": null,
  "query_understanding": null,
  "facets": {
    "forms": [{ "key": "10-K", "doc_count": 142 }],
    "entities": [{ "cik": "0000320193", "name": "Apple Inc.", "ticker": "AAPL", "count": 3 }],
    "sics": [{ "key": "3571", "doc_count": 35 }],
    "biz_states": [{ "key": "CA", "doc_count": 28 }]
  },
  "query": {
    "q": "\"material weakness\"",
    "forms": ["10-K"],
    "ciks": [],
    "date_from": "2024-01-01",
    "date_to": null,
    "location_codes": [],
    "location_type": null,
    "items": [],
    "sort": "relevance"
  }
}

The query block echoes your request as received. applied_default_window is null here because the request supplied date_from.

Default date window#

If you omit both date_from and date_to, the API scopes the search to the last 12 months instead of all of EDGAR history. Without this, a bare query returns 25 years of results ranked purely by text-match score, which routinely surfaces decade-old filings above recent ones.

When the default is applied, the response includes an applied_default_window object naming what was used, so you can see it and widen it:

"applied_default_window": { "window": "1Y", "date_from": "2025-07-19", "date_to": "2026-07-19" }

To search all history, pass an explicit lower bound — EDGAR full-text indexing begins at 2001:

curl "https://api.edgar.tools/v1/search/full-text?q=%22going+concern%22&date_from=2001-01-01" \
  -H "Authorization: Bearer etk_your_key_here"

Supplying either bound on its own suppresses the default entirely (the other bound stays open).

Query expansion#

The phrases people search are rarely the phrases companies file. A search for buyback misses filings that only say "share repurchase program"; layoffs misses "reduction in force". By default the API widens a plain query into the filing-language phrases it maps to, OR-ing them together so you catch the whole topic:

q=buyback  →  ("buyback" OR "share repurchase program" OR "repurchase of common stock" …)

Your literal text is always kept as the first term — expansion only widens recall, never replaces your query. When it fires, the response carries an also_matched block naming the concept and the phrases added:

"also_matched": { "label": "Share buyback", "phrases": ["share repurchase program", "repurchase of common stock"] }

Expansion only touches plain queries. A query with quotes, boolean operators, or wildcards is treated as author-driven and passed through untouched — so q="buyback" (quoted) searches the literal phrase. To disable expansion for a plain query, pass expand=0. query.q always echoes what you sent; only the executed search is widened.

Query understanding#

A natural query mixes a topic with structured facets — a form type, an 8-K item. By default the API lifts those structured codes out of the q text and into the matching filters, leaving only the topic as full-text:

q=apple 10-K risk factors   →   q=apple risk factors   forms=10-K
q=tesla 8-K item 1.05        →   q=tesla   forms=8-K   (+ item 1.05 filter)

This matters because EFTS q is implicit-AND over the document body, so leaving 10-K in the text would require the literal string "10-K" to appear in the body — usually zero results. Lifting it to the forms filter is what you meant.

When anything is lifted, the response carries a query_understanding block, and query.q still echoes your raw input:

"query_understanding": { "forms": ["10-K"], "items": [], "residual_q": "apple risk factors" }

Only form codes (10-K, 8-K, DEF 14A, S-1, …) and explicit `item N.NN` phrases are lifted — everything else stays full-text. Item filtering is applied to the returned page (EFTS ignores an items query param). Pass understand=0 to disable, or an explicit forms/ciks/items filter (which turns understanding off for that request). Entity-name resolution (apple → the Apple CIK) is a later addition.

Sort order#

sort=relevance (the default) blends text-match score with recency, so a strong older match still surfaces while recent filings get a lift. sort=recent and sort=oldest order by filing date. For pure filter queries (no q), recent/ oldest return the globally newest/oldest filings; for text queries they order the most-relevant page by date, since EDGAR full-text search ranks text queries by relevance upstream.

Results are grouped by filing#

EFTS returns one hit per matching document, so a filing that mentions your query in several exhibits would appear several times. The API collapses these into one entry per filing — the results array carries one row per accession, with the best-matching document chosen for the snippet and the matched filenames unioned.

total, however, is a document count, not a filing count: a filing that matched in N documents contributes N to total. The same applies to facets[].doc_count. So total will typically exceed the number of distinct filings you can page through — use it as a relevance signal, not as the count of filings in the result set.

Tier-based result caps#

You can paginate up to your tier's ceiling. Past that, tier_capped flips to true and the API returns the last reachable page so you can prompt for upgrade.

TierMax paginated results (from + size)
Professional500
Analyst1,000
Enterprise10,000 (EFTS hard cap)

Free tier returns 403 insufficient_tier at the route — full-text search is Pro+.

Errors#

StatusCodeCause
400missing_queryNone of q / forms / ciks / locations provided
400invalid_paramMalformed date_from / date_to / from / size / location_type / sort
400invalid_queryEFTS rejected the query syntax — usually a malformed NEAR() or unbalanced quotes
403insufficient_tierFree tier — upgrade to Professional or above
429upstream_rate_limitedSEC EDGAR rate-limited us; retry after a short pause
502upstream_errorSEC EDGAR returned 5xx or the network call failed

GET /v1/companies/{identifier}/disclosures/search#

Tier: Analyst

Search the XBRL narrative disclosures inside one company's filings — risk factors, MD&A, and other text blocks — for a phrase, with snippets and a novelty score that flags how new each passage is versus prior filings.

Available on Analyst and above. This searches the full narrative text of a company's 10-K and 10-Q filings.
ParameterTypeDescription
identifierstring (path)Company ticker or CIK
qstring (required, max 200 chars)Phrase to search for
formstringFilter to 10-K or 10-Q
yearintegerFilter to a fiscal year
max_resultsinteger (default 10, range 1–25)Max matches to return
proximityinteger or none (default 1000)Max character distance between matched terms
min_noveltyfloat (0.0–1.0)Only return passages at or above this novelty score
diff_onlyboolean (default false)Only return passages that changed from a prior year
diff_base_yearintegerPrior year to diff against when diff_only is set
curl "https://api.edgar.tools/v1/companies/AAPL/disclosures/search?q=supply+chain&form=10-K&max_results=10" \
  -H "Authorization: Bearer etk_your_key_here"
{
  "company": { "ticker": "AAPL", "name": "APPLE INC", "cik": "0000320193" },
  "query": "supply chain",
  "filters": { "form": "10-K", "year": 2025 },
  "matches": [
    {
      "tag": "RiskFactorsTextBlock",
      "label": "Risk Factors",
      "snippet": "...disruptions to our <<supply chain>> could materially affect...",
      "form": "10-K",
      "period": "2025-09-30",
      "filed": "2025-11-01",
      "adsh": "0000320193-25-000123",
      "fiscal_year": 2025,
      "fiscal_period": "FY",
      "match_offset": 4210,
      "hit_count": 3,
      "matched_terms": ["supply", "chain"],
      "novelty_score": 0.72
    }
  ],
  "total": 1,
  "metadata": { "data_source": "r2-parquet", "max_results": 10, "processed_at": "2026-07-13T00:00:00.000Z", "from_cache": false }
}

snippet wraps matched terms in <<...>>. novelty_score runs 0.0–1.0, where higher means the passage is more distinct from the company's prior filings.

Errors#

StatusCode (error_code)Cause
400INVALID_QUERYMissing or over-length q
400INVALID_PARAMETERMalformed form / year / max_results / proximity / min_novelty / diff_only
404COMPANY_NOT_FOUNDThe identifier didn't resolve to a company
404DATA_NOT_AVAILABLENo disclosure data on file for the company
500INTERNAL_ERRORUnexpected search-engine failure

GET /v1/companies#

Tier: Free

List companies with optional sector and exchange filters.

ParameterTypeDescription
pageinteger (default 1)Page number
limitinteger (default 20, max 100)Results per page
sectorstringFilter by sector code
exchangestringFilter by exchange code (e.g. NASDAQ, NYSE)
curl "https://api.edgar.tools/v1/companies?limit=10&exchange=NASDAQ" \
  -H "Authorization: Bearer etk_your_key_here"
{
  "companies": [
    {
      "cik": "0000320193",
      "name": "Apple Inc.",
      "ticker": "AAPL",
      "sic_description": "Electronic Computers"
    }
  ],
  "pagination": { "page": 1, "limit": 20, "total": 10, "has_more": false },
  "filters": { "sector": null, "exchange": "NASDAQ" }
}

GET /v1/companies/{cik}#

Tier: Free

Get detailed information about a specific company by CIK or ticker.

ParameterTypeDescription
cikstring (path)Company CIK number or ticker symbol
curl "https://api.edgar.tools/v1/companies/AAPL" \
  -H "Authorization: Bearer etk_your_key_here"
{
  "company": {
    "cik": "0000320193",
    "name": "Apple Inc.",
    "ticker": "AAPL",
    "entity_type": "company",
    "sic_description": "Electronic Computers",
    "state_of_incorporation": "CA",
    "fiscal_year_end": "0930"
  }
}

GET /v1/companies/{cik}/filings#

Tier: Free

Get filings for a specific company with optional form type filter.

ParameterTypeDescription
cikstring (path)Company CIK number
pageinteger (default 1)Page number
limitinteger (default 20, max 100)Results per page
form_typestringFilter by form type (e.g. 10-K, 8-K)
curl "https://api.edgar.tools/v1/companies/0000320193/filings?form_type=10-K&limit=5" \
  -H "Authorization: Bearer etk_your_key_here"
{
  "filings": [
    {
      "accession_number": "0001628280-24-123456",
      "form": "10-K",
      "filing_date": "2024-03-15",
      "acceptance_datetime": "2024-03-15T16:30:00Z",
      "description": "Annual Report",
      "size": 1024000,
      "items": ["1.01", "2.02"]
    }
  ],
  "pagination": { "page": 1, "limit": 20, "total": 1, "has_more": false },
  "filters": { "form_type": "10-K" },
  "company_cik": "0000320193"
}

GET /v1/subsets#

Tier: Professional

Get available company subsets — curated collections like S&P 500 or Fama-French industry buckets.

curl "https://api.edgar.tools/v1/subsets" \
  -H "Authorization: Bearer etk_your_key_here"
{
  "subsets": [
    {
      "name": "sp500",
      "display_name": "S&P 500",
      "description": "Standard & Poor's 500 index constituents",
      "company_count": 503,
      "tier_required": "professional",
      "tags": ["index", "large-cap"]
    }
  ],
  "user_tier": "professional"
}

GET /v1/subsets/{subset_name}#

Tier: Professional

Get companies in a specific subset.

ParameterTypeDescription
subset_namestring (path)Subset identifier (e.g. sp500)
curl "https://api.edgar.tools/v1/subsets/sp500" \
  -H "Authorization: Bearer etk_your_key_here"
{
  "subset_name": "sp500",
  "companies": [
    {
      "cik": "0000320193",
      "name": "Apple Inc.",
      "ticker": "AAPL",
      "sic_description": "Electronic Computers"
    }
  ],
  "total": 503
}

GET /v1/exchanges#

Tier: Professional

Get the list of available stock exchanges.

curl "https://api.edgar.tools/v1/exchanges" \
  -H "Authorization: Bearer etk_your_key_here"
{
  "exchanges": [
    { "code": "NASDAQ", "name": "NASDAQ", "country": "US" },
    { "code": "NYSE", "name": "New York Stock Exchange", "country": "US" },
    { "code": "AMEX", "name": "American Stock Exchange", "country": "US" }
  ],
  "total": 3
}

GET /v1/exchanges/{exchange}/companies#

Tier: Professional

Get companies listed on a specific exchange.

ParameterTypeDescription
exchangestring (path)Exchange code (e.g. NASDAQ)
limitinteger (default 20, max 100)Max results
curl "https://api.edgar.tools/v1/exchanges/NASDAQ/companies?limit=10" \
  -H "Authorization: Bearer etk_your_key_here"
{
  "exchange": "NASDAQ",
  "companies": [
    {
      "cik": "0000320193",
      "name": "Apple Inc.",
      "ticker": "AAPL",
      "sic_description": "Electronic Computers"
    }
  ],
  "total": 50,
  "limit": 20
}

GET /v1/sectors#

Tier: Professional

Get the list of available industry sectors.

curl "https://api.edgar.tools/v1/sectors" \
  -H "Authorization: Bearer etk_your_key_here"
{
  "sectors": [
    { "code": "technology", "name": "Technology", "description": "Software, hardware, and tech services" },
    { "code": "healthcare", "name": "Healthcare", "description": "Pharmaceuticals, biotechnology, and medical devices" }
  ],
  "total": 11
}