# Douyin Product details API (douyin.product_detail)

- Canonical page: https://everyinfra.com/en/douyin-api/product_detail
- Endpoint: POST https://api.everyinfra.com/api/v1/social with {"platform": "douyin", "action": "product_detail", "params": {...}}
- Price: $0.01333 per call ($13.33 per 1,000 requests); failed calls and empty results are not charged
- Returns: single object
- Mode: sync; add "mode": "async" for slow tasks

Douyin Product details reads one Douyin Mall product by `product_id` and returns its title, shop, displayed price and current public discount price, the sales figure on the page, main and detail images, the service assurances it advertises, shipping notes, variant options and whether it is on sale. It answers what a product costs on Douyin right now, who sells it and how well it sells, for sellers tracking competitors, brands watching resellers and agencies checking a product before a creator promotes it.

Both prices are in yuan. `sold_count` is a snapshot of the product's public sales figure, not the sales of any one creator. `shipping_fee_text` and `shipping_estimate_text` keep the page's own wording, so parse them before comparing shops. `variant_groups` lists each option group with its option names and public IDs only, with no price or stock per option.

## Health

- Live health (24h percent, hourly and daily trends): https://api.everyinfra.com/api/v1/social/availability?platform=douyin&action=product_detail

## Parameters

| name | type | required | default | description |
|---|---|---|---|---|
| product_id | not declared | yes | not declared | A numeric Douyin product ID returned by `product_search` or `live_product_search`. It is not a SKU ID, promotion ID, title, or URL. |

## Response fields (items in `results`)

| field | meaning |
|---|---|
| product_id | Stable Douyin Mall product ID. |
| title | Title. null when the platform has no titles (for example text-only posts). |
| price_cny | Displayed product price in yuan. |
| discount_price_cny | Current public discount price in yuan; never derived from the list price when missing. |
| sales_text | Sales figure exactly as the product page shows it. |
| sold_count | Units sold that the product page currently shows; a snapshot at read time, not one creator's sales. |
| shop_id | Douyin Mall shop ID. |
| shop_name | Douyin Mall shop name. |
| shop_avatar_url | Douyin Mall shop avatar URL. |
| image_url | Image link. Capabilities with several images may return an image_urls array. |
| main_image_urls | Main and carousel image URLs of the product. |
| detail_image_urls | Long detail-image URLs of the product. |
| assurances | Service assurance labels the product shows. |
| shipping_fee_text | Shipping fee or ship-from note exactly as the page shows it. |
| shipping_estimate_text | Estimated dispatch note exactly as the page shows it. |
| variant_groups | Variant groups and their options; only group names, option names and public option IDs, no price or stock per option. |
| on_sale | Whether the product showed as on sale when it was read. |
| platform | Source platform identifier, the same as platform in the request (for example xiaohongshu, tiktok). |

## Example

```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"
  }
}'
```

```python
import os
import requests

response = requests.post(
    "https://api.everyinfra.com/api/v1/social",
    headers={"Authorization": f"Bearer {os.environ['EVERYINFRA_API_KEY']}"},
    json={
        "platform": "douyin",
        "action": "product_detail",
        "params": {
            "product_id": "3836720422792070096",
        },
    },
    timeout=120,
)
print(response.status_code)
print(response.json())
```

## Response example

Real response to the example request above, captured 2026-11-07T14:47:42Z. `results` and `count` are real with personal information (names, handles, avatars, profile links, contact details) removed. `id`, `billing` and `quota` differ on every call, so only their shape is shown.

```text
{
  "id": "req_…",
  "platform": "douyin",
  "action": "product_detail",
  "results": {
    "product_id": "3836720422792070096",
    "title": "【呆萌熊】新品双头双效唇釉哑光镜面显白滋润持久*",
    "price_cny": 29.9,
    "discount_price_cny": 29.9,
    "sales_text": "已售 2.1万",
    "sold_count": 21000,
    "shop_id": "299794838",
    "shop_name": "云熙韩系美妆店",
    "shop_avatar_url": "https://p26-item.ecombdimg.com/img/tos-cn-i-6vegkygxbk/f8ba953ab37546efb8a919a4e9ead1a8~tplv-5mmsx3fupr-resize:74:74.webp",
    "image_url": "https://p26-item.ecombdimg.com/img/ecom-shop-material/jpeg_m_37a8f86e0effdbc561476e142b123a40_sx_459175_www800-800~tplv-5mmsx3fupr-resize_q:1080:1080:q90.webp",
    "main_image_urls": [
      "https://p26-item.ecombdimg.com/img/ecom-shop-material/jpeg_m_37a8f86e0effdbc561476e142b123a40_sx_459175_www800-800~tplv-5mmsx3fupr-resize_q:1080:1080:q90.webp",
      "https://p3-item.ecombdimg.com/img/ecom-shop-material/png_m_574f7406e9dd12bb3f18273204bf327f_sx_896309_www800-800~tplv-5mmsx3fupr-resize_q:1080:1080:q90.webp",
      "https://p26-item.ecombdimg.com/img/ecom-shop-material/jpeg_m_534c2bcde929242168bd6807ad88a191_sx_437036_www800-800~tplv-5mmsx3fupr-resize_q:1080:1080:q90.webp"
    ],
    "detail_image_urls": [
      "https://p3-item.ecombdimg.com/img/ecom-shop-material/jpeg_m_def6b7201342e9f4b6ac75d03e204a5c_sx_481255_www790-1056~tplv-5mmsx3fupr-resize:1080:0.webp",
      "https://p3-item.ecombdimg.com/img/ecom-shop-material/jpeg_m_9886a360258475ee00925b5a9002f008_sx_536482_www790-1050~tplv-5mmsx3fupr-resize:1080:0.webp",
      "https://p26-item.ecombdimg.com/img/ecom-shop-material/jpeg_m_5f7156ffb9ef5e49cf37af6be985d933_sx_487609_www790-1394~tplv-5mmsx3fupr-resize:1080:0.webp"
    ],
    "assurances": [
      "7天无理由退货"
    ],
    "shipping_fee_text": "免运费",
    "shipping_estimate_text": "预计明天发货",
    "variant_groups": [
      {
        "name": "色号",
        "options": [
          {
            "id": "•••",
            "name": "01烟熏烤奶"
          },
          {
            "id": "•••",
            "name": "02芭乐奶油"
          },
          {
            "id": "•••",
            "name": "03樱桃玫瑰"
          }
        ]
      },
      {
        "name": "第二支选择",
        "options": [
          {
            "id": "•••",
            "name": "01烟熏烤奶"
          },
          {
            "id": "•••",
            "name": "02芭乐奶油"
          },
          {
            "id": "•••",
            "name": "03樱桃玫瑰"
          }
        ]
      }
    ],
    "on_sale": true,
    "platform": "douyin"
  },
  "billing": {
    "charged": …,
    "charged_usd": …,
    "balance_after_usd": …,
    …
  },
  "quota": { … }
}
```

## FAQ

### Where do I get a `product_id`?

From the results of the Douyin Product search or Live product search capability, which carry the numeric Douyin Mall product ID. Pass that number, not the SKU ID, promotion ID or product title that also appear in some results; only the product ID identifies the listing here.

### Does `sold_count` show what a creator sold?

No. It is the units-sold figure the product page shows publicly at the time of the call, across the whole product, so it says nothing about a particular creator or live stream. Store it with the call date to build a sales trend, and keep `sales_text` for the wording exactly as the page shows it.

### Why is `discount_price_cny` missing for some products?

It is filled only when the product shows a public discounted price as you call. When it is absent, treat `price_cny` as the price on display; the discount is never estimated or derived from it. Both values are in yuan, so you can compare them directly when both are present.

## Also

- Capability catalog (no key): https://api.everyinfra.com/api/v1/social/catalog?platform=douyin
- OpenAPI: https://everyinfra.com/openapi.json · Agents guide: https://everyinfra.com/agents.md
