TikTok
GET /v1/tiktok/video-details

TikTok Video Details API

Get everything about one TikTok video from its URL — caption, view/like/comment/share/save counts, creator, sound, hashtags, and thumbnail.

1 credit per request
TL;DR
Get everything about one TikTok video from its URL — caption, view/like/comment/share/save counts, creator, sound, hashtags, and thumbnail. The TikTok Video Details API (TikTok) is a single authenticated GET request to /v1/tiktok/video-details that responds with clean JSON and costs 1 credit. Pass cache=true for a free 24h cache hit; default is always fresh. Start with 100 free credits — no credit card.

What is the TikTok Video Details API?

Paste any public TikTok video URL and the TikTok Video Details API returns the full picture as clean JSON: the caption, when it was posted, how long it runs, and its engagement — views, likes, comments, shares, and saves. You also get the creator (username, display name, follower count, verified badge, and avatar), the sound/music name, the list of hashtags, and a thumbnail image. Use it to build analytics dashboards, track a campaign, or enrich a content database. source is native; timings.path is mobile | web (same vocabulary as kick/clip and twitter/profile — fetchPath is gone). Mobile is TikTok's aweme detail — exact integers with per-counter *IsApproximate flags set false, plus downloads and play URLs when TikTok exposes them. When every mobile exit is soft-blocked, web serves the page's display-rounded counters; the flags say so per counter. The web path does not populate videoUrl / downloadUrl / downloadUrlNoWatermark / downloads / author.region — that is a logged-out web limit, documented here, not a payload apology. mediaUrlsExpireAt still fills from thumbnailUrl / avatar when those carry a parseable stamp. adAuthorized is whether the creator permitted Spark Ads on this organic video — it is not "this item is an advertisement". isCommerce / isBrandedContent / isPaidPartnership stay separate; filter those if you want commercial content. author.region is the creator's country on the mobile aweme (null on web when TikTok omits it) — there is no flat authorRegion twin. locationCreated is the video's posting locale, a different signal. author.followersIsApproximate uses the same display-roundness ladder as engagement (v ≥ 10 000 and a clean hundred/100k). followersAsOf is gone — it always equalled fetchedAt. fetchedAt is when the fetch started, not when it returned. status.allowComment / allowShare are booleans: unknown bits are false (shared serialisation rule), not null next to the other status flags. TikTok CDN media URLs die on two windows: video/download ~24h (hex path timestamp or expire=), thumbnails/covers ~48h (x-expires). mediaUrlsExpireAt is the earliest — persist ids, not the URL. For creator country with regionSource / regionConfidence, use TikTok Profile Region. This endpoint focuses on metadata and stats. No TikTok login and no proxies or infrastructure to maintain on your side. Pass cache=true to serve from the 24h shared cache (0 credits on hit); default is always fresh.

What you get

  • source / stages / timings.path mobile | web — same video, two hydrates, named
  • Views, likes, comments, shares, and saves — exact mobile counters with per-counter approximate flags
  • downloads and play URLs when TikTok exposes them (mobile); omitted on web
  • adAuthorized (Spark Ads permission) — not isAd
  • Creator — handle, name, followers + followersIsApproximate, verified, avatar, author.region when exposed
  • Sound name, hashtags, and thumbnail image

Try it

Open in Playground

Fill in the parameters below and copy a ready-to-run request, or open the live Playground to run it against your account (no API key paste).

Parameters

Sign in to run live
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_..."

Edit the parameters and the code updates instantly. Switch languages and hit copy.

Example response

{
  "success": true,
  "cached": false,
  "creditsUsed": 1,
  "requestId": "8f3c2a1e-4b9d-4e6a-9c1f-2d7e5b8a0c34",
  "fetchedAt": "2026-08-17T19:43:38.545Z",
  "cachedAt": null,
  "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 is returned in response headers: X-Captapi-Credits (credits charged), X-Captapi-Cache (hit or miss), and X-Captapi-Source. Failed requests (4xx/5xx) are never charged. See the full list of error codes in the error reference.

Response structure

A successful call returns success, cached, creditsUsed, requestId, fetchedAt, cachedAt, and a data object with the following fields:

Top-level fields

  • platformPlatform identifier for this response (matches the endpoint's platform).
  • urlCanonical URL of the item.
  • idStable platform ID for the item.
  • captionPost or creative caption when the platform exposes one.
  • publishedAtPublish date (ISO 8601) when the platform exposes an absolute timestamp.
  • durationSecondsLength in seconds for this item (full media length, or a segment span when the endpoint documents a start/end).
  • thumbnailUrlThumbnail image URL.
  • mediaTypeMedia type label for this item (platform-specific enum).
  • widthWidth in pixels.
  • heightHeight in pixels.
  • videoUrlPlayable CDN URL when TikTok exposes one that is not session-cookie bound. Present on timings.path=mobile when TikTok publishes an unbound link; null on web (logged-out watch page). Web playAddr with tk=tt_chain_token 403s for callers and is omitted. Null does not mean the video is deleted.
  • downloadUrlWatermarked download CDN URL when TikTok exposes one. Null on timings.path=web — same web-path limit as videoUrl.
  • downloadUrlNoWatermarkNo-watermark download URL when the mobile aweme exposes one. Null on web.
  • hasWatermarkHas watermark. Example: true.
  • mediaUrlsExpireAtEarliest ISO expiry across every signed URL in this payload (videoUrl / downloadUrl / downloadUrlNoWatermark / thumbnailUrl / author.profileImage). Parses expire= / x-expires and the 8-char hex path timestamp on v45-style play URLs (~24h). Image x-expires is typically ~48h — the min is the safe assumption. Null only when no URL yields a parseable stamp (logged, never guessed). Persist the video id and refetch.
  • hashtagsHashtags extracted from the text.
  • mentionsAccounts mentioned in the text.
  • musicNameName of the soundtrack used.
  • musicIdID of the soundtrack used.
  • musicAuthorMusic author. Example: "Khabane lame".
  • isOriginalSoundIs original sound. Example: true.
  • locationCreatedISO country for the video's posting/serving locale — not the creator's home country (see author.region / profile-region).
  • authorRegionCreator's TikTok profile region (ISO country) when TikTok exposes it on the video — hydrated from the mobile aweme detail, so it is populated on most videos. When TikTok does not expose it anywhere, /tiktok/profile-region infers the creator country with regionSource / regionConfidence. Distinct from locationCreated (video locale).
  • descLanguageLanguage code TikTok assigns to the video caption when exposed.
  • shopProductUrlTikTok Shop product page URL when the video anchors a product (https://www.tiktok.com/shop/pdp/…). Null/omitted when the video does not sell.
  • isAdWhether the item is a paid promotion.
  • isCommerceTrue when TikTok marks the item as commerce / shop-capable.
  • isBrandedContentTrue when TikTok marks the item as brand-organic / branded content.
  • isPaidPartnershipTrue when TikTok marks the item as a paid partnership.
  • fetchedAtWhen this fetch started (ISO-8601 UTC). On a long call this is seconds before the response returns — not completion. Cache hits keep the original stamp.

Author

The author object contains:

  • idId of this author item.
  • secUidTikTok secure user ID — required for many platform-internal list endpoints.
  • usernameAccount username / handle.
  • displayNameDisplay name of the account. Canonical across profile endpoints (prefer over name).
  • urlCanonical URL of the item.
  • followersFollower count.
  • verifiedWhether the account is verified on this platform.
  • profileImageProfile image URL. Deprecated alias of avatar on Instagram/Twitter/Threads/TikTok profile endpoints (one release).
  • followersAsOfFollowers as of. Example: "2026-07-27T08:14:52.000Z".
  • regionCreator profile region from the mobile aweme (populated on timings.path=mobile). Null on web when TikTok omits it. There is no flat authorRegion twin. When TikTok exposes it nowhere, /tiktok/profile-region infers the creator country with regionSource / regionConfidence.

Engagement

The engagement object contains:

  • viewsView count when the platform exposes one.
  • likesLike count (number).
  • commentsComment count.
  • sharesShare count. On analytics endpoints: null when the platform has no public share metric (stable schema). On single-platform endpoints the key is omitted instead.
  • savesSave count. On analytics endpoints: null when the platform has no public save metric (stable schema). On single-platform endpoints the key is omitted instead.
  • viewsIsApproximateTrue when engagement.views came from a compact/display-rounded label (TikTok stats, Facebook og "610K views") rather than an exact integer.
  • likesIsApproximateTrue when engagement.likes looks display-rounded rather than exact.
  • commentsIsApproximateTrue when engagement.comments looks display-rounded rather than exact.
  • sharesIsApproximateTrue when engagement.shares looks display-rounded rather than exact.
  • savesIsApproximateTrue when engagement.saves looks display-rounded rather than exact.
  • downloadsExact download count from the mobile aweme statistics when TikTok exposes it — typically present on timings.path=mobile, omitted on web. video-details and music-posts are the only endpoints that surface it.

Status

The status object contains:

  • allowCommentWhether comments are allowed. Unknown on both the web page and the mobile aweme is false — not null. Same shared boolean rule as twitter/profile.
  • allowShareWhether shares are allowed. Unknown on both the web page and the mobile aweme is false — not null.
  • isPrivateWhether the account is private.
  • isDeletedIs deleted. Example: false.
  • inReviewIn review. Example: false.
  • isProhibitedIs prohibited. Example: false.

Parameters

NameTypeRequiredDescription
urlstringYesPublic 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.
cachebooleanNoSet true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh. Envelope includes cached + cachedAt on hits.

Authentication: send your key as Authorization: Bearer capt_live_.... A typical call costs 1 credit. Pass cache=true for a free 24h cache hit; default is always fresh.

Using an AI agent? This endpoint is the MCP tool tiktok_video_details via @captapi/mcp. Set it up →

How it works

  1. 1. Sign up — get 100 free credits, no card required.
  2. 2. Create a key from your dashboard.
  3. 3. Send one request to /v1/tiktok/video-details and parse the JSON response.

Use cases

Analytics

Track views, likes, and engagement over time.

Competitor Monitoring

Benchmark the performance of other creators.

Dashboards

Power reporting and BI with real metadata.

Content Curation

Filter and rank videos by performance.

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. Hits include cached + cachedAt. 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; source / stages / timings name the path (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. Hits include cached + cachedAt. Selected profile endpoints also accept cacheMaxAge=1d|3d|7d|14d|30d. Use it for analytics, monitoring, and content automation.

More TikTok APIs

Ready to use the TikTok Video Details API?

Sign up, grab your key, and make your first call in 60 seconds.

TikTok Video Details API | Captapi — Captapi