# Douyin Details API (douyin.profile)

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

Douyin Details reads one account's public profile, given its `user_id`: nickname, Douyin ID, bio, avatar, follower and following counts, the like total, number of videos, gender, IP location and verification status. It answers who an account is and how large it is at the moment you ask, for vetting creators, tracking competitor accounts and keeping a creator database current.

`user_id` takes the secUid, which normally begins with MS4w. Every count is a snapshot of the moment you call, so store it with a date if you want to follow an account over time, and read null as not disclosed rather than zero. `ip_location` is the region Douyin itself displays on the profile, not something the owner types, and `is_verified` is null when verification cannot be determined.

## Health

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

## Parameters

| name | type | required | default | description |
|---|---|---|---|---|
| user_id | not declared | yes | not declared | The Douyin user's `secUid` string (typically starting with `MS4w`), not a nickname or short numerical Douyin ID. Used to identify accounts for `profile` and `user_posts` actions; can be obtained from an `author_id` field in search results or a user profile URL. |

## Response fields (items in `results`)

| field | meaning |
|---|---|
| user_id | User's unique ID on the platform. |
| douyin_id | Douyin ID: the searchable ID the account holder chooses. |
| nickname | Display name of the account. |
| bio | Profile bio written by the account; may contain line breaks and emoji. |
| url | Link to the record on the platform. |
| follower_count | Followers. null means not disclosed, not 0. |
| following_count | Accounts followed. null means not disclosed, not 0. |
| like_count | Likes. null means the platform or this capability does not disclose it; it is not 0. |
| video_count | Video count: the account's videos on profile and billboard_account_search, videos related to the entry on trending. |
| gender | Gender as shown on the account. |
| ip_location | IP region Douyin displays (set by the platform, not entered by the user). |
| is_verified | Whether the platform verified the account. null means it cannot be determined. |
| avatar_url | Avatar image link. Some platforms return sized CDN links that can expire. |
| uid | Numeric user ID (profile / creator_search). user_id is the secUid; both identify the same account. |
| background_image_url | Profile background image link. |
| country | Country or region: a full name or an ISO code depending on the platform, not normalized. |
| language | Content language code (for example zh, en) as judged by the platform; it can be wrong. |
| is_live | Whether the account was live at the moment of the call; a point-in-time state. |
| likes_given_count | The public Likes count on the profile: how many posts the account has liked. |
| has_shop | Whether the account has a product showcase enabled. |
| age | platform-native meaning |
| has_series | platform-native meaning |
| platform | Source platform identifier, the same as platform in the request (for example xiaohongshu, tiktok). |
| verify_reason | Verification note as written (profile, creator_search), for business or individual verification; empty or absent for unverified accounts. |

## 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": "profile",
  "params": {
    "user_id": "https://www.douyin.com/user/MS4wLjABAAAAk1tZ-L085zZf2yW_H5dnVFZWyk8Rt8v4RAvf9KhTyPoVdMDxTs7Q_rvgTJGWXezS"
  }
}'
```

```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": "profile",
        "params": {
            "user_id": "https://www.douyin.com/user/MS4wLjABAAAAk1tZ-L085zZf2yW_H5dnVFZWyk8Rt8v4RAvf9KhTyPoVdMDxTs7Q_rvgTJGWXezS",
        },
    },
    timeout=120,
)
print(response.status_code)
print(response.json())
```

## Response example

Real response to the example request above, captured 2026-09-26T08:56:04Z. `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": "profile",
  "results": {
    "user_id": "MS4wLjABAAAAk1tZ-L085zZf2yW_H5dnVFZWyk8Rt8v4RAvf9KhTyPoVdMDxTs7Q_rvgTJGWXezS",
    "douyin_id": "•••",
    "nickname": "•••",
    "bio": "📚英语爱好者\n🧸努力学习英语中\n❤️好好吃饭💛好好睡觉💚好好生活\n🎇文本群里分享视频的文本，有需要的小伙伴可以进群",
    "url": "https://www.iesdouyin.com/xg/user/1929015166249580",
    "follower_count": 48341,
    "following_count": 21,
    "like_count": 91585,
    "video_count": 210,
    "gender": "•••",
    "ip_location": "•••",
    "is_verified": true,
    "avatar_url": "https://p26.douyinpic.com/•••",
    "platform": "douyin"
  },
  "billing": {
    "charged": …,
    "charged_usd": …,
    "balance_after_usd": …,
    …
  },
  "quota": { … }
}
```

## FAQ

### What is the difference between `user_id` and `douyin_id`?

`user_id` is the secUid, a long internal ID that usually starts with MS4w; Douyin capabilities such as Posts by user and Creator audience take it. `douyin_id` is the shorter handle the owner picked, the ID people use to find the account in the app, and the Xingtu creator analytics and rate card capabilities take that one. Keep both in your records.

### Can I pass a profile link instead of the secUid?

Yes. Copy the address of the account's profile page, https://www.douyin.com/user/ followed by the secUid, and pass it whole, as the example on this page does; the bare secUid works too. A nickname, or the handle in `douyin_id`, is a different kind of ID, so use the secUid form here.

### How can I track an account's growth?

Call on a schedule and store `follower_count` with the date of each call to build your own series, since every response is a snapshot. For a ready-made follower trend, pass the same `user_id` to the Douyin Creator growth trend capability.

## 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
