Pypistats
Command-line interface to PyPI Stats API to get download stats for Python packages
Install / Use
/learn @hugovk/PypistatsREADME
pypistats
Python interface to PyPI Stats API to get aggregate download statistics on Python packages on the Python Package Index without having to execute queries directly against Google BigQuery.
Data is available for the last 180 days. (For longer time periods, pypinfo can help, you'll need an API key and get free quota.)
Installation
From PyPI
python3 -m pip install --upgrade pypistats
From source
git clone https://github.com/hugovk/pypistats
cd pypistats
python3 -m pip install .
Example command-line use
Run pypistats with a subcommand (corresponding to
PyPI Stats endpoints), then options for that
subcommand.
Top-level help:
<!-- [[[cog from scripts.run_command import run run("pypistats --help") ]]] -->$ pypistats --help
usage: pypistats [-h] [-V] {recent,overall,python_major,python_minor,system} ...
positional arguments:
{recent,overall,python_major,python_minor,system}
options:
-h, --help show this help message and exit
-V, --version show program's version number and exit
<!-- [[[end]]] -->
Help for a subcommand:
<!-- [[[cog run("pypistats recent --help") ]]] -->$ pypistats recent --help
usage: pypistats recent [-h] [-p {day,week,month}]
[-f {html,json,pretty,md,markdown,rst,tsv}] [-j] [-v]
[package]
Retrieve the aggregate download quantities for the last 1/7/30 days, excluding
downloads from mirrors
positional arguments:
package package name, or dir to check pyproject.toml/setup.cfg
(default: .)
options:
-h, --help show this help message and exit
-p, --period {day,week,month}
-f, --format {html,json,pretty,md,markdown,rst,tsv}
The format of output (default: pretty)
-j, --json Shortcut for "-f json" (default: False)
-v, --verbose Print debug messages to stderr (default: False)
<!-- [[[end]]] -->
Get recent downloads:
<!-- [[[cog run("pypistats recent pillow") ]]] -->$ pypistats recent pillow
┌───────────┬─────────────┬────────────┐
│ last_day │ last_month │ last_week │
├───────────┼─────────────┼────────────┤
│ 5,537,706 │ 225,816,599 │ 58,094,476 │
└───────────┴─────────────┴────────────┘
<!-- [[[end]]] -->
Help for another subcommand:
<!-- [[[cog run("pypistats python_minor --help") ]]] -->$ pypistats python_minor --help
usage: pypistats python_minor [-h] [-V VERSION]
[-f {html,json,pretty,md,markdown,rst,tsv}] [-j]
[-sd yyyy-mm[-dd]|name] [-ed yyyy-mm[-dd]|name]
[-m yyyy-mm|name] [-l] [-t] [-d] [--monthly] [-s SORT]
[-c {yes,no,auto}] [-v]
[package]
Retrieve the aggregate daily download time series by Python minor version number
positional arguments:
package package name, or dir to check pyproject.toml/setup.cfg
(default: .)
options:
-h, --help show this help message and exit
-V, --version VERSION
eg. 2.7 or 3.6 (default: None)
-f, --format {html,json,pretty,md,markdown,rst,tsv}
The format of output (default: pretty)
-j, --json Shortcut for "-f json" (default: False)
-sd, --start-date yyyy-mm[-dd]|name
Start date (default: None)
-ed, --end-date yyyy-mm[-dd]|name
End date (default: None)
-m, --month yyyy-mm|name
Shortcut for -sd & -ed for a single month (default: None)
-l, --last-month Shortcut for -sd & -ed for last month (default: False)
-t, --this-month Shortcut for -sd for this month (default: False)
-d, --daily Show daily downloads (default: False)
--monthly Show monthly downloads (default: False)
-s, --sort SORT Column to sort by (for example: downloads, date, category)
(default: downloads)
-c, --color {yes,no,auto}
Color terminal output (default: auto)
-v, --verbose Print debug messages to stderr (default: False)
<!-- [[[end]]] -->
Get version downloads:
<!-- [[[cog run("pypistats python_minor pillow --last-month") ]]] -->$ pypistats python_minor pillow --last-month
┌──────────┬─────────┬─────────────┐
│ category │ percent │ downloads │
├──────────┼─────────┼─────────────┤
│ 3.12 │ 29.56% │ 70,503,800 │
│ 3.11 │ 20.43% │ 48,711,283 │
│ 3.10 │ 14.74% │ 35,149,431 │
│ 3.13 │ 10.35% │ 24,680,814 │
│ 3.9 │ 8.24% │ 19,640,729 │
│ 3.7 │ 5.27% │ 12,565,151 │
│ 3.8 │ 3.45% │ 8,231,134 │
│ null │ 3.24% │ 7,734,467 │
│ 3.14 │ 2.17% │ 5,170,747 │
│ 3.6 │ 1.85% │ 4,406,662 │
│ 2.7 │ 0.70% │ 1,658,402 │
│ 3.5 │ 0.01% │ 19,506 │
│ 3.15 │ 0.00% │ 5,946 │
│ 3.4 │ 0.00% │ 866 │
│ 3.3 │ 0.00% │ 20 │
│ 3.2 │ 0.00% │ 1 │
│ Total │ │ 238,478,959 │
└──────────┴─────────┴─────────────┘
Date range: 2025-12-01 - 2025-12-31
<!-- [[[end]]] -->
You can format in Markdown, ready for pasting in GitHub issues and PRs:
<!-- [[[cog run("pypistats python_minor pillow --last-month --format md", with_console=False) ]]] -->| category | percent | downloads | | :------- | ------: | ----------: | | 3.12 | 29.56% | 70,503,800 | | 3.11 | 20.43% | 48,711,283 | | 3.10 | 14.74% | 35,149,431 | | 3.13 | 10.35% | 24,680,814 | | 3.9 | 8.24% | 19,640,729 | | 3.7 | 5.27% | 12,565,151 | | 3.8 | 3.45% | 8,231,134 | | null | 3.24% | 7,734,467 | | 3.14 | 2.17% | 5,170,747 | | 3.6 | 1.85% | 4,406,662 | | 2.7 | 0.70% | 1,658,402 | | 3.5 | 0.01% | 19,506 | | 3.15 | 0.00% | 5,946 | | 3.4 | 0.00% | 866 | | 3.3 | 0.00% | 20 | | 3.2 | 0.00% | 1 | | Total | | 238,478,959 |
Date range: 2025-12-01 - 2025-12-31
<!-- [[[end]]] -->These are equivalent (in May 2019):
pypistats python_major pip --last-month
pypistats python_major pip --month april
pypistats python_major pip --month apr
pypistats python_major pip --month 2019-04
And:
pypistats python_major pip --start-date december --end-date january
pypistats python_major pip --start-date dec --end-date jan
pypistats python_major pip --start-date 2018-12 --end-date 2019-01
Alternatively, use a local path as the package to look up the name from pyproject.toml
or setup.cfg:
$ pypistats recent .
┌──────────┬────────────┬───────────┐
│ last_day │ last_month │ last_week │
├──────────┼────────────┼───────────┤
│ 1,852 │ 51,264 │ 15,494 │
└──────────┴────────────┴───────────┘
<!-- [[[end]]] -->
<!-- [[[cog run("pypistats recent ../Pillow") ]]] -->
$ pypistats recent ../Pillow
┌───────────┬─────────────┬────────────┐
│ last_day │ last_month │ last_week │
├───────────┼─────────────┼────────────┤
│ 5,537,706 │ 225,816,599 │ 58,094,476 │
└───────────┴─────────────┴────────────┘
<!-- [[[end]]] -->
The default is to sort by downloads. To sort chronologically, use --sort date with
--daily or --monthly:
$ pypistats python_minor pillow --daily --last-month --sort date --version 3.14
┌──────────┬────────────┬─────────┬───────────┐
│ category │ date │ percent │ downloads │
├──────────┼────────────┼─────────┼───────────┤
│ 3.14 │ 2025-12-01 │ 3.49% │ 180,367 │
│ 3.14 │ 2025-12-02 │ 4.08% │ 210,894 │
│ 3.14 │ 2025-12-03 │ 4.69% │ 242,353 │
│ 3.14 │ 2025-12-04 │ 3.98% │ 205,681 │
│ 3.14 │ 2025-12-05 │ 3.48% │ 180,197 │
│ 3.14 │ 2025-12-06 │ 2.50% │ 129,155 │
│ 3.14 │ 2025-12-07 │ 2.70% │ 139,725 │
│ 3.14 │ 2025-12-08 │ 4.19% │ 216,851 │
│ 3.14 │ 2025-12-09 │ 4.05% │ 209,185 │
│ 3.14 │ 2025-12-10 │ 4.20% │ 217,293 │
│ 3.14 │ 2025-12-11 │ 3.86% │ 199,779 │
│ 3.14 │ 2025-12-12 │ 3.20% │ 165,700 │
│ 3.14 │ 2025-12-13 │ 2.06% │ 106,376 │
│ 3.14 │ 2025-12-14 │ 2.40% │ 124,187 │
│ 3.14 │ 2025-12-15 │ 4.21% │ 217,575 │
│ 3.14 │ 2025-12-16 │ 3.91% │ 202,199 │
│ 3.14 │ 2025-12-17 │ 3.99% │ 206,452 │
│ 3.14 │ 2025-12-18 │ 3.80% │ 196,669 │
│ 3.14 │ 2025-12-19 │ 3.30% │ 170,654 │
│ 3.14 │ 2025-1
Related Skills
gh-issues
353.1kFetch GitHub issues, spawn sub-agents to implement fixes and open PRs, then monitor and address PR review comments. Usage: /gh-issues [owner/repo] [--label bug] [--limit 5] [--milestone v1.0] [--assignee @me] [--fork user/repo] [--watch] [--interval 5] [--reviews-only] [--cron] [--dry-run] [--model glm-5] [--notify-channel -1002381931352]
node-connect
353.1kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
oracle
353.1kBest practices for using the oracle CLI (prompt + file bundling, engines, sessions, and file attachment patterns).
taskflow-inbox-triage
353.1kname: taskflow-inbox-triage description: Example TaskFlow authoring pattern for inbox triage. Use when messages need different treatment based on intent, with some routes notifying immediately, some w
