Skip to main content

steam-page-stats

CI PyPI License: MIT

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.

  • 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)

Source distribution for steam-page-stats 0.1.2
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)

Table of built distributions (wheels) for steam-page-stats 0.1.2
File Interpreter ABI Platform Actions
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 log

Release 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 log

Security 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.

Select from 2 files

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 log

A 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.

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