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

# TikTok Song Details API

`GET /v1/tiktok/song-details`

## Request

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

TikTok sound metadata — usageCount, artists[{id,secUid,handle}], audio{bpm,loudness,beats}, commerce rights (1 credit; 2 via the fallback path).

Paste a TikTok music/sound URL and get the sound as clean JSON. id is the music id from the URL, kept as a string end to end — never a JS number (19-digit TikTok ids sit past Number.MAX_SAFE_INTEGER and silently round). title, author, artistId/authorSecUid, artists[{id,uid,secUid,handle,displayName,verified,avatarUrl}] (null when unknown — never [] meaning “we know there are none”; a name-only artist is lifted from author when TikTok ships no uid). durationSeconds, coverUrl (canonical cover art; size variants live under raw.cover), playUrl, mediaUrlsExpireAt. playUrl on this surface is typically unsigned (no x-expires, no hex path stamp) and does not expire — mediaUrlsExpireAt stays null then, which is correct; when coverUrl carries x-expires (~48h) the field is that stamp. usageCount (videos using the sound) with usageCountIsApproximate (true on display-rounded totals; null when usageCount is null — never false about a missing count). createdAt, isExplicit/hasLyrics when present, and isOriginalSound. The differentiator: audio{bpm,loudnessLufs,amplitudePeak,beats,strongBeatUrl} — TikTok's own audio analysis when exposed (this is not a play URL). Commerce: isCommerceMusic, hasCommerceRight, commercialRightType decoded to none/commercial/licensed. Label tracks add matchedSong and musicReleaseInfo. Every 200 ships source (native/extended) and timings. Resilience: a transient TikTok mobile-API blip is retried in-request before the fallback path runs, and if the extended row comes back as a mostly-null shell (title but no author, cover or usage count) the native path is tried once more after the fallback's natural delay — so a 40s wait no longer ends in a shell of nulls. Pair with Music Posts to list videos on the sound. 1 credit when served natively; 2 credits when served via the fallback path (source: extended, may take longer) — in the last 30 days 38 of 43 calls were served that way and billed 2.

Docs: https://captapi.com/apis/tiktok-song-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.
    - `title` string: Title of the item.
    - `author` string: Author name or handle.
    - `artists` object[]
      - `id` string: Id of this artists item.
      - `uid` string: Uid. Example: "6749206263416161285".
      - `secUid` string: TikTok secure user ID — required for many platform-internal list endpoints.
      - `handle` string: Account handle.
      - `displayName` string: Display name of the account. Canonical across profile endpoints (prefer over name).
      - `verified` boolean: Whether the account is verified on this platform.
      - `avatarUrl` string: Avatar url URL.
    - `isOriginalSound` boolean: Is original sound. Example: false.
    - `isAuthorArtist` boolean: Is author artist. Example: true.
    - `album` string: Album the track belongs to.
    - `coverUrl` string: Sound cover art. Canonical cover field (size variants under raw.cover). Signed CDN when TikTok stamps x-expires (~48h) — persist the music id, not this URL. See mediaUrlsExpireAt.
    - `cover` object
      - `large` string: Large URL.
      - `medium` string: Medium URL.
      - `thumb` string: Thumb URL.
    - `playUrl` string: Preview audio CDN URL when TikTok exposes one. On this surface the URL is typically unsigned (no x-expires, no hex path stamp) and does not expire. That is a third TikTok URL lifetime, distinct from video ~24h and image ~48h. Persist the music id; the link is refetchable, not a ticking CDN.
    - `usageCount` integer: How many TikTok videos use this sound when TikTok exposes the total. Null when the music/aweme embed and music page omit it — never a fake zero.
    - `usageCountIsApproximate` boolean: true when usageCount is display-rounded (e.g. 11.1K → 11100); false when the integer is exact; null when usageCount is null — never false about a missing count.
    - `createdAt` string: Creation date (ISO 8601).
    - `isCommerceMusic` boolean: TikTok classifies the track as commercial-relevant music. true with hasCommerceRight false is the "licensed" tier — not a contradiction.
    - `hasCommerceRight` boolean: Whether the requesting context holds the commercial usage right — false for anonymous reads of licensed tracks.
    - `commercialRightType` string: Decoded licensing tier: "none" (ordinary sound, no commercial clearance), "commercial" (Commercial Music Library — pre-cleared, hasCommerceRight true), "licensed" (major-label/general-library track — organic use only, hasCommerceRight false), "unknown" (upstream 0). Unrecognized future tiers pass through as the raw integer.
    - `matchedSong` object
      - `id` string: Id of this matched song item.
      - `title` string: Title of this matched song item.
      - `author` string: Author name or handle.
      - `fullDuration` integer: Full duration. Example: 46673.
      - `chorusInfo` object: Object with startMs, durationMs.
        - `startMs` integer
        - `durationMs` integer
    - `musicReleaseInfo` object
      - `groupReleaseDate` string: Group release date. Example: "2026-07-06T00:00:00.000Z".
      - `groupReleaseTimestamp` integer: Group release timestamp. Example: 1783296000.
      - `isNewReleaseSong` boolean: Is new release song. Example: true.
    - `audio` object
      - `bpm` unknown
      - `loudnessLufs` number: Loudness lufs. Example: -8.160819.
      - `amplitudePeak` number: Amplitude peak. Example: 1.3610525.
      - `beats` object: Object with audioEffectOnset, beatsTracker, energyTrace, mergedBeats.
        - `audioEffectOnset` string
        - `beatsTracker` string
        - `energyTrace` string
        - `mergedBeats` string
      - `strongBeatUrl` string: Strong beat url URL.
    - `durationSeconds` integer: Track length in seconds.
    - `artistId` string: Primary artist / sound-owner user id when TikTok exposes one.
    - `authorSecUid` string: Primary artist / sound-owner secUid when TikTok exposes one.
    - `isExplicit` unknown
    - `hasLyrics` unknown

## 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)
