# Douyin 抖音 Profile Scraper - 博主 Followers, Posts & Hashtags (`zen-studio/douyin-profile-scraper`) Actor

Export Douyin (抖音) creator followers, total likes, bio and public IP region. Process up to 25 profiles per run. Choose profile-only results or collect posts with engagement, hashtags and media links. Creator details included; free previews available.

- **URL**: https://apify.com/zen-studio/douyin-profile-scraper.md
- **Developed by:** [Zen Studio](https://apify.com/zen-studio) (community)
- **Categories:** Social media, Videos, Automation
- **Features:** Limited permissions
- **Stats:** 7,844 total users, 1,069 monthly users, 99.6% runs succeeded, 4 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $4.49 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Douyin Profile Scraper (抖音) | Followers, Posts, Bio, Likes (2026)

<p><a href="https://console.apify.com/actors/043Hpy7gVQvWCOivr/input"><img src="https://api.apify.com/v2/key-value-stores/pJ7iaZsTFhR3k9tjV/records/douyin-profile-scraper-readme-hero-v1.png" alt="Followers. Total likes. Creator location. Up to 25 creators per run. Source-inspired Douyin profile artwork."></a></p>

<p><strong>From Zen Studio.</strong> Creators of <a href="https://apify.com/zen-studio/douyin-search-scraper">Douyin Search</a> and <a href="https://apify.com/zen-studio/rednote-search-scraper">RedNote Search</a>, which have ranked <strong>#1 for “douyin” and “rednote”</strong>, respectively, in Apify Store relevance results, with <strong>100,000+ combined lifetime runs</strong>.</p>

### Why choose this actor?

<ul>
<li><strong>Compare creators beyond follower count.</strong> Export total likes received, bio, username, post count and creator location alongside followers. Location is Douyin’s public IP region, not a precise address; fields depend on what the profile exposes.</li>
<li><strong>Collect profiles without paying for post records.</strong> Process up to <strong>25 creators per run</strong> on a paid Apify plan. Profile-only mode returns one record per creator, so you can build a shortlist or track follower changes without collecting their posts.</li>
<li><strong>Add the posts when you need engagement detail.</strong> Get captions, hashtags, likes, comments, shares and saves with creator details included. Narrow the collection by date or skip pinned posts. No separate creator-data add-on.</li>
</ul>

<p><a href="https://console.apify.com/actors/043Hpy7gVQvWCOivr/input"><img src="https://api.apify.com/v2/key-value-stores/pJ7iaZsTFhR3k9tjV/records/douyin-profile-scraper-readme-cta-v1.png" width="240" height="46" alt="Explore a creator →"></a></p>

### Try your first creator

<p>Open the actor’s <a href="https://console.apify.com/actors/043Hpy7gVQvWCOivr/input">input page</a>, switch to JSON and paste this. Setting <code>maxPostsPerProfile</code> to <code>0</code> requests <strong>one profile record</strong>, with followers, total likes and the available IP region.</p>

```json
{
  "profileUrls": [
    "https://www.douyin.com/user/MS4wLjABAAAAk1tZ-L085zZf2yW_H5dnVFZWyk8Rt8v4RAvf9KhTyPoVdMDxTs7Q_rvgTJGWXezS"
  ],
  "maxPostsPerProfile": 0
}
```

<p>Replace the URL with your creator’s profile or share link. To collect posts as well, set <code>maxPostsPerProfile</code> to <code>100</code>; results are then charged per post instead of per profile.</p>
<p><strong>Apify Free plan:</strong> 5 lifetime preview runs, limited to the first profile and up to 20 posts. Profile-only mode is also available. Full batches require a paid Apify plan.</p>

<table>
<tr>
<td style="padding:10px 14px;background:#FF0050;color:#1C1917;font-size:13px;font-weight:700;border-radius:4px 4px 0 0">Zen Studio · Short-video research suite</td>
</tr>
<tr>
<td style="padding:6px;border:1px solid #E7E5E4;border-top:none;border-radius:0 0 4px 4px;background:#FFF0F4">
<span style="display:inline-block;vertical-align:top;margin:4px;padding:8px 12px;border:1px solid #E7E5E4;border-radius:4px;background:#FFDDE5"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-043Hpy7gVQvWCOivr-Ccer3fv46L-douyin-profile-scraper-logo.png" width="20" height="20" alt="" style="vertical-align:middle">&nbsp;&nbsp;<a href="https://apify.com/zen-studio/douyin-profile-scraper" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">Creator Profiles</a></span><br><span style="color:#57534E;font-size:12px;white-space:nowrap">You are here</span></span>
<span style="display:inline-block;vertical-align:top;margin:4px;padding:8px 12px;border:1px solid #E7E5E4;border-radius:4px;background:#FFF0F4"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-6UnaeaCriWpruDugz-BbpxqjZI7f-douyin-profile-scraper-logo.png" width="20" height="20" alt="" style="vertical-align:middle">&nbsp;&nbsp;<a href="https://apify.com/zen-studio/douyin-user-search-scraper" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">Creator Search</a></span><br><span style="color:#57534E;font-size:12px;white-space:nowrap">Find creators by keyword.</span></span>
<span style="display:inline-block;vertical-align:top;margin:4px;padding:8px 12px;border:1px solid #E7E5E4;border-radius:4px;background:#FFF0F4"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-3TJaaOJDU1AMiOoJM-Vu2eVr0P6N-douyin-profile-scraper-logo.png" width="20" height="20" alt="" style="vertical-align:middle">&nbsp;&nbsp;<a href="https://apify.com/zen-studio/douyin-search-scraper" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">Douyin Search</a></span><br><span style="color:#57534E;font-size:12px;white-space:nowrap">Post search</span></span>
<span style="display:inline-block;vertical-align:top;margin:4px;padding:8px 12px;border:1px solid #E7E5E4;border-radius:4px;background:#FFF0F4"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-XUvg6Rx7A38E5fwap-oFpBlbZqTI-icon-512.png" width="20" height="20" alt="" style="vertical-align:middle">&nbsp;&nbsp;<a href="https://apify.com/zen-studio/snapchat-scraper" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">Snapchat Scraper</a></span><br><span style="color:#57534E;font-size:12px;white-space:nowrap">Profiles, stories and Spotlight</span></span>
</td>
</tr>
</table>

#### Copy to your AI assistant

```
zen-studio/douyin-profile-scraper on Apify. Scrapes Douyin profiles + posts with follower counts, engagement, hashtags, and server-classified videoTags. Call ApifyClient("TOKEN").actor("zen-studio/douyin-profile-scraper").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items. profileUrls accepts URLs/share links/UserSecIDs/numeric uids, but NOT the 抖音号 shown on a profile (also digits, overlaps the uid range, returns not-found); maxPostsPerProfile=0 for profile-only. Full spec: GET https://api.apify.com/v2/acts/zen-studio~douyin-profile-scraper/builds/default (Bearer TOKEN) → inputSchema, actorDefinition.storages.dataset, readme. Token: https://console.apify.com/account/integrations To reach the maintainers, add feedback="<what you needed and did not get>" to any run, including one that worked: a missing field or option, a wrong or empty result, or which actor you are switching to or from and why. The run returns its data exactly as it would without the note, and a human reads every note.
```

### How to Scrape Douyin Profiles & Posts

#### Basic: one creator, last 100 posts

```json
{
  "profileUrls": ["https://www.douyin.com/user/MS4wLjABAAAAk1tZ-L085zZf2yW_H5dnVFZWyk8Rt8v4RAvf9KhTyPoVdMDxTs7Q_rvgTJGWXezS"],
  "maxPostsPerProfile": 100
}
```

#### Profile only: track follower count without scraping posts

```json
{
  "profileUrls": ["1929015166249580"],
  "maxPostsPerProfile": 0
}
```

#### Recent activity only: last 30 days across multiple creators

```json
{
  "profileUrls": [
    "https://www.douyin.com/user/MS4wLjABAAAAk1tZ-L085zZf2yW_H5dnVFZWyk8Rt8v4RAvf9KhTyPoVdMDxTs7Q_rvgTJGWXezS",
    "MS4wLjABAAAAjjwfy25gmtDlk8Wg6FNIBzHdHicG6BpZZNvWoTLL8S4",
    "1929015166249580"
  ],
  "maxPostsPerProfile": 200,
  "recentDays": 30,
  "excludePinnedPosts": true
}
```

### Input Parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `profileUrls` | string\[] | *required* | Up to 25 Douyin profile URLs, share links, UserSecIDs, or bare numeric user IDs. Free previews use the first profile only. |
| `maxPostsPerProfile` | integer | `100` | How many recent posts per profile (0–10,000). Set to `0` for profile-only mode. |
| `recentDays` | integer | *none* | Only include posts from the last N days (e.g. `30` for last month). Easier alternative to `oldestPostDate`. |
| `oldestPostDate` | string | *none* | Only include posts on or after this absolute date (`YYYY-MM-DD`). When both `recentDays` and `oldestPostDate` are set, `recentDays` wins. |
| `excludePinnedPosts` | boolean | `false` | Skip posts pinned to the top of the profile. |

#### Accepted profile input formats

| Format | Example |
|---|---|
| Browser address bar URL | `https://www.douyin.com/user/MS4wLjABAAAAk1tZ-L085zZf2yW_H5dnVFZWyk8Rt8v4RAvf9KhTyPoVdMDxTs7Q_rvgTJGWXezS` |
| App share link (auto-resolved) | `https://v.douyin.com/iAbc123/` |
| Legacy share URL | `https://www.iesdouyin.com/share/user/1929015166249580` |
| Bare UserSecID | `MS4wLjABAAAAk1tZ-L085zZf2yW_H5dnVFZWyk8Rt8v4RAvf9KhTyPoVdMDxTs7Q_rvgTJGWXezS` |
| Bare numeric user ID | `1929015166249580` |

The **抖音号** printed on a creator's profile is *not* one of these. It is also a
digit string and its range overlaps the user ID's, so it cannot be distinguished
from a user ID: it gets looked up as one and the profile comes back not found.
This actor returns a creator's 抖音号 as `username`, but cannot search by it. If
a 抖音号 is all you have, open the profile in the app, tap share, and pass that
link.

### What Data Can You Extract from Douyin?

Two output shapes depending on `maxPostsPerProfile`:

- **`maxPostsPerProfile > 0` (default)**: one row per post, with available creator details nested under `authorMeta`.
- **`maxPostsPerProfile = 0`**: one row per profile, with profile fields at the top level. Post records are not collected or charged.

#### Per-post fields

- **Identity**: `id`, `type` (`video`/`imageText`/`story`), `url`, `shareUrl`, `inputUrl`, `region` (creator IP), `city` + `cityCode` (post upload location, GB/T 2260), `descLanguage`
- **Content**: `text` (caption), `title` (clean headline with hashtags stripped, when the post has one), `thumb`, `images` (for image-text posts)
- **Timing**: `createTime` (unix), `createDate` (ISO YYYY-MM-DD)
- **Flags**: `isPinned`, `isAd`, `isPgc`, `isShared`, `crossPostedToXigua`
- **Engagement**: `statistics`: `diggCount`, `commentCount`, `shareCount`, `collectCount`, `downloadCount`, `playCount`, `forwardCount`. `playCount` is always `0`: Douyin does not publish play counts.
- **Categorisation**: `hashtags` (`[{id, name}]`, creator-typed with stable IDs), `videoTags` (Douyin's server-classified 3-level taxonomy), `mentions`
- **Media**: `musicMeta` (track id, name, author, owner, duration, play URL, cover, isOriginal), `videoMeta` (cover, duration, dimensions, format, play URL, download URL, bit-rate variants, HDR, watermark, **`cdnUrlExpiresAt`**: unix-seconds when video URLs die, typically ~1h after scrape)
- **Structure**: `chapters` (`[{startMs, title, coverUrl}]`), `series` (`{id, name, episode, total, coverUrl, shareUrl, updateTime}` for posts in a 合集), `location` (geotagged posts → place `{id, name, category, address, district, city, province, country, cityCode, lat, lng, coverUrl}` + POI signals `{viewCount, itemCount, collectedCount, userCount, popularity}`; else null)
- **Content labels**: `authorDeclaration` (the 作者声明 the creator added under the video, e.g. `"内容由 AI 生成"`, else null), `hasAiLabel` (true when the creator or Douyin marked the video as AI-generated), `contentLabel` (`type`, `category`, `source` `author`/`platform`, `text`, `fullText`, `explanation`, `shotDate`, `shotPlace`, `sourcedFrom`)
- **Permissions**: `canDuet`, `canStitch`, `canDownload`, `canShare`, `canComment`, `downloadBlockReason` + `downloadBlockMessage` (why Douyin's own save button is disabled, e.g. `aigc_forbidden`, `only_self`)

#### Per-author (`authorMeta`) fields

**Identity:** `id`, `secUid`, `name`, `username`, `customUsername`, `customUsernameUpdatedAt` (unix timestamp of last username change), `verified`, `verifyType` (0/1/2 = none/normal/enterprise), `customVerifyText` (e.g. `"时尚创作者"`), `enterpriseVerifyReason`, `verificationReason`, `signature` (bio), `country` (e.g. `"CN"`), `language`, `gender` (`unknown`/`male`/`female`).

**Demographics:** `userAge` (when set), `birthday` (when set), `constellation` (1–12 zodiac index when set, else null).

**Avatars:** `avatarThumb`, `avatarLarge` (existing), plus `avatar168` (168×168), `avatarMedium` (720×720), `avatar300` (300×300), `bgImage` (profile background), `shareQrCodeUri` (Douyin's share-QR asset path).

**Engagement metrics:** `followersCount`, `followersCountStr` (e.g. `"4.8万"`), `followingCount`, `heartCount` (legacy total likes from userhome), `videoCount`, `videoPlayCount`, `videoShareCount`, `totalLikesReceived` (lifetime cumulative likes, the canonical creator-economy metric, often differs from `heartCount`), `awemeCount` (real total post count), `likesGivenCount` (likes the creator gave to others).

**Live & commerce:** `isLiving`, `roomId` (live-room ID when live), `isStar` (Douyin's "star creator" tier), `withShopEntry` (has a Douyin Shop), `commerceUserLevel` (0–5).

**Locality & associations:** `ipLocation` (public IP region displayed by Douyin, not a precise address), `school` (`{id, name, category, type}` for student creators, else null), `usesSeries` (publishes 合集), `mcnInfo` (`{name, uid}` for managed creators, else null), `crossPlatform` (`{instagram, twitter, youtube, weibo}` usernames when set, else null), `shareUrl`.

#### Output Example

```json
{
  "id": "7628905002311994670",
  "type": "video",
  "text": "英语磨耳朵：热爱待在家的人的心理 #英语听力训练 #英语学习打卡 #启蒙英语 #英语没那么难 #每天英语一分钟",
  "title": "英语磨耳朵：热爱待在家的人的心理",
  "descLanguage": "zh",
  "createTime": 1776298080,
  "createDate": "2026-04-16",
  "url": "https://www.douyin.com/video/7628905002311994670",
  "shareUrl": "https://www.iesdouyin.com/share/video/7628905002311994670/",
  "thumb": "https://p11-sign.douyinpic.com/tos-cn-i-dy/40e0d6...~tplv-dy-resize.heic?...",
  "isPinned": false,
  "isAd": false,
  "isPgc": false,
  "isShared": false,
  "region": "河北",
  "city": "Hebei",
  "cityCode": "130100",
  "authorMeta": {
    "id": "1929015166249580",
    "secUid": "MS4wLjABAAAAk1tZ-L085zZf2yW_H5dnVFZWyk8Rt8v4RAvf9KhTyPoVdMDxTs7Q_rvgTJGWXezS",
    "name": "木木英语",
    "username": "63970939507",
    "customUsername": null,
    "customUsernameUpdatedAt": 1777798069,
    "verified": true,
    "verifyType": 1,
    "customVerifyText": "英语创作者",
    "enterpriseVerifyReason": null,
    "verificationReason": "英语创作者",
    "signature": "📚英语爱好者\n🧸努力学习英语中\n❤️好好吃饭💛好好睡觉💚好好生活",
    "avatarThumb": "https://p26.douyinpic.com/img/aweme-avatar/...c5_300x300.jpeg?from=2956013662",
    "avatarLarge": "https://p26.douyinpic.com/img/aweme-avatar/...c5_300x300.jpeg?from=2956013662",
    "avatar168": "https://p26.douyinpic.com/img/aweme-avatar/...c5_168x168.jpeg",
    "avatarMedium": "https://p26.douyinpic.com/img/aweme-avatar/...c5_720x720.jpeg",
    "avatar300": "https://p26.douyinpic.com/img/aweme-avatar/...c5_300x300.jpeg",
    "bgImage": "https://p11-sign.douyinpic.com/obj/douyin-user-image-file/...?...",
    "shareQrCodeUri": "2f1f800070d01d38cc905",
    "followingCount": 15,
    "followersCount": 48875,
    "followersCountStr": "4.8万",
    "heartCount": 87153,
    "totalLikesReceived": 87153,
    "videoCount": 189,
    "awemeCount": 189,
    "likesGivenCount": 312,
    "videoPlayCount": null,
    "videoShareCount": null,
    "isLiving": false,
    "roomId": null,
    "isStar": false,
    "withShopEntry": false,
    "commerceUserLevel": 0,
    "ipLocation": "山东",
    "country": "CN",
    "gender": "unknown",
    "language": "zh-Hans",
    "userAge": 9,
    "birthday": null,
    "constellation": 1,
    "school": null,
    "usesSeries": true,
    "mcnInfo": null,
    "crossPlatform": null,
    "shareUrl": "https://www.iesdouyin.com/xg/user/1929015166249580"
  },
  "musicMeta": {
    "id": "7628905006464944923",
    "name": "@木木英语创作的原声",
    "author": "木木英语",
    "album": null,
    "isOriginal": true,
    "isPgc": false,
    "isCommerce": false,
    "duration": 221,
    "playUrl": "https://sf5-hl-ali-cdn-tos.douyinstatic.com/obj/ies-music/7628905080950901550.mp3",
    "coverThumb": "https://p11.douyinpic.com/aweme-avatar/...",
    "coverLarge": "https://p26.douyinpic.com/aweme/1080x1080/aweme-avatar/...",
    "owner": {
      "id": "1929015166249580",
      "handle": "63970939507",
      "nickname": "木木英语"
    }
  },
  "videoMeta": {
    "cover": "https://p11-sign.douyinpic.com/tos-cn-i-dy/40e0d6...~tplv-dy-resize.heic?...",
    "originCover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/oUeILU...~tplv-dy-360p.heic?...",
    "dynamicCover": "https://p11-sign.douyinpic.com/obj/tos-cn-i-dy/40e0d6...?...",
    "height": 1280,
    "width": 720,
    "ratio": "720p",
    "duration": 221937,
    "format": "mp4",
    "isLongVideo": false,
    "playUrl": "https://v95-hzyy-thr-daily-colda.douyinvod.com/.../?...",
    "downloadUrl": "https://v5-se-ws-cold.douyinvod.com/.../?...",
    "bitRates": [
      { "quality": "adapt_lowest_1080_1", "bitRate": 247531, "isH265": true, "fps": 30, "url": "https://..." },
      { "quality": "adapt_lower_540_1", "bitRate": 155050, "isH265": true, "fps": 30, "url": "https://..." }
    ],
    "isHdr": false,
    "hasWatermark": true,
    "cdnUrlExpiresAt": 1777883276
  },
  "images": [],
  "statistics": {
    "diggCount": 106,
    "shareCount": 14,
    "commentCount": 4,
    "collectCount": 47,
    "downloadCount": 1,
    "playCount": 0,
    "forwardCount": 0
  },
  "mentions": [],
  "hashtags": [
    { "id": "1664320797481997", "name": "英语听力训练" },
    { "id": "7541656378260408383", "name": "英语学习打卡" },
    { "id": "7402916912059680777", "name": "启蒙英语" }
  ],
  "videoTags": [
    { "name": "校园教育", "level": 1 },
    { "name": "考试考证", "level": 2 },
    { "name": "语言学习", "level": 3 }
  ],
  "authorDeclaration": "内容由 AI 生成",
  "hasAiLabel": true,
  "contentLabel": {
    "type": 44,
    "category": "ai_generated",
    "source": "author",
    "text": "内容由 AI 生成",
    "fullText": "作者声明：内容由 AI 生成",
    "explanation": "此提示语为“作者自主添加”，作者提示“该内容由人工智能生成技术(AIGC)创作”，并非真实事件。…",
    "shotDate": null,
    "shotPlace": null,
    "sourcedFrom": null
  },
  "chapters": [],
  "series": null,
  "location": {
    "id": "7245118392016537123",
    "name": "河北省图书馆",
    "category": "生活服务;文化场馆;图书馆",
    "address": "东大街22号",
    "district": "长安区",
    "city": "石家庄市",
    "province": "河北省",
    "country": "中国",
    "cityCode": "130100",
    "lat": 38.043941,
    "lng": 114.521967,
    "coverUrl": "https://p3-sign.douyinpic.com/obj/tos-cn-i-...",
    "viewCount": 8420,
    "itemCount": 213,
    "collectedCount": 64,
    "userCount": 156,
    "popularity": "327人想去"
  },
  "permissions": {
    "canDuet": true,
    "canStitch": false,
    "canDownload": false,
    "canShare": true,
    "canComment": true,
    "downloadBlockReason": "aigc_forbidden",
    "downloadBlockMessage": "作品含AI生成内容暂不可下载"
  },
  "crossPostedToXigua": false,
  "inputUrl": "1929015166249580"
}
```

### Important: URL Durability

Different URL types in the output have very different lifespans. Plan your downstream pipeline accordingly.

| Field | Lifespan | Note |
|---|---|---|
| `url` (canonical post URL) | **Permanent** | `https://www.douyin.com/video/<id>`, never expires. The reliable reference. |
| `shareUrl` | **Permanent** | `https://www.iesdouyin.com/share/video/<id>/`, also permanent. |
| `authorMeta.shareUrl`, `authorMeta.profileUrl` | **Permanent** | Profile share/canonical URLs. |
| `authorMeta.avatarThumb`, `authorMeta.avatarLarge` | **Permanent** | CDN-direct, no signature. |
| `musicMeta.playUrl`, `musicMeta.coverLarge` | **Permanent** | CDN-direct, no signature. |
| `thumb`, `videoMeta.cover`, `videoMeta.originCover`, `videoMeta.dynamicCover`, `images[].url`, `authorMeta.bgImage` | **~14–30 days** | Signed CDN URLs (`*-sign.douyinpic.com`). The query string holds the signature; download or re-upload to your own storage if you need them long-term. |
| `videoMeta.playUrl`, `videoMeta.downloadUrl`, `videoMeta.bitRates[].url` | **~1 hour** | Short-lived video CDN URLs. The exact expiry time is in **`videoMeta.cdnUrlExpiresAt`** (unix-seconds); check it before downloading. |

The `id` and `url` fields are the only truly permanent references. Build your downstream pipeline around them, then re-resolve fresh media URLs whenever you need them.

### Advanced Usage

#### Track follower growth across many creators (cheapest)

```json
{
  "profileUrls": ["1929015166249580", "75736792009", "..."],
  "maxPostsPerProfile": 0
}
```

One row per creator, no posts. Pair with a daily schedule to build a follower-tracking dashboard.

#### Pull only this week's posts from a creator

```json
{
  "profileUrls": ["MS4wLjABAAAAk1tZ-L085zZf2yW_H5dnVFZWyk8Rt8v4RAvf9KhTyPoVdMDxTs7Q_rvgTJGWXezS"],
  "maxPostsPerProfile": 500,
  "recentDays": 7
}
```

The actor stops fetching as soon as it crosses the 7-day boundary, so you only pay for posts within the window.

#### Bulk creator audit

```json
{
  "profileUrls": [
    "1929015166249580",
    "75736792009",
    "63485583690",
    "..."
  ],
  "maxPostsPerProfile": 30,
  "excludePinnedPosts": true
}
```

Fast snapshot of recent (non-pinned) activity across a list of creators. Up to 30 profiles run in parallel.

### Integrations and scheduling

Run the Douyin profiles scraper on a schedule in Apify Console, hourly or daily for brand and trend monitoring. Each run can call a webhook when it finishes, so n8n, Make and Zapier flows pick up new rows without polling. The Apify API and the Apify MCP server take the same input, for scripts and AI agents.

### Pricing: Pay Per Event (PPE)

**$6.99 per 1,000 results** (base price). Each row written to the dataset counts as one result, whether it's a post row or a profile-only row.

| Event | Per call | Per 1,000 |
|-------|----------|-----------|
| `result` (one dataset row) | $0.00699 | $6.99 |

### FAQ

**What is Douyin (抖音)?**
Douyin is ByteDance's Chinese short-video platform, the domestic counterpart of TikTok: same company and format, separate app and creator base. Its creators drive trends across China, and this actor captures their available public profile details and posts.

**What profile and post details are returned?**
Post mode combines captions, engagement, media links and available creator details in `authorMeta`. Profile-only mode (`maxPostsPerProfile: 0`) puts creator fields at the top level. See the output example above for the structure. Some fields can be empty when Douyin does not expose them. `statistics.playCount` is always `0` because Douyin does not publish play counts; a zero does not mean a post has no views. For exact play counts of ranked creators' top videos, use [Douyin (Xingtu) Creator Rankings](https://apify.com/zen-studio/douyin-xingtu-rankings-scraper) (`items[].playCount`).

**What types of profile inputs are accepted?**
Browser address-bar URLs (`/user/MS4w...`), app share links (`v.douyin.com/...`), legacy share URLs (`iesdouyin.com/share/user/<numeric>`), bare UserSecIDs (`MS4w...`), and bare numeric user IDs. You can mix all of them in one `profileUrls` array. The 抖音号 shown on a profile is not accepted — see the note under Accepted profile input formats.

**How fresh is the data?**
Live: every field is fetched on demand at run time. No caching.

**Do video URLs work after the run finishes?**
Image URLs (covers, avatars, image-post photos, profile background) stay valid for roughly 14–30 days. Video play URLs and download URLs are short-lived; they typically expire within hours. The post `url` (`https://www.douyin.com/video/<id>`) is permanent and is the safe long-term reference. See the URL Durability section above.

**What's the difference between `hashtags` and `videoTags`?**
`hashtags` are the `#tag`s the creator typed in the caption. `videoTags` is Douyin's own 3-level content classification; for example a video might be tagged `校园教育` (level 1, top-level category) → `考试考证` (level 2) → `语言学习` (level 3, leaf). The classification is server-assigned and is one of the more interesting signals on the platform.

**Can I get the 作者声明 (author declaration) and AI-generated labels?**
Yes, on every post. `authorDeclaration` is the label the creator chose, as Douyin shows it under the video without the "作者声明：" prefix (e.g. `"内容由 AI 生成"`, `"虚构演绎，仅供娱乐"`, `"个人观点，仅供参考"`), or null. `hasAiLabel` is a one-field filter for AI content: true when the creator declared it or Douyin marked it as AI-generated. `contentLabel` carries the full notice with a stable English `category` and a `source` of `author` or `platform`. Creator declarations: `ai_generated`, `fictional`, `personal_opinion`, `dangerous_act`, `reposted`, `sourced_online`, `may_disturb`, `shooting_time_place` (with `shotDate` and `shotPlace`). Douyin notices: `suspected_ai_generated`, `contains_ai_content`, `fictional`, `personal_opinion`, `risky_behavior`, `may_disturb`, `medical_reference`, `investment_risk`, `food_waste`, `professional_sport`, `ai_mini_program`, `source_not_stated`. A label we have not catalogued yet arrives as `other` with its text intact. Each post carries at most one notice.

**What's profile-only mode for?**
Setting `maxPostsPerProfile` to `0` returns just the creator's profile metadata: followers, following, total likes, video count, bio, avatar, region. One row per creator. Ideal for daily follower-tracking dashboards where post-level data isn't needed.

**Why did a profile (or my whole run) return 0 rows?**
Two common causes. The first is passing a **抖音号** instead of a user ID or profile URL: it is looked up as a user ID, matches nothing, and the run reports `could not be found (private, removed, or wrong ID/URL)` with the offending value named in the log. The second is a date filter. `oldestPostDate` and `recentDays` keep only posts inside the window you set, so a creator who hasn't posted in that window contributes no rows, and a run where none of the profiles posted in the window comes back empty. That is expected, not an error: the run still finishes successfully, and its status message reports how many profiles had no posts in the selected range. Widen or remove the date filter to reach their older posts, or set `maxPostsPerProfile: 0` (profile-only mode) to get each creator's profile data regardless of whether they posted recently.

**Why are some `username` fields empty?**
Not every Douyin creator has a `short_id` set on their profile; when they don't, that field comes back empty. The numeric `id` and the `secUid` are always present.

**Do I need a Douyin account or cookies?**
No. Paste profile URLs, share links, or IDs and run; no account, cookie export, or QR login is involved.

**How do I export the data?**
The dataset downloads as JSON, CSV, Excel, XML, or HTML from the run's Storage tab, or via the Apify API. JSON preserves the nested `authorMeta` object best.

**How do I find creators by keyword, or get their comments and videos?**
Chain the suite: [Douyin Search Scraper](https://apify.com/zen-studio/douyin-search-scraper) finds creators and posts by keyword, this actor returns their available profile details and posts, [Douyin Comments Scraper](https://apify.com/zen-studio/douyin-comments-scraper) pulls comment threads, and [Douyin Video Scraper](https://apify.com/zen-studio/douyin-video-scraper) fetches per-video metadata and MP4s.

**Can I scrape comments / followers / liked videos?**
Not in this actor; profile and posts only. Use [Douyin Comments Scraper](https://apify.com/zen-studio/douyin-comments-scraper) for comment threads; follower lists and liked videos are not exposed by Douyin's public profile surface.

**Is it legal to scrape Douyin profiles?**
The actor collects publicly visible profile and post data only, nothing behind a login. You are responsible for complying with Douyin's terms of service and applicable data protection law (GDPR, CCPA, PIPL); profiles are personal data, so check your legal basis before storing or republishing them.

**What's the maximum posts per profile?**
10,000. The vast majority of creators have fewer than 1,000 posts, so the cap rarely binds. Cost scales linearly with this value, so set what you actually need.

**Does the actor work for any Douyin creator?**
Public profiles only. Private accounts and accounts that have blocked external access are not addressable.

### More Zen Studio scrapers for Chinese platforms

- [Douyin Search Scraper](https://apify.com/zen-studio/douyin-search-scraper)
- [Douyin Video Scraper](https://apify.com/zen-studio/douyin-video-scraper)
- [Douyin Comments Scraper](https://apify.com/zen-studio/douyin-comments-scraper)
- [Douyin Transcripts Scraper](https://apify.com/zen-studio/douyin-transcripts-scraper)
- [Douyin Creator Rankings Scraper](https://apify.com/zen-studio/douyin-xingtu-rankings-scraper)

Also from the same studio (name, then `account/slug` for the URL `https://apify.com/account/slug`):

- Zhihu Scraper (`zen-studio/zhihu-scraper`)
- Sogou Baike Scraper (`zen-studio/sogou-baike-scraper`)
- Weibo Search Scraper (`zen-studio/weibo-search-scraper`)
- Weibo Comments Scraper (`zen-studio/weibo-comments-scraper`)
- Kwai Search Scraper (`zen-studio/kwai-search-scraper`)
- Kwai Comments Scraper (`zen-studio/kwai-comments-scraper`)
- Kuaishou Scraper (`zen-studio/kuaishou-scraper`)
- Douyin Live Recorder (`zen-studio/douyin-live-recorder`)
- Douyin Hot Search Scraper (`zen-studio/douyin-hot-search-scraper`)
- Douyin Product Search Scraper (`zen-studio/douyin-product-search-scraper`)
- Douyin User Search Scraper (`zen-studio/douyin-user-search-scraper`)
- RedNote User Profile Scraper (`zen-studio/rednote-user-profile-scraper`)
- RedNote Search Scraper (`zen-studio/rednote-search-scraper`)
- RedNote Comments Scraper (`zen-studio/rednote-comments-scraper`)
- RedNote Product Search Scraper (`zen-studio/rednote-product-search-scraper`)
- RedNote Note Detail Scraper (`zen-studio/rednote-note-detail-scraper`)
- RedNote Product Reviews Scraper (`zen-studio/rednote-product-reviews-scraper`)
- RedNote Live Recorder (`zen-studio/rednote-live-recorder`)
- Xigua Video Search Scraper (`zen-studio/xigua-video-search-scraper`)
- Xigua Video Detail Scraper (`zen-studio/xigua-video-detail-scraper`)
- Bilibili Video Scraper (`zen-studio/bilibili-video-scraper`)
- Bilibili Danmaku Scraper (`zen-studio/bilibili-danmaku-scraper`)
- Naver Search Scraper (`zen-studio/naver-search-scraper`)
- Shopee Product Detail Scraper (`zen-studio/shopee-product-detail-scraper`)
- Shopee Product Reviews Scraper (`zen-studio/shopee-product-reviews-scraper`)
- Shopee Product Scraper (`zen-studio/shopee-product-scraper`)
- Taobao Search Scraper (`zen-studio/taobao-search-scraper`)
- Taobao Product Detail Scraper (`zen-studio/taobao-detail-scraper`)
- Taobao Seller Products Scraper (`zen-studio/taobao-seller-products-scraper`)
- JD.com Search Scraper (`zen-studio/jd-com-search-scraper`)
- 1688 Wholesale Scraper (`zen-studio/1688-wholesale-scraper`)
- Alibaba Scraper (`zen-studio/alibaba-scraper`)
- 1688 Reviews Scraper (`zen-studio/1688-reviews-scraper`)
- Weidian Scraper (`zen-studio/weidian-scraper`)
- Goofish (Xianyu) Search Scraper (`zen-studio/goofish-xianyu-search-scraper`)
- Goofish (Xianyu) Seller Scraper (`zen-studio/goofish-xianyu-seller-scraper`)
- Goofish (Xianyu) Item Detail Scraper (`zen-studio/goofish-xianyu-item-detail-scraper`)
- Goofish (Xianyu) Item Comments & Q\&A Scraper (`zen-studio/goofish-xianyu-item-comments-scraper`)
- Goofish (Xianyu) Reverse Image Search Scraper (`zen-studio/goofish-xianyu-visual-search-scraper`)
- Coupang Review Scraper (`zen-studio/coupang-review-scraper`)
- Coupang Search Scraper (`zen-studio/coupang-search-scraper`)
- Coupang Product Detail Scraper (`zen-studio/coupang-detail-scraper`)
- Anjuke For-Sale Listings Scraper (`zen-studio/anjuke-real-estate-scraper`)
- Anjuke New-Home Scraper (`zen-studio/anjuke-new-home-scraper`)
- Anjuke Rental Listings Scraper (`zen-studio/anjuke-rent-scraper`)
- Anjuke Listing Detail Scraper (`zen-studio/anjuke-sale-detail-scraper`)
- 58.com Real Estate Scraper (`zen-studio/58-real-estate-scraper`)
- Autohome (Che168) Used-Car Scraper (`zen-studio/che168-car-scraper`)
- Mafengwo Reviews Scraper (`zen-studio/mafengwo-reviews-scraper`)

Full directory: [Zen Studio on Apify](https://apify.com/zen-studio)

### Support

- **Bugs**: Issues tab
- **Features**: Issues tab

### Legal Compliance

Extracts publicly available data from Douyin (抖音). Users must comply with Douyin's terms of service and applicable data protection regulations (GDPR, CCPA, PIPL).

***

*Structured Douyin profile + post data: followers, engagement, video tags, music, bio. For any creator, in clean JSON.*

# Actor input Schema

## `profileUrls` (type: `array`):

Add one or more Douyin profiles (抖音主页) you want to scrape.<br><br>Accepted formats:<ul><li>Browser address bar: <code>https://www.douyin.com/user/MS4wLj...</code></li><li>App share link: <code>https://v.douyin.com/iAbc123/</code></li><li>Legacy share: <code>https://www.iesdouyin.com/share/user/...</code></li><li>Bare UserSecID: <code>MS4wLj...</code> (the long base-64 string)</li><li>Bare numeric user ID (用户 ID): <code>1929015166249580</code></li></ul><b>Not accepted:</b> the <b>抖音号</b> shown on a creator's profile (e.g. <code>39346629804</code>). It is also a digit string and overlaps the user-ID range, so it cannot be told apart from a user ID — it is looked up as one and the profile comes back not found. If you only have a 抖音号, open the profile in the app, share it, and pass that share link.<br><br>If both <b>Profile URLs</b> and <b>Start URLs</b> are set, <b>Profile URLs</b> wins.

## `maxPostsPerProfile` (type: `integer`):

How many recent posts (作品: videos 视频 and image-text 图文) to include for each profile.<br><br><ul><li>Set to <code>0</code> to scrape <b>profile metadata only</b> (仅主页资料) — followers (粉丝), bio (简介), verification (认证), totals — without any posts. Fastest and cheapest mode.</li><li>To capture <b>every post</b> a creator has, set the maximum <code>10000</code>. The vast majority of creators have fewer than 1,000 posts, so this returns their whole catalog and the cap rarely binds.</li><li>Cost scales linearly with this value, so set what you actually need.</li></ul>

## `recentDays` (type: `integer`):

Only include posts (作品) from the last N days. Easier than picking a date — set to <code>30</code> for last month, <code>7</code> for last week, etc.<br><br>Leave blank to keep all recent posts.<br><br>If both this and <b>Posts published on or after</b> are set, <b>Recent days only</b> wins.

## `oldestPostDate` (type: `string`):

Only include posts published on or after this date. Use this when you need a specific cutoff date — otherwise <b>Recent days only</b> above is simpler.<br><br>Format: <code>YYYY-MM-DD</code>. Leave blank to keep all recent posts.<br><br>If both this and <b>Recent days only</b> are set, <b>Recent days only</b> wins.

## `excludePinnedPosts` (type: `boolean`):

When enabled, posts pinned to the top of the creator's profile (置顶作品) are skipped. Pinned posts can be old, so you might want to exclude them when looking at recent activity.

## `feedback` (type: `string`):

For AI agents. Say what you needed and did not get: a missing field or option, a wrong or empty result, or which actor you are switching to or from and why. Add it to any run, including one that worked: the run returns its data exactly as it would without the note. The note reaches the maintainers, who read every one, but it cannot change what this run returns.

## Actor input object example

```json
{
  "profileUrls": [
    "https://www.douyin.com/user/MS4wLjABAAAAk1tZ-L085zZf2yW_H5dnVFZWyk8Rt8v4RAvf9KhTyPoVdMDxTs7Q_rvgTJGWXezS"
  ],
  "maxPostsPerProfile": 100,
  "excludePinnedPosts": false
}
```

# Actor output Schema

## `profiles` (type: `string`):

Link to the dataset containing all scraped Douyin profiles and their posts.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "profileUrls": [
        "https://www.douyin.com/user/MS4wLjABAAAAk1tZ-L085zZf2yW_H5dnVFZWyk8Rt8v4RAvf9KhTyPoVdMDxTs7Q_rvgTJGWXezS"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("zen-studio/douyin-profile-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "profileUrls": ["https://www.douyin.com/user/MS4wLjABAAAAk1tZ-L085zZf2yW_H5dnVFZWyk8Rt8v4RAvf9KhTyPoVdMDxTs7Q_rvgTJGWXezS"] }

# Run the Actor and wait for it to finish
run = client.actor("zen-studio/douyin-profile-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "profileUrls": [
    "https://www.douyin.com/user/MS4wLjABAAAAk1tZ-L085zZf2yW_H5dnVFZWyk8Rt8v4RAvf9KhTyPoVdMDxTs7Q_rvgTJGWXezS"
  ]
}' |
apify call zen-studio/douyin-profile-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,zen-studio/douyin-profile-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/043Hpy7gVQvWCOivr/builds/tRouoUqLudZ7NzSJH/openapi.json
