Product API response models
With response_format: "standard" (default), product endpoints return the types below. Canonical TypeScript: packages/shared/src/products.ts.
Endpoints: detail · search · image search · parse
Monetary units {#monetary-units}
| Scope | monetary_unit | amount meaning |
|---|---|---|
Catalog (detail, search, parse, …) | CNY_major (yuan) — documented convention; field not yet required on every response | List/display prices in yuan |
POST /v1/products/freight/estimate | CNY_minor on response envelope | Domestic freight in fen, same as order preview |
Response envelope {#envelope}
| Endpoint | Shape |
|---|---|
detail, parse | { product: StandardProductDetail, request_id } |
search, search-by-image | StandardProductList & { request_id } |
upload-image | { channel, image_id, request_id } |
StandardProductDetail {#standard-product-detail}
Full product snapshot for product pages and checkout. Map to orders: search/detail id → lines[].id (offer_id / Taobao mi_id still accepted); variants[].sku_id → spec_id (Procurement orders).
Identity & channel
| Field | Type | Description |
|---|---|---|
id | string | Taobao = mi_id (pass to order lines[].id; rotates periodically — do not cache long-term). 1688 = offerId. Weidian currently uses prod_weidian_{source_product_id} |
channel | string | 1688, taobao, or weidian |
source_product_id | string | 1688 = offerId; Taobao = original item_id |
source_url | string | Canonical product page URL |
Localized text (title, description)
| Field | Type | Description |
|---|---|---|
original | string | Marketplace text (typically Chinese) |
translated | string | null | Translation for requested language |
language | string | Locale of translated |
description | object | null | Long-form detail (often HTML) |
Pricing (price, price_tiers[])
All amounts CNY yuan (not fen). Prefer promotion_amount when set, else display_amount.
| Field | Type | Description |
|---|---|---|
price.original_amount | number | 1-piece list price (1688 retailPrice when set) |
price.display_amount | number | Buyer-facing 1-piece price (CNY) |
price.promotion_amount | number | null | Promotional unit price when applicable |
price.original_currency / display_currency | string | Always CNY |
variants[].price.wholesale_amount | number | null | 1688 SKU wholesale (≥2 pcs) when retailPrice exists |
price_tiers[] | array | 1688 wholesale breaks (new offers start at ≥2); empty on Taobao |
min_order_quantity | number | null | 1688 MOQ from upstream; Taobao defaults to 1 (retail) |
distribution_min_quantity | number | null | 1688 dropship minimum |
Media (images[], videos)
| Field | Type | Description |
|---|---|---|
images[].url | string | Image CDN URL |
images[].type | enum | main, gallery, or variant |
videos.main / videos.detail | string | null | 1688 videos; Taobao null |
Attributes vs variants
Only variants[] drives SKU selection and order lines.
| Field | Role |
|---|---|
attributes[] | CPV specs — display only, not for SKU resolution |
variants[] | Purchasable SKU matrix with price, stock, specs |
Variant object (variants[])
| Field | Type | Description |
|---|---|---|
sku_id | string | Pass as spec_id on order create |
upstream_sku_id | string | null | 1688 numeric skuId |
attributes[] | array | Spec dimensions (color, size, …) |
attributes[].name / value | string | Display labels (localized when language is set) |
attributes[].original_name / original_value | string | Stable Chinese keys for grouping / matching |
attributes[].prop_id | string | null | Upstream property id as string (Taobao prop_id; 1688 attributeId). Prefer this over name text when present |
attributes[].value_id | string | null | Upstream value id as string (Taobao value_id). 1688 has no value id → null |
attributes[].image | string | null | Spec swatch / option image |
price | object | SKU-level price in yuan |
stock | number | Available qty; 0 = out of stock |
image | string | null | SKU primary image |
shipping | object | null | 1688 SKU package dimensions (table below); Taobao null |
min_order_quantity | number | null | 1688 MOQ on each SKU; Taobao defaults to 1 |
distribution | object | null | 1688 dropship pricing |
SKU package dimensions (variants[].shipping)
Mapped from 1688 upstream productShippingInfo.skuShippingDetails (SkuShippingDetail). Taobao has no equivalent — always null. Empty or 0 size/weight values normalize to null; if a SKU has no dimension data at all, shipping itself is null.
| Field | Type | Description |
|---|---|---|
width_cm | number | null | Width, cm (merchant-declared) |
length_cm | number | null | Length, cm |
height_cm | number | null | Height, cm |
weight_kg | number | null | Weight, kg |
official_width_cm | number | null | Official measured width, cm |
official_length_cm | number | null | Official measured length, cm |
official_height_cm | number | null | Official measured height, cm |
official_weight_kg | number | null | Official measured weight, kg |
ai_weight_kg | number | null | AI-predicted weight, kg |
ai_weight_accuracy | string | null | AI weight accuracy for the product’s leaf category (e.g. 80%) |
source | string | null | Dimension source (e.g. 商家自填) |
For freight estimates, prefer official_*, then merchant-declared size/weight, then ai_weight_kg (with ai_weight_accuracy as a confidence hint).
Seller, shipping & metadata
| Field | Type | Description |
|---|---|---|
seller.id / seller.name | string | Shop id and display name |
seller.shop_url | string | null | Storefront link |
shipping.shipping_from | string | null | Domestic dispatch region |
shipping.domestic_shipping_fee | object | null | Estimated domestic fee in yuan |
metadata.raw_category | string | null | Upstream category |
metadata.brand | string | null | Declared brand |
metadata.updated_at | string | ISO 8601 last sync |
trade_score | string | null | 1688 quality score |
Example (truncated)
{
"product": {
"id": "554456348334",
"channel": "1688",
"source_product_id": "554456348334",
"title": {
"original": "...",
"translated": "...",
"language": "en"
},
"price": {
"display_amount": 29.9,
"promotion_amount": 24.9
},
"variants": [
{
"sku_id": "b266e0...",
"upstream_sku_id": "12123313",
"stock": 100,
"shipping": {
"width_cm": 10,
"length_cm": 10,
"height_cm": 10,
"weight_kg": 1.2,
"official_width_cm": 5,
"official_length_cm": 12,
"official_height_cm": 14,
"official_weight_kg": 0.001,
"ai_weight_kg": 0.001,
"ai_weight_accuracy": "80%",
"source": "商家自填"
}
}
]
},
"request_id": "req_..."
}Channel field availability
| Field | 1688 | Taobao | Weidian |
|---|---|---|---|
videos, price_tiers, trade_score | ✓ | — | Varies |
variants[].shipping, distribution | ✓ | — | — |
variants[].attributes[].prop_id | ✓ (attributeId) | ✓ (prop_id) | — |
variants[].attributes[].value_id | — (null) | ✓ (value_id) | — |
Order lines[].id | id / offerId | id (mi_id) | Platform id |
StandardProductList {#standard-product-list}
From search and image search. Each items[] entry is a summary — call detail for SKU matrix.
| Field | Type | Description |
|---|---|---|
channel | string | Marketplace queried |
keyword | string | Echo of keyword (empty for pure image search) |
page / page_size | number | Pagination applied |
total | number | Upstream total (may be approximate) |
items[] | array | StandardProductListItem objects |
pic_region_info | object | Image search: detected crop region |
StandardProductListItem
| Field | Type | Description |
|---|---|---|
id, channel, source_product_id, source_url | string | Use source_product_id to fetch detail |
title | LocalizedTitle | Listing title |
price | ProductPrice | Summary price in CNY yuan |
image | string | Thumbnail URL |
seller.name | string | Shop name |
Upload-image response {#upload-image-response}
| Field | Type | Description |
|---|---|---|
channel | string | Marketplace that stored the image |
image_id | string | Reuse in image search |
Variant selection {#variant-selection}
- Load detail → read
product.variants. - Group by
attributes[].original_namefor dimension pickers (or byprop_idwhen present). - Filter variants on each user choice; disable out-of-stock options.
- Pass matching
sku_idandsource_product_idto order preview.
Matching keys: prefer prop_id + value_id (Taobao) when both are set — they are stable CPV identities and avoid cross-SKU name collisions (e.g. many options sharing Color Classification). Fall back to original_name + original_value for UI grouping. Use name / value for display only. Do not infer semantic types from labels.
{
"prop_id": "1627207",
"value_id": "43553464153",
"name": "Color Classification",
"value": "[Special for Bicycle Maintenance] Professional 46-Piece Set",
"original_name": "颜色分类",
"original_value": "【自行车维修专用】专业46件套",
"image": "https://img.alicdn.com/..."
}On 1688 the same shape is used with prop_id from attributeId and value_id: null (upstream SkuAttribute has no value id).
Get Support
Need integration help? Contact Developer Support at support@hiobuy.com · Response within 1–2 business days