TikTok video data API
Look up TikTok creators by username or open individual videos. Each profile or video comes back as one record with its counts and metadata.
- Record types
videoprofile- Fields
- 54
- From
- $3.30 per 1,000 records
What you can request
Set mode in the request body to choose what comes back; without it the request runs as profile. Each mode reads the inputs listed next to it.
| Mode | What comes back | Inputs | Billed as |
|---|---|---|---|
profile | A creator's profile: bio, follower, following, like and video counts. | usernames profileUrls | profile |
video | The detail of each video URL: caption, counts, music and author. | videoUrls | video-detail |
Every request also takes maxItems (records for the whole request) and maxItemsPerInput (records per search, URL or name).
Datasets
These TikTok record types have their own page, with their own example record, fields, options and prices.
| Dataset | One record is | Fields | From, per 1,000 |
|---|---|---|---|
| Profiles | One record describes a single TikTok account. | 23 | $3.30 |
Example request and record
The request below is the one this example record answers. The names, usernames, photos and contact details of people in it are fictional. Long values in the record are shortened.
curl
curl -X POST https://api.urakimon.com/records/tiktok \
-H "x-api-key: $URAKIMON_API_KEY" \
-H "content-type: application/json" \
-d '{
"mode": "video",
"videoUrls": [
"https://www.tiktok.com/@example_user_1/video/7683649763480309022",
"https://www.tiktok.com/@example_user_1/video/7683332577364643103"
]
}'Python
import os
import requests
res = requests.post(
"https://api.urakimon.com/records/tiktok",
headers={"x-api-key": os.environ["URAKIMON_API_KEY"]},
json={
"mode": "video",
"videoUrls": [
"https://www.tiktok.com/@example_user_1/video/7683649763480309022",
"https://www.tiktok.com/@example_user_1/video/7683332577364643103"
]
},
)
res.raise_for_status()
records = res.json()["records"]Node
const res = await fetch("https://api.urakimon.com/records/tiktok", {
method: "POST",
headers: {
"x-api-key": process.env.URAKIMON_API_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"mode": "video",
"videoUrls": [
"https://www.tiktok.com/@example_user_1/video/7683649763480309022",
"https://www.tiktok.com/@example_user_1/video/7683332577364643103"
]
}),
});
const { records } = await res.json();{ "source": "tiktok", "type": "video", "id": "7683332577364643103", "url": "https://www.tiktok.com/@example_user_1/video/7683332577364643103", "description": "Replying to @Casey Example I’ve never seen a class so eager to read ", "createdAt": "2026-09-09T00:54:39.000Z", "createdTimestamp": 1788915279, "playCount": 7200000, "likeCount": 705800, "commentCount": 29500, "shareCount": 15800, "collectCount": 33438, "repostCount": 0, "durationSeconds": 27, "ratio": "540p", "definition": "540p", "format": "mp4", "width": 576, "height": 1024, "cover": "https://p16-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/oY9fXVN5MQVKsBZqAJWEq1jjAC8eVzIQQYAeIQ~tplv-tiktokx-origin.image?dr=9636&…", "coverDynamic": "https://p19-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/oogPtBaIWbiFiDofCAzgPq1lrqIkUAd8iIvABG~tplv-tiktokx-origin.image?dr=9636&…", "subtitles": [ { "language": "eng-US", "languageId": "2", "downloadLink": "https://v16m-webapp.tiktokcdn-us.com/f568da9f2aa3c4dfb3d233544c14dc74/6ab2daca/video/tos/useast8/tos-useast8-v-0068-tx2/67b8e5f7817a47d08…", "format": "webvtt", "source": "ASR", "sourceUnabbreviated": "automatic speech recognition", "version": "1:big_caption", "size": 683, "expiresAt": "2026-09-22T19:45:14.000Z" } ], "textLanguage": "en", "categories": [], "locationCreated": "CA", "isAd": false, "isPinned": false, "isAigc": false, "author": { "username": "example_user_1", "userId": "9000000000000000001", "nickname": "Jordan Example", "isVerified": true, "avatar": "https://example.com/avatars/1.jpg", "signature": "Checkout My New Book!👇", "followerCount": 141400000, "followingCount": 355, "heartCount": 1500000000, "videoCount": 475, "diggCount": 1550, "friendCount": 0 }, "music": { "id": "7683444018113465119", "title": "original sound", "authorName": "Jordan Example", "isOriginal": true, "duration": 27, "url": "https://v16m.tiktokcdn-us.com/6114debe7b9b6803213743beee92174a/6ab08c2a/video/tos/useast8/tos-useast8-v-27dcd7-tx2/o8AAFiId1iAMEcR9BBAcCr…", "cover": "https://p16-common-sign.tiktokcdn-us.com/tos-useast5-avt-0068-tx/1e2348ca19d394037718e3b1d3fc2958~tplv-tiktokx-cropcenter:720:720.jpeg?dr…" }, "hashtags": [], "mentions": [ { "userId": "9000000000000000002", "username": "example_user_2", "nickname": "Casey Example", "secUid": "MS4wLjABAAAAexample300000000000000000000000000000000000000000000000000000000", "profileUrl": "https://example.com/people/2" } ], "isSlideshow": false, "imageCount": null, "images": [], "isSponsored": false, "event": "video-detail", "collectedAt": "2026-09-20T19:44:47.733Z"}Fields
Every record starts with the same envelope: source, type, event, id, url, collectedAt. What the envelope means. The tables below list the fields after it, read from real TikTok records. Where a field does not apply to an item it is null or an empty list, not left out. "Present on" names the billed events a field comes with when it is not on every record of that type.
video records
One record describes a single TikTok video (or photo slideshow) post. Billed as video-detail.
| Field | Type | What it holds | Present on |
|---|---|---|---|
description | string | Video's caption text; empty string when the video has no caption. | All |
createdAt | string | ISO 8601 timestamp the video was posted. | All |
createdTimestamp | integer | Unix timestamp, in seconds, the video was posted; null when createdAt is unknown. | All |
playCount | integer | Exact number of views. | All |
likeCount | integer | Exact number of likes. | All |
commentCount | integer | Exact number of comments. | All |
shareCount | integer | Exact number of shares. | All |
collectCount | integer | Exact number of times the video was saved. | All |
repostCount | integer | Exact number of reposts. | All |
durationSeconds | integer | Video duration, in seconds. | All |
ratio | string | Video's resolution label as TikTok reports it, for example 540p. | All |
definition | string | Video quality label TikTok served for this record, for example 540p. | All |
format | string | Video container format, for example mp4. | All |
width | integer | Video width, in pixels. | All |
height | integer | Video height, in pixels. | All |
cover | string | URL of the video's static cover image, or null. | All |
coverDynamic | string | URL of the video's animated (looping) cover image, or null. | All |
subtitles | array | Caption tracks: objects with language, languageId, downloadLink, format, source, sourceUnabbreviated, version, size, expiresAt. | All |
textLanguage | string | Language code TikTok detected for the caption text, or null. | All |
categories | array | Content category labels TikTok assigns to the video; empty array when none are assigned. | All |
locationCreated | string | Two-letter region code the video was created in, or null. | All |
isAd | boolean | Whether the video is a paid advertisement. | All |
isPinned | boolean | Whether the video is pinned to the author's profile. | All |
isAigc | boolean | Whether TikTok labels the video as AI-generated content. | All |
author | object | Video author account snapshot: same fields as the profile type, minus secUid, region, language, nicknameModifiedAt, openFavorite. | All |
music | object | Sound used in the video: an object with id, title, authorName, isOriginal, duration (seconds), url, and cover. | All |
hashtags | array | Hashtag names used in the caption, without the # symbol; empty array when none. | All |
mentions | array | Accounts mentioned in the caption: an array of objects with userId, username, nickname, secUid, and profileUrl. | All |
isSlideshow | boolean | Whether the post is a photo slideshow rather than a video. | All |
imageCount | null | Number of images in a slideshow post, or null for a video. | All |
images | array | Image URLs for a slideshow post; empty array for a video. | All |
isSponsored | boolean | Whether the video is labeled as branded or paid-partnership content. | All |
profile records
One record describes a single TikTok account. Billed as profile. 23 fields. TikTok profiles: every field, an example record and the options
TikTok data pricing
You pay once for each record you receive, at the price of the event it carries. A request that returns nothing costs nothing.
| Event | Per 1,000 records | Per record |
|---|---|---|
profile | $3.30 | $0.00330 |
video-detail | $3.30 | $0.00330 |
Freshness and limits
- Records are collected when you send the request. Each one carries
collectedAt, the UTC time it was read. POST /records/tiktokreturns up to 500 records in one response. Ask for more and it answers413; send the same body toPOST /jobs/tiktokinstead.- A request without
maxItemsreturns up to 100 records. - Your key's rate limit and quotas apply to every source.