Расширенная аналитика 1688 API

Четыре POST-метода работают в отдельном сервисе BHAPI. Создайте токен именно для аналитики 1688: токен обычного 1688 и его квота сюда не подходят. Каждый успешный вызов расходует одну единицу квоты этого сервиса. Цены и лимиты зависят от активного тарифа.

Методы и быстрый старт

Эндпоинты аналитики 1688
ЗадачаМетодПериод
Поиск товаровPOST /analytics/1688/api/v1/products/searchrolling_7d или rolling_30d
ВитринаPOST /analytics/1688/api/v1/products/billboardКалендарная неделя или месяц
КарточкаPOST /analytics/1688/api/v1/products/detailНе выбирается
По изображениюPOST /analytics/1688/api/v1/products/search-by-imageНе выбирается

Передавайте токен в X-API-Token, JSON в Content-Type: application/json. Не помещайте токен в URL.

cURL · поиск
curl -X POST "https://bhapi.ru/analytics/1688/api/v1/products/search" \
  -H "X-API-Token: ВАШ_ТОКЕН_АНАЛИТИКИ" \
  -H "Content-Type: application/json" \
  -d '{"keyword":"保温杯","period":"rolling_30d","page":1,"page_size":10}'
Python · поиск
import requests

response = requests.post(
    "https://bhapi.ru/analytics/1688/api/v1/products/search",
    headers={"X-API-Token": "ВАШ_ТОКЕН_АНАЛИТИКИ"},
    json={"keyword": "保温杯", "period": "rolling_30d", "page": 1, "page_size": 10},
    timeout=120,
)
response.raise_for_status()
items = response.json()["data"]["items"]

Поиск и витрина: параметры

POST/analytics/1688/api/v1/products/search
POST/analytics/1688/api/v1/products/billboard
Язык поискового запроса. Для поиска и витрины передавайте keyword на упрощённом китайском языке. Переведите запрос до вызова API: BHAPI не переводит его автоматически.

Укажите ровно один селектор: keyword (непустая строка до 50 символов), goods_url (публичный HTTPS URL до 4096 символов) или product_ids (1–20 уникальных положительных числовых строк, каждая до 64 символов). ID как JSON number не принимается. Не передавайте пользовательские URL с приватными адресами.

Поля JSON-запроса поиска и витрины
ПолеТипНаличиеОписание
keywordstring, 1–50 символоводин из трёх селекторовТекст для поиска; для лучшей релевантности используйте упрощённый китайский. Автоматический перевод не выполняется.
goods_urlstring, HTTPS URL до 4096 символоводин из трёх селекторовПубличная ссылка на товар; адреса приватных сетей недопустимы.
product_idsarray[string], 1–20один из трёх селекторовУникальные положительные числовые ID товаров; каждый до 64 символов.
pageinteger ≥ 1даНомер запрашиваемой страницы.
page_sizeinteger, 10–100даРазмер страницы.
matchfuzzy | exactнетРежим сопоставления только для keyword; в поиске по умолчанию fuzzy.
periodrolling_7d | rolling_30dтолько Search: даСкользящий период для показателей поиска.
period_typeweek | monthтолько Billboard: даКалендарный тип периода витрины.
datestring, YYYY-MM-DDтолько Billboard: даНачало периода: воскресенье недели или первое число месяца.
sortobject | nullнетПоля field и direction обязательны внутри объекта.
filtersobject | nullнетДополнительные фильтры из таблицы ниже.

Каждый диапазон в filters — объект с min, max или обеими границами; при двух границах требуется min ≤ max. Для диапазона дат используйте from, to или обе даты. Для match значение по умолчанию fuzzy задаётся только при Search с keyword; Billboard не добавляет режим сам.

Сортировка и вложенные параметры фильтров
ПолеТипНаличиеОписание
sort.fieldenumпри sort: даorders, units_sold, estimated_sales, listed_at, price или dropship_price.
sort.directionasc | descпри sort: даНаправление сортировки.
filters.priceobjectнетДиапазон оптовой цены; неотрицательная сумма.
filters.dropship_priceobjectнетДиапазон цены поштучной продажи; неотрицательная сумма.
filters.ordersobjectнетДиапазон количества заказов; неотрицательные целые.
filters.units_soldobjectнетДиапазон проданных единиц; неотрицательные целые.
filters.estimated_salesobjectнетДиапазон оценочной суммы продаж.
filters.min_order_quantityobjectнетДиапазон минимального количества для заказа.
filters.supplier_yearsobjectнетДиапазон лет работы поставщика.
filters.listed_atobjectнетДаты публикации товара в формате YYYY-MM-DD.
filters.company_typestore | factoryнетТип продавца.
filters.offer_typeenumнетnew, select, cross_border, customization или store_highlight.
filters.seller_typesarray[enum], ≥ 1нетsuper_factory, power_seller или trustpass.
filters.dispatch_hoursarray[integer], ≥ 1нетДопустимые значения: 24, 48, 72.
filters.marketplace_supportarray[enum], ≥ 1нетtaobao, douyin, pinduoduo, xiaohongshu или kuaishou.
filters.dropship_rightsarray[enum], ≥ 1нетfree_shipping или buy_now_pay_later.
filters.shop_servicesarray[enum], ≥ 1нетsafe_buy или deep_verification.

Для диапазонов передайте хотя бы одну границу. Денежные границы принимают JSON число или десятичную строку; строка сохраняет точность. Значения должны быть неотрицательными, а нижняя граница не больше верхней.

Дата Billboard выбирает календарный период, а не время обновления данных. Для примеров выбирайте последний завершённый период. Неизвестные поля отклоняются.

Пример календарной витрины

cURL · календарная витрина
curl -X POST "https://bhapi.ru/analytics/1688/api/v1/products/billboard" \
  -H "X-API-Token: ВАШ_ТОКЕН_АНАЛИТИКИ" \
  -H "Content-Type: application/json" \
  -d '{"keyword":"保温杯","period_type":"week","date":"2026-10-18","page":1,"page_size":10}'

Для месячного среза используйте "period_type":"month","date":"2026-09-01". Примеры дат обновляются на странице автоматически.

Карточка товара

POST/analytics/1688/api/v1/products/detail

offer_id обязателен: положительная числовая строка до 64 символов. Необязательная currency — три ASCII-буквы, приводится к верхнему регистру. Неизвестные поля и числовой ID отклоняются.

Тело запроса карточки товара
ПолеТипНаличиеОписание
offer_idstring, 1–64 символадаПоложительный числовой ID товара, переданный строкой.
currencystring, 3 ASCII-буквынетКод валюты передаётся сервису в верхнем регистре. BHAPI сам не пересчитывает цены; валюту каждой цены проверяйте в поле Money.currency ответа.
JSON · тело запроса
{"offer_id":"745678901234","currency":"CNY"}
cURL · карточка товара
curl -X POST "https://bhapi.ru/analytics/1688/api/v1/products/detail" \
  -H "X-API-Token: ВАШ_ТОКЕН_АНАЛИТИКИ" \
  -H "Content-Type: application/json" \
  -d '{"offer_id":"745678901234","currency":"CNY"}'
JSON · синтетический пример
{"status":"ok","data":{"product":{"offer_id":"745678901234",
  "title":"Термокружка","title_translated":null,"product_url":null,
  "image_urls":[],"company":null,"status":null,"created_at":null,
  "category_id":null,"top_category_id":null,"second_category_id":null,
  "third_category_id":null,"min_order_quantity":2,"attributes":[],
  "pricing":null,"skus":[],"description_html":null,"description_truncated":false}},
  "meta":{"request_id":"пример-id","retrieved_at":"2026-10-01T10:00:00Z","snapshot_date":null}}
Поля data.product в ответе Detail
ПолеТипНаличиеОписание
offer_idstringдаID товара.
titlestring | nullдаНазвание товара в исходном виде.
title_translatedstring | nullдаПереведённое название, если доступно.
product_urlstring | nullдаСсылка на товар.
image_urlsarray[string] | nullдаСсылки на изображения товара.
companystring | nullдаНазвание магазина или компании.
statusstring | nullдаСтатус карточки без дополнительной нормализации.
created_atstring | nullдаДата или время создания, если получены.
category_idstring | nullдаID категории товара.
top_category_idstring | nullдаID категории верхнего уровня.
second_category_idstring | nullдаID категории второго уровня.
third_category_idstring | nullдаID категории третьего уровня.
min_order_quantityinteger | nullдаМинимальное количество для заказа.
attributesarray[object] | nullдаХарактеристики товара.
pricingobject | nullдаЦеновые ступени и единица товара.
skusarray[object] | nullдаВарианты товара.
description_htmlstring | nullдаHTML описания; содержимое недоверенное.
description_truncatedbooleanдаtrue, если описание было сокращено.
Вложенные поля Detail
ПолеТипНаличиеОписание
attributes[].attribute_idstring | nullдаID характеристики.
attributes[].namestring | nullдаНазвание характеристики.
attributes[].name_translatedstring | nullдаПеревод названия.
attributes[].valuestring | nullдаЗначение характеристики.
attributes[].value_translatedstring | nullдаПеревод значения.
pricing.amount_on_saleinteger | nullдаДоступное количество, если указано.
pricing.unitstring | nullдаЕдиница товара.
pricing.unit_translatedstring | nullдаПеревод единицы товара.
pricing.price_rangesarray[object] | nullдаЦеновые ступени.
pricing.price_ranges[].start_quantityinteger | nullдаКоличество, с которого действует цена.
pricing.price_ranges[].priceMoney | nullдаЦена ступени без доставки и налогов.
skus[].sku_idstring | nullдаID варианта.
skus[].cargo_numberstring | nullдаАртикул варианта.
skus[].priceMoney | nullдаЦена варианта.
skus[].dropship_priceMoney | nullдаЦена поштучной продажи варианта.
skus[].amount_on_saleinteger | nullдаДоступное количество варианта.
skus[].attributesarray[object] | nullдаХарактеристики варианта, того же формата, что attributes[].

Ценовые ступени не включают доставку и налоги; остаток не равен продажам. Фактическую валюту каждой цены проверяйте в Money.currency ответа. description_html считайте недоверенным HTML и экранируйте перед показом.

Поиск по изображению

POST/analytics/1688/api/v1/products/search-by-image

Укажите ровно одно: image_url (публичный HTTP/HTTPS URL до 1000 символов), image_base64 (raw Base64 PNG/JPEG до 5 MiB после декодирования, без data URI) или image_id из предыдущего ответа. Тело запроса ограничено 7 MiB.

Тело запроса поиска по изображению
ПолеТипНаличиеОписание
image_urlstring, HTTP/HTTPS URL до 1000 символоводин из трёх селекторовПублично доступное изображение; приватные адреса недопустимы.
image_base64string, Base64 PNG/JPEGодин из трёх селекторовИсходный Base64 без префикса data:, до 5 MiB после декодирования.
image_idstring, временный идентификатородин из трёх селекторовТолько значение data.image_id из предыдущего ответа для того же токена; передавайте без изменений.
pageinteger ≥ 1нетНомер страницы; по умолчанию 1.
page_sizeinteger, 1–50нетРазмер страницы; по умолчанию 20.
priceobjectнетДиапазон цены в CNY: min, max или обе неотрицательные границы.
sort.fieldprice | repurchase_rate | monthly_units_soldпри sort: даПоле сортировки.
sort.directionasc | descпри sort: даНаправление сортировки.
keywordstringнетДополнительное ключевое слово без пробелов и управляющих символов.
collection_idstring, 1–256 символовнетID коллекции без пробелов и управляющих символов.

page по умолчанию 1, page_size по умолчанию 20 (1–50). Дополнительно: price={"min":...,"max":...} в CNY, sort.field=price|repurchase_rate|monthly_units_sold с direction=asc|desc, keyword, collection_id.

cURL · поиск по изображению
curl -X POST "https://bhapi.ru/analytics/1688/api/v1/products/search-by-image" \
  -H "X-API-Token: ВАШ_ТОКЕН_АНАЛИТИКИ" \
  -H "Content-Type: application/json" \
  -d '{"image_url":"https://images.example.com/product.jpg","page":1,"page_size":20}'
JSON · пустая страница
{"status":"ok","data":{"items":[],"pagination":{"page":1,
  "page_size":20,"total":null},"image_id":null,"total_pages":null,
  "page_item_count":0},"meta":{"request_id":"пример-id",
  "retrieved_at":"2026-10-01T10:00:00Z","snapshot_date":null}}
JSON · сокращённый синтетический пример товара
{
  "offer_id": "745678901234",
  "title": "Термокружка",
  "product_url": "https://detail.1688.com/offer/745678901234.html",
  "image_url": "https://images.example.com/product.jpg",
  "price": {"amount": "20.00", "currency": "CNY", "estimated": false},
  "consign_price": null,
  "monthly_units_sold": 23,
  "estimated_monthly_sales": {
    "amount": "460.00", "currency": "CNY", "estimated": true
  },
  "one_piece_dropshipping": null,
  "repurchase_rate": null
}

В этом сокращённом фрагменте показаны отдельные поля одного data.items[]. Полный объект содержит также все остальные ключи из таблицы ниже, даже когда их значения равны null.

Для следующей страницы передайте data.image_id без изменений с тем же токеном. Это временный идентификатор BHAPI, действующий до одного часа. Если image_id равен null, можно снова отправить исходное изображение с нужным page; такой запрос может занять больше времени. pagination.total здесь всегда null; число результатов текущей страницы проверяйте по data.items и page_item_count, если оно заполнено.

Обёртка data поиска по изображению
ПолеТипНаличиеОписание
itemsarray[object]даТовары на странице.
pagination.pageinteger ≥ 1даНомер страницы.
pagination.page_sizeinteger ≥ 1даРазмер страницы.
pagination.totalnullдаВсегда null; не используйте как общее число товаров.
image_idstring | nullдаВременный ID для следующей страницы, если доступен.
total_pagesinteger ≥ 0 | nullдаЧисло страниц, если известно.
page_item_countinteger ≥ 0 | nullдаЧисло товаров на текущей странице, если известно.
Каждый data.items[] поиска по изображению
ПолеТипНаличиеОписание
offer_idstring | nullдаID товара.
titlestring | nullдаНазвание товара.
product_urlstring | nullдаСсылка на товар.
image_urlstring | nullдаСсылка на изображение.
priceMoney | nullдаОптовая цена.
consign_priceMoney | nullдаЦена поштучной продажи.
quantity_begininteger | nullдаМинимальное количество для заказа.
product_codestring | nullдаДополнительный код товара.
seller_identitiesstring | nullдаТекстовые признаки продавца.
offer_identitiesstring | nullдаТекстовые признаки товара.
repeat_purchase_percentstring | nullдаПоказатель повторных покупок в исходной записи.
repurchase_ratestring | nullдаПоказатель повторных покупок; шкала не нормализована.
trade_medal_levelstring | nullдаУровень торговой отметки.
trade_scorestring | nullдаОценка торговых показателей.
composite_service_scorestring | nullдаСводная оценка обслуживания.
after_sales_experience_scorestring | nullдаОценка послепродажного обслуживания.
consulting_experience_scorestring | nullдаОценка консультаций.
dispute_complaint_scorestring | nullдаОценка споров и жалоб.
logistics_experience_scorestring | nullдаОценка логистики.
offer_experience_scorestring | nullдаОценка товарного предложения.
one_piece_dropshippingboolean | nullдаДоступна ли поштучная продажа.
selected_supply_sourceboolean | nullдаЕсть ли отметка выбранного источника поставки.
patent_productboolean | nullдаЕсть ли отметка патента; не юридическое заключение.
cross_border_selectboolean | nullдаЕсть ли отметка трансграничной подборки.
has_promotionboolean | nullдаЕсть ли промоакция.
promotion_typestring | nullдаВид промоакции.
monthly_units_soldinteger | nullдаЗаявленные продажи в штуках за месяц.
estimated_monthly_salesMoney | nullдаОценочная денежная сумма продаж за месяц.

Строковые проценты и оценки не имеют подтверждённой общей шкалы; месячные показатели требуют осторожной интерпретации. Метка патента не является юридическим заключением.

Ответы, единицы и ограничения

Все перечисленные поля успешного ответа присутствуют в JSON. Запись | null означает, что значение может быть null, а не что ключ пропускается.

Обёртка каждого успешного ответа
ПолеТипНаличиеОписание
statusstringдаВсегда ok.
dataobjectдаРезультат выбранного метода; форма указана ниже.
meta.request_idstringдаИдентификатор запроса BHAPI.
meta.retrieved_atstring, ISO 8601даВремя получения ответа BHAPI.
meta.snapshot_datestring, YYYY-MM-DD | nullдаДата среза данных, если достоверно известна.
Обёртка Search и Billboard
ПолеТипНаличиеОписание
data.itemsarray[object]даСписок нормализованных товаров; пустой массив означает отсутствие результатов на странице.
data.pagination.pageinteger ≥ 1даНомер возвращённой страницы.
data.pagination.page_sizeinteger ≥ 1даРазмер возвращённой страницы.
data.pagination.totalinteger ≥ 0даСообщённое сервисом число в доступной выборке, не объём всего рынка.
data.pagination.total_pagesinteger ≥ 0 | nullдаЧисло страниц, если известно.
Поля каждого data.items[] в Search и Billboard
ПолеТипНаличиеОписание
offer_idstringдаID товара.
titlestringдаНазвание товара.
product_urlstring | nullдаСсылка на товар.
image_urlstring | nullдаСсылка на главное изображение.
priceMoney | nullдаОптовая цена.
dropship_priceMoney | nullдаЦена поштучной продажи.
min_order_quantityinteger | nullдаМинимальное количество для заказа.
unitstring | nullдаЕдиница товара.
available_datestring | nullдаВремя появления карточки, если известно.
delivery_timestring | nullдаЗаявленное время отправки или доставки без гарантии единого формата.
companystring | nullдаНазвание магазина или компании.
shop_idstring | nullдаID магазина.
shop_urlstring | nullдаСсылка на магазин.
analytics.periodrolling_7d | rolling_30d | week | monthдаПериод показателей: скользящий для Search, календарный для Billboard.
analytics.ordersinteger | nullдаЧисло заказов за период, не число выкупов.
analytics.units_soldinteger | nullдаКоличество проданных единиц за период.
analytics.estimated_salesMoney | nullдаОценочная сумма продаж за период.
Объект Money для денежных значений
ПолеТипНаличиеОписание
amountstringдаНеотрицательная десятичная сумма в строке без экспоненциальной записи.
currencystring | nullдаКод или обозначение валюты, если известны.
estimatedbooleanдаtrue для оценочной суммы продаж; false для цен.
JSON · синтетический результат поиска
{
  "status": "ok",
  "data": {
    "items": [{
      "offer_id": "745678901234", "title": "Термокружка",
      "product_url": null, "image_url": null,
      "price": {"amount": "20.00", "currency": "CNY", "estimated": false},
      "dropship_price": null, "min_order_quantity": 2, "unit": "шт",
      "available_date": null, "delivery_time": null,
      "company": null, "shop_id": null, "shop_url": null,
      "analytics": {"period": "rolling_30d", "orders": 18,
        "units_sold": 23, "estimated_sales": {
          "amount": "460.00", "currency": "CNY", "estimated": true}}
    }],
    "pagination": {"page": 1, "page_size": 10, "total": 1, "total_pages": null}
  },
  "meta": {"request_id": "пример-id", "retrieved_at": "2026-10-01T10:00:00Z", "snapshot_date": null}
}

Это синтетический пример, не измерение. orders — заказы, units_sold — единицы, а не выкупы. estimated_sales — оценочная денежная сумма. Money.amount — десятичная строка, currency может быть null; estimated указывает оценку. null означает отсутствие подтверждённого значения, не ноль. meta.snapshot_date=null означает неизвестную свежесть источника; retrieved_at — время получения BHAPI. pagination.total — сообщённое сервисом число в доступной выборке, не полный объём рынка.

Для Detail объект data содержит ровно один product; его поля приведены в разделе карточки товара. Для поиска по изображению структура data описана ниже.

Обычный 1688 возвращает поля карточек, цены, SKU и свойства; аналитика добавляет нормализованные показатели с явным периодом. В legacy поиске есть текстовая метка продаж, но она не заменяет периодные orders, units_sold и estimated_sales. Сопоставляйте товары в одном периоде; Search и Billboard используют разные типы периодов.

Ошибки, квоты и повторы

Таблицы и примеры этого раздела описывают ошибки legacy (формат по умолчанию). Чтобы получать единый контракт ошибок, передайте заголовок X-BHAPI-Error-Format: problem-v1. Статусы некоторых ошибок в этом режиме отличаются; успешные ответы не меняются. Общий справочник кодов, форматов и действий клиента →

Коды HTTP аналитики 1688
КодПричина
400query_token_deprecated: токен в параметре URL не принимается, используйте заголовок X-API-Token.
401/403Токен отсутствует, чужой для сервиса, неактивен либо доступ по тарифу закрыт.
413Тело запроса больше допустимого размера.
422Некорректные поля или подтверждённый некорректный запрос.
429Лимит токена, квоты или частоты запросов.
502upstream_invalid_response: ответ не прошёл проверку.
503upstream_unavailable или upstream_unreachable: временная недоступность.
504upstream_timeout: истекло время ожидания.
500internal_error: внутренняя ошибка BHAPI.

Внешний вызов не повторяется автоматически. Повтор с вашей стороны является новым вызовом и может повлечь новый расход. Успешный проверенный ответ расходует одну единицу BHAPI; актуальные лимиты смотрите в тарифном меню и кабинете.