<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: NetNest Design LLC</title>
    <description>The latest articles on DEV Community by NetNest Design LLC (@netnestdesign).</description>
    <link>https://dev.to/netnestdesign</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4227095%2F5d0e6571-ad25-43ff-99f9-5cdc9650ee54.png</url>
      <title>DEV Community: NetNest Design LLC</title>
      <link>https://dev.to/netnestdesign</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/netnestdesign"/>
    <language>en</language>
    <item>
      <title>Get a company's revenue history from SEC filings in Python, with the filing for every number</title>
      <dc:creator>NetNest Design LLC</dc:creator>
      <pubDate>Wed, 04 Nov 2026 20:29:36 +0000</pubDate>
      <link>https://dev.to/netnestdesign/get-a-companys-revenue-history-from-sec-filings-in-python-with-the-filing-for-every-number-30ia</link>
      <guid>https://dev.to/netnestdesign/get-a-companys-revenue-history-from-sec-filings-in-python-with-the-filing-for-every-number-30ia</guid>
      <description>&lt;p&gt;Most "fundamentals" data you can pull into Python arrives as bare numbers. Revenue was 109.4 billion. According to whom, from which filing, under which accounting line? If you are building anything that someone else will read, that question comes back to you eventually.&lt;/p&gt;

&lt;p&gt;This tutorial pulls Apple's revenue history with the &lt;code&gt;netnest-fundamentals&lt;/code&gt; package, which wraps the NetNest Design Fundamentals API (I run it). The point of the API is that every value carries the SEC filing it came from, so at the end we will open the filing and check the number ourselves.&lt;/p&gt;

&lt;p&gt;The output below is from a run on 2026-11-04. Yours will have newer rows once companies file again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install and get a key
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;netnest-fundamentals
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The shared key &lt;code&gt;demo&lt;/code&gt; works for trying things (500 calls a day across everyone). For your own key, 100 calls a day once you verify your email:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;netnest_fundamentals&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;NetNestClient&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NetNestClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;signup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;you@example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The welcome email carries a verification code. Verify it with a POST to &lt;code&gt;/v1/signup/verify&lt;/code&gt; as described at &lt;a href="https://api.netnestdesign.com/docs" rel="noopener noreferrer"&gt;https://api.netnestdesign.com/docs&lt;/a&gt;, then set &lt;code&gt;NETNEST_API_KEY&lt;/code&gt; in your environment; the client reads it by default.&lt;/p&gt;

&lt;h2&gt;
  
  
  Annual revenue, newest first
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;netnest_fundamentals&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;NetNestClient&lt;/span&gt;

&lt;span class="n"&gt;nn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;NetNestClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;demo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# or your key; defaults to NETNEST_API_KEY
&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;history&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AAPL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;revenue&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;annual&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fiscal_year&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;period_end&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;form&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;accession_number&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2026 2026-09-26 478834000000 10-K 0000320193-26-000026
2025 2025-09-27 416161000000 10-K 0000320193-25-000079
2024 2024-09-28 391035000000 10-K 0000320193-24-000123
2023 2023-09-30 383285000000 10-K 0000320193-23-000106
2022 2022-09-24 394328000000 10-K 0000320193-22-000108
2021 2021-09-25 365817000000 10-K 0000320193-21-000105
2020 2020-09-26 274515000000 10-K 0000320193-20-000096
2019 2019-09-28 260174000000 10-K 0000320193-19-000119
2018 2018-09-29 265595000000 10-K 0000320193-19-000119
2017 2017-09-30 229234000000 10-K 0000320193-19-000119
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each row is one fiscal year, newest first. &lt;code&gt;value&lt;/code&gt; is in USD (&lt;code&gt;unit&lt;/code&gt; says so). &lt;code&gt;form&lt;/code&gt; is the 10-K that reported it and &lt;code&gt;accession_number&lt;/code&gt; identifies that filing at the SEC. The three oldest rows share a filing because Apple's fiscal 2019 10-K reports all three years.&lt;/p&gt;

&lt;p&gt;The 13 metrics you can ask for are revenue, net_income, eps_basic, eps_diluted, operating_income, total_assets, total_liabilities, equity, cash, operating_cash_flow, capex, free_cash_flow and shares_outstanding, plus revenue_contract if you want ASC 606 contract revenue specifically. &lt;code&gt;period&lt;/code&gt; is &lt;code&gt;annual&lt;/code&gt;, &lt;code&gt;quarterly&lt;/code&gt; or &lt;code&gt;ttm&lt;/code&gt;, and &lt;code&gt;limit&lt;/code&gt; goes up to 200.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quarterly, and what &lt;code&gt;derived&lt;/code&gt; means
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;history&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AAPL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;revenue&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quarterly&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="n"&gt;flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; (derived)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;derived&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fiscal_period&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fiscal_year&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;period_end&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;flag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Q4 2026 2026-09-26 114477000000  (derived)
Q3 2026 2026-06-27 109417000000 
Q2 2026 2026-03-28 111184000000 
Q1 2026 2025-12-27 143756000000 
Q4 2025 2025-09-27 102466000000  (derived)
Q3 2025 2025-06-28 94036000000 
Q2 2025 2025-03-29 95359000000 
Q1 2025 2024-12-28 124300000000 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Companies report Q4 only as part of the annual figure, so a Q4 value is the annual minus the nine month year to date. The API does that subtraction and marks the result &lt;code&gt;derived: true&lt;/code&gt;, with the inputs it used in &lt;code&gt;derivation&lt;/code&gt;, so you know which numbers are reported and which are arithmetic. It never estimates: a metric a company did not report comes back as &lt;code&gt;None&lt;/code&gt; with a &lt;code&gt;reason&lt;/code&gt; string.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two flags worth reading before you compute growth
&lt;/h2&gt;

&lt;p&gt;Revenue is the one metric where filers change their mind about which line is "revenue". Older filings use &lt;code&gt;Revenues&lt;/code&gt; or &lt;code&gt;SalesRevenueNet&lt;/code&gt;; after ASC 606 most use &lt;code&gt;RevenueFromContractWithCustomerExcludingAssessedTax&lt;/code&gt;. The API picks one concept per company where it can, and tags each value:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;period_end&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;concept&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;revenue_standard&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;concept_changed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2026-09-26 us-gaap:RevenueFromContractWithCustomerExcludingAssessedTax ASC 606 False
2025-09-27 us-gaap:RevenueFromContractWithCustomerExcludingAssessedTax ASC 606 False
2024-09-28 us-gaap:RevenueFromContractWithCustomerExcludingAssessedTax ASC 606 False
2023-09-30 us-gaap:RevenueFromContractWithCustomerExcludingAssessedTax ASC 606 False
2022-09-24 us-gaap:RevenueFromContractWithCustomerExcludingAssessedTax ASC 606 False
2021-09-25 us-gaap:RevenueFromContractWithCustomerExcludingAssessedTax ASC 606 False
2020-09-26 us-gaap:RevenueFromContractWithCustomerExcludingAssessedTax ASC 606 False
2019-09-28 us-gaap:RevenueFromContractWithCustomerExcludingAssessedTax ASC 606 False
2018-09-29 us-gaap:RevenueFromContractWithCustomerExcludingAssessedTax ASC 606 False
2017-09-30 us-gaap:RevenueFromContractWithCustomerExcludingAssessedTax ASC 606 False
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;revenue_standard&lt;/code&gt; is &lt;code&gt;ASC 605&lt;/code&gt;, &lt;code&gt;ASC 606&lt;/code&gt;, or &lt;code&gt;None&lt;/code&gt; with &lt;code&gt;revenue_standard_reason&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;concept_changed&lt;/code&gt; turns &lt;code&gt;True&lt;/code&gt; when the company switched concepts and the periods reported under both differ by more than 1 percent. &lt;code&gt;concept_change&lt;/code&gt; then holds the old concept, the new one and the difference. If you are computing growth across that boundary, you are comparing two definitions, and now you know.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A growth table with pandas
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;

&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])[[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fiscal_year&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;period_end&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;form&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;filed_date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;source_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort_values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fiscal_year&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;yoy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;pct_change&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; fiscal_year period_end        value form filed_date                                                                                       source_url       yoy
        2017 2017-09-30 229234000000 10-K 2019-10-31 https://www.sec.gov/Archives/edgar/data/320193/000032019319000119/0000320193-19-000119-index.htm       NaN
        2018 2018-09-29 265595000000 10-K 2019-10-31 https://www.sec.gov/Archives/edgar/data/320193/000032019319000119/0000320193-19-000119-index.htm  0.158620
        2019 2019-09-28 260174000000 10-K 2019-10-31 https://www.sec.gov/Archives/edgar/data/320193/000032019319000119/0000320193-19-000119-index.htm -0.020411
        2020 2020-09-26 274515000000 10-K 2020-10-30 https://www.sec.gov/Archives/edgar/data/320193/000032019320000096/0000320193-20-000096-index.htm  0.055121
        2021 2021-09-25 365817000000 10-K 2021-10-29 https://www.sec.gov/Archives/edgar/data/320193/000032019321000105/0000320193-21-000105-index.htm  0.332594
        2022 2022-09-24 394328000000 10-K 2022-10-28 https://www.sec.gov/Archives/edgar/data/320193/000032019322000108/0000320193-22-000108-index.htm  0.077938
        2023 2023-09-30 383285000000 10-K 2023-11-03 https://www.sec.gov/Archives/edgar/data/320193/000032019323000106/0000320193-23-000106-index.htm -0.028005
        2024 2024-09-28 391035000000 10-K 2024-11-01 https://www.sec.gov/Archives/edgar/data/320193/000032019324000123/0000320193-24-000123-index.htm  0.020220
        2025 2025-09-27 416161000000 10-K 2025-10-31 https://www.sec.gov/Archives/edgar/data/320193/000032019325000079/0000320193-25-000079-index.htm  0.064255
        2026 2026-09-26 478834000000 10-K 2026-11-03 https://www.sec.gov/Archives/edgar/data/320193/000032019326000026/0000320193-26-000026-index.htm  0.150598
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every row still carries &lt;code&gt;source_url&lt;/code&gt;, which is the part the rest of this post is about.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check a number against the filing
&lt;/h2&gt;

&lt;p&gt;Take the newest annual row:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;latest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;latest&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;latest&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;form&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;latest&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;filed_date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;latest&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;source_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;478834000000 10-K 2026-11-03
https://www.sec.gov/Archives/edgar/data/320193/000032019326000026/0000320193-26-000026-index.htm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;source_url&lt;/code&gt; opens the filing index on sec.gov. From there, open the 10-K document and find the income statement; the total net sales line for that fiscal year is the number the API returned. If it is not, the API is wrong, and I want to know: there is a daily public check at &lt;a href="https://api.netnestdesign.com/v1/accuracy" rel="noopener noreferrer"&gt;https://api.netnestdesign.com/v1/accuracy&lt;/a&gt; that does exactly this comparison for 25 companies against their own filings, and the gate is 25 of 25.&lt;/p&gt;

&lt;p&gt;A number you can trace is a number you can defend.&lt;/p&gt;

&lt;h2&gt;
  
  
  Errors you will meet
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;RateLimitError&lt;/code&gt; (HTTP 429) carries &lt;code&gt;retry_after&lt;/code&gt; in seconds when the server sends one. The free key is 100 calls a day.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;PaymentRequiredError&lt;/code&gt; (HTTP 402) only appears on paid routes with no key; the API also accepts x402 payments from agents, which is a different post.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;NetNestError&lt;/code&gt; for the rest, with &lt;code&gt;status&lt;/code&gt;, &lt;code&gt;code&lt;/code&gt; and &lt;code&gt;message&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What the API does not have: foreign filers on 20-F, prices, estimates. Terms allow commercial use and display with attribution to the filing; bulk redistribution is not allowed. Docs and plans: &lt;a href="https://api.netnestdesign.com/docs" rel="noopener noreferrer"&gt;https://api.netnestdesign.com/docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Data from SEC filings. Not investment advice.&lt;/p&gt;

</description>
      <category>python</category>
      <category>finance</category>
      <category>api</category>
      <category>sec</category>
    </item>
  </channel>
</rss>
