TikTok comments are the top-level replies on one video, 20 per page. You pass the video id or a video url, plus cursor when you already have one. The sample video is 7106594312292453675. total is 1,269, hasMore is true, and the next cursor is the string 20. The first comment is “Tiktok and Minecraft??” from awwmanbro. The second is “15?” with 156 likes and 4 replies.
👉 To access this endpoint, you must obtain an API key: https://steadyapi.com/register
Authentication
Every call uses a Bearer token from your SteadyAPI dashboard.
Documentation:
https://docs.steadyapi.com/#authenticating-requests
headers = {
'Authorization': 'Bearer YOUR_API_KEY'
}
Where this fits
The video id comes from GET /v1/tiktok/video/info. On that call, stats.comments for this id is also 1,269. A comment with replyCount greater than 0 is the parent for GET /v1/tiktok/video/comment-replies. The “15?” comment id 7106606555949433646 is the sample commentId for that replies call. The comment author’s username can go to GET /v1/tiktok/user/info. Do not send a comment id as the video id.
Read TikTok video comments
Endpoint: GET /v1/tiktok/video/comments
Documentation:
https://docs.steadyapi.com/tiktok/#tiktok-GETapi-v1-tiktok-video-comments
Parameters
id— required unlessurlis set. 15 to 21 digits (example:7106594312292453675)url— required unlessidis set. A TikTok video linkcursor— optional integer, default0, max 100000. Use the cursor from the previous page
The first page omits cursor or sends 0. meta.cursor is that request value, as a number. body.cursor is the next page, and in the sample it is the string 20. Pass 20 on the following request. Each page holds up to 20 comments. The same video and cursor within 5 minutes returns the cached page. A video with no comments, or a video id that does not exist, still returns comments as an empty list. A failed fetch is a different 200: success false and the message No data returned.
Python
import requests
url = "https://api.steadyapi.com/v1/tiktok/video/comments"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
response = requests.get(url, headers=headers, params={"id": "7106594312292453675", "cursor": 0})
response.raise_for_status()
body = response.json().get("body") or {}
print(body.get("total"), body.get("cursor"), body.get("hasMore"))
for comment in body.get("comments") or []:
author = comment.get("author") or {}
print(comment.get("id"), author.get("username"), comment.get("likes"), comment.get("replyCount"))
Annotated sample
{
"total": 1269,
"cursor": "20",
"hasMore": true,
"comments": [
{
"id": "7128453658077397765",
"text": "Tiktok and Minecraft??",
"createTime": "2022-08-05T18:01:11Z",
"likes": 3,
"replyCount": 0,
"pinned": false,
"author": { "username": "awwmanbro", "nickname": "a" }
},
{
"id": "7106606555949433646",
"text": "15?",
"likes": 156,
"replyCount": 4,
"author": { "username": "0_.preppy._.vids._0" }
}
]
}
Store each comment id. total is 1,269, the size of the thread, not the length of this page. The first row has 3 likes and replyCount 0, so there is no replies call to make for it. The second row’s id is the one to pass as commentId, because replyCount is 4. pinned and likedByAuthor are false on these rows. createTime is UTC. Comment authors include id, username, and nickname. They do not include verified. That flag is on the profile and on the video’s author.
Practical use
Stop when hasMore is false. While it is true, send body.cursor as the next cursor. The first response’s cursor string 20 means the following page, not a comment id.
An empty comments list is a normal body. Do not treat it as Video not found. That message belongs to the video endpoint. No data returned means the fetch failed and there is no body to page.
replyCount is how many replies exist. The reply text is the comment-replies call, using the video id and this comment’s id.
👉 Get your API key and read TikTok comments: https://steadyapi.com/register