We get questions all the time asking how FloatDB catalogs items and why unapplied stickers aren't tracked. Hopefully this blog post helps clear that up!
Lineage of Tracking CS:GO Items
Back in the good ol' days, when the discovery of float values was new and no one had mobile authenticators, there used to be an endpoint that showed very detailed data about the state of a user's inventory (https://api.steampowered.com/IEconItems_730/GetPlayerItems/v1/).
Ever since float values were discovered, people realized the only way to retrieve it was by querying this endpoint. As a result, many sites such as CSGOExchange popped up allowing you to query this endpoint but it was incredibly unstable and spammed by many...
This endpoint had something unique that no others did, in addition to float values, it also contained an "original id" for an item. This was the original asset id of the item and would never change even if the item was traded. By default, every time an item is traded, the asset id changes.
This allowed sites like CSGOExchange to easily track where items went by just seeing if the original id matches to any item they've already seen. If they haven't cataloged the original id before, it must be a new item!
Unfortunately, back in 2017, Valve decided to close down the endpoint and permanently prevented the community from obtaining the original ids of items. So we had to adapt...
A New Way To Get Float Values
Before the endpoint was closed in 2017, there existed another method to get the float value. The pursuit of finding this method was mainly to allow inspecting the float value of items listed on the Steam Community Market which the endpoint didn't allow.
This utilized reverse engineering the network protocol that CS:GO runs in order to replicate how the game handles "inspecting" an item in-game. The creation of CSGOFloat was originally in the pursuit of developing this method and allowing users to fetch floats for SCM listings (turns out a bunch of people figured it out at around the same time).
There were some restrictions to this system since you needed to impersonate a game client and could only send 1 float request per second per bot (which still exists to this day!). It returned the float value, paint seed, def index, and paint index of items, but unfortunately didn't give the original asset id.... so how can we track it?
A (Different) Way To Track Items
In the face of this dilemma, we needed to be able to derive a method that can uniquely identify an item even if it was traded many times. For us it is important that we can check whether a new item we see is actually new or is just an updated location of a pre-existing item that was traded.
There are basically around 4 high-entropy properties that are immutable (never change) about an item even if it is traded: the float value, paint seed, def index, paint index.
So if we combine all of these properties together to uniquely identify an item, is that enough?
Well, there are around 300 million+ float values that are usable within the 0-1 float range, 1001 uniformly random paint seeds, and around 1000 different skins in the game (combos of def index and paint index).
Combined with some napkin math, the odds of two items being generated with the same attributes is on the order of 1 in 300 trillion. Unfortunately, due to the Birthday paradox, we'd expect a collision between two items to have a probability of 1 in 17.3 million.
There are around 500 million skins existent in CS:GO, so this gives us an expected 30ish natural collisions where two items are generated with identical properties. Should be good enough, right? Yes, and this is what we use on FloatDB for tracking items. But there are some downsides...
The Duplicated Items Saga
So in theory, an item generating with duplicate properties should be pretty improbable, but what if someone had the ability to duplicate an item?
Well it turns out that Steam Support did just that. Back in the day, whenever an item was scammed from a user, Steam Support would just duplicate it and now two items with those properties would float around the economy.
For our tracking system, how in the world could we figure out that there are two instances of this item since they'd have the same unique "key"? Well, we can't...
Sites like CSGOExchange choose a different approach, which basically shows an item as duplicated if the older inventory that has traded an item hasn't been refreshed yet on the site. This leads to a high amount of false positives of "duped items".
FloatDB chooses an alternative approach of only showing the most recent item we've found for a given unique "key". This results in us showing any duped items as a single item with the most recent inventory. We are however working on something that can show us all the duped items, so stay tuned...
What Can't We Track?
As I alluded to earlier, using this method has a couple drawbacks.
One of which is that if the item cannot be inspected in game (i.e. has no inspect link), we can't use the in-game inspect network request to get it's details. This applies to items like sticker capsules.
Another is that some items simply don't have high-entropy properties like skins do in order to develop a unique key for them. For instance, unapplied stickers don't have a float value or paint seed and therefore don't have any values we can combine to uniquely identify them. As a result, we don't track stickers since we couldn't possibly have an accurate metric on how many exist and where they are. Sites that provide this kind of metric are typically very flawed in their data.
Conclusion
As you'd expect, everything has its pros and cons; thankfully tracking items this way works very well in practice. Previously conversing with some Valve employees, it looks like we won't be getting the "original id" of items again.
If you'd like to browse the full database of over 330 million unique skins, be sure to check out FloatDB.
Want to join our community? Follow us on Twitter or join our Discord and Steam Group.