Skip to content

Zach443/skins

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 

Repository files navigation

CS2 Skin Arbitrage Tracker

Monitors Steam Market and Skinport prices in real time and surfaces buy opportunities — skins where buying on Skinport and relisting on Steam yields a net profit after both platforms' fees.

How it works

Each refresh cycle the script:

  1. Fetches the lowest Steam Market listing price for each skin (one request per skin, 3s apart)
  2. Pulls all CS2 listings from Skinport in a single bulk request
  3. Calculates net profit after fees and sorts by gap, largest first
  4. Highlights any opportunity above the 12% threshold in green

Gap formula:

cost    = skinport_price × 1.12   (Skinport 12% buyer fee)
revenue = steam_price    × 0.85   (Steam 15% seller fee)
gap %   = (revenue − cost) / cost × 100

Setup

python -m venv venv
venv\Scripts\activate        # Windows
# source venv/bin/activate   # macOS / Linux

pip install -r requirements.txt
python arbitrage.py

Configuration

All tunable values are at the top of arbitrage.py:

Constant Default Description
SKINS 5 skins List of market_hash_name strings to monitor
GAP_THRESHOLD 12.0 Minimum net % to flag as an opportunity
REFRESH_INTERVAL 300 Seconds between full refreshes (5 min)
STEAM_DELAY 3.0 Seconds between Steam API calls
STEAM_SELLER_FEE 0.15 Steam + CS2 game fee (15%)
SKINPORT_BUY_FEE 0.12 Skinport buyer fee (12%)

Rate limits

API Limit Our usage
Steam Market ~20 req/min (unofficial) 1 req per 3s — safe up to ~65 skins at 5-min refresh
Skinport /v1/items 8 req / 5 min, cached 5 min 1 call per refresh cycle regardless of skin count

Skinport is a single bulk call so adding more skins costs nothing there. To watch more skins on Steam, increase REFRESH_INTERVAL proportionally — every extra minute of refresh window buys you ~15 more skins.

Skin naming

Names must match Steam's market_hash_name exactly:

  • Wear is spelled out: Factory New, Minimal Wear, Field-Tested, Well-Worn, Battle-Scarred
  • Knives require the prefix: ★ Karambit | Doppler (Factory New)
  • Doppler knives have multiple entries per phase on both platforms — the tracker automatically picks the cheapest

Skins currently monitored

Skin Notes
AK-47 | Redline (Field-Tested)
AWP | Asiimov (Field-Tested)
M4A4 | Howl (Minimal Wear) Contraband — no longer case-droppable
★ Karambit | Doppler (Factory New) Cheapest phase selected automatically
AK-47 | Case Hardened (Field-Tested)

Potential next steps

  • Expand skin list — the architecture supports up to ~65 skins at the current 5-min refresh with no other changes
  • Skinport API auth — add Basic auth (Client ID + Secret from Skinport account settings) for higher rate limit headroom
  • Price history — log each refresh to a local SQLite database to track gap trends over time and spot recurring opportunities
  • Alerts — send a desktop notification or Discord webhook when a new opportunity crosses the threshold
  • Fee configurability — Skinport's buyer fee varies by item (up to 12%); pulling the per-item fee from the API would make gap calculations more precise
  • Multi-currency support — the APIs both support EUR and other currencies; useful if operating from outside the US
  • StatTrak / souvenir variants — currently only tracks base skins; StatTrak versions often show different gap profiles
  • CLI skin management — add/remove skins from the watched list without editing the source file

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages