TikTok User Videos API
List a creator's public videos, latest or most popular first, with caption, plays, likes, comments, shares and post time.
- 1 credit per call
- Failed calls are free
- Updated
- tiktok.user.videos
{ "has_more": true, "result_count": 20, "items": [ { "like_count": 1263, "comment_count": 173, "author_handle": "tiktok", "create_time": 1791209149, "description": "Real conversations happen on TikTok, and protecting the integrity of elections is a top priority. 🗳️🔐 Through dedicated in-app Election Cent…", "id": "7693184538704416031", "music_title": "original sound", "play_count": 17600, "save_count": 73, "share_count": 67 }, { "like_count": 4295, "comment_count": 1956, "author_handle": "tiktok", "create_time": 1790959957, "description": "ATEEZ on the FYF. BTS on tour. dance challenges on repeat. @rachelszero and friends reminisce on K-Pop Summer on TikTok", "id": "7692114317151423775", "music_title": "original sound", "play_count": 271300, "save_count": 402, "share_count": 431 } ]}
| # | Caption | Plays | Likes | Comments | Shares | Posted (Unix time) | Author handle | Music title | Save count | Id |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Real conversations happen on TikTok, and protecting the integri… | 17,600 | 1263 | 173 | 67 | 1,791,209,149 | tiktok | original sound | 73 | 7693184538704416031 |
| 2 | ATEEZ on the FYF. BTS on tour. dance challenges on repeat. @rac… | 271,300 | 4295 | 1956 | 431 | 1,790,959,957 | tiktok | original sound | 402 | 7692114317151423775 |
| 3 | if your FYF had you hitting the Zara Larsson, you'll know Pop G… | 213,500 | 4887 | 1123 | 417 | 1,790,805,450 | tiktok | original sound | 444 | 7691450773619625247 |
| 4 | K-pop fans have been BUSY. @rachelszero shares how your fan cam… | 168,000 | 4578 | 874 | 309 | 1,790,703,573 | tiktok | original sound | 446 | 7691013160425327903 |
| 5 | the throwback sounds we didn’t know we were missing, given new … | 375,900 | 6825 | 1871 | 476 | 1,790,367,199 | tiktok | original sound | 567 | 7689568478570843422 |
| 6 | this group chat deserves a soundtrack 🎤 TikTok x #TheVoice, all… | 570,100 | 12,800 | 1523 | 517 | 1,790,196,319 | tiktok | original sound | 802 | 7688834577418194206 |
| 7 | trying something new can start with your DMs — @Dine with Kent … | 442,800 | 9833 | 2508 | 690 | 1,789,756,556 | tiktok | original sound | 853 | 7686945827008433439 |
| 8 | hear how @Palina La Diva 🌐 spinning tracks on LIVE brings techn… | 643,300 | 11,100 | 3367 | 960 | 1,788,883,336 | tiktok | original sound | 1183 | 7683195368279985438 |
| 9 | @Alex Warren thinks he'll never write anything better than... c… | 459,800 | 15,600 | 2431 | 1067 | 1,788,534,031 | tiktok | original sound | 1507 | 7681695065927912735 |
| 10 | when words aren't enough, Photo Comments say more @mama | our f… | 211,900 | 9483 | 1164 | 600 | 1,788,468,783 | tiktok | original sound | 895 | 7681414892942839071 |
What you send
The input
object of the request, with every field the endpoint accepts.
| Field | Type | Required | What it does | Example |
|---|---|---|---|---|
| handle | string | one of | The creator's handle. | tiktok |
| sec_uid | string | one of | The creator's secure ID from a profile response, as an alternative to the handle. | |
| count | integer | no | About how many videos to return. TikTok can send a few more or fewer. | |
| cursor | integer | no | Pass cursor from the last response to get the next page. | |
| sort_by | string | no | Latest videos first, or the most popular. | latest · popular |
| target_user_id | string | no | The creator's numeric user ID, when you have it. |
Fields it returns
What each record in the response holds, with the values from the sample above.
| Field | Type | What it is | Example |
|---|---|---|---|
| items[].description | string | The video's caption. | Real conversations happen on TikTok, and protecting the integri… |
| items[].play_count | integer | Views, as TikTok shows them. | 17,600 |
| items[].like_count | integer | Likes, as TikTok shows them. | 1263 |
| items[].comment_count | integer | Comments, as TikTok shows them. | 173 |
| items[].share_count | integer | Shares, as TikTok shows them. | 67 |
| items[].create_time | integer | When the video was posted, as a Unix time in seconds. | 1,791,209,149 |
| items[].author_handle | string | The posting account's handle. | tiktok |
| items[].id | string | TikTok's ID for the video. | 7693184538704416031 |
| items[].music_title | string | The title of the sound the video uses. | original sound |
| items[].save_count | integer | Saves, as TikTok shows them. | 73 |
| has_more | boolean | Whether more videos are available. | true |
| items | array | The account's videos. | 20 records |
| result_count | integer | How many videos this answer holds. | 20 |
Call it from your code, or ask your agent
Set UPSCRAPE_API_KEY to your key and copy a working request.
curl --request POST \ --url https://data.upscrape.com/execute \ --header "Authorization: Bearer $UPSCRAPE_API_KEY" \ --header "Content-Type: application/json" \ --header "Prefer: wait=30" \ --data '{ "capability": "tiktok.user.videos", "input": { "handle": "tiktok" }}'
import jsonimport osimport requestspayload = json.loads(r'''{ "capability": "tiktok.user.videos", "input": { "handle": "tiktok" }}''')response = requests.post( "https://data.upscrape.com/execute", headers={ "Authorization": f"Bearer {os.environ['UPSCRAPE_API_KEY']}", "Content-Type": "application/json", "Prefer": "wait=30", }, json=payload,)response.raise_for_status()print(json.dumps(response.json(), indent=2))
const response = await fetch("https://data.upscrape.com/execute", { method: "POST", headers: { "Authorization": `Bearer ${process.env.UPSCRAPE_API_KEY}`, "Content-Type": "application/json", "Prefer": "wait=30", }, body: JSON.stringify({ "capability": "tiktok.user.videos", "input": { "handle": "tiktok" }}),});if (!response.ok) { throw new Error(`Upscrape request failed: ${response.status}`);}console.log(JSON.stringify(await response.json(), null, 2));
https://data.upscrape.com/mcp
With Upscrape, pull @tiktok's latest videos and make a table of caption, plays, likes and comments. Which ones got the most plays?
More from the TikTok API
- TikTok User Profile Detail API1 credit
- TikTok Video Detail API1 credit
- TikTok Video Comments API1 credit
- TikTok Comment Replies API1 credit
- TikTok Keyword Video Search API1 credit
- TikTok Top Search Results API1 credit
- TikTok Hashtag Videos API1 credit
- TikTok Video Transcript API1 credit
- TikTok Shop Product Detail API1 credit
- TikTok Shop Product Search API1 credit
- TikTok Shop Store Products API1 credit
- TikTok Shop Product Reviews API1 credit
- TikTok Song Detail API1 credit
- TikTok Song Videos API1 credit
- TikTok Collection Videos API1 credit
- TikTok Trending Feed API1 credit
- TikTok Suggestions Search API1 credit
- TikTok User Live Status API1 credit
- TikTok Live Room Detail API1 credit
- TikTok User Followers API1 credit
- TikTok User Following API1 credit
The same data from other platforms
TikTok User Videos API FAQ
The short answers. The docs have the long ones.
How much does the TikTok User Videos API cost?
1 credit per successful call, shown before it runs. You buy credits once, and paid credits never expire.
What do I send?
Send handle or sec_uid. The input fields below list every option with its type and limits.
Do I need a TikTok login?
No. It reads public TikTok data; nothing runs on your account.
Can my AI agent call it?
Yes, over MCP: the agent finds tiktok.user.videos, checks its price and runs it with the same credits as the REST API.
Your first TikTok call is free.
Up to 100 free credits to start, no card needed.