You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Fixed
A decrease row sharing a label with an increase row was folded into it, in Statement.get_raw_data(), the rendered statement and every to_dataframe() export. The decrease concept and its -1 preferred_sign were lost. Oracle's FY2026 10-K (0001193125-26-277521) showed its FY2025 and FY2024 "Cumulative translation adjustments and other, net" decreases ($11M, $8M) as increases with preferred_sign 1; they now stay separate rows at -1. (GH #1471)
Document.to_markdown() wrote headerless tables without a delimiter row, so Markdown parsers did not read them as tables. The first non-empty row now becomes the header, followed by the --- row; a table with only one non-empty row, such as a page footer, keeps its plain row. The AbbVie 10-K fixture gains 24 valid tables and no header-only ones. (GH #1484)
Document.to_markdown() broke a pipe-table row when a body cell had a line break. A cell with <br> or several paragraphs was written across lines, so Markdown parsers ended the table early; First<br>second now renders as | First second | 10 |. (GH #1486)
BDC portfolios dropped a loan whose identifier ends in its coupon.from_xbrl typed any identifier ending in a bracketed percent as a category roll-up, so PhenixFIN's $221,625 delayed-draw term loan ... (14.00%) left its 10-Q portfolio with no warning. A row that states a principal amount is now parsed without the suffix and kept; Hercules' roll-ups state none and stay excluded. (GH #1504)
N-PORT SecurityLending read every "Yes" securities-lending answer as None. A Yes is stated as attributes of cashCollateralCondition, nonCashCollateralCondition or loanByFundCondition, which from_xml never read. On SGOV's NPORT-P (0002071691-26-016719) the $441,347,500 cash-collateral Yes and two loans by the fund read None. They now read "Y", with the amounts in cash_collateral_value, non_cash_collateral_value and loan_value. (GH #1585)
EightK.items missed 8-K items headed "Item - 5.02", and eightk["5.02"] raised SectionNotFoundError. Liaoning Shuiyun Qinghe Rice's 8-K 0000710782-24-000005 puts a dash after "Item", so it reported no items and content_type was other. The item label now accepts a dash, en dash, em dash or colon, and that filing reports ['Item 5.02'] and director_change. (GH #1589)
search_filings(start_date=...) without end_date no longer searches every year. EFTS applies a date range only when it gets both bounds, so a lone start or end date was silently ignored: search_filings("tariff", forms="10-K", start_date="2025-01-01") returned 10,000+ hits led by 2010 filings, not 3,841 from 2025-26. A missing bound is now filled in.
A note that holds only instant facts renders its own dates.render_statement() and Statement.to_dataframe() gave an unclassified note role annual duration columns, so a point-in-time note such as IBM's long-term debt components rendered every cell blank; it now shows the note's instants ($824M and $838M for the unamortized discount). render_statement(period_filter=...) is also honoured now. (#1469)
Document.to_markdown() let a literal | or \ in a table cell break the table. Only grouped headers were escaped, so a pipe in a flat header or a body cell opened an extra column; AbbVie's FY2024 10-K page footers ("1 | 2024 Form 10-K") rendered three cells for two. Every pipe-table cell is now escaped. (GH #1483)
Financials.get_revenue() reads a bank's filed total when its income statement has no total row. U.S. Bancorp and Capital One returned None; they now return the filing's non-dimensional us-gaap:Revenues fact for the statement's period, U.S. Bancorp $28,656M for FY2025.
EntityFacts revenue returned a component of revenue instead of the filed total.get_revenue() and the income statement's Total Revenue tried contract revenue before Revenues, so GM's FY2025 revenue read $167,971M ("Automotive") instead of $185,019M. They now read Revenues first, as Financials.get_revenue() does; 10 of 106 large filers change. (bead edgartools-jrqvs)
configure_http(proxy=...) no longer bypasses the rate limiter and the HTTP cache. The proxy was passed as a client option, and httpx routed every request through its own proxy transport in front of both, so the documented corporate-proxy setup sent unthrottled requests to SEC. The proxy now sits under the cache and rate limiter, and get_http_config()["proxy"] also reports one set by HTTPS_PROXY. (edgartools-kd2ap)
Financials.get_revenue() returns a bank's total net revenue, not one part of it. Banks tag their top line as RevenuesNetOfInterestExpense, which was never searched, so JPMorgan's FY2025 revenue came back as $87.0B noninterest revenue instead of $182.4B, Wells Fargo's as $16.1B fee income and American Express's as $37.4B. A bank with no total row now returns None rather than a component.
Security
XML parsing is hardened. The minimum lxml is now 6.1.3, which includes an upstream security fix, and edgartools parses filing XML with stricter settings whichever lxml is installed. Parsed output is unchanged. Upgrading is recommended. (edgartools-o6y3i)
The minimum certifi is now 2026.10.19, which drops the distrusted emSign root certificates. On 5.x, SEC connections are verified against certifi's bundle unless EDGAR_USE_SYSTEM_CERTS is set, so upgrading edgartools now also updates the trusted roots. (edgartools-a9bak)