You can get TikTok video data with three REST calls: the video feed of a creator by handle, the full details of one video by URL, or the videos saved in a public collection. Every response is JSON with captions and engagement stats such as plays, likes, comments, shares and saves, and a single video call can also return its transcript.
| Endpoint | What it returns | Credits/call | USD/call (Freelance plan) |
|---|---|---|---|
/v1/tiktok/user_videos_pro | Profile Videos | 1 | $0.0017 |
/v1/tiktok/video_plus | Video Info | 1 | $0.0017 |
/v1/tiktok/collection_videos | Collection Videos | 1 | $0.0017 |
/v1/tiktok/user_videos_proProfile Videos 1,000 calls = 1,000 credits = $1.67 on the Freelance plan.
| Parameter | Type | Required | Description |
|---|---|---|---|
handle | string | yes | TikTok handle |
user_id | string | no | TikTok user id. Use this for faster responses. |
sort_by | string | no | What to sort by |
region | string | no | Country code passed to the profile-feed source. Defaults to US. If a profile should have videos but returns none, try another relevant two-letter country code. |
include_pinned | boolean | no | Whether to include pinned posts. Defaults to true. Set to false to exclude posts marked as pinned, including with trim=true. Keep this value unchanged while pag |
trim | boolean | no | Set to true for a trimmed down version of the response |
max_cursor | string | no | Cursor to get more videos. Get 'max_cursor' from previous response. |
Sample response (trimmed):
{
"videos": [
{
"video_id": "7517114944362499342",
"desc": "You can say whatever you want about the WNBA is but it’s never boring",
"desc_language": "en",
"region": "US",
"statistics": {
"video_id": "7517114944362499342",
"collect_count": 1565,
"comment_count": 587,
"like_count": 59605,
"download_count": 178,
"forward_count": 0,
"lose_comment_count": 0,
"lose_count": 0,
"view_count": 559925,
"repost_count": 0,
"share_count": 3424,
"whatsapp_share_count": 7
},
"video": {
"cover_tsp": 140.193500922967,
"ai_dynamic_cover": {
"uri": "tos-useast5-p-0068-tx/o0QcUfjIQHA8EQBSBQtAfYqKkCX9eKpMEOHl1H",
"url_list": [
"https://p16-sign.tiktokcdn-us.com/tos-useast5-p-0068-tx/o0QcUfjIQHA8EQBSBQtAfYqKkCX9eKpMEOHl1H~tplv-tiktokx-origin.image?dr=9229&refresh_token=2a5a8daf&x-exp..."
],
"url_prefix": null
},
"ai_dynamic_cover_bak": {
"uri": "tos-useast5-p-0068-tx/o0QcUfjIQHA8EQBSBQtAfYqKkCX9eKpMEOHl1H",
"url_list": [
"https://p16-sign.tiktokcdn-us.com/tos-useast5-p-0068-tx/o0QcUfjIQHA8EQBSBQtAfYqKkCX9eKpMEOHl1H~tplv-tiktokx-origin.image?dr=9229&refresh_token=2a5a8daf&x-exp..."
],
"url_prefix": null
},
"animated_cover": {
"uri": "tos-useast5-p-0068-tx/o0QcUfjIQHA8EQBSBQtAfYqKkCX9eKpMEOHl1H",
"url_list": [
"https://p16-sign.tiktokcdn-us./v1/tiktok/video_plusVideo Info 1,000 calls = 1,000 credits = $1.67 on the Freelance plan.
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string | yes | TikTok video or photo/slideshow URL |
region | string | no | Two-letter country code passed to the primary post source. Defaults to US. Try the creator's country if a post is unavailable. This does not guarantee a matchin |
get_transcript | boolean | no | Native captions are opt-in via get_transcript=true and are included in the existing base endpoint price. This detail endpoint does not use AI transcription or a |
trim | boolean | no | Set to true to get a trimmed response |
download_media | boolean | no | Set to true to download the video/images and get back permanent Supabase URLs. Costs 10 credits if media is found, 1 credit otherwise. |
cache_max_age | string | no | If we have a response in the cache that is this many days old or newer, return the cached response (0 credits, with "cached": true and a "cached_at" timestamp). |
/v1/tiktok/collection_videosCollection Videos 1,000 calls = 1,000 credits = $1.67 on the Freelance plan.
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string | yes | Public TikTok collection URL |
next_cursor | string | no | Cursor to get more videos. Use max_cursor from the previous response. |
curl -H "X-Scapi-Key: $SCAPI_KEY" "https://api.scrapall.bipsport.com/scapi/v1/tiktok/user_videos_pro"import os, requests
r = requests.get("https://api.scrapall.bipsport.com/scapi/v1/tiktok/user_videos_pro",
headers={"X-Scapi-Key": os.environ["SCAPI_KEY"]})
print(r.json())Call the profile videos endpoint with the handle and choose sort_by latest or popular. Each page returns a list of video objects with caption, statistics and video URLs. Pass max_cursor from the previous response to load the next page, and keep the same region and sort_by for the whole cursor chain.
Yes. Call the video info endpoint with the video URL and set get_transcript=true. When captions exist, the response includes the transcript in WEBVTT format next to the caption, author, music and engagement statistics of the video.
Each video carries play_count, digg_count (likes), comment_count, share_count and collect_count (saves), plus the caption, duration, cover image and download URLs. The single video endpoint also returns author and music info.
Not always. The feed is a practical way to read recent or popular videos, but it is not guaranteed to be an exhaustive inventory of every public post. For a known video, request it directly by URL with the video info endpoint.
Yes. Pass the public collection URL to the collection videos endpoint. It returns the saved videos and a next_cursor value that you send back to fetch further pages.
Open the Buy page, pick the Freelance plan and pay in USDT on TRC20 or ERC20. The key is shown once, right after the payment is confirmed on-chain.
The cost table on this page lists credits per call for each endpoint. The Freelance plan is $45 for 27,000 credits per 30 days.
Full reference: all tiktok endpoints.