A Discord bot that polls the Bhopp MM2 marketplace
(api.sublimelistings.com:5006) and DMs you a "Snipe Hit" alert whenever an item is
listed meaningfully below its learned normal price. Read-only: it never buys, trades, or
touches balances — it only alerts.
Bhopp's API returns HTTP 403 to unrecognized clients and Bhopp's Terms of Service
prohibit "use of any automated software," with account and balance forfeiture listed as a
penalty. This bot reaches the listing endpoint by sending the client-fingerprint header the
site itself sends (x-client-fp), which means it is operating past a protection Bhopp put
up on purpose, against their stated terms.
That is a real risk to whatever account is associated with the traffic. If you're handing this to a client, make sure they accept that risk knowingly. A protection-respecting alternative (RoSkins, whose listing API is public and whose terms don't forbid it) was the prior approach; this build exists because Bhopp was explicitly requested. Use responsibly and at your own risk.
Bhopp listings carry a value field, but for sniping the bot learns each item's normal
price itself: every poll it records observed prices and keeps a rolling median per item name
(the baseline). A new listing fires an alert when:
discount = (baseline - listed_price) / baseline
alert if discount >= MIN_DISCOUNT_PCT (default 5%)
Because it learns from observed data, the bot needs a warm-up period (a few polls, and at
least MIN_SAMPLES observations of a given item) before it will alert on that item. Baselines
and already-alerted listing IDs persist in data/baseline.json, so warm-up happens only once.
A /watch <item> <max_price> command sets a hard price ceiling that overrides the baseline for
that item.
-
Create a Discord application + bot at https://discord.com/developers/applications → New Application → Bot. Copy the token. No privileged intents needed — the bot only DMs you, so it just needs a mutual server with you (invite it anywhere you're in) or DMs enabled.
-
Get your Discord user ID — enable Developer Mode (Settings → Advanced), then right-click your name → Copy User ID.
-
Configure
cp .env.example .env # edit .env: set DISCORD_TOKEN and OWNER_USER_ID -
Install & run
pip install -U discord.py aiohttp python-dotenv python3 bot.py
| Command | What it does |
|---|---|
/search <query> [limit] |
Look up current listings by name |
/deals [min_discount] |
Scan the market for listings below their value |
/watch <item> <max_price> |
Add a hard price ceiling to the sniper watchlist |
/watchlist |
Show the current watchlist |
/unwatch <item> |
Remove an item from the watchlist |
Background: every POLL_INTERVAL_MS the bot scans the newest FETCH_LIMIT listings and DMs
you on each snipe hit.
| Var | Default | Meaning |
|---|---|---|
DISCORD_TOKEN |
— | Bot token (required) |
OWNER_USER_ID |
— | Discord user ID that receives the DMs (required) |
MIN_DISCOUNT_PCT |
5 |
Minimum % below baseline to trigger an alert |
POLL_INTERVAL_MS |
30000 |
How often to poll Bhopp (ms) |
FETCH_LIMIT |
50 |
Listings scanned per poll |
MIN_SAMPLES |
4 |
Observations needed for an item before it can alert |
bot.py— the full bot: slash commands + background sniper, DMs the owner, persists state.sniper.py— standalone webhook-only version (no slash commands), if you just want alerts.data/baseline.json— persisted price history + alerted IDs (auto-created).
- If Bhopp validates
x-client-fpfor real (not just presence), alerts will start failing with 403 — grab a live fingerprint from the browser's Network tab and set it in the headers. - The baseline is only as good as the data it has seen; rare items take longer to become reliable.
- If Bhopp changes its API shape,
normalize()andfetch_listings()inbot.pyare the only parts that need updating. - The bot never buys anything — acting on an alert is a manual, human decision.