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.