Расширенная аналитика 1688 API
Четыре POST-метода работают в отдельном сервисе BHAPI. Создайте токен именно для аналитики 1688: токен обычного 1688 и его квота сюда не подходят. Каждый успешный вызов расходует одну единицу квоты этого сервиса. Цены и лимиты зависят от активного тарифа.
Методы и быстрый старт
| Задача | Метод | Период |
|---|---|---|
| Поиск товаров | POST /analytics/1688/api/v1/products/search | rolling_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 -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}'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"]Поиск и витрина: параметры
/analytics/1688/api/v1/products/search/analytics/1688/api/v1/products/billboardkeyword на упрощённом китайском языке. Переведите запрос до вызова API: BHAPI не переводит его автоматически.Укажите ровно один селектор: keyword (непустая строка до 50 символов), goods_url (публичный HTTPS URL до 4096 символов) или product_ids (1–20 уникальных положительных числовых строк, каждая до 64 символов). ID как JSON number не принимается. Не передавайте пользовательские URL с приватными адресами.
| Поле | Тип | Наличие | Описание |
|---|---|---|---|
keyword | string, 1–50 символов | один из трёх селекторов | Текст для поиска; для лучшей релевантности используйте упрощённый китайский. Автоматический перевод не выполняется. |
goods_url | string, HTTPS URL до 4096 символов | один из трёх селекторов | Публичная ссылка на товар; адреса приватных сетей недопустимы. |
product_ids | array[string], 1–20 | один из трёх селекторов | Уникальные положительные числовые ID товаров; каждый до 64 символов. |
page | integer ≥ 1 | да | Номер запрашиваемой страницы. |
page_size | integer, 10–100 | да | Размер страницы. |
match | fuzzy | exact | нет | Режим сопоставления только для keyword; в поиске по умолчанию fuzzy. |
period | rolling_7d | rolling_30d | только Search: да | Скользящий период для показателей поиска. |
period_type | week | month | только Billboard: да | Календарный тип периода витрины. |
date | string, YYYY-MM-DD | только Billboard: да | Начало периода: воскресенье недели или первое число месяца. |
sort | object | null | нет | Поля field и direction обязательны внутри объекта. |
filters | object | null | нет | Дополнительные фильтры из таблицы ниже. |
Каждый диапазон в filters — объект с min, max или обеими границами; при двух границах требуется min ≤ max. Для диапазона дат используйте from, to или обе даты. Для match значение по умолчанию fuzzy задаётся только при Search с keyword; Billboard не добавляет режим сам.
| Поле | Тип | Наличие | Описание |
|---|---|---|---|
sort.field | enum | при sort: да | orders, units_sold, estimated_sales, listed_at, price или dropship_price. |
sort.direction | asc | desc | при sort: да | Направление сортировки. |
filters.price | object | нет | Диапазон оптовой цены; неотрицательная сумма. |
filters.dropship_price | object | нет | Диапазон цены поштучной продажи; неотрицательная сумма. |
filters.orders | object | нет | Диапазон количества заказов; неотрицательные целые. |
filters.units_sold | object | нет | Диапазон проданных единиц; неотрицательные целые. |
filters.estimated_sales | object | нет | Диапазон оценочной суммы продаж. |
filters.min_order_quantity | object | нет | Диапазон минимального количества для заказа. |
filters.supplier_years | object | нет | Диапазон лет работы поставщика. |
filters.listed_at | object | нет | Даты публикации товара в формате YYYY-MM-DD. |
filters.company_type | store | factory | нет | Тип продавца. |
filters.offer_type | enum | нет | new, select, cross_border, customization или store_highlight. |
filters.seller_types | array[enum], ≥ 1 | нет | super_factory, power_seller или trustpass. |
filters.dispatch_hours | array[integer], ≥ 1 | нет | Допустимые значения: 24, 48, 72. |
filters.marketplace_support | array[enum], ≥ 1 | нет | taobao, douyin, pinduoduo, xiaohongshu или kuaishou. |
filters.dropship_rights | array[enum], ≥ 1 | нет | free_shipping или buy_now_pay_later. |
filters.shop_services | array[enum], ≥ 1 | нет | safe_buy или deep_verification. |
Для диапазонов передайте хотя бы одну границу. Денежные границы принимают JSON число или десятичную строку; строка сохраняет точность. Значения должны быть неотрицательными, а нижняя граница не больше верхней.
Дата Billboard выбирает календарный период, а не время обновления данных. Для примеров выбирайте последний завершённый период. Неизвестные поля отклоняются.
Пример календарной витрины
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". Примеры дат обновляются на странице автоматически.
Карточка товара
/analytics/1688/api/v1/products/detailoffer_id обязателен: положительная числовая строка до 64 символов. Необязательная currency — три ASCII-буквы, приводится к верхнему регистру. Неизвестные поля и числовой ID отклоняются.
| Поле | Тип | Наличие | Описание |
|---|---|---|---|
offer_id | string, 1–64 символа | да | Положительный числовой ID товара, переданный строкой. |
currency | string, 3 ASCII-буквы | нет | Код валюты передаётся сервису в верхнем регистре. BHAPI сам не пересчитывает цены; валюту каждой цены проверяйте в поле Money.currency ответа. |
{"offer_id":"745678901234","currency":"CNY"}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"}'{"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}}| Поле | Тип | Наличие | Описание |
|---|---|---|---|
offer_id | string | да | ID товара. |
title | string | null | да | Название товара в исходном виде. |
title_translated | string | null | да | Переведённое название, если доступно. |
product_url | string | null | да | Ссылка на товар. |
image_urls | array[string] | null | да | Ссылки на изображения товара. |
company | string | null | да | Название магазина или компании. |
status | string | null | да | Статус карточки без дополнительной нормализации. |
created_at | string | null | да | Дата или время создания, если получены. |
category_id | string | null | да | ID категории товара. |
top_category_id | string | null | да | ID категории верхнего уровня. |
second_category_id | string | null | да | ID категории второго уровня. |
third_category_id | string | null | да | ID категории третьего уровня. |
min_order_quantity | integer | null | да | Минимальное количество для заказа. |
attributes | array[object] | null | да | Характеристики товара. |
pricing | object | null | да | Ценовые ступени и единица товара. |
skus | array[object] | null | да | Варианты товара. |
description_html | string | null | да | HTML описания; содержимое недоверенное. |
description_truncated | boolean | да | true, если описание было сокращено. |
| Поле | Тип | Наличие | Описание |
|---|---|---|---|
attributes[].attribute_id | string | null | да | ID характеристики. |
attributes[].name | string | null | да | Название характеристики. |
attributes[].name_translated | string | null | да | Перевод названия. |
attributes[].value | string | null | да | Значение характеристики. |
attributes[].value_translated | string | null | да | Перевод значения. |
pricing.amount_on_sale | integer | null | да | Доступное количество, если указано. |
pricing.unit | string | null | да | Единица товара. |
pricing.unit_translated | string | null | да | Перевод единицы товара. |
pricing.price_ranges | array[object] | null | да | Ценовые ступени. |
pricing.price_ranges[].start_quantity | integer | null | да | Количество, с которого действует цена. |
pricing.price_ranges[].price | Money | null | да | Цена ступени без доставки и налогов. |
skus[].sku_id | string | null | да | ID варианта. |
skus[].cargo_number | string | null | да | Артикул варианта. |
skus[].price | Money | null | да | Цена варианта. |
skus[].dropship_price | Money | null | да | Цена поштучной продажи варианта. |
skus[].amount_on_sale | integer | null | да | Доступное количество варианта. |
skus[].attributes | array[object] | null | да | Характеристики варианта, того же формата, что attributes[]. |
Ценовые ступени не включают доставку и налоги; остаток не равен продажам. Фактическую валюту каждой цены проверяйте в Money.currency ответа. description_html считайте недоверенным HTML и экранируйте перед показом.
Поиск по изображению
/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_url | string, HTTP/HTTPS URL до 1000 символов | один из трёх селекторов | Публично доступное изображение; приватные адреса недопустимы. |
image_base64 | string, Base64 PNG/JPEG | один из трёх селекторов | Исходный Base64 без префикса data:, до 5 MiB после декодирования. |
image_id | string, временный идентификатор | один из трёх селекторов | Только значение data.image_id из предыдущего ответа для того же токена; передавайте без изменений. |
page | integer ≥ 1 | нет | Номер страницы; по умолчанию 1. |
page_size | integer, 1–50 | нет | Размер страницы; по умолчанию 20. |
price | object | нет | Диапазон цены в CNY: min, max или обе неотрицательные границы. |
sort.field | price | repurchase_rate | monthly_units_sold | при sort: да | Поле сортировки. |
sort.direction | asc | desc | при sort: да | Направление сортировки. |
keyword | string | нет | Дополнительное ключевое слово без пробелов и управляющих символов. |
collection_id | string, 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 -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}'{"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}}{
"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, если оно заполнено.
| Поле | Тип | Наличие | Описание |
|---|---|---|---|
items | array[object] | да | Товары на странице. |
pagination.page | integer ≥ 1 | да | Номер страницы. |
pagination.page_size | integer ≥ 1 | да | Размер страницы. |
pagination.total | null | да | Всегда null; не используйте как общее число товаров. |
image_id | string | null | да | Временный ID для следующей страницы, если доступен. |
total_pages | integer ≥ 0 | null | да | Число страниц, если известно. |
page_item_count | integer ≥ 0 | null | да | Число товаров на текущей странице, если известно. |
| Поле | Тип | Наличие | Описание |
|---|---|---|---|
offer_id | string | null | да | ID товара. |
title | string | null | да | Название товара. |
product_url | string | null | да | Ссылка на товар. |
image_url | string | null | да | Ссылка на изображение. |
price | Money | null | да | Оптовая цена. |
consign_price | Money | null | да | Цена поштучной продажи. |
quantity_begin | integer | null | да | Минимальное количество для заказа. |
product_code | string | null | да | Дополнительный код товара. |
seller_identities | string | null | да | Текстовые признаки продавца. |
offer_identities | string | null | да | Текстовые признаки товара. |
repeat_purchase_percent | string | null | да | Показатель повторных покупок в исходной записи. |
repurchase_rate | string | null | да | Показатель повторных покупок; шкала не нормализована. |
trade_medal_level | string | null | да | Уровень торговой отметки. |
trade_score | string | null | да | Оценка торговых показателей. |
composite_service_score | string | null | да | Сводная оценка обслуживания. |
after_sales_experience_score | string | null | да | Оценка послепродажного обслуживания. |
consulting_experience_score | string | null | да | Оценка консультаций. |
dispute_complaint_score | string | null | да | Оценка споров и жалоб. |
logistics_experience_score | string | null | да | Оценка логистики. |
offer_experience_score | string | null | да | Оценка товарного предложения. |
one_piece_dropshipping | boolean | null | да | Доступна ли поштучная продажа. |
selected_supply_source | boolean | null | да | Есть ли отметка выбранного источника поставки. |
patent_product | boolean | null | да | Есть ли отметка патента; не юридическое заключение. |
cross_border_select | boolean | null | да | Есть ли отметка трансграничной подборки. |
has_promotion | boolean | null | да | Есть ли промоакция. |
promotion_type | string | null | да | Вид промоакции. |
monthly_units_sold | integer | null | да | Заявленные продажи в штуках за месяц. |
estimated_monthly_sales | Money | null | да | Оценочная денежная сумма продаж за месяц. |
Строковые проценты и оценки не имеют подтверждённой общей шкалы; месячные показатели требуют осторожной интерпретации. Метка патента не является юридическим заключением.
Ответы, единицы и ограничения
Все перечисленные поля успешного ответа присутствуют в JSON. Запись | null означает, что значение может быть null, а не что ключ пропускается.
| Поле | Тип | Наличие | Описание |
|---|---|---|---|
status | string | да | Всегда ok. |
data | object | да | Результат выбранного метода; форма указана ниже. |
meta.request_id | string | да | Идентификатор запроса BHAPI. |
meta.retrieved_at | string, ISO 8601 | да | Время получения ответа BHAPI. |
meta.snapshot_date | string, YYYY-MM-DD | null | да | Дата среза данных, если достоверно известна. |
| Поле | Тип | Наличие | Описание |
|---|---|---|---|
data.items | array[object] | да | Список нормализованных товаров; пустой массив означает отсутствие результатов на странице. |
data.pagination.page | integer ≥ 1 | да | Номер возвращённой страницы. |
data.pagination.page_size | integer ≥ 1 | да | Размер возвращённой страницы. |
data.pagination.total | integer ≥ 0 | да | Сообщённое сервисом число в доступной выборке, не объём всего рынка. |
data.pagination.total_pages | integer ≥ 0 | null | да | Число страниц, если известно. |
| Поле | Тип | Наличие | Описание |
|---|---|---|---|
offer_id | string | да | ID товара. |
title | string | да | Название товара. |
product_url | string | null | да | Ссылка на товар. |
image_url | string | null | да | Ссылка на главное изображение. |
price | Money | null | да | Оптовая цена. |
dropship_price | Money | null | да | Цена поштучной продажи. |
min_order_quantity | integer | null | да | Минимальное количество для заказа. |
unit | string | null | да | Единица товара. |
available_date | string | null | да | Время появления карточки, если известно. |
delivery_time | string | null | да | Заявленное время отправки или доставки без гарантии единого формата. |
company | string | null | да | Название магазина или компании. |
shop_id | string | null | да | ID магазина. |
shop_url | string | null | да | Ссылка на магазин. |
analytics.period | rolling_7d | rolling_30d | week | month | да | Период показателей: скользящий для Search, календарный для Billboard. |
analytics.orders | integer | null | да | Число заказов за период, не число выкупов. |
analytics.units_sold | integer | null | да | Количество проданных единиц за период. |
analytics.estimated_sales | Money | null | да | Оценочная сумма продаж за период. |
| Поле | Тип | Наличие | Описание |
|---|---|---|---|
amount | string | да | Неотрицательная десятичная сумма в строке без экспоненциальной записи. |
currency | string | null | да | Код или обозначение валюты, если известны. |
estimated | boolean | да | true для оценочной суммы продаж; false для цен. |
{
"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.
Статусы некоторых ошибок в этом режиме отличаются; успешные ответы не меняются.
Общий справочник кодов, форматов и действий клиента →
| Код | Причина |
|---|---|
| 400 | query_token_deprecated: токен в параметре URL не принимается, используйте заголовок X-API-Token. |
| 401/403 | Токен отсутствует, чужой для сервиса, неактивен либо доступ по тарифу закрыт. |
| 413 | Тело запроса больше допустимого размера. |
| 422 | Некорректные поля или подтверждённый некорректный запрос. |
| 429 | Лимит токена, квоты или частоты запросов. |
| 502 | upstream_invalid_response: ответ не прошёл проверку. |
| 503 | upstream_unavailable или upstream_unreachable: временная недоступность. |
| 504 | upstream_timeout: истекло время ожидания. |
| 500 | internal_error: внутренняя ошибка BHAPI. |
Внешний вызов не повторяется автоматически. Повтор с вашей стороны является новым вызовом и может повлечь новый расход. Успешный проверенный ответ расходует одну единицу BHAPI; актуальные лимиты смотрите в тарифном меню и кабинете.