TikTok API endpoint
Returns the app's "music choices" list: the recommended sounds it offers on the video-creation page. The upstream is `/aweme/v1/music/choices/`; each `music_list` entry is the same full sound object the chart routes return (title, album, artists, covers, play URL, duration, ...). Measured 2026-10-21 with the pure-Go (device-free) signer: 56,078 B / 6 full sound objects on one call and 7 on later calls (the same six at the front), and the payload carries NO paging fields (no cursor/has_more), so this is a one-shot recommendation list. The measured `item_id`, `music_id`, `count` and `scene` parameters did not deterministically change the list — the recommendations rotate — so none is exposed. The route is not signature-gated, so it does not need the device-backed signer.
/tiktok/mobile/music/choicesThe "music choices" list TikTok offers on the video-creation page: a small set of recommended sounds for the video
being made. The upstream is GET /aweme/v1/music/choices/, captured from the running 47.4.3 app and reproduced
end-to-end against the live gateway.
What a sound carries. Each music_list entry is the same full sound object the chart routes return: title,
album, artists (with avatars), cover/cover_medium/cover_large, play URL, duration and the sound's playback
metadata.
One-shot. The measured payload carries no paging fields (no cursor, no has_more), so this is a single
recommendation page. The recommended set rotates between calls — measured 6 sounds on one call and 7 on later calls
with the same six at the front — and the app-side item_id, music_id, count and scene parameters were each
measured and did not deterministically change it. The endpoint therefore takes no parameters rather than exposing
controls that don't work.
Device-free. The pure-Go placeholder signer returned the same sounds, so a deployment needs
TIKTOK_MOBILE_PARAMS but not the device-backed signer (TIKTOK_MOBILE_SIGNER_URL). It answers on the core
aggr16-normal.tiktokv.us / api16-normal-useast5.tiktokv.us pair.
Query parameters: none.
Errors:
| call | result |
|---|---|
| bare | 56,078 B; 6 full sound objects (first title "One Call Away") |
| later bare calls | 7 sounds, the same six at the front |
item_id / music_id / count / scene (each) | no deterministic change to the recommended set |
| shipped-service canary | sounds=6 first="One Call Away" |
Example request:
GET /api/v1/tiktok/mobile/music/choices
Example response (truncated):
{
"code": 200,
"msg": "OK",
"data": {
"music_list": [
{
"id": 6353936740163521282,
"title": "One Call Away",
"album": "One Call Away",
"duration": 30,
"artists": [{"name": "...", "avatar": {"url_list": ["https://p16-...tiktokcdn-us.com/..."]}}],
"play_url": {"uri": "...", "url_list": ["..."]},
"cover_large": {"url_list": ["..."]}
}
],
"status_code": 0,
"status_msg": ""
}
}
Notes for callers:
/api/v1/tiktok/mobile/music/trending or /api/v1/tiktok/mobile/music/pick for the charts, and
/api/v1/tiktok/mobile/music/posts for the videos using one sound./api/v1/tiktok/mobile/music/detail.| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/tiktok/mobile/music/choices" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"music_list": [
{
"id": 6353936740163522000,
"title": "One Call Away",
"album": "One Call Away",
"duration": 30,
"artists": [
{
"name": "...",
"avatar": {
"url_list": [
"https://p16-...tiktokcdn-us.com/..."
]
}
}
],
"play_url": {
"uri": "...",
"url_list": [
"..."
]
},
"cover_large": {
"url_list": [
"..."
]
}
}
],
"status_code": 0,
"status_msg": ""
}
}Request schema
No body schema
Response schema
#/definitions/tiktokmobile.musicChoicesResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| extra | unknown | No | ||||
| log_pb | unknown | No | ||||
| music_list | array | No | ||||
| status_code | integer | No | 0 | |||
| status_msg | string | No |
| Status | Description | Schema |
|---|---|---|
| 429 | Rate limit exceeded | #/definitions/app.Response |
| 500 | Internal server error | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/tiktok/mobile/music/choices" \
-H "x-api-key: $CRAWLORA_API_KEY"