How to export Douyin video comments in bulk
3 endpoints do it: Douyin video search → Douyin video comments → Douyin comment replies. The worked example below is 12 calls and costs $0.0420 in all; a failed call is not charged.
Search Douyin for videos on a keyword, take the comments under each video page by page, then open the replies of the busiest comments. You end up with one table of comments: text, commenter, likes, replies and time posted.
Step 1: Douyin video search
Get a page of videos for your search terms. sort orders them by newest or most liked, and published_within keeps only those of the last day, week or half year. Each item's id is the video ID the next step takes; metrics.comments is its comment count, so you can start with the busiest.
curl -G "https://api.dataxapi.com/v1/douyin/videos/search" \ --data-urlencode "query=露营" \ -H "Authorization: Bearer $DATAXAPI_API_KEY"
from dataxapi import DataXAPI dx = DataXAPI() # reads DATAXAPI_API_KEY result = dx.douyin.videos.search(query="露营") print(result["data"]["items"])
import { DataXAPI } from "@dataxapi/sdk";
const dx = new DataXAPI(); // reads DATAXAPI_API_KEY
const result = await dx.douyin.videos.search({ query: "露营" });
console.log(result.data.items);dataxapi call douyin.videos.search 'query=露营'{
"code": "ok",
"request_id": "c4c779e7-8730-415a-ab8b-2439d70fb51a",
"data": {
"items": [
{
"id": "7732320280216651754",
"url": "https://www.douyin.com/video/7732320280216651754",
"type": "video",
"title": null,
"text": "周末的露营日常,随手记录一下",
"lang": "zh",
"published_at": "2026-09-11T01:32:11.000Z",
"author": {
"id": "MS4wLjABAAAAWo9vAvyTzp3sb2-krZmkriyZuGbWt-p4togQvkClUpj",
"username": "weekend_lin",
"name": "小林的周末",
"avatar_url": "https://p3-pc.douyinpic.com/aweme/100x100/aweme-avatar/tos-cn-avt-0015_ec931a72ca043f30fa7e.jpeg",
"followers": 2525
},
"metrics": {
"likes": 96505,
"comments": 2219,
"shares": 60467,
"favorites": 7038
},
"images": null,
"hashtags": ["户外生活", "好物分享"]
},
// … 6 more
]
},
"page": {
"next_cursor": "c1.ts-YHxldZuVXCxH6Gev5iQGlxtlGILU8V8n9tjjp",
"cursor_expires_at": "2026-10-12T20:01:55.000Z",
"has_more": true,
"returned": 7
},
"warnings": [],
"meta": {
"capability": "douyin.videos.search",
"result_status": "complete",
"fetched_at": "2026-10-12T19:01:55.000Z",
"cached": false,
"replayed": false,
"unavailable": {
"metrics.views": "capability",
"metrics.reposts": "platform",
"author.verified": "capability",
"mentions": "capability",
"post_id": "platform",
"parent_id": "platform",
"root_id": "platform",
"is_pinned": "capability"
},
"billing": {
"amount": "0.02",
"currency": "USD",
"balance_after": "9.98"
}
}
}From a response recorded 2026-10-12 19:01 UTC. Names, text and IDs are examples, and so are the links: none is the recorded one (the page shows no one's personal data); the figures are as recorded. Long lists are cut. The request ID, cursor and balance are made up.
Douyin video search · $0.0200 / a call · Parameters, fields and errors on the endpoint's page →
Step 2: Douyin video comments
Put the video ID into id and get up to 20 comments a page. For the next page, call again with the answer's page.next_cursor as cursor. Each comment's id and post_id, with its reply count in metrics.comments, go into the next step.
curl -G "https://api.dataxapi.com/v1/douyin/videos/comments/list" \ --data-urlencode "id=7694940173372575014" \ -H "Authorization: Bearer $DATAXAPI_API_KEY"
from dataxapi import DataXAPI dx = DataXAPI() # reads DATAXAPI_API_KEY result = dx.douyin.videos.comments.list(id="7694940173372575014") print(result["data"]["items"])
import { DataXAPI } from "@dataxapi/sdk";
const dx = new DataXAPI(); // reads DATAXAPI_API_KEY
const result = await dx.douyin.videos.comments.list({ id: "7694940173372575014" });
console.log(result.data.items);dataxapi call douyin.videos.comments.list id=7694940173372575014
{
"code": "ok",
"request_id": "d42da88d-b7ed-4b0d-9190-4b171bfc73ad",
"data": {
"items": [
{
"id": "7544703737319021316",
"text": "拍得好舒服,看了好几遍",
"published_at": "2026-10-10T07:45:43.000Z",
"author": {
"id": "MS4wLjABAAAASYaIbhAX0MPyFQ_-aWJ7QWUFF8a5fMOppwdnFl0eOFd",
"username": "nanfeng_0721",
"name": "南边的风",
"avatar_url": "https://p3-pc.douyinpic.com/aweme/100x100/aweme-avatar/tos-cn-avt-0015_ec3a5fcd08ca5afb5397.jpeg"
},
"metrics": { "likes": 8622, "comments": 1 },
"post_id": "7654977487690830406",
"parent_id": null,
"root_id": null
},
// … 19 more
]
},
"page": {
"next_cursor": "c1.WJBi7NXZjb_3e9vNCUTP2jkcLJBy9Nk7njwbaUrK",
"cursor_expires_at": "2026-10-10T14:56:58.000Z",
"has_more": true,
"returned": 20
},
"warnings": [],
"meta": {
"capability": "douyin.videos.comments.list",
"result_status": "complete",
"fetched_at": "2026-10-10T13:56:58.000Z",
"cached": false,
"replayed": false,
"unavailable": { "url": "platform" },
"billing": {
"amount": "0.002",
"currency": "USD",
"balance_after": "9.998"
}
}
}From a response recorded 2026-10-10 13:56 UTC. Names, text and IDs are examples, and so are the links: none is the recorded one (the page shows no one's personal data); the figures are as recorded. Long lists are cut. The request ID, cursor and balance are made up.
Douyin video comments · $0.0020 / a call · Parameters, fields and errors on the endpoint's page →
Step 3: Douyin comment replies
For a comment with many replies, put its id into id and its post_id into post_id to get the replies under it, up to 20 a page, paged the same way as the comments.
curl -G "https://api.dataxapi.com/v1/douyin/comments/replies/list" \ --data-urlencode "id=7655660369926603557" \ --data-urlencode "post_id=7655283400210664719" \ -H "Authorization: Bearer $DATAXAPI_API_KEY"
from dataxapi import DataXAPI dx = DataXAPI() # reads DATAXAPI_API_KEY result = dx.douyin.comments.replies.list(id="7655660369926603557", post_id="7655283400210664719") print(result["data"]["items"])
import { DataXAPI } from "@dataxapi/sdk";
const dx = new DataXAPI(); // reads DATAXAPI_API_KEY
const result = await dx.douyin.comments.replies.list({ id: "7655660369926603557", post_id: "7655283400210664719" });
console.log(result.data.items);dataxapi call douyin.comments.replies.list id=7655660369926603557 post_id=7655283400210664719
{
"code": "ok",
"request_id": "c6f871dc-f926-49f9-b383-d8541be44b5f",
"data": {
"items": [
{
"id": "7281542808761380598",
"text": "第三个建议太实用了!",
"published_at": "2026-06-26T11:50:22.000Z",
"author": {
"id": "MS4wLjABAAAA_p_ZcarAlfQSUXheWfou6Urggj6nSw5RWztBuPbTGeE",
"username": "nanfeng_0721",
"name": "南边的风",
"avatar_url": "https://p3-pc.douyinpic.com/aweme/100x100/aweme-avatar/tos-cn-avt-0015_40a6ed26a1d5485803fe.jpeg"
},
"metrics": { "likes": 2308 },
"post_id": "7235042234252823683",
"parent_id": "7808984148800124107",
"root_id": "7288185174927937448"
},
// … 19 more
]
},
"page": {
"next_cursor": "c1.p2cQ0s_d9x_R4AqMMpd5I1gJ1SR4-Ep_ZmuWuU3t",
"cursor_expires_at": "2026-10-12T19:59:36.000Z",
"has_more": true,
"returned": 20
},
"warnings": [],
"meta": {
"capability": "douyin.comments.replies.list",
"result_status": "complete",
"fetched_at": "2026-10-12T18:59:36.000Z",
"cached": false,
"replayed": false,
"unavailable": { "url": "platform", "metrics.comments": "platform" },
"billing": {
"amount": "0.002",
"currency": "USD",
"balance_after": "9.998"
}
}
}From a response recorded 2026-10-12 18:59 UTC. Names, text and IDs are examples, and so are the links: none is the recorded one (the page shows no one's personal data); the figures are as recorded. Long lists are cut. The request ID, cursor and balance are made up.
Douyin comment replies · $0.0020 / a call · Parameters, fields and errors on the endpoint's page →
What the example costs
One page of search results (8 videos), the first page of comments under each, then the replies under 3 of those comments
Prices are the prices in force when this page was built. A failed call, and an object that does not exist, cost nothing.
In your AI (MCP)
Connect DataXAPI to your AI client once. Then say what you want; the agent finds these endpoints, checks the price and calls them on your balance.
{
"capability": "douyin.videos.search",
"query": "露营",
"idempotency_key": "<a new UUID>"
}Sign in to copy the setup prompt with your keyAbout the MCP server →
With a Skill
Good to know
- Comments and replies come up to 20 a page. A
page.next_cursoris good for an hour: use it within that time to go on. - A video that does not exist cannot be told from a video without comments: both return an empty result, and an empty result is charged like a page with data. The replies endpoint works the same way.
- Search results carry no view count (
metrics.views) and comments have no link of their own (url);meta.unavailablelists them. For the commenter's IP location, addview=fulland readext.ip_location.