SoundCloud Charts, Search & Artist Catalog Scraper
Scrape SoundCloud without an API key: global and genre New & Hot charts, keyword search with real genre filters, full artist catalogs, playlist contents, comments, followers, engagement metrics, artwork, waveform and stream metadata.
Input schema
Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | Choose the intent. Keyword search, New & Hot charts, an artist catalog, specific URLs, track comments, or an artist's followers. |
searchQueries | array | optional | One or more keywords or artist names (mode=search). Example: lofi, techno, ambient jazz. |
searchType | string | optional | What kind of results to return (mode=search). |
Show all input fields
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | Choose the intent. Keyword search, New & Hot charts, an artist catalog, specific URLs, track comments, or an artist's followers. |
searchQueries | array | optional | One or more keywords or artist names (mode=search). Example: lofi, techno, ambient jazz. |
searchType | string | optional | What kind of results to return (mode=search). |
chartGenre | string | optional | Global New & Hot returns up to 100 tracks. Genre values use SoundCloud's current trending-by-genre lists (about 50 tracks each). |
searchGenre | string | optional | Optional SoundCloud genre filter for track and playlist searches. Leave as any genre to search everything. This is a real SoundCloud filter, not a client-side guess. |
sortBy | string | optional | How to order the rows already fetched. SoundCloud search itself is relevance-ordered, so this is a client-side sort of that result set. |
minPlayCount | integer | optional | Drop track/playlist rows below this play count after fetching. 0 means no filter. |
minLikeCount | integer | optional | Drop track/playlist rows below this like count after fetching. 0 means no filter. |
artistUrls | array | optional | Artist profile URLs, usernames, or numeric user IDs. Used by artistTracks and followers modes. |
includeTracks | boolean | optional | Include the artist's uploaded tracks. |
includeAlbums | boolean | optional | Include the artist's albums/EPs as playlist rows. |
includePlaylists | boolean | optional | Include the artist's playlists as playlist rows. |
includeTopTracks | boolean | optional | Include SoundCloud's small top-tracks list for each artist. |
includeWebProfiles | boolean | optional | Add the artist's public social/web profile links to the profile row. |
startUrls | array | optional | Track, playlist/album, or artist URLs. Numeric track IDs are also accepted. Used by mode=byUrl. |
includePlaylistTracks | boolean | optional | For playlist URLs, hydrate and emit every track (not just the first five). |
includeUserProfile | boolean | optional | For artist URLs in mode=byUrl, emit the profile row before the tracks. |
trackUrls | array | optional | Tracks whose public comments should be collected. Used by mode=comments. |
commentsSort | string | optional | How SoundCloud should order comments. |
relationship | string | optional | For mode=followers, collect the artist's followers or the accounts the artist follows. |
resolveStreamUrls | boolean | optional | Add a playable signed stream URL plus protocol, preview and expiry fields. Signed URLs expire after about two hours. Turn off for large runs if you only need the stable API endpoint. |
maxItems | integer | optional | Hard cap on dataset rows. SoundCloud search still returns at most 300 rows per query; charts and per-artist sections have their own source limits. |
Download the published input schema
View complete JSON
{
"description": "Search SoundCloud, read the global or genre New & Hot charts, export an artist catalog, resolve track/playlist/profile URLs, collect comments, or list followers.",
"properties": {
"artistUrls": {
"default": [],
"description": "Artist profile URLs, usernames, or numeric user IDs. Used by artistTracks and followers modes.",
"editor": "stringList",
"items": {
"type": "string"
},
"prefill": [],
"sectionCaption": "Artist catalog",
"sectionDescription": "Controls what is exported for each artist profile. The profile row is always included in artistTracks.",
"title": "Artists",
"type": "array"
},
"chartGenre": {
"default": "all",
"description": "Global New & Hot returns up to 100 tracks. Genre values use SoundCloud's current trending-by-genre lists (about 50 tracks each).",
"editor": "select",
"enum": [
"all",
"all-genres",
"trap",
"hip-hop",
"pop",
"electronic",
"r-n-b",
"alternative-hip-hop",
"indie",
"dubstep",
"house",
"folk",
"alternative-rock",
"ambient",
"hardcore",
"rock",
"reggae",
"latin",
"metal",
"dancehall",
"afrobeat"
],
"enumTitles": [
"Global New & Hot (100)",
"All Genres (system list, ~50)",
"Trap",
"Hip Hop",
"Pop",
"Electronic",
"R&B",
"Alternative Hip Hop",
"Indie",
"Dubstep",
"House",
"Folk",
"Alternative Rock",
"Ambient",
"Hardcore",
"Rock",
"Reggae",
"Latin",
"Metal",
"Dancehall",
"Afrobeat"
],
"prefill": "all",
"title": "Chart genre",
"type": "string"
},
"commentsSort": {
"default": "newest",
"description": "How SoundCloud should order comments.",
"editor": "select",
"enum": [
"newest",
"oldest",
"track-timestamp"
],
"enumTitles": [
"Newest first",
"Oldest first",
"By time in track"
],
"prefill": "newest",
"title": "Comment order",
"type": "string"
},
"includeAlbums": {
"default": false,
"description": "Include the artist's albums/EPs as playlist rows.",
"prefill": false,
"title": "Include albums",
"type": "boolean"
},
"includePlaylistTracks": {
"default": true,
"description": "For playlist URLs, hydrate and emit every track (not just the first five).",
"prefill": true,
"title": "Expand playlist tracks",
"type": "boolean"
},
"includePlaylists": {
"default": false,
"description": "Include the artist's playlists as playlist rows.",
"prefill": false,
"title": "Include playlists",
"type": "boolean"
},
"includeTopTracks": {
"default": false,
"description": "Include SoundCloud's small top-tracks list for each artist.",
"prefill": false,
"title": "Include top tracks",
"type": "boolean"
},
"includeTracks": {
"default": true,
"description": "Include the artist's uploaded tracks.",
"prefill": true,
"title": "Include tracks",
"type": "boolean"
},
"includeUserProfile": {
"default": true,
"description": "For artist URLs in mode=byUrl, emit the profile row before the tracks.",
"prefill": true,
"title": "Include artist profile row",
"type": "boolean"
},
"includeWebProfiles": {
"default": false,
"description": "Add the artist's public social/web profile links to the profile row.",
"prefill": false,
"title": "Include web profiles",
"type": "boolean"
},
"maxItems": {
"default": 100,
"description": "Hard cap on dataset rows. SoundCloud search still returns at most 300 rows per query; charts and per-artist sections have their own source limits.",
"maximum": 5000,
"minimum": 1,
"prefill": 2,
"title": "Maximum records",
"type": "integer"
},
"minLikeCount": {
"default": 0,
"description": "Drop track/playlist rows below this like count after fetching. 0 means no filter.",
"maximum": 1000000000,
"minimum": 0,
"prefill": 0,
"title": "Minimum likes",
"type": "integer"
},
"minPlayCount": {
"default": 0,
"description": "Drop track/playlist rows below this play count after fetching. 0 means no filter.",
"maximum": 1000000000,
"minimum": 0,
"prefill": 0,
"title": "Minimum plays",
"type": "integer"
},
"mode": {
"default": "search",
"description": "Choose the intent. Keyword search, New & Hot charts, an artist catalog, specific URLs, track comments, or an artist's followers.",
"editor": "select",
"enum": [
"search",
"charts",
"artistTracks",
"byUrl",
"comments",
"followers"
],
"enumTitles": [
"Search by keyword - tracks, users, playlists or albums",
"Charts - global New & Hot or a genre trending list",
"Artist catalog - profile, tracks, albums, playlists",
"Track, playlist or artist URLs",
"Track comments",
"Artist followers or followings"
],
"prefill": "search",
"title": "What to collect",
"type": "string"
},
"relationship": {
"default": "followers",
"description": "For mode=followers, collect the artist's followers or the accounts the artist follows.",
"editor": "select",
"enum": [
"followers",
"followings"
],
"enumTitles": [
"Followers",
"Accounts followed"
],
"prefill": "followers",
"title": "Follower relationship",
"type": "string"
},
"resolveStreamUrls": {
"default": true,
"description": "Add a playable signed stream URL plus protocol, preview and expiry fields. Signed URLs expire after about two hours. Turn off for large runs if you only need the stable API endpoint.",
"prefill": true,
"sectionCaption": "Advanced",
"sectionDescription": "Stream resolution and the overall record cap.",
"title": "Resolve playable stream URLs",
"type": "boolean"
},
"searchGenre": {
"default": "",
"description": "Optional SoundCloud genre filter for track and playlist searches. Leave as any genre to search everything. This is a real SoundCloud filter, not a client-side guess.",
"editor": "select",
"enum": [
"",
"Alternative Rock",
"Ambient",
"Classical",
"Country",
"Dance & EDM",
"Dancehall",
"Deep House",
"Disco",
"Drum & Bass",
"Dubstep",
"Electronic",
"Folk & Singer-Songwriter",
"Hip-hop & Rap",
"House",
"Indie",
"Jazz & Blues",
"Latin",
"Metal",
"Piano",
"Pop",
"R&B & Soul",
"Reggae",
"Reggaeton",
"Rock",
"Soundtrack",
"Techno",
"Trance",
"Trap",
"Trip Hop",
"World",
"Lo-fi",
"Lofi"
],
"enumTitles": [
"(any genre)",
"Alternative Rock",
"Ambient",
"Classical",
"Country",
"Dance & EDM",
"Dancehall",
"Deep House",
"Disco",
"Drum & Bass",
"Dubstep",
"Electronic",
"Folk & Singer-Songwriter",
"Hip-hop & Rap",
"House",
"Indie",
"Jazz & Blues",
"Latin",
"Metal",
"Piano",
"Pop",
"R&B & Soul",
"Reggae",
"Reggaeton",
"Rock",
"Soundtrack",
"Techno",
"Trance",
"Trap",
"Trip Hop",
"World",
"Lo-fi",
"Lofi"
],
"prefill": "",
"sectionCaption": "Search filters",
"sectionDescription": "Optional refinements for mode=search. Genre is applied by SoundCloud; sort and minimum counts are applied to the fetched rows.",
"title": "Genre filter",
"type": "string"
},
"searchQueries": {
"default": [],
"description": "One or more keywords or artist names (mode=search). Example: lofi, techno, ambient jazz.",
"editor": "stringList",
"items": {
"type": "string"
},
"prefill": [
"lofi"
],
"title": "Search queries",
"type": "array"
},
"searchType": {
"default": "tracks",
"description": "What kind of results to return (mode=search).",
"editor": "select",
"enum": [
"tracks",
"users",
"playlists",
"albums",
"all"
],
"enumTitles": [
"Tracks",
"Users / artists",
"Playlists",
"Albums",
"All result types"
],
"prefill": "tracks",
"title": "Search result type",
"type": "string"
},
"sortBy": {
"default": "relevance",
"description": "How to order the rows already fetched. SoundCloud search itself is relevance-ordered, so this is a client-side sort of that result set.",
"editor": "select",
"enum": [
"relevance",
"newest",
"mostPlayed",
"mostLiked"
],
"enumTitles": [
"Relevance (source order)",
"Newest upload",
"Most played",
"Most liked"
],
"prefill": "relevance",
"title": "Sort fetched rows",
"type": "string"
},
"startUrls": {
"default": [],
"description": "Track, playlist/album, or artist URLs. Numeric track IDs are also accepted. Used by mode=byUrl.",
"editor": "requestListSources",
"items": {
"properties": {
"url": {
"description": "SoundCloud track, playlist, album, user, or search URL.",
"title": "URL",
"type": "string"
}
},
"type": "object"
},
"prefill": [],
"sectionCaption": "URLs and playlists",
"sectionDescription": "Playlist URLs export the playlist row and, when enabled, every track in it. Artist URLs export the profile and uploaded tracks.",
"title": "SoundCloud URLs or IDs",
"type": "array"
},
"trackUrls": {
"default": [],
"description": "Tracks whose public comments should be collected. Used by mode=comments.",
"editor": "requestListSources",
"items": {
"properties": {
"url": {
"description": "SoundCloud track URL used for comments mode.",
"title": "URL",
"type": "string"
}
},
"type": "object"
},
"prefill": [],
"sectionCaption": "Comments and audience",
"sectionDescription": "Comment collection and follower/following collection. These modes keep the track or artist context on every row.",
"title": "Track URLs or IDs",
"type": "array"
}
},
"required": [
"mode"
],
"schemaVersion": 1,
"title": "SoundCloud Scraper Input",
"type": "object"
}
Output schema
Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.
| Field | Type | Required | Description |
|---|---|---|---|
soundcloud | string | optional | Dataset containing every scraped SoundCloud track, artist, playlist/album and comment row. |
Download the published output schema
View complete JSON
{
"actorOutputSchemaVersion": 1,
"description": "SoundCloud tracks, artists, playlists, albums and comments - charts, search results, full artist catalogs, playlist contents, engagement metrics, creator details, artwork, waveform and stream metadata.",
"properties": {
"soundcloud": {
"description": "Dataset containing every scraped SoundCloud track, artist, playlist/album and comment row.",
"template": "{{links.apiDefaultDatasetUrl}}/items",
"title": "SoundCloud records",
"type": "string"
}
},
"title": "SoundCloud Charts, Search & Artist Catalog Scraper Output"
}
Dataset schema
Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.
Download the published dataset schema
View complete JSON
{
"actorSpecification": 1,
"views": {
"overview": {
"display": {
"component": "table",
"properties": {}
},
"title": "SoundCloud records",
"transformation": {
"fields": [
"recordType",
"title",
"artist",
"playCount",
"likeCount",
"genre",
"uploadDate",
"url"
]
}
}
}
}
Key-value schema
Published key-value store definitions, when provided by this build.
This definition is not present in the default published build. See the published README for available documentation.
Published README
Read the full published documentation
SoundCloud Charts, Search & Artist Catalog Scraper
Pull public SoundCloud data into one clean dataset: the current global New & Hot chart, 20 genre trending lists, keyword search across tracks, artists, playlists and albums, complete artist catalogs, playlist contents, track comments, and artist followers. No SoundCloud account, cookie or API key is required.
What this actor does
- Search tracks, users/artists, playlists or albums by keyword, with a real SoundCloud genre filter for tracks and playlists.
- Charts the global New & Hot list (up to 100 tracks) or one of 20 current genre trending lists (about 50 tracks each).
- Artist catalog exports the profile row plus uploaded tracks and, optionally, albums, playlists, top tracks and public web profiles.
- URLs resolves any public track, playlist/album or artist URL. Playlist URLs expand into every track, not just the first page. Artist URLs return the profile and uploaded tracks.
- Comments collects public comments for one or more tracks, including the commenter's profile fields and the time in the track.
- Followers collects an artist's followers or the accounts the artist follows.
- Empty fields are omitted from records. No
null, blank strings or empty arrays are pushed.
Output records
Every row has a recordType: track, user, playlist or comment. Existing
field names are preserved; the revamp adds fields beside them.
Track fields
| Field | Meaning |
|---|---|
recordType |
track |
title, url, trackId, urn |
Track identity and canonical page URL |
artist, artistUrl, artistId |
Uploader identity |
artistFollowers, artistVerified, artistCity, artistCountry, artistDescription |
Creator details when SoundCloud publishes them |
duration |
M:SS / H:MM:SS (unchanged legacy field) |
durationMs, durationSeconds |
Numeric duration |
playCount, likeCount, repostCount, commentCount, downloadCount |
Engagement snapshot |
genre, tags, description |
Uploader metadata when present |
uploadDate, lastModified, releaseDate |
ISO-8601 dates |
labelName, license, isrc, upc |
Release and rights metadata when present |
publisherArtist, albumTitle, writerComposer, explicit |
Publisher metadata when present |
streamable, downloadable, hasDownloadsLeft, policy, monetizationModel |
Source playback flags |
streamUrl |
Playable signed media URL when resolveStreamUrls=true; otherwise the stable API transcoding URL |
streamUrlApi |
Stable SoundCloud transcoding endpoint (not directly playable without a client_id) |
streamUrlProtocol, streamUrlMimeType, streamUrlPreset |
Stream format details |
streamUrlExpiresAt |
Expiry of the signed media URL (about two hours) |
streamUrlIsPreview |
true for a 30-second preview / SNIP track |
artworkUrl, artworkUrlOriginal |
Cover image at 500x500 and original size |
waveformUrl |
Waveform amplitude JSON (not an image) |
chartGenre, chartRank, chartScore, chartLastUpdated |
Chart context |
playlistId, playlistTitle, playlistUrl, playlistPosition |
Playlist context when a playlist is expanded |
sourceQuery, sourceType, sourceUrl |
What input produced the row |
scrapedAt |
ISO-8601 scrape time |
User / artist fields
recordType=user; keeps title, url, trackId, artist, artistUrl,
playCount, likeCount, repostCount, description, artworkUrl, scrapedAt.
Adds userId, username, fullName, followersCount, followingsCount,
trackCount, playlistCount, commentsCount, verified, pro, city,
countryCode, lastModified, webProfiles, relationship (followers mode),
sourceArtistId, sourceArtistUsername.
Playlist / album fields
recordType=playlist; keeps title, url, trackId, artist, artistUrl,
duration, likeCount, repostCount, genre, description, uploadDate,
artworkUrl, scrapedAt. Adds playlistId, urn, trackCount, setType,
isAlbum, tags, releaseDate, lastModified, durationMs, labelName.
Comment fields
recordType=comment; commentId, body, createdAt, timestampMs,
timestampFormatted, trackId, trackTitle, trackUrl, userId, username,
userUrl, userFollowers, userCity, userCountry, scrapedAt.
Input
| Field | Type | Default | What it does |
|---|---|---|---|
mode |
select | search |
search, charts, artistTracks, byUrl, comments, followers |
searchQueries |
string list | [] |
One or more search keywords |
searchType |
select | tracks |
tracks, users, playlists, albums, all |
chartGenre |
select | all |
Global New & Hot or one of 20 genre trending lists |
searchGenre |
select | any genre | Real SoundCloud genre filter for track/playlist search |
sortBy |
select | relevance |
relevance, newest, mostPlayed, mostLiked (client-side) |
minPlayCount, minLikeCount |
integer | 0 |
Client-side thresholds after fetching |
artistUrls |
string list | [] |
Artist URLs, usernames or numeric user IDs |
includeTracks |
boolean | true |
Artist tracks |
includeAlbums |
boolean | false |
Artist albums/EPs |
includePlaylists |
boolean | false |
Artist playlists |
includeTopTracks |
boolean | false |
Artist top tracks |
includeWebProfiles |
boolean | false |
Public social/web profile links |
startUrls |
URL list | [] |
Track, playlist or artist URLs / numeric track IDs |
includePlaylistTracks |
boolean | true |
Expand every playlist track |
includeUserProfile |
boolean | true |
Emit the profile row for artist URLs in byUrl |
trackUrls |
URL list | [] |
Tracks for comments mode |
commentsSort |
select | newest |
newest, oldest, track-timestamp |
relationship |
select | followers |
followers or followings |
resolveStreamUrls |
boolean | true |
Resolve signed playable stream URLs + expiry |
maxItems |
integer | 100 |
Hard record cap (1-5000) |
Examples
Search tracks with a genre filter
{
"mode": "search",
"searchQueries": ["lofi", "ambient jazz"],
"searchType": "tracks",
"searchGenre": "Jazz & Blues",
"maxItems": 100
}
Global New & Hot chart
{ "mode": "charts", "chartGenre": "all", "maxItems": 100 }
Trap trending list
{ "mode": "charts", "chartGenre": "trap", "maxItems": 50 }
Full artist catalog
{
"mode": "artistTracks",
"artistUrls": ["https://soundcloud.com/chillhopdotcom"],
"includeTracks": true,
"includeAlbums": true,
"includePlaylists": true,
"maxItems": 500
}
Expand a playlist
{
"mode": "byUrl",
"startUrls": ["https://soundcloud.com/chillhopdotcom/sets/chillhop-essentials-summer-2026"],
"includePlaylistTracks": true,
"maxItems": 300
}
Track comments
{
"mode": "comments",
"trackUrls": ["https://soundcloud.com/user/track"],
"commentsSort": "newest",
"maxItems": 200
}
Artist followers
{
"mode": "followers",
"artistUrls": ["https://soundcloud.com/chillhopdotcom"],
"relationship": "followers",
"maxItems": 500
}
Charts: what is available
SoundCloud's current public chart surface is New & Hot, not the retired all-time Top chart. The actor returns:
- the global New & Hot list (up to 100 tracks), and
- 20 current genre trending lists (about 50 tracks each).
The old per-genre chart endpoint and the all-time Top chart are no longer available
from SoundCloud's public API. Requests for the legacy top value are mapped to the
current global New & Hot list and the status message says so.
Stream URLs, previews and rights
Stream metadata comes from SoundCloud's public transcodings. streamUrl is a
signed media URL and expires after about two hours; streamUrlExpiresAt records
the exact time. streamUrlApi is the stable API endpoint, but it is not playable on
its own without a client_id.
Not every track is fully playable: SoundCloud may return a 30-second preview
(streamUrlIsPreview=true), use DRM/encrypted transcodings, or disable downloads.
The actor reports the metadata it can see and never fabricates an audio file. This
actor does not download or rehost audio.
Limitations
- Search returns at most 300 rows per query. Use more queries or a genre filter to reach further.
- The all-time Top chart and regional/country charts are not available from the current public surface.
- Server-side BPM, duration, upload-date, license and access filters are not
available on SoundCloud's public v2 search; the actor only exposes the real
genre filter.
sortByand the minimum play/like thresholds are applied to the rows already fetched. - SoundCloud does not publish a user join date or a user repost count in this API.
- BPM and musical key are not exposed for tracks.
- City/country, description, genre, tags, ISRC, UPC, label and release date are conditional; fields are omitted when SoundCloud does not provide them.
- Only public tracks, playlists and profiles are reachable. Private/unlisted content is out of scope.
- Huge follower lists can be expensive; use
maxItemsto cap them.
FAQ
Do I need a SoundCloud account or API key? No. The actor reads the same public pages and public v2 JSON the SoundCloud web player uses, with no login.
Why is streamUrl sometimes missing? SoundCloud may expose only encrypted/DRM
transcodings or a preview for that track. streamUrlApi, policy and the preview
flag still describe what is available.
Why does a search stop at 300 rows? That is SoundCloud's public search window
per query. Split the job into more queries or use searchGenre to partition it.
Why is waveformUrl a JSON file? SoundCloud's waveform field points to amplitude
JSON, not an image. It is kept under the existing field name for compatibility.
Can I schedule monitoring? Yes. Run the actor on a schedule and compare
playCount, likeCount, repostCount and followersCount snapshots. Monitoring
helpers are not part of this version; the dataset is designed for external diffing.
Is this affiliated with SoundCloud? No. This is an independent actor that reads publicly visible data and is not endorsed by SoundCloud.
Python quickstart
Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.
Source build kzMuZBsSVkEqN6Prx. Documentation is regenerated from the default published build; private drafts are not included.