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.
/collection-videos Videos https://api.fetchlayer.dev/douyin/collection-videos 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
}