{
  "openapi": "3.0.1",
  "info": {
    "title": "StockX Scraper - Ask, Bid, Last Sale by Size",
    "description": "Scrape StockX market data by keyword, category or URL. Every row carries lowest ask, highest bid, last sale, bid ask spread, ask counts, 72 hour and 90 day sales volume, 12 month average price, volatility and premium over retail. Pick a size and every row becomes that size's own order book.",
    "version": "1.0",
    "x-build-id": "57NwGPQyGQDWUA2fb"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~stockx-market-data-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-stockx-market-data-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/abotapi~stockx-market-data-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-stockx-market-data-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/abotapi~stockx-market-data-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-stockx-market-data-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "How to start the scrape. 'search' runs StockX keyword searches. 'url' processes the StockX URLs you paste: a product URL is fetched as a single product, and a search, category or brand URL is paged like a search. Only where the scope comes from differs: the filters below apply in BOTH modes.",
            "default": "search"
          },
          "searchTerms": {
            "title": "Search terms",
            "type": "array",
            "description": "One or more things to search StockX for, for example 'air jordan 1', 'nike dunk low', 'yeezy 350'. Each term is scraped independently. Search mode only: in URL mode the scope is read out of each pasted StockX URL instead. Leave this empty and the run browses the category you picked below (sneakers when you pick none), narrowed by the filters.",
            "default": [
              "air jordan 1"
            ],
            "items": {
              "type": "string"
            }
          },
          "urls": {
            "title": "StockX URLs",
            "type": "array",
            "description": "Paste StockX product URLs (https://stockx.com/nike-dunk-low-retro-white-black-2021), search URLs (https://stockx.com/search?s=jordan+1), category URLs (https://stockx.com/category/sneakers) or brand pages (https://stockx.com/nike). Add ?page=3 to any browse URL to start walking from that page instead of the first. The filters below are NOT ignored here: every pasted search, category or brand URL is re-run with them applied, and anything already in the URL wins for that URL. A pasted product URL is the one exception, since it returns that single product in full.",
            "items": {
              "type": "string"
            }
          },
          "category": {
            "title": "Category",
            "enum": [
              "",
              "sneakers",
              "apparel",
              "accessories",
              "collectibles",
              "shoes",
              "trading-cards",
              "electronics",
              "lifestyle",
              "performance",
              "luxury",
              "slides-and-sandals",
              "cleats",
              "boots",
              "clogs",
              "slippers"
            ],
            "type": "string",
            "description": "Only return items in this StockX category. Both top level categories (sneakers, apparel, collectibles) and sneaker sub categories (lifestyle, performance, luxury) are accepted. Applies in BOTH search mode and URL mode.",
            "default": ""
          },
          "brands": {
            "title": "Brands",
            "type": "array",
            "description": "Only return items from these brands, for example 'nike', 'adidas', 'jordan', 'new-balance'. Several brands are combined with OR. Leave empty for every brand. Applies in BOTH search mode and URL mode. A pasted brand page URL overrides this filter for that URL only.",
            "items": {
              "type": "string"
            }
          },
          "models": {
            "title": "Models",
            "type": "array",
            "description": "Only return items in these StockX models, for example 'dunk', 'air-force-1', 'air-max-90', 'campus-00s'. Use the slug StockX itself uses in its filter panel; spaces are converted for you. Several models are combined with OR. Applies in BOTH search mode and URL mode.",
            "items": {
              "type": "string"
            }
          },
          "productLines": {
            "title": "Product lines",
            "type": "array",
            "description": "Only return items in these StockX product lines, for example 'blazer', 'cortez', '860v2'. StockX rebuilds this list per category and brand, so it is free text rather than a fixed list. Several product lines are combined with OR. Applies in BOTH search mode and URL mode.",
            "items": {
              "type": "string"
            }
          },
          "gender": {
            "title": "Gender",
            "enum": [
              "",
              "men",
              "women",
              "kids",
              "unisex"
            ],
            "type": "string",
            "description": "Only return items cut for this audience. Applies in BOTH search mode and URL mode.",
            "default": ""
          },
          "color": {
            "title": "Colour",
            "enum": [
              "",
              "white",
              "black",
              "multi",
              "blue",
              "grey",
              "pink",
              "red",
              "brown",
              "yellow",
              "green"
            ],
            "type": "string",
            "description": "Only return items StockX files under this colour. Applies in BOTH search mode and URL mode.",
            "default": ""
          },
          "activity": {
            "title": "Activity",
            "enum": [
              "",
              "running",
              "basketball",
              "skateboarding",
              "soccer",
              "hiking",
              "golf",
              "football"
            ],
            "type": "string",
            "description": "Only return items StockX files under this activity. Applies in BOTH search mode and URL mode.",
            "default": ""
          },
          "shoeHeight": {
            "title": "Shoe height",
            "enum": [
              "",
              "low",
              "mid",
              "high"
            ],
            "type": "string",
            "description": "Only return low, mid or high cut shoes. Applies in BOTH search mode and URL mode.",
            "default": ""
          },
          "market": {
            "title": "Market and currency",
            "enum": [
              "US",
              "GB",
              "DE",
              "FR",
              "CA",
              "AU",
              "JP"
            ],
            "type": "string",
            "description": "Which StockX market to price against. StockX runs a separate order book per country, each in its own currency, and the prices genuinely differ (Germany and France both bill in euro and still quote different asks), so this is a real narrowing rather than a currency conversion. The market follows the connection's exit country, so picking one here pins the exit; if you pinned a country on the Proxy configuration yourself, yours wins. Every row states the market and currency it was actually quoted in. Applies in BOTH search mode and URL mode.",
            "default": "US"
          },
          "sizeScale": {
            "title": "Size scale (turns on per size rows)",
            "enum": [
              "",
              "mens",
              "womens",
              "kids"
            ],
            "type": "string",
            "description": "Which size scale the Size below is written in. Setting a scale AND a size changes what one row means: instead of one row per product with the cheapest ask across all sizes, you get one row per SIZE, carrying that size's own lowest ask, highest bid, last sale, spread, ask counts and sales volume. Leave on 'Off' for one row per product. Applies in BOTH search mode and URL mode.",
            "default": ""
          },
          "size": {
            "title": "Size (needs a size scale)",
            "type": "string",
            "description": "The size to price, in the scale picked above, for example '10' or '9.5' for men's, '8' for women's, '4' for kids. Ignored unless Size scale is set. When both are set, every row is that size and every price on the row is that size's own price. Applies in BOTH search mode and URL mode."
          },
          "minPriceUsd": {
            "title": "Minimum lowest ask (USD)",
            "minimum": 0,
            "type": "integer",
            "description": "Only return items whose lowest ask is at least this many US dollars. Sent to StockX as a price range together with the maximum. Applies in BOTH search mode and URL mode."
          },
          "maxPriceUsd": {
            "title": "Maximum lowest ask (USD)",
            "minimum": 0,
            "type": "integer",
            "description": "Only return items whose lowest ask is at most this many US dollars. Sent to StockX as a price range together with the minimum. Applies in BOTH search mode and URL mode."
          },
          "availableNow": {
            "title": "Available now only",
            "type": "boolean",
            "description": "Only return items that have at least one live ask right now, so they can be bought immediately. Applies in BOTH search mode and URL mode.",
            "default": false
          },
          "xpressShipOnly": {
            "title": "Xpress Ship only",
            "type": "boolean",
            "description": "Only return items available with Xpress Ship, meaning stock already verified and held, which ships in a few days instead of a couple of weeks. Applies in BOTH search mode and URL mode.",
            "default": false
          },
          "belowRetailOnly": {
            "title": "Below retail only",
            "type": "boolean",
            "description": "Only return items whose lowest ask is below the original retail price. Applies in BOTH search mode and URL mode.",
            "default": false
          },
          "minLastSaleUsd": {
            "title": "Minimum last sale (USD)",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep rows whose most recent sale was at least this many US dollars. StockX has no server side filter for this, so it is applied to the rows this run reads. Applies in BOTH search mode and URL mode."
          },
          "minSalesLast72Hours": {
            "title": "Minimum sales in the last 72 hours",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep rows that sold at least this many times in the last 72 hours, which is the quickest way to separate liquid items from dead stock. StockX has no server side filter for this, so it is applied to the rows this run reads. Applies in BOTH search mode and URL mode."
          },
          "hasLiveAskOnly": {
            "title": "Has a live ask",
            "type": "boolean",
            "description": "Only keep rows that currently have a lowest ask. Applied to the rows this run reads. Applies in BOTH search mode and URL mode.",
            "default": false
          },
          "hasLiveBidOnly": {
            "title": "Has a live bid",
            "type": "boolean",
            "description": "Only keep rows that currently have a highest bid. Applied to the rows this run reads. Applies in BOTH search mode and URL mode.",
            "default": false
          },
          "orderBy": {
            "title": "Ask StockX to order results by",
            "enum": [
              "featured",
              "most-active",
              "release_date",
              "lowest_ask",
              "highest_bid",
              "last_sale"
            ],
            "type": "string",
            "description": "Ordering sent to StockX itself, so it decides WHICH items you get first across the whole catalogue, not just how this run's rows are arranged. Each value here was checked against StockX and genuinely reorders results. Applies in BOTH search mode and URL mode, and a sort already present in a pasted URL wins for that URL.",
            "default": "featured"
          },
          "sortResultsBy": {
            "title": "Order the returned rows by",
            "enum": [
              "site_order",
              "price_asc",
              "price_desc",
              "last_sale_desc",
              "premium_desc",
              "volume_desc",
              "release_newest",
              "release_oldest"
            ],
            "type": "string",
            "description": "Arranges the rows this run collected, after they are read. This is a local tidy up of one run's output, not a catalogue wide ordering: to change WHICH items you get, use 'Ask StockX to order results by' above. Applies in BOTH search mode and URL mode.",
            "default": "site_order"
          },
          "fetchDetails": {
            "title": "Fetch full product details",
            "type": "boolean",
            "description": "Fetch each item's product page for the style code (SKU), colourway, original retail price, release and restock dates, the complete size run in six size systems (US M, US W, UK, EU, CM, KR), the product line breadcrumb, the available conditions, tags and the full image set. Slower, and charged once per record. Leave off for a fast market crawl: identity, images, release date and the whole market block are included either way.",
            "default": false
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 0,
            "type": "integer",
            "description": "The single cap on this run: stop after collecting this many records across all search terms and URLs. With a size scale set, one record is one size. Set 0 for unlimited.",
            "default": 20
          },
          "maxPages": {
            "title": "Max pages per source",
            "minimum": 0,
            "type": "integer",
            "description": "Safety bound on how many result pages to walk per search term or URL. Leave empty (0) for no page limit: the run then stops at Max items, not here. Does not impose a separate cap below Max items. StockX itself returns at most 1000 results per search or category, so a very broad scope needs the filters above rather than more pages.",
            "default": 0
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "Paste a previous run ID or dataset ID to continue a large crawl without returning or charging for records already collected there. Use this after an interrupted or capped run. For recurring monitoring of the same search, use Incremental mode below instead."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "Turn this on for daily or weekly recurring monitoring of the same search. The first run returns everything matching as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED records. Ask, bid and last sale moves ARE reported as UPDATED: on a resale marketplace they are the signal, not noise. Turn on Emit unchanged or Emit expired only when you also want those rows returned (and billed). State is kept separately per search, URL, filter and size setup; use State key to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently configured runs. Leave empty to let the actor derive a key automatically from the search terms, URLs, filters and size setup, so two different searches never mix state."
          },
          "emitUnchanged": {
            "title": "Emit unchanged records (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return records that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you specifically want a full snapshot every run.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired records (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return records that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search: not when Max items capped it, not when Resume was used, not when the run was refused, and not when StockX's 1000 result limit truncated the scope. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking.",
            "default": false
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a page per record; other connectors get a best-effort write or digest. Each connector receives a condensed summary per record, not the full record; the complete record always stays in the dataset. Leave empty to skip; this never changes the dataset output. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com)."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL or id of the Notion page under which record pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on records written to each connector per run. Does not affect the dataset.",
            "default": 50
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Leave the default for the cheapest run. Change it only if a run reports that it could not read any results.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}