开发文档
六个 1688 操作的参考说明
每个 1688 操作的技术参考:操作 id、本站端点、可接受的输入及其约束,以及各操作返回的字段。
正在核对当前可用状态与已批准价格…
端点与请求格式
每个操作在本站都有自己的端点,以 POST 调用:`post-1688-categories` 为 POST /api/v1/alibaba-1688/post-1688-categories,`post-1688-category-offers` 为 POST /api/v1/alibaba-1688/post-1688-category-offers,`post-1688-product-detail` 为 POST /api/v1/alibaba-1688/post-1688-product-detail,`post-1688-product-reviews` 为 POST /api/v1/alibaba-1688/post-1688-product-reviews,`post-1688-search` 为 POST /api/v1/alibaba-1688/post-1688-search,`post-1688-supplier-search` 为 POST /api/v1/alibaba-1688/post-1688-supplier-search。输入都放在 `body` 中。只接受契约中的字段名:`q`、`offerId`、`categoryId`、`pageNo`、`lang` 等替代键名会作为未声明的请求体字段被拒绝。
post-1688-categoriespost-1688-category-offerspost-1688-product-detailpost-1688-product-reviewspost-1688-searchpost-1688-supplier-searchbody
类目树
`post-1688-categories` 没有必填输入。`body.language` 取 9 个值之一:`zh`、`en`、`ru`、`es`、`pt`、`fr`、`de`、`ja` 或 `ko`,默认 `en`。`body.depth` 为 1 到 3 的整数,默认 2;深度 1 返回 54 个一级类目,完整 3 层约 2.4 MB。返回 `items`,含 `id`、`name`、`name_zh`、`level`、`is_leaf` 以及 `children` 或 `child_count`,另有 `count`、`language` 和 `depth`。
post-1688-categoriesbody.languagebody.depth
类目商品
`post-1688-category-offers` 的 `body.category_id` 为必填字符串,例如 `1031910`,可从类目树或搜索结果行中取得。`body.page` 为 1 到 200 的整数,默认 1;各页固定含 30 个商品;与关键词搜索不同,该操作确实会逐页翻过类目中的商品。返回 `items`,含 `id`、`title`、`url`、`image`、`price`、`price_display`、`currency`、`moq`、`listed_on`、`fulfilment`、`certifications` 和 `sales`,另有 `count`、`category_id`、`page` 和 `has_next`。
post-1688-category-offersbody.category_idbody.page
商品详情与评价
`post-1688-product-detail` 和 `post-1688-product-reviews` 的 `body.offer_id` 为必填字符串,可以是商品 id 的数字(如 `864971848115`),也可以是完整的商品链接。详情返回以人民币计的 `price`、`price_type`、`price_tiers`、`moq`、`stock`、`mix`、`sold_count`、`category`、`attributes`、`seller` 和 `variants`,其中 `skus` 带有 `price`、`stock` 和 `weight_kg`;供应商未公布重量时 `weight_kg` 为 null。评价返回一页单条评价:`rating`(满分 5)、`rating_scale`、`good_percent`、`review_count`(1688 显示 100+ 时为下限值)以及 `reviews`,含 `content`、`buyer`、`quantity`、`spec`、`images`、`date` 和 `plus_user`。
post-1688-product-detailpost-1688-product-reviewsbody.offer_id
关键词与工厂搜索
`post-1688-search` 和 `post-1688-supplier-search` 的 `body.query` 为必填的自由文本字符串;中文搜索词结果最丰富,英文或拼音也能匹配。商品搜索返回 `items`,含 `id`、`price`、`seller`、`offer_repurchase_rate`、`shop_repurchase_rate`、`category_ids` 和 `is_ad`,另有 `has_next`,它在该操作中始终为 false:每个关键词只返回约 20 个商品的单一短名单,结果行不含起订量和阶梯价,重复调用会在大约 38 个不同商品之间轮换。工厂搜索返回 `items`,含 `name`、`member_id`、`url`、`location`、`years_on_1688`、`workers`、`floor_area_sqm`(平方米)、`makes`、`medal`、`medal_level`、`repeat_buyer_rate`、`on_time_rate`、`reply_rate_30d`(30 天回复率)、`third_party_audit`、`is_super_factory` 和 `offer_ids`,另有 `count`、`query` 和 `note`。它是每个关键词的精选短名单而不是索引:部分关键词不会返回工厂,空列表是真实答案。`third_party_audit` 表示工厂是否经过 SGS 等机构的第三方验厂。
post-1688-searchpost-1688-supplier-searchbody.query
共用的可选输入
6 个操作都还接受 `body.max_rotations`,为 1 到 8 的整数,默认 4。它设定一次调用在放弃前最多尝试的次数。超出范围的值会被拒绝。
body.max_rotations
{
"body": {
"category_id": "1031910",
"page": 2
}
}操作示例
公共网关操作统一使用 POST /api/v1/{project}/{action}。
类目树
POST /api/v1/alibaba-1688/post-1688-categories
使用 JSON 对象,按文档将参数放入 path、query、headers 和 body,省略未使用的位置。input.headers 是受结构校验的数据,不是浏览器请求头。请勿在此填写凭证。按文档保留 body 的数组、标量或 null;省略与 null 含义不同。
{
"body": {
"depth": 1,
"language": "ru"
}
}示例响应
null类目商品
POST /api/v1/alibaba-1688/post-1688-category-offers
使用 JSON 对象,按文档将参数放入 path、query、headers 和 body,省略未使用的位置。input.headers 是受结构校验的数据,不是浏览器请求头。请勿在此填写凭证。按文档保留 body 的数组、标量或 null;省略与 null 含义不同。
{
"body": {
"category_id": "1031910"
}
}示例响应
null商品详情
POST /api/v1/alibaba-1688/post-1688-product-detail
使用 JSON 对象,按文档将参数放入 path、query、headers 和 body,省略未使用的位置。input.headers 是受结构校验的数据,不是浏览器请求头。请勿在此填写凭证。按文档保留 body 的数组、标量或 null;省略与 null 含义不同。
{
"body": {
"offer_id": "864971848115"
}
}示例响应
null买家评价
POST /api/v1/alibaba-1688/post-1688-product-reviews
使用 JSON 对象,按文档将参数放入 path、query、headers 和 body,省略未使用的位置。input.headers 是受结构校验的数据,不是浏览器请求头。请勿在此填写凭证。按文档保留 body 的数组、标量或 null;省略与 null 含义不同。
{
"body": {
"offer_id": "864971848115"
}
}示例响应
null关键词搜索
POST /api/v1/alibaba-1688/post-1688-search
使用 JSON 对象,按文档将参数放入 path、query、headers 和 body,省略未使用的位置。input.headers 是受结构校验的数据,不是浏览器请求头。请勿在此填写凭证。按文档保留 body 的数组、标量或 null;省略与 null 含义不同。
{
"body": {
"query": "蓝牙耳机"
}
}示例响应
null工厂搜索
POST /api/v1/alibaba-1688/post-1688-supplier-search
使用 JSON 对象,按文档将参数放入 path、query、headers 和 body,省略未使用的位置。input.headers 是受结构校验的数据,不是浏览器请求头。请勿在此填写凭证。按文档保留 body 的数组、标量或 null;省略与 null 含义不同。
{
"body": {
"query": "蓝牙耳机"
}
}示例响应
null网关调用参考
以下规则适用于本站所有显示本节的 API。
发起调用
向 POST /api/v1/<project>/<action> 发送 JSON 请求体。需要以下三个请求头:
x-api-key:在控制台创建的密钥。其权限必须包含<project>:<action>,或包含<project>:*(项目的全部操作,包括以后新增的操作)。Content-Type: application/json。请求体不超过 64 KiB。Idempotency-Key:8–128 个字母、数字、冒号、下划线或连字符。每个预期请求生成一个,并保留到得到最终结果为止。
Idempotency-Key 规则
- 幂等 key 归属于你的账户:你的所有 API 密钥和真实调试请求共用同一组幂等 key。
- 首个请求完成后,以同一个 key 发送相同请求(项目、操作和输入均相同):24 小时内返回已保存的响应,不会再次执行操作,也不会再次扣费。
- 同一个 key 但请求不同:返回 409
IDEMPOTENCY_CONFLICT。 - 首个请求仍在进行或结果尚未确认时再次使用同一个 key:返回 409
REQUEST_PENDING。 - 结果未确认的请求被释放后再次使用同一个 key:返回 504
OUTCOME_UNKNOWN_RELEASED,未扣费。 - 成功请求的已保存响应过期后再次使用同一个 key:返回 410
RESULT_EXPIRED,不会再次执行或扣费。 - 受理前被拒绝的请求(错误表第一组)不会记录 key,修正问题后可用同一个 key 重发;
IDEMPOTENCY_CONFLICT除外,此时该 key 已属于另一个请求。请求一旦被受理,该 key 即归属于它,即使请求随后失败。
请求体
请求体是一个 JSON 对象,最多包含四个可选成员:path、query、headers 和 body。按操作文档放置每个参数,省略未使用的成员。这里的 headers 是按操作校验的 JSON 数据,不是 HTTP 请求头,切勿在其中放入凭证。
不符合操作要求的输入会在请求执行之前被拒绝,且不扣费:未通过操作输入结构校验(包括未知成员,或 path、query、headers 中未声明的参数)时,在受理前返回 INVALID_PARAM;body 内含未声明字段、某个值无法安全发送(例如路径参数中含 "/" 或 "%")或超出传输限制时,在受理后返回 INVALID_INPUT(该 key 随即被占用)。
响应
{
"ok": true,
"data": "<the result of the operation>",
"meta": {
"requestId": "<request id>",
"chargedCreditUnits": "<price in credit units>",
"…": "…"
}
}data 是操作的结果。meta.requestId 标识已记录的请求,meta.chargedCreditUnits 是实际扣费金额。
{
"ok": false,
"error": {
"code": "OPERATION_TIMEOUT",
"message": "…"
},
"meta": {
"requestId": "<request id>",
"chargedCreditUnits": "0",
"status": "uncertain"
}
}此时 meta.chargedCreditUnits 始终为 "0"。请求确定未成功时 meta.status 为 "failure",结果无法确认时为 "uncertain"。
{
"ok": false,
"error": {
"code": "INSUFFICIENT_CREDITS",
"message": "…"
},
"requestId": "<reply id>"
}这种响应没有 meta,也不扣费。请读取 ok 和 error.code,不要只依赖 HTTP 状态码。
计费
- 只有调用成功时才按标价扣费,失败的调用不扣费。
- 请求受理时会从可用余额中预留价格。可用余额低于价格时,请求以
INSUFFICIENT_CREDITS被拒绝。 - 结果无法确认时,价格最多预留 900 秒(15 分钟),之后释放,不会事后扣费。
- 金额以整数积分单位表示:1 积分 = 100 积分单位,因此
"250"表示 2.5 积分。
限流
每个被受理的请求都会计入你账户的限额(突发 10 个请求,之后每 0.2 秒恢复 1 个),以及所有客户共享、适用于此操作或一组操作的限额(包括同时进行请求数的上限)。因此即使你自己的流量不大,也可能收到 RATE_LIMITED 或 CONCURRENCY_LIMIT。两种响应都带有以秒为单位的 Retry-After 请求头;至少等待该时长后,使用同一个 Idempotency-Key 重发。
自动停用
当操作的结果多次不符合其文档化契约,或执行该操作的成本高于(或无法再核对)其定价所依据的成本时,操作可能被自动停用;你每次调用支付的价格不会因此改变。运营方也可以手动停用。停用期间调用返回 503 OPERATION_SUSPENDED,不会执行,也不扣费。部分自动停用会在一小时后解除,以便通过调用确认操作是否恢复;这些调用与普通调用一样执行和计费。
验证状态
在本页的可用状态表中,“已由真实流量验证”表示该操作在当前价格和契约下已有真实调用成功完成,并通过了本站对该操作的自动成本核对。
错误码
| 错误码 | HTTP | 是否扣费 | 含义 | 处理方式 |
|---|---|---|---|---|
| 受理前被拒绝:无 meta;不会记录 key(IDEMPOTENCY_CONFLICT 除外:该 key 已属于另一个请求) | ||||
AUTH_FAILED | 401 | 否 | x-api-key 请求头缺失、格式错误、不存在、已撤销或已过期。 | 使用有效的密钥,切勿把密钥写入日志。 |
ACCOUNT_FROZEN | 403 | 否 | 账户受到限制或邮箱尚未验证,不能发起计费请求。 | 在控制台检查账户状态。 联系页面 |
SCOPE_DENIED | 403 | 否 | 密钥权限既不包含 <project>:<action>,也不包含 <project>:*。 | 使用权限覆盖此操作的密钥。 |
UNSUPPORTED_MEDIA_TYPE | 415 | 否 | Content-Type 请求头不是 application/json。 | 修正请求后重新发送,可继续使用同一个 Idempotency-Key。 |
PAYLOAD_TOO_LARGE | 413 | 否 | 请求体超过 64 KiB。 | 修正请求后重新发送,可继续使用同一个 Idempotency-Key。 |
INVALID_ENCODING | 400 | 否 | 请求体不是有效的 UTF-8。 | 修正请求后重新发送,可继续使用同一个 Idempotency-Key。 |
INVALID_REQUEST | 400 | 否 | 请求体不是有效的 JSON。 | 修正请求后重新发送,可继续使用同一个 Idempotency-Key。 |
IDEMPOTENCY_KEY_REQUIRED | 400 | 否 | Idempotency-Key 请求头缺失,或不是 8–128 个字母、数字、冒号、下划线或连字符。 | 提供有效的 Idempotency-Key。 |
IDEMPOTENCY_CONFLICT | 409 | 否 | 你的账户已将此 Idempotency-Key 用于不同的项目、操作或输入。 | 新请求请使用新的 key。如需读取先前结果,请原样重发先前的请求。 |
OPERATION_NOT_FOUND | 404 | 否 | 没有与此项目和操作对应的已注册操作。 | 对照文档检查端点路径。 |
INVALID_PARAM | 400 | 否 | 输入未通过操作的结构校验,包括未知成员,或 path、query、headers 中未声明的参数。 | 修正请求后重新发送,可继续使用同一个 Idempotency-Key。 |
INSUFFICIENT_CREDITS | 402 | 否 | 可用余额(余额减去预留金额)低于此操作的价格。 | 等待预留金额结算或释放,或在开放购买后充值。 |
OPERATION_DISABLED | 503 | 否 | 该操作未启用真实调用。 | 重试前请在 API 页面查看当前可用状态。 |
OPERATION_SUSPENDED | 503 | 否 | 该操作已被自动或由运营方停用,请求未被执行。 | 稍后重试,并在 API 页面查看当前可用状态。 |
OPERATION_HEALTH_UNAVAILABLE | 503 | 否 | 网关无法确认该操作是否已停用,因此拒绝了调用。 | 稍后使用同一个 Idempotency-Key 重试,不要高频循环重试。 |
NOT_CONFIGURED | 503 | 否 | 服务的必要组成部分(如数据库、密钥保护或该操作的配置)不可用。 | 稍后使用同一个 Idempotency-Key 重试,不要高频循环重试。 |
RATE_LIMITED | 429 | 否 | 触发了限流:可能是你账户的限额,也可能是与其他客户共享、适用于此操作或一组操作的限额。 | 等待 Retry-After 指定的秒数后,使用同一个 Idempotency-Key 重发。 |
CONCURRENCY_LIMIT | 429 | 否 | 此操作(或共享同一上限的一组操作)同时进行中的请求过多(所有客户共享此上限)。 | 等待 Retry-After 指定的秒数后,使用同一个 Idempotency-Key 重发。 |
| 已受理但失败——meta.chargedCreditUnits 为 "0";该 Idempotency-Key 已归属于此请求 | ||||
INVALID_INPUT | 400 | 否 | body 内含未声明字段、某个值无法安全发送(例如路径参数中含 "/" 或 "%"),或请求超出传输限制。操作未被执行。 | 修正输入后,使用新的 Idempotency-Key 发送。 |
SERVICE_UNAVAILABLE | 503 | 否 | 由于服务端的状况,该操作目前无法执行。与你的 API 密钥或钱包余额无关。 | 稍后使用新的 Idempotency-Key 重试;此 key 之后会一直返回这一失败结果。 |
SERVICE_BUSY | 503 | 否 | 该操作在服务端暂时达到处理上限。 | 稍后使用新的 Idempotency-Key 重试;此 key 之后会一直返回这一失败结果。 |
REQUEST_REJECTED | 502 | 否 | 该操作拒绝了此请求。 | 对照文档检查输入,修正后使用新的 Idempotency-Key 发送。 |
REQUEST_NOT_FULFILLED | 502 | 否 | 该操作报告未成功。 | 对照文档检查输入,修正后使用新的 Idempotency-Key 发送。 |
OPERATION_FAILED | 502 | 否 | 该操作未完成,未产生结果。 | 稍后使用新的 Idempotency-Key 重试;此 key 之后会一直返回这一失败结果。 |
OPERATION_TIMEOUT | 504 | 否——价格最多预留 900 秒后释放 | 该操作未在时限内完成或报告超时,可能仍已执行。 | 不要自动换新的 Idempotency-Key 重发:该操作可能已经执行。是否发起新请求请审慎决定。 |
OUTCOME_UNKNOWN | 504 / 502 | 否——价格最多预留 900 秒后释放 | 该操作失败或意外中断,结果未知。 | 不要自动换新的 Idempotency-Key 重发:该操作可能已经执行。是否发起新请求请审慎决定。 |
RESULT_INVALID | 502 | 否——价格最多预留 900 秒后释放 | 结果不是该操作可识别的有效响应,或未通过网关的最终检查。 | 不要自动换新的 Idempotency-Key 重发:该操作可能已经执行。是否发起新请求请审慎决定。 |
RESULT_TOO_LARGE | 502 | 否——价格最多预留 900 秒后释放 | 结果超出大小限制。 | 不要自动换新的 Idempotency-Key 重发:该操作可能已经执行。是否发起新请求请审慎决定。 |
| 无 meta,可能发生在操作执行之后(此时 key 可能已被记录) | ||||
RESPONSE_TOO_LARGE | 502 | 否——价格最多预留 900 秒后释放 | 操作已返回结果,但响应过大,网关无法保存,因此未返回。 | 不要自动换新的 Idempotency-Key 重发:该操作可能已经执行。是否发起新请求请审慎决定。 |
CREDIT_SCHEMA_UNAVAILABLE | 503 | 仅当已记录的请求成功时扣费。 | 积分记账未处于预期状态(例如维护迁移期间)。通常发生在受理前;少数情况下发生在操作执行之后。 | 稍后使用同一个 Idempotency-Key 重试:仅当请求从未被受理时才会执行,否则返回已记录的状态。 |
INTERNAL_ERROR | 500 | 仅当已记录的请求成功时扣费。 | 服务端意外错误,可能发生在操作执行之前或之后。 | 稍后使用同一个 Idempotency-Key 重试:仅当请求从未被受理时才会执行,否则返回已记录的状态。请保留 requestId。 联系页面 |
| 重复使用已受理请求的 Idempotency-Key | ||||
REQUEST_PENDING | 409 | 本次重试不扣费;原请求仅在成功时扣费,否则在 900 秒内释放。 | 使用此 key 的请求仍在进行,或结果尚未确认。 | 请等待,不要换新 key 重试;结果未确认的请求在 900 秒后释放,不扣费。 |
RESULT_EXPIRED | 410 | 否 | 请求已成功,但保存的响应已超过 24 小时。不会再次执行,也不会再次扣费。 | 新请求请使用新的 Idempotency-Key(成功后会再次扣费)。 |
OUTCOME_UNKNOWN_RELEASED | 504 | 否 | 结果始终未能确认,预留价格已释放,未扣费。 | 自行决定是否使用新的 Idempotency-Key 发起新请求;成功后会扣费。 |
有些响应并非由网关产生:POST 以外的方法会收到 HTTP 405;运行超过 60 秒的调用会被托管平台终止,返回的响应不是上述 JSON 格式。此时 key 可能已被记录;使用同一个 key 重发时,若请求从未被受理则会执行,否则返回已记录的状态。