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.
| Parameter | Type | Description |
|---|---|---|
q | string (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:
| Syntax | Example | Meaning |
|---|---|---|
| Phrase quotes | "material weakness" | Exact phrase match |
| Boolean | revenue OR earnings, gas NOT renewable | OR / NOT (AND is implicit between bare terms) |
| Proximity | NEAR(revenue, decline, 5) | Two terms within N tokens of each other |
| Suffix wildcard | gas* | Prefix-match — matches gas, gases, gasoline, etc. |
Form codes are case-sensitive when used as terms (10-K, not 10-k).
Parameters#
| Parameter | Type | Description |
|---|---|---|
q | string | Search query. Required if no forms/ciks/locations provided |
forms | string (CSV) | Filter by SEC form types (e.g. 10-K,8-K) |
ciks | string (CSV) | Filter by company CIKs (zero-padding optional) |
date_from | string (YYYY-MM-DD) | Start date (inclusive). Omitting both date_from and date_to applies a default window — see Default date window |
date_to | string (YYYY-MM-DD) | End date (inclusive) |
locations | string (CSV) | State/country codes (e.g. CA,NY,UK) |
location_type | string | located (HQ) or incorporated — only meaningful with locations |
items | string (CSV) | 8-K item codes (e.g. 2.02,5.02) — only meaningful with forms=8-K |
sort | string (default relevance) | relevance (match score blended with recency), recent (newest first), or oldest |
expand | bool (default true) | Widen a colloquial q into the filing-language phrases it maps to — see Query expansion. Set expand=0 for a literal search |
understand | bool (default true) | Lift form/item codes out of the q text into filters (apple 10-K → forms=10-K, q=apple) — see Query understanding. Set understand=0 to search the raw text. Ignored when you pass explicit forms/ciks/items |
from | int (default 0) | Pagination offset. Bounded by your tier's result cap |
size | int (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.
| Tier | Max paginated results (from + size) |
|---|---|
| Professional | 500 |
| Analyst | 1,000 |
| Enterprise | 10,000 (EFTS hard cap) |
Free tier returns 403 insufficient_tier at the route — full-text search is Pro+.
Errors#
| Status | Code | Cause |
|---|---|---|
| 400 | missing_query | None of q / forms / ciks / locations provided |
| 400 | invalid_param | Malformed date_from / date_to / from / size / location_type / sort |
| 400 | invalid_query | EFTS rejected the query syntax — usually a malformed NEAR() or unbalanced quotes |
| 403 | insufficient_tier | Free tier — upgrade to Professional or above |
| 429 | upstream_rate_limited | SEC EDGAR rate-limited us; retry after a short pause |
| 502 | upstream_error | SEC 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.
| Parameter | Type | Description |
|---|---|---|
identifier | string (path) | Company ticker or CIK |
q | string (required, max 200 chars) | Phrase to search for |
form | string | Filter to 10-K or 10-Q |
year | integer | Filter to a fiscal year |
max_results | integer (default 10, range 1–25) | Max matches to return |
proximity | integer or none (default 1000) | Max character distance between matched terms |
min_novelty | float (0.0–1.0) | Only return passages at or above this novelty score |
diff_only | boolean (default false) | Only return passages that changed from a prior year |
diff_base_year | integer | Prior 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#
| Status | Code (error_code) | Cause |
|---|---|---|
| 400 | INVALID_QUERY | Missing or over-length q |
| 400 | INVALID_PARAMETER | Malformed form / year / max_results / proximity / min_novelty / diff_only |
| 404 | COMPANY_NOT_FOUND | The identifier didn't resolve to a company |
| 404 | DATA_NOT_AVAILABLE | No disclosure data on file for the company |
| 500 | INTERNAL_ERROR | Unexpected search-engine failure |
GET /v1/companies#
Tier: Free
List companies with optional sector and exchange filters.
| Parameter | Type | Description |
|---|---|---|
page | integer (default 1) | Page number |
limit | integer (default 20, max 100) | Results per page |
sector | string | Filter by sector code |
exchange | string | Filter 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.
| Parameter | Type | Description |
|---|---|---|
cik | string (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.
| Parameter | Type | Description |
|---|---|---|
cik | string (path) | Company CIK number |
page | integer (default 1) | Page number |
limit | integer (default 20, max 100) | Results per page |
form_type | string | Filter 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.
| Parameter | Type | Description |
|---|---|---|
subset_name | string (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.
| Parameter | Type | Description |
|---|---|---|
exchange | string (path) | Exchange code (e.g. NASDAQ) |
limit | integer (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
}