# SoundCloud Scraper — Tracks, Playlists, Artists & Comments (`brilliant_gum/soundcloud-scraper`) Actor

HTTP-only, no-login SoundCloud scraper via public api-v2. Tracks, playlists, artists, search, comments, likes & reposts feeds. Adds resolved MP3/HLS stream URLs, engagement analytics, dedup & monitoring.

- **URL**: https://apify.com/brilliant\_gum/soundcloud-scraper.md
- **Developed by:** [Yuliia Kulakova](https://apify.com/brilliant_gum) (community)
- **Categories:** Social media
- **Stats:** 2 total users, 1 monthly users, 75.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.006 / item scraped

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## SoundCloud Scraper — Tracks, Playlists, Artists, Comments & Search

![SoundCloud Scraper](https://api.apify.com/v2/key-value-stores/IuFu0Cw6PpOkNkDV7/records/soundcloud-banner)

Extract SoundCloud **tracks, playlists/sets, artist profiles, comments, and search results** — no API key, no login, no cookies. Pure HTTP, no browser — fast and cheap.

Access is managed automatically at runtime and self-heals if credentials rotate mid-run — so it keeps working without any manual key management.

### Modes

| Mode | Input | What you get |
|------|-------|--------------|
| **Search tracks** | `searchQueries` | Tracks matching a keyword/genre/artist |
| **Search playlists** | `searchQueries` | Playlists/sets matching a query |
| **Search users/artists** | `searchQueries` | Artist/creator profiles |
| **Track by URL** | `startUrls` | Full metadata for a track |
| **Playlist/Set by URL** | `startUrls` | Playlist metadata (+ optional child tracks) |
| **User profile + tracks** | `startUrls` | Artist profile + all public tracks |
| **User likes feed** *(extra)* | `startUrls` | Tracks/playlists a user has liked |
| **User reposts feed** *(extra)* | `startUrls` | Tracks/playlists a user has reposted |
| **Track comments** *(extra)* | `startUrls` | Comments on a track (timestamped) |
| **Related tracks** *(extra)* | `startUrls` | Tracks related to a given track |
| **Resolve any URL** *(extra)* | `startUrls` | Auto-detect and scrape any SoundCloud URL |

### Why this scraper

- **No API key / no login / no cookies** — public data only.
- **Self-healing** — access is managed and refreshed automatically, so runs don't break when credentials rotate.
- **Superset of metadata** — everything the popular scrapers return, plus rights/publisher data (ISRC, UPC, label, album title, P-line, explicit), monetization/policy, waveform, station URLs, transcoding formats and more.
- **Resolved stream URLs** *(opt-in)* — get the real, playable progressive **MP3** and **HLS** URLs for each track that exposes them. Some tracks are HLS-only or restricted (e.g. Go+), and are returned with a `null` stream URL rather than a fake one.
- **Comments** *(opt-in or dedicated mode)* — attach a comments sample to tracks, or scrape all comments.
- **Likes & reposts feeds** — build listening/curation graphs.
- **Built-in analytics** — plays per day, like/repost/comment rates, and a combined engagement rate per track.
- **Dedup + time-series-friendly** — de-duplicated rows, `scrapedAt` on every record for scheduled time-series runs.

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `mode` | string | `searchTracks` | One of the modes above. |
| `searchQueries` | array | `[]` | Terms for search modes (one per line). |
| `startUrls` | array | `[]` | SoundCloud URLs for URL/feed modes. |
| `maxResults` | integer | `100` | Max items per query/URL. `0` = unlimited. |
| `includeUserDetails` | boolean | `true` | Embed full creator profile in each track. |
| `includePlaylistTracks` | boolean | `false` | Expand playlist child tracks (hydrated). |
| `resolveStreamUrls` | boolean | `false` | Resolve real MP3/HLS stream URLs per track. |
| `includeComments` | boolean | `false` | Attach a comments sample to each track. |
| `commentsLimit` | integer | `10` | Comments per track / rows in comments mode. |
| `includeAnalytics` | boolean | `true` | Add engagement analytics to tracks. |
| `searchGenreFilter` | string | `""` | Optional server-side genre filter for search. |
| `dedupResults` | boolean | `true` | Drop duplicate items by id within a run. |
| `clientId` | string | `""` | Override the auto-extracted client\_id. |
| `proxyConfiguration` | object | auto | Apify Proxy configuration. |

### Example

```json
{
  "mode": "searchTracks",
  "searchQueries": ["lofi hip hop", "ambient techno"],
  "maxResults": 100,
  "resolveStreamUrls": true,
  "includeAnalytics": true
}
```

Scrape an artist's whole catalog:

```json
{ "mode": "userUrl", "startUrls": ["https://soundcloud.com/deadmau5"], "maxResults": 200 }
```

### Output (track example, truncated)

```json
{
  "_type": "track",
  "id": 417474360,
  "title": "Chill Study Beats - Lofi Hip Hop Mix",
  "url": "https://soundcloud.com/nigeldelviero/chill-study-beats-lofi-hip-hop-mix",
  "genre": "Hip-hop & Rap",
  "tagList": ["Lo-Fi", "Relax", "Chill"],
  "playbackCount": 4824267, "likesCount": 93032, "repostsCount": 2221, "commentCount": 4802,
  "isrc": null, "labelName": null, "monetizationModel": "NOT_APPLICABLE",
  "waveformUrl": "https://wave.sndcdn.com/...json",
  "streamUrl": "https://cf-media.sndcdn.com/....mp3?...",
  "userName": "nigeldelviero", "userFollowersCount": 4056, "userVerified": false,
  "playsPerDay": 1653.4, "engagementRate": 0.020, "scrapedAt": "2026-09-06T..."
}
```

### Pricing

Pay-per-event:

- **Run start** — $0.01, charged once per run.
- **Item** — $0.006 per record delivered (track, playlist, artist or comment).

You pay only for what a run actually returns — there is no monthly rental.

### Support & feedback

Found a rough edge or need another field or mode? Open an issue on the actor's **Issues** tab — requests and bug reports are welcome and shape the roadmap. If this actor saves you time, a rating on the Store page genuinely helps.

### Legal

Scrapes only public data — no login, no cookies, and no copyrighted audio is downloaded by the actor. Resolved stream URLs are signed, short-lived CDN links. You are responsible for complying with SoundCloud's Terms of Service and applicable law when using the output.

# Actor input Schema

## `mode` (type: `string`):

What to scrape. Search modes use Search queries; the other modes use Start URLs. Extra modes beyond a basic scraper: user likes feed, user reposts feed, a track's comments, related tracks, and resolve any SoundCloud URL.

## `searchQueries` (type: `array`):

Search terms to find tracks, playlists, or users/artists (depending on the selected search mode). One query per line.

## `startUrls` (type: `array`):

SoundCloud track, playlist/set, or user profile URLs to scrape directly. Used with Track/Playlist/User URL modes and the likes, reposts, comments and related modes.

## `maxResults` (type: `integer`):

Maximum number of items to extract per search query or per start URL. Use 0 for unlimited (fetch every page).

## `includeUserDetails` (type: `boolean`):

Include the full creator/artist profile (followers, bio, city, badges) embedded in each track result. Slightly slower but richer.

## `includePlaylistTracks` (type: `boolean`):

In Playlist/Set URL mode, emit each public child track (fully hydrated) after the playlist metadata row. maxResults then limits child tracks per playlist.

## `resolveStreamUrls` (type: `boolean`):

Resolve the real, playable progressive MP3 URL and HLS URL for each public track (signed, expiring CDN links). Adds one extra request per track.

## `includeComments` (type: `boolean`):

Attach a sample of the newest comments (see Comments limit) to each track result. Adds one extra request per track.

## `commentsLimit` (type: `integer`):

Number of comments to attach per track when 'Attach comments sample' is on, and the number of comment rows returned in Track comments mode.

## `includeAnalytics` (type: `boolean`):

Add computed engagement metrics to each track: plays per day since upload, like/repost/comment rates and a combined engagement rate.

## `searchGenreFilter` (type: `string`):

Optional server-side genre filter applied to search modes, e.g. 'Techno', 'Hip-hop & Rap', 'Ambient'. Leave empty for no filter.

## `dedupResults` (type: `boolean`):

Drop duplicate items (by SoundCloud id) within a single run so the same track/user/playlist is not pushed twice.

## `clientId` (type: `string`):

Optional override for the SoundCloud web client\_id. Leave empty to auto-resolve one at runtime (recommended).

## `proxyConfiguration` (type: `object`):

Apify Proxy. The default (datacenter) is usually enough; switch to Residential if you hit rate limits.

## Actor input object example

```json
{
  "mode": "searchTracks",
  "searchQueries": [
    "lofi hip hop"
  ],
  "startUrls": [
    "https://soundcloud.com/deadmau5"
  ],
  "maxResults": 100,
  "includeUserDetails": true,
  "includePlaylistTracks": false,
  "resolveStreamUrls": false,
  "includeComments": false,
  "commentsLimit": 10,
  "includeAnalytics": true,
  "searchGenreFilter": "",
  "dedupResults": true,
  "clientId": "",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All scraped SoundCloud track, playlist, user and comment records.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQueries": [
        "lofi hip hop"
    ],
    "startUrls": [
        "https://soundcloud.com/deadmau5"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("brilliant_gum/soundcloud-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQueries": ["lofi hip hop"],
    "startUrls": ["https://soundcloud.com/deadmau5"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("brilliant_gum/soundcloud-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "lofi hip hop"
  ],
  "startUrls": [
    "https://soundcloud.com/deadmau5"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call brilliant_gum/soundcloud-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,brilliant_gum/soundcloud-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/yETFQ4I1XdjE3u2Cq/builds/lUdHNzahXiHqoEVWd/openapi.json
