Match up the two responses by year and compute the OA percentage.
import requeststotal_resp = requests.get( "https://api.openalex.org/works", params={"filter": "publication_year:2015-2025", "group_by": "publication_year"}).json()oa_resp = requests.get( "https://api.openalex.org/works", params={"filter": "publication_year:2015-2025,open_access.is_oa:true", "group_by": "publication_year"}).json()total_by_year = {g["key"]: g["count"] for g in total_resp["group_by"]}oa_by_year = {g["key"]: g["count"] for g in oa_resp["group_by"]}for year in sorted(total_by_year): total = total_by_year[year] oa = oa_by_year.get(year, 0) closed = total - oa pct = 100 * oa / total print(f"{year}: {total:>12,} total | {oa:>12,} OA | {closed:>12,} closed | {pct:.1f}%")
Data retrieved February 2026. Counts are approximate and will shift as OpenAlex continues indexing.
Year
Total
OA
Closed
OA %
2015
9.9M
3.1M
6.9M
30.8%
2016
10.3M
3.4M
6.9M
33.0%
2017
10.1M
3.6M
6.5M
35.3%
2018
10.1M
4.0M
6.1M
39.6%
2019
10.5M
4.4M
6.0M
42.5%
2020
11.2M
5.4M
5.8M
48.4%
2021
10.2M
5.6M
4.7M
54.2%
2022
9.8M
6.0M
3.8M
61.2%
2023
10.4M
6.5M
4.0M
62.0%
2024
10.2M
6.2M
4.0M
60.8%
2025
14.0M
9.5M
4.5M
67.9%
Open access has grown from roughly 31% to 68% of indexed works over the last decade. The crossover point — where OA works first outnumbered closed — was around 2021.