Skip to content

v6.0.0

Latest

Choose a tag to compare

@dgunning dgunning released this 09 Nov 19:12
1ce77f9
pip install --upgrade edgartools

6.0 is a major release: Python 3.11 or newer is required, pandas 2.2.2 or newer is required, edgar.files is removed, and a number of fixes return different values. Read the 6.0 upgrade guide before upgrading.

Please report anything that breaks at https://github.com/dgunning/edgartools/issues.

Added

  • Facts follow a ticker to its successor registrant — for 10 reviewed holding-company and redomicile successions (XOM, BG, NWE, FERG and others), get_facts() now includes the predecessor CIK's history, and Company.predecessor reaches it directly. Company("XOM") annual income goes from empty to FY2016–FY2025 (FY2025 revenue $332,238 million) (GH #1821).
  • EFTSResult.accession_no and EFTSResult.filing_date. Full-text search results now answer to the names Filing uses, as read-only aliases of accession_number and a datetime.date parsed from filed. In the README agent eval, every API error on the full-text task (6 of 6) was one of these two names.
  • to_pandas() on EntityFacts, FactsView and both FactQuery classes. It is an alias of to_dataframe() with the same arguments, matching Filings and XBRL. company.get_facts().to_pandas() was the most-invented call in the README agent eval (8 of 19 failing scripts), and the quick guide documented it.
  • edgar_read gained an opt-in limit for 13F-HR holdings. The section stopped at 30 rows and a 6,000-character cap, so a full portfolio could not be read or reconciled to its filed total. limit sets the row count, limit=0 returns every row without the cap, and the default stays 30. (GH #1416)

Changed

  • pandas 2.2.2 or newer is required. The floor rises from 2.0.0 to 2.2.2, the first pandas that runs on numpy 2, and CI now tests that exact version; pandas 3 stays optional. About 1% of uv and 13% of pip pandas installs on Python 3.11+ ran an older 2.x in October 2026. (bead edgartools-b7j4)
  • edgartools no longer installs the GPL-licensed unidecode, or textdistance. Company and BDC name search now transliterate with anyascii (ISC), and SimilaritySearchIndex scores with rapidfuzz's Jaro. Search output is unchanged: the two transliterators agreed on all 141,949 bundled company and ticker names, and the Jaro scores matched exactly on 220,005 pairs. (GH #934, bead edgartools-07lk.7)
  • The bundled ticker table is refreshed from SEC (2026-10-21). company_tickers.parquet goes from 10,365 to 10,443 rows, and 10 tickers that moved to a new registrant now resolve to it offline too, among them XOM (ExxonMobil Holdings Corp, CIK 2115436, was 34088). Online lookups already read SEC's live file first (#1588).
  • edgartools now requires pyrate-limiter>=4.0. It already did in practice, through httpxthrottlecache>=0.6.1; the declared floor was still 3.0, and the 3.x compatibility shim behind it is removed. A burst past SEC's 9 requests per second still waits rather than fails.
  • Schedule 13D/G figures a filing does not report are None, not 0. ReportingPerson's ownership figures and power totals, total_shares/total_percent, and OwnershipComparison.shares_change, percent_change and get_summary() no longer read a missing figure as 0, so a 13D/A omitting the Aadi Bioscience share counts is no longer a 2,435,000-share sale; a reported 0 stays 0, and the 5.x FutureWarning is gone. (bead edgartools-u6tkw)
  • CurrentReport fixture docstring did not explain the SEC-injected script. The 8-K fixture for accession 0000710782-24-000005 retains one bot-defense script alongside its Item 5.02 text; the docstring now explains this response content. The fixture, assertions and library behavior are unchanged. (GH #1589)
  • A blank cell in a filing's R-file table is NaN, not 0.0. Report.to_dataframe() reported every blank cell as zero, which was 45% of parsed cells across six filers' 10-K statements. A blank, N/A or NM is now NaN, and a dash still reads as 0.0. Use .fillna(0.0) for the old frame.
  • FactQuery.to_dataframe() now gives preferred_sign and fiscal_year the same dtype on every query. They are nullable Int64, so an absent value is pd.NA, not NaN. In 5.x they were inferred per query: on Foot Locker's FY2024 10-K, preferred_sign read float64 on the bare query and int64 on the income statement. is_dimensioned is now boolean. Use pd.isna(), not np.isnan(). (GH #1100, bead edgartools-rsyt.2)
  • EntityFacts DataFrames give fiscal_year, is_audited and is_estimated nullable dtypes. company.get_facts().query().to_dataframe() and EntityFacts.to_dataframe() now return Int64 and boolean, the same on every query, where 5.x returned int64/bool but switched to float64/boolean when no returned row had a value. Use pd.isna() to test absence. (bead edgartools-7wtj.1)
  • Failures raise instead of answering None (breaking). report["Item 99"], find() on a malformed accession, obj() on a Form 3/4/5/D/EFFECT with no XML and a failed 10-K parse raise SectionNotFoundError, ValidationError, DataObjectError and ParsingError; network failures raise TransportError. get_financials() on a filing without XBRL returns None, not an empty Financials. EDGARTOOLS_STRICT_ERRORS is gone. (bead 07lk.10)
  • search_filings() returned 0 results for a query EFTS rejected. EFTS answers a failed query with HTTP 200 and an errorMessage body, which was read as an empty search: search_filings("apple", start_date="2024-13-01") showed 0 hits. A malformed date now raises InvalidDateError before any request; any other rejected query raises TransportError with SEC's message, also in resolve_accession(). next() and fetch_more() stop at the 10,000-hit window EFTS pages through. (GH #1497)
  • Breaking: the HTTP client is now httpx2, the maintained fork, instead of the dormant httpx. Unwrapped network errors are httpx2 classes, so except httpx.ReadTimeout: stops catching them; catch TransportError. Certificates verify against the OS trust store, not certifi, and the logger is httpx2. All 263 cassette tests replay unchanged. See the 6.0 upgrade guide. (GH #842, bead edgartools-q2iz)
  • EdgarTools now requires Python 3.11 or newer. Python 3.10 reaches end of life on 2026-10-31 and was about 3.8% of downloads over 180 days; the package now declares Requires-Python: >=3.11, so pip install -U edgartools on 3.10 resolves to the last 5.x release instead of installing 6.0. The pandas floor is unchanged. See docs/upgrade/6.0.md. (GH #938, bead edgartools-89ra)

Removed

  • The flat edgar.offerings.* module paths are removed. The 16 stubs left when the offerings parsers moved into crowdfunding, exempt and prospectus in 5.40.0 never warned, and import edgar.offerings.formd now raises ModuleNotFoundError. from edgar.offerings import FormD and filing.obj() are unaffected; docs/upgrade/6.0.md has the path table and a one-line rewrite. (edgartools-07lk.22.2)
  • edgar.documents.migration and edgar.documents.extractors.heading_section_detector are removed. Nothing in the library used either: the first imitated the old SECHTMLParser on top of the new parser, and the second was a section detector no code called. Use edgar.documents.HTMLParser or parse_html(); the 6.0 upgrade guide lists both.
  • The 25 top-level names outside edgar.__all__ are private. They include set_data_directory, get_obj_info and stdlib names like Optional that leaked in through annotation imports. from edgar import X now raises ImportError, and edgar.X names the replacement. Import them from their modules (edgar.paths, edgar.entity, typing) or use Filing.obj_type.
  • edgar.core no longer re-exports the settings and identity names. get_identity, set_identity, EdgarSettings, get_edgar_data_directory and the rest of edgar.settings import only from there (or from edgar for the names it exposes); from edgar.core import get_identity raises ImportError. (bead edgartools-07lk.22.1)
  • include_dimensions is removed from statement rendering. The Financials and xbrl.statements statement methods, Statement.render() and Statement.to_dataframe() warned about it since 5.8.0 and now raise TypeError; use view='detailed' for True and view='standard' for False. CurrentPeriodView and stitched statements keep theirs. (GH #574, bead edgartools-07lk.22.1)
  • cashflow_statement() and cash_flow() removed. The 5.x deprecated spellings are gone from Company, Financials, EntityFacts, Statements and CurrentPeriodView; calling them raises AttributeError. Use cash_flow_statement(), see the 6.0 upgrade guide. (bead edgartools-07lk.22.1)
  • edgar.core.Result is removed. The success/failure wrapper was never returned by anything in edgartools, and from edgar.core import Result now raises ImportError. It was documented as deprecated but never warned. (bead edgartools-07lk.22.1)
  • The deprecated access modes are removed. NORMAL, CAUTION, CRAWL and edgar_mode now raise ImportError, and EDGAR_ACCESS_MODE is no longer read or warned about; it never affected the HTTP client. Use EDGAR_RATE_LIMIT_PER_SEC and EDGAR_HTTP_TIMEOUT. (GH #1326, bead edgartools-07lk.22.1)
  • period_length removed from the EntityFacts statements. income_statement() and cash_flow_statement() no longer accept period_length, by keyword or by position; passing it raises TypeError. Use period='quarterly' or period='annual' instead (bead edgartools-07lk.22.1).
  • edgar.core no longer re-exports the date helpers. filing_date_to_year_quarters, current_year_and_quarter, is_start_of_quarter and parse_acceptance_datetime now import only from edgar.dates; the old path raises ImportError. (bead edgartools-07lk.22.1)
  • edgar.effect and edgar.form144 are removed. They forwarded to edgar.offerings.effect and edgar.ownership.form144 with a DeprecationWarning since 5.55.0, and now raise ModuleNotFoundError. from edgar import Form144 and filing.obj() are unaffected. (bead edgartools-07lk.22.1)
  • Seven deprecated exception names are removed. StatementNotFound, NoCompanyFactsFound, SECFilingNotFoundError, InvalidDateException, IdentityNotSetException, TooManyRequestsException and DataObjectException warned throughout 5.x and now raise ImportError. The replacements in edgar.exceptions have existed since 5.48.0. (GH #933, bead edgartools-07lk.10)
  • beautifulsoup4 is no longer installed. Every parser runs on lxml, so 6.0 drops beautifulsoup4 and soupsieve from the install; no edgar module imports bs4. edgar.xmltools returns lxml elements only, and passing a BeautifulSoup to FilingHomepage or Attachments.load (deprecated through 5.x) now raises TypeError naming parse_homepage_html. See the 6.0 upgrade guide. (GH #931)
  • The legacy edgar.files parser, ChunkedDocument and the page-break options are removed. 7,844 lines go; Attachment.text() and 8-K exhibit text, which still reached the old parser silently, now read the same as Filing.text(), losing no words over 82 real filings except page headers and long table-cell tails. See the 6.0 upgrade guide. (GH #930, #870, bead edgartools-07lk.3)

Fixed

  • A BDC affiliation line tagged under two members no longer inflates the non-accrual denominator. SLR HC BDC tags its $96,665K of non-affiliated investments under its own member and the us-gaap one, so 6.0.0rc1 read its 2026-06-30 portfolio as $193,330K and its rate as 1.63%; it now reads 3.27%. Across 351 BDCs' latest filings, 9 totals from 6 filers fall to the filed figure. (bead edgartools-m4qnb)
  • extract_nonaccrual() labelled a result with another period than the filing's. With no investment facts at the period, it fell back to other dates in the filing: Ares Capital's cover-page 10-K/A for 2025-12-31 came back as 2025-06-30, its public-float date. A period given, or the filing's own period, is now read as given, and a filing with no data there returns no rate. (bead edgartools-a3m66)
  • A BDC's non-accrual rate uses the grand total it tags as a schedule row. With no balance-sheet total, the schedule's rows were summed with their subtotals; Oxford Square's 2026-03-31 total read $1.30B against its $235.4M "Investments in Securities", so the rate read 0.67% instead of 3.7%. Such a total is now used, with total_source='identifier_total'. (bead edgartools-cpd1b)
  • BDC non-accrual footnotes that were not about their holding flagged every linked investment. Policy notes, portfolio-level counts and bundles of numbered notes counted as non-accrual markers, so Runway Growth's 2026-09-30 rate read 98.8%. A footnote now flags only when it says its own holding is on non-accrual; across 830 filings this drops $4.21B of false flags and keeps all 319 genuine marker texts. (bead edgartools-t75ot)
  • BDC non-accruals no longer count a holding listed in two schedules twice. Logan Ridge's FY2024 10-K flags MMI Holdings in its schedule and again under "Affiliate investments", so its non-accruals read $10.86M; they now read $7.94M, the filing's $7.9M and 4.6%. Flagged rows go through the restated-row rule PortfolioInvestments already applies. (bead edgartools-wg5n8)
  • An XBRL fraction fact was read as its digits joined. Numerator 1 and denominator 3 (xbrli:fractionItemType) parsed as value='13' and numeric_value=13.0. Terminating quotients are now exact, and a recurring one such as one third is rounded half-even to 50 significant digits, while decimals stays INF (the source precision). (GH #1766)
  • BDC non-accruals were missed when the schedule of investments was not tagged on InvestmentIdentifierAxis. extract_nonaccrual() returned no rate for filers that name a holding by several axes; TriplePoint's FY2024 10-K now reads 8 non-accrual loans worth $20.6M, matching its footnote. Roll-ups linked to the same footnote are dropped, and a balance sheet split into affiliation lines gives the total. (bead edgartools-jv32z)
  • xbrl.footnotes was empty when SEC's extracted instance dropped the footnote links. Footnotes are now read from the inline document's ix:footnote and ix:relationship elements, on first use and only when the instance has none. Great Elm Capital's FY2024 10-K (0000950170-25-036517) goes from 0 to 56 footnotes, and extract_nonaccrual now finds New Wilkie Energy's non-accrual loan ($1,322,000 fair value).
  • BDC non-accrual rates were too low because the portfolio total counted subtotals. extract_nonaccrual() added up every schedule row, including the "Total Investments" and lien or country subtotals many BDCs tag there; Main Street's FY2024 rate read 0.58% instead of 0.92%. The rate now uses the balance-sheet total, and NonAccrualResult.total_source says where the total came from. (bead edgartools-7vl3h)
  • 52/53-week filers got the wrong fiscal year on XBRL facts, and EntityFacts dropped a year. A prior year that closed a day later in the month was labelled a year ahead, so Sprouts' FY2021 10-K put both of its years in 2022 and by_fiscal_year(2021) missed its $244.2M net income; Apple, Intel and Costco comparatives drifted the same way. Annual EntityFacts statements also lost SFM's FY2022, which ended 2023-01-01. (GH #1802)
  • A line the company retagged between filings stitched as two half-empty rows. Sprouts moved cash-flow net income from ProfitLoss to NetIncomeLoss and its lease lines from sfm: to us-gaap tags, so five years of net income ($244.2M to $523.7M) split across two rows. Rows with the same label and no period in common now merge when a filing's comparatives show both tags carrying the same nonzero amount. (GH #1802)
  • edgar_ownership insiders dropped option exercises behind a run of sales. Each Form 4 entry kept its first five trades, and sales are listed first, so Tesla director Kathleen Wilson-Thompson's 0001104659-26-055079 lost its exercise of 40,948 options at $14.99 behind 16 sale lines. Entries now keep up to 25 trades and report transaction_total, transactions_truncated and form (4 or 4/A). (GH #1817)
  • edgar_ownership insiders returned no insider, role or trades, and ignored days. Every entry held only a date and accession because the tool read Form 4 attributes that do not exist; it now reports the insider, title, officer/director flags and transactions (NVIDIA CFO Colette Kress, 0001588670-26-000014: open-market sale of 20,369 shares at $219.0172), and days bounds the filing date. (GH #1817)
  • Retired tickers resolve again — Company("EQR") returns CIK 906107 (now Vivmark Residential) instead of raising CompanyNotFoundError. A reviewed table answers only after every current ticker map misses, so a reused ticker still goes to its new owner (GH #1829).
  • PortfolioInvestments.from_xbrl() kept subtotals that repeat their one holding. Since #1506 a costed row over a single extending row was always kept, so PhenixFIN's company subtotals counted as holdings (+$289.5M on its Q2 2026 10-Q) and New Mountain's FY2025 10-K counted ACI Parent's preferred twice. Such a row is now excluded when the row under it states the same cost, unless that row adds only a counter. (GH #1583)
  • A utility's total operating revenue is Revenue, not "Electric Utility Revenue". RegulatedAndUnregulatedOperatingRevenue is total operating revenue across electric, gas and water operations; it now maps to Revenue and is a listed member of that total. MGE Energy's Q2 2026 Total Operating Revenues of $161,195K, which includes $29,601K of gas revenue, was ElectricUtilityRevenue and is now Revenue. (#1844)
  • IFRS interest on lease liabilities is InterestExpense, not "Operating Lease Expense". IFRS 16 makes lease-liability interest a finance cost, so InterestExpenseOnLeaseLiabilities now maps like the us-gaap FinanceLeaseInterestExpense. Opera's FY2025 20-F reports $461K of it inside finance expense; it was OperatingLeaseExpense and is now InterestExpense. (#1845)
  • Gross PP&E and accumulated depreciation are no longer "Property, Plant and Equipment" (net). The property-plus-finance-lease, excluding-lessor-asset and owned PP&E elements now map gross balances to GrossPropertyPlantEquipment and accumulated depreciation to AccumulatedDepreciation. American Airlines' FY2025 balance sheet had three net-PP&E rows ($57,732M cost, $(25,192)M accumulated, $32,540M net); only the $32,540M row is net now. (#1856)
  • Income-tax rate reconciliation items are no longer "Income Tax Expense". The 44 IncomeTaxReconciliation* elements and four EffectiveIncomeTaxRateReconciliation*Amount items no longer map to IncomeTaxes; the provision keeps it. Apple's FY2023 reconciliation had six IncomeTaxes rows beside the $16,741M provision, including the $23,885M tax at the statutory rate; only the provision is IncomeTaxes now. (#1857)
  • Legacy text 13F rows keep voting quantities beside a dash. Berkshire Hathaway's Q4 2012 13F-HR (0001193125-13-060317) returned Sole 0 for American Express and filed Washington Post's None 148,311 under Sole. Both now land in the right column; 197 dash rows across 14 filings change and no other row does.
  • 13F comparison and history match Put and Call rows to their own position. compare_holdings() and holding_history() merged on CUSIP alone, so Bank of America's AFLAC (Q2 vs Q3 2024) returned 9 rows instead of 3, and 3M's new Call read as DECREASED. They now key on (Cusip, PutCall) and carry a PutCall column.
  • BDC portfolio DataFrame keeps a filed zero. PortfolioInvestments.to_dataframe() exported a disclosed 0 fair value and principal as NaN; GBDC's 10-Q for 2025-03-31 (0001476765-25-000040) holding "PPW Aero Buyer, Inc., One stop 3" now reads 0.0. An amount the filing omits is still NaN.
  • EntityFacts statements showed pure-ratio percentages 100 times too small. A percentage row appended % to the raw ratio, so Apple's FY2025 effective tax rate of 0.156 (10-K 0000320193-25-000079) displayed as 0.2%; it now displays as 15.6%. Only rows whose unit is pure are scaled, so a dollar row captioned "Gross margin" is unchanged. (GH #1850)
  • EntityFacts pivot_by_period() dropped 13-week quarters of 52/53-week filers. Period labels counted the calendar months a period touched, so Apple's Q2 and Q3 FY2025 were both 6M 2025 and Q3 net income of $23,434,000,000 (10-Q 0000320193-25-000073) vanished. Durations are now classified by days, and two periods that still share a label get separate dated columns. (GH #1851)
  • Network tests inherited a dummy proxy after configure_http() coverage. Cleanup now restores the manager's prior proxy and closes its client. A real-manager probe restored state in 0/3 cases before the fix and 3/3 after, covering default/custom proxies and failed assertions. (GH #1827)
  • NM and N/A table cells export as NaN, not 0.0. TableNode.to_dataframe() and Cell.numeric_value turned "not meaningful" cells into a zero rate; the JPM FY2024 10-K Overhead ratio row now shows NaN for its NM adjustment. Dashes still read as 0.
  • ixt-sec:exchnameen accepts all 21 exchange names in the SEC registry. Ten names, including Cboe BZX Exchange, Inc. in the Fidelity Wise Origin Bitcoin Fund FY2025 10-K, raised TransformError and left display text in Document.xbrl_facts; that fact now returns CboeBZX. NYSE Arca and MIAX PEARL now return the dei codes NYSEArca and PEARL.
  • Balance metadata gave share counts a credit and the operating cash total a debit, which the taxonomy does not declare. The fallback mapping now matches the FASB 2025 us-gaap taxonomy for these and adds CostsAndExpenses as debit; they were the only 3 of its 124 entries that contradicted it. Apple's FY2023 facts no longer show a balance on shares outstanding or operating cash flow. Reported amounts and signs are unchanged. (GH #1728)
  • EntityFacts income statements dropped net income for filers that tag it as ProfitLoss, leaving the noncontrolling interest as the only net income row. Mastercard, Caterpillar, Ford, American Tower and Simon Property Group (5 of 50 companies measured) now show it; Mastercard's FY2025 is the 10-K's $14,968M instead of nothing beside a $21M minority interest. (GH #1823)
  • income_statement(period="ttm") raised "found 1 quarters" for e.l.f. Beauty although its revenue has dozens of quarters. Choosing the period columns tried every line item and let the first sparse one (2 facts) fail the whole statement; it now skips a concept it cannot use, as the line-item loop already did. ELF's TTM statement builds, and its fiscal Q4 2026 cost of sales TTM is the 10-K's 479,125,000. (GH #1822)
  • MCP edgar_read read no ownership or purpose section from a Schedule 13D or 13G filed since December 2024. The reader matched only the old SC 13D and SC 13G form names, and purpose returned the object summary instead of Item 4. On BML Investment Partners' SCHEDULE 13D (0001373604-24-000118) purpose now returns Item 4 and ownership reports 2,435,000 shares (9.9%). (GH #1820)
  • XBRL.from_directory() was slow on filings with many footnote relationships. GBDC's March 2025 10-Q (0001476765-25-000040) has 48,629 footnote relationships and 21,393 stored facts. Attachment now indexes fact IDs once per extraction instead of scanning the facts for each relationship, preserving note order and associations. (GH #1771)
  • FactsView.clear_cache() left retained query DataFrames stale. In staged loading of GBDC's March 2025 10-Q (0001476765-25-000040), a cached query omitted the $71,205,000 comparative interest-paid observation after a clear. Existing queries now discard obsolete frames when their own view is cleared. (GH #1811)
  • StitchedFactQuery.to_dataframe() reused rows after period-filter changes. With original observations from GBDC's March 2025 10-Q (0001476765-25-000040), raising across_periods() from two to three retained two rows instead of none. Cache keys now include minimum-period and completeness settings. (GH #1812)
  • StitchedFactQuery.sort_by() changed sibling queries' row order. In a controlled input from GBDC's March 2025 10-Q (0001476765-25-000040), sorting one query made an unrelated limit(1) select $71,205,000 instead of $133,282,000 of interest paid. Sorting now returns a separate list and preserves the owner's order. (GH #1813)
  • edgar.xbrl.facts.FactQuery could disagree with its cached DataFrame after a period-list edit. Appending GBDC's comparative period added its $71,205,000 interest-paid fact to execute() but left it out of the warmed frame. by_period_keys() now captures its keys at call time, including on stitched queries; use a new query for an edited selection. (GBDC March 2025 10-Q, accession 0001476765-25-000040) (GH #1814)
  • A part no longer resolves to a total standard concept. Each of the 28 total concepts now accepts only a fixed list of elements, so 94 parts that still carried one have no standard concept. Cheniere Energy Partners' FY2025 balance sheet had three "Total Stockholders' Equity" rows summing to $828M; only the $414M total partners' equity row remains. (#1444)
  • The IFRS exchange-rate effect on cash is no longer "Net Change in Cash", and ASC 842 lease maturities get commitment concepts. On Opera's FY2025 20-F the $1,944K exchange-rate row was the only NetChangeInCash row; it is now ForeignExchangeEffectOnCash. The six ASC 842 lessee operating-lease maturity elements now feed the OperatingLeaseCommitment* concepts their ASC 840 predecessors use. (#1446)
  • Bulk tar archives with a dir/../file entry extract on every supported Python. Python before 3.11.17 and 3.12.15 failed with FileExistsError on such an entry; the entry name is now normalised before extraction. (GH #1598 follow-up)
  • get_shares_outstanding_basic() and get_shares_outstanding_diluted() read the combined basic-and-diluted weighted-average count and no longer return a period-end share count. Snowflake's FY2021 10-K now gives 141,613,196 for both instead of None; a statement with only CommonStockSharesOutstanding returns None rather than that ending count. (GH #1672)
  • A derived quarter no longer depends on the order of the input facts when a year-to-date period was recast. Snowflake's derived Q4 FY2022 unrealized gain on equity securities was 27,121,000 or 19,106,000 depending on fact order; the latest-filed operand now wins, giving 19,106,000 (recast year minus recast nine months). (GH #1675)
  • Derived Q4 and TTM EPS are no longer missing for filers that tag WeightedAverageNumberOfShareOutstandingBasicAndDiluted. The share lookups used a misspelled element name, so Snowflake's Q4 FY2021 basic and diluted EPS came back empty; they are now -0.70, matching the reported $(0.70). (GH #1686)
  • Split adjustment now covers dividends per share and continuing-operations EPS. Per-share facts with the parsed USD per share unit were skipped unless named EarningsPerShare; NVDA's 0.04 quarterly dividend (10-Q 0001045810-23-000093) now adjusts to 0.004 for the 10-for-1 split (GH #1687).
  • TTM EPS no longer averages the fiscal-year share count in as if it were the fourth quarter's. Snowflake's FY2024 TTM basic EPS was -2.555 against the filed -2.55; a window that is a fiscal year now uses the year's filed count (-2.549), and a missing Q4 count is solved from the year's count and its other quarters, weighted by days. (GH #1691)
  • TTM and derived Q4 EPS now divide income available to common stockholders, not net income. Public Storage's FY2025 TTM basic EPS was 10.17 (net income over shares) against the filed 9.04; it is now 9.04, and diluted 9.01. Net income is used only where the filer's facts do not show it differing. (GH #1692)
  • Quarterly and TTM views no longer derive a quarter by subtraction for monetary concepts whose quarters do not add up to the year. Snowflake's revenue recognized from opening deferred revenue got a derived Q4 FY2025 of 200,000,000 (FY 1.8B minus nine months 1.6B); seven reviewed concepts, including two-class allocations to participating securities, are now excluded from derivation. (GH #1693)
  • TTM income and cash-flow statements printed a ~15-month total under a TTM column when a quarter was missing. Snowflake's Q4 2025 TTM realized gain on equity securities showed 36,832,000 against the -17,414,000 its FY2025 10-K reports; a window of non-consecutive quarters now leaves the cell empty, and calculate_ttm_trend rows carry a has_gaps flag. 52/53-week years (Costco's 16-week Q4) count as consecutive. (GH #1694)
  • TTM no longer sums quarterly per-share earnings, including get_ttm("EarningsPerShare..."). AMC's 2017 TTM continuing-operations basic EPS was -3.75, the sum of its quarters, against the filed -3.80; a fiscal-year window now returns the filed annual amount (Citigroup FY2024: 6.03, with no Q4 quarter), and other windows raise ValidationError. Dividends per share still sum. (GH #1695)
  • A stock split tagged on both its announcement and effective date is now dated by the effective date. Alphabet's 2022 split was dated 2022-02-01, so its FY2021 diluted EPS stayed at the pre-split 112.20 after split adjustment; it is now 5.61, and Q1 2022's 24.62 becomes 1.231. (GH #1696)
  • get_ttm() summed four quarterly weighted-average share counts, so a TTM share count was about four times too large. Snowflake's basic count for the window ending 2023-10-31 came back 1,300,937,000 instead of the 325,234,250 mean; calculate_ttm now averages share counts and rates the way calculate_ttm_trend does. (GH #1698)
  • get_ttm() period labels now use each quarter's own fiscal year. Apple's TTM revenue to 2023-07-01 was labelled [(2022, 'Q4'), (2024, 'Q1'), (2024, 'Q2'), (2024, 'Q3')] because re-filed comparatives carry the later filing's fiscal year; it now reads 2022, 2023, 2023, 2023. A 52/53-week year closing early next month keeps its year (Costco's quarter to 2023-09-03 was FY2024, now FY2023). (GH #1699)
  • TTM diluted EPS for a loss window no longer counts option shares from a profitable quarter. Lyft's TTM diluted EPS to 2024-09-30 was -0.1609, using Q2 2024's diluted count; for a loss window it now uses the basic count (-0.1615), as Lyft's own six- and nine-month figures do. (GH #1782)
  • income_statement() picks the parent's statement over a co-registrant's. In Williams' Q2 2026 10-Q it returned Transco's role, so get_revenue() read $804 million instead of Williams' $3,053 million; a co-registrant's own face statement now ranks below the parent's. (GH #1648)
  • Statement.to_dataframe() signs each row by its own presentation arc. A concept presented twice took its first appearance's sign everywhere, so Chesapeake Utilities' second capital-expenditure line read -141.9 million where render() shows 141.9 million; the two frames now agree. (GH #1657)
  • The standard view drops note breakdowns from statements filed without a hypercube. IFRS filers such as SAP file no definition linkbase for their face statements, so note axes stayed in: SAP's FY2025 cash flow showed 96 rows, 48 of them dimensional. An axis the role's presentation tree does not show is now a breakdown, leaving 42 rows with a 2025 value, as printed. (GH #1670)
  • Company cash-flow view lists dividends paid once. Two tree nodes resolved to the same PaymentsOfDividends fact, so JPMorgan's FY2025 dividends ($16,625 million) appeared twice; a node no longer borrows a fact whose own concept has a row. (GH #1674)
  • Statement rows for us-gaap-supplement concepts are no longer blank. The linkbase names these elements with a us-gaap_ ID while the instance files them under us-gaap-supplement, so Gladstone Investment's FY2023 "Total expenses, net of credits to fees" ($44.5 million) showed no value; the fact is now found under the extending prefix. (GH #1680)
  • Statement rows no longer merge distinct dimension members that share a label. Rows were grouped by display label, so GE's two "GE Capital" members collapsed into one row carrying the wrong amounts (4,461 million instead of 2,028 million); rows are now grouped by axis and member. (GH #1682)
  • Statements no longer add per-share or percentage members into a total. When a concept had only dimensional facts, its plain row summed the members whatever their unit, so Constellation Brands' FY2021 basic EPS read 19.92 (Class A 10.44 plus Class B 9.48); per-share and pure-unit rows are now left blank instead. (GH #1683)
  • Synthesized statement totals no longer add amounts in different currencies, and say when they are a sum. Microsoft's FY2024 debt face-amount row read $104.9 billion, a euro note of EUR 4.1 billion counted as dollars; a mixed-unit axis now gives no total, and a computed sum no longer cites one member's fact as its source. (GH #1689)
  • Synthesized plain rows no longer add a parent-only or note figure to the consolidated one. With no undimensioned fact, the default to_dataframe() view summed every member of the concept, so Deutsche Bank's 2024 operating cash flow read EUR -58,501 million against a filed -28,584 million; plain rows now add only the members the statement itself presents, in every view. (GH #1703)
  • The standard statement view keeps face lines nested under a dimension member. Only a domain's direct children counted as valid members, so Tesla's Automotive sales ($18,530 million in Q2 2024) and the other nested automotive lines were missing from the default render; members at any depth now count, and a synthesized total adds only the outermost members. (GH #1759)
  • Bulk refresh preserves filtered filings and failed rollback data. Two filtered downloads for the same day retain both filings, including compressed files. Failed restoration leaves a reported recovery directory, whilst the next call removes abandoned owned staging without touching active or recovery trees. (GH #1598)
  • CurrencyConverter took exchange rates from other currencies and hedge contracts. It read every rate fact without its dimensions and kept the last one per year, so GSK's FY2025 20-F (0001131399-26-000004) gave a 2025 average of 1.19 (a EUR swap) instead of the filed US$/£ 1.31. Only target-currency facts off hedge axes are used now, and conflicting rates for a year are reported in extraction_warnings instead of guessed. (GH #1650)
  • CurrencyConverter converted in the wrong direction, or 100x off, depending on how a filer quotes its rate. to_usd() always divided by the rate, so GSK's filed US$/£ 1.31 (20-F 0001131399-26-000004) turned GBP 100 into USD 76.34 instead of 131. Each rate is now read the only way that puts it in a plausible band for its currency. A rate that could read either way, with nothing in the filing to decide, gives None and a warning; rate_basis says how each rate was read. (GH #1651)
  • CurrencyConverter returned no closing exchange rates. An instant fact's empty period_end is NaN, which skipped the period_instant fallback, so every closing rate was dropped with no warning. Novo Nordisk's FY2025 20-F (0000353278-26-000012) now gives a 2025 closing rate of 635 DKK per 100 USD instead of None, and a rate fact with no date is reported in extraction_warnings. (GH #1652)
  • CurrencyConverter found no exchange rates in filings whose rate unit has an opaque ID. Units were matched by substrings of their ID, so SAP's Unit_Divide_USD_EUR_... facts were all skipped and exchange_rates was empty with no warning. Units are now read from their numerator and denominator, either way round: SAP's FY2025 20-F (0001104659-26-020058) gives a 2025 average of 1.1293 USD per EUR, so EUR 1,000 converts to USD 1,129.30. (GH #1653)
  • Prospectus424B.shelf_registration no longer returns None depending on header file-number order. File numbers keep header order (was an unordered set), and the lifecycle loads the full filing history when the recent window holds no S-3/F-3/S-1. BofA Finance 424B2 0001918704-25-005439 now finds shelf 0001193125-22-301119 under either number. (GH #1707)
  • extract_nonaccrual(bdc) no longer picks a data-less 10-K/A. It resolves the latest unamended filing (a later amendment with investment data wins), so ARCC fiscal 2025 reads 10-K 0001287750-26-000006 (20 investment records), and a result with no investment data now carries a warning. BDCEntity.get_filings gains amendments. (GH #1713)
  • 10-Q Part I, Item 1 no longer returns the contents page for Donnelley filings whose contents rows carry the item number in a separate cell. The Donnelley contents parser now reads the item from the row text. Tesla's 10-Q 0000950170-23-033872 returns Part I, Item 1 as 65,181 characters (was the 4,395-character contents page) and Items 3 and 4 are found. (GH #1749)
  • EntityFacts.time_series("Assets") returned rows from other concepts. A bare name was matched by substring, so 18 of the 20 rows for Snowflake's Assets came from concepts such as AssetsCurrent and AmortizationOfIntangibleAssets. A bare name or label now selects exactly that concept, as get_fact() does; text that names no concept still falls back to a substring search, with a warning naming the concepts it mixed. (GH #1658)
  • Revenue growth in to_llm_context() and the MCP edgar_compare tool paired unrelated facts. Both took the first two time_series('Revenue') rows whatever their concept, unit or period, so Snowflake's Q1 FY2026 read -17.96% against a filed +25.75%. Growth now compares one concept, unit and period length a year apart, and reports "not available" when no such pair exists. (GH #1671)
  • Company.md, Statement.md and XBRL.md taught 14 calls that raise or return nothing (label lookups on to_dataframe(), Statement.periods, period_filter='2024', equity_statement(), get_filings(count=4)). The pages now use the real API, and a test runs every example on Apple's FY2023 10-K: net sales 383,285 million. (GH #1706)
  • The XBRL AI skill taught calls that raise, return zero rows or filter nothing. xbrl.fiscal_year, statements.names, fact['unit'], unqualified exact=True and fact['period_end'] on instants now use the real API (entity_info, statement_by_type, unit_ref, us-gaap:Assets, period_instant), and a test runs them: Apple FY2023 Assets 352,583 million. (GH #1714)
  • The holdings skill's NEW HOLDINGS amendment recipe returned 40 rows with Lennar listed twice, not the 114 it states. It concatenated the per-filing .holdings frames. It now concatenates .infotable (110 + 4 = 114 entries) and groups by CUSIP and put/call: 39 securities, Lennar CL B once at 152,774 shares. (GH #1715)
  • The ownership skill's "Screen Large Transactions" pattern never printed a large net sale. Its net_change > 10000 test is False for sales; Tim Cook's 191,753-share, $63.8M sale (Form 4 0001140361-26-038674) printed nothing. The pattern now tests abs() and says it covers purchases and sales. (GH #1716)
  • The reports skill's DEF 14A example and the ProxyStatement.sections docstring raised on proxies without a CD&A or governance section. Microsoft's 2025 proxy (0001193125-25-245150) has 4 sections and neither key, so .text() hit None and sections[...] raised KeyError. Both now test before calling .text(). (GH #1717)
  • The holdings skill and docs/common-pitfalls.md called Filings.filter(company=...), which raises TypeError. The 3 examples now filter by cik=1067983, which selects Berkshire Hathaway's 13F-HR 0000950123-24-008740, and a test runs them. (GH #1718)
  • MCP edgar_read returned full_text: null with success: true for 40-F, 424B5, S-4, S-1/A and 6-K filings. The handler indexed the typed object, which has no subscript support for those forms; it now reads the filing's text (HSBC's 6-K gives 2,490 characters), capped at 6,000, and says so when a filing has no text. (GH #1719)
  • MCP edgar_read earnings section returned only "Earnings data available". It called FinancialTable properties as methods and hid the TypeError. It now returns the income statement, balance sheet and cash flow from the release (Apple's 8-K 0000320193-25-000007: net sales 124,300), and names a missing statement as missing. (GH #1720)
  • edgar_company and edgar_trends reported Python's 'NoneType' object has no attribute text when a company has no facts. For Circuit City (CIK 104599) both returned success: true with that text in 4 fields; they now return the documented NO_FACTS_DATA code. (GH #1721)
  • install_skill() and package_skill() left the funds skill out. The three copy lists stopped at financials, holdings, ownership, reports and xbrl, so the symlink install, the copy install and the Desktop ZIP all shipped 0 of the 1 funds/skill.yaml that other installed skill files point to. All three now include it. (GH #1722)
  • test_install_skill_uses_symlinks no longer fails on Windows accounts without the symlink privilege. The test now accepts the documented copy fallback when links cannot be made, and a regression test forces the refusal on every platform and checks that install_skill() copies SKILL.md and financials/. (GH #1723)
  • get_financial_metrics()['debt_to_assets'] had no definition. It is total liabilities over total assets (Apple FY2023: 290,437 / 352,583 = 0.82), not borrowings over assets (0.32), which FormC.debt_to_asset_ratio uses under a similar name. The docstring and the extraction guide now say so; the value is unchanged. (GH #1729)
  • MCP edgar_read press_release section returned the attachments table instead of the release. For Apple's 8-K 0000320193-25-000007 it gave a 480-character Seq/Document/Description table; it now returns the Exhibit 99.1 text ("quarterly revenue of $124.3 billion"), capped at 6,000 characters. (GH #1774)
  • get_stockholders_equity() returned the liabilities-and-equity total, or None, instead of stockholders' equity. American Airlines' FY2025 10-K returned $61.774B, its total assets, for a $3.727B deficit. The getter now reads equity attributable to the parent (US GAAP and IFRS) before total equity, so filers with a noncontrolling interest get a smaller figure than before: Shell's FY2025 is $174.392B, not $175.319B. (GH #1659)
  • get_capital_expenditures() returned accrued, unpaid capital expenditures as capex when the cash capex row is on an unmapped concept. Essential Utilities' six months to 2026-06-30 returned the noncash $148.5M instead of $662.2M of cash additions, so get_free_cash_flow() read +$440.5M instead of -$73.2M; Thor's FY2026 10-K returned $6.3M instead of $152.4M. Affected filers now see the cash capex and a lower free cash flow. (GH #1660)
  • get_current_assets() and get_current_liabilities() returned a narrower company subtotal, or None, instead of the filed current totals. ADP's FY2026 10-K returned $8.603B ("Total current assets before funds held for clients") against a filed $52.561B, so current_ratio read 1.534 instead of 1.051. Both getters now read us-gaap:AssetsCurrent / us-gaap:LiabilitiesCurrent first, so affected filers see larger, filed values. (GH #1661)
  • get_net_income() could return income from continuing operations as net income when its concept lookup missed. The label fallback took a row such as "Net income (loss) from continuing operations" above the bottom line; on the IBM FY2024 fixture with its bottom line moved to an unmapped concept it returned $6,015M instead of $6,023M. Continuing, discontinued and noncontrolling rows are now excluded from the fallback. (GH #1663)
  • get_operating_income() returned pretax income from continuing operations when the filer reports no operating income. IBM's FY2024 10-K returned $5.797B ("Income from continuing operations before income taxes") and now returns None, as documented. The label fallback no longer matches pretax, continuing-operations, "Other operating income" or "Non-operating income" rows, so such filers now get None. (GH #1664)
  • get_revenue() returned None, or one component, for utilities whose operating revenue total is us-gaap:RegulatedAndUnregulatedOperatingRevenue. NextEra's Q2 2026 10-Q now returns $7,534M instead of None, and MGE Energy's returns its $161.2M total instead of its $29.6M "Gas revenue" line. Xcel, Spire, Duke Energy and American Water now return their filed totals too. (GH #1665)
  • get_revenue() returned a bank's deposit service-charge line as total revenue when the statement has no total row. Auburn National's FY2023 10-K returned $603K ("Service charge on deposit accounts") and now returns None, as the bank rule from #1567 intends: a bank-layout statement now reads a filed consolidated us-gaap:Revenues fact or reports nothing, before contract revenue is considered. (GH #1666)
  • get_total_assets() returned the current-assets subtotal when the total row was not labeled "Total assets". NovaGold's 10-Q for 2026-08-31 returned $349.8M instead of the filed $573.3M, which threw off debt_to_assets too. The getter now reads the us-gaap:Assets concept first, as get_total_liabilities() does, and its label fallback no longer matches subtotals. (GH #1667)
  • get_shares_outstanding_basic() and get_shares_outstanding_diluted() returned None when the income statement tags one combined basic-and-diluted count. The us-gaap element WeightedAverageNumberOfShareOutstandingBasicAndDiluted has a singular "Share" that no pattern matched; 10x Genomics' FY2019 10-K now returns 39,091,366 from both getters. (GH #1668)
  • A 10-Q whose dei:DocumentFiscalPeriodFocus is mis-tagged FY got annual periods, so its income and cash-flow getters returned None. BXP's Q2 2026 10-Q now returns revenue $895.7M, net income $68.6M and operating cash flow $602.5M, and its income statement shows the 2026 quarter instead of note-only 2025 columns. The FY tag no longer overrides a quarterly document type. (GH #1678)
  • get_net_income() returned consolidated profit, including the noncontrolling interest's share, when the statement has no NetIncomeLoss row. Caterpillar's FY2025 10-K now returns $8,884M instead of $8,882M, Interactive Brokers' Q2 2026 10-Q $312M instead of $1,338M. IFRS filers now get the owners-of-parent line: Toyota's FY2026 20-F is ¥3,848,098M, not ¥3,985,761M, and Barclays' FY2023 20-F is £5,259M, not £5,323M. (GH #1688)
  • Cash-flow getters returned None for IFRS 20-F filers. get_operating_cash_flow(), get_capital_expenditures() and get_free_cash_flow() now read the IFRS operating total and PP&E purchase lines: Shell's FY2025 20-F returns operating cash flow $42,863M, capex $18,947M (its capital expenditure line, not the broader $20,915M cash capex subtotal) and free cash flow $23,916M, all None before. (GH #1785)
  • 8-K item detection accepts only real item numbers. A body line such as "ITEM 2024 performance awards" was reported as item '2024' and ended Item 5.02 early; detection, item start and item end now share one pattern, so items are ['5.02', '9.01'] and the line stays inside Item 5.02. (GH #1772)
  • EntityFiling.parsed_items finds 8-K items headed "Item - 5.02". For 8-K 0000710782-24-000005 it now returns '5.02' instead of ''; parsed_items uses the same item label and number patterns as CurrentReport. (GH #1773)
  • 8-K earnings tables keep each value under its own period header. A scale caption such as "In millions, except per share amounts" was read as a column, shifting every value one column, so Home Depot's quarter ended February 1, 2026 returned net sales $39,704M (the prior year); values are now placed by grid position and it returns $38,198M. (GH #1775)
  • 8-K earnings lookup reads the exhibit's SEC document type. An EX-99 or EX-99.1 release whose description and filename omit "ex-99" was skipped, so Accenture's 8-K 0001467373-25-000221 had no earnings; it now gives revenue $18,742,125 thousand, and an EX-99.1 release sorts before an EX-99.2 supplement. (GH #1776)
  • 8-K earnings tables with three header rows keep every period column. ASGN's 8-K 0000890564-25-000058 had 3 labels for 5 value columns and get_key_metrics() returned None; header rowspans are now honoured and repeated labels read by position, so it returns revenue $1,011.4M, net income $38.1M and diluted EPS 0.87, with the nine-month columns kept. (GH #1777)
  • EarningsRelease.get_key_metrics() returns total revenues, not a revenue component. Alta Equipment's Q2 2025 release now gives $481.2M instead of $265.6M ("New and used equipment sales"); total rows are preferred over component rows. (GH #1778)
  • 8-K earnings tables read the scale caption above a wrapped table. Cardlytics' statement of operations, captioned "(Amounts in thousands, ...)", was scaled as millions, so get_key_metrics() gave revenue $63.249 billion; it now gives $63,249,000. A table that is the only child of a wrapper now reads the caption before the wrapper. (GH #1779)
  • 8-K earnings tables keep "% Change" columns out of the period columns. In Home Bancorp's 8-K 0001436425-25-000016 the column headed 3/31/2024 held the percent change (-1.0) instead of total interest income 44,126; the header row found among the data rows is now aligned by position, and percent-change columns are not reported as USD facts. (GH #1780)
  • EarningsRelease.income_statement returns the statement of operations, not a segment or metrics table. For Mueller Water's 8-K 0001350593-25-000054 it picked the FY2024 segment table (diluted EPS 0.74); it now ranks candidates by revenue and net income rows, period columns and reconciliation wording, and returns diluted EPS 0.33 and revenue $380.8M. (GH #1781)
  • Warrant liabilities, restricted cash, deferred revenue and 16 more balance-sheet elements are corrected. FreightCar America's $168,529K FY2025 warrant liability standardized as a product-warranty provision; it is now another non-current liability. Banks' other borrowings and related-party payables are debt and liabilities, not "Total Liabilities", and gross notes receivable has no concept, so it no longer adds to net loans. (GH #1438)
  • Stitched balance sheets merged unrelated cash-bucket lines across filings. Cash, cash plus short-term investments, bank cash components and securities share one standard concept, and two such lines now merge only when a filing reports both for a common period with the same amount. A bank's 2022 cash component of 30 no longer shows as its cash-and-equivalents total. Lines whose shared period was restated now stay as two rows. (GH #1685)
  • Stitched cash flows put continuing-operations cash in the total row. A *ContinuingOperations amount is no longer merged into its activity total when the filing reports nonzero discontinued-operations cash for that period. On AT&T's 10-Qs the 2026 operating total cell is now empty instead of showing the continuing 18,396,000,000, which stays in its own row. (GH #1690)
  • ConceptGraph.validate() reported statements that foot as not footing. It applied calculation weights to sign-flipped display values of negated-label rows and read values from other reports' periods. On Apple's 10-Q 0000320193-25-000057, failed checks fall from 5 of 19 to 0; net cash from investing now computes 12,709, not 50,885. (GH #1733)
  • Quarter labels were one quarter too high for quarters ending in a month's first week. Statement.to_dataframe() columns and rendered headers now use the same first-week rule as the XBRL parser, so Apple's three months ended 2023-07-01 is labeled (Q3), not (Q4) (10-Q 0000320193-23-000077). (GH #1738)
  • The multi-period guide called stitched 10-Q statements quarterly. It now says each 10-Q contributes its year-to-date column, keyed by bare end date, and documents include_quarterly=True for three-month columns. On Apple's 10-Q 0000320193-23-000077 the default 2023-07-01 column is nine-month net sales of $293,787 million; the quarter is $81,797 million. (GH #1741)
  • Comprehensive income rows with a negated label kept the filed sign in Statement.to_dataframe() and render(). The presentation sign was applied only to income, cash-flow and balance-sheet statements, so American Airlines' FY2025 10-K (0000006201-26-000014) showed pension OCI as (176) beside a total of 176. Comprehensive income now gets the sign too; the row shows 176 and the components foot. (GH #1676)
  • xbrl.facts gave income-statement facts the preferred label and sign of a disclosure role. The Facts API took a concept's preferred label from the first presentation role that had one, so Omega Healthcare's 10-Q (0000888491-26-000024) reported interest expense with preferred_sign -1 from a segments note's negated label. Facts assigned to a statement now read that statement's arc, giving no preferred sign, as get_statement() does. (GH #1677)
  • Roll-forward tables presented with negated period labels lost their closing balance, and the opening row showed the closing value. Only periodStartLabel/periodEndLabel counted as roll-forward roles, so negatedPeriodEndLabel arcs were dropped as duplicates. On Lesaka's 10-Q (0001562762-23-000403) "Accumulated impairment, Beginning Balance" showed 18,816 instead of 18,876; both rows now appear with the filed values. (GH #1700)
  • Dimensional statement rows were nested by member relationships from other roles. The member hierarchy read the union of every role's domain-member arcs, so Tesla's 10-Q (0001628280-26-049270) DETAILED income statement put "Services and other" ($4,581M) under "Total revenues from sales and services", a member only a note declares. Nesting now uses the statement role's own arcs, and the row sits beside "Automotive Revenues". (GH #1701)
  • Statement rows took their calculation weight and calculation_parent from an unrelated role. When the statement's own calculation network had no arc for a concept, the first arc in any role was used, so Sonoco's 10-Q (0000091767-26-000022) gave the income statement's basic share count weight 1.0 under diluted shares from the EPS note. Rows and Facts API facts assigned to a statement now read only that role; the share count's weight is None. (GH #1702)
  • LabelsParser dropped every label whose xml:lang was not exactly "en-US". The IFRS taxonomy writes xml:lang="en", so parsing its IAS 1 documentation linkbase (doc_ias_1-en_2025-03-27.xml) kept 0 of 686 labels. English variants (en-US, en, en-GB, any case) are now merged by role with en-US preferred, and all 686 are kept. (GH #1744)
  • xbrl.statements.cash_flow_statement() returned None when a filer split the statement's role across several presentation links. Each later link replaced the tree an earlier one built, so IMAX's FY2018 10-K (0001193125-19-052075) kept 1 of the cash-flow role's 57 relationships. The parser now merges every link of a role, and the statement returns with operating cash flow of $109,972K. (GH #1745)
  • Statements no longer swap a foreign-currency amount for the reporting-currency one. Duplicates in different units were ranked on decimals alone, so Disney's FY2025 10-K showed its Canadian debt as CAD 1,300,000,000 instead of USD 900,000,000. Statements now keep the filing's most-used currency, within one context and across contexts for the same period, and log one warning per filing naming the dropped units. All amounts stay in xbrl.facts. (GH #1704)
  • XBRL.entity_info no longer names a co-registrant tagged on srt:ConsolidatedEntitiesAxis as the filer. On Lamar Advertising's 10-Q 0001090425-26-000024, entity_name read "LAMAR MEDIA CORP/DE" beside the filer's CIK 1090425; it now reads "LAMAR ADVERTISING CO/NEW". (GH #1710)
  • FactQuery.to_dataframe() now follows limit() and sort_by() changes made after a first call. The frame cache ignored the limit and sort settings, so on Auburn National's FY2023 10-K a query narrowed with limit(1) still returned 2 rows, and a re-sort kept the old order. (GH #1735)
  • A nil fact no longer outranks a valued duplicate in XBRL precision ranking. A nil Liabilities fact with no decimals scored 0, above a valued duplicate at decimals="-6" (-6), so the blank fact was selected; nil facts now rank below every valued fact. (GH #1750)
  • Inline ix:nonNumeric identifiers are no longer classified as numeric facts. XBRLFact.numeric_value parsed any value as a float, so IBM's cover CIK "0000051143" came back numeric as 51143.0; only facts with a unit (ix:nonFraction) are numeric now. (GH #1755)
  • XBRL contexts now read dimension members from xbrli:scenario (partial fix). Only entity/segment was read, so a Revenues fact tagged StatementScenarioAxis = ScenarioForecastMember in its scenario (900) had empty dimensions and competed with the actual total (800). Still open: Context has no scenario field, and the definition parser still treats a missing xbrldt:contextElement as segment. (GH #1763)
  • Total investments and securities disclosures no longer standardize as cash. Sixteen more securities entries led with the cash concept, so Allstate's FY2025 cash group summed to $83,915M against the filed $678M. Held-to-maturity and available-for-sale carrying values are now investments, and the other 14 have no standard concept. (GH #1436)
  • PortfolioInvestments.from_xbrl with no period could read a date after the report. The default took the latest instant with an investment fair value, so BlackRock TCP Capital's 10-Q for 2026-03-31 (0001193125-26-210632), which tags a roll-forward at fiscal year end, read 2026-12-31: 10 rows and $140,396,441 instead of 331 rows and $1,400,458,176. The default is now the report date when holdings are tagged on it. (GH #1584)
  • Proxy and rate-limit documentation matched the code. The 429 message and docs/configuration.md pointed at a update_rate_limiter function that does not exist; they now say to set EDGAR_RATE_LIMIT_PER_SEC before importing edgar. The proxy guide now lists the one variable honoured (upper-case HTTPS_PROXY) and the ones that are not.
  • Bank, insurer, fund, REIT and utility line items no longer standardize as totals. Deposit components carried TotalDeposits and interest-income lines NetInterestIncome, so Auburn National's FY2023 deposits summed to $1,792.5M by standard concept against the filed $896.2M. 39 of the issue's 45 entries are remapped to their line concept and 6 removed. Other noninterest expense and income get their own concepts, OtherNonInterestExpense and OtherNonInterestIncome. (GH #1441)
  • Common stock par value no longer standardizes as total stockholders' equity. CommonStockValue (7,620 companies) mapped to CommonEquity, so Cato's $694,000 common stock row showed as a second "Total Stockholders' Equity" beside the real $192.3M. Dividends declared now map to DividendsEquity, not the cash-flow CommonDividendsPaid; 23 of the issue's 39 entries are remapped and 16 removed.
  • Attachments.download() works in Jupyter, and nest-asyncio is no longer a dependency. Inside a running event loop the download raised RuntimeError: This event loop is already running; a Caterpillar 8-K's 10 attachments now download in a notebook as in a script. Sync wrappers run their coroutines on a private loop in a worker thread instead of patching your loop with the archived nest-asyncio.
  • SSL diagnostics and error advice describe the certificates 6.0 actually uses. diagnose_ssl() reported the OS trust store as "not active" and warned about a missing certifi bundle, and SSL errors advised REQUESTS_CA_BUNDLE, which httpx2 never reads. They now name the source in effect (OS store, SSL_CERT_FILE or SSL_CERT_DIR), and get_http_config() gains a cert_source key.
  • SRT elements reach their standard concept. ReverseIndex.lookup() stripped only the us-gaap and dei prefixes, so srt:PayablesToCustomers and srt:BankLoans returned None while their bare names were mapped; Charles Schwab's $116,341M payables to brokerage clients had no standard_concept. The srt: and srt_ prefixes are now stripped too. (#1446)
  • EPS, working-capital changes, comprehensive income and the cash totals get a standard concept. Eleven face-statement tags that gaap_mappings.json maps were also in exclusions.py, so ReverseIndex.lookup() returned None and their rows had no standard_concept; basic EPS alone is used by 7,287 companies. They now resolve to their mappings. Per-share continuing and discontinued amounts, OCI components and other tags whose mappings would collide stay excluded. (#1445)
  • A co-registrant's statement shows the co-registrant's own amounts. In a filing for several registrants, a subsidiary's own balance sheet, income statement or cash flow statement filled its plain rows with the parent's facts; American Airlines, Inc.'s total assets read as the group's $64,233M instead of the filed $72,888M. The subsidiary's face statements now read its LegalEntityAxis facts; parent and combined statements are unchanged. (#1468)
  • edgar_read says why a filing has no financials, and returns an error code for a bad accession number. On a 10-K with no XBRL, such as Circuit City's FY2008, the financials section was a bare None; the response now notes that the filing has no XBRL and points to sections=['Item 8'], where the statements are (net sales $11,743,691K). A malformed accession number returns INVALID_ARGUMENTS with the format hint instead of "Could not find filing".
  • A ticker that moved to a new registrant resolves to the new CIK. Company("XOM") returned Exxon Mobil Corporation (CIK 34088) after SEC moved XOM to ExxonMobil Holdings Corp (2115436), because the ticker table bundled at release answered before SEC's live file; by 2026-10-20 the bundle had 10 such tickers. SEC's live file now answers first, with one short attempt, and the bundle answers offline.
  • Docs examples that failed now run (#1614). Five docs pages and the find() docstring used find(ticker).get_financials(), filing.document(), risk_factors.text and latest("10-K")["Item 1"]; each was corrected and run against live SEC (AAPL FY2024 10-K risk factors: 68,163 characters).
  • find_ticker() returns an issuer's main ticker for dual-class and note issuers. The primary ticker was the shortest one, so Alphabet came back as GOOG, Fox as FOX and Navient as JSM, a note. It now follows SEC's listed order after setting aside OTC, preferred, unit and warrant tickers, which changes 16 of 1,449 multi-ticker CIKs (GOOGL, FOXA, NAVI, BNY among them).
  • pivot_by_period(return_statement=False) no longer changes pandas' display settings for the whole process. It set the global float_format to whole numbers, so every DataFrame printed afterwards lost its decimals: JPM's FY 2025 revenue of 182.4 ($ billions) printed as 182.
  • FortyF and TwentyF section properties return None for a missing section again, as TenK's do. Since the 6.0 error flip, forty_f.capital_structure on Shopify's 40-F (0001594805-24-000007) raised SectionNotFoundError; all 16 properties now answer None and only report[name] raises. (GH #1581)
  • Every SEC request now carries your identity and waits on the rate limiter. Three requests bypassed the shared client. XmlFiling.to_html() identified itself to SEC as edgartools instead of your set_identity(). The empty-cache retry for full submissions skipped the rate limiter. HTMLParser.parse_url() needed the undeclared requests package. stream_with_retry(bypass_cache=True) also never bypassed the cache. A test now fails on any HTTP call outside edgar.httpclient.
  • download_filings(filings=...) downloads only the requested filings. It used to download SEC's daily feed file for every business day between the first and last filing date, 1,298 of them for Snowflake's six 10-Ks. Each filing is now fetched on its own (17.8 MB for Snowflake's 2026 10-K, against 2.9 GB for its day's feed file); source="feed" keeps feed files, downloading only the days that hold a requested filing. (GH #1608)
  • An 8-K with a preformatted plain-text body no longer keeps the SIGNATURE block in its last item. The last item now ends at the prescribed signature sentence, as it did before #1534. (GH #1563)
  • extract_nonaccrual() named a borrower by its whole position label. The non-accrual roster parsed identifiers without the filing's member candidates, which PortfolioInvestments.from_xbrl uses to bound company names, so all 4 rows of Hercules' 10-Q (0001280784-26-000042) read "Debt Investments, Application Software, Annex Cloud, Senior Secured, ..." instead of "Annex Cloud". The roster now passes the same candidates. (GH #1587)
  • FundReport.investment_data() dropped a holding's other unique identifier. Identifiers.from_xml parsed N-PORT item C.1.e.iv into identifiers.other, but no column carried it. On BHK's NPORT-P (0001410368-26-085673) 121 of 1,487 securities state one, and it is the only field that tells apart 45 Royal Bank of Canada reverse repos with the same name and title. New columns other_id and other_id_type carry it as filed. (GH #1586)
  • The bundled AI skill taught calls that fail, such as filing.document() and tenk.risk_factors.text. On Apple's FY2024 10-K (0000320193-24-000123), tenk.risk_factors is a 68,887-character str with no .text, filing.document() raises TypeError, and tenk['Item 99'] raises SectionNotFoundError where the skill said None; the skill also promised a NO_XBRL_DATA error that nothing raises. (GH #1591)
  • The 6.0 upgrade guide described three changes that shipped in 5.46.0 as 6.0 changes. The TableNode.to_dataframe() row index, Document.to_dataframe() and the XBRL FactQuery.to_dataframe() column set now say they shipped in 5.46.0, with "before 5.46.0" examples, and the guide no longer says Form144 is missing from the top level, where it has been exported since 5.60.0. (GH #1562)
  • from edgar import * no longer prints three DeprecationWarnings. The deprecated access modes NORMAL, CAUTION and CRAWL were still in __all__, so the README's first line warned about a feature the user never touched. They are out of __all__ in edgar, edgar.core and edgar.settings; importing one by name still warns.
  • An exhibit index or schedule printed after a 10-K's Signatures section is now its own exhibit_index section — when the table of contents lists SIGNATURES, the signature section ended only at the end of the filing and held Intuit's and Tetra Tech's exhibit indexes and Sanmina's Schedule II (up to 6,985 characters); it now ends at the signature block, as an index after Item 16 already did.
  • 10-K section text no longer starts on Part dividers or carries page furniture and HTML comments — an empty item anchor after earlier lines in the same block no longer pulls them in, a "PART II / ITEM 7A" running header and dashed page numbers ("- 22 -") are dropped, and Word page-number field codes no longer print. On eight newly tracked 10-Ks, 20 of 26 wrong item boundaries are now right.
  • search_filings() dropped every original filing when forms listed an amendment code. EFTS returns amendments only once a code like S-1/A is in the list, so forms=["F-1", "F-1/A"] found 0 filings where ["F-1"] found 1. An X/A code is now dropped when X is listed, since X already matches its amendments, and mixing an amendment-only code with other forms warns. (GH #1544)
  • Statement.render() showed authorized and preferred share counts at an unstated money scale. They were formatted as amounts in millions, so Apple's FY2023 10-K (0000320193-23-000106) showed 50,400 authorized shares beside 15,550,061 issued; both now display as actual counts, 50,400,000,000 and 15,550,061,000. JPMorgan's 2,740,375 issued preferred shares showed as 3. (GH #1478)
  • Statement.render() showed stock par values as zero. Per-share values under 10 were cut to three decimal places, so the $0.00001 common par value in Apple's FY2023 10-K (0000320193-23-000106) displayed 0.00; the filed precision is now kept. PreferredStockParOrStatedValuePerShare was not treated as a per-share value and took the statement scale, so Tesla's $0.001 preferred par displayed 0. (GH #1475)
  • IFRS "other operating income (expense)" got no standard_concept. ifrs-full:OtherOperatingIncomeExpense had no IFRS entry, so lookup returned None, and the bare entry of that name pointed at the operating income total. Both now map to OtherOperatingIncomeExpenseNet. SAP's FY2025 20-F (0001104659-26-020058) shows its −€49M other operating income/expense, net under that concept, inside operating profit. (GH #1540)
  • ReverseIndex.lookup() put operating "other income (expense), net" below operating income. OtherOperatingIncomeExpenseNet (704 companies) mapped to OtherIncomeIS, a non-operating total. It now maps to a new concept, OtherOperatingIncomeExpenseNet, under Operating Expenses. Amazon's FY2022 10-K (0001018724-23-000004) shows $1,263M of other operating expense (income), net inside its $501,735M of operating expenses. (GH #1417)
  • filing.xbrl().standardization.industry was always None, and setting it by hand changed standard concepts. The hook read a Filer attribute that does not exist and could not parse the header's NAME [code] SIC, and the industry_overrides it would have applied only restated, narrowed or swapped base mappings, so they are removed. JPMorgan's FY2025 10-K (0001628280-26-008131) now resolves to Banks; SIC 3570-3579 map to Comps (was Mach) and REITs (6798) to RlEst. (GH #1419)
  • ReverseIndex.lookup() gave investing and financing line items their section total's concept. On Apple's FY2023 10-K (0000320193-23-000106) the "Other" investing line carried NetCashFromInvestingActivities, so grouping by standard_concept gave $2,368M of investing cash instead of the filed $3,705M. 60 tags now map to their own line, and 15 with no fitting concept are unmapped. (GH #1435)
  • ReverseIndex.lookup() misclassified income, comprehensive income and related disclosures. 27 entries are remapped and 26 without a fitting concept are removed. ExxonMobil's FY2022 10-K (0000034088-23-000020) showed $1,025M of exploration expense as ResearchAndDevelopmentExpenses; the same amount now maps to OtherOperatingExpense. (GH #1439)
  • Statements discovery and parenthetical access returned another role or wrong periods. Selected roles retain their rows and period kind. AAL subsidiary receivables changed from missing to $9,896,000,000 (10-K 0000006201-26-000014). Classified balance-sheet URI and parenthetical access retain instant comparisons; classified signs, equity, validation, ratios and trends stay active. Missing HTTP(S) roles do not fall back. Explicit canonical names keep primary-statement selection. (GH #1305)
  • ReverseIndex.lookup() misclassified tax balances, tax components and cash-paid disclosures. Seven entries are remapped; six US-GAAP cash-paid mappings, four polluted bare IFRS payment/refund entries and four tax-effect or rate-reconciliation entries are removed. Apple's FY2023 10-K (0000320193-23-000106) showed $18,679M of cash taxes as IncomeTaxes; the same amount now has no standard concept, and its legacy expense mapping is removed. (GH #1440)
  • ReverseIndex.lookup() gave operating cash-flow detail rows the operating total's standard_concept. 61 of 67 tags in gaap_mappings.json mapped to NetCashFromOperatingActivities and 6 to other wrong concepts. 45 now map to the line they are; 22 with no fitting concept return None. On Apple's FY2023 10-K (0000320193-23-000106), dividends paid of $15,025M were DistributionsToMinorityInterests and are now CommonDividendsPaid. (GH #1435)
  • ReverseIndex.lookup() gave amortization, impairment, labor, revenue and operating lines the wrong standard_concept. 58 entries move to the concept their FASB definition supports and one with no fitting concept is removed, so "Goodwill Impairment" now holds only GoodwillImpairmentLoss. JPMorgan Chase's FY2023 10-K 0000019617-24-000225 showed compensation expense of $46,465M as CostOfGoodsAndServicesSold (cost of revenue); it is now LaborExpenses. (GH #1417)
  • ReverseIndex.lookup() misclassified prepaid, intangible and other disclosures. 29 entries are remapped and four removed. Coca-Cola's FY2023 10-K (0000021344-24-000009) had Goodwill rows totaling $32,707M; now they total $18,358M, with $14,349M of trademarks mapped to IntangibleAssets. (GH #1438)
  • ReverseIndex.lookup() misclassified liabilities and debt disclosures. 25 entries are remapped and nine without a fitting concept are removed. Apple's FY2023 10-K (0000320193-23-000106) showed $8,061M of deferred revenue as OtherOperatingCurrentLiabilities; the same amount now maps to DeferredRevenueCurrent. (GH #1438)
  • ReverseIndex.lookup() mixed investment securities with cash or unrelated asset concepts. 28 securities tags now map to short- or long-term investments, and one unmatched allowance tag is removed. On Auburn National's FY2023 10-K (0001193125-24-067944), excluding $270.910M of securities reduces the standardized cash group from $310.867M to $39.957M. (GH #1436)
  • ReverseIndex.lookup() standardized held-for-sale assets, contract assets and restricted cash equivalents as "Other" assets. 48 balance-sheet elements map to AssetsHeldForSale, ContractAssets, restricted cash, or the fitting receivable, allowance or other-asset concept; a pledged-collateral element is unmapped. On IBM's FY2024 10-K (0000051143-25-000015), $900M of financing receivables held for sale was "Other Non-Operating Current Assets" and is now AssetsHeldForSale. (GH #1438)
  • ReverseIndex.lookup() labeled discontinued-operations lines "Extraordinary Items", a category GAAP eliminated in 2015. 12 entries move to DiscontinuedOperationsIncome, or MinorityInterestIncomeExpense for the noncontrolling share, and 16 with no fitting concept, such as tax on discontinued operations, are removed. IBM's FY2024 10-K 0000051143-25-000015 showed $35M of divested-business revenue as ExtraordinaryItemsIncomeExpense(PostTax); it now has no standard concept. (GH #1437)
  • ReverseIndex.get_standard_concept() ignored balance-sheet sections when choosing current or noncurrent candidates. Matching sections now precede tag-name hints for typed, role-URI and blank statement types. The default equity-securities pair uses investment concepts. JPMorgan's FY2023 10-K (0000019617-24-000225): $290,307M of accounts payable was OtherOperatingNonCurrentLiabilities, now TradePayables. (GH #1434)
  • EntityFacts.get_concept() returned a part, a larger total or a different measure as a concept's value. Eighteen synonym-group members, and three tags under legacy labels in concept_mappings.json, did not measure the concept they were listed under and are removed. On Snowflake, get_concept("operating_lease_liability") returned a 10-Q's $37.1M current portion; it now returns the $413.7M total from the FY2025 10-K (0001640147-25-000052). (GH #1442)
  • Item 16 no longer swallows the exhibit index printed after it — when a 10-K prints its exhibit index or schedules after Item 16 ("Form 10-K Summary: None."), they now form an exhibit_index section and Item 16 ends at its own text; Mastercard's Item 16 went from 21,080 characters to 33. Southern's Item 15 is no longer cut mid-sentence by an inline-XBRL fact id taken as Item 16's anchor.
  • A captioned table prints once in doc.text() — the table renderer already opens with the caption and the text extractor added it again. An old SGML filing's never-closed <CAPTION> holds the whole table, so those tables printed twice: across 43 plain-text filings, 128k duplicated words are gone.
  • More plain-text filings get their item sections — a plain-text filing with no table, or one marked with SGML <PAGE> tags, still built as one paragraph and could not be split. Regulation S-B 10-Ks now get Items 1 and 2 ("Description of Business", "Description of Property"). A 2004 plain-text 8-K now yields Items 1.01, 5.02 and 9.01 from its sections.
  • Plain-text filings now get their item sections — the parser built each run of a plain-text filing's text between two tables as a single node, so item headings inside it were invisible and pre-2002 10-Ks and 20-Fs got 0-1 sections. Blank-line blocks are now paragraphs, with rendered text unchanged; a 2001 20-F now yields 16 items instead of 1.
  • Pattern-detected 10-K items end at the next item's header whatever its heading level — a 1999 10-K parsed "Item 7:" as a paragraph and "Item 7A:"/"Item 8:" as headings, so Item 7 ran through both pointers to Item 9. Item 7 is now its 215-character pointer, down from 784.
  • 10-K items missing from a partial TOC now come from the filer's cross-reference index — on index filers such as GE, the gaps used to go to keyword matching, which returned the index table as Item 1 and a 276k-character mid-sentence slice as Item 9A. Item 9A is now its 3.3k-character page, and GE's 10-K resolves 12 items instead of 8.
  • Item 8 now holds the financial statements a 10-K files at its back. When Item 8 is only a pointer ("immediately following Part IV hereof") the statements sat in whichever section came last, so Netflix's Item 16 ("Form 10-K Summary None.") was 96k characters and Item 8 was 267; Item 8 now starts at the statements' index and the last section ends before it. Netflix's Item 8 is 93,115 characters and its Item 16 is 32.
  • A 10-K's last item no longer runs through the signature block. Item 16 ("Form 10-K Summary None.") on Apple, Caterpillar, Bank of America and others carried the whole signature table, because the SIGNATURES bound was 10-Q only; a 10-K now ends there too unless financial statements, schedules or an exhibit index follow, which stay in the section rather than in none. 10-K truth-set both-exact rises from 90.9% to 91.8%.
  • A title-only TOC's "Form 10-K Summary" row now maps to Item 16. The row was never admitted as a section link, so its anchor ended nothing and Item 15 ran on through Item 16 on Morgan Stanley's 10-K; a title the form's text rules map to an item is now a section link, Item 16 is emitted, and Item 15 ends before it.
  • 10-K Item 4 no longer swallows the executive-officer section. A filer that prints "Information About Our Executive Officers" or "Executive Officers of the Registrant" at the end of Part I gives it no item number, so no anchor ended Item 4 and "Not applicable." ran on through the officer table on 8 of the 32 tracked 10-Ks (Coca-Cola, J&J, P&G, Exxon, Hertz and more); Item 4 now ends at that heading.
  • Sections no longer end on page furniture. The page number, the "Table of Contents" backlink, the running header of the next page or a footer such as "Apple Inc. | 2024 Form 10-K | 18" sat between a section's last paragraph and the next item's anchor, so Section.text() and .markdown() carried it; the end now retreats to the last block of content (a table is kept whole, an auditor's date line is kept), which lifts the 10-K truth-set both-exact rate from 86.6% to 89.3%.
  • Sections no longer open on page furniture. A TOC anchor at the top of a page put the "Table of Contents" backlink, the page number or the running header ahead of the heading, so Section.text() and .markdown() opened on "Table of Contents" (AmEx, Meta, Netflix), "THE GOLDMAN SACHS GROUP, INC. AND SUBSIDIARIES" or "32 The Procter & Gamble Company"; the start now moves to the heading, which lifts the 10-K truth-set both-exact rate from 76.0% to 86.6% (10-Q 82.9% to 95.5%).
  • The last item of each Part no longer carries the next Part's divider. Item 4, Item 9C and Item 14 returned "Not applicable. PART II" (III, IV) on 27 of the 32 tracked 10-Ks, and every 10-Q's Part I Item 4 kept "PART II. OTHER INFORMATION" in its markdown; a section now ends at the first later-Part divider in its range, which lifts the 10-K truth-set end-exact rate from 79.6% to 88.0% (both-exact 68.1% to 76.0%).
  • A section now ends at the heading of an item its table of contents never listed. Item 15 on AmEx, J&J, Chevron and Ondas returned "Item 16. Form 10-K Summary" inside it, Chevron's Item 8 ran to the end of the filing, and P&G's 10-Q Part I Item 4 swallowed Part II Item 1; with the body heading now read as the end, the "slice embeds a later item heading" count on the offline 10-K corpus drops from 19 to 11 of 1,276 sections.
  • Sections keep their own heading when the TOC anchor sits inside it. Filings that place the <a name> after the heading text, or in the middle of its last word, lost each item's heading and ended every section one heading too late; Section.text() and .markdown() now share one boundary rule, which clears 25 of the 47 "slice embeds a later item heading" cases on the offline 10-K corpus.

Security

  • set_identity() no longer writes your name and email to the INFO log. It logged the full SEC identity, so apps with INFO logging, such as MCP servers whose stderr clients display, leaked the address; it now logs only that an identity was set, as does the MCP server. (GH #1727)
  • Downloads, document parsing, MCP tools and HTTP settings are hardened against untrusted or invalid input. Attachment downloads are written only inside the chosen folder, two slow text-processing paths are now bounded, MCP limit values are capped, an invalid EDGAR_RATE_LIMIT_PER_SEC raises ValidationError naming the variable, and disabling SSL verification now warns once. (edgartools-vbutj)
  • diagnose_ssl() flags a CA bundle that still trusts the compromised emSign root. A combined SSL_CERT_FILE built from certifi before 2026.10.19 keeps "emSign ECC Root CA - G3" however certifi is upgraded, and it replaces the OS store. A new "Distrusted Root CA" check fails on it, and the bundle advice now asks for certifi>=2026.10.19 and says to rebuild after updates. Default use, which verifies against the OS store, is unaffected. (edgartools-a9bak)

Performance

  • filing.xbrl() on a large annual or quarterly report downloads only its XBRL files. Above 20 MB it fetched the whole submission, so VALE's FY2025 20-F pulled 101.4 MB over the wire for 0.76 MB of XBRL; it now fetches the index page, the XBRL files and FilingSummary.xml, with identical statements. Set EDGAR_SELECTIVE_ATTACHMENT_DOWNLOAD=false to restore the full download.