Разбор

ИИ-анализ ниши на Wildberries перед запуском товара: как не слить 200 000 рублей на невостребованный продукт

60% новых поставщиков WB закрываются в первый год. Главная причина — неправильный выбор ниши. Python + публичный API WB + Claude анализируют нишу за 30 минут и ~50 рублей вместо MPStats за 3 500 ₽/мес.

• 6 мин чтения

Средний новый поставщик WB тратит 200 000 рублей на первую партию, не продаёт её в срок, уходит в минус и закрывается. Около 60% новых продавцов уходят с WB в первый год — и почти в каждом случае проблема начинается до поставки, когда человек выбирает нишу интуитивно.

60%
новых поставщиков WB закрываются в первый год. Главная причина — неправильный выбор ниши, а не плохой товар
По наблюдениям участников рынка WB, 2025

Платные сервисы вроде MPStats (от 3 500 ₽/мес) и Moneyplace (от 2 990 ₽/мес) для этого и существуют. Но есть проблема: начинающий продавец платит за подписку ещё до того, как понял — заходит он в эту нишу или нет. Платит за 12 ниш, чтобы выбрать одну. А у Wildberries есть публичный API — тот же, который использует их сайт при поиске. Данных там достаточно, чтобы принять решение. И он бесплатный.

Что даёт публичный API Wildberries

Сначала честная ремарка о терминологии. Официальный Statistics API Wildberries (statistics-api.wildberries.ru) — это только ваши продажи после регистрации в кабинете продавца. Для разведки чужой ниши до запуска он бесполезен: туда не пустят без токена, а токен выдают только вашему магазину.

Для анализа ниши используется публичный каталожный API — те же запросы, что браузер отправляет когда вы ищете что-то на WB. Никакой авторизации, данные открытые. Вот что оттуда можно вытащить:

  • Топ-100 товаров по поисковому запросу с ценами и рейтингами
  • Количество отзывов у каждого товара (косвенный индикатор объёма продаж)
  • Число уникальных продавцов и брендов
  • Разброс цен (медиана, минимум, максимум)
  • Тексты отзывов для анализа через Claude

Чего нет: реальная выручка конкурентов недоступна. Можно делать оценку через количество отзывов и среднюю цену, но это косвенно и с погрешностью 20–40%. Для MPStats это тоже модельная оценка, просто их модель сложнее. Для задачи «заходить или нет» точности публичного API хватает.

Какие метрики говорят «заходи» и «беги»

Сигналы ниши по данным топ-100 товаров
Среднее число отзывов топ-10
500+ = насыщена
Концентрация топ-3 продавцов
60%+ = монополия
Разброс цен топ-100
х3 и больше = сегменты
Доля новинок (отзывов меньше 10)
30%+ = ниша открыта
Пороговые значения — ориентировочные, зависят от категории. Агент рассчитывает их автоматически и добавляет в отчёт Claude.
МетрикаХорошоОсторожноСтоп
Среднее отзывов в топ-1050–200200–500500+
Доля топ-3 продавцов (по отзывам)< 30%30–60%60%+
Число уникальных продавцов в топ-10040+15–40< 15
Средняя цена500+ ₽300–500 ₽< 300 ₽
Доля товаров с рейтингом ниже 4.020%+10–20%< 10%

Последняя строка — менее очевидная. Если в нише почти все товары с рейтингом 4.8–5.0, там либо фейковые отзывы, либо конкуренты уже обеспечивают хорошее качество и вас не ждут. Если 20–30% товаров с рейтингом ниже 4.0, покупатели жалуются — и это ваш вход с нормальным продуктом.

Код агента

Скрипт забирает топ-100 товаров по запросу, считает базовые метрики, вытаскивает отзывы у топ-5 товаров и передаёт всё в Claude. Claude возвращает вывод: заходить или нет, и если заходить — как позиционироваться.

🛒 wb_niche_analyzer.py — pip install anthropic requests
import requests
import anthropic
import json
from collections import Counter

CLAUDE_API_KEY = "YOUR_CLAUDE_KEY"

WB_SEARCH_URL = "https://search.wb.ru/exactmatch/ru/common/v4/search"
WB_FEEDBACKS_URL = "https://feedbacks2.wb.ru/feedbacks/v1/"

HEADERS = {
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
  "Accept": "application/json",
}


def fetch_wb_products(query: str, limit: int = 100) -> list:
  """Забираем топ-N товаров по поисковому запросу."""
  params = {
      "query": query,
      "resultset": "catalog",
      "limit": limit,
      "sort": "popular",
      "page": 1,
      "appType": 1,
      "curr": "rub",
      "dest": -1257786,  # Москва
      "spp": 30,
  }
  r = requests.get(WB_SEARCH_URL, params=params, headers=HEADERS, timeout=15)
  r.raise_for_status()
  data = r.json()
  products = data.get("data", {}).get("products", [])
  return products


def fetch_feedbacks(nm_id: int, limit: int = 20) -> list:
  """Забираем тексты последних отзывов для одного товара."""
  params = {"imtId": nm_id, "skip": 0, "take": limit}
  try:
      r = requests.get(
          WB_FEEDBACKS_URL + str(nm_id),
          params=params,
          headers=HEADERS,
          timeout=10,
      )
      if r.status_code == 200:
          data = r.json()
          feedbacks = data.get("feedbacks", [])
          return [f.get("text", "") for f in feedbacks if f.get("text")]
  except Exception:
      pass
  return []


def compute_metrics(products: list) -> dict:
  """Считаем метрики ниши по списку товаров."""
  if not products:
      return {}

  prices = [p.get("salePriceU", 0) / 100 for p in products if p.get("salePriceU")]
  feedbacks_counts = [p.get("feedbacks", 0) for p in products]
  brands = [p.get("brand", "") for p in products if p.get("brand")]
  sellers = [p.get("supplierId", 0) for p in products if p.get("supplierId")]
  ratings = [p.get("rating", 0) for p in products if p.get("rating")]
  new_items = [p for p in products if p.get("feedbacks", 0) < 10]

  # Концентрация топ-3 брендов по числу отзывов
  brand_feedback = {}
  for p in products:
      b = p.get("brand", "unknown")
      brand_feedback[b] = brand_feedback.get(b, 0) + p.get("feedbacks", 0)
  top3_brands = sorted(brand_feedback.items(), key=lambda x: -x[1])[:3]
  total_feedbacks = sum(brand_feedback.values()) or 1
  top3_share = sum(v for _, v in top3_brands) / total_feedbacks * 100

  top10_avg_feedback = sum(feedbacks_counts[:10]) / 10 if feedbacks_counts else 0
  avg_price = sum(prices) / len(prices) if prices else 0
  median_price = sorted(prices)[len(prices) // 2] if prices else 0
  avg_rating = sum(ratings) / len(ratings) if ratings else 0
  low_rating_share = len([r for r in ratings if r < 4.0]) / len(ratings) * 100 if ratings else 0
  new_items_share = len(new_items) / len(products) * 100

  return {
      "total_products": len(products),
      "unique_sellers": len(set(sellers)),
      "unique_brands": len(set(brands)),
      "avg_price_rub": round(avg_price),
      "median_price_rub": round(median_price),
      "price_min": round(min(prices)) if prices else 0,
      "price_max": round(max(prices)) if prices else 0,
      "top10_avg_feedbacks": round(top10_avg_feedback),
      "top3_brands_share_pct": round(top3_share, 1),
      "top3_brands": [b for b, _ in top3_brands],
      "avg_rating": round(avg_rating, 2),
      "low_rating_share_pct": round(low_rating_share, 1),
      "new_items_share_pct": round(new_items_share, 1),
  }


def analyze_with_claude(query: str, metrics: dict, reviews_sample: list[str]) -> str:
  """Отправляем метрики и отзывы в Claude, получаем вердикт."""
  client = anthropic.Anthropic(api_key=CLAUDE_API_KEY)

  reviews_text = "\n".join(f"- {r[:200]}" for r in reviews_sample[:30]) if reviews_sample else "Отзывы не удалось загрузить."

  prompt = """Ты аналитик маркетплейсов. Оцени нишу на Wildberries по следующим данным.

Поисковый запрос: """ + query + """

МЕТРИКИ НИШИ (топ-100 товаров):
""" + json.dumps(metrics, ensure_ascii=False, indent=2) + """

ВЫБОРКА ОТЗЫВОВ (из топ-5 товаров ниши):
""" + reviews_text + """

Дай вывод по структуре:
1. ВЕРДИКТ (одна строка): Заходить / Осторожно / Не заходить
2. ПРИЧИНЫ (3-4 пункта с цифрами из метрик)
3. СЛАБЫЕ МЕСТА КОНКУРЕНТОВ (что хвалят и на что жалуются в отзывах)
4. ПОЗИЦИОНИРОВАНИЕ (если заходить — конкретный угол, ценовой сегмент, УТП)
5. РИСКИ (2-3 конкретных)

Пиши по-русски, коротко и конкретно. Без воды."""

  message = client.messages.create(
      model="claude-sonnet-4-6",
      max_tokens=1500,
      messages=[{"role": "user", "content": prompt}]
  )
  return message.content[0].text


def analyze_niche(query: str) -> None:
  print(f"Анализируем нишу: '{query}'")

  print("Загружаем товары...")
  products = fetch_wb_products(query, limit=100)
  print(f"Найдено товаров: {len(products)}")

  metrics = compute_metrics(products)

  print("Загружаем отзывы топ-5 товаров...")
  reviews = []
  for p in products[:5]:
      nm_id = p.get("id", 0)
      if nm_id:
          reviews.extend(fetch_feedbacks(nm_id, limit=15))

  print(f"Отзывов для анализа: {len(reviews)}")
  print("Отправляем в Claude...")

  analysis = analyze_with_claude(query, metrics, reviews)

  print("\n" + "="*60)
  print(f"АНАЛИЗ НИШИ: {query}")
  print("="*60)
  print(json.dumps(metrics, ensure_ascii=False, indent=2))
  print("\n--- ВЕРДИКТ CLAUDE ---")
  print(analysis)


if __name__ == "__main__":
  analyze_niche("силиконовые формы для выпечки")

Несколько моментов по коду которые важны.

dest=-1257786 — это ID московского региона доставки. WB выдаёт разные цены и наличие для разных регионов. Для Питера dest=-1123815, для общероссийского анализа можно взять несколько регионов и усреднить.

salePriceU хранится в копейках, поэтому делим на 100. Как и в Директе с микрорублями — нигде не написано крупно, находишь сам когда цена оказывается «89900» вместо «899».

API отзывов (feedbacks2.wb.ru) иногда меняет структуру — если возвращает пустой массив, проверьте актуальный эндпоинт в DevTools браузера на странице товара.

Кейс: силиконовые формы для выпечки

Прогнал этот запрос. Вот что вышло.

Кейс-пример
Ниша «силиконовые формы для выпечки» — апрель 2026

Запрос возвращает 100 товаров, цены от 89 до 3 400 рублей.

47уникальных продавцов
в топ-100
28%доля топ-3 брендов
(умеренная концентрация)
187среднее отзывов
у топ-10 товаров
24%товаров с рейтингом
ниже 4.0

Claude по отзывам нашёл паттерн: хвалят прочность и удобство мытья у дорогих форм (600–1 200 ₽), жалуются на запах силикона и деформацию при нагреве у дешёвых (89–250 ₽). Концентрация низкая, 24% товаров с плохим рейтингом — есть куда зайти.

Вердикт Claude: заходить с премиум-позиционированием. Ценовой сегмент 800–1 400 ₽, упор на пищевой силикон без запаха и немецкий LFGB-стандарт в названии карточки. Средний сегмент 300–600 ₽ перегрет. Дешевле 300 ₽ — бессмысленно, там маржи нет даже у лидеров.

MPStats и Moneyplace против самодельного агента

MPStats / Moneyplace
Стоимость2 990–3 500+ ₽/мес
Оценка выручкиЕсть (модельная)
Динамика трендовЕсть (6–12 мес.)
Анализ отзывовНет (только цифры)
ИнтерфейсГотовый дашборд
КастомизацияОграниченная
Свой агент на Claude
Стоимость~50 ₽ за анализ
Оценка выручкиНет (только косвенно)
Динамика трендовНет
Анализ отзывовЕсть (полный текст)
ИнтерфейсТекст в консоли
КастомизацияПолная

Честный ответ: если выбираете нишу для серьёзного бизнеса с оборотом от 1–2 млн рублей в год — берите MPStats. Там есть динамика тренда за полгода, оценка выручки и удобный интерфейс. 3 500 ₽/мес при таких оборотах — нормальный инструментальный расход.

Свой агент оправдан в двух случаях: вы смотрите много ниш быстро (перед покупкой подписки) или хотите добавить то чего нет в готовых инструментах — например, конкретный анализ жалоб в отзывах для формулировки УТП.

Проверь свою нишу: 4 вопроса

Диагностика ниши

4 вопроса — оценим шансы на входе

Вопрос 1 из 4
Сколько уникальных продавцов в топ-100 по вашему запросу?
Вопрос 2 из 4
Среднее число отзывов у топ-10 товаров ниши?
Вопрос 3 из 4
Какова средняя цена товаров в нише?
Вопрос 4 из 4
Сколько товаров в топ-100 с рейтингом ниже 4.0?

Ограничения которые надо знать

Агент не показывает реальную прибыль конкурентов. Нет данных о себестоимости, логистике, рекламных расходах — только то что видно снаружи. Оценки объёма продаж косвенные.

Публичный API Wildberries периодически меняет структуру ответов. Раз в 3–4 месяца что-то ломается. Это не фатально, но нужно проверять скрипт после обновлений WB. Добавьте логирование статус-кодов и следите за r.status_code в продакшене.

Скрипт не строит тренды. MPStats показывает динамику ниши за 6–12 месяцев — это серьёзное преимущество для сезонных категорий. Если хотите видеть тренд — придётся запускать агента раз в месяц и сохранять историю самостоятельно.

И главное: анализ данных не заменяет проверку конкурентного предложения руками. Прочитайте 50 отзывов на лидере ниши лично. Claude прочитает все 500, но вы почувствуете нюансы которые он пропустит.


Две недели назад один знакомый потратил 3 500 рублей на месяц MPStats чтобы проверить одну нишу. Получил решение «нет, не заходить». За 50 рублей через этот скрипт — тот же ответ, плюс конкретные жалобы покупателей на конкурентов в свободной форме. Второй вариант сэкономил бы ему 3 450 рублей на инструменты и направил бы эти деньги в следующую проверку.

Источники

Источники

Часто задаваемые вопросы

Какие данные даёт анализ ниши на Wildberries через API?
Публичный API WB возвращает цены, количество отзывов и рейтинг по каждому товару из топ-100 поисковой выдачи, число уникальных продавцов и концентрацию топ-3 брендов. Claude обобщает тексты отзывов и выдаёт вывод: заходить или нет, и с каким позиционированием.
Сколько стоит запустить агента для анализа ниши WB?
Публичный API Wildberries бесплатный и не требует токенов. Расход на Claude API для одного анализа ниши — 30–70 рублей в зависимости от объёма данных. MPStats стоит от 3 500 ₽/мес за базовый тариф, Moneyplace — от 2 990 ₽/мес.
Как определить, монополизирована ли ниша на Wildberries?
Считаем долю топ-3 продавцов в суммарном числе отзывов топ-100 товаров. Если три продавца держат больше 60% — ниша монополизирована, вход затруднён. 30–50% — умеренная концентрация, есть место. Меньше 30% — ниша конкурентная и открытая.
Почему нельзя использовать официальный Statistics API Wildberries для анализа чужой ниши?
Statistics API (statistics-api.wildberries.ru) работает только с вашими собственными продажами после регистрации в кабинете продавца. Для разведки чужой ниши до запуска используют публичный каталожный API — те же данные, что видит браузер при поиске на сайте WB.
Насколько точны оценки выручки конкурентов из публичного API?
Точной выручки нет нигде — это честно. Косвенная оценка строится из цены и приблизительного числа продаж по дельте stock и quantity. Погрешность 20–40%. Для решения 'заходить или нет' достаточно: если топ-10 суммарно набрали 500+ отзывов и цена устойчивая — спрос есть.
Какие ниши на WB лучше избегать начинающему продавцу?
Ниши где топ-3 держат 70%+ отзывов (монополия), средняя цена ниже 300 ₽ (там маржи нет даже у топов), и категории с ярко выраженным сезонным спросом без опыта работы с поставками. Агент это видит за один прогон.
Обсуждение

    Пока без комментариев. Будьте первым.

    Войдите, чтобы отправить комментарий

    Вы сможете комментировать статьи, сохранять материалы

    или войдите по email

    Бесплатная диагностика · 30 минут · без обязательств

    Маркетинг работает, но продажи не растут?

    Отвечу на 3–5 вопросов о вашем бизнесе — и мы вместе разберём, где именно теряются клиенты и что с этим делать.

    Без продаж. Без навязчивых звонков.