steam-page-stats
Fetch a Steam game's public page stats and apply the Boxleiter rule of thumb to estimate lifetime revenue from the review count. A plain version of a useful heuristic, with its uncertainty shown.
pip install steam-page-stats
steam-page-stats 1145360
Hades (appid 1145360)
developer: Supergiant Games
publisher: Supergiant Games
genres: Action, Indie, RPG
released: 17 Sep, 2020
price: $24.99
reviews: 205,000 total
review score: 97.56% positive
Boxleiter rule-of-thumb revenue estimate:
low (×30): $153.7M
median (×50): $256.1M
high (×63): $322.6M
⚠ This is a heuristic with ~24% of games off by >30% per the formula's
own author. For a calibrated P10–P90 launch cone (~82% nominal coverage,
81–86% realized per wishlist tier on 6,422 held-out launches), see
https://steamforecast.app
Why this exists
The Boxleiter method (Mike Boxleiter, 2010s) is the de-facto rule of thumb for estimating lifetime Steam revenue from public page data:
revenue ≈ review_count × multiplier × price
Modern multiplier estimates range 30–63 sales per Steam review, with significant per-genre variance.
This package gives you:
- A multiplier-bracketed estimate (low / median / high) so you see the uncertainty inherent in the heuristic
- A clean Python API for use in your own analysis pipelines
- A CLI for quick one-off lookups
The package is deliberately small. It does not try to be a calibrated forecaster — for that, you need wishlist-tier stratification, conformal prediction intervals, and a labelled corpus to validate against. That's a hard problem; the rule of thumb is not.
If you need calibrated revenue ranges validated on a held-out launch corpus (~82% nominal coverage, 81–86% realized per wishlist tier, n=6,422), plus causal estimates for marketing levers, see the full forecaster at SteamForecast — methodology and per-tier coverage stats are open at /methodology.
Install
pip install steam-page-stats
Or with optional dev dependencies for tests / linting:
pip install "steam-page-stats[dev]"
CLI usage
# human-readable
steam-page-stats 1145360
# machine-readable JSON
steam-page-stats 1145360 --json
# just page stats, skip Boxleiter
steam-page-stats 1145360 --no-boxleiter
Python API
import asyncio
from steam_page_stats import fetch_page_stats, boxleiter_estimate
async def main():
stats = await fetch_page_stats(1145360)
print(f"{stats.name}: {stats.review_count_total:,} reviews")
if stats.review_count_total and stats.price_cents:
est = boxleiter_estimate(stats.review_count_total, stats.price_cents)
print(f"Lifetime revenue estimate: ${est.revenue_low_dollars:,.0f} – "
f"${est.revenue_median_dollars:,.0f} – ${est.revenue_high_dollars:,.0f}")
asyncio.run(main())
For batch use, instantiate the client directly to share the underlying HTTP connection pool:
from steam_page_stats import SteamPageStatsClient
async def fetch_many(appids):
async with SteamPageStatsClient(throttle_s=1.0) as client:
for appid in appids:
stats = await client.fetch(appid)
yield stats
Rate limits + etiquette
This package uses Steam's public, unauthenticated Storefront and appreviews endpoints. Steam tolerates roughly 200 req/5min from a single IP across these endpoints. The default throttle of 1 req/sec keeps you well below that.
We send a transparent User-Agent header so you're identifiable per RFC
etiquette:
steam-page-stats/0.1 (+https://github.com/GC108/steam-page-stats; calibration-sanity-check)
If you'd rather not advertise this package, override it:
async with SteamPageStatsClient(user_agent="my-research-bot/1.0") as c: ...
Limitations
The Boxleiter heuristic is structurally biased on:
- Top-decile breakouts (Peak, Webfishing, etc.) — single-multiplier can't capture viral discovery. Per the formula's own author, ~24% of games are off by more than 30%.
- Free-to-play with cosmetic monetization — the formula assumes
revenue ∝ price × sales; F2P breaks that. - Long-tailed mid-tier where individual conversion ratios diverge by 10–20× at comparable wishlist counts (see steamforecast.app/methodology for the variance data).
For these cases, a calibrated cone with validated coverage beats a single-number heuristic. The rule of thumb is a useful sanity check, not a budget-decision tool.
Development
git clone https://github.com/GC108/steam-page-stats
cd steam-page-stats
pip install -e ".[dev]"
pytest
ruff check .
License
MIT — see LICENSE.
Related
- SteamForecast — calibrated launch revenue cones (~82% nominal coverage, 81–86% realized per wishlist tier on 6,422 held-out launches), causal marketing-lever estimates, and Total Lift Attribution to recover paid campaign wishlists Steam's UTM dashboard misses.
- Steam Web API documentation
- Boxleiter method, Mike Boxleiter (2014, updated 2023) — the original formulation and 2023 retrospective.
Metadata
Release files for steam-page-stats 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| steam_page_stats-0.1.2.tar.gz | 10.6 kB | With provenance | Details for steam_page_stats-0.1.2.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| steam_page_stats-0.1.2-py3-none-any.whl | Python 3 | none | any | Details for steam_page_stats-0.1.2-py3-none-any.whl |
Total release size: 21.6 kB
Release files / steam_page_stats-0.1.2.tar.gz
| Download URL | steam_page_stats-0.1.2.tar.gz |
|---|---|
| Size | 10.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
54fbf0d9bfc6d411d5d3357216c186a9924ab726fc2d1938562ef564700bba4b
|
|
BLAKE2b-256 checksum How to use checksums |
83116561d0b3321d1f039e3ff5656278cdadadb74b611df8244debf12992ad72
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 Oct 31, 2026.
Transparency logRelease files / steam_page_stats-0.1.2-py3-none-any.whl
| Download URL | steam_page_stats-0.1.2-py3-none-any.whl |
|---|---|
| Size | 11.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a5deca217ab9c3450d45558b1ad1fce64c4b3074b18490016e1044eb39cd9537
|
|
BLAKE2b-256 checksum How to use checksums |
a4fac39b73efc947752bbde0894b02080a40c3f4dcd7ca65c779a9c7604d6dd3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 Oct 31, 2026.
Transparency logSecurity for steam-page-stats 0.1.2
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.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for steam_page_stats-0.1.2.tar.gz
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 Oct 31, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.