Repository navigation
pip install --upgrade edgartools6.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, andCompany.predecessorreaches it directly.Company("XOM")annual income goes from empty to FY2016–FY2025 (FY2025 revenue $332,238 million) (GH #1821). EFTSResult.accession_noandEFTSResult.filing_date. Full-text search results now answer to the namesFilinguses, as read-only aliases ofaccession_numberand adatetime.dateparsed fromfiled. In the README agent eval, every API error on the full-text task (6 of 6) was one of these two names.to_pandas()onEntityFacts,FactsViewand bothFactQueryclasses. It is an alias ofto_dataframe()with the same arguments, matchingFilingsandXBRL.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_readgained an opt-inlimitfor 13F-HRholdings. 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.limitsets the row count,limit=0returns 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, ortextdistance. Company and BDC name search now transliterate withanyascii(ISC), andSimilaritySearchIndexscores 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.parquetgoes 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, throughhttpxthrottlecache>=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, not0.ReportingPerson's ownership figures and power totals,total_shares/total_percent, andOwnershipComparison.shares_change,percent_changeandget_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) CurrentReportfixture docstring did not explain the SEC-injected script. The 8-K fixture for accession0000710782-24-000005retains 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, not0.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/AorNMis nowNaN, and a dash still reads as0.0. Use.fillna(0.0)for the old frame. FactQuery.to_dataframe()now givespreferred_signandfiscal_yearthe same dtype on every query. They are nullableInt64, so an absent value ispd.NA, notNaN. In 5.x they were inferred per query: on Foot Locker's FY2024 10-K,preferred_signreadfloat64on the bare query andint64on the income statement.is_dimensionedis nowboolean. Usepd.isna(), notnp.isnan(). (GH #1100, bead edgartools-rsyt.2)- EntityFacts DataFrames give
fiscal_year,is_auditedandis_estimatednullable dtypes.company.get_facts().query().to_dataframe()andEntityFacts.to_dataframe()now returnInt64andboolean, the same on every query, where 5.x returnedint64/boolbut switched tofloat64/booleanwhen no returned row had a value. Usepd.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 raiseSectionNotFoundError,ValidationError,DataObjectErrorandParsingError; network failures raiseTransportError.get_financials()on a filing without XBRL returnsNone, not an emptyFinancials.EDGARTOOLS_STRICT_ERRORSis gone. (bead 07lk.10) search_filings()returned 0 results for a query EFTS rejected. EFTS answers a failed query with HTTP 200 and anerrorMessagebody, which was read as an empty search:search_filings("apple", start_date="2024-13-01")showed 0 hits. A malformed date now raisesInvalidDateErrorbefore any request; any other rejected query raisesTransportErrorwith SEC's message, also inresolve_accession().next()andfetch_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 dormanthttpx. Unwrapped network errors arehttpx2classes, soexcept httpx.ReadTimeout:stops catching them; catchTransportError. Certificates verify against the OS trust store, notcertifi, and the logger ishttpx2. 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, sopip install -U edgartoolson 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 intocrowdfunding,exemptandprospectusin 5.40.0 never warned, andimport edgar.offerings.formdnow raisesModuleNotFoundError.from edgar.offerings import FormDandfiling.obj()are unaffected; docs/upgrade/6.0.md has the path table and a one-line rewrite. (edgartools-07lk.22.2) edgar.documents.migrationandedgar.documents.extractors.heading_section_detectorare removed. Nothing in the library used either: the first imitated the oldSECHTMLParseron top of the new parser, and the second was a section detector no code called. Useedgar.documents.HTMLParserorparse_html(); the 6.0 upgrade guide lists both.- The 25 top-level names outside
edgar.__all__are private. They includeset_data_directory,get_obj_infoand stdlib names likeOptionalthat leaked in through annotation imports.from edgar import Xnow raisesImportError, andedgar.Xnames the replacement. Import them from their modules (edgar.paths,edgar.entity,typing) or useFiling.obj_type. edgar.coreno longer re-exports the settings and identity names.get_identity,set_identity,EdgarSettings,get_edgar_data_directoryand the rest ofedgar.settingsimport only from there (or fromedgarfor the names it exposes);from edgar.core import get_identityraisesImportError. (bead edgartools-07lk.22.1)include_dimensionsis removed from statement rendering. TheFinancialsandxbrl.statementsstatement methods,Statement.render()andStatement.to_dataframe()warned about it since 5.8.0 and now raiseTypeError; useview='detailed'forTrueandview='standard'forFalse.CurrentPeriodViewand stitched statements keep theirs. (GH #574, bead edgartools-07lk.22.1)cashflow_statement()andcash_flow()removed. The 5.x deprecated spellings are gone fromCompany,Financials,EntityFacts,StatementsandCurrentPeriodView; calling them raisesAttributeError. Usecash_flow_statement(), see the 6.0 upgrade guide. (bead edgartools-07lk.22.1)edgar.core.Resultis removed. The success/failure wrapper was never returned by anything in edgartools, andfrom edgar.core import Resultnow raisesImportError. It was documented as deprecated but never warned. (bead edgartools-07lk.22.1)- The deprecated access modes are removed.
NORMAL,CAUTION,CRAWLandedgar_modenow raiseImportError, andEDGAR_ACCESS_MODEis no longer read or warned about; it never affected the HTTP client. UseEDGAR_RATE_LIMIT_PER_SECandEDGAR_HTTP_TIMEOUT. (GH #1326, bead edgartools-07lk.22.1) period_lengthremoved from the EntityFacts statements.income_statement()andcash_flow_statement()no longer acceptperiod_length, by keyword or by position; passing it raisesTypeError. Useperiod='quarterly'orperiod='annual'instead (bead edgartools-07lk.22.1).edgar.coreno longer re-exports the date helpers.filing_date_to_year_quarters,current_year_and_quarter,is_start_of_quarterandparse_acceptance_datetimenow import only fromedgar.dates; the old path raisesImportError. (bead edgartools-07lk.22.1)edgar.effectandedgar.form144are removed. They forwarded toedgar.offerings.effectandedgar.ownership.form144with aDeprecationWarningsince 5.55.0, and now raiseModuleNotFoundError.from edgar import Form144andfiling.obj()are unaffected. (bead edgartools-07lk.22.1)- Seven deprecated exception names are removed.
StatementNotFound,NoCompanyFactsFound,SECFilingNotFoundError,InvalidDateException,IdentityNotSetException,TooManyRequestsExceptionandDataObjectExceptionwarned throughout 5.x and now raiseImportError. The replacements inedgar.exceptionshave existed since 5.48.0. (GH #933, bead edgartools-07lk.10) beautifulsoup4is no longer installed. Every parser runs on lxml, so 6.0 dropsbeautifulsoup4andsoupsievefrom the install; noedgarmodule imports bs4.edgar.xmltoolsreturns lxml elements only, and passing a BeautifulSoup toFilingHomepageorAttachments.load(deprecated through 5.x) now raisesTypeErrornamingparse_homepage_html. See the 6.0 upgrade guide. (GH #931)- The legacy
edgar.filesparser,ChunkedDocumentand 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 asFiling.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
PortfolioInvestmentsalready applies. (bead edgartools-wg5n8) -
An XBRL fraction fact was read as its digits joined. Numerator 1 and denominator 3 (
xbrli:fractionItemType) parsed asvalue='13'andnumeric_value=13.0. Terminating quotients are now exact, and a recurring one such as one third is rounded half-even to 50 significant digits, whiledecimalsstaysINF(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.footnoteswas empty when SEC's extracted instance dropped the footnote links. Footnotes are now read from the inline document'six:footnoteandix:relationshipelements, 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, andextract_nonaccrualnow 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, andNonAccrualResult.total_sourcesays 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
ProfitLosstoNetIncomeLossand its lease lines fromsfm:tous-gaaptags, 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_ownershipinsiders 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 reporttransaction_total,transactions_truncatedandform(4 or 4/A). (GH #1817) -
edgar_ownershipinsiders returned no insider, role or trades, and ignoreddays. 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), anddaysbounds the filing date. (GH #1817) -
Retired tickers resolve again —
Company("EQR")returns CIK 906107 (now Vivmark Residential) instead of raisingCompanyNotFoundError. 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".RegulatedAndUnregulatedOperatingRevenueis total operating revenue across electric, gas and water operations; it now maps toRevenueand 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, wasElectricUtilityRevenueand is nowRevenue. (#1844) -
IFRS interest on lease liabilities is
InterestExpense, not "Operating Lease Expense". IFRS 16 makes lease-liability interest a finance cost, soInterestExpenseOnLeaseLiabilitiesnow maps like the us-gaapFinanceLeaseInterestExpense. Opera's FY2025 20-F reports $461K of it inside finance expense; it wasOperatingLeaseExpenseand is nowInterestExpense. (#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
GrossPropertyPlantEquipmentand accumulated depreciation toAccumulatedDepreciation. 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 fourEffectiveIncomeTaxRateReconciliation*Amountitems no longer map toIncomeTaxes; the provision keeps it. Apple's FY2023 reconciliation had sixIncomeTaxesrows beside the $16,741M provision, including the $23,885M tax at the statutory rate; only the provision isIncomeTaxesnow. (#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()andholding_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 aPutCallcolumn. -
BDC portfolio DataFrame keeps a filed zero.
PortfolioInvestments.to_dataframe()exported a disclosed0fair 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-K0000320193-25-000079) displayed as0.2%; it now displays as15.6%. Only rows whose unit ispureare 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 both6M 2025and Q3 net income of $23,434,000,000 (10-Q0000320193-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()andCell.numeric_valueturned "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:exchnameenaccepts all 21 exchange names in the SEC registry. Ten names, includingCboe BZX Exchange, Inc.in the Fidelity Wise Origin Bitcoin Fund FY2025 10-K, raised TransformError and left display text inDocument.xbrl_facts; that fact now returnsCboeBZX. NYSE Arca and MIAX PEARL now return the dei codesNYSEArcaandPEARL. -
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
CostsAndExpensesas 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_readread noownershiporpurposesection from a Schedule 13D or 13G filed since December 2024. The reader matched only the oldSC 13DandSC 13Gform names, andpurposereturned the object summary instead of Item 4. On BML Investment Partners' SCHEDULE 13D (0001373604-24-000118)purposenow returns Item 4 andownershipreports 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), raisingacross_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 unrelatedlimit(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.FactQuerycould disagree with its cached DataFrame after a period-list edit. Appending GBDC's comparative period added its $71,205,000 interest-paid fact toexecute()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
NetChangeInCashrow; it is nowForeignExchangeEffectOnCash. The six ASC 842 lessee operating-lease maturity elements now feed theOperatingLeaseCommitment*concepts their ASC 840 predecessors use. (#1446) -
Bulk tar archives with a
dir/../fileentry extract on every supported Python. Python before 3.11.17 and 3.12.15 failed withFileExistsErroron such an entry; the entry name is now normalised before extraction. (GH #1598 follow-up) -
get_shares_outstanding_basic()andget_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 onlyCommonStockSharesOutstandingreturns 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 shareunit 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_trendrows carry ahas_gapsflag. 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 raiseValidationError. 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_ttmnow averages share counts and rates the waycalculate_ttm_trenddoes. (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, soget_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 whererender()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
PaymentsOfDividendsfact, 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 underus-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)
-
CurrencyConvertertook 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 inextraction_warningsinstead of guessed. (GH #1650) -
CurrencyConverterconverted 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-F0001131399-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_basissays how each rate was read. (GH #1651) -
CurrencyConverterreturned no closing exchange rates. An instant fact's emptyperiod_endis NaN, which skipped theperiod_instantfallback, 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 inextraction_warnings. (GH #1652) -
CurrencyConverterfound no exchange rates in filings whose rate unit has an opaque ID. Units were matched by substrings of their ID, so SAP'sUnit_Divide_USD_EUR_...facts were all skipped andexchange_rateswas 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_registrationno 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_filingsgainsamendments. (GH #1713) -
10-Q
Part I, Item 1no 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'sAssetscame from concepts such asAssetsCurrentandAmortizationOfIntangibleAssets. A bare name or label now selects exactly that concept, asget_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 MCPedgar_comparetool paired unrelated facts. Both took the first twotime_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'], unqualifiedexact=Trueandfact['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
.holdingsframes. 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 > 10000test is False for sales; Tim Cook's 191,753-share, $63.8M sale (Form 4 0001140361-26-038674) printed nothing. The pattern now testsabs()and says it covers purchases and sales. (GH #1716) -
The reports skill's DEF 14A example and the
ProxyStatement.sectionsdocstring 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()hitNoneandsections[...]raisedKeyError. Both now test before calling.text(). (GH #1717) -
The holdings skill and
docs/common-pitfalls.mdcalledFilings.filter(company=...), which raisesTypeError. The 3 examples now filter bycik=1067983, which selects Berkshire Hathaway's 13F-HR 0000950123-24-008740, and a test runs them. (GH #1718) -
MCP
edgar_readreturnedfull_text: nullwithsuccess: truefor 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_readearningssection returned only "Earnings data available". It calledFinancialTableproperties as methods and hid theTypeError. 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_companyandedgar_trendsreported Python's'NoneType' object has no attributetext when a company has no facts. For Circuit City (CIK 104599) both returnedsuccess: truewith that text in 4 fields; they now return the documentedNO_FACTS_DATAcode. (GH #1721) -
install_skill()andpackage_skill()left thefundsskill 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 1funds/skill.yamlthat other installed skill files point to. All three now include it. (GH #1722) -
test_install_skill_uses_symlinksno 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 thatinstall_skill()copiesSKILL.mdandfinancials/. (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), whichFormC.debt_to_asset_ratiouses under a similar name. The docstring and the extraction guide now say so; the value is unchanged. (GH #1729) -
MCP
edgar_readpress_releasesection 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, soget_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()andget_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, socurrent_ratioread 1.534 instead of 1.051. Both getters now readus-gaap:AssetsCurrent/us-gaap:LiabilitiesCurrentfirst, 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 isus-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 consolidatedus-gaap:Revenuesfact 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 offdebt_to_assetstoo. The getter now reads theus-gaap:Assetsconcept first, asget_total_liabilities()does, and its label fallback no longer matches subtotals. (GH #1667) -
get_shares_outstanding_basic()andget_shares_outstanding_diluted()returned None when the income statement tags one combined basic-and-diluted count. The us-gaap elementWeightedAverageNumberOfShareOutstandingBasicAndDilutedhas 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:DocumentFiscalPeriodFocusis 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 noNetIncomeLossrow. 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()andget_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_itemsfinds 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 asCurrentReport. (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_statementreturns 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
*ContinuingOperationsamount 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-Q0000320193-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-Q0000320193-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=Truefor three-month columns. On Apple's 10-Q0000320193-23-000077the default2023-07-01column 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()andrender(). 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.factsgave 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 withpreferred_sign-1 from a segments note's negated label. Facts assigned to a statement now read that statement's arc, giving no preferred sign, asget_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/periodEndLabelcounted as roll-forward roles, sonegatedPeriodEndLabelarcs 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
weightandcalculation_parentfrom 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) -
LabelsParserdropped every label whose xml:lang was not exactly "en-US". The IFRS taxonomy writesxml: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_infono longer names a co-registrant tagged onsrt:ConsolidatedEntitiesAxisas the filer. On Lamar Advertising's 10-Q 0001090425-26-000024,entity_nameread "LAMAR MEDIA CORP/DE" beside the filer's CIK 1090425; it now reads "LAMAR ADVERTISING CO/NEW". (GH #1710) -
FactQuery.to_dataframe()now followslimit()andsort_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 withlimit(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
decimalsscored 0, above a valued duplicate atdecimals="-6"(-6), so the blank fact was selected; nil facts now rank below every valued fact. (GH #1750) -
Inline
ix:nonNumericidentifiers are no longer classified as numeric facts.XBRLFact.numeric_valueparsed 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). Onlyentity/segmentwas read, so a Revenues fact taggedStatementScenarioAxis = ScenarioForecastMemberin its scenario (900) had empty dimensions and competed with the actual total (800). Still open:Contexthas no scenario field, and the definition parser still treats a missingxbrldt:contextElementassegment. (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_xbrlwith noperiodcould 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.mdpointed at aupdate_rate_limiterfunction that does not exist; they now say to setEDGAR_RATE_LIMIT_PER_SECbefore importingedgar. The proxy guide now lists the one variable honoured (upper-caseHTTPS_PROXY) and the ones that are not. -
Bank, insurer, fund, REIT and utility line items no longer standardize as totals. Deposit components carried
TotalDepositsand interest-income linesNetInterestIncome, 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,OtherNonInterestExpenseandOtherNonInterestIncome. (GH #1441) -
Common stock par value no longer standardizes as total stockholders' equity.
CommonStockValue(7,620 companies) mapped toCommonEquity, so Cato's $694,000 common stock row showed as a second "Total Stockholders' Equity" beside the real $192.3M. Dividends declared now map toDividendsEquity, not the cash-flowCommonDividendsPaid; 23 of the issue's 39 entries are remapped and 16 removed. -
Attachments.download()works in Jupyter, andnest-asynciois no longer a dependency. Inside a running event loop the download raisedRuntimeError: 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 archivednest-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 missingcertifibundle, and SSL errors advisedREQUESTS_CA_BUNDLE, which httpx2 never reads. They now name the source in effect (OS store,SSL_CERT_FILEorSSL_CERT_DIR), andget_http_config()gains acert_sourcekey. -
SRT elements reach their standard concept.
ReverseIndex.lookup()stripped only theus-gaapanddeiprefixes, sosrt:PayablesToCustomersandsrt:BankLoansreturnedNonewhile their bare names were mapped; Charles Schwab's $116,341M payables to brokerage clients had nostandard_concept. Thesrt:andsrt_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.jsonmaps were also inexclusions.py, soReverseIndex.lookup()returnedNoneand their rows had nostandard_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
LegalEntityAxisfacts; parent and combined statements are unchanged. (#1468) -
edgar_readsays 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, thefinancialssection was a bareNone; the response now notes that the filing has no XBRL and points tosections=['Item 8'], where the statements are (net sales $11,743,691K). A malformed accession number returnsINVALID_ARGUMENTSwith 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 usedfind(ticker).get_financials(),filing.document(),risk_factors.textandlatest("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 asGOOG, Fox asFOXand Navient asJSM, 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,BNYamong them). -
pivot_by_period(return_statement=False)no longer changes pandas' display settings for the whole process. It set the globalfloat_formatto 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
Nonefor a missing section again, as TenK's do. Since the 6.0 error flip,forty_f.capital_structureon Shopify's 40-F (0001594805-24-000007) raisedSectionNotFoundError; all 16 properties now answerNoneand onlyreport[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 yourset_identity(). The empty-cache retry for full submissions skipped the rate limiter.HTMLParser.parse_url()needed the undeclaredrequestspackage.stream_with_retry(bypass_cache=True)also never bypassed the cache. A test now fails on any HTTP call outsideedgar.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, whichPortfolioInvestments.from_xbrluses 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_xmlparsed N-PORT item C.1.e.iv intoidentifiers.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 columnsother_idandother_id_typecarry it as filed. (GH #1586) -
The bundled AI skill taught calls that fail, such as
filing.document()andtenk.risk_factors.text. On Apple's FY2024 10-K (0000320193-24-000123),tenk.risk_factorsis a 68,887-characterstrwith no.text,filing.document()raisesTypeError, andtenk['Item 99']raisesSectionNotFoundErrorwhere the skill saidNone; the skill also promised aNO_XBRL_DATAerror 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 XBRLFactQuery.to_dataframe()column set now say they shipped in 5.46.0, with "before 5.46.0" examples, and the guide no longer saysForm144is 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 modesNORMAL,CAUTIONandCRAWLwere still in__all__, so the README's first line warned about a feature the user never touched. They are out of__all__inedgar,edgar.coreandedgar.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_indexsection — 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 whenformslisted an amendment code. EFTS returns amendments only once a code likeS-1/Ais in the list, soforms=["F-1", "F-1/A"]found 0 filings where["F-1"]found 1. AnX/Acode is now dropped whenXis listed, sinceXalready 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) displayed0.00; the filed precision is now kept.PreferredStockParOrStatedValuePerSharewas not treated as a per-share value and took the statement scale, so Tesla's $0.001 preferred par displayed0. (GH #1475) -
IFRS "other operating income (expense)" got no
standard_concept.ifrs-full:OtherOperatingIncomeExpensehad no IFRS entry, so lookup returnedNone, and the bare entry of that name pointed at the operating income total. Both now map toOtherOperatingIncomeExpenseNet. 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 toOtherIncomeIS, 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.industrywas alwaysNone, and setting it by hand changed standard concepts. The hook read aFilerattribute that does not exist and could not parse the header'sNAME [code]SIC, and theindustry_overridesit would have applied only restated, narrowed or swapped base mappings, so they are removed. JPMorgan's FY2025 10-K (0001628280-26-008131) now resolves toBanks; SIC 3570-3579 map toComps(wasMach) and REITs (6798) toRlEst. (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 carriedNetCashFromInvestingActivities, so grouping bystandard_conceptgave $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 asResearchAndDevelopmentExpenses; the same amount now maps toOtherOperatingExpense. (GH #1439) -
Statementsdiscovery 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-K0000006201-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 asIncomeTaxes; 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'sstandard_concept. 61 of 67 tags ingaap_mappings.jsonmapped toNetCashFromOperatingActivitiesand 6 to other wrong concepts. 45 now map to the line they are; 22 with no fitting concept returnNone. On Apple's FY2023 10-K (0000320193-23-000106), dividends paid of $15,025M wereDistributionsToMinorityInterestsand are nowCommonDividendsPaid. (GH #1435) -
ReverseIndex.lookup()gave amortization, impairment, labor, revenue and operating lines the wrongstandard_concept. 58 entries move to the concept their FASB definition supports and one with no fitting concept is removed, so "Goodwill Impairment" now holds onlyGoodwillImpairmentLoss. JPMorgan Chase's FY2023 10-K0000019617-24-000225showed compensation expense of $46,465M asCostOfGoodsAndServicesSold(cost of revenue); it is nowLaborExpenses. (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) hadGoodwillrows totaling $32,707M; now they total $18,358M, with $14,349M of trademarks mapped toIntangibleAssets. (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 asOtherOperatingCurrentLiabilities; the same amount now maps toDeferredRevenueCurrent. (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 toAssetsHeldForSale,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 nowAssetsHeldForSale. (GH #1438) -
ReverseIndex.lookup()labeled discontinued-operations lines "Extraordinary Items", a category GAAP eliminated in 2015. 12 entries move toDiscontinuedOperationsIncome, orMinorityInterestIncomeExpensefor the noncontrolling share, and 16 with no fitting concept, such as tax on discontinued operations, are removed. IBM's FY2024 10-K0000051143-25-000015showed $35M of divested-business revenue asExtraordinaryItemsIncomeExpense(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 wasOtherOperatingNonCurrentLiabilities, nowTradePayables. (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 inconcept_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_indexsection 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
limitvalues are capped, an invalidEDGAR_RATE_LIMIT_PER_SECraisesValidationErrornaming 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 combinedSSL_CERT_FILEbuilt 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 forcertifi>=2026.10.19and 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 andFilingSummary.xml, with identical statements. SetEDGAR_SELECTIVE_ATTACHMENT_DOWNLOAD=falseto restore the full download.