TikTok Sound Scraper - Videos by Song, Music ID or URL
Pricing
Pay per event
TikTok Sound Scraper - Videos by Song, Music ID or URL
Scrape every TikTok video that used a sound. Paste the music link from any video or the bare id and get the videos with captions, authors, views, likes, comments and shares, plus a row describing the track itself.
TikTok Sound Scraper: every video that used a song
Paste the music link from any TikTok video, or the bare sound id, and get every video that used that sound: caption, author, follower count, views, likes, comments, shares, post date and the media addresses. Plus one row describing the track itself.
No login, no API key, no TikTok developer account.
What you get
Per video: video_id, url, description, created_at, handle,
nickname, author_id, author_verified, follower_count,
author_video_count, play_count, like_count, comment_count,
share_count, collect_count, duration_seconds, width, height,
cover_url, play_url, download_url, hashtags, is_ad, and the
sound_id the row belongs to.
Per sound: music_id, music_title, music_author, music_url,
music_cover_url, music_duration_seconds, music_is_original,
music_album, and videos_returned.
Optional: eight extra author fields, and downloads of the videos, thumbnails, avatars, sound artwork and photo-post slideshow images into the run's key-value store.
Why a sound is the unit worth tracking
On TikTok a sound is a format. When a track starts moving, the accounts using it are the accounts about to get reach, and the ones who got there first are visible in the post dates. A record label, a brand and a creator all want the same export from that: who used it, how big they are, how well it did for them, and when.
The app shows you a sound page and no way to export it. This is that page as rows.
Where to find a sound id
Open any TikTok video and the sound is the link at the bottom. It looks like:
https://www.tiktok.com/music/original-sound-7286756730682476546https://www.tiktok.com/music/Dance-Monkey-6745334339318729474
Paste the whole link or just the number at the end. The words in the middle are decorative and are ignored; the number is what resolves. Anything that is neither a sound link nor a plausible id is reported by name rather than silently skipped, so a run of fifty tells you exactly which line was wrong.
This one pages properly
Unlike a lot of TikTok surfaces, the sound feed is a real paginated feed: about 30 videos per request with a working cursor, measured at 0.5 to 0.7 seconds a page. Three pages returned 87 distinct videos.
So maxVideosPerSound is the honest control over both time and cost. There is
no re-asking trick and no rotation to work around.
The track's own details come off the first video
TikTok's sound page renders nothing on the server: there is no track record on it to read, and the endpoint that would return one answers with an error. So the title, author, artwork, duration and whether it is an original or a licensed track are read off the first video in the feed, where TikTok includes them in full.
That has one consequence worth stating plainly. A sound with no videos gets
no sound row, because there is nothing to read it from. The run reports
soundsWithoutVideos so an empty answer reads as empty rather than as a
failure.
Filters cost pages, and the summary says so
Every filter is applied to the rows the run collected. The feed takes no date
or popularity parameter, so a narrow window reads more pages and returns
fewer rows. The summary carries videosScanned, videosRejectedByFilters and
pagesRead so the cost of a filter is visible rather than hidden.
Input
| Field | Type | Notes |
|---|---|---|
sounds | array | Music links or bare ids, one per line. Required. |
maxVideosPerSound | integer | Default 60, up to 400. About 30 per request. |
resultsPerPage | integer | 1 to 30, default 30. |
sortBy | select | relevance, most_liked, most_viewed, most_commented, most_shared, newest, oldest. |
oldestPostDate | string | YYYY-MM-DD, an ISO timestamp, or 7 days / 3 months. |
newestPostDate | string | Same formats. |
leastDiggs | integer | Minimum likes. |
mostDiggs | integer | Maximum likes. Useful for finding small accounts. |
excludeAds | boolean | Drop rows TikTok marks as advertising. |
scrapeAdditionalAuthorMeta | boolean | Eight extra author fields. Free. |
shouldDownloadVideos | boolean | Store the MP4 and put a working link on the row. |
shouldDownloadCovers | boolean | Store the thumbnail. |
shouldDownloadAvatars | boolean | Store the author avatar. |
shouldDownloadMusicCovers | boolean | Store the sound artwork. |
shouldDownloadSlideshowImages | boolean | Store each image of a photo post. |
maxMediaDownloads | integer | Ceiling across every download option. Default 50. |
country | string | Two-letter code. Feeds are regional. |
language | string | Two-letter code. |
proxyCountryCode | string | Where the request should appear to come from. |
Media links that actually work
A raw media address from TikTok returns 403 to anyone who pastes it elsewhere. Turn on a download option and the file lands in the run's key-value store with a public link on the row, which works anywhere.
Photo posts have no video at all. Those rows carry slideshow_images, and the
slideshow option stores each image.
What people use this for
Catching a sound early. Sort by oldest and the first users of a track are the top rows. Run the same sound weekly and the growth is the row count.
Creator discovery. Everyone using a sound, with follower counts, filtered to accounts below a ceiling. That is a list of creators in a format, priced before they are expensive.
Rights and licensing. music_is_original separates a creator's own audio
from a licensed track, and music_album names the release when there is one.
Campaign measurement. A branded sound run daily gives the number of videos, the total views across them and who posted, without asking anyone to report it.
Notes
View, like and comment counts are live and change through the day. A run is a snapshot.
A sound with no videos, or an id that is not a sound, is reported with the reason rather than returning an empty table that reads as a track nobody used.
Free Apify plans are capped at 10 results per run. The run stops collecting at that point rather than paging the whole feed and discarding it.