WB: получить товар по URL
GET
/wb/api/v1/item/by-url
Парсит один товар Wildberries по URL и возвращает JSON c данными карточки.
Параметры запроса
| Параметр | Тип | Обязательный | Описание |
url |
string |
да |
URL детальной карточки WB: https://www.wildberries.ru/catalog/<nm_id>/detail.aspx. |
Заголовки
| Заголовок | Обязательный | Описание |
X-API-Token |
да |
Ваш API‑токен портала. Альтернативно можно использовать query‑параметр apiToken. |
Пример запроса
curl -X GET \
"https://bhapi.ru/wb/api/v1/item/by-url?url=https://www.wildberries.ru/catalog/12345/detail.aspx" \
-H "X-API-Token: ВАШ_API_TOKEN"
Успешный ответ 200 OK
{
"status": "ok",
"data": {
"code": 200,
"msg": "success",
"data": {
"item_id": 770596537,
"product_url": "https://www.wildberries.ru/catalog/770596537/detail.aspx?targetUrl=MI",
"title": "Смартфон M17 Pro Max 22+2048ГБ 2 nano-SIM+micro-SD",
"currency": "RUB",
"price_info": { },
"main_imgs": [
"https://basket-36.wbbasket.ru/vol7705/part770596/770596537/images/big/1.webp",
"... другие URL ..."
],
"additional_imgs": [ ],
"complectation": "смартфоны; защитный чехол; кабель USB Type-C; зарядное устройство; ...",
"category_name": "Смартфоны",
"category_path": "Смартфоны и гаджеты",
"product_props": {
"Модель": "17 Pro Max",
"Цвет": "черный",
"Объем встроенной памяти (Гб)": "2 ТБ",
"Суммарный объем оперативной памяти (Гб)": "22ГБ",
"...": "..."
},
"shop_info": {
"shop_name": "",
"shop_id": "250077302",
"seller_id": "250077302"
},
"review_info": { },
"desc": "Модель: M17 Pro Max\nЗадняя крышка: ...",
"source": "wildberries",
"availability": "in_stock"
}
},
"saved_path": null
}
WB: поиск по каталогу
GET
/wb/api/v1/search
Поиск по каталогу Wildberries с возможностью фильтрации и получения кратких данных по товарам.
Параметры запроса
| Параметр | Тип | Обязательный | Описание |
q |
string |
да |
Поисковый запрос (строка, допускает кириллицу). |
page |
integer |
нет |
Номер страницы, по умолчанию 1. |
max_links |
integer |
нет |
Ограничение количества ссылок на страницу (опционально). |
min_price, max_price |
integer |
нет |
Фильтрация по цене в рублях. |
sale_type |
boolean |
нет |
true — только товары из распродажи. |
brand_ids |
integer[] |
нет |
Список ID брендов. |
Структура ответа
| Поле | Описание |
query | Исходный поисковый запрос. |
page | Номер страницы. |
total | Общее число товаров по запросу. |
links | Массив URL детальных карточек товаров. |
count | Количество ссылок в links. |
products | Список объектов с краткой информацией по каждому товару. |
Пример ответа
{
"status": "ok",
"data": {
"query": "аэрогриль объём 8 литров",
"page": 1,
"total": 11628,
"links": [
"https://www.wildberries.ru/catalog/537724276/detail.aspx",
"https://www.wildberries.ru/catalog/523148127/detail.aspx",
"... другие ссылки ..."
],
"count": 10,
"products": [
{
"id": 537724276,
"link": "https://www.wildberries.ru/catalog/537724276/detail.aspx",
"price": 6381.0,
"rating": 4.9,
"feedbacks": 2780,
"description": "Аэрогриль электрический Air Fryer, Объём 8л,12 программ"
},
{
"id": 523148127,
"link": "https://www.wildberries.ru/catalog/523148127/detail.aspx",
"price": 7744.0,
"rating": 4.9,
"feedbacks": 394,
"description": "Аэрогриль электрический для дома 8 литров с Wi-fi и окошком"
}
// ... остальные товары ...
]
},
"saved_path": null
}
WB: каталог продавца по ссылке
POST
/wb/api/v1/seller/catalog
Возвращает каталог товаров конкретного продавца Wildberries по ссылке на магазин /seller/<id>.
Тело запроса
| Поле | Тип | Обязательный | Описание |
url |
string |
да |
URL продавца WB: https://www.wildberries.ru/seller/<supplier_id>. |
page |
integer |
нет |
Номер страницы каталога продавца, по умолчанию 1. |
Заголовки
| Заголовок | Обязательный | Описание |
X-API-Token |
да |
Ваш API‑токен портала. Альтернативно можно использовать query‑параметр apiToken. |
Пример запроса
curl -X POST "https://bhapi.ru/wb/api/v1/seller/catalog" \
-H "Content-Type: application/json" \
-H "X-API-Token: ВАШ_API_TOKEN" \
-d '{"url":"https://www.wildberries.ru/seller/4190071","page":1}'
Успешный ответ 200 OK
{
"status": "ok",
"data": {
"code": 200,
"msg": "success",
"data": {
"supplier_id": 4190071,
"page": 3,
"products_count": 100,
"per_page": 100,
"max_pages": 5,
"total": 490,
"wb": {
"products": [
{
"id": 277304775,
"name": "Мотор насос омывателя 2101-2107 2121"
}
]
}
}
}
}
Обёртка ответа парсера WB
Парсер WB, как правило, возвращает данные в двух уровнях:
внешний уровень портала BHAPI и внутренний уровень самого парсера.
| Поле | Тип | Описание |
status |
string |
Статус верхнего уровня портала: обычно "ok" или "error". |
data |
object |
Полезная нагрузка. Для одиночного товара содержит поля code, msg, data. |
saved_path |
string | null |
Если парсер сохраняет результат на диск, здесь может быть путь к файлу (чаще null). |
Во внутреннем объекте data для одиночного товара структура такая:
| Поле | Тип | Описание |
code | integer | Код результата парсера (200 — успех, другие — ошибки на стороне WB/парсера). |
msg | string | Текстовое описание результата ("success" или сообщение об ошибке). |
data | object | Карточка товара WB (см. раздел «Карточка товара» ниже). |
Карточка товара WB
Ниже приведена укрупнённая структура объекта data для одиночного товара.
| Поле | Тип | Описание |
item_id | integer | Идентификатор товара WB (nm_id). |
product_url | string | URL детальной карточки товара. |
title | string | Название товара. |
currency | string | Код валюты, как правило RUB. |
price_info | object | Ценовая информация (может быть пустым объектом, структура зависит от версии WB API). |
main_imgs | string[] | Массив URL основных изображений товара. |
additional_imgs | string[] | Дополнительные изображения (если есть). |
complectation | string | Комплектация из карточки товара. |
category_name | string | Название категории. |
category_path | string | Путь до категории (цепочка разделов). |
product_props | object | Словарь характеристик «название → значение» (объём памяти, цвет, ОС и т.п.). |
shop_info | object | Информация о продавце (см. ниже). |
review_info | object | Информация по отзывам (может быть пустым объектом). |
desc | string | Текстовое описание товара. |
source | string | Источник данных, обычно "wildberries". |
availability | string | Статус наличия: "in_stock", "not_available" и т.п. |
ShopInfo — информация о продавце
| Поле | Тип | Описание |
shop_name | string | Отображаемое название магазина (может быть пустой строкой). |
shop_id | string | Идентификатор магазина WB. |
seller_id | string | Идентификатор продавца (может совпадать с shop_id). |
Структура результата поиска
Объект data в ответе на /wb/api/v1/search детализированно описан ниже.
| Поле | Тип | Описание |
query | string | Исходный поисковый запрос. |
page | integer | Номер текущей страницы. |
total | integer | Общее число найденных товаров по всем страницам. |
links | string[] | Массив URL карточек товаров на текущей странице. |
count | integer | Количество элементов в массиве links. |
products | object[] | Массив кратких описаний товаров. |
Элемент products[i]
| Поле | Тип | Описание |
id | integer | nm_id товара WB. |
link | string | URL детальной карточки товара. |
price | float | null | Текущая цена в рублях (может быть null). |
rating | float | null | Рейтинг по отзывам. |
feedbacks | integer | null | Количество отзывов/оценок. |
description | string | null | Краткое текстовое описание товара. |
Коды ошибок
Типичные коды ошибок при работе с парсером WB через портал BHAPI:
| Код | HTTP | Описание | Что делать |
401 |
Unauthorized |
Токен не передан или невалиден. |
Проверьте заголовок X-API-Token или параметр apiToken, при необходимости создайте новый токен. |
403 |
Forbidden |
Нет активной подписки на парсер WB или токен деактивирован. |
Проверьте тарифы и статус токена в личном кабинете. |
404 |
Not Found |
Товар не найден (удалён, скрыт или неверный URL). |
Убедитесь, что URL ведёт на существующую карточку WB и содержит корректный nm_id. |
422 |
Unprocessable Entity |
Ошибка валидации параметров запроса. |
Проверьте обязательные параметры (url или q), числовые фильтры и формат значений. |
429 |
Too Many Requests |
Превышен лимит запросов по тарифу или ограничение скорости. |
Уменьшите частоту запросов, используйте кэширование и проверьте лимиты в кабинете. |
500 |
Internal Server Error |
Внутренняя ошибка сервиса. |
Повторите запрос позже, при постоянной проблеме свяжитесь с поддержкой. |
Лимиты и квоты
Парсер WB использует общую систему лимитов портала BHAPI. У каждого токена есть
дневной и общий лимит, а также защита от слишком частых запросов.
| Тип лимита | Описание | Сброс / поведение |
| Дневной лимит |
Максимальное количество запросов к парсеру WB в сутки. |
Сбрасывается ежедневно по UTC. После исчерпания возвращается ошибка 429. |
| Общий лимит |
Суммарное количество запросов за всё время жизни токена. |
Не сбрасывается. При достижении лимита необходимо создать новый токен или изменить тариф. |
| Rate limit |
Защита от слишком частых запросов подряд (ограничение скорости). |
Рекомендуется делать паузу 1–2 секунды между запросами, особенно при массовом парсинге. |
Совет. Используйте поиск и массовый сбор ссылок батчами, а затем обрабатывайте их с задержками,
чтобы не упираться в ограничения WB и квоты портала.
Примеры: Python
Получить один товар по URL
import requests
API_URL = "https://bhapi.ru/wb/api/v1/item/by-url"
TOKEN = "ВАШ_API_TOKEN"
params = {
"url": "https://www.wildberries.ru/catalog/770596537/detail.aspx",
}
response = requests.get(API_URL, params=params, headers={"X-API-Token": TOKEN}, timeout=30)
payload = response.json()
if payload["status"] == "ok" and payload["data"]["code"] == 200:
item = payload["data"]["data"]
print("ID товара:", item["item_id"])
print("Название:", item["title"])
print("Категория:", item["category_name"])
print("Картинок:", len(item["main_imgs"]))
else:
print("Ошибка:", payload)
Поиск по каталогу и вывод топа
import requests
SEARCH_URL = "https://bhapi.ru/wb/api/v1/search"
TOKEN = "ВАШ_API_TOKEN"
params = {
"q": "аэрогриль объем 8 литров",
"page": 1,
"max_links": 10,
}
response = requests.get(SEARCH_URL, params=params, headers={"X-API-Token": TOKEN}, timeout=30)
payload = response.json()
data = payload["data"]
print(f"Всего найдено товаров: {data['total']}")
print(f"Показано на странице: {data['count']}")
for product in data["products"]:
print(
f"{product['id']}: {product['price']} ₽, "
f"рейтинг {product['rating']}, отзывов {product['feedbacks']}"
)
Примеры: cURL
Получить товар по URL
curl -X GET \
"https://bhapi.ru/wb/api/v1/item/by-url?url=https://www.wildberries.ru/catalog/770596537/detail.aspx" \
-H "X-API-Token: ВАШ_API_TOKEN"
Поиск по каталогу
# Базовый поиск
curl "https://bhapi.ru/wb/api/v1/search?q=кроссовки&apiToken=ВАШ_API_TOKEN"
# Страница 2, ограничение по количеству ссылок
curl "https://bhapi.ru/wb/api/v1/search?q=зимние%20ботинки&page=2&max_links=50&apiToken=ВАШ_API_TOKEN"
Примеры: JavaScript
Fetch API (браузер / Node.js 18+)
const TOKEN = "ВАШ_API_TOKEN";
const BASE_URL = "https://bhapi.ru";
async function getWbItem(productUrl) {
const params = new URLSearchParams({ url: productUrl });
const response = await fetch(`${BASE_URL}/wb/api/v1/item/by-url?${params}`, {
method: "GET",
headers: { "X-API-Token": TOKEN },
});
const payload = await response.json();
if (payload.status === "ok" && payload.data.code === 200) {
return payload.data.data;
}
console.error("Ошибка WB:", payload);
return null;
}
getWbItem("https://www.wildberries.ru/catalog/770596537/detail.aspx")
.then((item) => {
if (!item) return;
console.log("Название:", item.title);
console.log("Категория:", item.category_name);
console.log("Первая картинка:", item.main_imgs[0]);
});
Примеры: PHP
Получить товар по URL (PHP + cURL)
<?php
$apiUrl = "https://bhapi.ru/wb/api/v1/item/by-url";
$token = "ВАШ_API_TOKEN";
$productUrl = "https://www.wildberries.ru/catalog/770596537/detail.aspx";
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $apiUrl . "?" . http_build_query(["url" => $productUrl]),
CURLOPT_HTTPHEADER => ["X-API-Token: " . $token],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
]);
$response = curl_exec($ch);
curl_close($ch);
$payload = json_decode($response, true);
if ($payload["status"] === "ok" && $payload["data"]["code"] === 200) {
$item = $payload["data"]["data"];
echo "Товар: " . $item["title"] . PHP_EOL;
echo "Категория: " . $item["category_name"] . PHP_EOL;
} else {
var_dump($payload);
}
Пакетная обработка (пример скрипта)
Ниже пример простого Python‑скрипта, который сначала выполняет поиск по каталогу,
а затем последовательно запрашивает детали по каждому найденному товару с паузой
между запросами.
import time
import requests
BASE_URL = "https://bhapi.ru"
TOKEN = "ВАШ_API_TOKEN"
def search(query: str, page: int = 1, limit: int = 10):
resp = requests.get(
f"{BASE_URL}/wb/api/v1/search",
params={"q": query, "page": page, "max_links": limit, "apiToken": TOKEN},
timeout=30,
)
return resp.json()["data"]
def get_item(url: str):
resp = requests.get(
f"{BASE_URL}/wb/api/v1/item/by-url",
params={"url": url},
headers={"X-API-Token": TOKEN},
timeout=30,
)
payload = resp.json()
if payload["status"] == "ok" and payload["data"]["code"] == 200:
return payload["data"]["data"]
return None
data = search("аэрогриль объем 8 литров", page=1, limit=5)
items = []
for link in data["links"]:
print("Парсим:", link)
item = get_item(link)
if item:
items.append(item)
print(" ✓", item["title"][:60])
else:
print(" ✗ не удалось получить данные")
time.sleep(1.5) # пауза, чтобы не превышать rate limit
print(f"Всего подробно получено товаров: {len(items)}")