A command-line tool that checks Steam accounts against the live Steam API. It tells you the country, Steam level, game count, VAC ban status, trade ban status, and whether the account is limited — all without any browser automation.
- 🐍 Python 3.8+
richlibrary (pip install rich)- 🌐 Proxy optional — You can run direct mode fine. A proxy is only useful if you're mass-checking and start hitting per-IP rate limits.
Drop your combo list in the same folder as the script. One account per line, username:password format:
john_doe:hunter2
jane123:p@ssw0rd99
Note: unlike Disney+, Steam uses usernames not emails. Make sure your combo list uses Steam usernames.
python3 steam_chk.py
You'll get a menu:
1. Check combo file
2. Check single account
3. Settings
0. Exit
Go to Settings first and set your proxy. When you pick residential mode it will immediately ask for the URL.
Proxy formats both work:
host:port:user:pass
http://user:pass@host:port
Example with dummy details:
Choice > 3
Mode (residential/list/direct) > residential
Proxy URL > proxy.example.com:8080:myuser:mypass123
Saved: http://myuser:***@proxy.example.com:8080
Other settings you can change:
- 👷 Workers — how many accounts check in parallel (default 5)
- ⏱️ Timeout — seconds before a request gives up (default 20)
- ⏳ Delay — gap between submitting each account (default 1.0s)
Steam's login API uses RSA-encrypted passwords — the script handles this entirely from scratch with zero extra dependencies:
- Fetches Steam's RSA public key for the username
- Encrypts the password locally using PKCS#1 v1.5
- Sends the encrypted credentials to Steam's auth API
- Polls for the access token
- Uses the token to pull games, level, bans, and country
If an account has Steam Guard (email or mobile 2FA), the script detects it at step 3 — the credentials are confirmed valid but the account info can't be pulled without the guard code. These are saved as hits marked Guard = Email or Guard = Mobile.
While checking you'll see live results as they come in. When the run finishes it prints a two-section summary:
------------------- No Value --------------------
1. broke_gamer:hunter2 | Guard = None | Country = US | Level = 0 | Games = 0 | VACBans = 0 | Tradeban = false | Limited = true
------------------ Has Value --------------------
1. john_doe:p@ssw0rd99 | Guard = None | Country = GB | Level = 42 | Games = 183 | VACBans = 0 | Tradeban = false | Limited = false
💾 The same format gets written to hits.txt in the script folder.
| Field | Description |
|---|---|
Guard |
Steam Guard status — None, Email, or Mobile |
Country |
Country code from Steam profile |
Level |
Steam account level |
Games |
Number of owned games (paid only, free games excluded) |
VACBans |
Number of VAC bans on record |
Tradeban |
Whether trade is restricted |
Limited |
true if the account has never made a purchase (level 0, 0 games) |
- ❌ BAD — wrong password or account doesn't exist
⚠️ ERR — network issue, proxy died, timeout, or rate-limited- 🛡️ Guard hits (yellow) — valid credentials, but Steam Guard is blocking full access
- 🎮 Has Value (green) — account has paid games in the library
- 🐢 If you're seeing a lot of ERR/rate-limit, bump the delay up to 2s and drop workers to 3
- 🔒 Sticky-session residential proxies work best — the full auth flow (RSA → begin → poll → info) needs to come from the same IP
⚠️ For educational purposes only.