TikTok Song Details API
TikTok sound metadata — usageCount, artists[{id,secUid,handle}], audio{bpm,loudness,beats}, commerce rights (1 credit native).
GET request to /v1/tiktok/song-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 Song Details API?
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 / stages / timings. Pair with Music Posts to list videos on the sound. Flat 1 credit on the native path; Apify fallback bills 2.
What you get
- id is the URL music id (string, never a JS-rounded number)
- coverUrl canonical; size variants under raw.cover
- artists null when unknown (never [] for “we don't know”)
- audio{bpm,loudnessLufs,beats} — analysis, not a play URL
- 1 credit native
Try it
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
curl "https://api.captapi.com/v1/tiktok/song-details?url=https%3A%2F%2Fwww.tiktok.com%2Fmusic%2FPumpin-Blood-7659457659034175489" \
-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,
"data": {
"platform": "tiktok",
"url": "https://www.tiktok.com/music/Pumpin-Blood-7659457659034175489",
"id": "7659457659034175489",
"title": "Pumpin Blood",
"author": "TWINSICK & NONONO",
"artists": [
{
"id": "6749206263416161285",
"uid": "6749206263416161285",
"secUid": "MS4wLjABAAAA38xoRsEaXL5TLeUkSCGHTo-RvU9P485jMPZSIiBjhQ4-uQiq3rS4FIDrP5O_Y0yW",
"handle": "twinsick",
"displayName": "TWINSICK",
"verified": true,
"avatarUrl": "https://p16-common-sign.tiktokcdn.com/tos-maliva-avt-0068/119173022434f9a952213ee3344b3539~tplv-tiktokx-cropcenter-q:168:168:q70.webp?dr=10792&idc=my2&ps=87d6e48a&refresh_token=7dd6ae52&s=MUSIC_AWEME&sc=avatar&shcp=f6441914&shp=d05b14bd&t=223449c4&x-expires=1785783600&x-signature=NqCTSbDLT8umzbrTEziv7%2FkGOI0%3D"
},
{
"id": "7308738121520235553",
"uid": "7308738121520235553",
"secUid": "MS4wLjABAAAA4_Viygw3rG9RFqavMKpGvCNaiyjZlizM_LYw1Qe4M5eEo-MLAztgyRwUbK6vYVNT",
"handle": "nononoofficial",
"displayName": "NONONO",
"verified": false,
"avatarUrl": "https://p16-common-sign.tiktokcdn.com/tos-useast2a-avt-0068-euttp/0ce5a0d0b5f22cf5d263875e8c0a2702~tplv-tiktokx-cropcenter-q:168:168:q70.webp?dr=10792&idc=my2&ps=87d6e48a&refresh_token=f4958d29&s=MUSIC_AWEME&sc=avatar&shcp=f6441914&shp=d05b14bd&t=223449c4&x-expires=1785783600&x-signature=lhH%2BscwS89J4V4PRehJ%2F3rjbKR8%3D"
}
],
"isOriginalSound": false,
"isAuthorArtist": true,
"album": "Pumpin Blood",
"coverUrl": "https://p77-sg.tiktokcdn.com/aweme/720x720/tos-alisg-v-2774/ogkAESQZAtNDXBDkBAgFZTWoEfNeqjEB8AV7MC.jpeg",
"cover": {
"large": "https://p77-sg.tiktokcdn.com/aweme/720x720/tos-alisg-v-2774/ogkAESQZAtNDXBDkBAgFZTWoEfNeqjEB8AV7MC.jpeg",
"medium": "https://p77-sg.tiktokcdn.com/aweme/200x200/tos-alisg-v-2774/ogkAESQZAtNDXBDkBAgFZTWoEfNeqjEB8AV7MC.jpeg",
"thumb": "https://p77-sg.tiktokcdn.com/aweme/100x100/tos-alisg-v-2774/ogkAESQZAtNDXBDkBAgFZTWoEfNeqjEB8AV7MC.jpeg"
},
"playUrl": "https://sf16-ies-music-sg.tiktokcdn.com/obj/tos-alisg-ve-2774/oUBA3erMBM5LhL55CXiLQNZYpBfcqjBIingAtS",
"usageCount": 11100,
"usageCountIsApproximate": true,
"createdAt": "2026-07-06T16:51:01.000Z",
"isCommerceMusic": true,
"hasCommerceRight": false,
"commercialRightType": "licensed",
"matchedSong": {
"id": "7659443114000369680",
"title": "Pumpin Blood",
"author": "TWINSICK & NONONO",
"fullDuration": 46673,
"chorusInfo": {
"startMs": 0,
"durationMs": 30528
}
},
"musicReleaseInfo": {
"groupReleaseDate": "2026-07-06T00:00:00.000Z",
"groupReleaseTimestamp": 1783296000,
"isNewReleaseSong": true
},
"audio": {
"bpm": null,
"loudnessLufs": -8.160819,
"amplitudePeak": 1.3610525,
"beats": {
"audioEffectOnset": "https://sf16-ies-music-sg.tiktokcdn.com/obj/tos-alisg-v-2774/osAA6oEIIAgqFiTfrVFDceC9UIpRjtCtDBiZAl",
"beatsTracker": "https://sf77-ies-music-sg.tiktokcdn.com/obj/tos-alisg-v-2774/oQEBvfGFLAzjne62AzRQFCuaNJJQQGAeAUXFyI",
"energyTrace": "https://sf16-ies-music-sg.tiktokcdn.com/obj/tos-alisg-v-2774/okGP6eevAu6XULAaetqCFjaIInQB9QOAz2EAJz",
"mergedBeats": "https://sf77-ies-music-sg.tiktokcdn.com/obj/tos-alisg-v-2774/og6OlA6azQsFfaFeJEQAu6GUAhELIBjXCADven"
},
"strongBeatUrl": "https://sf77-ies-music-sg.tiktokcdn.com/obj/tos-alisg-v-2774/oYQUDfpKtEpQEARfgAqgFBAQErZECAB0BBpAlP"
},
"durationSeconds": 46,
"artistId": "6749206263416161285",
"authorSecUid": "MS4wLjABAAAA38xoRsEaXL5TLeUkSCGHTo-RvU9P485jMPZSIiBjhQ4-uQiq3rS4FIDrP5O_Y0yW",
"isExplicit": null,
"hasLyrics": null
}
}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 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.titleTitle of the item.authorAuthor name or handle.isOriginalSoundIs original sound. Example: false.isAuthorArtistIs author artist. Example: true.albumAlbum the track belongs to.coverUrlSound 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.playUrlPreview 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.usageCountHow 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.usageCountIsApproximatetrue 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.createdAtCreation date (ISO 8601).isCommerceMusicTikTok classifies the track as commercial-relevant music. true with hasCommerceRight false is the "licensed" tier — not a contradiction.hasCommerceRightWhether the requesting context holds the commercial usage right — false for anonymous reads of licensed tracks.commercialRightTypeDecoded 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.durationSecondsTrack length in seconds.artistIdPrimary artist / sound-owner user id when TikTok exposes one.authorSecUidPrimary artist / sound-owner secUid when TikTok exposes one.isExplicitIs explicit.hasLyricsHas lyrics.
Artists
Each item in artists contains:
idId of this artists item.uidUid. Example: "6749206263416161285".secUidTikTok secure user ID — required for many platform-internal list endpoints.handleAccount handle.displayNameDisplay name of the account. Canonical across profile endpoints (prefer over name).verifiedWhether the account is verified on this platform.avatarUrlAvatar url URL.
Cover
The cover object contains:
largeLarge URL.mediumMedium URL.thumbThumb URL.
Matched song
The matchedSong object contains:
idId of this matched song item.titleTitle of this matched song item.authorAuthor name or handle.fullDurationFull duration. Example: 46673.chorusInfoObject with startMs, durationMs.
Music release info
The musicReleaseInfo object contains:
groupReleaseDateGroup release date. Example: "2026-07-06T00:00:00.000Z".groupReleaseTimestampGroup release timestamp. Example: 1783296000.isNewReleaseSongIs new release song. Example: true.
Audio
The audio object contains:
bpmBpm.loudnessLufsLoudness lufs. Example: -8.160819.amplitudePeakAmplitude peak. Example: 1.3610525.beatsObject with audioEffectOnset, beatsTracker, energyTrace, mergedBeats.strongBeatUrlStrong beat url URL.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| url | string | Yes | TikTok music/sound URL, e.g. https://tiktok.com/music/name-ID. 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. |
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.
How it works
- 1. Sign up — get 100 free credits, no card required.
- 2. Create a key from your dashboard.
- 3. Send one request to
/v1/tiktok/song-detailsand parse the JSON response.
Use cases
Sound Research
Pull title, artist, duration, and cover for a TikTok sound.
Usage Tracking
Read usageCount when TikTok exposes how many videos use the sound.
Commerce Rights
Check isCommerceMusic / hasCommerceRight before brand use.
Audio Analysis
audio{bpm,loudnessLufs,beats} powers sync, remix and edit tooling.
Audio Pipelines
Pair with Music Posts to list videos on the same sound.
Frequently asked questions
What does the TikTok Song Details API do?+
The TikTok Song Details API lets you fetch full metadata and key stats from a public TikTok sound or track using one GET request to /v1/tiktok/song-details. It returns clean JSON — no OAuth or infrastructure setup required.
How many credits does the TikTok Song 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.
Does playUrl expire?+
Usually no. Song-details playUrl typically has no x-expires and no hex path stamp — unlike video URLs (~24h) and cover art (~48h x-expires). mediaUrlsExpireAt is null next to a populated playUrl when the audio URL is unsigned; that is correct, not a missing parse. If coverUrl is signed, mediaUrlsExpireAt is the cover stamp. Persist the music id.
Why was id different from the number in the URL?+
A 19-digit TikTok music id is past Number.MAX_SAFE_INTEGER. Anything that touches it as a JS number (JSON.parse, a numeric cast) silently rounds it — the classic trailing-zero signature (…896000 instead of …895873). This endpoint now keeps the URL id as a string end to end. Use id as the join key; it matches the URL and popular-songs songId.
Is the TikTok Song 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.
More TikTok APIs
Ready to use the TikTok Song Details API?
Sign up, grab your key, and make your first call in 60 seconds.