# StockX Scraper (`autofacts/stockx-scraper`) Actor

Scrape StockX products: every size's lowest ask, highest bid and number of asks, stock by delivery speed, last sale and 12-month price statistics, with optional individual sales and the full order book. Catalog data, barcodes and images included.

- **URL**: https://apify.com/autofacts/stockx-scraper.md
- **Developed by:** [Richard Feng](https://apify.com/autofacts) (community)
- **Categories:** E-commerce
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 products

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

## StockX Scraper

Scrape StockX products with their live market: every size's **lowest ask, highest bid and number of
asks**, stock by delivery speed (including items already in StockX's warehouse), last sale and 12-month
price statistics — and, if you want them, the **individual sales** and the **full order book**. Catalog
data, barcodes (UPC, EAN and other GTINs) and images come with every product.

### 📖 What it does

Give it StockX product pages, or a search, brand or category page, and it stores one record per product:

- the catalog: title, brand, style code, colorway, release date, retail price, description, categories,
  images and the 360° view;
- **every size** as a variant, with its own lowest ask, highest bid, number of asks, stock by delivery
  speed and barcodes, plus the size in every size chart StockX shows (US M, US W, UK, EU, CM, KR);
- the product's market: lowest ask and highest bid with their sizes, number of asks, stock by delivery
  speed, the last sale and its change, the last 90 days (average price, range, number of sales) and the
  last 12 months (average price, range, number of sales, and StockX's price premium and volatility figures);
- optionally, the latest **individual sales** (when, price, size, standard or express) and the **order
  book** (every price asks and bids stand at, per size, with how many stand there).

Prices are US market prices in US dollars.

### 🎯 Features

- 📈 **Per-size market data** — bid, ask and number of asks for every size in one record, not just the
  product's headline price.
- 📦 **Stock by delivery speed** — how many asks ship standard, express or next day, the cheapest of each,
  and whether that item is already in StockX's warehouse (`CUSTODIAL`), with expected delivery dates.
- 🔍 **Individual sales** — the latest sales, newest first: when, price, size, standard or express (50 per product by default).
- 📊 **Order book** — the price levels of asks and bids across sizes, best first, with the number of asks or
  bids at each (100 levels per side by default).
- 🗂️ **One record shape for the whole catalog** — sneakers, apparel, accessories, collectibles,
  electronics and graded trading cards alike; sizes, grades and one-size items are all variants.
- ⚡ **Fast** — about 25 products a minute at the default concurrency, light on memory and proxy traffic.

### 🔗 Supported URL types

| Page | Example |
| :--- | :--- |
| Product | `https://stockx.com/adidas-campus-00s-core-black` |
| Product, other language or with a size | `https://stockx.com/fr-fr/nike-dunk-low-retro-white-black-2021`, `…?size=10` |
| Buy or sell page of a product | `https://stockx.com/buy/adidas-campus-00s-core-black` |
| A seller's listing of a product | `https://stockx.com/<product>/listings/<listing id>` |
| Search | `https://stockx.com/search?s=jordan%201%20chicago` |
| Brand | `https://stockx.com/brands/new-balance` |
| Top-level category | `https://stockx.com/sneakers`, `https://stockx.com/category/trading-cards` |

For a search, brand or category page, its products are read in the order StockX lists them, sponsored
entries left out. StockX lists at most 1,000 products for any one listing; **Maximum products per
listing** reads fewer.

### 📋 Input

| Field | What it does | Default |
| :--- | :--- | :--- |
| `startUrls` | StockX pages to read (see the table above) | — |
| `maxProducts` | Stop after storing this many products (0 = no limit) | 0 |
| `maxProductsPerListing` | Products to read from each search, brand or category page (0 = all, at most 1,000) | 100 |
| `includeSales` | Add the latest individual sales | off |
| `maxSalesPerProduct` | How many sales to add per product | 50 |
| `includeOrderBook` | Add the order book | off |
| `maxOrderBookLevels` | Price levels per side (asks and bids) | 100 |
| `maxConcurrency` | Products read at the same time | 3 |
| `proxyConfiguration` | Proxies for the requests | Apify datacenter proxies |

```json
{
    "startUrls": [
        { "url": "https://stockx.com/adidas-campus-00s-core-black" },
        { "url": "https://stockx.com/search?s=dunk%20low%20panda" }
    ],
    "maxProductsPerListing": 20,
    "includeSales": true,
    "includeOrderBook": true
}
```

### 📤 Output

One record per product, in the same shape as [Farfetch Scraper](https://apify.com/autofacts/farfetch)'s
records. **Every amount of money is an integer in cents** (`6300` is $63), on the product, on each size
and in the market data alike. `price.current` is the lowest ask (0 when nobody is selling) and
`price.stockCount` the number of asks. `extraInfo.retailPrice` is the retail price; `price.original`
repeats it only when the lowest ask is below it, the way a discounted item gives its pre-sale price, and
is 0 otherwise.

An example, shortened (one size, two of the 36 frames of the 360° view, two sales, two price levels per side):

```json
{
  "source": {
    "id": "de258c04-2f2a-4806-9d8c-9c84e17d45ea",
    "crawlUrl": "https://stockx.com/adidas-campus-00s-core-black",
    "canonicalUrl": "https://stockx.com/adidas-campus-00s-core-black",
    "retailer": "stockx",
    "language": "en",
    "currency": "USD"
  },
  "title": "adidas Campus 00s Core Black",
  "description": "The adidas Campus 00s Core Black was launched as part of the sports collection sneakers in the adidas brand.\n\nThe adidas…",
  "details": {
    "short_desc": "adidas Campus 00s Core Black",
    "full_desc": "The adidas Campus 00s Core Black was launched as part of the sports collection sneakers in the adidas brand.\n\nThe adidas…",
    "brandStyleID": "HQ8708"
  },
  "brand": "adidas",
  "categories": [
    "Sneakers",
    "Lifestyle"
  ],
  "tags": [
    "2024 Gifts Under $100"
  ],
  "medias": [
    {
      "type": "Image",
      "url": "https://images.stockx.com/images/adidas-Campus-00s-Core-Black-Product.jpg?fit=fill&bg=FFFFFF&w=700&h=500&fm=webp&auto=compress&q=90&dpr=2&trim=color&updated_at=1789133431",
      "alt": "adidas Campus 00s Core Black",
      "index": 0
    }
  ],
  "variants": [
    {
      "id": "ea3b0fbc-05a4-44cc-84dd-4a2525b35c81",
      "title": "US M 10",
      "options": [
        "10"
      ],
      "price": {
        "current": 6300,
        "currentFormatted": "$63",
        "original": 11000,
        "stockStatus": "InStock",
        "stockCount": 42
      },
      "extraInfo": {
        "size": "10",
        "hidden": false,
        "sizeChart": [
          {
            "type": "us m",
            "size": "US M 10"
          },
          {
            "type": "uk",
            "size": "UK 9.5"
          },
          {
            "type": "cm",
            "size": "CM 28"
          },
          {
            "type": "kr",
            "size": "KR 280"
          },
          {
            "type": "eu",
            "size": "EU 44"
          },
          {
            "type": "us w",
            "size": "US W 11"
          }
        ],
        "gtins": [
          {
            "type": "UPC",
            "identifier": "195747807682"
          },
          {
            "type": "EAN-13",
            "identifier": "4066748532124"
          }
        ],
        "lowestAsk": 6300,
        "highestBid": 3700,
        "askCount": 42,
        "deliveryOptions": {
          "standard": {
            "askCount": 42,
            "lowestAsk": 6300
          },
          "expressStandard": {
            "askCount": 9,
            "lowestAsk": 6400
          },
          "expressExpedited": {
            "askCount": 8,
            "lowestAsk": 6400
          }
        }
      }
    }
  ],
  "options": [
    {
      "type": "Size",
      "values": [
        {
          "id": "10",
          "name": "US M 10"
        }
      ]
    }
  ],
  "price": {
    "current": 3300,
    "currentFormatted": "$33",
    "original": 11000,
    "stockStatus": "InStock",
    "stockCount": 630
  },
  "extraInfo": {
    "urlKey": "adidas-campus-00s-core-black",
    "model": "adidas Campus 00s",
    "colorway": "Core Black/Footwear White/Off White",
    "retailPrice": 11000,
    "releaseDate": "2023-02-17",
    "gender": "men",
    "productCategory": "sneakers",
    "condition": "New",
    "listingType": "STANDARD",
    "sizeCharts": [
      "US M",
      "US W",
      "UK",
      "CM",
      "KR",
      "EU"
    ],
    "images360": [
      "https://images.stockx.com/360/adidas-Campus-00s-Core-Black/Images/adidas-Campus-00s-Core-Black/Lv2/img01.jpg?fm=webp&auto=compress&w=559&q=90&dpr=2&updated_at=1789133431",
      "https://images.stockx.com/360/adidas-Campus-00s-Core-Black/Images/adidas-Campus-00s-Core-Black/Lv2/img02.jpg?fm=webp&auto=compress&w=559&q=90&dpr=2&updated_at=1789133431"
    ],
    "country": "US",
    "market": {
      "lowestAsk": 3300,
      "lowestAskSize": "US M 4.5",
      "highestBid": 6600,
      "highestBidSize": "US M 6",
      "askCount": 630,
      "deliveryOptions": {
        "standard": {
          "askCount": 630,
          "lowestAsk": 3300
        },
        "expressStandard": {
          "askCount": 165,
          "lowestAsk": 3300,
          "lowestAskInventoryType": "DFS",
          "expectedDeliveryDate": "2026-10-15T21:00:00.000Z",
          "latestDeliveryDate": "2026-10-20T21:00:00.000Z"
        },
        "expressExpedited": {
          "askCount": 68,
          "lowestAsk": 3700,
          "lowestAskInventoryType": "CUSTODIAL",
          "expectedDeliveryDate": "2026-10-15T21:00:00.000Z",
          "latestDeliveryDate": "2026-10-15T21:00:00.000Z"
        },
        "expressNextDay": {
          "askCount": 68,
          "lowestAsk": 3700,
          "lowestAskInventoryType": "CUSTODIAL",
          "expectedDeliveryDate": "2026-10-14T21:00:00.000Z",
          "latestDeliveryDate": "2026-10-14T21:00:00.000Z"
        }
      },
      "lastSale": {
        "amount": 10000,
        "changeValue": 7100,
        "changePercentage": 0.7092
      },
      "last90Days": {
        "averagePrice": 6300,
        "rangeLow": 2000,
        "rangeHigh": 20000,
        "salesCount": 633
      },
      "annual": {
        "averagePrice": 5700,
        "salesCount": 3317,
        "annualLow": 2000,
        "annualHigh": 20000,
        "rangeLow": 7900,
        "rangeHigh": 12500,
        "pricePremium": -0.071,
        "volatility": 0.225873
      }
    },
    "sales": [
      {
        "soldAt": "2026-10-12T01:40:57.622Z",
        "amount": 10000,
        "size": "US M 10",
        "orderType": "STANDARD"
      },
      {
        "soldAt": "2026-10-11T23:36:20.849Z",
        "amount": 2900,
        "size": "US M 5",
        "orderType": "EXPRESS"
      }
    ],
    "orderBook": {
      "asks": [
        {
          "size": "US M 4.5",
          "amount": 3300,
          "count": 34
        },
        {
          "size": "US M 4.5",
          "amount": 3400,
          "count": 1
        }
      ],
      "bids": [
        {
          "size": "US M 6",
          "amount": 6600,
          "count": 1
        },
        {
          "size": "US M 6.5",
          "amount": 6500,
          "count": 1
        }
      ],
      "asksComplete": false,
      "bidsComplete": false
    }
  }
}
```

### 🗂️ Data fields

| Field | Meaning |
| :--- | :--- |
| `source.canonicalUrl` | The product's StockX page |
| `price.current` / `price.stockCount` | Lowest ask (cents) / number of asks, for the product or one size |
| `price.original` | Retail price (cents) when the lowest ask is below it, else 0 |
| `details.brandStyleID` | The brand's style code, such as `HQ8708` |
| `options[0].values[]` | The sizes: `id` is StockX's own value of the size (`10`), `name` the size in the product's size chart (`US M 10`) |
| `variants[]` | Every size, with its own `price` and `extraInfo`; `options` holds its size's `id` |
| `variants[].extraInfo.gtins` | The size's barcodes, typed as StockX types them (`UPC`, `EAN-13`, `ITF-14`, `GTIN-8`) |
| `variants[].extraInfo.highestBid` | The size's highest bid (cents) |
| `variants[].extraInfo.deliveryOptions` | The size's asks by delivery speed: count and cheapest |
| `variants[].extraInfo.hidden` | StockX's size picker hides this size (it can still have asks) |
| `extraInfo.retailPrice` | The retail price the brand released it at (cents), when StockX lists one |
| `extraInfo.images360` | The frames of the 360° view, in order |
| `extraInfo.market.deliveryOptions` | Asks by delivery speed; `lowestAskInventoryType` `CUSTODIAL` means the cheapest is already in StockX's warehouse |
| `extraInfo.market.lastSale` | Last sale (cents), its change from the sale before (cents) and StockX's own change percentage figure |
| `extraInfo.market.last90Days` | Average price, price range and number of sales over 90 days |
| `extraInfo.market.annual` | The same over 12 months, with StockX's `pricePremium` and `volatility` figures as StockX gives them |
| `extraInfo.sales[]` | With **Individual sales**: `soldAt`, `amount`, `size`, `orderType` |
| `extraInfo.orderBook` | With **Order book**: `asks[]` and `bids[]` of `{ size, amount, count }`, best price first; `asksComplete` / `bidsComplete` say whether every level was read |

### 💳 Pricing

Pay per event: one event per product stored, plus two add-ons charged only for products where they found
something — one for individual sales, one for the order book. See the Pricing tab for current prices.
Products that are not found, and listing pages, cost nothing.

### ❓ FAQ

**How fresh is the data?** It is read live when the run reads each product: asks, bids and sales are
StockX's own at that moment.

**Why is a size's lowest ask higher than the product's?** The product's lowest ask and highest bid are
the cheapest ask and the highest bid over all its sizes; `lowestAskSize` and `highestBidSize` say which.

**Does it read other markets or currencies?** Not yet: this version reads the US market in US dollars.

**Is scraping StockX allowed?** The Actor reads the product data StockX shows to any visitor. StockX's
terms of use restrict automated access and the use of its data; you are responsible for how you use what
you collect.

### ⚠️ Limitations

- US market and US dollars only.
- Listings read searches, brands and the top-level categories; sub-category pages
  (`/category/sneakers/jordan`) are not read yet, and filters added to a listing page's address are
  ignored: the whole search, brand or category is read.
- StockX lists at most 1,000 products for any one search, brand or category.

### 🤖 Use with AI agents

This Actor is callable as a tool by any MCP-capable agent — Claude, Cursor, VS Code — or by your own
code, with no wrapper and nothing extra to deploy.

**Connect over MCP**

```
https://mcp.apify.com?tools=autofacts/stockx-scraper
```

In a client that reads an `mcpServers` configuration block:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=autofacts/stockx-scraper",
      "headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }
    }
  }
}
```

The agent reads this Actor's parameters and their descriptions straight from the input schema, and the
hosted server infers the result field types from the dataset schema.

**Or call the API directly**

```bash
curl -X POST "https://api.apify.com/v2/acts/autofacts~stockx-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"startUrls": [{"url": "https://stockx.com/adidas-campus-00s-core-black"}, {"url": "https://stockx.com/nike-dunk-low-retro-white-black-2021"}]}'
```

### 🧰 Other Actors by autofacts

Apify only auto-recommends Actors in the same category, so here are the ones that actually pair with this scraper:

| Actor | What it's for |
| :--- | :--- |
| [Shopify Scraper](https://apify.com/autofacts/shopify) | Retail prices and stock at sneaker and streetwear boutiques on Shopify |
| [Farfetch Scraper](https://apify.com/autofacts/farfetch) | Luxury retail prices and sizes, to set against resale prices |
| [ASOS Scraper](https://apify.com/autofacts/asos) | High-street prices for the same brands |
| [Google Trends](https://apify.com/autofacts/google-trends) | Search interest in a release, a model or a brand |

All of them: [apify.com/autofacts](https://apify.com/autofacts)

# Changelog

This Actor's version history is a separate document: https://apify.com/autofacts/stockx-scraper/changelog.md

# Actor input Schema

## `startUrls` (type: `array`):

Product pages, such as https://stockx.com/adidas-campus-00s-core-black: a language prefix (https://stockx.com/fr-fr/...), a size (?size=10), the buy or sell page (https://stockx.com/buy/...) and a seller's listing (.../listings/...) all name their product. Listing pages too, whose products are each read in full: a search (https://stockx.com/search?s=jordan%201), a brand (https://stockx.com/brands/nike) or a top-level category (https://stockx.com/sneakers, https://stockx.com/category/trading-cards). StockX lists at most 1,000 products for any one listing.

## `maxProducts` (type: `integer`):

Stop after storing this many products. 0 means no limit.

## `maxProductsPerListing` (type: `integer`):

For a search, brand or category page: read at most this many of its products, in the order StockX lists them. 0 means every product it lists (at most 1,000).

## `includeSales` (type: `boolean`):

Add the product's latest sales, newest first: when each sold, its price, its size and whether it was a standard or an express order. Charged per product that has sales.

## `maxSalesPerProduct` (type: `integer`):

How many of the latest sales to add per product, when Individual sales is on.

## `includeOrderBook` (type: `boolean`):

Add the product's order book: every price that asks and bids stand at, with its size and how many asks or bids stand there, cheapest ask and highest bid first. Charged per product that has one.

## `maxOrderBookLevels` (type: `integer`):

How many price levels to add for asks, and as many for bids, when Order book is on.

## `maxConcurrency` (type: `integer`):

How many products are read at the same time.

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

The proxies the requests go through. Apify's datacenter proxies are answered well; switch to residential if StockX starts refusing requests.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://stockx.com/adidas-campus-00s-core-black"
    },
    {
      "url": "https://stockx.com/nike-dunk-low-retro-white-black-2021"
    }
  ],
  "maxProducts": 0,
  "maxProductsPerListing": 100,
  "includeSales": false,
  "maxSalesPerProduct": 50,
  "includeOrderBook": false,
  "maxOrderBookLevels": 100,
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `products` (type: `string`):

One row per product: catalog data, barcodes and images; every size with its lowest ask, highest bid and number of asks; stock by delivery speed; the last sale and 90-day and 12-month statistics; and, when asked for, the latest individual sales and the order book.

# 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 = {
    "startUrls": [
        {
            "url": "https://stockx.com/adidas-campus-00s-core-black"
        },
        {
            "url": "https://stockx.com/nike-dunk-low-retro-white-black-2021"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("autofacts/stockx-scraper").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 = {
    "startUrls": [
        { "url": "https://stockx.com/adidas-campus-00s-core-black" },
        { "url": "https://stockx.com/nike-dunk-low-retro-white-black-2021" },
    ],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("autofacts/stockx-scraper").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 '{
  "startUrls": [
    {
      "url": "https://stockx.com/adidas-campus-00s-core-black"
    },
    {
      "url": "https://stockx.com/nike-dunk-low-retro-white-black-2021"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call autofacts/stockx-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,autofacts/stockx-scraper"
        }
    }
}
```

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/mMdUAEyOfJtdnJEA0/builds/kO89DZcW6YSpDWAQh/openapi.json
