Примеры API запросов
Готовые примеры для быстрого старта. Все примеры протестированы и работают (2026-02-19).
MCP-сервер
Для работы из Claude Code используйте MCP-сервер — не нужно писать код.
Python (httpx)
Установка
pip install httpx
Проверка квот API
import httpx
TOKEN = "YOUR_MPSTATS_TOKEN"
BASE_URL = "https://mpstats.io/api"
headers = {"X-Mpstats-TOKEN": TOKEN}
resp = httpx.get(f"{BASE_URL}/user/check/limits", headers=headers)
limits = resp.json()
print(f"Общий лимит: {limits['available']}, использовано: {limits['use']}")
print(f"WB: {limits['available_wb_external']}, использовано: {limits['use_wb_external']}")
Топ товаров в категории
from urllib.parse import quote
resp = httpx.post(
f"{BASE_URL}/wb/get/category",
headers={**headers, "Content-Type": "application/json"},
json={
"path": quote("Автотовары", safe=""),
"d1": "2026-01-20",
"d2": "2026-02-19",
"startRow": 0,
"endRow": 10,
"sortModel": [{"colId": "revenue", "sort": "desc"}]
}
)
result = resp.json()
items = result.get("data", []) # Данные внутри "data"!
print(f"Получено {len(items)} товаров из {result.get('total', '?')}")
for item in items[:5]:
print(f" {item['name'][:50]} — {item.get('revenue', 0):,.0f} ₽, продаж: {item.get('sales', 0)}")
Ответ обёрнут в объект
Товары находятся в result["data"], а не в корне JSON. result["total"] содержит общее количество.
Продажи конкретного SKU
sku = 143207180
resp = httpx.get(
f"{BASE_URL}/wb/get/item/{sku}/sales",
headers=headers,
params={"d1": "2026-01-20", "d2": "2026-02-19"}
)
sales_data = resp.json()
total_sales = sum(day.get("sales", 0) for day in sales_data)
total_revenue = sum(day.get("sales", 0) * day.get("final_price", 0) for day in sales_data)
print(f"SKU {sku}: {total_sales} продаж, выручка ~{total_revenue:,.0f} ₽")
SEO-анализ: ключевые слова товара
sku = 143207180
resp = httpx.get(
f"{BASE_URL}/wb/get/item/{sku}/by_keywords",
headers=headers,
params={"d1": "2026-02-01", "d2": "2026-02-19"}
)
data = resp.json()
words = data.get("words", {}) # ⚠️ Dict, не list!
# Топ-10 по частотности
sorted_words = sorted(words.items(), key=lambda x: x[1].get("wb_frequency", 0), reverse=True)
for keyword, info in sorted_words[:10]:
freq = info.get("wb_frequency", 0)
pos = info.get("median_pos", "?")
print(f" «{keyword}» — частотность {freq:,}, позиция {pos}")
Позиции в категориях
sku = 143207180
resp = httpx.get(
f"{BASE_URL}/wb/get/item/{sku}/by_category",
headers=headers,
params={"d1": "2026-02-01", "d2": "2026-02-19"}
)
data = resp.json()
categories = data.get("categories", {})
for cat, positions in categories.items():
avg_pos = sum(positions) / len(positions) if positions else 0
print(f" {cat}: средняя позиция {avg_pos:.0f}")
Список предметов (subjects)
resp = httpx.get(
f"{BASE_URL}/wb/get/subject/list",
headers=headers,
params={"dt": "2026-02-19"}
)
subjects = resp.json()
print(f"Всего предметов: {len(subjects)}")
# Топ-5 по выручке
sorted_subjects = sorted(subjects, key=lambda x: x.get("revenue", 0), reverse=True)
for s in sorted_subjects[:5]:
print(f" {s['name']}: {s.get('revenue', 0):,.0f} ₽, товаров: {s.get('items', 0):,}")
Тренды категории (72 месяца)
from urllib.parse import quote
resp = httpx.post(
f"{BASE_URL}/wb/get/category/trend",
headers={**headers, "Content-Type": "application/json"},
json={
"path": quote("Автотовары", safe=""),
"d1": "2020-01-01",
"d2": "2026-02-19"
}
)
trends = resp.json()
print(f"Месяцев данных: {len(trends)}")
for month in trends[-6:]: # Последние 6 месяцев
print(f" {month}")
Python: Полный аудит карточки (для Fotofactor)
Комплексный анализ карточки товара с использованием нескольких эндпоинтов:
import httpx
from urllib.parse import quote
def audit_card(sku: int, token: str) -> dict:
"""Полный аудит карточки товара: продажи + SEO + позиции + отзывы."""
base = "https://mpstats.io/api"
headers = {"X-Mpstats-TOKEN": token}
params = {"d1": "2026-01-20", "d2": "2026-02-19"}
# 1. Продажи
sales_resp = httpx.get(f"{base}/wb/get/item/{sku}/sales", headers=headers, params=params)
sales = sales_resp.json()
total_sales = sum(d.get("sales", 0) for d in sales)
avg_rating = sum(d.get("rating", 0) for d in sales) / max(len(sales), 1)
# 2. Ключевые слова
kw_resp = httpx.get(f"{base}/wb/get/item/{sku}/by_keywords", headers=headers, params=params)
kw_data = kw_resp.json()
words = kw_data.get("words", {})
top_keywords = sorted(words.items(), key=lambda x: x[1].get("wb_frequency", 0), reverse=True)[:10]
# 3. Позиции
pos_resp = httpx.get(f"{base}/wb/get/item/{sku}/by_category", headers=headers, params=params)
positions = pos_resp.json().get("categories", {})
# 4. Отзывы
rev_resp = httpx.get(f"{base}/wb/get/item/{sku}/reviews", headers=headers, params=params)
reviews = rev_resp.json().get("comments", [])
return {
"sku": sku,
"total_sales_30d": total_sales,
"avg_rating": round(avg_rating, 2),
"keywords_count": len(words),
"top_keywords": [(kw, info.get("wb_frequency", 0)) for kw, info in top_keywords],
"categories_tracked": len(positions),
"reviews_count": len(reviews),
"data_points": len(sales),
}
# Использование
result = audit_card(143207180, "YOUR_TOKEN")
print(f"SKU {result['sku']}:")
print(f" Продажи за 30 дней: {result['total_sales_30d']}")
print(f" Рейтинг: {result['avg_rating']}")
print(f" Ключевых слов: {result['keywords_count']}")
print(f" Отзывов: {result['reviews_count']}")
curl
Проверка квот
curl "https://mpstats.io/api/user/check/limits" \
-H "X-Mpstats-TOKEN: YOUR_TOKEN"
Товары по категории
curl -X POST "https://mpstats.io/api/wb/get/category" \
-H "X-Mpstats-TOKEN: YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"path": "%D0%90%D0%B2%D1%82%D0%BE%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D1%8B",
"d1": "2026-01-20",
"d2": "2026-02-19",
"startRow": 0,
"endRow": 10,
"sortModel": [{"colId": "revenue", "sort": "desc"}]
}'
Продажи SKU
curl "https://mpstats.io/api/wb/get/item/143207180/sales?d1=2026-01-20&d2=2026-02-19" \
-H "X-Mpstats-TOKEN: YOUR_TOKEN"
Ключевые слова SKU
curl "https://mpstats.io/api/wb/get/item/143207180/by_keywords?d1=2026-02-01&d2=2026-02-19" \
-H "X-Mpstats-TOKEN: YOUR_TOKEN"
Обработка ошибок
import httpx
try:
resp = httpx.post(url, headers=headers, json=payload, timeout=30)
resp.raise_for_status()
data = resp.json()
except httpx.HTTPStatusError as e:
if e.response.status_code == 401:
print("Неверный токен API")
elif e.response.status_code == 405:
print("Метод не поддерживается (попробуйте GET вместо POST)")
elif e.response.status_code == 429:
print("Превышен лимит запросов")
elif e.response.status_code == 500:
print("Ошибка сервера (возможно, нужен расширенный тариф)")
else:
print(f"HTTP ошибка: {e.response.status_code}")
except httpx.TimeoutException:
print("Таймаут запроса (увеличьте timeout)")
Что дальше
- MCP-сервер — работа с API из Claude без написания кода
- Стратегия для Fotofactor — практические сценарии
- ContentScore алгоритм — скоринг карточек