{
  "openapi": "3.0.1",
  "info": {
    "title": "SNKRDUNK Scraper - Sneakers, Prices & Sales History",
    "description": "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.",
    "version": "1.0",
    "x-build-id": "SgJxktc8xcDWSeBuc"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~snkrdunk-com-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-snkrdunk-com-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~snkrdunk-com-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-snkrdunk-com-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~snkrdunk-com-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-snkrdunk-com-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": "Pick how to start: 'search' discovers products by keyword and filters, 'url' takes product page links (or sitemap links) that you paste yourself.",
            "default": "search"
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "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.",
            "items": {
              "type": "string"
            }
          },
          "brandIds": {
            "title": "Brand IDs (optional)",
            "type": "array",
            "description": "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.",
            "items": {
              "type": "string"
            }
          },
          "categoryIds": {
            "title": "Category IDs (optional)",
            "type": "array",
            "description": "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.",
            "items": {
              "type": "string"
            }
          },
          "sortDirection": {
            "title": "Sort direction",
            "enum": [
              "desc",
              "asc"
            ],
            "type": "string",
            "description": "Order results by listing date, newest first (default) or oldest first.",
            "default": "desc"
          },
          "urls": {
            "title": "Product or sitemap URLs",
            "type": "array",
            "description": "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",
            "default": [
              "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"
            ],
            "items": {
              "type": "string"
            }
          },
          "fetchDetails": {
            "title": "Fetch full product details",
            "type": "boolean",
            "description": "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.",
            "default": true
          },
          "fetchUsedPrices": {
            "title": "Fetch per-size used prices",
            "type": "boolean",
            "description": "Also read the per-size used listing prices and counts for each product (one extra read per product). Default off.",
            "default": false
          },
          "maxPages": {
            "title": "Max pages per search",
            "minimum": 0,
            "type": "integer",
            "description": "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": {
            "title": "Max items",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many products across all keywords and URLs. 0 = unlimited (still bounded by Max pages per search).",
            "default": 20
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "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.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "JP"
            }
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run (optional)",
            "type": "string",
            "description": "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": {
            "title": "Incremental mode (track changes across scheduled runs)",
            "type": "boolean",
            "description": "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.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "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.",
            "default": "snkrdunk-baseline"
          },
          "emitUnchanged": {
            "title": "Emit UNCHANGED products (incremental mode only)",
            "type": "boolean",
            "description": "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.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit EXPIRED products (incremental mode only)",
            "type": "boolean",
            "description": "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.",
            "default": false
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "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.",
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "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": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL (or id) of the Notion page under which product 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 items written to each connector per run. Does not affect the dataset.",
            "default": 50
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}