
Listing API: update your bot’s rates automatically
A listed bot can send its own rates and stock, so the list always shows what it has right now. A bot that stops sending for 8 hours moves to the Missing Data table.
This is the free Listing API (keys start stx_). It only updates your listing. To read Steam inventories for your bot, that is the paid Inventory API, a different thing with its own keys (they start inv_).
Running the levelup-bot script? It cannot send updates here by itself yet. Run the free SteamTradeX Reporter next to it instead: no coding, about 10 minutes.
Writing your own code? Every field, limit and error is in the Listing API reference, with code examples and an OpenAPI file.
1. Get your Listing API key
- Your bot must be live on the list. Open Listed Bots, then Edit Bot.
- Under Listing API key, press Issue a Listing API Key and copy it. It is shown once; issuing a new one stops the old one working.
2. Send an update
Send a POST to https://steamtradex.com/api/v1/bots/update with your key and a JSON body. Every 5 minutes, and after each trade, is plenty. More often than once every 3 seconds is refused.
curl -X POST https://steamtradex.com/api/v1/bots/update \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"sets_in_stock": 5000,
"games_in_stock": 300,
"max_level": 250,
"buy_rate": 18.5,
"sell_rate": 21,
"buy_gems_per_set": 445,
"sell_gems_per_set": 300
}'| Field | What it is |
|---|---|
| sets_in_stock | Total card sets the bot holds. |
| games_in_stock | How many games those sets are from. |
| max_level | The level a level 0 account reaches by crafting every normal set the bot holds, at most 5 sets per game. Foil and event sets do not count. 8 sets of one game, 2 of another and 5 of a third count as 5 + 2 + 5 = 12 sets, which is level 11. Send 0 when the bot has nothing to sell. How max_level is worked out. |
| buy_rate | Sets a customer gets per TF2 key when buying. Shown as the Rate, e.g. 18.5:1. |
| sell_rate | Sets a customer gives per TF2 key when selling to the bot. Optional. |
| buy_gems_per_set | Gems a customer pays for one set when buying with gems, in whole gems. Shown under the Rate, e.g. 445 gems/set. Optional. |
| sell_gems_per_set | Gems a customer is paid for one set when selling to the bot. Optional. |
Send only what you have. Fields you leave out keep their last value. To stop showing a rate (you switched that currency off), send it as null, for example "buy_gems_per_set": null: it is cleared from the list until you send a number again.
3. Already report to another bot list?
We accept the body other bot lists use, so a script that already reports to one only needs our address and your SteamTradeX key:
POST https://steamtradex.com/api/v1/bots/update
{
"secret": "YOUR_STEAMTRADEX_API_KEY",
"bot_id": "76561198000000000",
"stockData": { "440": 10, "570": 15 },
"tf2_buy_rate": 8.1,
"tf2_sell_rate": 9.5,
"gems_sell_rate": 445,
"gems_buy_rate": 300
}stockData is turned into total sets and games. bot_id must be your bot’s own Steam ID, or the update is refused.
For gems we read these names from the bot’s side: gems_sell_rate is what your bot sells a set for (what a customer pays, the larger number) and gems_buy_rate is what it pays for one. If your numbers show the wrong way round on the list, send ours instead.
4. Replies
| Status | Meaning |
|---|---|
| 200 | Saved. The reply has the time it was saved. |
| 400 | The body is not right. The reply says which field. |
| 401 | The key is wrong, or the bot is not live on the list. |
| 403 | bot_id is not the bot this key belongs to. |
| 429 | Too soon. Wait 3 seconds between updates. |
Keep your key private. It can only change this one bot’s rates and stock, but anyone with it can do that. If it leaks, issue a new one from Edit Bot.
5. Market prices in US dollars
Want your bot to show its profit in dollars without asking the Steam market from its own address? Read our copy. Send a GET to https://steamtradex.com/api/v1/prices. No key is needed.
{
"asOf": "2026-10-07T09:00:00.000Z",
"keyUsdCents": { "tf2": 231, "cs2": 249, "hydra": 1410, "tod": 88 },
"gemUsdCentsPer1000": 42,
"source": "steam-market",
"readAt": { "tf2": "2026-10-07T09:00:00.000Z", "gems": "2026-10-07T09:00:00.000Z" }
}| Field | What it is |
|---|---|
| keyUsdCents | The lowest Steam market price of a TF2 key, a standard CS2 case key, an Operation Hydra key and a Tour of Duty ticket, in US cents. 231 is $2.31. |
| gemUsdCentsPer1000 | A Sack of Gems (1,000 gems), in US cents. |
| asOf | When the oldest price in the answer was read from the market. |
| readAt | When each price was read, for the items that have one. |
We read the market once an hour. Asking more often than every hour gets the same answer, so every few hours is plenty. A price the market did not give is null, never 0: treat it as unknown.
6. What other bots charge
Want to price your bot against the rest of the list? Send a GET to https://steamtradex.com/api/v1/market-rates?exclude=YOUR_BOT_STEAM_ID. No key is needed, and exclude leaves your own bot out so you are not pricing against yourself.
{
"asOf": "2026-10-07T12:00:00.000Z",
"currencies": {
"tf2": {
"sellToCustomer": { "bots": 12, "min": 1500, "p25": 1700, "median": 1800, "p75": 1900, "max": 2200 },
"buyFromCustomer": { "bots": 9, "min": 1900, "p25": 2000, "median": 2100, "p75": 2250, "max": 2600 }
},
"gems": {
"sellToCustomer": { "bots": 8, "min": 380, "p25": 410, "median": 445, "p75": 470, "max": 520 },
"buyFromCustomer": null
}
}
}| Field | What it is |
|---|---|
| tf2.sellToCustomer | Sets a bot gives for one TF2 key when a customer buys (the buy_rate bots send), in hundredths: 1800 is 18:1. |
| tf2.buyFromCustomer | Sets a bot wants for one TF2 key when a customer sells (sell_rate), in hundredths. |
| gems.sellToCustomer | Gems a customer pays a bot for one set (buy_gems_per_set), in whole gems. |
| gems.buyFromCustomer | Gems a bot pays a customer for one set (sell_gems_per_set), in whole gems. |
| bots, min, p25, median, p75, max | How many bots quote that side, and the spread of what they quote. The quartiles and median are rounded to the nearest whole unit. |
Only bots in the main table of the card list count: not offline, not marked as a scam, not failing a rate check, and with sets to sell. With fewer than 3 such bots on a side, that side is null: treat it as no market. The figures change at most every 5 minutes, so asking every hour is plenty.
7. Card Suppliers who take bot orders
A bot that restocks by buying sets can ask who will take its offers: send a GET to https://steamtradex.com/api/v1/suppliers. No key is needed. Only Card Suppliers who ticked “Bots may send me buy offers at my listed rate” are in it, and only those who sell card sets for TF2 keys at a rate they list.
{
"asOf": "2026-10-07T12:00:00.000Z",
"suppliers": [
{ "id": "sup_abc123", "name": "Bulk Sets Co", "steamId": "76561198000000401",
"rateCentis": 1650, "minOrderKeys": 10, "stockSets": 120000,
"updatedAt": "2026-10-07T09:00:00.000Z" }
]
}| Field | What it is |
|---|---|
| rateCentis | Sets the supplier gives for one TF2 key, in hundredths: 1650 is 16.5 sets a key. |
| minOrderKeys | Their smallest order in TF2 keys, or null for none. |
| stockSets | Their own rough figure, or null. Read their inventory before you count on it. |
Send one offer that pays the keys and names exactly the sets they buy at that rate, and check Steam’s copy of the offer before you confirm it. The supplier accepts or declines it by hand. The list changes at most every 5 minutes.
8. Accounts marked as scammers
SteamTradeX staff mark Steam accounts caught scamming. A bot can refuse them: send a GET to https://steamtradex.com/api/v1/scam-marks. No key is needed. You get Steam IDs only, never a name or a reason, so tell a marked account no more than that you cannot trade with it.
{
"asOf": "2026-10-07T12:00:00.000Z",
"full": true,
"steamIds": ["76561198000000101", "76561198000000102"],
"removed": []
}Keep the list, and once an hour ask again with ?since= and the asOf you were given. That answer holds only what changed: steamIds newly marked, removed taken off. When full is true, the answer is the whole list: replace yours with it. If the site cannot be reached, or answers 503, keep the list you have; never treat that as nobody being marked. Never refuse your own admins because of it.