Skip to main content

How many of your PyPI downloads were people?

You published a package. The badge says a number. You want to know what the number actually is.

pip install pypi-real-downloads
real-downloads your-package-name

Or without installing anything:

uvx --from pypi-real-downloads real-downloads your-package-name

No account, no API key, no signup. Standard library only — this package has zero dependencies.


What it prints

A real run against a real package. This is verbatim output, not an illustration:

  agent-audit-ledger  —  last 30 days
  ==============================================================

  headline  (the number on the badge)                 362
  could have been a person                             11   3.0%
  [#...........................]

  the person-possible side
    pip                                11     3.0%

  the rest, and why each one is not a person
    (no installer header)             175    48.3%   sent no installer header (scrapers, CDNs, unattributed automation)
    Browser                            74    20.4%   a browser fetching the file, not installing it
    bandersnatch                       64    17.7%   declared PyPI mirror
    requests                           38    10.5%   a bare HTTP client script

Three percent. That is the author's own other package, measured with this tool and published rather than quietly left out.

Run real-downloads --demo to see the layout with no network at all, before you point it at anything of yours.


Where the number comes from

PyPI publishes its download log, and every row in it records which installer asked. pip is in there. So is bandersnatch, which is a declared full mirror that downloads everything ever published, forever, on a schedule. So is the empty string, which is whatever sent no installer header at all.

The split is that column, grouped. There is no model, no heuristic, no traffic-shape guessing. Every installer on the not-a-person side is printed with the one-line reason it is there, so if you think a line is wrong you can argue with that line instead of with the total.

The data is PyPI's own public download log, read through ClickHouse's free demo endpoint. Nothing is written; no credential is sent.


What the number does not mean

"Could have been a person" is a ceiling, not a headcount. CI runners drive pip. Docker builds drive pip. Dependency bots drive pip. The installer field cannot tell you which of those you are looking at, and this tool will not pretend otherwise. What it replaces was the ceiling on the ceiling.

If your number comes back at 3%, the useful reading is not "only 11 real users". It is: the headline was answering a different question than the one you were asking it.


Why it sometimes refuses to print

The endpoint this reads from will, under load, return the aggregate of a partially-read scan with HTTP 200 and no warning. A truncated read can only lose rows, so its wrong answer is always smaller than the truth — which means it always points at "nobody downloaded this", which is the exact conclusion you came here to check.

So before printing anything about your package, it asks about a package that cannot possibly be small, and if the answer about that comes back small, it prints nothing and exits non-zero:

  Not printing a number.

  The check that runs before every measurement did not pass:
    requests returned nothing. Either the endpoint is not answering
    or the dataset moved; no number below is a measurement.

A number from a failing instrument is not a small number. It is an unknown one. The mechanism, with a reproduction and the one URL parameter that turns the silence into an error, is written up in A-ZERO-THAT-MEANS-UNKNOWN.md.


Two things it will not do

It will not tell you the number is fine. There is no grade, no score, no "healthy range". It prints the split and the reasons and stops.

It will not ask you for anything. No signup, no star, no telemetry, no reply. You run it, you get your number, and that is the end of the transaction.


  • ARE-PYPI-DOWNLOAD-COUNTS-REAL.md — the same question at population scale instead of for your package, and what a brand-new package's first days actually look like.
  • reach_probe.py, shipped inside this package, is the measurement itself: python3 -m reach_probe --selftest runs its counterexample suite, and the installer classification lists are in the open at the top of the file.

License

MIT.

Metadata

Release files for pypi-real-downloads 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pypi-real-downloads 0.1.0
File Size Uploaded
pypi_real_downloads-0.1.0.tar.gz 17.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pypi-real-downloads 0.1.0
File Interpreter ABI Platform
pypi_real_downloads-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 35.2 kB

Release files / pypi_real_downloads-0.1.0.tar.gz

Download URL pypi_real_downloads-0.1.0.tar.gz
Size 17.1 kB
Tags Source
SHA-256 checksum
How to use checksums
383736f9669cd657dd43fda33115c4e99c2dc45a8b420e16936a5dfcc9b441e0
BLAKE2b-256 checksum
How to use checksums
931e40e316eb230f0449a88fb6dec182fcf537c7cb7db2f536a57c530d556de8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.

Transparency log

Release files / pypi_real_downloads-0.1.0-py3-none-any.whl

Download URL pypi_real_downloads-0.1.0-py3-none-any.whl
Size 18.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f55f133263d92b2d3d1bef5fb9cdf402feeca6e252542f224d732a2dbe6b2667
BLAKE2b-256 checksum
How to use checksums
4f39e034427ffe7ca75b45a0a4d7b332d89e123c781e670e4fd45b5bc6c1a82b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page