Перейти к основному содержимому

Примеры 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)")

Что дальше