Skip to main content
TikTok’s Commercial Music Library (CML) gives you pre-cleared tracks for organic posts and ads. No copyright roulette. Here’s how it works, what the endpoint returns, and the quirks that’ll bite you if you don’t read this.

The Endpoint

GET /api/v1/misc/tiktok/cml/trending-list Returns up to 100 trending tracks. Filter by genre and time window.

Query Parameters

ParameterTypeDefaultDescription
teamIdstringrequiredYour team ID
genrestring"POP"Genre filter. See supported genres below
dateRangestring"7DAY"1DAY, 7DAY, or 30DAY – how far back to rank popularity

Response Shape

The response is a flat array of track objects.
[
  {
    "commercial_music_name": "Lo-Fi analog beat",
    "duration": 183,
    "thumbnail_url": "https://...",
    "artist": "Gloveity",
    "preview_url": "https://...",
    "genres": ["HIP_HOP/RAP", "LO-FI"],
    "rank_position": "1",
    "trending_history": [
      { "date": "2026-02-15", "rank_position_daily": "1" }
    ],
    "full_duration_song_clip": {
      "preview_url": "https://...",
      "duration": 183,
      "song_clip_id": "6817312022837872642"
    },
    "trending_song_clip": {
      "preview_url": "https://...",
      "duration": 183,
      "song_clip_id": "6817312022837872642"
    }
  }
]

Supported Genres

A sample of what’s available: POP, ROCK, LATIN, METAL, ELECTRONIC, HIP_HOP/RAP, ALTERNATIVE/INDIE, R&B/SOUL, COUNTRY, CLASSICAL, JAZZ, CHILL_BEATS, CHILLOUT, LO-FI, EDM, HOUSE, TECHNO, K-POP, J-POP, DANCE_POP, INDIE_POP, and more. Check the Swagger spec for the full enum.

Using Music in Posts

When creating a post with data.TIKTOK.musicSoundInfo, you pass the song_clip_id as musicSoundId. That’s it for the ID part.

Video vs Image: Different Rules

Content TypeWhat you can pass
VIDEOmusicSoundId (required), musicSoundVolume, musicSoundStart, musicSoundEnd, videoOriginalSoundVolume
IMAGEOnly musicSoundId. No volume, no start/end. Photos get one knob: which track. That’s it.
For IMAGE posts, pass only musicSoundId. If you send musicSoundVolume, musicSoundStart, etc., TikTok’s API will reject the request. We strip those fields server-side for IMAGE type so you don’t have to remember – but if you’re building a form, don’t show volume/trim controls for photo posts.

Video: Volume & Trim

For videos, you get real control:
  • musicSoundVolume (0–100): How loud the music is.
  • videoOriginalSoundVolume (0–100): How loud the original video audio (your voice, etc.) is.
  • musicSoundStart / musicSoundEnd (ms): Trim the track. Start at 100ms, end at 30000ms – you get that slice. If musicSoundEnd is 0 or ≤ musicSoundStart, we don’t send it (TikTok would reject it). Omit both for the full track.
So yeah, you can make the music louder than your voice, or the other way around.

The Draft Gotcha

Here’s the thing: draft uploads don’t persist your music choice. When you set uploadToDraft: true, TikTok uploads the post to the creator’s drafts. Success. But TikTok’s draft flow doesn’t store which track you picked.

INBOX status (Draft Success)

When you upload as draft, TikTok sometimes returns diffrent status instead of PUBLISH_COMPLETE. That means: “we put it in the creator’s inbox as a draft, all good.” We treat that as success when uploadToDraft is true. If you’re not using drafts and you get this, something odd happened – reach out.

Quick Reference

TaskWhat to use
Get trending tracksGET /api/v1/misc/tiktok/cml/trending-list?teamId=...&genre=POP&dateRange=7DAY
ID for postsong_clip_id from full_duration_song_clip or trending_song_clip
Video: full trackmusicSoundId only (or omit start/end)
Video: trim + volumemusicSoundId, musicSoundVolume, videoOriginalSoundVolume, musicSoundStart, musicSoundEnd
Image: any musicmusicSoundId only
DraftsDon’t rely on music persisting
Need the full request/response schema? Check Swagger – the CML endpoint is under misc/tiktok.