Two tools, one extension — merging inventory value into Dota Companion

DHSeaDev — Chrome Extensions & Idle Games

Dota Companion now values your Dota 2 inventory. That started as a separate idea — a second extension — and turned into a merge for one reason I did not expect: the companion was already storing the exact key the inventory feature needed.

The merge argument was one line of arithmetic

The dashboard stores a Dota account_id — the 32-bit number OpenDota wants. The Steam inventory endpoint wants a 64-bit steamID. Those are the same number with an offset: add 76561197960265728 and you have it. No second setup screen, no asking the user to paste a profile URL they already gave me. A standalone inventory extension would have had to acquire that user cold; the companion already had them.

The feature neither half could do alone

There is no shortage of Dota 2 inventory calculators. They are websites, several of them front doors for trading platforms, and they all answer the same question: what is it worth. Some want a Steam login or a trade link before they will tell you.

None of them can answer the second question, because a price is all they have. Dota Companion has both halves — your inventory and your match history — so it can separate the cosmetics riding on heroes you actually play from the ones sitting idle on heroes you have not picked in twenty games. It also runs the comparison the other way: which of your most-played heroes have nothing equipped at all. That is a want-list that writes itself.

The join is not free. Steam tags every Dota item with a hero name, but eight of the 112 in my own inventory are persona variants or Valve’s catch-all “Other” bucket. An unrecognised tag resolves to nothing rather than a guess — unattributed value shows as unassigned, which is honest. A wrong hero is worse than no hero.

Why it is deliberately slow

Steam rate-limits its inventory and market endpoints per IP address. This is the detail that shapes the whole feature. A tool that sweeps prices greedily does not just break itself — it locks you out of steamcommunity.com for hours, including your own inventory page and the market, and the ban re-arms if you trip it again during the cooldown. On a shared connection it takes the household with it. That is the documented cause of death for a generation of Steam market browser add-ons.

So the inventory page never fetches on its own. No background alarms, nothing on open. You press a button. It paces at twelve requests a minute against a ceiling of roughly twenty, counts failed calls against its own budget because Steam does, caps itself daily in storage that survives a browser restart, and prefers one bulk request returning a hundred priced items over a hundred individual lookups. On the first 429 it stops entirely for six hours and says so in plain language, including the part where the limit is on your address and not on the extension.

Everything else in the release is built to spend compute instead of requests: sorting, filtering, grouping, search, the value history, and the idle-cosmetic analysis all run on data already sitting on your device. They cost zero additional calls.

Two things I got wrong

The first shipped build could not read an inventory at all. I had set the page size to 5000 because that is the number every third-party Steam library publishes. Steam returns HTTP 400 at 5000; 2000 is the largest value that actually works. I had marked the response shape as unverified and the request as settled — exactly backwards. A single live probe would have caught it before it shipped, and now does.

The second was worse because it looked fine. With no prices loaded, the idle-cosmetics panel showed $0.00 and reported every played hero as having no cosmetics. Both numbers were produced by summing an empty set — the code decided hero ownership after the price check, so with nothing priced, nothing was owned. A zero that means “I have not measured this yet” is a lie with a decimal point. Ownership and valuation are separate questions now, and the panel shows a dash until there is something real to show.

What is in the release

  • Full-page inventory view with every item priced against the Steam Community Market
  • Sort by value, unit price, quantity, name, rarity, or approximate order acquired
  • Group by rarity, hero, slot or type; filter by any of them; search by name
  • Value history built from your own refreshes, not a market average
  • New-since-last-check flagging, with the first load recorded as a baseline rather than pretending everything just arrived
  • Idle-cosmetic analysis against your last twenty matches
  • A share card that leads with rarity composition, with dollar value off by default

Steam access is an optional permission you grant with a button — the performance dashboard works fully without it — and those requests are sent without your Steam login cookies. The extension reads. It never lists, buys, sells or trades anything.

Get it on the Chrome Web Store — free, no account, no API key. Match data from the OpenDota API; item prices from the Steam Community Market. Not affiliated with Valve.

FAQ

Does Dota Companion sell or trade my items?

No. It only reads your public inventory and public market prices. It never lists, buys, sells or trades anything, and it never sends your Steam login cookies.

Why is valuing my inventory slow?

Steam rate-limits its market endpoints per IP address, and exceeding the limit locks you out of steamcommunity.com for hours — not just the extension. Dota Companion paces at twelve requests a minute, caps itself daily, and stops for six hours if Steam pushes back.

What are idle cosmetics?

The value of items you own for heroes that do not appear in your last twenty matches. Because the extension reads both your inventory and your match history, it can show which of your cosmetic spend is doing nothing for you.

Leave a Reply

Discover more from DHSeaDev

Subscribe now to keep reading and get access to the full archive.

Continue reading