Разбор
ИИ-анализ ниши на Wildberries перед запуском товара: как не слить 200 000 рублей на невостребованный продукт
60% новых поставщиков WB закрываются в первый год. Главная причина — неправильный выбор ниши. Python + публичный API WB + Claude анализируют нишу за 30 минут и ~50 рублей вместо MPStats за 3 500 ₽/мес.
Средний новый поставщик WB тратит 200 000 рублей на первую партию, не продаёт её в срок, уходит в минус и закрывается. Около 60% новых продавцов уходят с WB в первый год — и почти в каждом случае проблема начинается до поставки, когда человек выбирает нишу интуитивно.
Платные сервисы вроде 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 хватает.
Какие метрики говорят «заходи» и «беги»
| Метрика | Хорошо | Осторожно | Стоп |
|---|---|---|---|
| Среднее отзывов в топ-10 | 50–200 | 200–500 | 500+ |
| Доля топ-3 продавцов (по отзывам) | < 30% | 30–60% | 60%+ |
| Число уникальных продавцов в топ-100 | 40+ | 15–40 | < 15 |
| Средняя цена | 500+ ₽ | 300–500 ₽ | < 300 ₽ |
| Доля товаров с рейтингом ниже 4.0 | 20%+ | 10–20% | < 10% |
Последняя строка — менее очевидная. Если в нише почти все товары с рейтингом 4.8–5.0, там либо фейковые отзывы, либо конкуренты уже обеспечивают хорошее качество и вас не ждут. Если 20–30% товаров с рейтингом ниже 4.0, покупатели жалуются — и это ваш вход с нормальным продуктом.
Код агента
Скрипт забирает топ-100 товаров по запросу, считает базовые метрики, вытаскивает отзывы у топ-5 товаров и передаёт всё в Claude. Claude возвращает вывод: заходить или нет, и если заходить — как позиционироваться.
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 браузера на странице товара.
Кейс: силиконовые формы для выпечки
Прогнал этот запрос. Вот что вышло.
Запрос возвращает 100 товаров, цены от 89 до 3 400 рублей.
в топ-100
(умеренная концентрация)
у топ-10 товаров
ниже 4.0
Claude по отзывам нашёл паттерн: хвалят прочность и удобство мытья у дорогих форм (600–1 200 ₽), жалуются на запах силикона и деформацию при нагреве у дешёвых (89–250 ₽). Концентрация низкая, 24% товаров с плохим рейтингом — есть куда зайти.
Вердикт Claude: заходить с премиум-позиционированием. Ценовой сегмент 800–1 400 ₽, упор на пищевой силикон без запаха и немецкий LFGB-стандарт в названии карточки. Средний сегмент 300–600 ₽ перегрет. Дешевле 300 ₽ — бессмысленно, там маржи нет даже у лидеров.
Есть вопрос по теме?
Пришлю чеклист запуска товара и разберу стратегию продвижения
MPStats и Moneyplace против самодельного агента
Честный ответ: если выбираете нишу для серьёзного бизнеса с оборотом от 1–2 млн рублей в год — берите MPStats. Там есть динамика тренда за полгода, оценка выручки и удобный интерфейс. 3 500 ₽/мес при таких оборотах — нормальный инструментальный расход.
Свой агент оправдан в двух случаях: вы смотрите много ниш быстро (перед покупкой подписки) или хотите добавить то чего нет в готовых инструментах — например, конкретный анализ жалоб в отзывах для формулировки УТП.
Проверь свою нишу: 4 вопроса
Диагностика ниши
4 вопроса — оценим шансы на входе
Ограничения которые надо знать
Агент не показывает реальную прибыль конкурентов. Нет данных о себестоимости, логистике, рекламных расходах — только то что видно снаружи. Оценки объёма продаж косвенные.
Публичный API Wildberries периодически меняет структуру ответов. Раз в 3–4 месяца что-то ломается. Это не фатально, но нужно проверять скрипт после обновлений WB. Добавьте логирование статус-кодов и следите за r.status_code в продакшене.
Скрипт не строит тренды. MPStats показывает динамику ниши за 6–12 месяцев — это серьёзное преимущество для сезонных категорий. Если хотите видеть тренд — придётся запускать агента раз в месяц и сохранять историю самостоятельно.
И главное: анализ данных не заменяет проверку конкурентного предложения руками. Прочитайте 50 отзывов на лидере ниши лично. Claude прочитает все 500, но вы почувствуете нюансы которые он пропустит.
Две недели назад один знакомый потратил 3 500 рублей на месяц MPStats чтобы проверить одну нишу. Получил решение «нет, не заходить». За 50 рублей через этот скрипт — тот же ответ, плюс конкретные жалобы покупателей на конкурентов в свободной форме. Второй вариант сэкономил бы ему 3 450 рублей на инструменты и направил бы эти деньги в следующую проверку.
Есть вопрос по теме?
Пришлю чеклист запуска товара и разберу стратегию продвижения
Источники
AI-агенты · Персональная карта
4 часа потратил — не работает?
Покажу где ты пошёл не туда и как сделать правильно за 2 недели
Получить разбор бесплатно →AI-агенты · 10 мест
Ты работаешь до полуночи — AI-агент будет работать вместо тебя
Покажу какой агент закроет твою главную операционную боль
Узнать свой маршрут →Есть вопрос по теме?
Пришлю чеклист запуска товара и разберу стратегию продвижения
Источники
Читайте также
Часто задаваемые вопросы
- Какие данные даёт анализ ниши на 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 ₽ (там маржи нет даже у топов), и категории с ярко выраженным сезонным спросом без опыта работы с поставками. Агент это видит за один прогон.
Канал «Лёха Маркетолог»
Практика без воды: кейсы, инсайты, разборы. 1–2 поста в неделю.
Пока без комментариев. Будьте первым.