SoundCloud Scraper — Music Data & Artist Emails
Pricing
from $6.00 / 1,000 soundcloud result saveds
SoundCloud Scraper — Music Data & Artist Emails
Scrape public SoundCloud tracks, artists, playlists, catalogs and search results without cookies, for A&R, music research, outreach and monitoring. Returns engagement metrics, ISRCs, tags, URLs and publicly listed contact emails.
Pricing
from $6.00 / 1,000 soundcloud result saveds
Rating
0.0
(0)
Developer
Khadin Akbar
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
SoundCloud Scraper — Tracks, Artists & Playlists
Scrape public SoundCloud tracks, artists, playlists, artist catalogs, and search results from keywords or public URLs. Each saved row represents one normalized SoundCloud entity, with fields such as titles, canonical URLs, artist names, public descriptions or bios, tags, genre, engagement metrics, ISRC, UPC, labels, release dates, and publicly listed contact emails. The outcome is a structured Apify dataset you can use for music research, outreach preparation, monitoring, and AI workflows.
Best fit and connected workflows
This Actor fits workflows that begin with a SoundCloud search term or a public SoundCloud URL and end with structured music metadata in an Apify dataset. It is well suited for:
- track discovery with plays, likes, reposts, comments, tags, genre, label, and ISRC data,
- artist research with follower counts, following counts, playlists, verification, location, and public emails,
- direct scraping of public track, artist, and playlist URLs,
- artist catalog collection from public artist profile URLs,
- playlist metadata capture, with optional expansion into track rows,
- Apify MCP-based agent workflows that need normalized SoundCloud records.
Practical scenario
A music researcher has a public SoundCloud artist profile and wants a short catalog snapshot. They choose artistTracks, paste the artist profile URL into startUrls, and keep maxResults small while checking the output shape. The returned rows can include entityType, title, artistName, trackCount, followersCount, verified, tags, isrc, and sourceUrl. Based on those fields, the researcher can decide whether to add the artist to a monitoring list or hand the catalog to an outreach step that reviews the public contact emails written in track or artist descriptions.
Input reference
| Field | Type | Purpose | Default |
|---|---|---|---|
mode | string | Chooses search, direct URL scraping, or artist catalog collection. | searchTracks |
searchQueries | array of strings | Up to 20 SoundCloud keywords or phrases for search modes. | ["lofi hip hop"] |
startUrls | array of objects | Up to 50 public SoundCloud track, artist, or playlist URLs. | Working public track URL |
maxResults | integer | Global cap for dataset rows and paid result events. | 25 |
includeContactEmails | boolean | Extracts public emails explicitly written in descriptions. | true |
expandPlaylists | boolean | Saves playlist track rows after the playlist row. | true |
dataSource | string | Chooses auto, native soundcloud, or scrapeCreators fallback. | auto |
Focused JSON example
{"mode": "scrapeUrls","startUrls": [{"url": "https://soundcloud.com/kehlanimusic/lights-on-feat-big-sean"},{"url": "https://soundcloud.com/kehlanimusic"}],"maxResults": 10,"includeContactEmails": true,"expandPlaylists": true,"dataSource": "auto"}
Output reference
| Field | Type | Meaning |
|---|---|---|
entityType | string | Normalized entity type: track, artist, or playlist. |
id | string | Stable SoundCloud identifier. |
url | string | Canonical public SoundCloud URL. |
title | string | Track, playlist, or artist title or username. |
description | string or null | Public description or biography. |
artistId | string or null | Associated SoundCloud artist ID. |
artistName | string or null | Public artist or owner name. |
artistUrl | string or null | Canonical artist profile URL. |
contactEmails | array | Public emails explicitly published in descriptions. |
genre | string or null | Genre from uploader metadata when available. |
tags | array | Normalized SoundCloud tags. |
durationMs | integer or null | Track or playlist duration in milliseconds. |
playbackCount | integer or null | Public plays for track rows. |
likesCount | integer or null | Public likes when available. |
repostsCount | integer or null | Public repost count when available. |
commentCount | integer or null | Public comment count when available. |
downloadCount | integer or null | Public download count when available. |
trackCount | integer or null | Track count for artist or playlist rows. |
playlistCount | integer or null | Public playlist count for artist rows. |
followersCount | integer or null | Public follower count. |
followingCount | integer or null | Public following count. |
verified | boolean or null | SoundCloud verification flag. |
artworkUrl | string or null | Track or playlist artwork URL. |
avatarUrl | string or null | Artist avatar URL. |
waveformUrl | string or null | Track waveform data URL. |
isrc | string or null | ISRC from publisher metadata. |
upc | string or null | UPC or EAN from publisher metadata. |
labelName | string or null | Label name. |
license | string or null | SoundCloud license identifier. |
releaseDate | string or null | ISO 8601 release date. |
createdAt | string or null | ISO 8601 creation timestamp. |
lastModifiedAt | string or null | ISO 8601 last update timestamp. |
isExplicit | boolean or null | Explicit-content flag. |
streamable | boolean or null | Public streamability flag. |
downloadable | boolean or null | Public download flag. |
city | string or null | Public artist city. |
countryCode | string or null | Public artist country code. |
sourceUrl | string | Input URL or search query that produced the record. |
dataSource | string | Route that supplied the record. |
scrapedAt | string | Timestamp when the row was normalized. |
warnings | array | Row-specific warnings, when present. |
Illustrative JSON record
{"entityType": "track","id": "123456789","url": "https://soundcloud.com/artist/example-track","title": "Example Track","description": "Public track description.","artistId": "2959954","artistName": "Example Artist","artistUrl": "https://soundcloud.com/exampleartist","contactEmails": ["bookings@example.org"],"genre": "Electronic","tags": ["electronic", "indie"],"durationMs": 218000,"playbackCount": 125000,"likesCount": 4200,"repostsCount": 310,"commentCount": 44,"downloadCount": null,"trackCount": null,"playlistCount": null,"followersCount": null,"followingCount": null,"verified": null,"artworkUrl": null,"avatarUrl": null,"waveformUrl": null,"isrc": "USAAA2500123","upc": null,"labelName": null,"license": null,"releaseDate": "2025-01-17T00:00:00.000Z","createdAt": "2025-01-17T12:00:00.000Z","lastModifiedAt": "2025-02-01T12:00:00.000Z","isExplicit": false,"streamable": true,"downloadable": false,"city": null,"countryCode": null,"sourceUrl": "lofi hip hop","dataSource": "soundcloud","scrapedAt": "2026-07-15T12:00:00.000Z","warnings": []}
How it works
The Actor uses SoundCloud public web data first. For supported direct track and artist routes, it can also use an owner-managed ScrapeCreators fallback when dataSource is set to auto or scrapeCreators. Search and playlist extraction stay on the native SoundCloud route, so soundcloud and auto are the relevant options for those workflows.
The input schema includes four modes:
searchTrackssearchArtistsscrapeUrlsartistTracks
maxResults sets the global limit for dataset rows and paid result events. Playlist rows count once, and expanded playlist tracks count as additional results. includeContactEmails extracts emails explicitly written in public descriptions. expandPlaylists controls whether playlist track rows are appended after the playlist row. The dataset uses a stable schema, and the terminal contract also writes compact OUTPUT and detailed RUN_SUMMARY records.
Pricing
This Actor uses Pay per event pricing plus standard Apify platform usage. The primary charged event is soundcloud-result, billed for each complete, schema-valid row saved to the default dataset. The Actor also charges the standard apify-actor-start event.
For the live pricing details, open the Pricing tab in Apify Console. As an example, a run that saves ten rows produces ten result events, plus the Actor start event and any platform usage associated with the run.
Use with AI agents (MCP)
This Actor is usable through Apify MCP as a structured SoundCloud data tool. The exact Actor identity is khadinakbar/soundcloud-scraper.
It is useful for agent workflows that need to search SoundCloud, inspect public artist profiles, collect playlist metadata, or extract public contact emails from published descriptions. Because the output is normalized, agents can read dataset rows directly instead of parsing SoundCloud pages.
Search SoundCloud for "lofi hip hop", return up to 10 rows, include public contact emails, and summarize the artist names, ISRC values, and engagement metrics from the dataset.
Output interpretation is straightforward:
- dataset rows are the primary results,
sourceUrlshows which query or URL produced each row,dataSourceshows whether the row came fromsoundcloudorscrapecreators,warningscarries row-specific notes when present.
For bounded agent runs, keep maxResults small and treat it as both an output cap and a cost cap. Pagination follows the selected SoundCloud route and stops when the global cap is reached.
API example
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('khadinakbar/soundcloud-scraper').call({mode: 'searchTracks',searchQueries: ['lofi hip hop'],maxResults: 10,includeContactEmails: true,expandPlaylists: true,dataSource: 'auto',});const dataset = await client.dataset(run.defaultDatasetId).listItems();console.log(dataset.items);
Python:
from apify_client import ApifyClientimport osclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("khadinakbar/soundcloud-scraper").call(run_input={"mode": "searchTracks","searchQueries": ["lofi hip hop"],"maxResults": 10,"includeContactEmails": True,"expandPlaylists": True,"dataSource": "auto",})items = client.dataset(run["defaultDatasetId"]).list_items().itemsprint(items)
Best results and outcome guidance
Use the narrowest mode that matches the job:
searchTracksfor track discovery,searchArtistsfor artist discovery,scrapeUrlsfor known public links,artistTracksfor catalog collection from an artist profile.
Keep maxResults aligned with the question you are asking. Small runs are useful for testing output shape and cost behavior. Public contact emails are most useful when a profile or track description explicitly includes them, while engagement fields help compare tracks and artists at a glance. Playlist workflows work well when you want the playlist row first and track rows afterward.
Continue the workflow
- Then use SoundCloud Artists Scraper — Emails & Socials to extend SoundCloud Scraper — Tracks, Artists & Playlists research with a complementary enrichment contract.
- Then use Spotify Scraper — All-in-One to extend SoundCloud Scraper — Tracks, Artists & Playlists with a neighboring creator and media research source when the brief calls for Spotify data.
Design note
I found that the dataset contract keeps every field explicit across tracks, artists, and playlists, including fields that often stay null such as upc, waveformUrl, and countryCode. That makes the row shape stable for exports and downstream joins.
FAQ
When should I use searchTracks versus searchArtists?
Use searchTracks when you want track-level engagement and metadata. Use searchArtists when the starting point is a name, label, or scene keyword and you want artist rows with follower and catalog fields.
Which mode is suited to a known SoundCloud link?
Use scrapeUrls. It accepts public track, artist, and playlist URLs, and it can expand playlists into track rows when expandPlaylists is enabled.
How do I collect an artist catalog?
Use artistTracks and provide artist profile URLs in startUrls. The output contains track rows associated with the artist profile.
How is the data source chosen?
Set dataSource to auto for public SoundCloud data first, with fallback support for eligible direct track and artist routes. Set soundcloud for native extraction only, or scrapeCreators for the owner-managed fallback route where supported.
What tells me whether a row came from SoundCloud or the fallback route?
Check dataSource in the dataset row. It is either soundcloud or scrapecreators.
Responsible use
This Actor works with public SoundCloud data only. It is built for public tracks, artists, playlists, search results, and published description fields. Respect SoundCloud terms, privacy rules, and applicable outreach laws when using public contact emails. The downloadable field reports a public metadata flag, and the Actor does not download audio. For longer jobs, split work into bounded runs and keep RUN_SUMMARY for audits and cost review.