供 AI Agent、ERP、爬虫通过 API Key 批量管理商品、SKU 库存与图片。请先读层级约定,避免 400。
根层级与 product 并列: product + main_images + skus + source
❌ 禁止把 main_images / skus / source 放进 product 内
❌ 禁止 "url | 货号" 拼接 — 货号用 product.art_no,来源用根层级 source
{
"product": {"name":"...", "category":"women_shoes", "price":89, "art_no":"厂家款号"},
"main_images": ["https://cf.h-sh.com/kk_HSH/..."],
"source": "https://来源页可选",
"skus": [{"color":"黑色","size":"38","stock":50}]
}
PATCH /open/products/{id} 为扁平 JSON(无 product 包装),可含 art_no、source、is_active 等。
| 字段 | 来源 | 说明 |
|---|---|---|
id | 平台 | API 唯一标识,路径 /open/products/{id} |
art_no | 商户/API | 厂家款号,≤19 字,选填 |
平台内部另有前台编码(如 W0、K10),开放 API 不返回,对接请以 id 为准。
所有请求需在 HTTP Header 中携带 API Key:
X-API-Key: kk_your_api_key
✅ 已完成实名认证的商户 → 商户后台 → API密钥 → 生成Key(明文仅显示一次)
🔒 商品读写均限定为 本 Key 所属商户;浏览全平台公开商品请用 GET /api/public/products(无需 Key)
| 方法 | 端点 | 说明 |
|---|---|---|
| POST | /open/upload-image | 上传图片:bulk 不传 product_id;单张追加可传 product_id(P2 UUID 路径) |
| POST | /open/upload-video | 上传主图视频 mp4/mov/webm/m4v(product_id 可选) |
| POST | /open/products | 创建商品(含SKU+主图) |
| GET | /open/products | 查询本商户商品列表(分页;可选 category is_active) |
| GET | /open/products/:id | 查询商品详情含所有SKU |
| GET | /open/categories | 平台类目树(大类+子类 slug) |
| GET | /open/merchant-categories | 查询我的自定义分类(slug 列表) |
| POST | /open/merchant-categories | 创建自定义分类(批跑推荐) |
| PATCH | /open/merchant-categories/:id | 更新自定义分类 name/slug/sort_order |
| DELETE | /open/merchant-categories/:id | 删除自定义分类(软删) |
| PATCH | /open/products/:id | 更新商品信息/上下架 |
| PATCH | /open/products/:id/skus | 批量更新SKU库存/价格/白底图 |
| POST | /open/keys | 生成新API Key |
| GET | /open/keys | 列出我的API Key |
| DELETE | /open/keys/:id | 吊销API Key |
curl -X POST https://kk.h-sh.com/api/open/upload-image \
-H "X-API-Key: $KK_API_KEY" \
-F "file=@product.jpg"
# 单张追加(非 bulk):?product_id=123,写入 {merchant_id}/products/{product_id}/{uuid}.jpg
# bulk 禁止 product_id,须 temp upload → 立刻 PATCH
product / main_images / source / skus 在根层级并列
curl -X POST https://kk.h-sh.com/api/open/products \
-H "X-API-Key: $KK_API_KEY" \
-H "Content-Type: application/json" \
-d '{"product":{"name":"夏季凉鞋","category":"women_shoes","price":89.0,"art_no":"X001","tags":["夏季","新款"]},"main_images":["https://cf.h-sh.com/kk_HSH/..."],"source":"https://example.com/item","skus":[{"color":"黑色","size":"38","stock":50,"white_image_url":"https://cf.h-sh.com/kk_HSH/..."}]}'
curl -X POST https://kk.h-sh.com/api/open/upload-video \
-H "X-API-Key: $KK_API_KEY" \
-F "file=@main.mp4"
# 将返回 url 写入创建 JSON 根层级 main_video_url(勿放入 main_images)
curl -X PATCH https://kk.h-sh.com/api/open/products/{id}/skus \
-H "X-API-Key: $KK_API_KEY" \
-H "Content-Type: application/json" \
-d '[{"color":"黑色","size":"38","stock":20,"white_image_url":"https://cf.h-sh.com/kk_HSH/white.jpg"}]'
curl -X PATCH https://kk.h-sh.com/api/open/products/{id} \
-H "X-API-Key: $KK_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"新名称","price":99,"art_no":"新货号","source":"https://...","is_active":false}'
| 字段 | 位置 | 必填 | 类型 | 说明 |
|---|---|---|---|---|
name | product | 必填 | string | 商品名,1~200字 |
category | product | 必填 | string | 平台类目 slug;先 GET /open/categories,有 subs 时传子类 slug |
price | product | 必填 | float | 价格,必须 > 0 |
art_no | product | 选填 | string | 厂家款号,≤19字(非 code) |
merchant_category_slug | product | 选填 | string | 商户自定义分类 slug,须先创建 |
description | product | 选填 | string | 商品描述,≤100字 |
material | product | 选填 | string | 材质 |
brand | product | 选填 | string | 品牌 |
origin_place | product | 选填 | string | 产地 |
unit | product | 选填 | string | 单位,默认「双」 |
min_order_qty | product | 选填 | int | 起订量,默认 1 |
tags | product | 选填 | string[] | 标签,每项 ≤4 汉字 |
detail_images | 根 | 选填 | string[] | 详情图 URL;也可放 product 内 |
detail_content | 根 | 选填 | string | 块级 HTML ≤5000 字(如 <p>);纯文本自动包 <p> |
main_images | 根 | 必填 | string[] | 主图 URL,≥1,须 KK CDN |
main_video_url | 根 | 选填 | string | 主图视频 URL;先 upload-video,勿放入 main_images |
source | 根 | 选填 | string | 来源页 URL;纯 URL,勿与货号拼接 |
skus | 根 | 选填 | SkuItem[] | SKU 列表;库存只写此处 |
| 字段 | 必填 | 类型 | 说明 |
|---|---|---|---|
color | 必填 | string | 颜色 |
size | 必填 | string | 尺码 |
stock | 选填 | int | 库存,默认0 |
price | 选填 | float | SKU价格 |
white_image_url | 选填 | string | 白底图 URL;创建时可传,响应含 canonical 后 URL |
✅ "夏季" — 2个汉字
✅ "新款上市" — 4个汉字
❌ "2024夏季新款" — 超过4个汉字,返回422
两套分类,互不影响:
平台类目 category | 自定义分类 merchant_category_slug | |
|---|---|---|
| 位置 | product.category | product.merchant_category_slug(创建)/ 根层级(PATCH) |
| 必填 | 必填 | 选填 |
| 取值 | 平台类目 slug(大类或子类,见 /open/categories) | 商户 slug;POST /open/merchant-categories 或后台创建 |
| 作用 | 编码前缀 W/K/H/B、全站筛选 | 商户主页 Tab(?cat=slug) |
❌ 勿把自定义分类名填入 category
✅ 先 GET /open/categories:大类有 subs 时须传子类 slug,不可传大类
✅ 自定义分类:POST /open/merchant-categories 创建,或后台「商品分类」页;上传前 GET 核对 slug
GET /open/categories
{
"data": [
{"slug":"women_shoes","name":"女鞋","requires_subcategory":true,
"subs":[{"slug":"sandals","name":"凉鞋"}, {"slug":"boots","name":"靴子"}]},
{"slug":"hats","name":"帽子","requires_subcategory":false,"subs":[]}
]
}
# 女鞋有子类 → product.category 传 "sandals",不能传 "women_shoes"
# 帽子无子类 → product.category 传 "hats"
| 大类 slug | 名称 | 编码前缀 |
|---|---|---|
women_shoes | 女鞋 | W |
kids_shoes | 童鞋 | K |
hats | 帽 | H |
bags | 包 | B |
子类 slug 以 /open/categories 返回为准;编码前缀按所属大类 W/K/H/B 生成。
2026-06-12 起校验归属,防止并发撞图:
temp/{merchant_id}/…(upload-image 返回值){店铺ID}/products/{商品ID}/{uuid}.jpg;存量兼容 K2z0_1.jpg)400{店铺ID}/products/{商品ID}/{uuid}.jpg;bulk 禁止 product_id,必须 temp+POST/PATCH| HTTP | 含义 |
|---|---|
401 | API Key无效或已吊销 |
403 | 商户未通过实名认证 |
400 | 参数错误、图片/视频 URL 归属不符 |
422 | 校验失败(标签过长等) |
404 | 商品不存在 |
POST 创建成功返回 product + skus + status。
product 含 id、art_no、main_video_url、source 等skus[] 含 id,color,size,stock,price,white_image_url(与 GET 详情一致)main_video_url:temp 视频迁入 P2 正式路径 {merchant_id}/products/{product_id}/main_video.{ext}id 标识商品;平台内部前台编码不在 API 中返回skus[].stock;商品 stock 为 SKU 之和,只读skus[].white_image_url:创建时可传;未传可用 PATCH skus 补图main_video_url,禁止放入 main_imagessource 响应字段名;入库为 source_url;误传 url | 货号 会截断