TikTok API endpoint
Lists the videos that use one sound, as the mobile app returns them: `aweme_list` of full video objects (with `author`, `statistics` and `added_sound_music_info`), plus `cursor` and `has_more`. `music_id` is required. `count` is accepted but ignored upstream - the server returns its own default page, so page with `cursor`.
/tiktok/mobile/music/postssort selects which upstream listing backs the call:
fresh (default): the newest videos using the sound (/aweme/v1/music/fresh/aweme/). Device-free: it
answers with the standard request signature.popular: the app's canonical music.posts list (/aweme/v1/music/aweme/) - the popular ordering shown
when a user opens a sound. This listing is gated on the signature value, so it requires the device-backed
signing service: when that service is not configured the endpoint fails closed with a typed 500 error
instead of returning the gateway's empty soft block as if it were an empty page.music_id is required on both listings: without it the upstream answers status_code: 5 "Invalid parameters".
count is accepted for shape compatibility but is ignored by the server on both listings: measured
count=5, count=10 and count=20 against the same music_id returned byte-identical bodies. The server
serves its own page (about 13 items for fresh, 8 for popular), so page with cursor (set it to the
returned cursor) rather than trying to size the page. On the popular listing the cursor advances 0 -> 12
-> 24 across the first three pages.
popular pages additionally carry can_pin_video and need_lazy_loading at the envelope level, and their
video objects are slightly narrower (136 keys versus 145 on fresh) because that listing omits fields it
does not serve.
Query parameters:
music_id: required. Sound (music) id.sort: optional. Selects the listing. Allowed values: fresh, popular. Default: fresh.count: optional. Accepted for compatibility; the server ignores it (max 50). Default: 0.cursor: optional. Pagination cursor. Default: 0.Example response (sort=popular):
{
"code": 200,
"msg": "OK",
"data": {
"aweme_list": [
{
"aweme_id": "7681236055831416084",
"desc": "example",
"create_time": 1788178688,
"author": {"unique_id": "example", "uid": "7552757483087250449"},
"added_sound_music_info": {"id_str": "6799585653702019073", "title": "Lofi"},
"statistics": {"aweme_id": "7681236055831416084", "play_count": 1, "digg_count": 2}
}
],
"cursor": 12,
"has_more": 1,
"can_pin_video": false,
"need_lazy_loading": false,
"extra": {"logid": "example", "now": 1792283000},
"log_pb": {"impr_id": "example"},
"status_code": 0,
"status_msg": ""
}
}
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| x-api-key (header) | string | Yes | API key required | ||
| music_id | string | Yes | Sound (music) id | 6799585653702019073 | |
| sort | string | No | Listing: fresh (newest, default) or popular (app canonical music.posts list; requires the device-backed signer) Allowed values: fresh, popular. | ||
| count | integer | No | Accepted for compatibility; the server ignores it (max 50) | ||
| cursor | integer | No | Pagination cursor |
curl -X GET "https://api.crawlora.net/api/v1/tiktok/mobile/music/posts?music_id=6799585653702019073&sort=fresh&count=10" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"aweme_list": [
{
"aweme_id": "7681236055831416084",
"desc": "example",
"create_time": 1788178688,
"author": {
"unique_id": "example",
"uid": "7552757483087250449"
},
"added_sound_music_info": {
"id_str": "6799585653702019073",
"title": "Lofi"
},
"statistics": {
"aweme_id": "7681236055831416084",
"play_count": 1,
"digg_count": 2
}
}
],
"cursor": 12,
"has_more": 1,
"can_pin_video": false,
"need_lazy_loading": false,
"extra": {
"logid": "example",
"now": 1792283000
},
"log_pb": {
"impr_id": "example"
},
"status_code": 0,
"status_msg": ""
}
}Request schema
No body schema
Response schema
#/definitions/tiktokmobile.musicFreshAwemeResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | tiktokmobile.MusicFreshAwemeResponse | No | ||||
| data.aweme_list | array | No | ||||
| data.can_pin_video | unknown | No | popular listing only | |||
| data.cursor | integer | No | ||||
| data.extra | unknown | No | ||||
| data.has_more | boolean | No | ||||
| data.log_pb | unknown | No | ||||
| data.need_lazy_loading | unknown | No | popular listing only | |||
| data.status_code | integer | No | ||||
| data.status_msg | string | No | ||||
| msg | string | No | OK |
| 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/posts?music_id=6799585653702019073&sort=fresh&count=10" \
-H "x-api-key: $CRAWLORA_API_KEY"