Douyin Collection API — A Whole Series (合集)
Documentation menu
FetchLayer FetchLayer API

Every video in a collection

Every video in one collection (合集), in episode order, with the collection’s total plays and saves. Start from the collection’s id or link, or any video in it. Up to 500 in one request, continuing with a cursor. 1 credit per 15 videos.

POST /collection-videos Videos
https://api.fetchlayer.dev/douyin/collection-videos
OpenAPI JSON

Headers

Authorization string required

Bearer token — your FetchLayer API key.

Parameters

collection string optional

A collection id (as in any video’s collection.id) or a douyin.com/collection/... link. Give this or video, not both.

video string optional

Any video in the collection (id or link); its collection is used. A video in no collection is a 404.

limit integer optional

Maximum videos, up to 500, or -1 for the whole collection. Videos come 15 to a page and each page is 1 credit. (default: 50)

cursor string optional

The cursor from a previous response, passed back unchanged with the same request, to continue exactly where it stopped. Treat it as opaque: a cursor from another route, video or collection, or one this service did not issue, is a 400 naming cursor.

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

collection-videos

Every video in a collection

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.

collection.id string

The collection’s id.

collection.name string

Its name.

collection.description string | null

Its description.

collection.episodeCount number

Episodes in it.

collection.playCount number

Total plays across the collection, which Douyin publishes for collections.

collection.saveCount number

Total saves.

collection.author object

The account that made it.

collection.createdAt string

When it was created; updatedAt is when it last changed.

collection.url string

Link to it.

videos object[]

The videos in episode order, each with collection.episode set.

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.

pagesFetched number

Pages read, 15 videos to a page, which is what the request costs: one credit per page.

hasMore boolean

Whether more videos remain.

cursor string | null

Pass back as cursor, with the same request, to continue exactly where this response stopped. null when there is nothing further.

Request

curl -X POST "https://api.fetchlayer.dev/douyin/collection-videos" \
  -H "Authorization: Bearer ss-your-key" \
  -H "Content-Type: application/json" \
  -d '{"collection":"7640462496620349491","limit":-1}'

Response

{
  "transport": "douyin",
  "fetchedAt": "2026-10-15T15:54:18.837Z",
  "notes": [
    "Douyin does not publish play counts, so stats.plays is always null."
  ],
  "collection": {
    "id": "7640462496620349491",
    "name": "原创AI《这是我的世界》第一季|异世界篇",
    "episodeCount": 18,
    "playCount": 57660398,
    "saveCount": 635035,
    "createdAt": "2026-05-16T12:16:40.000Z",
    "updatedAt": "2026-09-02T13:40:12.000Z",
    "url": "https://www.douyin.com/collection/7640462496620349491"
  },
  "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": 397848,
        "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": 18,
  "pagesFetched": 2,
  "hasMore": false,
  "cursor": null
}