How to get TikTok video details
GET request to /v1/tiktok/video-details with your input. You get clean JSON back in seconds for 1 credit per call — no OAuth, scraping or platform SDKs. Get everything about one TikTok video from its URL — caption, view/like/comment/share/save counts, creator, sound, hashtags, and thumbnail.How to get TikTok video details (step by step)
- 1
Get a free API key
Create a free Captapi account (100 credits, no card) and generate an API key from the dashboard.
- 2
Call the TikTok Video Details API
Send an authenticated GET request to /v1/tiktok/video-details with your input. No OAuth, no scraping setup.
- 3
Read the JSON response
Parse the clean JSON response. Pass cache=true for a free 24h cache hit; default is always fresh.
Code example
curl "https://api.captapi.com/v1/tiktok/video-details?url=https%3A%2F%2Fwww.tiktok.com%2F%40khaby.lame%2Fvideo%2F7646812028874673439" \
-H "Authorization: Bearer capt_live_..."
# or: -H "x-api-key: capt_live_..."What the response looks like
{
"success": true,
"data": {
"platform": "tiktok",
"url": "https://www.tiktok.com/@khaby.lame/video/7646812028874673439",
"id": "7646812028874673439",
"caption": "Thank you, please come again!!!🙋🏿♂️💸#learnfromkhaby #comedy",
"publishedAt": "2026-06-02T14:56:35.000Z",
"durationSeconds": 29.534,
"thumbnailUrl": "https://p19-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/oUAHVIiQDac8uC75AEfyALAA1FrTAqEEQ3GRPe~tplv-tiktokx-origin.image?dr=9636&x-expires=1783263600&x-signature=2PlkofS3nAbuOWtQQSaCTJIU0bQ%3D&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5",
"mediaType": "video",
"width": 576,
"height": 1024,
"videoUrl": "https://v16-webapp-prime.tiktok.com/video/tos/useast8/tos-useast8-ve-0068c004-tx2/osABAiDgQEbQItAyAFeBfiAXnEBQDEfKGQIgSE/?a=1988&expire=1785171600",
"downloadUrl": "https://v16-webapp-prime.tiktok.com/video/tos/useast8/tos-useast8-ve-0068c004-tx2/osABAiDgQEbQItAyAFeBfiAXnEBQDEfKGQIgSE/?a=1988&expire=1785171600",
"downloadUrlNoWatermark": null,
"hasWatermark": true,
"mediaUrlsExpireAt": "2026-07-27T17:00:00.000Z",
"author": {
"id": "127905465618821121",
"secUid": "MS4wLjABAAAAwAg0rOj4qHjHBN4BQLRlTaNI0dpqRuTrNi-TM0LKNpc",
"username": "khaby.lame",
"displayName": "Khabane lame",
"url": "https://www.tiktok.com/@khaby.lame",
"followers": 162476412,
"verified": true,
"profileImage": "https://p16-common-sign.tiktokcdn-us.com/tos-useast8-avt-0068-tx2/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:720:720.jpeg?dr=9640&refresh_token=828dd685&x-expires=1783263600&x-signature=uG12wEuTZOcKwj9%2BCpq6wCtqNe8%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=f20df69d&idc=useast5",
"followersAsOf": "2026-07-27T08:14:52.000Z",
"region": "IT"
},
"engagement": {
"views": 17042375,
"likes": 1550817,
"comments": 16306,
"shares": 16050,
"saves": 62013,
"viewsIsApproximate": false,
"likesIsApproximate": false,
"commentsIsApproximate": false,
"sharesIsApproximate": false,
"savesIsApproximate": false,
"downloads": 7108
},
"hashtags": [
"learnfromkhaby",
"comedy"
],
"mentions": [],
"musicName": "original sound - khaby.lame",
"musicId": "7646812079113898783",
"musicAuthor": "Khabane lame",
"isOriginalSound": true,
"locationCreated": "IT",
"authorRegion": "IT",
"descLanguage": null,
"shopProductUrl": null,
"isAd": false,
"isCommerce": false,
"isBrandedContent": false,
"isPaidPartnership": false,
"status": {
"allowComment": true,
"allowShare": true,
"isPrivate": false,
"isDeleted": false,
"inReview": false,
"isProhibited": false
},
"fetchedAt": "2026-07-27T08:14:52.000Z"
}
}Billing metadata (credits charged, cache hit/miss) is returned in the X-Captapi-Credits and X-Captapi-Cache response headers.
Request parameters
| Name | Type | Required | Description |
|---|---|---|---|
| url | string | Yes | Public TikTok video URL, e.g. https://www.tiktok.com/@khaby.lame/video/7646812028874673439. Not a YouTube/Instagram/Facebook URL. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble. |
| cache | boolean | No | Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh. |
Frequently asked questions
What does the TikTok Video Details API do?
The TikTok Video Details API lets you fetch full metadata and key stats from a public TikTok video using one GET request to /v1/tiktok/video-details. It returns clean JSON — no OAuth or infrastructure setup required.
How many credits does the TikTok Video Details API cost?
Each successful call costs 1 credit. Pass cache=true to serve from the 24h cache (0 credits on hit); default is always fresh. Selected profile endpoints also accept cacheMaxAge=1d|3d|7d|14d|30d. Failed or empty results are never charged.
Do I need a TikTok API key or OAuth?
No. A single Captapi key works across every platform Captapi supports — YouTube, TikTok, Instagram, Facebook, Twitter/X, Reddit, Threads, Bluesky, Pinterest, LinkedIn, Rumble, Spotify, Kwai, and more. We handle proxies, rate limits, retries, and authentication for you.
Why can the same video return 1 100 000 views on one call and 1 060 159 on the next?
Two hydrates. timings.path=mobile is TikTok's aweme detail (exact integers, downloads, play URLs, author.region). timings.path=web is the page's display-rounded counters when every mobile exit is soft-blocked — 1 100 000 instead of 1 060 159. The *IsApproximate flags cover the counters; (fetchPath is gone). Same price either way.
Why are videoUrl and downloadUrl null?
On timings.path=web the logged-out watch page does not expose playable CDN links (the same class as trending-reels engagement.views). videoUrl / downloadUrl / downloadUrlNoWatermark stay null — documented here, not as a payload note. mediaUrlsExpireAt can still fill from thumbnailUrl / author.profileImage when those carry x-expires. timings.path=mobile is the path that fills the play/download URLs. Persist the post url; do not treat a null videoUrl as a deleted video.
Is author.followers exact?
Often not. This surface publishes TikTok's display-rounded follower count (12 600 matches v ≥ 10 000 and a clean hundred). author.followersIsApproximate uses the same ladder as engagement. Divide 1 100 000 / 12 600 only after reading both flags.
Where did authorRegion and followersAsOf go?
authorRegion was a twin of author.region — keep the nested one. followersAsOf always equalled fetchedAt (4/4 including the docs example), so it is gone. fetchedAt is the fetch start, not completion.
Why is adAuthorized true on an organic skincare post?
That bit is Spark Ads authorisation — the creator permitted the organic video to be used in ads — not "this item is an advertisement". isCommerce / isBrandedContent / isPaidPartnership / shopProductUrl stay false/null on that post. Filter those if you want commercial content. Do not filter adAuthorized === false to isolate organic; you will silently drop authorised organic videos.
Why are allowComment and allowShare false?
Unknown boolean on a complete status object is false — the same shared serialisation rule as twitter/profile (TW-1). We still read the mobile aweme status (allow_comment / allow_share) when timings.path=mobile. A false next to isPrivate: false means TikTok did not expose the bit, not that comments are confirmed off.
Is the TikTok Video Details API suitable for production use?
Yes. It is a stable REST endpoint with predictable JSON and automatic retries. Pass cache=true to serve from the 24h cache (0 credits on hit); default is always fresh. Selected profile endpoints also accept cacheMaxAge=1d|3d|7d|14d|30d. Use it for analytics, monitoring, and content automation.
Ready to get TikTok video details?
Start free with 100 credits — no credit card required.
Get your free API key