# TikTok Music Scraper: who is using a sound

TikTok Music Scraper takes a TikTok sound and returns the posts built on it, each with the track’s own metadata, the creator behind the post, and the engagement it earned.

[Run this scraper free](https://apify.com/apidojo/tiktok-music-scraper)

[See the three jobs](#jobs)

apidojo/tiktok-music-scraper

**Sounds**

**Posts returned**

Estimated run cost

$0.00

Free Apify plan: 5 runs a month, 10 items a run. No credit card.

**$0.003** per sound, the family’s cheapest query

**~11** posts included in that

**$0.0003** per post after

**100–300** posts per second

Read on 27 September 2026.

## Three inputs, and one the listing leaves vague

The parameter list is the shortest in the family. The only awkward part is the first one: the listing says music URLs are supported but never shows what one looks like.

-   The one input the source does not illustrate

    `startUrls`

    $0.003per sound

    ~11 posts included

    The link to a sound page on TikTok. Open a sound from any post that uses it and copy the address. The listing gives no example of the format.

    `<TikTok sound page URL>`

-   `startUrls (bulk)`

    × $0.003one fee each

    11 free per sound

    Many sounds in one run. Each brings its own query fee and its own free allowance, and the allowance is worth more.

    `Twelve sound URLs in one array`

-   `maxItems`

    ÷ $0.0003cap the spend

    Run-wide

    Total posts across the run. Leave it empty and the listing warns both this and "maximum charged results" default to unlimited.

    `1000`

Because a sound page is the only way in, the usual route to this actor is another one: take song.id or song.title off a Location or Profile run, find the sound, and come back.

**Apify actor:** apidojo/tiktok-music-scraper

**Inputs:** startUrls · maxItems · customMapFunction

**Accepts:** TikTok music and sound URLs

**Returns:** Post records, each carrying the song block that produced them

**Billing:** $0.003 a sound including ~11 posts, then $0.0003 each

**Scaling:** Ten sounds at 1,000 posts cost less than one sound at 1,000 posts

**Login or proxy:** Neither. Public posts only

**Reliability:** 61.53% of 1,682 runs succeeded in the last 30 days, the lowest in the family

## One track, a watchlist, or a trend you caught elsewhere

The arithmetic below is the reason to read this section. Spreading a budget across many sounds does not cost more than spending it on one. It costs slightly less.

**01 One track $0.003 + $0.0003 past ~11**

**02 A watchlist More sounds, no more money**

**03 A pivot $0.003 a sound, items free**

### How do you find the posts using a TikTok sound?

Put the sound URL in startUrls. The query is $0.003 and carries about eleven posts with it; after that each post is $0.0003. A thousand posts on one track comes to $0.30.

Input

```
{
  "startUrls": ["<TikTok sound page URL>"],
  "maxItems": 1000
}
```

$0.003 + 989 × $0.0003 \= **$0.30**

What comes back

The **post record**, The post that used the sound, with its reach.

```
{
  "id": "7310663737562631457",
  "title": "#duet with @The Tus House…",
  "views": 2597080,
  "likes": 200239,
  "comments": 894,
  "shares": 493,
  "bookmarks": 5597,
  "uploadedAtFormatted": "2023-12-09T18:29:08.000Z"
}
```

One sound is the least efficient way to spend $0.30

The query fee is trivial and the free allowance is not. Committing a whole budget to a single track means paying item rates for everything past the eleventh post, while the same money spread over ten tracks buys ten allowances first.

### Can you track several TikTok sounds at once?

Yes, and it is cheaper. Ten sounds sharing a thousand posts costs $0.30, fractionally less than one sound taking a thousand posts alone, because the nine extra allowances outweigh the nine extra query fees.

Input

```
{
  "startUrls": [
    "<sound URL 1>", "<sound URL 2>", "<sound URL 3>"
  ],
  "maxItems": 1000
}
```

10 × $0.003 + 890 × $0.0003 \= **$0.30**

What comes back

The **song block**, On every row, so a ten-sound run needs no labelling to stay sorted.

```
{
  "song": {
    "id": 7257270916026191000,
    "title": "original sound - thetushouse",
    "artist": "The Tus House",
    "album": "",
    "duration": 64,
    "cover": "https://p19.tiktokcdn-us.com/img/…"
  }
}
```

Unlike a location run, provenance survives the batch

Every record names the sound it came from inside its song block, so you can group a mixed run on song.id afterwards. Set maxItems for the run as a whole and let the popular tracks take the larger share.

### How do you check whether a sound is actually spreading?

Take the free page only. Eleven posts for three tenths of a cent tells you who is posting on a track and how big they are, and twenty sounds checked that way costs six cents with no item charges at all.

Input

```
{
  "startUrls": ["<TikTok sound page URL>"],
  "maxItems": 11
}
```

20 × $0.003 \= **$0.06**

What comes back

The **creator block**, Follower counts, which is how you tell a seeded track from a spreading one.

```
{
  "channel": {
    "username": "gordonramsayofficial",
    "verified": false,
    "followers": 39745807,
    "following": 513,
    "videos": 451
  }
}
```

Eleven is approximate

The listing writes it as "~11 posts" and calls it the first page, so treat it as roughly rather than exactly. Capping maxItems at 11 keeps a scan inside the allowance; a ceiling of 15 across twenty sounds costs a couple of cents in items.

## The post, and the track behind it

A record here is a post, not a song, the song rides along on it. That is worth noticing before you build a table: a thousand rows about one track repeat the same six song fields a thousand times.

-   6

    The track

    song, on every row

    -   id
    -   title
    -   artist
    -   album, often empty
    -   duration, seconds
    -   cover
-   8

    The post

    What used it

    -   id, title
    -   views, likes, comments
    -   shares, bookmarks
    -   hashtags
    -   postPage
-   9

    The creator

    channel

    -   name, username, id, url
    -   avatar
    -   verified
    -   followers, following
    -   videos
-   7

    The video

    video

    -   width, height, ratio
    -   duration
    -   url
    -   cover, thumbnail

**song.id:** The track’s identifier. Group a multi-sound run on it

**song.title:** Track name, including "original sound - handle" attributions

**song.artist:** Credited artist, which for an original sound is the creator

**song.album:** Album name where there is one. Empty string is normal

**song.duration:** Length of the track in seconds, often longer than the clip using it

**song.cover:** Cover art URL, signed and time-limited

**id · title:** The post’s ID and caption

**views · likes · comments:** How far this use of the sound travelled

**shares · bookmarks:** Saves and shares, the earliest signal a track is about to spread

**hashtags:** Tags on the post, which is how a sound and a challenge get connected

**channel.followers · videos:** Whether the track is being used by big accounts or small ones

**video.duration:** Clip length. Compare against song.duration to see which section is being used

**uploadedAt · uploadedAtFormatted:** Unix seconds and ISO 8601, sort on these to date a trend

**postPage:** Canonical link back to the post

video.duration against song.duration is the pairing worth keeping: a sixty-four second track being used in seven-second clips is a hook that found its audience, and knowing which sounds behave that way is most of what sound-led discovery amounts to.

## Things the listing is quiet about

Fewer rules than its siblings, and one notable omission. Where the source does not say, this page says it does not say.

-   01

    The URL format is not documented

    The input table says only that music URLs are supported, and the README shows no example of one, the only TikTok links it prints are a profile and a video. Copy the address from a sound page rather than constructing one.

-   02

    Both ceilings default to unlimited

    The troubleshooting section names maxItems and "maximum charged results" together and warns that leaving both empty produces infinite results. On a popular sound that is a large dataset arriving quickly.

-   03

    The free allowance is per sound

    About eleven posts come with each music query. Since the query itself is three tenths of a cent, adding sounds to a run is very close to free and adding depth is not.

-   04

    The Console preview is partial

    The listing asks you to open the Storage tab rather than judge the output from the overview, the song, video and channel blocks are all fuller in the download.

-   05

    This actor fails more often than its siblings

    Over the last thirty days 1,035 of 1,682 runs succeeded and 647 failed, which is 61.53% against 99%-plus elsewhere in the family. Budget for a retry, and check the Log tab when a run comes back empty.

Free accounts run in demo mode: 5 runs a month, 10 items each.

## Why ten sounds beat one

The listing publishes five worked examples and they all reproduce from the two charge events. Read the last two together: the same thousand posts cost the same whether they come from one track or ten, and the ten-track version is fractionally cheaper.

| Run | Method | Calculation | Cost |
| --- | --- | --- | --- |
| 11 posts | 1 sound, the free page | $0.003 | $0.003 |
| 220 posts | 20 sounds, free pages only | 20 × $0.003 | $0.06 |
| 100 posts | 1 sound | $0.003 + 89 × $0.0003 | $0.03 |
| 500 posts | 5 sounds | 5 × $0.003 + 445 × $0.0003 | $0.15 |
| 1,000 posts | 1 sound, deep | $0.003 + 989 × $0.0003 | $0.30 |
| 1,000 posts | 10 sounds, shared | 10 × $0.003 + 890 × $0.0003 | $0.30 |

The last two rows round to the same figure, and unrounded the ten-sound run is the cheaper of the two, $0.2970 against $0.2997. Nine extra allowances at roughly eleven posts each are worth more than nine extra queries at three tenths of a cent.

## Who follows the audio?

A sound is how a format travels on TikTok, which makes it a leading indicator where a hashtag is a lagging one. The people who care are the ones who need to know a week early.

-   Music marketing

    One track, deep

    Watch a release spread through creator posts and see which accounts picked it up first

    $0.30 per 1,000 posts

-   Trend forecasting

    A watchlist, scheduled

    Track ten candidate sounds nightly and compare growth between them on equal footing

    $0.30 per 1,000 posts across 10

-   Rights and licensing

    One track, deep

    Count commercial uses of a track with the creator and reach attached to each one

    $0.03 per 100-post sample

-   Brand campaign tracking

    A pivot, then deepen

    Measure whether a branded sound is actually being reused or only seeded by paid creators

    $0.06 per 20-sound scan

-   Creator strategy

    A pivot, weekly

    Sample the free page of twenty rising sounds to pick which to post on while they are early

    $0.003 per sound checked

## Watching a list of sounds

The actor is apidojo/tiktok-music-scraper. Two things to build in: batch the sounds, and retry, this actor’s failure rate is materially higher than its siblings’.

**Python**

**JavaScript**

**cURL**

```
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
ACTOR = "apidojo/tiktok-music-scraper"

def sounds(urls, cap=1000, attempts=3):
    # ~38% of runs failed over the last 30 days. Retry rather than assume.
    for _ in range(attempts):
        run = client.actor(ACTOR).call(run_input={"startUrls": urls, "maxItems": cap})
        rows = list(client.dataset(run.default_dataset_id).iterate_items())
        if rows:
            return rows
    return []

rows = sounds(["<sound URL 1>", "<sound URL 2>"])

# Every row names its own track, so a mixed run sorts itself.
from collections import defaultdict
by_track = defaultdict(list)
for r in rows:
    by_track[r["song"]["title"]].append(r)

for title, posts in by_track.items():
    reach = sum(p["views"] for p in posts)
    print(f"{title}: {len(posts)} posts, {reach:,} views")
```

```
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });

const run = await client.actor('apidojo/tiktok-music-scraper').call({
  startUrls: ['<sound URL 1>', '<sound URL 2>', '<sound URL 3>'],
  maxItems: 1000,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();

// A hook is a long track used in short clips. That ratio is the signal.
for (const p of items) {
  const share = p.video.duration / p.song.duration;
  if (share < 0.25) console.log(p.song.title, '→', p.video.duration.toFixed(1), 's clip');
}
```

```
curl -X POST \
  "https://api.apify.com/v2/acts/apidojo~tiktok-music-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"startUrls":["<TikTok sound page URL>"],"maxItems":11}'
```

The listing quotes 100–300 posts per second. Export as JSON, CSV or Excel from the Storage tab, and expect to repeat a run occasionally, see the reliability note above.

## TikTok Music Scraper FAQ

### How much does it cost to scrape a TikTok sound?

$0.003 for the music query, which includes roughly the first eleven posts, then $0.0003 for each post after. A thousand posts on one track is $0.30.

### Is it cheaper to track one sound or several?

Several. Ten sounds sharing a thousand posts costs $0.2970 against $0.2997 for one sound taking a thousand alone, because each extra sound brings another free allowance.

### What does a TikTok music URL look like?

The listing does not say, it states that music URLs are supported but shows no example, and the only links it prints are a profile and a video. Open the sound page from a post that uses the track and copy the address from there.

### Does each result say which sound it came from?

Yes. Every record carries a song block with the track’s id, title, artist, album, duration and cover, so a run covering several sounds can be grouped afterwards without extra labelling.

### Can I find out who used a sound first?

Sort on uploadedAt, which ships as Unix seconds alongside an ISO 8601 form. The earliest rows with small follower counts are usually where a track actually started.

### How reliable is this actor?

Less than its siblings. Over the last thirty days 1,035 of 1,682 runs succeeded and 647 failed, 61.53%, where the rest of the TikTok family sits above 99%. Build a retry into anything scheduled.

### How fast is it?

The listing states 100–300 posts per second.

### Can I get the audio file itself?

No. The song block carries metadata and cover art; video.url points at the post’s video file, not at an isolated audio track.

## Where TikTok Music Scraper fits

[Parent scraper TikTok Scraper Six scrapers, six doors into TikTok. This is the audio one, and the cheapest query in the family at three tenths of a cent, which is what makes watching a hundred sounds at once a reasonable thing to do.](/scrapers/tiktok-scraper/)

Sibling scrapers

-   [TikTok Location Scraper](/scrapers/tiktok-location-scraper/)
-   [TikTok Profile Scraper](/scrapers/tiktok-profile-scraper/)
-   [TikTok Comments Scraper](/scrapers/tiktok-comments-scraper/)

Guides

-   Spotting a hook: clip length against track length*Coming soon*
-   Running a nightly sound watchlist*Coming soon*
-   Seeded or spreading? Reading follower counts on a track*Coming soon*

## Check a sound

Three tenths of a cent, eleven posts in. Bring a list, not one track.

`startUrls: [sound URLs] · maxItems: 11`

[Run this scraper free](https://apify.com/apidojo/tiktok-music-scraper)

Apidojo is not affiliated with TikTok or ByteDance.
