Home / Guides / Boards & pay
Boards & pay

Shares outstanding and public float over time

Track a company's shares outstanding and public float from 10-K and 10-Q cover pages, detect stock splits and measure buybacks year over year.

Every 10-K and 10-Q cover page states the number of shares outstanding as of a recent date. The 10-K cover also states the public float: the market value of voting stock held by non-affiliates, measured on the last business day of the second fiscal quarter. Both are tagged in XBRL (dei:EntityCommonStockSharesOutstanding and dei:EntityPublicFloat), and /v1/shares-outstanding returns every value a company has reported:

{"cik": 320193,
 "outstandingShares": [{"value": 14594180000, "asOf": "2026-07-17", "form": "10-Q",
                        "accessionNo": "0000320193-26-000020", "filedAt": "2026-07-31"}],
 "publicFloat": [{"value": 3253431000000, "asOf": "2025-03-28", "form": "10-K",
                  "accessionNo": "0000320193-25-000079", "filedAt": "2025-10-31"}]}

The script

import os
import requests

BASE = "https://secfeedapi.com"
HEADERS = {"Authorization": f"Bearer {os.environ['SECFEED_KEY']}"}

d = requests.get(f"{BASE}/v1/shares-outstanding", params={"ticker": "AAPL"}, headers=HEADERS, timeout=120).json()

# 1. one value per date: amendments (10-K/A) repeat the original cover page date, keep the first filed
shares = {}
for x in sorted(d["outstandingShares"], key=lambda x: x["filedAt"]):
    shares.setdefault(x["asOf"], x)
shares = [shares[k] for k in sorted(shares)]
print(f"{len(shares)} share counts from {shares[0]['asOf']} to {shares[-1]['asOf']}\n")

# 2. year over year change in shares outstanding, using the cover page closest to each October
print("as of        shares (bn)    change   split-adjusted")
octobers = [x for x in shares if x["asOf"][5:7] == "10"]
for prev, cur in zip(octobers, octobers[1:]):
    ratio = cur["value"] / prev["value"]
    split = round(ratio) if ratio > 1.5 else 1      # a jump of 2x or more is a stock split, not issuance
    note = f"  ({split}-for-1 split)" if split > 1 else ""
    print(f"{cur['asOf']}   {cur['value'] / 1e9:>10.3f}   {ratio - 1:>+7.1%}   {ratio / split - 1:>+7.1%}{note}")
latest = shares[-1]
print(f"{latest['asOf']}   {latest['value'] / 1e9:>10.3f}   (latest, {latest['form']})")

# 3. public float: the market value of shares held by non-affiliates, from each 10-K cover page
print("\npublic float, as of the last day of the second fiscal quarter")
for x in sorted(d["publicFloat"], key=lambda x: x["asOf"])[-5:]:
    print(f"  {x['asOf']}   ${x['value'] / 1e12:.2f} trillion   ({x['form']} filed {x['filedAt']})")

Output

69 share counts from 2009-06-27 to 2026-07-17

as of        shares (bn)    change   split-adjusted
2010-10-15        0.917     +1.8%     +1.8%
2011-10-14        0.929     +1.3%     +1.3%
2012-10-19        0.941     +1.2%     +1.2%
2013-10-18        0.900     -4.4%     -4.4%
2014-10-10        5.865   +551.8%     -6.9%  (7-for-1 split)
2015-10-09        5.575     -4.9%     -4.9%
2016-10-14        5.332     -4.4%     -4.4%
2017-10-20        5.134     -3.7%     -3.7%
2018-10-26        4.745     -7.6%     -7.6%
2019-10-18        4.443     -6.4%     -6.4%
2020-10-16       17.002   +282.6%     -4.3%  (4-for-1 split)
2021-10-15       16.406     -3.5%     -3.5%
2022-10-14       15.908     -3.0%     -3.0%
2023-10-20       15.553     -2.2%     -2.2%
2024-10-18       15.116     -2.8%     -2.8%
2025-10-17       14.776     -2.2%     -2.2%
2026-07-17       14.594   (latest, 10-Q)

public float, as of the last day of the second fiscal quarter
  2021-03-26   $2.02 trillion   (10-K filed 2021-10-29)
  2022-03-25   $2.83 trillion   (10-K filed 2022-10-28)
  2023-03-31   $2.59 trillion   (10-K filed 2023-11-03)
  2024-03-29   $2.63 trillion   (10-K filed 2024-11-01)
  2025-03-28   $3.25 trillion   (10-K filed 2025-10-31)

Reading it

  • Splits show up as jumps. Apple's 7-for-1 split in 2014 and 4-for-1 split in 2020 multiply the share count. Dividing by the split factor gives the real change: Apple's count fell every year since 2013, between 2% and 8% a year, the footprint of its buyback program.
  • Cover page dates are not quarter ends. The count is "as of" a date close to filing, usually a few weeks after the period ends. Use asOf, not the fiscal period, when you line counts up with prices.
  • Public float is measured once a year, at the end of the second fiscal quarter, and reported on the next 10-K. It decides filer status (large accelerated filers have $700 million or more), which in turn sets filing deadlines.
  • Amendments repeat values. A 10-K/A repeats the cover page of the original 10-K, so the script keeps the first value per date.

Tips

  • Multiple share classes. Companies with several classes (for example Alphabet) report one value per class. Group by class, or sum them for a total count.
  • For dilution analysis, combine this with Equity Dilution: shares authorized, issued, treasury, diluted share count and buybacks from the financial statements.
  • For market cap, multiply the latest count by a price from your own market data source. SecFeed only serves SEC data.

Next steps

More boards & pay guides

Run this guide with your own key

500 free API calls a month. Every example on this page works on the free plan.

Get free API key →