---
title: "TikTok Video Details API"
method: GET
path: "/v1/tiktok/video-details"
tags: ["TikTok"]
---

# TikTok Video Details API

`GET /v1/tiktok/video-details`

## Request

- Base URL: `https://api.captapi.com`
- URL: `https://api.captapi.com/v1/tiktok/video-details`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-Key`

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

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 infrastructure to maintain on your side. Pass cache=true to serve from the 24h shared cache (0 credits on hit); default is always fresh.

Docs: https://captapi.com/apis/tiktok-video-details

## Query parameters

- `url` string, required
- `cache` boolean

## Response `200`

Success. The data object for this endpoint.

- object
  - `success` unknown, required
  - `data` object, required
    - `platform` string: Platform identifier for this response (matches the endpoint's platform).
    - `url` string: Canonical URL of the item.
    - `id` string: Stable platform ID for the item.
    - `caption` string: Post or creative caption when the platform exposes one.
    - `publishedAt` string: Publish date (ISO 8601) when the platform exposes an absolute timestamp.
    - `durationSeconds` number: Length in seconds for this item (full media length, or a segment span when the endpoint documents a start/end).
    - `thumbnailUrl` string: Thumbnail image URL.
    - `mediaType` string: Media type label for this item (platform-specific enum).
    - `width` integer: Width in pixels.
    - `height` integer: Height in pixels.
    - `videoUrl` string: Playable 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.
    - `downloadUrl` string: Watermarked download CDN URL when TikTok exposes one. Null on timings.path=web — same web-path limit as videoUrl.
    - `downloadUrlNoWatermark` unknown
    - `hasWatermark` boolean: Has watermark. Example: true.
    - `mediaUrlsExpireAt` string: Earliest 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.
    - `author` object
      - `id` string: Id of this author item.
      - `secUid` string: TikTok secure user ID — required for many platform-internal list endpoints.
      - `username` string: Account username / handle.
      - `displayName` string: Display name of the account. Canonical across profile endpoints (prefer over name).
      - `url` string: Canonical URL of the item.
      - `followers` integer: Follower count.
      - `verified` boolean: Whether the account is verified on this platform.
      - `profileImage` string: Profile image URL. Deprecated alias of avatar on Instagram/Twitter/Threads/TikTok profile endpoints (one release).
      - `followersAsOf` string: Followers as of. Example: "2026-07-27T08:14:52.000Z".
      - `region` string: Creator 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` object
      - `views` integer: View count when the platform exposes one.
      - `likes` integer: Like count (number).
      - `comments` integer: Comment count.
      - `shares` integer: Share count. On analytics endpoints: null when the platform has no public share metric (stable schema). On single-platform endpoints the key is omitted instead.
      - `saves` integer: Save count. On analytics endpoints: null when the platform has no public save metric (stable schema). On single-platform endpoints the key is omitted instead.
      - `viewsIsApproximate` boolean: True when engagement.views came from a compact/display-rounded label (TikTok stats, Facebook og "610K views") rather than an exact integer.
      - `likesIsApproximate` boolean: True when engagement.likes looks display-rounded rather than exact.
      - `commentsIsApproximate` boolean: True when engagement.comments looks display-rounded rather than exact.
      - `sharesIsApproximate` boolean: True when engagement.shares looks display-rounded rather than exact.
      - `savesIsApproximate` boolean: True when engagement.saves looks display-rounded rather than exact.
      - `downloads` integer: Exact 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.
    - `hashtags` string[]: Hashtags extracted from the text.
    - `mentions` unknown[]: Accounts mentioned in the text.
      - unknown
    - `musicName` string: Name of the soundtrack used.
    - `musicId` string: ID of the soundtrack used.
    - `musicAuthor` string: Music author. Example: "Khabane lame".
    - `isOriginalSound` boolean: Is original sound. Example: true.
    - `locationCreated` string: ISO country for the video's posting/serving locale — not the creator's home country (see author.region / profile-region).
    - `authorRegion` string: Creator'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).
    - `descLanguage` unknown
    - `shopProductUrl` unknown
    - `isAd` boolean: Whether the item is a paid promotion.
    - `isCommerce` boolean: True when TikTok marks the item as commerce / shop-capable.
    - `isBrandedContent` boolean: True when TikTok marks the item as brand-organic / branded content.
    - `isPaidPartnership` boolean: True when TikTok marks the item as a paid partnership.
    - `status` object
      - `allowComment` boolean: Whether comments are allowed. Unknown on both the web page and the mobile aweme is false — not null. Same shared boolean rule as twitter/profile.
      - `allowShare` boolean: Whether shares are allowed. Unknown on both the web page and the mobile aweme is false — not null.
      - `isPrivate` boolean: Whether the account is private.
      - `isDeleted` boolean: Is deleted. Example: false.
      - `inReview` boolean: In review. Example: false.
      - `isProhibited` boolean: Is prohibited. Example: false.
    - `fetchedAt` string: When 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.

## Other responses

- `400`: Bad request: wrong platform URL, unknown endpoint, or an invalid parameter value. Not billed.
- `401`: Missing, invalid or revoked API key. Not billed.
- `402`: Not enough credits for this request. Not billed.
- `404`: The resource does not exist or is not public. Not billed.
- `422`: A required parameter is missing or has the wrong type. Not billed.
- `429`: Rate limit reached. Wait for Retry-After seconds. Not billed.
- `502`: The platform could not be reached or returned nothing usable. Retryable, not billed. 503 and 504 use the same envelope.

---

[API](https://skmtc.dev/captapi/apis/captapi-api.md) · [All operations](https://skmtc.dev/captapi/apis/captapi-api/llms.txt) · [OpenAPI document](https://skmtc.dev/captapi/apis/captapi-api/revisions/c9b9ac5ff1bd?raw)
