抖音商品详情 API

POST

接口健康状态

暂时读不到健康数据,无法判断这个接口近期的状态。这不代表它不可用。

商品详情:返回单个对象;主要字段 product_id、title、price_cny、discount_price_cny、sales_text、sold_count。

抖音商品详情按 product_id 读取一件抖音商城商品:标题、店铺、展示价和当前公开优惠价、页面销量、主图与详情长图、服务保障标签、运费和发货说明、规格选项,以及是否在售。它回答「这件商品在抖音卖什么价、谁在卖、卖得怎样」,适合商家盯竞品、品牌方巡查经销商的价格,以及机构在安排达人带货前核实商品。

price_cny 和 discount_price_cny 的单位都是人民币元;sold_count 是整个商品的公开已售数,不是某位达人的销量。运费和发货说明保留页面原文,跨店比较前先自己解析;variant_groups 只有规格名、选项名和公开规格 ID,不含每个选项的价格和库存。

单价 $0.56 / 千次(每次 $0.000556),失败与空结果不扣费。 同步返回;慢任务可在请求体加 "mode": "async",先拿 job_id 再轮询。

AI 提示词

复制下面这段给你常用的 AI 助手:里面写好了这个接口的参数、返回字段和示例请求,它会先问清你的需求,再帮你写采集脚本。

请帮我用 EveryInfra 的「抖音商品详情」接口(douyin/product_detail)写一个数据采集脚本。

接口约定:
- 请求:POST https://api.everyinfra.com/api/v1/social,请求头 Authorization: Bearer <API Key>;Key 从环境变量 EVERYINFRA_API_KEY 读取,不要写进代码。
- 请求体里 platform 填 douyin,action 填 product_detail,参数放在 params 里。
- 必填参数:
  - product_id:抖音商城商品数字 ID;从 product_search 或 live_product_search 结果取得,不是 SKU ID、推广 ID 或商品标题。
- 返回一个对象,主要字段:product_id(抖音商城商品稳定 ID)、title、price_cny(商品展示价格)、discount_price_cny(商品当前公开优惠价)、sales_text(商品详情公开销量原文)、sold_count(商品详情当前公开的已售数量)、shop_id(抖音商城店铺 ID)、shop_name(抖音商城店铺名称)、shop_avatar_url(抖音商城店铺头像 URL)、image_url、main_image_urls(商品头图/轮播图 URL 列表)、detail_image_urls(商品详情长图 URL 列表);一共 17 个字段,完整列表见 https://api.everyinfra.com/api/v1/social/catalog?platform=douyin。
- 示例请求体:
{
  "platform": "douyin",
  "action": "product_detail",
  "params": {
    "product_id": "3836720422792070096"
  }
}
- 计费:$0.56 / 千次;失败和空结果不扣费。
- 一次要采几十上百个时,在请求体加 "mode": "async":先拿到 job_id,再轮询 GET https://api.everyinfra.com/api/v1/jobs/{job_id} 取结果。
- 返回 422 时,按错误信息里的候选参数和允许值修正;返回 429 或 503 时,按 Retry-After 等待后重试。

写代码前,先问清楚我要采哪些对象、一共多少个、需要哪些字段、结果存成什么格式,再把方案和大概花费讲给我确认。

请求参数

参数名位置类型必填默认值说明
Authorizationheaderstring是-Bearer 加你的 API Key。在控制台创建;不要放进网址或代码仓库。
platformbodystring是douyin平台标识,固定值。
actionbodystring是product_detail能力标识,固定值。
product_idbody.params未声明是-抖音商城商品数字 ID;从 product_search 或 live_product_search 结果取得,不是 SKU ID、推广 ID 或商品标题。

代码示例

bash
curl -X POST 'https://api.everyinfra.com/api/v1/social' \
  -H "Authorization: Bearer $EVERYINFRA_API_KEY" \
  -H 'Content-Type: application/json' \
  --data-raw '{
  "platform": "douyin",
  "action": "product_detail",
  "params": {
    "product_id": "3836720422792070096"
  }
}'

[OpenAPI 定义 (JSON)]示例从环境变量 EVERYINFRA_API_KEY 读取 Key,复制出去的代码不含你的 Key。

响应示例

字段预览

这组示例参数还没有真实样例:这里只按契约列出响应结构和字段,值用 … 占位,不是一次真实调用的结果。

json
{
  "id": "req_…",
  "platform": "douyin",
  "action": "product_detail",
  "results": {
    "product_id": …,
    "title": …,
    "price_cny": …,
    "discount_price_cny": …,
    "sales_text": …,
    "sold_count": …,
    "shop_id": …,
    "shop_name": …,
    "shop_avatar_url": …,
    "image_url": …,
    "main_image_urls": …,
    "detail_image_urls": …,
    "assurances": …,
    "shipping_fee_text": …,
    "shipping_estimate_text": …,
    "variant_groups": …,
    "on_sale": …,
    "platform": …
  },
  "billing": {
    "charged": …,
    "charged_usd": …,
    "balance_after_usd": …,
    …
  },
  "quota": { … }
}

返回字段

业务数据在 results 里;下表是每条记录可能包含的字段,平台没有提供的值不会被补造。

字段含义
product_id抖音商城商品稳定 ID。
title标题。平台无标题概念时(如纯文本帖)为 null。
price_cny商品展示价格,人民币元。
discount_price_cny商品当前公开优惠价,人民币元;缺失时不从原价推算。
sales_text商品详情公开销量原文。
sold_count商品详情当前公开的已售数量;是采集时快照,不等于指定达人销量。
shop_id抖音商城店铺 ID。
shop_name抖音商城店铺名称。
shop_avatar_url抖音商城店铺头像 URL。
image_url图片链接。多图能力可能返回 image_urls 数组。
main_image_urls商品头图/轮播图 URL 列表。
detail_image_urls商品详情长图 URL 列表。
assurances商品公开服务保障标签。
shipping_fee_text商品公开运费或发货地说明原文。
shipping_estimate_text商品公开预计发货说明原文。
variant_groups商品规格组与可选项;只保留规格名、选项名和公开规格 ID。
on_sale商品在采集时是否显示在售。
platform数据来源平台标识,与请求里的 platform 一致(如 xiaohongshu、tiktok)。

常见问题

product_id 从哪里来?

从抖音的商品搜索或直播商品搜索结果里取,那里每件商品都带抖音商城的数字商品 ID。只传这个数字;结果里同样出现的推广 ID、SKU ID,以及商品标题,都不能代替它。

sold_count 是达人带货的销量吗?

不是。它是商品详情页公开的已售数量,覆盖整个商品,不区分达人或直播间。按调用日期把它存下来,可以画出销量走势;页面上销量的原始写法保存在 sales_text 里。

为什么有的商品没有 discount_price_cny?

只有商品在读取时公开显示了优惠价,这个字段才有值。没有时,把 price_cny 当作当前展示价即可,优惠价不会根据原价推算出来。两者同时存在时可以直接相减,看出优惠幅度。

错误与计费

401
缺少 Key 或 Key 无效。先鉴权再校验参数,未鉴权的请求拿不到参数结构。
422
参数名或取值不对。错误信息会列出这项能力支持的参数、允许值和最接近的候选,按它改即可;发生在扣费之前。
402
余额不足,请先充值。
429
超过账户的每分钟请求上限(名下所有 Key 合计;Key 自设了更低上限时先按它算),按 Retry-After 等待后再试。需要更高上限可在控制台买提速包。
503
暂时无法完成。已预扣的费用按原账本退回;响应里的 billing 与 refund 写明实际结果,结果未知时会明确标出,不要直接重发。
200 空结果
请求完成但没有数据,不扣费(billing.reason = empty_result_refunded)。