Douyin User Videos API — An Account’s Recent Videos
Documentation menu
FetchLayer FetchLayer API

List an account’s recent videos

An account’s most recent videos, newest first: up to about 41, in one response, with no cursor for older ones. olderVideosExist says when the account has more; older videos in a collection can be read with collection-videos. 1 credit.

POST /user-videos Accounts
https://api.fetchlayer.dev/douyin/user-videos
OpenAPI JSON

Headers

Authorization string required

Bearer token — your FetchLayer API key.

Parameters

user string required

An account: its sec_uid (starts with MS4wLjAB), a douyin.com/user/... link, or a v.douyin.com share link to the profile.

limit integer optional

Maximum videos, up to 50, or -1. Left out, every video shown (about 41).

format string optional

json or markdown, lowercase; any other value is a 400. Over MCP, markdown returns the result rendered as text; the REST API accepts it and returns JSON. (default: json)

timeoutMs integer optional

Time limit for the whole request, in milliseconds (1000–120000); a value outside that range is a 400. Where possible a partial answer comes back with a note; a request with nothing to return yet fails with a 503 you can retry, marked with the response header X-Timeout-Source: caller.

Response Fields

user-videos

List an account’s recent videos

transport string

The data source: always the platform id, "douyin".

fetchedAt string

When the data was read (ISO 8601).

notes string[]

Caveats you can act on, such as older videos existing beyond the list. Empty when there are none.

secUid string

The account’s sec_uid.

videos object[]

The videos, newest first.

videos[].id string

The video id, which every route that takes a video accepts.

videos[].url string

Link to the video on douyin.com.

videos[].kind string

"video", or "images" for an image post.

videos[].description string

The caption.

videos[].createdAt string

When it was posted (ISO 8601); createTime is the same moment in unix seconds.

videos[].durationMs number | null

Length of a video, in milliseconds.

videos[].hashtags object[]

{ name, id } for each hashtag; the id works with hashtag-detail.

videos[].stats object

likes, comments, shares and saves — exact integers. plays is always null: Douyin does not publish play counts.

videos[].author object

uid, secUid, uniqueId (抖音号), nickname, avatarUrl, followerCount, verification and profileUrl. followerCount is null on this list, which means not on this answer, never zero; user-profile has it.

videos[].music object | null

{ id, title, author } of the sound.

videos[].coverUrl string | null

Cover image. Douyin’s media links expire after a while.

videos[].playUrl string | null

The video stream. Expires after a while.

videos[].imageUrls string[]

The images of an image post; empty for a video.

videos[].isAd boolean

Whether Douyin marks it as an ad.

videos[].pinned boolean

Whether the author pinned it to their profile.

videos[].collection object | null

The collection (合集) it belongs to: { id, name, episode }, or null. The id works with collection-videos.

videos[].shareUrl string | null

Douyin’s share link for it.

videoCount number

How many videos are in this response.

skippedRecords object[]

Items Douyin listed that could not be returned whole, each as { id, reason, fieldsPresent }; id may be null. Normally empty.

olderVideosExist boolean

True when the account has older videos than this list reaches; notes says so too.

Request

curl -X POST "https://api.fetchlayer.dev/douyin/user-videos" \
  -H "Authorization: Bearer ss-your-key" \
  -H "Content-Type: application/json" \
  -d '{"user":"https://www.douyin.com/user/MS4wLjABAAAAYOEVkUXnngwqKUvaFEGdZWxDxUD6cEbk7zYTJGMrqPA","limit":10}'

Response

{
  "transport": "douyin",
  "fetchedAt": "2026-10-15T15:54:21.896Z",
  "notes": [
    "Douyin does not publish play counts, so stats.plays is always null."
  ],
  "secUid": "MS4wLjABAAAAYOEVkUXnngwqKUvaFEGdZWxDxUD6cEbk7zYTJGMrqPA",
  "videos": [
    {
      "id": "7665908051974704410",
      "url": "https://www.douyin.com/video/7665908051974704410",
      "kind": "video",
      "description": "1-8合集《这是我的世界》第一季|异世界篇 …",
      "createdAt": "2026-07-24T01:58:31.000Z",
      "createTime": 1784858311,
      "durationMs": 2574891,
      "hashtags": [
        {
          "name": "这是我的世界",
          "id": "1587906243760205"
        }
      ],
      "stats": {
        "likes": 356766,
        "comments": 6899,
        "shares": 90087,
        "saves": 176104,
        "plays": null
      },
      "author": {
        "uid": "593384953094045",
        "secUid": "MS4wLjABAAAAYOEVkUXnngwqKUvaFEGdZWxDxUD6cEbk7zYTJGMrqPA",
        "uniqueId": "Mom2024017",
        "nickname": "林杉导演AIGC",
        "followerCount": null,
        "verification": null,
        "profileUrl": "https://www.douyin.com/user/MS4wLjABAAAAYOEVkUXnngwqKUvaFEGdZWxDxUD6cEbk7zYTJGMrqPA"
      },
      "music": {
        "id": "7665909117738830598",
        "title": "@林杉导演AIGC创作的原声",
        "author": "林杉导演AIGC"
      },
      "width": 2208,
      "height": 936,
      "imageUrls": [],
      "isAd": false,
      "pinned": false,
      "collection": {
        "id": "7640462496620349491",
        "name": "原创AI《这是我的世界》第一季|异世界篇",
        "episode": 11
      }
    }
  ],
  "videoCount": 10,
  "olderVideosExist": false
}