抖音商品详情 API
接口健康状态
暂时读不到健康数据,无法判断这个接口近期的状态。这不代表它不可用。
商品详情:返回单个对象;主要字段 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 等待后重试。
写代码前,先问清楚我要采哪些对象、一共多少个、需要哪些字段、结果存成什么格式,再把方案和大概花费讲给我确认。请求参数
| 参数名 | 位置 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|---|
Authorization | header | string | 是 | - | Bearer 加你的 API Key。在控制台创建;不要放进网址或代码仓库。 |
platform | body | string | 是 | douyin | 平台标识,固定值。 |
action | body | string | 是 | product_detail | 能力标识,固定值。 |
product_id | body.params | 未声明 | 是 | - | 抖音商城商品数字 ID;从 product_search 或 live_product_search 结果取得,不是 SKU ID、推广 ID 或商品标题。 |
代码示例
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。
响应示例
这组示例参数还没有真实样例:这里只按契约列出响应结构和字段,值用 … 占位,不是一次真实调用的结果。
{
"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)。