Full-text search across filing exhibits
Full-text search across SEC EDGAR filing content, websearch syntax ("quoted phrase", OR, -exclude), one match per filing, newest first or ranked (sort=relevance). Quote a multi-word phrase — unquoted words match anywhere in the filing. A request scoped to a CIK / filing / accession whose text is not yet indexed is answered by a bounded substring scan instead (engine: substring, pattern matched literally). Returns matching snippets with surrounding context for each hit — useful for locating specific clauses like "right of first refusal" or "change of control". Optionally narrow by company (CIK), filing, accession number, or form type.
Credit cost: 5
Request
- Base URL: https://api.signal8.ai/api/v1/public
- URL: https://api.signal8.ai/api/v1/public/edgar/search-text
- Auth: API key in header X-Api-Key
Query parameters
Search query (minimum 2 characters, max 500 upstream). Syntax: unquoted words must ALL appear; "quoted phrase" = exact wording; OR between alternatives; -word / -"phrase" to exclude; w1 NEAR/10 w2 (also NEAR(10), bare NEAR = 10) = words close together; word* = prefix of 4+ letters; $AAPL or a capitalised ticker scopes to that company; a form code (8-K), item 5.02 / 8-K 1.05 and a bare year (2024) scope to that form / 8-K item / year.
Query understanding (tickers, form codes, item numbers, synonyms), reported in meta.understanding. false = match the words literally.
true = also return top-level facets { forms, years, items } over the whole match set, when measured (absent otherwise — never zero).
Restrict MATCHING to sections (comma-separated; needs q): business, risk_factors, cybersecurity, legal_proceedings, mdna, market_risk, controls (10-K / 10-Q / 20-F narrative items, by meaning), ex99 (press-release / EX-99.x exhibit text), item_X_YY (the text under an 8-K item, e.g. item_5_02). Aliases: mda, risk, legal, cyber, press_release, 5.02. An unknown name is a 400. Applied only when meta.sections names it; otherwise meta.unsupported carries { param: section, reason } (mapping_v1, postgres, substring, not-reported) and matches may come from anywhere in the filing.
Keep filings carrying ANY of these exhibit types (comma-separated). A family (EX-10 = material contracts) matches every member; an exact type (EX-99.1) only itself; 10.1 is accepted for EX-10.1. Others: EX-97 clawback policy, EX-3 charter / bylaws, EX-4 instruments / warrants, EX-21 subsidiaries, EX-23 consents. Invalid ⇒ 400. Listed in appliedFilters only when the returned rows prove it; otherwise in ignoredFilters and meta.unsupported (not-verified) — treat the rows as unfiltered then.
Per-row matchedSections (the sections the text matched in). Absent on a row ⇒ not measured (an index without sections), never "matched nowhere".
Filter to a specific company by CIK.
Filter to a specific filing by internal ID.
Filter to a specific filing by SEC accession number.
Filter by form type (e.g. "10-K", "S-1").
Max results (default: 20, max: 100).
Characters of context around each match (default: 200).
Result order: newest (default) or relevance (best match first). Any other value is a 400.
Word matching. exact = a word matches only itself ("split" does NOT match "splits"); stemmed = English word variations also match. Omitted ⇒ stemmed. The applied mode is reported in meta.matchMode.
Response
Matching snippets with context. meta (engine, applied matchMode, matchModeFallbackReason) is added when the archive states it; otherwise the body is { data } as before. With section, meta.sections confirms the restriction or meta.unsupported says why it was not applied; matches may carry matchedSections (absent ⇒ not measured). Matches carry no exhibit list, so exhibitTypes is reported applied only on evidence that the archive supports it (else meta.unsupported not-verified).
Changes
No recorded changes to this operation across all 1 revision of this API.