Build a CS2 arbitrage scanner

Arbitrage starts with the same skin listed at different prices on different markets. One call to the Skinstrack items endpoint returns every item with a price per marketplace, so finding the biggest gaps is a sort.

Stack
Node.js 18+, TypeScript
Plan
Paid (Standard and up)
Data
34+ marketplaces, refreshed ~15 min
  1. 1

    Get a free Skinstrack API key

    Sign in with Steam on skinstrack.com and create a key in the dashboard. The free plan gives 50 requests a month on Steam prices with no card. Paid plans from $24.99 a month unlock all 34+ marketplaces. Keep the key in an environment variable, never in source code.

    terminal
    bash
    export SKINSTRACK_API_KEY=your-api-key
  2. 2

    Install the SDK

    Same official package as the Node.js example.

    terminal
    bash
    npm install skinstrack
  3. 3

    Scan for the largest spreads

    Fetch every item on the markets you trade on, keep items with real listings and enough liquidity, then rank by the gap between the cheapest and the dearest market.

    scan.ts
    ts
    import { SkinstracksV2 } from "skinstrack/v2";
    
    const client = new SkinstracksV2({ apiKey: process.env.SKINSTRACK_API_KEY! });
    
    const items = await client.getItems({ providers: "buff163,csfloat,skinport,waxpeer" });
    
    const gaps = items
      .filter((item) => (item.liquidity ?? 0) >= 60)
      .map((item) => {
        const listed = item.prices.filter((p) => p.price > 1 && p.count > 0);
        if (listed.length < 2) return null;
        const sorted = [...listed].sort((a, b) => a.price - b.price);
        const buy = sorted[0];
        const sell = sorted[sorted.length - 1];
        return { name: item.market_hash_name, buy, sell, spread: (sell.price - buy.price) / buy.price };
      })
      .filter((gap) => gap !== null && gap.spread > 0.1)
      .sort((a, b) => b!.spread - a!.spread)
      .slice(0, 20);
    
    for (const gap of gaps) {
      console.log(
        `${(gap!.spread * 100).toFixed(1)}%  ${gap!.name}  buy ${gap!.buy.provider} $${gap!.buy.price}  sell ${gap!.sell.provider} $${gap!.sell.price}`
      );
    }
  4. 4

    Account for fees before trading

    A raw spread is not profit. Subtract the selling fee of the target market and any withdrawal cost before acting. The Skinstrack marketplace comparison pages list fees and payment methods for each market.

Ready to run it?

Get a Skinstrack API key in a minute. Free tier: 50 requests per month on Steam prices, no card required.

Get your API key

Frequently Asked Questions

CS2 skin prices, the Skinstrack API and the tools around it.

Is there an API for CS2 arbitrage?

Yes. The Skinstrack API returns the same item priced on 34+ marketplaces in one call, which is the raw data an arbitrage scanner needs.

How fresh are the prices for arbitrage?

Marketplaces are scanned about every 15 minutes, and each price carries its own updated_at so you can skip stale entries.

Can I see spreads without writing code?

Yes. The Skinstrack price comparison tool shows one skin across every market at skinstrack.com/tools/comparison.

More Skinstrack API examples

skinstrack.com

Want full price tracking, charts and alerts?

cs2skinsapi.com shows a quick price. Skinstrack is the full platform behind it, free to use, with everything a CS2 trader or developer needs.

  • Prices from 34+ marketplaces on every skin
  • Daily price history charts and market trends
  • Price alerts by email, Discord or Telegram
  • Portfolio and Steam inventory tracking
  • Free Chrome extension for Steam
  • Trade-up, case ROI and loadout tools