# SNKRDUNK Scraper - Sneakers, Prices & Sales History (`abotapi/snkrdunk-com-scraper`) Actor

Scrape SNKRDUNK (snkrdunk.com), Japan's sneaker and streetwear resale marketplace: JP and EN names, brand, style code, JPY price stats, listing and offer counts, favourites, sizes, used prices, MSRP, sales history. Keyword search with brand or category filters, or paste product and sitemap URLs.

- **URL**: https://apify.com/abotapi/snkrdunk-com-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 product results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## SNKRDUNK Scraper: Sneaker Prices, Sales History & Streetwear Catalog

SNKRDUNK Scraper turns snkrdunk.com, Japan's sneaker and streetwear resale marketplace, into a clean product data feed. Search by keyword with brand and category filters, or paste product and sitemap links, and get Japanese and English product names, style codes, JPY price statistics (low, high, average), listing, used and offer counts, favourites, per-size availability and used prices, MSRP, release dates and recent sales history. Results export to JSON, CSV or Excel, or flow straight into your app or spreadsheet.

### Why This Scraper?

- **Two ways in.** Keyword search with the site's own brand and category filters and sort, or paste product links and sitemaps (one sitemap link streams in thousands of products). No URL building by hand.
- **Deep product records.** Every product carries 60+ fields: identity in Japanese and English, brand and model, price statistics, sizes, release info and more.
- **Price statistics and sales history.** Lowest, highest and average listing prices in JPY, used listing counts, offers, favourites, plus the most recent recorded sales with sizes and dates.
- **Local prices and names.** Japanese and English names and brands side by side, list price in JPY and localized MSRP, so cross-market comparisons need no extra lookups.
- **Built for schedules.** Incremental mode tags every product NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED on recurring runs, and returns only what changed, so a daily monitor bills pennies instead of re-scraping everything.
- **Fails loudly, never silently.** If every connection is refused the run stops with a clear message, so "nothing found" is never confused with "could not read the site".

### Use Cases

- **Sneaker resellers and boutiques:** track lowest listings, average prices and last sale sizes to price your inventory and spot under-retail picks.
- **Analysts and data teams:** build price-history datasets across brands and categories, from single models to whole sitemap scopes.
- **Collectors and enthusiasts:** monitor favourite models and get only the new, changed or expired listings on each scheduled run.
- **E-commerce and dropshipping tools:** feed product names, images, prices and availability into catalogs and alerting bots.
- **Market researchers:** measure brand and category depth, listing counts and engagement (favourites) across the Japanese resale market.

### Data You Get

> Sample shape: values are illustrative placeholders, not from a live record.

| Field | Example |
| --- | --- |
| `styleCode` | `"XX1234-100"` |
| `productId` | `"20000001"` |
| `productCatalogId` | `"20000002"` |
| `name` | `"Sample Runner Low "White/Grey""` |
| `nameJa` / `nameEn` | `"サンプルランナー ロー"` / `"Sample Runner Low"` |
| `brand` / `brandName` | `"sample-brand"` / `"Sample Brand"` |
| `modelName` | `"Sample Runner"` |
| `price` / `priceCurrency` | `12800` / `"JPY"` |
| `condition` | `"S"` |
| `isNew` / `isUsed` / `isSold` | `true` / `false` / `false` |
| `productType` | `"secondHandCatalog"` |
| `releaseDate` | `"2024-03-15T00:00:00Z"` |
| `regularPriceJpy` | `15400` |
| `minPriceJpy` / `maxPriceJpy` / `averagePriceJpy` | `12900` / `24000` / `15600` |
| `usedMinPriceJpy` / `usedListingCount` | `8900` / `12` |
| `offerCount` / `favoriteCount` | `5` / `4200` |
| `lastSalePrice` / `lastSaleAt` | `13500` / `"2026-01-20T05:12:00Z"` |
| `salesTrackedCount` / `tradingHistory` | `20` / recent sales with size, price, date |
| `minSize` / `maxSize` / `availableSizes` | `"22cm"` / `"32cm"` / `["22.5cm", "25cm", "27cm"]` |
| `msrpValue` / `msrpCurrency` | `154.2` / `"USD"` |
| `usedPrices` | per-size used prices and counts (when enabled) |
| `image` | `"https://cdn.snkrdunk.com/sample/sample.webp"` |
| `url` | SNKRDUNK link to the product |
| `changeType` / `changedFields` | `"UPDATED"` / `["price", "minPriceJpy"]` (incremental mode) |

### How to Use

1. Pick a **mode**: `search` (by keyword and filters) or `url` (paste product or sitemap links).
2. Fill in the fields for that mode, and keep **Fetch full product details** on for the complete record.
3. Set **Max items** to control run size and cost, then click **Start**.
4. Download the dataset as JSON, CSV or Excel, or read it through the API.

**Search by keyword:**

```json
{
  "mode": "search",
  "keywords": ["air force 1"],
  "maxItems": 20
}
```

**Search with brand and category filters, oldest listings first:**

```json
{
  "mode": "search",
  "keywords": [""],
  "brandIds": ["nike", "adidas"],
  "categoryIds": ["1"],
  "sortDirection": "asc",
  "maxItems": 100,
  "fetchDetails": true
}
```

**Paste product or sitemap links:**

```json
{
  "mode": "url",
  "urls": [
    "https://snkrdunk.com/products/CW2288-111",
    "https://snkrdunk.com/en/sneakers/CW2288-111",
    "https://snkrdunk.com/products/CU9225-100/used/51024158",
    "https://snkrdunk.com/en/sitemap/sitemap-index-en-product-sneaker.xml",
    "https://snkrdunk.com/en/sitemap/sitemap-en-product-sneaker-0.xml.gz"
  ]
}
```

**Scheduled change monitoring (incremental mode):**

```json
{
  "mode": "search",
  "keywords": ["air force 1"],
  "maxItems": 100,
  "incrementalMode": true,
  "stateKey": "af1-watch",
  "emitUnchanged": false,
  "emitExpired": true
}
```

#### Run it from your code

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/snkrdunk-com-scraper").call(run_input={"mode": "search", "keywords": ["air force 1"], "maxItems": 20})
for product in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(product["styleCode"], product["minPriceJpy"], product["lastSalePrice"])
```

JavaScript:

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/snkrdunk-com-scraper').call({ mode: 'search', keywords: ['air force 1'], maxItems: 20 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0].styleCode, items[0].minPriceJpy);
```

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the **Integrations** tab.

#### Tips

- **Deep coverage.** One keyword serves up to 100 pages of 100 products; the site serves nothing beyond page 100 per search. For whole-catalog sweeps, use URL mode with the product sitemaps.
- **Reading brand and category values.** The filters take the site's own values (`nike`, `air-jordan`, `1` for sneakers); open any filtered search page on the site and copy the value out of its address.
- **Used prices are optional.** Per-size used prices cost one extra read per product; switch **Fetch per-size used prices** on only when you need them.

### Send results into your apps (MCP connectors)

Optionally pipe the results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step **after** the scrape: the Apify dataset is never changed.

**What gets written to the connector:** a condensed, human-readable **summary** of each product, not the full JSON. Each item becomes one entry with a **title** and its key fields flattened to plain text. The **complete record always stays in the Apify dataset**.

1. Authorize a connector once under **Apify → Settings → Integrations** (Notion, Linear, Airtable, or Apify).
2. Select it in the **"Pipe results into your apps"** input field. (If the picker is empty, you haven't authorized a connector yet.)
3. For **Notion**, also set `notionParentPageUrl` to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

### Input Parameters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `mode` | string | `search` | `search` discovers products by keyword and filters; `url` takes product or sitemap links you paste. |
| `keywords` | array | `["air force 1"]` | Search phrases (search mode). Every page holds up to 100 products and paging is automatic. |
| `brandIds` | array | (none) | Limit to brands using the site's own values, e.g. `nike`, `air-jordan`. |
| `categoryIds` | array | (none) | Limit to categories using the site's own values, e.g. `1` (sneakers), `2/18/99` (short sleeve). |
| `sortDirection` | string | `desc` | Order by listing date: `desc` (newest first) or `asc` (oldest first). |
| `urls` | array | sample | Product or sitemap links (url mode); search fields are ignored. |
| `fetchDetails` | boolean | `true` | Read the full record per product: names, price stats, sizes, MSRP, sales history. URL mode always reads the full record. |
| `fetchUsedPrices` | boolean | `false` | Also read per-size used prices and counts (one extra read per product). |
| `maxPages` | integer | (empty) | Pages to walk per keyword. Does NOT cap the run: leave empty or 0 and the walk goes as far as Max items requires. |
| `maxItems` | integer | `20` | Stop after this many products across all keywords and URLs. `0` = unlimited. |
| `proxy` | object | Residential, Japan | Connection settings. A residential connection in Japan is recommended and is the default; backups engage automatically. |
| `resumeFromRunId` | string | (none) | Continue one interrupted run: products already saved there are skipped. |
| `incrementalMode` | boolean | `false` | Track the same scope across scheduled runs; tag each product NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED. |
| `stateKey` | string | `snkrdunk-baseline` | Name for an incremental monitor's saved state. Use distinct keys to run several monitors. |
| `emitUnchanged` | boolean | `false` | Also return (and bill) products with no detected change. |
| `emitExpired` | boolean | `false` | Also return (and bill) products no longer found after a complete scan. |
| `ignoreFieldsForChanges` | array | (none) | Fields that should not mark a product UPDATED in incremental mode. |
| `mcpConnectors` | array | (none) | Optional: send a summary of each product to apps you authorized under Integrations. |
| `notionParentPageUrl` | string | (none) | Notion connector only: page under which product pages are created. |
| `maxNotifyListings` | integer | `50` | Cap on items written to each connector per run. |

### Output Example

> Sample shape: values are illustrative placeholders, not from a live record.

```json
{
  "styleCode": "XX1234-100",
  "productId": "20000001",
  "productCatalogId": "20000002",
  "name": "Sample Runner Low \"White/Grey\"",
  "nameJa": "サンプルランナー ロー",
  "nameEn": "Sample Runner Low \"White/Grey\"",
  "brand": "sample-brand",
  "brandName": "Sample Brand",
  "modelName": "Sample Runner",
  "category": "1",
  "price": 12800,
  "priceCurrency": "JPY",
  "priceCurrencySymbol": "JP ¥",
  "condition": "S",
  "isNew": true,
  "isUsed": false,
  "isSold": false,
  "productType": "secondHandCatalog",
  "releaseDate": "2024-03-15T00:00:00Z",
  "regularPriceJpy": 15400,
  "minPriceJpy": 12900,
  "maxPriceJpy": 24000,
  "averagePriceJpy": 15600,
  "highestSoldPriceJpy": 39800,
  "usedMinPriceJpy": 8900,
  "usedListingCount": 12,
  "offerCount": 5,
  "favoriteCount": 4200,
  "listingCountJp": 276,
  "msrpValue": 154.2,
  "msrpCurrency": "USD",
  "minSize": "22cm",
  "maxSize": "32cm",
  "availableSizes": ["22.5cm", "25cm", "26cm", "27cm"],
  "lastSalePrice": 13500,
  "lastSaleAt": "2026-01-20T05:12:00Z",
  "salesTrackedCount": 2,
  "tradingHistory": [
    { "price": 13500, "soldAt": "2026-01-20T05:12:00Z", "size": "26.5cm", "condition": "new" },
    { "price": 12800, "soldAt": "2026-01-19T10:02:00Z", "size": "26cm", "condition": "used" }
  ],
  "image": "https://cdn.snkrdunk.com/sample/sample.webp",
  "url": "https://snkrdunk.com/en/sneakers/XX1234-100",
  "searchKeyword": "sample runner",
  "searchRank": 1
}
```

### Plan Requirement

The default connection works out of the box on any paid Apify plan, and the actor rotates to backup connections automatically when one is refused. For the most reliable results, keep the recommended residential connection with the Japan country pin (the default under Connection). A paid plan with proxy access is required; if access is refused, the run stops with a clear message instead of returning an empty dataset.

### FAQ

#### How much does it cost?

You pay per product returned, plus a small surcharge for each product whose full detail record was read (only when detail fetching is on). The **Pricing** tab shows the current rates, and **Max items** caps the cost of any run.

#### Is it legal to scrape SNKRDUNK?

This actor collects only publicly available product data. You are responsible for how you use it: follow SNKRDUNK's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Prices, sizes and listing counts are facts; product photos remain the property of their owners.

#### Can I get only new or changed products on a schedule?

Yes. Schedule the actor from the **Schedules** tab, keep the keywords, filters and URLs the same, and turn on **Incremental mode**. Each run then returns only new and updated products; unchanged ones are neither returned nor billed, and `emitExpired` can flag products that disappeared.

#### Why did my run fail instead of returning an empty dataset?

If every page read was refused, the run stops with a clear message so a connection problem is never mistaken for "no matches". Run it again in a few minutes, or switch the connection country under Connection. A search that genuinely matched nothing finishes with a zero-results status instead.

#### Why do I see at most 100 pages per keyword?

The site serves at most 100 result pages per search. Split deep crawls across more keywords, brand or category filters, or use URL mode with product sitemaps, which cover the catalog directly.

#### Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

### 🔗 Want more fashion data?

Pair this actor with these related scrapers from the same team:

<table>
<tr><td>👗 <a href="https://apify.com/abotapi/24s-com-scraper"><b>24S Scraper</b></a><br>Scrape 24S luxury fashion by category, filters, or URL. Extract brand, name, price...</td><td>🥦 <a href="https://apify.com/abotapi/elcorteingles-es-scraper"><b>El Corte Inglés Scraper</b></a><br>Scrape El Corte Inglés elcorteingles.es products across fashion, electronics, home...</td></tr>
<tr><td>👗 <a href="https://apify.com/abotapi/goat-sneaker-scraper"><b>GOAT Scraper</b></a><br>Scrape GOAT (goat.com), the sneaker and streetwear resale marketplace. Search or paste...</td><td>🏷️ <a href="https://apify.com/abotapi/kleinanzeigen-de-scraper"><b>Kleinanzeigen.de Scraper</b></a><br>From $1/1K. Scrape Kleinanzeigen.de ads by keyword, category, location, price, seller...</td></tr>
<tr><td>👗 <a href="https://apify.com/abotapi/klekt-com-scraper"><b>KLEKT Sneaker &amp; Apparel Resale Scraper</b></a><br>Scrape sneaker and streetwear listings from KLEKT (klekt.com). Browse the catalog with...</td><td>👗 <a href="https://apify.com/abotapi/kream-scraper"><b>KREAM Scraper</b></a><br>Scrape KREAM (kream.co.kr) sneaker and fashion resale data by keyword search, filters...</td></tr>
</table>

👉 [Browse all abotapi scrapers](https://apify.com/abotapi)

### 💬 Support & custom scrapers

- 🐞 **Found a bug or a missing field?** Open a ticket on the [Issues tab](https://apify.com/abotapi/snkrdunk-com-scraper/issues/open). We usually reply within hours.
- 🛠️ **Need another site, extra fields or a private build?** Email <contact@abotapi.com> or message [Telegram @abotapi](https://t.me/abotapi).
- ⭐ **Enjoying it?** A quick review on the actor page helps other users find it.

# Actor input Schema

## `mode` (type: `string`):

Pick how to start: 'search' discovers products by keyword and filters, 'url' takes product page links (or sitemap links) that you paste yourself.

## `keywords` (type: `array`):

One or more search phrases, e.g. 'air force 1', 'jordan 4', 'yohji yamamoto'. Every result page holds up to 100 products and the actor walks forward automatically.

## `brandIds` (type: `array`):

Limit results to one or more brands using the site's own brand values, e.g. 'nike', 'adidas', 'air-jordan', 'new-balance'. You can read the value off any brand-filter link on the site's search page. Leave empty for all brands.

## `categoryIds` (type: `array`):

Limit results to one or more categories using the site's own category values, e.g. '1' (sneakers), '2/18/99' (short sleeve), '10/56' (sandals). Leave empty for all categories.

## `sortDirection` (type: `string`):

Order results by listing date, newest first (default) or oldest first.

## `urls` (type: `array`):

One or more snkrdunk.com links, in any of these shapes: Japanese product pages (/products/CODE), English product pages (/en/sneakers/CODE), single used-listing links (/products/CODE/used/ID), sitemap index files (.xml) and child sitemap files (.xml.gz), with or without tracking query strings. Search-mode fields are ignored; each product link yields one full record and sitemaps stream in thousands of product URLs. Example: https://snkrdunk.com/products/CW2288-111

## `fetchDetails` (type: `boolean`):

Read every product's full record: Japanese and English names, brand and model, Japanese price statistics (min/max/average, listing, used and offer counts, favourites), release info, sizes, MSRP, and the recent sales history. Turn off for a lighter run with just the search-result fields. URL mode always reads the full record.

## `fetchUsedPrices` (type: `boolean`):

Also read the per-size used listing prices and counts for each product (one extra read per product). Default off.

## `maxPages` (type: `integer`):

How many result pages to walk per keyword (100 products per page). This does NOT cap the run: leave empty or 0 and the actor walks as far as Max items requires. Setting it stops paging after that many pages. Note the site itself serves at most 100 pages per search; deeper coverage comes from more keywords or from URL mode with sitemaps.

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

Stop after this many products across all keywords and URLs. 0 = unlimited (still bounded by Max pages per search).

## `proxy` (type: `object`):

A residential connection in Japan is recommended and is the default: the Japanese product record is the richest, and a Japanese exit keeps prices and totals consistent. The actor fails over to backup connections automatically when one is refused.

## `resumeFromRunId` (type: `string`):

Paste a previous run ID or dataset ID to continue ONE interrupted full walk across separate runs. Products already collected there (matched by style code) are skipped, so this run only saves the new ones. Leave empty for a normal fresh run. Distinct from 'Incremental mode' below, which tracks the SAME recurring scope across many scheduled runs by itself.

## `incrementalMode` (type: `boolean`):

When ON, the actor remembers its products from the previous run of the SAME scope (see 'State key' below) and tags every product with a changeType: NEW, UPDATED, UNCHANGED, REAPPEARED, or EXPIRED. Use with the Apify Scheduler to monitor searches or sitemap scopes over time instead of re-scraping everything. Default OFF.

## `stateKey` (type: `string`):

A name for this monitor's saved state, e.g. 'af1-watch'. The stored baseline is also scoped to your exact keywords, filters, sort, URLs and detail toggles, so changing the scope starts fresh under the same key. Set distinct keys to run several independent monitors from one actor.

## `emitUnchanged` (type: `boolean`):

When ON, products with no detected change are still pushed to the dataset (tagged changeType=UNCHANGED) instead of being skipped. This returns, and bills, one extra row per unchanged product every run. Default OFF: only NEW/UPDATED/REAPPEARED/EXPIRED products are pushed.

## `emitExpired` (type: `boolean`):

When ON, products tracked in a previous run but no longer found after a complete, uncapped scan are pushed once more tagged changeType=EXPIRED. This returns, and bills, one extra row per expired product. Only fires on a run that scans its whole scope (no resumeFromRunId, no Max items cap hit). Default OFF.

## `ignoreFieldsForChanges` (type: `array`):

Output field names that should NOT make a product count as UPDATED. The scrape timestamp, search rank, search keyword and favourite count are always ignored, because they change without the product changing. Add fields such as averagePriceJpy or salesTrackedCount here if changes to them are not relevant to you. Ignored fields are still returned in the output.

## `mcpConnectors` (type: `array`):

Optionally send the results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per product (title + key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. 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` (type: `string`):

URL (or id) of the Notion page under which product pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on items written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "search",
  "keywords": [
    "air force 1"
  ],
  "sortDirection": "desc",
  "urls": [
    "https://snkrdunk.com/products/CW2288-111",
    "https://snkrdunk.com/en/sneakers/CW2288-111",
    "https://snkrdunk.com/products/CU9225-100/used/51024158",
    "https://snkrdunk.com/en/sitemap/sitemap-index-en-product-sneaker.xml",
    "https://snkrdunk.com/en/sitemap/sitemap-en-product-sneaker-0.xml.gz"
  ],
  "fetchDetails": true,
  "fetchUsedPrices": false,
  "maxItems": 20,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "JP"
  },
  "incrementalMode": false,
  "stateKey": "snkrdunk-baseline",
  "emitUnchanged": false,
  "emitExpired": false,
  "maxNotifyListings": 50
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `detail` (type: `string`):

No description

## `changes` (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 = {
    "mode": "search",
    "keywords": [
        "air force 1"
    ],
    "urls": [
        "https://snkrdunk.com/products/CW2288-111",
        "https://snkrdunk.com/en/sneakers/CW2288-111",
        "https://snkrdunk.com/products/CU9225-100/used/51024158",
        "https://snkrdunk.com/en/sitemap/sitemap-index-en-product-sneaker.xml",
        "https://snkrdunk.com/en/sitemap/sitemap-en-product-sneaker-0.xml.gz"
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "JP"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/snkrdunk-com-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 = {
    "mode": "search",
    "keywords": ["air force 1"],
    "urls": [
        "https://snkrdunk.com/products/CW2288-111",
        "https://snkrdunk.com/en/sneakers/CW2288-111",
        "https://snkrdunk.com/products/CU9225-100/used/51024158",
        "https://snkrdunk.com/en/sitemap/sitemap-index-en-product-sneaker.xml",
        "https://snkrdunk.com/en/sitemap/sitemap-en-product-sneaker-0.xml.gz",
    ],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "JP",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/snkrdunk-com-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 '{
  "mode": "search",
  "keywords": [
    "air force 1"
  ],
  "urls": [
    "https://snkrdunk.com/products/CW2288-111",
    "https://snkrdunk.com/en/sneakers/CW2288-111",
    "https://snkrdunk.com/products/CU9225-100/used/51024158",
    "https://snkrdunk.com/en/sitemap/sitemap-index-en-product-sneaker.xml",
    "https://snkrdunk.com/en/sitemap/sitemap-en-product-sneaker-0.xml.gz"
  ],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "JP"
  }
}' |
apify call abotapi/snkrdunk-com-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,abotapi/snkrdunk-com-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/D0iI6Q0SYxRCbQHCh/builds/SgJxktc8xcDWSeBuc/openapi.json
