List your bot
Push your trading bot's status, prices and stock to the SteamSets bot directory and the level-up calculator.
SteamSets lists Steam trading bots in its bot directory. The level-up calculator uses the same data to tell users which bots to buy sets from. Your bot keeps its listing current when it sends its status, prices and stock to one endpoint.
Register the bot
Sign in on steamsets.com with the Steam account that owns the bot, and open Your bots. Register the bot with its SteamID64, a listing name and its type. Register each bot account separately.
Save the bot key
SteamSets shows the bot key (ssbot_…) one time only, and stores only a hash of it. Each bot has its own key. This key is not a developer API key, and it works only for pushing that bot’s data.
Pay the listing fee
Listing costs a one-time fee of 1 TF2 key. A new bot stays pending until staff approve it. You can push data while the bot is pending, so the listing is complete when it goes live.
Push updates
Send the bot’s data to POST /v1/bot.update, as the next sections show.
Push updates
POST https://api.steamsets.com/v1/bot.update
Authorization: Bearer ssbot_…
Content-Type: application/json
A successful push gets 204 No Content:
- A bad or missing bot key gets
401 Unauthorized. - An invalid body gets
400 Bad Request, with the reason in the response.
Push when your prices or stock change, and at least every 30 minutes. A bot with no push for 1 hour shows as stale. A bot with no push for 24 hours is hidden from the directory.
Partial updates
Every field is optional:
- Missing field. A field you leave out keeps its stored value. This applies down to each single price and count.
- Zero.
0removes a value. For example,"buy": 0stops buying. - Set stock.
sets.stockreplaces the full set stock when you send it. Send the complete stock each time, not the change.
So a full push and a push that changes only the TF2 sell price both work.
Body
{
"online": true,
"sets": {
"stock": {
"normal": { "440": 12, "730": 3, "570": 5 },
"foil": { "730": 1 }
},
"limits": { "maxPerApp": 5 },
"prices": {
"tf2": { "sell": 9.5, "buy": 11 },
"cs2": { "sell": 9, "buy": 10.5 },
"hydra": { "sell": 8 },
"tod": { "sell": 4 },
"gems": { "sell": 450, "buy": 380 }
}
},
"gems": {
"stock": 250000,
"prices": { "tf2": { "sell": 3200, "buy": 3500 } }
},
"keys": { "tf2": 40, "cs2": 12, "hydra": 0, "tod": 3 },
"crypto": {
"prices": [
{ "coin": "btc", "sell": "0.0000038" },
{ "coin": "ltc", "sell": "0.00071", "buy": "0.0005" }
]
}
}
Send only the markets that your bot trades. A level-up bot that sells sets for TF2 keys needs only online, sets.stock and sets.prices.tf2.
| Field | Description |
|---|---|
online |
true when the bot accepts trades. |
sets.stock.normal |
App ID to the number of complete normal sets that the bot holds. |
sets.stock.foil |
App ID to the number of complete foil sets that the bot holds. |
sets.limits.maxPerApp |
The maximum number of sets of one app that the bot sells to one user. 0 means no limit. |
sets.prices.{tf2,cs2,hydra,tod} |
Sets per key, or per Tour of Duty ticket. |
sets.prices.gems |
Gems per set. |
gems.stock |
The number of gems that the bot holds. |
gems.prices.{tf2,cs2,hydra,tod} |
Gems per key, or per ticket. |
keys.{tf2,cs2,hydra,tod} |
The number of keys and tickets that the bot holds. |
crypto.prices[] |
One entry for each coin. coin is the ticker (btc, eth, ltc), and sell and buy are coins per set, as decimal strings. |
The bot.update reference lists every field with its type.
Sell and buy
Both sides are from the point of view of the user who trades with your bot:
sellis the price at which your bot sells."tf2": { "sell": 9.5 }means that the user gets 9.5 sets for 1 TF2 key.buyis the price at which your bot buys."tf2": { "buy": 11 }means that the user gives 11 sets and gets 1 TF2 key.
A set is complete when the bot holds every card of it. Count only the sets that your bot sells. The calculator sends users to your bot for the stock you report, so stock that is too high sends users for sets that the bot does not have.
Examples
A full push from a level-up bot:
curl -X POST https://api.steamsets.com/v1/bot.update \
-H "Authorization: Bearer $STEAMSETS_BOT_KEY" \
-H "Content-Type: application/json" \
-d '{"online":true,"sets":{"stock":{"normal":{"440":12,"730":3}},"limits":{"maxPerApp":5},"prices":{"tf2":{"sell":9.5,"buy":11}}},"keys":{"tf2":40}}'
Stop buying sets for TF2 keys, and change nothing else:
curl -X POST https://api.steamsets.com/v1/bot.update \
-H "Authorization: Bearer $STEAMSETS_BOT_KEY" \
-H "Content-Type: application/json" \
-d '{"sets":{"prices":{"tf2":{"buy":0}}}}'
Mark the bot as offline:
curl -X POST https://api.steamsets.com/v1/bot.update \
-H "Authorization: Bearer $STEAMSETS_BOT_KEY" \
-H "Content-Type: application/json" \
-d '{"online":false}'
Use your steam.supply or steamtradebots.com code
If your bot already pushes to steam.supply or steamtradebots.com, you can keep that code. Change the base URL, and use your SteamSets bot key:
| Your current format | SteamSets URL |
|---|---|
steam.supply POST /API/{KEY}/updateBot |
POST https://api.steamsets.com/compat/steamsupply/API/{KEY}/updateBot |
steam.supply GET /API/{KEY}/update/?tf2rate=… |
GET https://api.steamsets.com/compat/steamsupply/API/{KEY}/update/?tf2rate=… |
steamtradebots.com POST /api/v1/bot/update.php |
POST https://api.steamsets.com/compat/steamtradebots/api/v1/bot/update.php |
The steamtradebots.com URL takes the key as Authorization: Bearer, as X-API-Key, or as ?api_key=.
These formats give the same result as bot.update. If you write new code, use bot.update, because it is the only format that covers every market in one request.