Export your full Steam game library to a CSV file with rich metadata from four APIs
Project description
Steam Library Exporter
Export your full Steam game library to CSV or JSON with rich metadata from four APIs.
Why?
Steam shows you your library — it doesn't let you query it. This tool pulls playtime, genres, prices, reviews, Metacritic scores, community tags, and estimated ownership data into a single flat CSV you can open in Excel, pandas, Google Sheets, Tableau, or any BI tool.
Features
| Feature | Description |
|---|---|
| Interactive mode | Run without arguments for a guided step-by-step setup — no flags to memorize |
| 24 metadata columns | appid, name, playtime, genres, developers, publishers, release date, Metacritic score, prices, review counts, SteamSpy tags, and more |
| CSV & JSON export | --format csv (default) or --format json for structured data |
| Four API sources | Steam Web API, Steam Store API, Steam Reviews API, SteamSpy |
| Sort options | --sort playtime|name|metacritic|reviews |
| Filter unplayed | --min-playtime N to skip games under N hours |
| Environment variables | Set STEAM_API_KEY and STEAM_ID once — never retype credentials |
| Progress with ETA | Shows elapsed time and estimated time remaining per game |
| Export summary | Prints total playtime, played/unplayed counts, top genres, and avg Metacritic |
| Optional SteamSpy | Skip with --no-steamspy to cut export time by ~25% |
| Partial export | Use --limit N to test with a small batch before running the full library |
| Custom output path | Override the default filename with --output |
| Cross-platform | Runs on Windows, macOS, and Linux wherever Python 3.10+ is installed |
Quick Start
1. Install
git clone https://github.com/davidmalko87/steam-library-exporter.git
cd steam-library-exporter
pip install -r requirements.txt
2. Configure
You need two things:
| Item | How to get it |
|---|---|
| Steam Web API key | steamcommunity.com/dev/apikey (free) |
| Steam64 ID | steamid.io — 17-digit number |
Set both Profile and Game details to Public in Steam → Settings → Privacy.
3. Run
# Interactive mode — guided step-by-step (no flags needed)
python steam_export.py
# Quick test — top 5 games by playtime
python steam_export.py --key YOUR_API_KEY --steamid YOUR_STEAM64_ID --limit 5
# Full library export
python steam_export.py --key YOUR_API_KEY --steamid YOUR_STEAM64_ID
# Use environment variables (set once, run without --key / --steamid)
export STEAM_API_KEY=YOUR_API_KEY
export STEAM_ID=YOUR_STEAM64_ID
python steam_export.py
# Export to JSON
python steam_export.py --key YOUR_API_KEY --steamid YOUR_STEAM64_ID --format json
# Sort by name, skip unplayed games
python steam_export.py --key YOUR_API_KEY --steamid YOUR_STEAM64_ID --sort name --min-playtime 1
# Faster — skip SteamSpy data
python steam_export.py --key YOUR_API_KEY --steamid YOUR_STEAM64_ID --no-steamspy
# Custom output filename
python steam_export.py --key YOUR_API_KEY --steamid YOUR_STEAM64_ID --output my_games.csv
Configuration Reference
| Flag | Required | Default | Description |
|---|---|---|---|
--key KEY |
Yes* | — | Steam Web API key |
--steamid STEAMID |
Yes* | — | Steam64 ID (17-digit number) |
--output OUTPUT |
No | steam_library.<format> |
Output file path |
--format FORMAT |
No | csv |
Export format: csv or json |
--sort FIELD |
No | playtime |
Sort by: playtime, name, metacritic, or reviews |
--min-playtime N |
No | 0 (all) |
Minimum playtime in hours to include a game |
--no-steamspy |
No | off | Skip SteamSpy API calls (faster export) |
--limit N |
No | 0 (all) |
Export only the top N games by playtime |
--version |
No | — | Print version and exit |
* Not required if the corresponding environment variable is set.
Environment Variables
| Variable | Replaces |
|---|---|
STEAM_API_KEY |
--key |
STEAM_ID |
--steamid |
Output Columns
appid, name, playtime_hours, playtime_2weeks_hours, type, developers, publishers, genres, categories, release_date, metacritic_score, price_current, price_initial, is_free, short_description, header_image, total_positive, total_negative, review_score_desc, total_reviews, estimated_owners, avg_playtime_global, median_playtime_global, steamspy_tags
Sample rows
appid,name,playtime_hours,metacritic_score,genres,price_current,review_score_desc,estimated_owners
570,Dota 2,1842.3,90,Action;Free to Play,0.0,Overwhelmingly Positive,100000000-200000000
730,Counter-Strike 2,634.1,83,Action,0.0,Very Positive,50000000-100000000
1091500,Cyberpunk 2077,112.7,86,Action;RPG,29.99,Very Positive,10000000-20000000
Project Structure
steam-library-exporter/
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.yml
│ │ └── feature_request.yml
│ ├── workflows/
│ │ └── ci.yml
│ └── PULL_REQUEST_TEMPLATE.md
├── steam_export.py # CLI entry point and all logic
├── requirements.txt # Python dependencies
├── CHANGELOG.md # Version history
├── CONTRIBUTING.md # Development and versioning guide
├── LICENSE # MIT
└── README.md
Known Limitations
- Rate limits: Steam Store API requires ~1.5 s between requests. A 200-game library takes roughly 13 minutes.
- Private profiles: The tool cannot read libraries set to Private in Steam Privacy Settings.
- Free-to-play games: Some F2P titles may lack price data in the Store API response.
- SteamSpy accuracy: Estimated ownership ranges are approximate (SteamSpy infers data, Steam does not publish it).
- No incremental export: The script always fetches and writes the full library from scratch.
Security
Never commit your API key. The
.gitignoreexcludes common credential files (.env,*.key), but always verify before pushing.
Your Steam Web API key is read-only and scoped to public data, but treat it like any credential.
License
MIT © 2026 David Malko
Links
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file steam_library_exporter-1.1.0.tar.gz.
File metadata
- Download URL: steam_library_exporter-1.1.0.tar.gz
- Upload date:
- Size: 13.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
22eb995f81e8bafb44059a59c7f1319f36672345c26c6b906a967efd7a0e67a0
|
|
| MD5 |
c67254162e5e6196aaa4febfd290c335
|
|
| BLAKE2b-256 |
1b92b4e8c0906f32492e0c18832065f095b58cc00b971b0a729b425fe58334cc
|
Provenance
The following attestation bundles were made for steam_library_exporter-1.1.0.tar.gz:
Publisher:
publish.yml on davidmalko87/steam-library-exporter
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
steam_library_exporter-1.1.0.tar.gz -
Subject digest:
22eb995f81e8bafb44059a59c7f1319f36672345c26c6b906a967efd7a0e67a0 - Sigstore transparency entry: 1285714984
- Sigstore integration time:
-
Permalink:
davidmalko87/steam-library-exporter@baea093484c3ccac06a9bc20f28d3dd83439f858 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/davidmalko87
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@baea093484c3ccac06a9bc20f28d3dd83439f858 -
Trigger Event:
push
-
Statement type:
File details
Details for the file steam_library_exporter-1.1.0-py3-none-any.whl.
File metadata
- Download URL: steam_library_exporter-1.1.0-py3-none-any.whl
- Upload date:
- Size: 11.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
927731af87cdcbc06ab99d9f1639dfd5437f0195a88309c908ee9b934ad26fc5
|
|
| MD5 |
52a2be183d2cf34d92c35dc076452edc
|
|
| BLAKE2b-256 |
308c25ec8bd38c0a2ecc7d005dfd2cf1ab72c30ed2f78f8bff47a76d865cfb90
|
Provenance
The following attestation bundles were made for steam_library_exporter-1.1.0-py3-none-any.whl:
Publisher:
publish.yml on davidmalko87/steam-library-exporter
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
steam_library_exporter-1.1.0-py3-none-any.whl -
Subject digest:
927731af87cdcbc06ab99d9f1639dfd5437f0195a88309c908ee9b934ad26fc5 - Sigstore transparency entry: 1285715054
- Sigstore integration time:
-
Permalink:
davidmalko87/steam-library-exporter@baea093484c3ccac06a9bc20f28d3dd83439f858 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/davidmalko87
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@baea093484c3ccac06a9bc20f28d3dd83439f858 -
Trigger Event:
push
-
Statement type: