# CS2 Skin Prices - Steam vs Skinport Spread, No API Key (`that_red_bird/cs2-skin-price-spread`) Actor

Price CS2 skins on the Steam Market and Skinport side by side: price, volume, spread after fees and a fee-adjusted flag. Throttled for Steam's ~20 req/min limit, no API key, min-spread filter. Failed lookups are never charged.

- **URL**: https://apify.com/that_red_bird/cs2-skin-price-spread.md
- **Developed by:** [mohamed alaya](https://apify.com/that_red_bird) (community)
- **Categories:** Other, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.50 / 1,000 item priceds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## CS2 Skin Prices - Steam vs Skinport Spread, No API Key

Compares the price of Counter-Strike 2 skins on the **Steam Community Market** and **Skinport**, with volume and the **spread after fees**. For skin traders, bot builders and analysts who do not want to pay $100+/month for a price API.

It calls the public Skinport API and Steam's `priceoverview` endpoint, throttled to Steam's roughly 20 requests per minute limit. No API key, no login, no browser.

### Input examples

Check the skins you hold or watch:

```json
{ "items": ["AK-47 | Redline (Field-Tested)", "AWP | Asiimov (Field-Tested)"], "currency": "USD" }
```

Find worthwhile gaps only (net +5% or more after fees, at least 20 Steam sales yesterday):

```json
{ "maxItems": 40, "minItemPrice": 10, "maxItemPrice": 150, "minSpreadPct": 5, "minSteamVolume": 20 }
```

Euro prices, your own fee assumptions:

```json
{ "items": ["M4A4 | Desolate Space (Field-Tested)"], "currency": "EUR", "skinportFeePct": 8, "steamFeePct": 15 }
```

`{}` works: it picks 12 liquid weapon skins from Skinport and prices them on Steam (about 40 seconds).

### Input guide

| Field | Meaning |
|---|---|
| `items` | Exact Steam market names. Empty = auto-pick liquid skins (weapon skins with at least 5 Skinport listings, inside your price band). |
| `maxItems`, `minItemPrice`, `maxItemPrice` | Auto-pick size and price band. |
| `minSpreadPct` | Keep only items whose best direction nets at least this % after fees (-100 = all). |
| `minSteamVolume` | Skip items with fewer Steam sales in the last 24h. |
| `skinportFeePct`, `steamFeePct` | Your fee assumptions (defaults 12% and 15%). |
| `steamDelayMs` | Pause between Steam requests (default 3.2 s). |
| `proxyConfiguration` | Optional proxy for Steam only. |

### Output fields

| Field | Meaning |
|---|---|
| `marketHashName` | Steam market name. |
| `skinportMinPrice`, `skinportQuantity`, `skinportMedianPrice`, `skinportSuggestedPrice` | Skinport asking prices and number of listings. |
| `skinportVolume7d`, `skinportVolume30d`, `skinportMedianSold7d` | Units sold and median sold price on Skinport. |
| `steamLowestPrice`, `steamMedianPrice`, `steamVolume24h` | Steam Market lowest listing, median sale, units sold in 24h. |
| `rawSpreadPct` | (Steam lowest - Skinport min) / Skinport min. |
| `walletToCashSpreadPct` | Buy on Skinport, sell on Steam, after fees. The proceeds are **Steam wallet credit**, not cash. |
| `cashToCashSpreadPct`, `cashProfitable` | Buy on Steam wallet, sell on Skinport for cash, after fees. |
| `bestDirection`, `netSpreadPct`, `netProfit`, `feeAdjustedProfitable` | The better of the two directions. |

Sample row (shortened):

```json
{"marketHashName":"AK-47 | Crane Flight (Field-Tested)","skinportMinPrice":8.56,"steamLowestPrice":16.88,"steamVolume24h":280,"rawSpreadPct":97.2,"bestDirection":"buy-skinport-sell-steam","netSpreadPct":71.5,"walletToCashSpreadPct":71.5,"cashToCashSpreadPct":-55.4,"cashProfitable":false,"feeAdjustedProfitable":true}
```

### Use it with

- Schedule it hourly with a watch list and send rows with `cashProfitable: true` to Slack or Telegram.
- Feed the dataset into a spreadsheet or your own trading bot through the Apify API.

### FAQ

**Why is the spread so large?** Steam Market money is wallet credit that can only buy things on Steam, so Steam listings carry a premium over cash markets like Skinport. `walletToCashSpreadPct` is real only if you value wallet credit at face value. `cashToCashSpreadPct` is the one that matters if you want cash out.

**Are the fees exact?** No. Fees are assumptions you can change. Steam also has minimum fees on very cheap items, and Skinport's fee depends on your seller tier. Payment-method fees at checkout are not included.

**What if Steam blocks the run?** Steam rate-limits hard. If it keeps answering 429 after two waits, the remaining items are returned as `type: "partial"` rows with Skinport data only (free). Raise `steamDelayMs` or enable the proxy.

### Honest limits

- Prices are snapshots; listings move in seconds. This is research data, not a trading guarantee.
- Steam allows about 20 lookups per minute, so large lists take a while (100 items is about 5-6 minutes).
- Only CS2 (appid 730). Float, pattern and sticker values are not considered; "lowest price" is the cheapest listing of any float.
- Skinport and Steam can change or restrict their endpoints at any time.

### Price

Pay per event: **`item-priced` $0.0005** per item with both a Steam and a Skinport price. Example: 100 items = **$0.05**. Error rows and Skinport-only partial rows are free.

# Actor input Schema

## `items` (type: `array`):

Exact Steam Market names, e.g. 'AK-47 | Redline (Field-Tested)'. Leave empty to auto-pick liquid weapon skins from Skinport (see Max items and the price band below).

## `currency` (type: `string`):

Currency for both Steam and Skinport prices.

## `maxItems` (type: `integer`):

How many items to price when you give no item list. Steam allows only about 20 lookups per minute, so every item costs about 3 seconds of run time.

## `minItemPrice` (type: `integer`):

Auto-pick only items whose cheapest Skinport listing is at least this many whole currency units.

## `maxItemPrice` (type: `integer`):

Auto-pick only items whose cheapest Skinport listing is at most this many whole currency units.

## `minSpreadPct` (type: `integer`):

Return only items whose best direction nets at least this percent after fees. -100 returns everything. Use 5 to see only worthwhile gaps.

## `minSteamVolume` (type: `integer`):

Skip items that sold fewer than this many units on the Steam Market in the last 24 hours (thin markets are hard to trade).

## `skinportFeePct` (type: `integer`):

Fee Skinport takes when you sell. 12 is the standard rate; lower for high-volume sellers.

## `steamFeePct` (type: `integer`):

Combined Steam + game fee added on top of what the seller receives. 15 matches the standard 5% + 10% (a buyer paying $1.15 leaves the seller $1.00).

## `steamDelayMs` (type: `integer`):

Pause between Steam Market requests. Steam rate-limits near 20 requests per minute; do not go below 3000 unless you use a proxy.

## `includeSkinportSales` (type: `boolean`):

Also fetch 7-day and 30-day sold volume and median sold price from Skinport's sales history.

## `maxRuntimeMinutes` (type: `integer`):

Stop looking up Steam prices after this many minutes; remaining items come back as uncharged Skinport-only rows.

## `proxyConfiguration` (type: `object`):

Used only for Steam Market requests. Leave off normally; turn on Apify Proxy if Steam rate-limits your runs.

## Actor input object example

```json
{
  "items": [],
  "currency": "USD",
  "maxItems": 12,
  "minItemPrice": 5,
  "maxItemPrice": 300,
  "minSpreadPct": -100,
  "minSteamVolume": 0,
  "skinportFeePct": 12,
  "steamFeePct": 15,
  "steamDelayMs": 3200,
  "includeSkinportSales": true,
  "maxRuntimeMinutes": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `downloadCsv` (type: `string`):

No description

## `summary` (type: `string`):

No description

## `count` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "items": [],
    "currency": "USD",
    "maxItems": 12,
    "minItemPrice": 5,
    "maxItemPrice": 300,
    "minSpreadPct": -100,
    "minSteamVolume": 0,
    "skinportFeePct": 12,
    "steamFeePct": 15,
    "steamDelayMs": 3200,
    "includeSkinportSales": true,
    "maxRuntimeMinutes": 20,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("that_red_bird/cs2-skin-price-spread").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "items": [],
    "currency": "USD",
    "maxItems": 12,
    "minItemPrice": 5,
    "maxItemPrice": 300,
    "minSpreadPct": -100,
    "minSteamVolume": 0,
    "skinportFeePct": 12,
    "steamFeePct": 15,
    "steamDelayMs": 3200,
    "includeSkinportSales": True,
    "maxRuntimeMinutes": 20,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("that_red_bird/cs2-skin-price-spread").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "items": [],
  "currency": "USD",
  "maxItems": 12,
  "minItemPrice": 5,
  "maxItemPrice": 300,
  "minSpreadPct": -100,
  "minSteamVolume": 0,
  "skinportFeePct": 12,
  "steamFeePct": 15,
  "steamDelayMs": 3200,
  "includeSkinportSales": true,
  "maxRuntimeMinutes": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call that_red_bird/cs2-skin-price-spread --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,that_red_bird/cs2-skin-price-spread"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Q9CkC4rzUEqlcEgtC/builds/bZngi945TWIrXer2u/openapi.json
