<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: FairStash</title>
    <description>The latest articles on DEV Community by FairStash (@fairstash).</description>
    <link>https://dev.to/fairstash</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4117410%2Fad2e6d5e-fafa-4239-84d7-92d16d547ec9.png</url>
      <title>DEV Community: FairStash</title>
      <link>https://dev.to/fairstash</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fairstash"/>
    <language>en</language>
    <item>
      <title>The median said every neon pays off. Splitting by price said the opposite.</title>
      <dc:creator>FairStash</dc:creator>
      <pubDate>Sat, 03 Oct 2026 06:23:43 +0000</pubDate>
      <link>https://dev.to/fairstash/the-median-said-every-neon-pays-off-splitting-by-price-said-the-opposite-375e</link>
      <guid>https://dev.to/fairstash/the-median-said-every-neon-pays-off-splitting-by-price-said-the-opposite-375e</guid>
      <description>&lt;p&gt;In Adopt Me, a Roblox game with a large trading economy, you can merge four copies of a pet into one &lt;strong&gt;neon&lt;/strong&gt; version. Players ask the obvious question all the time: is it worth it? Is one neon worth more than the four pets it costs?&lt;/p&gt;

&lt;p&gt;The community keeps a value list for every pet and every version, so this looks like a five-minute job: divide the neon value by four times the regular value, take the median, done.&lt;/p&gt;

&lt;p&gt;I did that first. The answer was a confident &lt;strong&gt;yes&lt;/strong&gt;, and it was wrong for exactly the pets where the question matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  The aggregate
&lt;/h2&gt;

&lt;p&gt;The values come from &lt;a href="https://www.adoptmevalues.app/values" rel="noopener noreferrer"&gt;adoptmevalues.app&lt;/a&gt;, read on 3 October 2026. I took every pet with both a regular and a neon value and no potions (fly/ride change the price and would muddy the comparison). That left 783 pets.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ratio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Pet&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;neon&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;regular&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;median&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ratio&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;// 1.34&lt;/span&gt;
&lt;span class="nx"&gt;pets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;ratio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="c1"&gt;// 725 of 783&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A median of ×1.34, and 93% of pets "gain" from going neon. Write that up and you have told a trader with a Frost Dragon to merge four of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The split
&lt;/h2&gt;

&lt;p&gt;The trouble is who those 783 pets are. 566 of them, 72%, have a regular value below 1. Any statement about "the typical pet" is a statement about cheap pets.&lt;/p&gt;

&lt;p&gt;Split the same ratio by the price of the regular version and the picture turns over:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;regular value&lt;/th&gt;
&lt;th&gt;pets&lt;/th&gt;
&lt;th&gt;neon loses value&lt;/th&gt;
&lt;th&gt;median neon ÷ 4 regulars&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;under 1&lt;/td&gt;
&lt;td&gt;566&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;×1.53&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1–5&lt;/td&gt;
&lt;td&gt;103&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;×1.17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5–20&lt;/td&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;×1.03&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20–100&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;×0.86&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100 and up&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;×0.64&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Among pets worth 100 or more, the neon is worth less than the four pets in 15 cases out of 17. Some examples:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;pet&lt;/th&gt;
&lt;th&gt;regular&lt;/th&gt;
&lt;th&gt;4 × regular&lt;/th&gt;
&lt;th&gt;neon&lt;/th&gt;
&lt;th&gt;ratio&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Frost Dragon&lt;/td&gt;
&lt;td&gt;327&lt;/td&gt;
&lt;td&gt;1,308&lt;/td&gt;
&lt;td&gt;630&lt;/td&gt;
&lt;td&gt;×0.48&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shadow Dragon&lt;/td&gt;
&lt;td&gt;844&lt;/td&gt;
&lt;td&gt;3,376&lt;/td&gt;
&lt;td&gt;2,017.5&lt;/td&gt;
&lt;td&gt;×0.60&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bat Dragon&lt;/td&gt;
&lt;td&gt;961&lt;/td&gt;
&lt;td&gt;3,844&lt;/td&gt;
&lt;td&gt;2,375.75&lt;/td&gt;
&lt;td&gt;×0.62&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Giraffe&lt;/td&gt;
&lt;td&gt;474&lt;/td&gt;
&lt;td&gt;1,896&lt;/td&gt;
&lt;td&gt;1,156&lt;/td&gt;
&lt;td&gt;×0.61&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cryptid&lt;/td&gt;
&lt;td&gt;187&lt;/td&gt;
&lt;td&gt;748&lt;/td&gt;
&lt;td&gt;476&lt;/td&gt;
&lt;td&gt;×0.64&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The only two exceptions at the top are Amethyst Penguin (×1.06) and Orchid Butterfly (×1.00, a dead heat).&lt;/p&gt;

&lt;p&gt;So the honest answer is a gradient, not a yes: neon pays on cheap pets, breaks even somewhere around 5–20, and loses money on expensive ones. The overall median wasn't a summary of that gradient. It was the bottom band speaking for everyone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this keeps happening
&lt;/h2&gt;

&lt;p&gt;Nothing here is exotic. It's a mixture of very different groups summarised by one number, with one group outnumbering the others ten to one. What made it easy to miss:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The aggregate was true.&lt;/strong&gt; 725 of 783 pets really do gain. The number wasn't a bug, so nothing flagged it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The question has a hidden weight.&lt;/strong&gt; Nobody agonises over whether to neon a pet worth 0.1. The decision matters in proportion to the value at stake, and the unweighted median gives the 0.1 pet the same vote as the Bat Dragon.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The headline answers a different question.&lt;/strong&gt; "Does neon pay for the typical pet?" and "should I neon this pet?" sound alike and have opposite answers at the top of the list.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What I changed in practice: when a per-item ratio feeds a recommendation, I print it per band of the thing the reader is risking (here, the regular value), never just the overall figure. If one band holds most of the rows, that alone tells you the aggregate will speak for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  One more trap in the same table
&lt;/h2&gt;

&lt;p&gt;The next step up is &lt;strong&gt;mega neon&lt;/strong&gt;: four neons merge into one mega. Among the 17 pets worth 100 or more, 5 have a mega worth &lt;em&gt;exactly&lt;/em&gt; four neons, to the hundredth: Frost Dragon 630 → 2,520, Giraffe 1,156 → 4,624, Parrot 485.5 → 1,942. In the 20–100 band, none do.&lt;/p&gt;

&lt;p&gt;Read naively, that is a market that priced the merge perfectly. It may also be a cell that was derived as "4 × neon" because nobody had a separate estimate. The data alone can't tell the two apart, and the list doesn't say. When the same exact multiple recurs across rows, ask how the cell was filled before reading it as an equilibrium, and don't let those rows vote in a median.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I run &lt;a href="https://fairstash.app" rel="noopener noreferrer"&gt;FairStash&lt;/a&gt;, which publishes Roblox trading values with their sources and history. The per-version values for every pet are on the &lt;a href="https://fairstash.app/adopt-me/values/pets" rel="noopener noreferrer"&gt;Adopt Me pet list&lt;/a&gt;, and each pet's page shows its neon and mega neon next to the regular one, for example &lt;a href="https://fairstash.app/adopt-me/frost-dragon" rel="noopener noreferrer"&gt;Frost Dragon&lt;/a&gt;, and the &lt;a href="https://fairstash.app/adopt-me/calculator" rel="noopener noreferrer"&gt;trade calculator&lt;/a&gt; prices neon and mega neon as separate items rather than as a multiple of the regular pet. Values are the community's, not ours: we say where each number comes from on the &lt;a href="https://fairstash.app/methodology" rel="noopener noreferrer"&gt;methodology page&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>datascience</category>
      <category>statistics</category>
      <category>gamedev</category>
      <category>roblox</category>
    </item>
    <item>
      <title>What 1,550 listings actually measure: turnover, not stock</title>
      <dc:creator>FairStash</dc:creator>
      <pubDate>Wed, 09 Sep 2026 11:13:59 +0000</pubDate>
      <link>https://dev.to/fairstash/what-1550-listings-actually-measure-turnover-not-stock-21hm</link>
      <guid>https://dev.to/fairstash/what-1550-listings-actually-measure-turnover-not-stock-21hm</guid>
      <description>&lt;p&gt;Every value list for a Roblox trading game answers the same question: what is this item worth? We wanted a different number — how many people are actually offering one right now — and the marketplace we read has an endpoint that looks like it gives exactly that.&lt;/p&gt;

&lt;p&gt;It does not. Here is what it gives instead, and how we measured the difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  The endpoint
&lt;/h2&gt;

&lt;p&gt;Traderie hands out listings a page at a time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/api/&amp;lt;game&amp;gt;/listings?limit=100&amp;amp;page=N
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two things are missing, and both matter:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;There is no total count.&lt;/strong&gt; No &lt;code&gt;total&lt;/code&gt;, no &lt;code&gt;count&lt;/code&gt;, no &lt;code&gt;Link: rel="last"&lt;/code&gt;. You page until it stops.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It stops early.&lt;/strong&gt; Every game we tried caps out at the same place: &lt;strong&gt;1,550 listings, 31 pages&lt;/strong&gt;. Ask for page 32 and you get nothing. &lt;code&gt;limit&lt;/code&gt; is honoured on the plain endpoint and silently ignored on the filtered one, which always returns 50.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So you get the 1,550 most recently updated listings. Not a sample — a &lt;em&gt;window&lt;/em&gt;, sorted newest first.&lt;/p&gt;

&lt;h2&gt;
  
  
  The mistake we shipped
&lt;/h2&gt;

&lt;p&gt;We counted how many of those 1,550 listings mentioned each item and published the result as "how many people are offering one". That reads as a stock measurement: &lt;em&gt;this many exist for sale right now.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It is not. It is however many happened to be touched inside the window — and the window is a duration, not a quantity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Measuring the window
&lt;/h2&gt;

&lt;p&gt;Each listing carries &lt;code&gt;updated_at&lt;/code&gt;. The oldest and newest in a completed run bracket exactly how much time those 1,550 listings covered. That is a free measurement: the data is already in the response.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;listing&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;listing&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;updated_at&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// window in minutes&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;minutes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;60000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run on 2026-09-09, three games on the same platform:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Game&lt;/th&gt;
&lt;th&gt;Window covered by 1,550 listings&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Flee the Facility&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;14.3 hours&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Murder Mystery 2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;69 minutes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adopt Me&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;18 minutes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The same cap means wildly different things depending on how busy the game is. On the quiet game the window is most of a day. On the busy one it is a coffee break.&lt;/p&gt;

&lt;h2&gt;
  
  
  The check that settled it
&lt;/h2&gt;

&lt;p&gt;If the count were stock, an item recorded as &lt;code&gt;0&lt;/code&gt; would have nothing on offer. So we asked per item, using the filtered endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/api/&amp;lt;game&amp;gt;/listings?itemTags=true&amp;amp;item=&amp;lt;id&amp;gt;&amp;amp;selling=true&amp;amp;auction=false&amp;amp;page=N
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Of thirty Adopt Me items sampled, &lt;strong&gt;twenty-eight had at least fifty active listings&lt;/strong&gt; — including items our file had recorded as &lt;code&gt;0&lt;/code&gt; that day. One item had at least 1,550 standing offers while appearing zero times in the newest 100.&lt;/p&gt;

&lt;p&gt;Zero in the window is not an observation of absence. It is an absence of observation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the number actually is
&lt;/h2&gt;

&lt;p&gt;It is &lt;strong&gt;turnover&lt;/strong&gt;: how often an item moves through new listings. With the window duration measured alongside it, that becomes a rate — listings per hour — comparable between days and between games.&lt;/p&gt;

&lt;p&gt;And turnover discriminates where stock does not. Two MM2 items both answer "300+ active listings" to the exact query; inside the window one appears 51 times and the other zero. The expensive exact count is the &lt;em&gt;less&lt;/em&gt; informative number.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cost of getting it exactly
&lt;/h2&gt;

&lt;p&gt;We priced the honest alternative before rejecting it: one request per item per page, 50 per page, for a catalogue of thousands — up to &lt;strong&gt;33,000 requests a day&lt;/strong&gt;, and the answer would still be "300+" for most items. Not worth it, and not kind to someone else's servers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open data
&lt;/h2&gt;

&lt;p&gt;The daily counts are published under CC BY 4.0, one row per item per day, with the window duration recorded beside each reading so the caveat can never outlive the data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Live file and documentation: &lt;a href="https://fairstash.app/data" rel="noopener noreferrer"&gt;https://fairstash.app/data&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;A worked example for one game: &lt;a href="https://fairstash.app/mm2/supply" rel="noopener noreferrer"&gt;https://fairstash.app/mm2/supply&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Kaggle mirror: &lt;a href="https://www.kaggle.com/datasets/fairstash/roblox-daily-trade-listing-counts-mm2-adopt-me" rel="noopener noreferrer"&gt;https://www.kaggle.com/datasets/fairstash/roblox-daily-trade-listing-counts-mm2-adopt-me&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are reading a marketplace API that caps its result set, the lesson generalises: &lt;strong&gt;check what duration your cap covers before you name the number.&lt;/strong&gt; A count with an unmeasured window is a sentence with an unknown subject.&lt;/p&gt;

</description>
      <category>api</category>
      <category>data</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
