Products
Public Filings
Access SEC EDGAR filing index and structured extracts for any ticker. Get filing metadata, balance-sheet / cash-flow summaries, and shares-outstanding trends from SEC filings (10-K, 10-Q, 8-K, S-1, etc.).
What's inside
This product delivers two complementary endpoints:
Filing Index (/api/): browse a company's filing history with filing date, form type, accession number and links to the filing on EDGAR. The index is read from SEC EDGAR first, and every answer says which source served it and how current it is. It lists every form type filed under the company, including ownership forms such as Form 4, so pass form_type to narrow it. See Where the index comes from.
Filing Extract (/api/): structured extracts from the most recent SEC filing of a given type (10-K, 10-Q or 8-K). Returns balance-sheet summary (assets, liabilities, equity, cash), cash-flow summary (operating, investing and financing cash flow, plus a free-cash-flow proxy, with the period it covers), shares outstanding (basic, diluted, 4Q trend), filing date, filing URL, accession number and the filing's index page, from SEC EDGAR's XBRL data. It also serves the filing's own narrative sections (risk factors, MD&A, market risk, business, subsequent events), verbatim from the filing's documents on EDGAR and paged on request. See Narrative sections.
Access
1 credit/call. Unlocked in Free and up (public_filings).
Endpoints
| Method | Path | MCP tool | Description |
|---|---|---|---|
| GET | /api/ | fundamentals_ | SEC filings index (10-K / 10-Q / 8-K / S-1 / …) for one company, newest first. ticker (string, required). form_type (string, optional), such as 10-K. limit (integer, 1 to 200, default 20). Returns {ticker, form_, plus the fields below when they apply. |
| GET | /api/ | sec_filing_extract | Structured extracts from the most recent filing of filing_type (10-K, 10-Q or 8-K), plus its narrative sections. sections (string, optional): comma list of risk_factors, mda_discussion, quantitative_, business, material_, or all; text is returned only for the sections named. max_chars (integer, 1000 to 60000, default 12000): characters of text per named section. offset (integer, default 0): character offset into the one section named in sections. The XBRL figures are cached for up to 24 hours, so a new filing can take up to a day to appear. |
Where the index comes from
The index reads the company's filings from SEC EDGAR, the source of record. When EDGAR cannot answer, it falls back to a third-party filings index that has run weeks behind EDGAR, and the answer says so. Read source before you rely on the list:
source | What it means |
|---|---|
sec-edgar | EDGAR's own filing list. is_stale is false whenever there are items: an old newest filing means nothing newer was filed. |
vendor:filings-index | The fallback index. fallback_reason says why: EDGAR's error kind (for example timeout or rate_limited), or edgar_listed_none when EDGAR answered but listed none of these filings. staleness_note explains what may be missing. |
null | EDGAR could not answer and the fallback returned no filings. items is empty; vendor_error says what failed when there was an error. |
The other fields:
newest_item_dateis the newestfiling_dateinitems.is_staleon a fallback answer istruewhen its newest filing is more than 14 days old, so newer filings may be missing. With aform_typefilter it isnull: a company files a 10-K once a year, so one form's newest date cannot measure the index's lag.is_partialistruewhen EDGAR returned fewer filings thanlimitbecause only part of a heavy filer's history was read.searched_back_togives the oldest filing date that was read,partial_notesays so in words, and older filings may exist. It isnullon a fallback answer.accepted_dateis the SEC acceptance time as Eastern wall-clock time with no offset.accepted_date_timezonenames that zone:America/New_York.filing_dateis the filing date at midnight, with no zone.- On EDGAR rows,
cikis the company's CIK.urlis the filing's index page andreport_urlits primary document, both under the company's folder in the EDGAR archive.
An EDGAR answer is cached for up to 5 minutes and a fallback answer for 1 minute, so a new filing can take up to about 10 minutes to appear after EDGAR lists it.
Narrative sections
text_sections holds the filing's own narrative sections, with the text verbatim from the filing:
| Key | 10-K | 10-Q |
|---|---|---|
business | Item 1 | not_applicable |
risk_factors | Item 1A | Part II Item 1A |
mda_discussion | Item 7 | Part I Item 2 |
quantitative_ | Item 7A | Part I Item 3 |
material_ | The Subsequent Events note to the financial statements | Same |
An 8-K has none of them: every section is not_applicable, and its text is in the filing at filing_url.
Text comes only with sections. Without it, no document is read: each section carries its status, heading and chars_total when an earlier call has read the filing, or available_on_request when none has, and text is null. Call again with sections=<name> (or sections=all) to read the text. Asking for sections does not change the price.
Each section object has status, heading (up to 120 characters, or null), text, chars_total, offset, chars_returned, truncated and next_offset (null unless truncated). Depending on the case it adds document_url (the text lives in another document of the filing, such as an Exhibit 13 annual report), points_to, reference (the filing's own pointer sentence) and note.
status | Meaning |
|---|---|
extracted | The section's text, including text read from the pages or the cross-reference index a 10-K points to, or from its Exhibit 13 annual report. |
no_material_changes | A 10-Q item that says nothing changed since the 10-K. The text is that statement. |
incorporated_ | The text is the filing's pointer to where the section is; points_to is annual_report_exhibit, annual_report_10k (a 10-Q pointing to the 10-K), same_filing or other_document. |
not_found | Not located in this filing. Most filings have no Subsequent Events note. |
not_applicable | The form has no such item, or the item says it does not apply (a smaller reporting company's market-risk item, for example). |
source_unavailable | The document could not be read on this call. Retry after about 2 minutes, or read the filing at filing_url. |
available_on_request | Not read yet: call with sections. |
text_sections._status sums up the sections you asked for (or all of them): extracted, partial, not_extracted or available_on_request. When a section is missing, text_sections.note says what to do, for example read the 10-K for a 10-Q that points to it.
Paging. A section longer than max_chars comes back with truncated: true and next_offset. Call again with that one section in sections and offset=<next_offset>. The cut falls at a paragraph, sentence or word, so chars_returned can be a little under max_chars. Paragraphs are separated by a blank line and table cells by |; page numbers and running headers are removed.
Other fields.
accession_index_urlis this filing's own index page on EDGAR, listing every document and exhibit it contains.cash_gives the period of the cash flows:flow_ summary.period start,end,monthsandbasis, which isfiscal_yearoryear_to_date. A 10-Q's cash flows are year to date: NVDA's second-quarter 10-Q covers six months.shares_holds one diluted share count per quarter end, the three-month figure, each with itsoutstanding.diluted_ trend_ 4q start. A quarter end used to appear twice, once for the quarter and once for the year to date.
Errors. An unsupported filing_type is 400 unsupported_, an unknown section name 400 unsupported_section, and a non-zero offset without exactly one section 400 offset_. max_chars or offset out of range is 422. When SEC EDGAR cannot be read, the route answers 503 with error: "upstream_. None of these is billed. A ticker SEC does not list, or a company with no filing of that type, answers 200 with error: "ticker_ or "no_filing_found".
Examples
Bash / curl: fetch the last 10 filings for AAPL, then extract the latest 10-K:
export WEALTHNOW_API_KEY="wn_..." # Index: list recent 10-K filingscurl -H "Authorization: Bearer $WEALTHNOW_API_KEY" \ "https://firm.wealthnow.io/api/v3/fundamentals/sec_filings?ticker=AAPL&form_type=10-K&limit=10" # Extract: get the latest 10-K filing summarycurl -H "Authorization: Bearer $WEALTHNOW_API_KEY" \ "https://firm.wealthnow.io/api/v3/sec/filing/AAPL/10-K"Illustrative response to GET /, built from EDGAR's AAPL filing list on 2026-09-24. It is not a live capture of this route:
{ "ok": true, "timestamp": "2026-09-24T22:00:00+00:00", "ticker": "AAPL", "form_type": "10-K", "items": [ { "ticker": "AAPL", "filing_date": "2025-10-31 00:00:00", "accepted_date": "2025-10-31 06:01:26", "form_type": "10-K", "cik": "320193", "url": "https://www.sec.gov/Archives/edgar/data/320193/000032019325000079/0000320193-25-000079-index.htm", "report_url": "https://www.sec.gov/Archives/edgar/data/320193/000032019325000079/aapl-20250927.htm", "accession_number": "0000320193-25-000079" } ], "source": "sec-edgar", "newest_item_date": "2025-10-31", "is_stale": false, "is_partial": false, "accepted_date_timezone": "America/New_York"}Extract response to GET /, from a capture of 2026-09-23, abbreviated and shown with the fields added on 2026-09-29 (their values elided):
{ "ok": true, "ticker": "AAPL", "filing_type": "10-K", "cik": "0000320193", "filing_date": "2025-10-31", "accession_number": "0000320193-25-000079", "filing_url": "https://www.sec.gov/Archives/edgar/data/320193/000032019325000079/aapl-20250927.htm", "accession_index_url": "https://www.sec.gov/Archives/edgar/data/320193/000032019325000079/0000320193-25-000079-index.htm", "balance_sheet_summary": { "as_of": "2026-06-27", "total_assets": 383266000000, "total_liabilities": 275746000000, "stockholders_equity": 107520000000, "cash_and_equivalents": 39544000000 }, "cash_flow_summary": { "operating_cf": 116996000000, "investing_cf": -18811000000, "financing_cf": -94575000000, "free_cash_flow_proxy": 98185000000, "period": { "start": "...", "end": "...", "months": "...", "basis": "..." } }, "shares_outstanding": { "basic_latest": 14656110000, "diluted_latest": 14714676000, "diluted_trend_4q": [ { "start": "...", "end": "2026-03-28", "val": 14768115000 } ] }, "text_sections": { "_status": "available_on_request", "risk_factors": { "status": "available_on_request", "heading": null, "text": null, "chars_total": 0, "offset": 0, "chars_returned": 0, "truncated": false, "next_offset": null, "note": "Text available with sections=risk_factors." }, "...": "business, mda_discussion, quantitative_market_risk and material_subsequent_events have the same shape" }, "data_freshness": "2025-10-31", "source": "SEC EDGAR JSON API (data.sec.gov)"}The summaries are not guaranteed to come from the filing you asked for. balance_sheet_summary carries its own as_of: in this capture the 10-K was filed on 2025-10-31, but balance_ is 2026-06-27, so check it before labelling the figures as the 10-K's. cash_ says which period the cash flows cover (basis fiscal_year or year_to_date), so check it the same way before labelling the figures as the 10-K's.
free_cash_flow_proxy is operating cash flow minus the absolute value of total investing cash flow (in this capture, 116,996,000,000 minus 18,811,000,000 is 98,185,000,000), not operating cash flow minus capital expenditure. Acquisitions and purchases of securities pull it down, so it can sit far below conventional free cash flow, or below zero. For free cash flow as operating cash flow minus capital expenditure, use free_cash_flow from the cash-flow statements on Fundamentals.
Python / requests:
import os, requests FIRM_BASE = "https://firm.wealthnow.io"KEY = os.environ["WEALTHNOW_API_KEY"]headers = {"Authorization": f"Bearer {KEY}"} # Index: list filingsresp = requests.get( f"{FIRM_BASE}/api/v3/fundamentals/sec_filings", params={"ticker": "AAPL", "limit": 10}, headers=headers, timeout=30,)resp.raise_for_status()data = resp.json() # {"ok": true, "timestamp": "...", "ticker": "AAPL", "form_type": null, "items": [...], "source": "sec-edgar", ...}print(f"Found {len(data['items'])} filings from {data['source']}")if data.get("is_stale") or data.get("is_partial"): print(data.get("staleness_note") or data.get("partial_note"))for filing in data["items"][:3]: print(f" {filing['filing_date'][:10]} {filing['form_type']} {filing['accession_number']}") # Extract: get filing summaryresp = requests.get( f"{FIRM_BASE}/api/v3/sec/filing/AAPL/10-K", headers=headers, timeout=30,)resp.raise_for_status()extract = resp.json() # {"ok": true, "timestamp": "...", "balance_sheet_summary": {...}, ...}print(f"Filing date: {extract.get('filing_date')}")print(f"Assets: ${extract['balance_sheet_summary'].get('total_assets'):,.0f}")print(f"FCF proxy: ${extract['cash_flow_summary'].get('free_cash_flow_proxy'):,.0f}") # Narrative: read the risk factors, page by pageparams = {"sections": "risk_factors", "max_chars": 20000}while True: resp = requests.get(f"{FIRM_BASE}/api/v3/sec/filing/AAPL/10-K", params=params, headers=headers, timeout=60) resp.raise_for_status() rf = resp.json()["text_sections"]["risk_factors"] if rf["status"] not in ("extracted", "no_material_changes", "incorporated_by_reference"): print(rf["status"], resp.json()["text_sections"].get("note")) break print(rf["text"]) if not rf["truncated"]: break params["offset"] = rf["next_offset"]