TikTok
TikTok data via Wire — profiles, videos, comments, keyword search and transcripts as structured JSON
https://api.anakin.io/v1/wire/taskProfiles, videos, comments, keyword search and transcripts. Every TikTok action is a Wire action: call POST /v1/wire/task with the action_id and params below, then poll GET /v1/wire/jobs/{id} (or pass a webhook_url). All actions read public data — no login, no cookies, auth_mode: none.
Catalog: tiktok · Actions: 6 · Auth: none · Billing: only successful calls are charged
| Action | action_id | Credits | Returns |
|---|---|---|---|
| Profile | tiktok_profile | 2 | 1 item |
| User Videos | tiktok_user_videos | 2 | 10 videos per page |
| Video Details | tiktok_video_detail | 2 | 1 item |
| Video Comments | tiktok_video_comments | 2 | 14 comments per page |
| Keyword Search | tiktok_keyword_search | 2 | 30 videos per page |
| Video Transcript | tiktok_transcript | 2 | 1 item |
Credits marked + grow with limit — the exact formula is on each action. See Pricing for what a credit costs on your plan.
Call a TikTok action
The same call works for every action on this page — swap action_id and params.
curl -X POST https://api.anakin.io/v1/wire/task \
-H "X-API-Key: your_api_key" \
-H "Content-Type: application/json" \
-d '{"action_id": "tiktok_profile", "params": {"username": "khaby.lame"}}'import requests, time
res = requests.post('https://api.anakin.io/v1/wire/task', headers={'X-API-Key': 'your_api_key'},
json={"action_id": "tiktok_profile", "params": {"username": "khaby.lame"}})
job_id = res.json()['job_id']
while True: # poll until the job settles (or pass webhook_url and skip this)
job = requests.get(f'https://api.anakin.io/v1/wire/jobs/{job_id}', headers={'X-API-Key': 'your_api_key'}).json()
if job['status'] in ('completed', 'failed'):
break
time.sleep(2)
print(job['data']['data'])const headers = { 'X-API-Key': 'your_api_key', 'Content-Type': 'application/json' };
const res = await fetch('https://api.anakin.io/v1/wire/task', { method: 'POST', headers, body: JSON.stringify({"action_id": "tiktok_profile", "params": {"username": "khaby.lame"}}) });
const { job_id } = await res.json();
let job;
do { // poll until the job settles (or pass webhook_url and skip this)
await new Promise((r) => setTimeout(r, 2000));
job = await (await fetch(`https://api.anakin.io/v1/wire/jobs/${job_id}`, { headers })).json();
} while (!['completed', 'failed'].includes(job.status));
console.log(job.data.data);The job result wraps the action's output: data.status is "ok" or "error", and data.data holds the fields shown under each action below. See the overview for the full envelope.
Profile
Get a public TikTok profile: username, display name, bio, verified badge, follower, following, like and video counts, and avatar.
action_id: tiktok_profile · Credits: 2 / call · Returns: 1 item
| Parameter | Type | Description |
|---|---|---|
action_id required | string | Set to tiktok_profile |
params.username required | string | TikTok username (with or without @) or profile URL. |
Request
{
"action_id": "tiktok_profile",
"params": {
"username": "khaby.lame"
}
}Response — data.data of the completed job (trimmed):
{
"username": "khaby.lame",
"nickname": "Khabane lame",
"user_id": "127905465618821121",
"bio": "Se vuoi ridere sei nel posto giusto😎 If u wanna laugh u r in the right place😎",
"verified": true,
"followers": 163000000,
"following": 81,
"likes": 2700000000,
"videos": 1358,
"avatar_url": "https://p16-common-sign.tiktokcdn-us.com/tos-useast8-avt-0068-tx2/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:1080:1080.jpeg?…",
"profile_url": "https://www.tiktok.com/@khaby.lame"
}User Videos
Get a TikTok user's latest videos, one full page (about 10) per call: link, caption, post date, length, plays, likes, comments, shares, saves, cover image and sound. Use cursor for older videos.
action_id: tiktok_user_videos · Credits: 2 / call · Returns: 10 videos per page
| Parameter | Type | Description |
|---|---|---|
action_id required | string | Set to tiktok_user_videos |
params.username required | string | TikTok username (with or without @) or profile URL. |
params.cursor | string | Leave empty for the first page. For the next page, pass the next_cursor value from the previous response (next_cursor is null when there are no more). |
Request
{
"action_id": "tiktok_user_videos",
"params": {
"username": "khaby.lame"
}
}Response — data.data of the completed job (trimmed):
{
"username": "khaby.lame",
"videos": [
{
"video_id": "7694335322922044703",
"url": "https://www.tiktok.com/@khaby.lame/video/7694335322922044703",
"description": "Was the ball out, or was it just my imagination? 🤨#learnfromkhaby #comedy ",
"created_at": "2026-10-08T16:31:16Z",
"duration_s": 31,
"plays": 5625537,
"likes": 629335,
"comments": 11537,
"shares": 19522,
"saves": 36780,
"cover_url": "https://p16-common-sign.tiktokcdn-eu.com/tos-useast8-p-0068-tx2/osAHzWAIipBAxVMie5CIDqxK0ArEREAAEKVSfn~tplv-tiktokx-cropcenter-q:300:400:q70.heic?…",
"music": null,
"author_username": "khaby.lame",
"author_nickname": "Khabane lame"
},
{
"video_id": "7691740195418377502",
"url": "https://www.tiktok.com/@khaby.lame/video/7691740195418377502",
"description": "Just give me 5 more minutes 😭#learnfromkhaby #comedy ",
"created_at": "2026-10-01T16:40:54Z",
"duration_s": 35,
"plays": 4114587,
"likes": 372807,
"comments": 6657,
"shares": 22674,
"saves": 17458,
"cover_url": "https://p16-common-sign.tiktokcdn-eu.com/tos-useast8-p-0068-tx2/o0jRDQRMAbfFAlZX8eqGQcARBqerRfAHR7gVSU~tplv-tiktokx-cropcenter-q:300:400:q70.heic?…",
"music": null,
"author_username": "khaby.lame",
"author_nickname": "Khabane lame"
},
"… 8 more"
],
"count": 10,
"next_cursor": "1787070894791",
"message": null
}Paging: the first call returns
next_cursor; pass it back ascursorfor the next page (nullwhen there are no more). Each page is a new call.
Video Details
Get the details of one TikTok video: caption, post date, length, plays, likes, comments, shares, saves, cover image, sound and author.
action_id: tiktok_video_detail · Credits: 2 / call · Returns: 1 item
| Parameter | Type | Description |
|---|---|---|
action_id required | string | Set to tiktok_video_detail |
params.video_url required | string | Link to the TikTok video (https://www.tiktok.com/@user/video/...). |
Request
{
"action_id": "tiktok_video_detail",
"params": {
"video_url": "https://www.tiktok.com/@khaby.lame/video/7691740195418377502"
}
}Response — data.data of the completed job (trimmed):
{
"video_id": "7691740195418377502",
"url": "https://www.tiktok.com/@khaby.lame/video/7691740195418377502",
"description": "Just give me 5 more minutes 😭#learnfromkhaby #comedy ",
"created_at": "2026-10-01T16:40:54Z",
"duration_s": 35,
"plays": 4114576,
"likes": 372806,
"comments": 6656,
"shares": 22674,
"saves": 17458,
"cover_url": "https://p16-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/o0jRDQRMAbfFAlZX8eqGQcARBqerRfAHR7gVSU~tplv-tiktokx-cropcenter-q:300:400:q70.heic?…",
"music": null,
"author_username": "khaby.lame",
"author_nickname": "Khabane lame"
}Video Comments
Get the comments on a TikTok video, one full page (about 10-20) per call: text, likes, reply count, date and commenter username. Use cursor for more.
action_id: tiktok_video_comments · Credits: 2 / call · Returns: 14 comments per page
| Parameter | Type | Description |
|---|---|---|
action_id required | string | Set to tiktok_video_comments |
params.video_url required | string | Link to the TikTok video. |
params.cursor | string | Leave empty for the first page. For the next page, pass the next_cursor value from the previous response (next_cursor is null when there are no more). |
Request
{
"action_id": "tiktok_video_comments",
"params": {
"video_url": "https://www.tiktok.com/@khaby.lame/video/7691740195418377502"
}
}Response — data.data of the completed job (trimmed):
{
"video_url": "https://www.tiktok.com/@khaby.lame/video/7691740195418377502",
"comments": [
{
"comment_id": "7691760978288132886",
"text": "The kids is Rubix cube GOAT",
"likes": 1540,
"replies": 16,
"created_at": "2026-10-01T18:01:31Z",
"author_username": "keithlukemason"
},
{
"comment_id": "7691788957193290517",
"text": "free Palestine 😭😭😭😭😭",
"likes": 1448,
"replies": 40,
"created_at": "2026-10-01T19:51:40Z",
"author_username": "abdoulahadkhoum66"
},
"… 12 more"
],
"count": 14,
"next_cursor": "20",
"message": null
}Paging: the first call returns
next_cursor; pass it back ascursorfor the next page (nullwhen there are no more). Each page is a new call.
Keyword Search
Search TikTok videos by keyword, one full page (about 30) per call, with caption, author, post date, plays, likes, comments and shares. Use cursor for more.
action_id: tiktok_keyword_search · Credits: 2 / call · Returns: 30 videos per page
| Parameter | Type | Description |
|---|---|---|
action_id required | string | Set to tiktok_keyword_search |
params.query required | string | Keyword or phrase to search for. |
params.cursor | string | Leave empty for the first page. For the next page, pass the next_cursor value from the previous response (next_cursor is null when there are no more). |
Request
{
"action_id": "tiktok_keyword_search",
"params": {
"query": "cooking"
}
}Response — data.data of the completed job (trimmed):
{
"query": "cooking",
"videos": [
{
"video_id": "7688873787407797534",
"url": "https://www.tiktok.com/@406bbq/video/7688873787407797534",
"description": "Crockpot Mongolian Beef & Noodles 🥩🍜🔥 Crockpot Series Episode 7: Mongolian Beef & Noodles This is my crockpot series, where I help you make easy recipes so g…",
"created_at": "2026-09-23T23:17:30Z",
"duration_s": 38,
"plays": 8335397,
"likes": 620232,
"comments": 2182,
"shares": 153895,
"saves": 415033,
"cover_url": "https://p16-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/oQAEAgs0hXqIfC0A9CDF4EI0VtXRE4FAA6gEfN~tplv-tiktokx-cropcenter:500:800.jpeg?…",
"music": null,
"author_username": "406bbq",
"author_nickname": "406bbq3"
},
{
"video_id": "7694812952976739615",
"url": "https://www.tiktok.com/@406bbq/video/7694812952976739615",
"description": "Grilled Teriyaki Chicken 🔥🍗 Cook Like an Asian Ep 1: Grilled Teriyaki Chicken. Welcome to my series, where I teach you easy Asian recipes so good, your frien…",
"created_at": "2026-10-09T23:24:29Z",
"duration_s": 33,
"plays": 248620,
"likes": 21891,
"comments": 86,
"shares": 2610,
"saves": 11355,
"cover_url": "https://p19-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/oIHC4DiZyEBzV4AAvlAAfni51JIvIXUiKA6LdB~tplv-tiktokx-cropcenter:500:800.jpeg?…",
"music": null,
"author_username": "406bbq",
"author_nickname": "406bbq3"
},
"… 28 more"
],
"count": 30,
"next_cursor": "30",
"message": null
}Paging: the first call returns
next_cursor; pass it back ascursorfor the next page (nullwhen there are no more). Each page is a new call.
Video Transcript
Get the spoken transcript of a TikTok video as plain text and timed segments. Videos without speech return has_transcript false.
action_id: tiktok_transcript · Credits: 2 / call · Returns: 1 item
| Parameter | Type | Description |
|---|---|---|
action_id required | string | Set to tiktok_transcript |
params.video_url required | string | Link to the TikTok video. |
Request
{
"action_id": "tiktok_transcript",
"params": {
"video_url": "https://www.tiktok.com/@foodinfivemins/video/7693497065078312214"
}
}Response — data.data of the completed job (trimmed):
{
"video_url": "https://www.tiktok.com/@foodinfivemins/video/7693497065078312214",
"has_transcript": true,
"text": "This is how you make garlic lemon chicken with green beans and sweet potato mash. It's an easy, whole food focus dinner that everyone is gonna love. To make…",
"segments": [
{
"start": "00:00:00.260",
"end": "00:00:03.020",
"text": "This is how you make garlic lemon chicken"
},
{
"start": "00:00:03.021",
"end": "00:00:05.621",
"text": "with green beans and sweet potato mash."
},
"… 14 more"
]
}