TikTok API endpoint
Returns the app's music-collection LIST (`mc_list` of collection objects with covers), the browse list of curated music collections. This is a different route from `/api/v1/tiktok/mobile/music/collections`, which is the collection FEED (`mcf_list`, with each entry's music inline). The upstream is `/aweme/v1/music/collection/`. Unlike the feed, this route PAGES for real: `count` is honoured (measured 1 -> 1 item with `cursor: 1, has_more: 1`; 5 -> 5 items with `cursor: 5`; 10/100 -> all 8 collections) and `cursor` advances (measured `count=5&cursor=5` -> the remaining 3 with `has_more: 0`). A negative count answers upstream status 5, which is rejected locally. Measured 2026-10-21 with the pure-Go (device-free) signer: 8 collections total. The route is not signature-gated, so it does not need the device-backed signer.
/tiktok/mobile/music/collection-listThe app's music-collection browse list: curated music collections with covers. The upstream is
GET /aweme/v1/music/collection/, captured from the running 47.4.3 app and reproduced end-to-end against the live
gateway.
A different route from the collection feed. /api/v1/tiktok/mobile/music/collections is the collection
feed (/aweme/v1/music/collection/feed/, mcf_list, each entry carrying its music list inline) and is
first-page-only. This endpoint is the collection list (mc_list, the browse catalogue); it is a separate
upstream route and, unlike the feed, it pages for real.
Pages for real. count is honoured (measured count=1 → 1 item with cursor: 1, has_more: true; count=5 →
5 items with cursor: 5; count=10/100 → all 8 collections) and cursor advances: count=5&cursor=5 returned
the remaining 3 collections with has_more: false, and a cursor past the end returned an empty page. A negative
count answers upstream status 5, which this API rejects locally as a 400.
Device-free. The pure-Go placeholder signer returned the same collections, 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:
count: optional. Page size, 1–50 accepted; honoured for small values and capped by the collection set.
Omitted means the app default (which returned all 8 measured collections).cursor: optional. The cursor from the previous response; 0/omitted is the first page.Errors:
count/cursor are out of range.| call | result |
|---|---|
bare / count=10 / count=100 | all 8 collections, cursor: 10/100, has_more: false |
count=1 | 1 collection, cursor: 1, has_more: true |
count=5 | 5 collections, cursor: 5, has_more: true |
count=5&cursor=5 | the remaining 3 collections, cursor: 10, has_more: false |
count=5&cursor=10 | empty page (past the end) |
count=-1 | upstream status 5 "Invalid parameters" → rejected locally as 400 |
| shipped-service canary | page1=5 cursor=5 has_more=true page2=3 has_more=false |
Example request:
GET /api/v1/tiktok/mobile/music/collection-list?count=5&cursor=5
Example response (truncated):
{
"code": 200,
"msg": "OK",
"data": {
"mc_list": [
{
"mc_id": "6572392040036829954",
"title": "Summer Hits",
"cover": {"url_list": ["https://p16-...tiktokcdn-us.com/..."]},
"aweme_cover": {"url_list": ["..."]}
}
],
"cursor": 10,
"has_more": false,
"msg": "",
"status_code": 0,
"status_msg": ""
}
}
Notes for callers:
cursor + has_more; count controls page size but the collection set is small (8 measured), so
larger counts simply return everything./api/v1/tiktok/mobile/music/collections) returns inline; use this list to browse first, then the feed or the
sound endpoints for the tracks.| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| x-api-key (header) | string | Yes | API key required | ||
| count | integer | No | Page size: honoured (1-50 measured, capped by the collection set) | 5 | |
| cursor | integer | No | Next-page token from the previous response (0 = first page) | 5 |
curl -X GET "https://api.crawlora.net/api/v1/tiktok/mobile/music/collection-list?count=10" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"mc_list": [
{
"mc_id": "6572392040036829954",
"title": "Summer Hits",
"cover": {
"url_list": [
"https://p16-...tiktokcdn-us.com/..."
]
},
"aweme_cover": {
"url_list": [
"..."
]
}
}
],
"cursor": 10,
"has_more": false,
"msg": "",
"status_code": 0,
"status_msg": ""
}
}Request schema
No body schema
Response schema
#/definitions/tiktokmobile.musicCollectionListResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| cursor | integer | No | 5 | |||
| extra | unknown | No | ||||
| has_more | boolean | No | true | |||
| log_pb | unknown | No | ||||
| mc_list | array | No | ||||
| msg | string | No | ||||
| status_code | integer | No | 0 | |||
| status_msg | string | No |
| Status | Description | Schema |
|---|---|---|
| 400 | Invalid input | #/definitions/app.Response |
| 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/collection-list?count=10" \
-H "x-api-key: $CRAWLORA_API_KEY"