{
  "openapi": "3.0.1",
  "info": {
    "title": "Wildberries.ru Product Scraper [Just 💰$0.23]",
    "description": "Scrape Wildberries.ru — product search results by keyword or by search-page URL, with price and sale price in RUB, rating, review count and seller for every product. Optional detail enrichment adds full specs and photos plus the complete price history of each product.",
    "version": "0.1",
    "x-build-id": "yavNQBE8Nbwg9RzBa"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/blackfalcondata~wildberries-ru-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-blackfalcondata-wildberries-ru-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/blackfalcondata~wildberries-ru-scraper/runs": {
      "post": {
        "operationId": "runs-sync-blackfalcondata-wildberries-ru-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/blackfalcondata~wildberries-ru-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-blackfalcondata-wildberries-ru-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",
        "properties": {
          "query": {
            "title": "🔍 Search Term(s)",
            "type": "string",
            "description": "Product search keywords, as you would type them on the site (Russian works best, e.g. \"платье\", \"кроссовки nike\", \"iphone 15\"). Use a JSON array for several searches in one run, e.g. [\"платье\",\"кроссовки\"]. Required if no startUrls provided."
          },
          "location": {
            "title": "📍 Delivery region",
            "type": "string",
            "description": "Optional delivery-region id, which decides the prices, stock and delivery times you see. Leave empty for Moscow (-1257786). Other examples: -1123300 (Saint Petersburg), 12358499 (Kazan), -2133463 (Yekaterinburg). Use a JSON array to compare several regions in one run."
          },
          "maxResults": {
            "title": "💯 Max Results",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "Maximum total results (0 = unlimited).",
            "default": 100
          },
          "startUrls": {
            "title": "🔗 Start URLs",
            "type": "array",
            "description": "Paste raw search URLs from the target site. Each URL becomes its own search task; results are merged and deduped by product ID across all URLs. When provided, startUrls REPLACE the query/location fields (each supported URL becomes one task; unsupported URLs are skipped, and if none is supported the run stops with an input error).",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "includeDetails": {
            "title": "📋 Include Full Details",
            "type": "boolean",
            "description": "Fetch each product's full card: description, characteristics, pack contents, image list, seller legal data and recorded price history. Turn off for a faster, search-only run (price, stock, rating, seller, rank).",
            "default": true
          },
          "descriptionMaxLength": {
            "title": "✂️ Description Max Length",
            "minimum": 0,
            "type": "integer",
            "description": "Truncate description to N chars. 0 = no truncation.",
            "default": 0
          },
          "compact": {
            "title": "📦 Compact Output",
            "type": "boolean",
            "description": "Core fields only (for AI-agent/MCP workflows).",
            "default": false
          },
          "descriptionFormat": {
            "title": "Description format",
            "enum": [
              "all",
              "text",
              "html",
              "markdown"
            ],
            "type": "string",
            "description": "Pick a single description representation. `all` keeps every variant; `text` / `html` / `markdown` drop the others.",
            "default": "all"
          },
          "excludeEmptyFields": {
            "title": "Exclude empty fields from output",
            "type": "boolean",
            "description": "Drop null, empty-string, and empty-array fields from each record before push. Smaller payloads for AI agents and dashboards.",
            "default": false
          },
          "mode": {
            "title": "🧭 What to extract",
            "enum": [
              "products",
              "reviews",
              "sellers",
              "niche",
              "monitor",
              "resale"
            ],
            "type": "string",
            "description": "Products (default): one row per product. Reviews: one row per customer review, instead of product rows. Sellers: one row per distinct seller of the products found, instead of product rows. The product search still runs first, and Max Results still limits how many PRODUCTS are read (not how many review or seller rows come out). In Sellers mode the full product details are always loaded, because the seller data comes from them. Niche: one summary row per keyword/category (seller concentration, price spread, stock) from the search results. Monitor: where each product ranks for a keyword now and what changed since the last run (needs the same Monitor state name on every run). Resale: Wildberries Resale (second-hand) listings, optionally only for the conditions chosen below.",
            "default": "products"
          },
          "scrapeReviews": {
            "title": "⭐ Add reviews to each product",
            "type": "boolean",
            "description": "Products mode: add a reviewAggregates summary (average rating, review counts, 1-5 star distribution) and a reviews list to every product row. In Reviews mode reviews are always collected, so this switch has no effect there. Colour variants of one product share their reviews.",
            "default": false
          },
          "maxReviewsPerProduct": {
            "title": "🔢 Max reviews per product",
            "minimum": 0,
            "type": "integer",
            "description": "Applies to the reviews list on product rows and to the review rows in Reviews mode. 0 = every review the site serves for the product, which is at most its roughly 1,000 most recent ones. Newest reviews come first. Filters below are applied before this limit.",
            "default": 20
          },
          "reviewsWithTextOnly": {
            "title": "📝 Only reviews with text",
            "type": "boolean",
            "description": "Keep only reviews that have a written comment, pros or cons (skips star-only ratings).",
            "default": false
          },
          "reviewsWithPhotoOnly": {
            "title": "📷 Only reviews with photos",
            "type": "boolean",
            "description": "Keep only reviews that include at least one customer photo.",
            "default": false
          },
          "maxQuestionsPerProduct": {
            "title": "❓ Max questions per product",
            "minimum": 0,
            "type": "integer",
            "description": "Products mode: add the newest customer questions and the seller answers (questions list) plus the total number of questions the product has (questionsCount) to every product row. 0 = off (default). Colour variants of one product share their questions.",
            "default": 0
          },
          "incrementalMode": {
            "title": "♻️ Incremental Mode",
            "type": "boolean",
            "description": "Compare against previous run state. stateKey is optional — defaults to a value derived from search inputs (queries, delivery regions, startUrls) so different searches never share state.",
            "default": false
          },
          "stateKey": {
            "title": "🔑 State Key",
            "type": "string",
            "description": "Optional. Stable identifier for the tracked search universe. Leave empty to auto-generate from search inputs."
          },
          "skipReposts": {
            "title": "🚫 Skip Reposts",
            "type": "boolean",
            "description": "When incremental, skip products whose content matches an expired product from a prior run (cross-run duplicate detection).",
            "default": false
          },
          "emitUnchanged": {
            "title": "🔄 Emit Unchanged Products",
            "type": "boolean",
            "description": "When incremental mode is on, also emit products whose content has not changed since the last run.",
            "default": false
          },
          "emitExpired": {
            "title": "⚰️ Emit Expired Products",
            "type": "boolean",
            "description": "When incremental mode is on, also emit products that were seen before but are no longer found.",
            "default": false
          },
          "notifyOnlyChanges": {
            "title": "🔄 Notify Only New/Updated",
            "type": "boolean",
            "description": "When Incremental Mode is on, only send notifications for NEW and UPDATED products. Has no effect outside incremental mode.",
            "default": false
          },
          "notificationLimit": {
            "title": "📊 Max Products Per Notification",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Maximum number of products included in each notification message (1–20).",
            "default": 5
          },
          "telegramToken": {
            "title": "🔑 Telegram Bot Token",
            "type": "string",
            "description": "Telegram bot token (from @BotFather). Required for Telegram notifications."
          },
          "telegramChatId": {
            "title": "💬 Telegram Chat ID",
            "type": "string",
            "description": "Telegram chat or channel ID (e.g. \"-100123456789\"). Required when telegramToken is set."
          },
          "discordWebhookUrl": {
            "title": "🎮 Discord Webhook URL",
            "type": "string",
            "description": "Discord incoming webhook URL. Server Settings → Integrations → Webhooks → New Webhook."
          },
          "slackWebhookUrl": {
            "title": "💼 Slack Webhook URL",
            "type": "string",
            "description": "Slack incoming webhook URL. api.slack.com/messaging/webhooks."
          },
          "whatsappPhoneNumberId": {
            "title": "📞 WhatsApp Phone Number ID",
            "type": "string",
            "description": "Your WhatsApp Business phone-number ID (numeric, from Meta dashboard). Required when whatsappAccessToken is set."
          },
          "whatsappAccessToken": {
            "title": "📱 WhatsApp Access Token",
            "type": "string",
            "description": "WhatsApp Cloud API permanent access token (System User token from Meta Business). Recipient must have messaged the business number within the last 24h (service-conversation window — free since Nov 2024)."
          },
          "whatsappTo": {
            "title": "📲 WhatsApp Recipient",
            "type": "string",
            "description": "Recipient phone in E.164 format without + (e.g. \"436641234567\"). Recipient must have messaged your business number within last 24h."
          },
          "webhookUrl": {
            "title": "🪝 Generic Webhook URL",
            "type": "string",
            "description": "Receives a JSON POST with {metadata, items} after each run. Universal escape hatch for n8n / Make / Zapier / custom backends."
          },
          "webhookHeaders": {
            "title": "📋 Webhook Headers",
            "type": "object",
            "description": "Optional JSON object of custom headers (e.g. {\"Authorization\":\"Bearer ...\"})."
          },
          "appConnector": {
            "title": "Send results to a connected app",
            "type": "string",
            "description": "Optional. Pick a connected app under Settings → API & Integrations to receive your results (including any contact details). Best-effort across MCP connectors as Apify expands its catalog."
          },
          "mcpIssueTeam": {
            "title": "Issue tracker team",
            "type": "string",
            "description": "Only when the connected app is an issue tracker: the team (name or ID) the summary issue is created under, if that app requires one."
          },
          "productIds": {
            "title": "🔢 Product IDs",
            "type": "array",
            "description": "Wildberries article numbers (nmId) to read directly, without a search. Accepts a list, or a comma/space separated text. Ids that do not exist are skipped. Counts as input on its own: queries or start URLs are not needed.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "sellerIds": {
            "title": "🏪 Seller IDs",
            "type": "array",
            "description": "Wildberries seller ids to read the catalogue of. A seller id that does not exist produces one row with status not_found and the run still succeeds. Counts as input on its own.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "sort": {
            "title": "↕️ Sort order",
            "enum": [
              "popular",
              "priceup",
              "pricedown",
              "newly",
              "rate",
              "benefit"
            ],
            "type": "string",
            "description": "Order of the results for searches, categories, brands, sellers and resale. Empty = the site default (popular). Monitor mode ranks follow this order."
          },
          "lowPrice": {
            "title": "💰 Minimum price (RUB)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only products at or above this sale price in roubles. Empty = no limit."
          },
          "topPrice": {
            "title": "💰 Maximum price (RUB)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only products at or below this sale price in roubles. Empty = no limit."
          },
          "discount": {
            "title": "🏷️ Minimum discount (%)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Keep only products discounted by at least this percentage. Empty = no limit."
          },
          "inStockOnly": {
            "title": "📦 In stock only",
            "type": "boolean",
            "description": "Keep only products that are in stock.",
            "default": false
          },
          "minRating": {
            "title": "⭐ Minimum product rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Products, niche, monitor, resale and sellers modes: drop products rated below this (0-5). Reviews mode: keep only reviews with at least this star rating (1-5) instead. Empty = no limit."
          },
          "flagUnderpriced": {
            "title": "🏷️ Flag underpriced listings",
            "type": "boolean",
            "description": "Products mode: add isUnderpriced and underpricedDeviationPct to each product row. Niche mode: add underpricedCount, underpricedThresholdPrice and underpricedThresholdPct to the niche row. A listing is underpriced when its price is below the baseline x (1 - threshold / 100). Without a reference price the baseline is the median: in niche mode the median of the analysed products, in products mode the median of the first results page of each search/target (so the flag is judged against what that search shows, not the whole result set).",
            "default": false
          },
          "referencePrice": {
            "title": "💰 Reference price (RUB)",
            "minimum": 0,
            "type": "integer",
            "description": "Used with 'Flag underpriced listings': listings below reference price x (1 - threshold / 100) are flagged. Leave empty to compare with the median of the results instead."
          },
          "underpriceThresholdPct": {
            "title": "📉 Underpriced threshold (%)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "How far below the baseline (reference price or median) a listing must be to count as underpriced. 50 = more than half price.",
            "default": 50
          },
          "maxSellersPerSearch": {
            "title": "🏪 Sellers per search",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "Sellers mode: how many distinct sellers to profile from each search query, category or brand page. Each seller row gets catalogue statistics (see 'Products per seller').",
            "default": 25
          },
          "maxProductsPerSeller": {
            "title": "📦 Products per seller",
            "minimum": 20,
            "maximum": 2000,
            "type": "integer",
            "description": "Sellers mode: how many of a seller's catalogue products to scan for the statistics (price min/max/average/median, distinct brands, average rating, total reviews, in-stock share). 100 products per request, so higher values cost more requests.",
            "default": 200
          },
          "brand": {
            "title": "🏷️ Brand contains",
            "type": "string",
            "description": "Keep only products whose brand name contains this text (not case sensitive). Empty = all brands."
          },
          "maxRating": {
            "title": "⭐ Maximum review rating",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Reviews mode and review lists: keep only reviews with at most this star rating (1-5), e.g. 2 for complaints. Empty = all reviews."
          },
          "dateFrom": {
            "title": "📅 Reviews from",
            "type": "string",
            "description": "Keep only reviews written on or after this date (YYYY-MM-DD). Empty = no limit."
          },
          "dateTo": {
            "title": "📅 Reviews until",
            "type": "string",
            "description": "Keep only reviews written on or before this date (YYYY-MM-DD). Empty = no limit."
          },
          "maxProductsPerNiche": {
            "title": "📊 Niche: products analysed",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Niche mode: how many products per keyword or category are analysed (100 per page). More products give a more accurate picture and take longer.",
            "default": 300
          },
          "nicheTopN": {
            "title": "🏆 Niche: top sellers and brands",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Niche mode: how many of the largest sellers and brands are listed in each summary row.",
            "default": 5
          },
          "monitorStateName": {
            "title": "🗄️ Monitor state name",
            "type": "string",
            "description": "Monitor mode: name of the stored snapshot the run compares against and then updates. Use the same name on every scheduled run of one watch list, and a different name for a different one. Lowercase letters, digits and hyphens.",
            "default": "wb-monitor-default"
          },
          "monitorOutput": {
            "title": "📈 Monitor output",
            "enum": [
              "snapshot",
              "snapshot_with_changes",
              "changes_only"
            ],
            "type": "string",
            "description": "Snapshot: current rank and price only. Snapshot with changes: also the previous values and what changed. Changes only: only products that moved, changed price or stock, appeared or disappeared.",
            "default": "snapshot_with_changes"
          },
          "maxRankPages": {
            "title": "📄 Monitor: pages per keyword",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Monitor mode: how many result pages (100 products each) are read per keyword to find the rank. A product beyond these pages is reported as missing.",
            "default": 5
          },
          "priceChangeThresholdPct": {
            "title": "📉 Monitor: price change threshold (%)",
            "minimum": 0,
            "type": "number",
            "description": "Monitor mode: a price move smaller than this percentage is not reported as a change. Empty = any change counts."
          },
          "targetNmIds": {
            "title": "🎯 Monitor: watched product IDs",
            "type": "array",
            "description": "Monitor mode: track only these article numbers. A watched product that is not found on the scanned pages is still reported, with isMissing true. Empty = track every product found.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "resaleConditions": {
            "title": "♻️ Resale conditions",
            "type": "array",
            "description": "Resale mode: keep only listings in these conditions (new, perfect, good). Empty = all conditions.",
            "items": {
              "type": "string",
              "enum": [
                "new",
                "perfect",
                "good"
              ],
              "enumTitles": [
                "New",
                "Perfect",
                "Good"
              ]
            },
            "default": []
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}